🌊
【初心者向け/ITスクール47日】ServerとDB連携(Insert)/ Paging
はじめに
今日は、ITスクールに通った47日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。
47日目は、今まで、JDBCとTomcatを連携し、データーをINSERTするす練習しました。
昨日、作成した掲示板サイトをアレンジする感じでした。
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