본문 바로가기

2022-코딩 수업 정리

게시판 만들기-3

목표: 게시판의 목록을 만들어본다. 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