🌊

【初心者向け/ITスクール47日】ServerとDB連携(Insert)/ Paging

2023/09/15に公開

はじめに

今日は、ITスクールに通った47日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。

47日目は、今まで、JDBCとTomcatを連携し、データーをINSERTするす練習しました。
昨日、作成した掲示板サイトをアレンジする感じでした。

https://zenn.dev/eldorado215/articles/a67a81dc03dc3d

AppleRegController

最初は、以前作成したAppleControllerでデーターを処理したいと思いましたが、1時間以上404エラーで、Controllerに繋がることができなかったです。
先生の場合は、INSERTを担当するControllerを作成しました。

以前、AppleエンティティをREADするページから機能を追懐する仕組みでした。

AppleDBManger
public void insertTable(HttpServletRequest request) {
  try{
	request.setCharacterEncoding("UTF-8");
		
	con=HyonDBManager.connect("hyonPool");
		
	String sql = "insert into sep14_apple values(?,?,?,?,?)";
	pstmt = con.prepareStatement(sql);
		

String introduce = request.getParameter("a_introduce").replace("\r\n", "<br>");
		
pstmt.setString(1,request.getParameter("a_location"));	pstmt.setString(2,request.getParameter("a_color"));	pstmt.setString(3,request.getParameter("a_flavor"));	pstmt.setInt(4,Integer.parseInt(request.getParameter("a_price")));
pstmt.setString(5,introduce);
		
pstmt.executeUpdate();
				
}catch(Exception e){
   e.printStackTrace();
	   
	}
	finally{
		HyonDBManager.close(con,pstmt,null);
	}
  }

AppleRegController.java
WebServlet("/AppleRegController")
public class AppleRegController extends HttpServlet {
          
   	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setAttribute("cp", "apple/applereg.jsp");
   	request.getRequestDispatcher("index.jsp").forward(request, response);		
   	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	AppleDBManager.getInstance().insertTable(request);
	AppleDBManager.getInstance().showTable(request);
	request.setAttribute("cp", "apple/apple.jsp");
	request.getRequestDispatcher("index.jsp").forward(request, response);	
	}
}

Paging処理

JDBCと連携することまでは無難でしたが、今日の難題!
なんとJDBCと連携し、リアルタイムでページが更新されるようにページナンバーを生成し、一つのページに特定な数のレコードが出るように作成することが課題でした。

1.全体のレコード数を変ぞ得るメソッド作成

AppleDBManger

//Fieldを追加
private int allApples = 0;
.
.
.

public void countAllApples() {
    try{
	con=HyonDBManager.connect("hyonPool");
		
	String sql ="select count(*) from sep14_apple";   
	//count(*) 集計関数で全てのレコード数をリターン!
	pstmt = con.prepareStatement(sql);
	rs = pstmt.executeQuery();
		
	rs.next();
	//"count(*)"もcolumn_nameとして入れられます!)
	allApples= rs.getInt("count(*)");
		
	}catch(Exception e){
	   e.printStackTrace();
	   
	}
	finally{
		HyonDBManager.close(con,pstmt,rs);
	}
  }

2.HomeControllerのdoGet()countAllApples()を呼び出し、レコード数をゲット

Homeに移動されたとたん、DBにあるAppleレコードの数を数えるように設定します。
そのため、HomeControllerのオブジェクトが生成された時点で、static classのAppleDBManagerのレコード数をgetしておきます。

HomeController.java
public HomeController() {
		AppleDBManager.getInstance().countAllApples();
	}

3.ページの数を決めるメソッドを作成します。

AppleDBManger.java
private int pageNums=0;

.
.
.
public void makeAllPages(HttpServletRequest request) {
    pageNums = (allApples%5==0)?(allApples/5):((allApples/5)+1);
    request.setAttribute("pn",pageNums);
}

4. JSPでリアールタイムでページを作成するように修正します。

apple.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="table">
	 <table>
      <thead>
      <tr>
        <a href="AppleRegController">등록</a>
        </tr>
        <tr>
          <th>지역</th>
          <th>가격</th>
	    </tr>
	    <tbody>
		<c:forEach var="apple" begin="0" end="4" items="${apples }">
			<tr>
			   <td>
			      ${apple.a_location}
			   </td>
			   <td>
			      <fmt:formatNumber type="currency" value="${apple.a_price }" />
			   </td>
			</tr>
		</c:forEach>
	    </tbody>
	 </table>
	  <div class=apple-page__pagenum>
	          <c:forEach var="p" begin="1" end="${pn}">
	      		 <a href="ApplePageController?page=${p }">${p }</a>
	          </c:forEach>	       
	 </div>
	 </div>
</body>
</html>

5. ApplePageControllerにpageNum属性を追加し、AppleDBMangerからページをGroupringします。

ApplePageController.java
package com.hyon.sep141.appledb;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/ApplePageController")
public class ApplePageController extends HttpServlet {

	
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		AppleDBManager adm =AppleDBManager.getInstance();
		int pageNum = Integer.parseInt(request.getParameter("page"));
		adm.makeAllPages(request);
		adm.groupApples(pageNum,request);
		request.setAttribute("cp", "apple/apple.jsp");
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
}
AppleDBManger.java
public void groupApples(int pageNum, HttpServletRequest request) {
	try{
		
	con=HyonDBManager.connect("hyonPool");
	
		String sql = "select * from "
				+ "(select ROWNUM rn,a_location,a_color,a_flavor,a_price,a_introduce "
				+ "from(select * from SEP14_APPLE order by a_price)"
				+ ") where rn between ? and ?";
		
		pstmt = con.prepareStatement(sql);
		
		int start = 5*(pageNum)-4;
	    int end = 5*pageNum;
		
		pstmt.setInt(1,start);
		pstmt.setInt(2,end);
		
		rs = pstmt.executeQuery();
		
		ArrayList<Apple> apples = new ArrayList<>();
		
		while (rs.next()) {
		apples.add(new Apple(
				 rs.getString("a_location"),
				 rs.getString("a_color"),
				 rs.getString("a_flavor"),
				 rs.getInt("a_price"),
				 rs.getString("a_introduce")));
		}	
		
		request.setAttribute("apples", apples);
	
	}catch(Exception e){
	   e.printStackTrace();
	   
	}
	finally{
		HyonDBManager.close(con,pstmt,rs);
	}
  }
  
}

結果

Discussion