목표: 게시판의 목록을 만들어본다. mysql에서 데이터를 가져오고 web.xml, jsp, servelt으로 동작하게 만든다.
mysql
USE STUDY;
-- ====================================
DROP TABLE IF EXISTS TBOARD_PART;
CREATE TABLE IF NOT EXISTS TBOARD_PART (
FIDX TINYINT NOT NULL COMMENT 'P/K, 머릿글 번호',
FPART NVARCHAR(20) NOT NULL COMMENT '게시판 목록',
PRIMARY KEY (FIDX)
) COMMENT='게시판 이름들';
INSERT INTO TBOARD_PART VALUES
('1', '자유게시판'), ('2', 'QnA'), ('3', '공지사항');
INSERT INTO TBOARD_PART VALUES
('4', '인사게시판'), ('5', '문의게시판'), ('6', '건의게시판');
select*from TBOARD_PART;
select*from TBOARD_PART order by FIDX desc limit 0,2; -- 역순으로 하고 0번째부터 2개를 가져와서 출력한다
-- select*from TBOARD_PART order by FIDX desc limit (페이지 번호-1)*2, 2;
-- select*from TBOARD_PART order by FIDX desc limit (페이지 번호-1)*3, 3;
-- select*from TBOARD_PART order by FIDX desc limit (페이지 번호-1)*4, 4; .... 페이지 번호-1에 곱하는 수는 출력하는 숫자와 같이 증가해야한다
select*from TBOARD_PART limit 0,2;
SELECT FIDX, FPART FROM TBOARD_PART ORDER BY FIDX desc limit 0,10; -- 자바의 String SQL에 넣는 문자열 작동 여부 확인
servelt
DB.java
package pkgDB;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
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("/DB")
public class DB extends HttpServlet {
private static final long serialVersionUID = 1L;
public DB() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//한글화
PrintWriter out = response.getWriter();
//out.print를 사용할 수 있게 된다
String uri=request.getRequestURI();//URI
String path=request.getContextPath();
String command=uri.substring(path.length());//요청 경로
int pageNum = Integer.parseInt(request.getParameter("page"));//형변환 주의!!!
//forward 메소드 사용을 위해 다음과 같이 함
String strURI="";
RequestDispatcher dispatcher;
if(command.equals("/board.do")) {
strURI="/list.jsp";
request.setAttribute("page", pageNum);
dispatcher=request.getRequestDispatcher(strURI);
dispatcher.forward(request,response);
}
out.println(command);
out.println(strURI);
// else {
// strURI="list.jsp";
// }
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
DBBean.java
package pkgDB;
public class DBBean {
private int idx;
private String part;
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getPart() {
return part;
}
public void setPart(String part) {
this.part = part;
}
}
DBDao.java
package pkgDB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import pkgDB.DBBean;
//=======================데이터베이스 컨트롤 클래스=====================
public class DBDao {
private Connection conn;//데이터 베이스 연결
private ResultSet rs;//테이블 레코드 반환
//데이터 베이스 연결
public int dbConnect() {
try {
//데이터 베이스 접근용 주소, 아이디, 비번
String dbURL="jdbc:mysql://localhost:3306/study?serverTimezone=UTC";
String dbID="root";
String dbPassw="1234";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbID, dbPassw);
System.out.println("DB연결 성공!!");
return 1;
}//end:try
catch(Exception e) {
System.out.println("DB연결 실패!!");
e.printStackTrace();
return -1;
}//end:catch
}//end:public int dbConnect()
//=================목록 출력 메서드, 출력은 jsp에서 한다============
public ArrayList<DBBean> getList(int pageNum, int groupNum) {
//ArrayList<DBBean>에다가 출력값을 담고 jsp에서 출력
//bean의 클래스 명=BoardField
//사용자 정의 클래스
//bean은 사용자가 만든 클래스를 사용하는 방법이다
//DBBean을 데이터 베이스 양식과 맞춰야한다. 즉, 컬럼 갯수와 맴버 값, 형까지 동일하게 맞춰야한다.
ArrayList<DBBean> boardList=new ArrayList<>();
try {
int fieldNun=(pageNum-1)*groupNum;//해당 페이지의 첫번째 row 번호
dbConnect();//데이터 베이스 연결
//String SQL="SELECT FIDX, FPART FROM TBOARD_PART ORDER BY FIDX DESC"
// +" limit 0,10";//출력, 작동 확인 후 주석으로 닫는다
String SQL="SELECT FIDX, FPART FROM TBOARD_PART ORDER BY FIDX DESC"
+" limit "+fieldNun+ ","+groupNum;
PreparedStatement pstmt=conn.prepareStatement(SQL);
rs= pstmt.executeQuery(SQL);
System.out.println(SQL);
while(rs.next()) {//전부 출력할 때까지 반복한다
//데이터 베이스 출력 확인
//System.out.println(rs.getInt("fidx"));
//System.out.println(rs.getString("fpart"));
//출력시 fidx 값과 fpart 값이 번갈아가면서 전부 출력되어야한다.
DBBean board=new DBBean();
board.setIdx(rs.getInt("fidx"));//rs.getInt("fidx")를 DBBean의 setIdx로 사용할 수 있게 한다
board.setPart(rs.getString("fpart"));
boardList.add(board);//list.jsp에서 가져갈 ArrayList 생성
}//end: while(rs.next())
}//end:try
catch(Exception e) {
System.out.println("오류 발생");
}//end:catch
return boardList;//ArrayList를 반환
}
}//end:public class DBDao
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//한글화
%>
<%@page import="java.io.PrintWriter" %>
<%@page import="java.util.ArrayList" %>
<%@page import="pkgDB.DBBean" %>
<%@page import="pkgDB.DBDao" %>
<!-- 패키지 pkgDB안에 있는 class인 DBBean, DBDao를 사용한다 -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>목록 출력</title>
</head>
<body>
<table border="1">
<%
int pageNum=1;//리스트의 페이지 이동을 위한 페이지 번호
int groupNum=2;//한번에 반환 받을 수 있는 목록의 갯수
if(request.getAttribute("page")!=null) {pageNum=(Integer)request.getAttribute("page");}//형변환 주의!!!
else pageNum=1;
out.print("page: "+pageNum);
int prev= pageNum-1;
int next=pageNum+1;
DBDao Dao= new DBDao();
//Console 창에 DB연결 성공!!이 나오면 DB가 연결 된 것이다
//ArrayList<DBBean> list=Dao.getList(1);
//값을 받기 위해 선언하고 임의의 값을 넣는다.
//list에 값이 담겨있다
//Console 창에 SELECT FIDX, FPART FROM TBOARD_PART ORDER BY FIDX DESC limit 0,10가 나온 경우 mysql에서 작동하는지 실행해본다.
ArrayList<DBBean> list=Dao.getList(pageNum, groupNum);
//out.println(list.size());//ArrayList.size() 갯수 반환, 2차 배열 형태
for(int i=0; i<list.size(); i++){
%>
<tr>
<!-- for문 사이로 출력 -->
<!-- Arraylist의 매소드 -->
<td><%=list.get(i).getIdx() %></td>
<td><%=list.get(i).getPart() %></td>
<!-- getIdx, getPart가 번갈아가면서 출력되어야한다. -->
<!-- 추가할 때는 add 메소드를 사용한다 -->
<!-- 값을 가져올 때는 get 메소드를 사용한다 -->
</tr>
<%} //end:for(int i=0; i<list.size(); i++)
%>
</table>
<a href="board.do?page=<%=prev %>">이전</a> | <a href="board.do?page=<%=next %>">다음</a>
<!-- board.do?page=에 100을 넣어도 오류는 없다-->
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>2022-10-04_prjDataBase</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>mvcProcess</servlet-name>
<servlet-class>pkgDB.DB</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mvcProcess</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
mysql에 넣은 목록 데이터가 '역순'으로 2개씩 출력된다



board.do?page=100을 입력하더라도 작동이 된다.

실행시 콘솔창에는 다음과 같이 출력되어야한다.

겪었던 오류 정리
1.
list.jsp에서 실행시 pkgDB의 DBDao.java에서 오류
public ArrayList<DBBean> getList(int pageNum, int groupNum)에서 오류가 발생
catch(Exception e) {System.out.println("오류 발생");}//end:catch
해당 코드가 콘솔창에 출력되었었다.
///////////////////////////////////////////////////////////////////////////////////////////////////////
테이블이 출력되지 않던 이유는
DBDao.java에서 public ArrayList<DBBean> getList(int pageNum, int groupNum) 안의 String SQL에 문제가 있었다.
limit의 뒤쪽으로 띄워쓰기 1번을 안해서 오류가 발생하였다.
String SQL="SELECT FIDX, FPART FROM TBOARD_PART ORDER BY FIDX DESC"
+" limit "+fieldNun+ ","+groupNum;
이후에는 페이지 이동시에 오류가 났다.
<a href="board.do?page=<%=prev %>">이전</a> | <a href="board.do?page=<%=next %>">다음</a>
해당 부분을 통해 페이지를 이동하려고 할 때 파일 경로를 찾지 못했다.
2.
xml 파일의 경로 때문이다.
DB.java 즉, servlet 의 경로 확인을 실행할 때 /DB라고 출력 되었는데 정상적으로는 *.do라고 출력되어야했다.
src\main\webapp의
WEB-INF 안의 lib 파일 안에 xml 파일 넣지 말 것.
WEB-INF 안에 xml 파일이 있어야한다.

3.
형변환 때문이다.
list.jsp의
if(request.getAttribute("page")!=null) {pageNum=(Integer)request.getAttribute("page");}
servelt인 DB.java의
int pageNum = Integer.parseInt(request.getParameter("page"));
이 두 부분으로 고치고 나서 작동이 되었다.
형변환 주의할 것.
'2022-코딩 수업 정리' 카테고리의 다른 글
| 오라클과 이클립스 연결 (0) | 2022.10.11 |
|---|---|
| 스프링 환경 설정 (0) | 2022.10.05 |
| 게시판 만들기-2 (0) | 2022.10.01 |
| 게시판 만들기-1 (0) | 2022.09.30 |
| JSP, HTML 활용 코드 (0) | 2022.09.26 |