前提・実現したいこと
お世話になっております。
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/ツールのバージョンなど)
初心者で至らない点があると思いますがよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー