質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

883閲覧

Springでformに入力した値をDB保存せずに次の画面のURLに入れたい

chocolate_pie

総合スコア26

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/02/07 02:17

編集2020/02/07 04:25

前提・実現したいこと

お世話になっております。
Spring Bootを使い、検索機能を実装しているのですが、
formから送った値をURLに入れて検索を実装したいと考え試行錯誤しましたがうまくいきません。
URLに検索ワードを直接入れると機能しますが、それをフォームから受け取ってURLに入れたいです。

【現状】
例:検索ワードを「テスト」にした場合のURL
〇URLベタ打ち→http://localhost:8080/admin/users/findby/テスト 
×Form利用→http://localhost:8080/admin/users/findby/???

発生している問題・エラーメッセージ

フォームから送った値がURLに入らない

該当のソースコード

コントローラー AdminController.java

java

1 //formから値を取得 2 @RequestMapping(path = "/admin/serchword", method = RequestMethod.POST) 3 public String inputSerchFullname(UserMasterForm form) { 4 String fullname=form.getFullname(); 5  //fullnameの値は正常に受け取れています 6 return "redirect:/admin/users/findby/"+fullname; 7 } 8 9 //検索(fullnameの部分をベタ打ちすると動きます) 10 @RequestMapping("/admin/users/findby/{fullname}") 11 public String showByUserName(@PathVariable String fullname, Model model) { 12 model.addAttribute("users", usermasterservice.findByFullnameLike("%" + fullname + "%")); 13 return "admins/users"; 14 }

フォーム UserMasterForm.java

java

1package jp.co.itc.mbo.form; 2 3import java.sql.Date; 4 5import javax.persistence.JoinColumn; 6import javax.persistence.ManyToOne; 7import javax.validation.constraints.Size; 8 9import org.springframework.stereotype.Component; 10 11import jp.co.itc.mbo.entity.DeptMaster; 12import jp.co.itc.mbo.entity.TeamMaster; 13import jp.co.itc.mbo.validation.MailExist; 14import jp.co.itc.mbo.validation.UserName; 15 16@Component 17@UserName(idProperty = "id", usernameProperty = "username") 18@MailExist(mailaddressProperty = "mailaddress", idProperty = "id") 19public class UserMasterForm { 20private String fullname; 21private String username; 22@Size(min=6, message = "6文字以上で入力してください") 23private String password; 24private String mailaddress; 25private Date joindate; 26 27@ManyToOne(targetEntity = DeptMaster.class) 28@JoinColumn( name = "dept_id") 29private DeptMaster deptid; 30 31@ManyToOne(targetEntity = TeamMaster.class) 32@JoinColumn( name = "team_id") 33private TeamMaster teamid; 34 35private String authority; 36private Boolean accept; 37private Integer normalid; 38private Integer okempid; 39private Integer id; 40 41public String getPassword() { 42 return password; 43} 44public void setPassword(String password) { 45 this.password = password; 46} 47public String getMailaddress() { 48 return mailaddress; 49} 50public void setMailaddress(String mailaddress) { 51 this.mailaddress = mailaddress; 52} 53 54 55public String getAuthority() { 56 return authority; 57} 58public void setAuthority(String authority) { 59 this.authority = authority; 60} 61public String getUsername() { 62 return username; 63} 64public void setUsername(String username) { 65 this.username = username; 66} 67public Date getJoindate() { 68 return joindate; 69} 70public void setJoindate(Date joindate) { 71 this.joindate = joindate; 72} 73public String getFullname() { 74 return fullname; 75} 76public void setFullname(String fullname) { 77 this.fullname = fullname; 78} 79public Integer getNormalid() { 80 return normalid; 81} 82public void setNormalid(Integer normalid) { 83 this.normalid = normalid; 84} 85public Integer getOkempid() { 86 return okempid; 87} 88public void setOkempid(Integer okempid) { 89 this.okempid = okempid; 90} 91public Boolean getAccept() { 92 return accept; 93} 94public void setAccept(Boolean accept) { 95 this.accept = accept; 96} 97public Integer getId() { 98 return id; 99} 100public void setId(Integer id) { 101 this.id = id; 102} 103public DeptMaster getDeptid() { 104 return deptid; 105} 106public void setDeptid(DeptMaster deptid) { 107 this.deptid = deptid; 108} 109public TeamMaster getTeamid() { 110 return teamid; 111} 112public void setTeamid(TeamMaster teamid) { 113 this.teamid = teamid; 114} 115 116 117} 118

ビュー users.html

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity"> 4<head th:replace="layout :: layout('HOME',~{::link})"> 5<meta charset="UTF-8"> 6<title>ユーザー一覧</title> 7</head> 8<body> 9 <div th:replace="layout :: header"></div> 10 <div class="container contmarge"> 11 <div class="row"> 12 <div class="col-md-10 col-md-offset-1"> 13 <div class="panel panel-default"> 14 <div class="panel-heading"> 15 <h3>ユーザー一覧</h3> 16 </div> 17 <div class="panel-body"> 18 ユーザー情報の変更、削除、新規登録が行えます。 19 <form method="post" th:action="@{/admin/serchword}"> 20 名前検索:<input type=text name=fullname> 21 <button class="btn btn-primary " type=submit>検索</button> 22 </form> 23 </div> 24 <table class="table"> 25 <thead> 26 <tr> 27 <th>部署</th> 28 <th>チーム</th> 29 <th>名前</th> 30 <th></th> 31 </tr> 32 </thead> 33 <tbody> 34 <tr th:each="user: ${users}" th:object="${user}"> 35 <td th:if="*{deptid} == null">設定されていません</td> 36 <td th:if="*{deptid}" th:text="*{deptid.deptname}"></td> 37 38 <td th:if="*{teamid} == null">設定されていません</td> 39 <td th:if="*{teamid}" th:text="*{teamid.teamname}"></td> 40 <td th:text="*{fullname}"></td> 41 <td> 42 <form method="post" 43 th:action="@{/admin/userinput/{id}(id=*{id})}"> 44 <button class="btn btn-primary center-block" type=submit>編集</button> 45 </form> 46 </td> 47 </tr> 48 </tbody> 49 </table> 50 <div class="panel-footer"> 51 <a href="/new">新規ユーザー登録</a> 52 <div class=return> 53 <button class="btn btn-default center-block" 54 onclick="location.href='/admin/menu'">戻る</button> 55 </div> 56 </div> 57 </div> 58 </div> 59 </div> 60 </div> 61 <div th:replace="layout :: footer"></div> 62</body> 63</html>

試したこと

・フォームから受け取った値をurlに引っ張ってくる方法を調べましたが、目的に沿った記事を見つけることができませんでした
・デバック機能を使ってどこまで処理がされているか確認したところ、getメソッドのurlが思惑通りになっていないことが判明。postメソッドは正常に処理されています。
・フォームに半角英数字を入れると機能しました。全角文字だと機能しません。?の数は文字数の数になりました。

・どうやら文字コードが原因のようです(?)参照:Javaで文字コードの変換をしたい
調べたところ、Stringはutf-16になっているそうなのでとりあえずutf-8のバイトのリストに直してみました。

Controllerのpostメソッド

Java

1 @RequestMapping(path = "/admin/serchword", method = RequestMethod.POST) 2 public String inputSerchFullname(UserMasterForm form) throws UnsupportedEncodingException { 3 String convert=form.getFullname(); 4 byte[] sbyte = convert.getBytes("UTF-8"); 5 6 ArrayList<Byte> namebytes = new ArrayList<>(); 7 for(int i=0; i<sbyte.length; i++) 8 { 9 namebytes.add(sbyte[i]); 10 } 11 System.out.println(namebytes); 12 return "redirect:/admin/users"; 13 } 14

→これで、フォームで「あああ」と入力された場合sysoutすると
[-29, -127, -126, -29, -127, -126, -29, -127, -126]と出力するところまできました。
これをUTF-8の「あああ」の文字にに直せばうまく値が渡されると予想したのですが、処理の記述方法がわかりません。そもそもこのやり方で合っているのでしょうか?

補足情報(FW/ツールのバージョンなど)

初心者で至らない点があると思いますがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/07 10:18

urlencode
chocolate_pie

2020/02/10 01:21

urlencodeを調べてその方法を試したら無事URLに日本語が入りました!ありがとうございます。
guest

回答1

0

自己解決

URLエンコードとデコードを使ったら日本語が表示されるようになりました。

Java

1 //名前検索 2 @RequestMapping(path = "/admin/serch/fullname", method = RequestMethod.POST) 3 public String inputSerchFullname(UserMasterForm form, Model model) { 4 String fullname = form.getFullname(); 5 String encodedResult = null; 6 try { 7 encodedResult = URLEncoder.encode(fullname, "UTF-8"); 8 System.out.println("エンコード結果:" + encodedResult); 9 } catch (UnsupportedEncodingException e1) { 10 // TODO 自動生成された catch ブロック 11 e1.printStackTrace(); 12 } 13 14 if (fullname == null || fullname.isEmpty()) { 15 return "redirect:/admin/users"; 16 } 17 return "redirect:/admin/users/findby/" + encodedResult; 18 } 19 20 //検索実行部分 21 @RequestMapping("/admin/users/findby/{encodedResult}") 22 public String showByUserFullname(@PathVariable String encodedResult, Model model) { 23 String fullname = null; 24 try { 25 fullname = URLDecoder.decode(encodedResult, "UTF-8"); 26 System.out.println("デコード結果:" + fullname); 27 } catch (UnsupportedEncodingException e) { 28 e.printStackTrace(); 29 } 30 List<UserMaster> users = usermasterservice.findByFullnameLike("%" + fullname + "%"); 31 int usersize = users.size(); 32 model.addAttribute("usersize", usersize); 33 model.addAttribute("users", users); 34 model.addAttribute("fullname", fullname); 35 return "admins/users"; 36 }

投稿2020/02/10 01:24

chocolate_pie

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問