今回は、「検索結果をページ分割する」です。
検索結果を10件ごとなどにページを分けて表示するものです。
ページネーション、ページングと言われているものですね。
■動画はこちら
■動画で使用しているソースコード
ソースコードが多いので、主要なコードのみ載せています。
他に欲しいソースコードがありましたら、youtubeのコメント欄へどうぞ。
サーブレット1(Sv1.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package yurufuwa.prog.sample; import java.io.IOException; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public class Sv1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //検索条件を表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/in.jsp"); rd.forward(req, resp); } } |
サーブレット2(Sv2.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | package yurufuwa.prog.sample; import java.io.IOException; import java.util.ArrayList; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public class Sv2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String page = req.getParameter("p"); if(page == null) { requestKensaku(req, resp); } else { requestNextPage(req, resp, page); } } private void requestKensaku(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //検索条件を取得 String keyword = req.getParameter("txtKeyword"); try { //都道府県の一覧を取得 Kensaku k = new Kensaku(); k.execute(keyword, 1); ArrayList<Todofuken> todofukenList = k.getTodofukenList(); int kensuu = k.getKensuu(); int pageSize = k.getPageSize(); //結果をリクエストにセット req.setAttribute("keyword", keyword); req.setAttribute("todofuken_list", todofukenList); req.setAttribute("genzai_page", 1); req.setAttribute("meisai_kensuu", kensuu); req.setAttribute("meisai_pagesuu", pageSize); //検索結果を表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/out.jsp"); rd.forward(req, resp); } catch(Exception e) { //エラーを表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/err.jsp"); rd.forward(req, resp); } } private void requestNextPage(HttpServletRequest req,HttpServletResponse resp,String page) throws ServletException, IOException { //検索条件を取得 String keyword = req.getParameter("txtKeyword"); try { //表示するページ int iPage = Integer.parseInt(page); //都道府県の一覧を取得 Kensaku k = new Kensaku(); k.execute(keyword, iPage); ArrayList<Todofuken> todofukenList = k.getTodofukenList(); int kensuu = k.getKensuu(); int pageSize = k.getPageSize(); //結果をリクエストにセット req.setAttribute("keyword", keyword); req.setAttribute("todofuken_list", todofukenList); req.setAttribute("genzai_page", iPage); req.setAttribute("meisai_kensuu", kensuu); req.setAttribute("meisai_pagesuu", pageSize); //検索結果を表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/out.jsp"); rd.forward(req, resp); } catch(Exception e) { //エラーを表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/err.jsp"); rd.forward(req, resp); } } } |
検索処理(Kensaku.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | package yurufuwa.prog.sample; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import javax.naming.InitialContext; import javax.sql.DataSource; public class Kensaku { private ArrayList<Todofuken> todofukenList = null; private int kensuu = 0; private int pageSize = -1; public void execute(String keyword, int page) throws Exception { Connection conn = null; try { //DBに接続 InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql"); conn = ds.getConnection(); //SQLを発行(部分一致で検索) PreparedStatement pstmt = conn.prepareStatement( "SELECT * FROM todofuken WHERE yomigana LIKE ? " + "ORDER BY ken_code " ); pstmt.setString(1, "%" + keyword + "%"); ResultSet rs = pstmt.executeQuery(); todofukenList = new ArrayList<Todofuken>(); //取得する範囲(対象ページ) int kensuuStart = (page - 1) * 5; int kensuuEnd = page * 5 - 1; //結果を取得 while(rs.next()) { if(kensuuStart <= kensuu && kensuu <= kensuuEnd) { Todofuken t = new Todofuken( rs.getString(1), rs.getString(2), rs.getString(3) ); todofukenList.add(t); } kensuu++; } rs.close(); pstmt.close(); //取得ページ数 if(kensuu % 5 == 0) { pageSize = kensuu / 5; } else { pageSize = kensuu / 5 + 1; } } catch(Exception e) { e.printStackTrace(); throw e; } finally { try { //接続を閉じる conn.close(); } catch(Exception e) { } } } public ArrayList<Todofuken> getTodofukenList() { return todofukenList; } public int getKensuu() { return kensuu; } public int getPageSize() { return pageSize; } } |
レコード(Todofuken.java)
1 2 3 4 5 | package yurufuwa.prog.sample; public record Todofuken (String kenCode, String kenName, String yomigana) { } |
検索条件(in.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>都道府県一覧</title> </head> <body> <h2>検索条件</h2> <form action="./sv2" method="get"> 検索条件: <input type="text" name="txtKeyword" /><br /> <input type="submit" value="検索" /> </form> </body> </html> |
検索結果(out.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.ArrayList" %> <%@ page import="yurufuwa.prog.sample.Todofuken" %> <% ArrayList<Todofuken> todofukenList = (ArrayList<Todofuken>)request.getAttribute("todofuken_list"); String keyword = (String)request.getAttribute("keyword"); int iPage = (int)request.getAttribute("genzai_page"); int kensuu = (int)request.getAttribute("meisai_kensuu"); int pageSize = (int)request.getAttribute("meisai_pagesuu"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>都道府県一覧</title> <style>table, th, td { border-collapse: collapse; border: 1px black solid; }</style> </head> <body> <h2>都道府県一覧</h2> <h3>「<%= keyword %>」の検索結果</h3> <% if(todofukenList != null && todofukenList.size() > 0){ %> <%= kensuu %>件(<%= pageSize %>ページ中 <%= iPage %>ページ目を表示)<br /> <table> <tr><th>都道府県コード</th><th>都道府県名</th><th>読み仮名</th></tr> <% for(Todofuken t : todofukenList) { %> <tr> <td><%= t.kenCode() %></td> <td><%= t.kenName() %></td> <td><%= t.yomigana() %></td> </tr> <% } %> </table> <br /> <!-- ページネーション --> <% if(pageSize > 1){ %> <% for(int i=0 ; i<pageSize ; i++) { %> <% if((i+1) == iPage) { %> <%= (i+1) %> <% } else { %> <a href="./sv2?txtKeyword=<%= keyword %>&p=<%= (i+1) %>"><%= (i+1) %></a> <% } %> <% } %> <% } %> <% } else { %> 検索結果はありません。 <% } %> </body> </html> |
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" id="WebApp_ID" version="5.0"> <display-name>testWeb</display-name> <servlet> <servlet-name>SV1</servlet-name> <servlet-class>yurufuwa.prog.sample.Sv1</servlet-class> </servlet> <servlet> <servlet-name>SV2</servlet-name> <servlet-class>yurufuwa.prog.sample.Sv2</servlet-class> </servlet> <servlet-mapping> <servlet-name>SV1</servlet-name> <url-pattern>/sv1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SV2</servlet-name> <url-pattern>/sv2</url-pattern> </servlet-mapping> </web-app> |
context.xml
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" maxActive="5" maxIdle="5" initialSize="5" username="yuruku" password="fuwatto" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost/yuruku"/> </Context> |