チェックボックス(複数選択可)を使用してデータ検索を行いたいのですが、実装のイメージがわきません。
Java/Mysql/hibarnate
実現したいこと
プロフィールに名前と好きな食べ物を登録し、好きな食べ物から名前を検索できるようにする
・検索用フォーム:
チェックボックスで選択肢好きな食べ物を選択
りんご バナナ いちご
↓
・チェックボックスの値を取得し、検索処理をするサーブレット
りんご、バナナを選択した場合、「りんごのみ」を選択した人、「りんご、バナナ」を選択した人の両方が検索結果として出力
↓
・該当の名前が一覧表示されるJSP
以下のようにデータの登録は行い、プロフィール内容(名前と好きな食べ物)の一覧表示は可能な状態です。
・テーブル
名前
好きな食べ物 SET(りんご,バナナ,いちご) //MysqlのSET型を使用しています
model
1@Entity 2@Table(name = "Profile") 3@NamedQueries({ 4 @NamedQuery(name = "getProfile", query = "SELECT p FROM Profile AS p ORDER BY p.id DESC"), 5 @NamedQuery(name = "getProfileCount", query = "SELECT COUNT(p) FROM Profile AS p"), 6}) 7public class Profile { 8 @Id 9 @GeneratedValue(strategy = GenerationType.IDENTITY) 10 @Column(name = "id") 11 private Integer id; 12 13 @Column(name = "name", nullable = false) 14 private String name; 15 16 @Column(name = "favorite", nullable = false) 17 private String favorite;}
データ登録のフォーム
form
1<label for="name">名前</label> 2<input type="text" name="name" value="${profile.name}" /> 3 4好きな食べ物※複数可<br /> 5 <label><input type="checkbox" name="favorite" value="りんご">りんご</label> 6 <label><input type="checkbox" name="favorite" value="バナナ">バナナ</label> 7 <label><input type="checkbox" name="favorite" value="いちご">いちご</label>
データ登録のサーブレット
creaate
1EntityManager em = DBUtil.createEntityManager(); 2 3 Prof p = new Prof(); 4p.setName(request.getParameter("name")); 5String[] favorite = request.getParameterValues("favorite"); 6 String fvr_str = favorite[0]; 7 for (int i = 1; i < favorite.length; i++) { 8 fvr_str += ("," + favorite[i]); 9 } 10 p.setFavorite(fvr_str);
データ登録時と同じようにチェックボックスの値を取得し、それをもとに検索をしたかったのですが、
JavaScriptやPHP、フレームワークを使用した情報が多く、自身の環境での方法が浮かびません。
面倒な方法であってもできるだけフレームワークを使用せず勉強をすすめたいと思っております。
ご回答いただけますと幸いです。
追記:
@Entity @Table(name = "profiles") @NamedQueries({ @NamedQuery(name = "getProfile", query = "SELECT p FROM Pro AS p ORDER BY p.id DESC"), @NamedQuery(name = "getProfileCount", query = "SELECT COUNT(p) FROM Pro AS p"), }) public class Pro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @Column(name = "name", nullable = false) private String name; @Column(name = "favorite") private String favorite; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFavorite() { return favorite; } public void setFavorite(String favorite) { this.favorite = favorite; } }
テーブル
profiles
1+----------+---------------------------------+------+-----+---------+----------------+ 2| Field | Type | Null | Key | Default | Extra | 3+----------+---------------------------------+------+-----+---------+----------------+ 4| id | int(11) | NO | PRI | NULL | auto_increment | 5| favorite | set('りんご','バナナ','いちご') | YES | | NULL | | 6| name | varchar(255) | NO | | NULL | | 7+----------+---------------------------------+------+-----+---------+----------------+ 8+----+---------------+--------+ 9| id | favorite | name | 10+----+---------------+--------+ 11| 1 | りんご | やまだ | 12| 2 | りんご,バナナ | たなか | 13| 3 | バナナ,いちご | おだ | 14| 4 | いちご | なかい | 15+----+---------------+--------+
データ登録のJSP
new.JSP
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4<c:import url="../layout/app.jsp"> 5 <c:param name="content"> 6 <h2>プロフィール新規登録ページ</h2> 7 8 <form method="POST" action="<c:url value='/create' />"> 9 <label for="name">名前</label> 10 <input type="text" name="name" value="${profile.name}" /> 11 好きな食べ物※複数可<br /> 12 <label><input type="checkbox" name="favorite[]" value="りんご">りんご</label> 13 <label><input type="checkbox" name="favorite[]" value="バナナ">バナナ</label> 14 <label><input type="checkbox" name="favorite[]" value="いちご">いちご</label><br/> 15 <button type="submit">登録</button> 16 </form> 17 18 </c:param> 19</c:import>
データ登録のサーブレット
CreateServlet
1 2/** 3 * Servlet implementation class CreateServlet 4 */ 5@WebServlet("/create") 6public class CreateServlet extends HttpServlet { 7 private static final long serialVersionUID = 1L; 8 9 /** 10 * @see HttpServlet#HttpServlet() 11 */ 12 public CreateServlet() { 13 super(); 14 // TODO Auto-generated constructor stub 15 } 16 17 /** 18 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 19 */ 20 protected void doPost(HttpServletRequest request, HttpServletResponse response) 21 throws ServletException, IOException { 22 EntityManager em = DBUtil.createEntityManager(); 23 24 Pro p = new Pro(); 25 p.setName(request.getParameter("name")); 26 String[] favorite = request.getParameterValues("favorite"); 27 String fvr_str = favorite[0]; 28 for (int i = 1; i < favorite.length; i++) { 29 fvr_str += ("," + favorite[i]); 30 } 31 p.setFavorite(fvr_str); 32 List<String> errors = ProValidator.validate(p); 33 if (errors.size() > 0) { 34 em.close(); 35 36 request.setAttribute("profile", p); 37 request.setAttribute("errors", errors); 38 39 RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/pro/new.jsp"); 40 rd.forward(request, response); 41 } else { 42 em.getTransaction().begin(); 43 em.persist(p); 44 em.getTransaction().commit(); 45 em.close(); 46 request.getSession().setAttribute("flush", "登録が完了しました。"); 47 48 response.sendRedirect(request.getContextPath() + "/"); 49 50 } 51 52 } 53} 54
一覧表示と検索をするJSP
index.JSP
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 5 6 7<c:import url="../layout/app.jsp"> 8 <c:param name="content"> 9 <c:if test="${flush != null}"> 10 <div id="flush_success"> 11 <c:out value="${flush}"></c:out> 12 </div> 13 </c:if> 14 <h2>プロフィール</h2> 15 <table id="profile_list"> 16 <tbody> 17 <tr> 18 19 <th class="name">名前</th> 20 <th class="favorite">好きな食べ物</th> 21 22 </tr> 23 <c:forEach var="profile" items="${profiles}" varStatus="status"> 24 <tr class="row${status.count % 2}"> 25 26 <td class="name"><c:out value="${profile.name}" /></td> 27 28 <td class="favorite"><c:out value="${profile.favorite}" /></td> 29 </tr> 30 31 </c:forEach> 32 </tbody> 33 </table> 34 35 <div id="pagination"> 36 (全${profiles_count}件)<br /> 37 <c:forEach var="i" begin="1" end="${((profiles_count -1) /15 )+ 1}" 38 step="1"> 39 <c:choose> 40 <c:when test="${i == page}"> 41 <c:out value="${i}" /> 42 </c:when> 43 <c:otherwise> 44 <a href="<c:url value='/profiles/index?page=${i}'/>"><c:out 45 value="${i}" /></a> 46 </c:otherwise> 47 </c:choose> 48 </c:forEach> 49 </div> 50 51 <p> 52 <a href="<c:url value='/new' />">プロフィール登録</a> 53 </p> 54 <h2>プロフィール検索</h2> 55 56 <form method="GET" action="<c:url value='/search' />"> 57 好きな食べ物で検索※複数可<br /> 58 <label><input type="checkbox" name="favorite[]" value="りんご">りんご</label> 59 <label><input type="checkbox" name="favorite[]" value="バナナ">バナナ</label> 60 <label><input type="checkbox" name="favorite[]" value="いちご">いちご</label><br/> 61 <button type="submit">検索</button> 62 </form> 63 </c:param> 64</c:import>
検索処理のサーブレット
SearchServlet
1package controllers; 2 3import java.io.IOException; 4 5import javax.persistence.EntityManager; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import utils.DBUtil; 13 14/** 15 * Servlet implementation class Search 16 */ 17@WebServlet("/search") 18public class Search extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 /** 22 * @see HttpServlet#HttpServlet() 23 */ 24 public Search() { 25 super(); 26 // TODO Auto-generated constructor stub 27 } 28 29 /** 30 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 31 */ 32 protected void doGet(HttpServletRequest request, HttpServletResponse response) 33 throws ServletException, IOException { 34 EntityManager em = DBUtil.createEntityManager(); 35 36 String[] favorite = request.getParameterValues("favorite"); 37 String fvr_str = favorite[0]; 38 for (int i = 1; i < favorite.length; i++) { 39 fvr_str += ("," + favorite[i]); 40 } 41 42 } 43 44 45} 46
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/16 09:06
2021/05/16 09:07
2021/05/16 09:17
2021/05/16 13:30
2021/05/16 20:52
2021/05/17 06:23
2021/05/17 06:50
2021/05/17 10:07
2021/05/17 10:15