본문 바로가기
jsp

게시판_model2_1

by 신방동불주먹 2022. 12. 7.

1. model 구성 파일 (db정의) 

 

  • model2.mvcboard - MVCBorardDTO.java
  • model2.mvcboard - MVCBoardDAO.java (생성자lombok, extends  DBConnPool) 미완성
  • common - DBConnPool.java 

 

2. controller (servlet)

**Default.jsp (바로가기용 진입 페이지)

  • ListController.java (원래 dao위치와 분리하는게 좋다) - doGet

 

 

3. view

  • List.jsp (검색 폼)

 

 

**model 은 내용이 추가 되지 파일이 추가되지 않는다

**controller, view 파일은 역할 별로 계속 추가 된다.

 

 

 

<모델 1, 2 차이점>

 

모델1- dao 관련 코드를 다 list.jsp에 정의

모델2- dao 관련 모델 부분 코드를 서블릿으로 별도 정의

정보를 받아와서 뿌려주는 역할만 

 

 

 

 

------------------------------------목록보기------------------------------------------

 

 

1. model2.mvcboard - MVCBorardDTO.java

 

package model2.mvcboard;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class MVCBoardDTO {
	private String idx;
	private String name;
	private String title;
	private String content;
	private java.sql.Date postdate;
	private String ofile;
	private String sfile;
	private int downcount;
	private String pass;
	private int visitcount;
}

 

 

 

 

2. model2.mvcboard - MVCBoardDAO.java (생성자lombok, extends  DBConnPool) 

 

 

package model2.mvcboard;

import common.DBConnPool;
import lombok.NoArgsConstructor;

@NoArgsConstructor
public class MVCBoardDAO extends DBConnPool{
	
}

 

 

 

3. common - DBConnPool.java 

package common;
import java.sql.*;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBConnPool {
	public Connection con;
	public Statement stmt;
	public PreparedStatement psmt;
	public ResultSet rs;
	
	
	//생성자
	public DBConnPool() {
	
		try {
			Context initCtx= new InitialContext(); //context =JNDI에서 이름과 실제 객체를 연결해주는 개념
			Context ctx = (Context)initCtx.lookup("java:comp/env");
			DataSource source = (DataSource)ctx.lookup("dbcp_myoracle"); //네임속성 준 부분
			
			con=source.getConnection(); //db연결
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void close() {
		try{
			if(rs != null) rs.close();//db가 열려있을 때만, 닫는 순서 rs-> psmt > stmt > con
			if(stmt != null) stmt.close();
			if(psmt != null) psmt.close();
			if(con != null) con.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
}

 

 

 

4.Default.jsp (바로가기용 진입 페이지)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>파일 첨부형 게시판</h2>
	<a href="./list.do">게시판 목록 바로가기</a>
</body>
</html>

 

 

 

5.ListController.java (원래 dao위치와 분리하는게 좋다)

 

package model2.mvcboard;

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("/list.do")
public class ListController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ListController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MVCBoardDAO dao = new MVCBoardDAO();
		
	}


}

 

 

6. List.jsp (검색 폼)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>파일 첨부형 게시판 - 목록보기(List)</h2>
	
	<!-- 1. 검색 폼 -->
	<form method="get">
	<table border="1" width="90%">
	<tr>
		<td align = "center">
			<select name="searchField">
				<option value="title">제목</option>
				<option value="content">내용</option>
			</select>
			<input type="text" name="seachWord" />
			<input type="submit" value="검색하기" />
		</td>
	</tr>
	</table>
	</form>
</body>
</html>

 

 

	<!-- 2. 목록 -->
	<table border="1" width="90%">
		<tr>
			<th width="10%">번호</th>
			<th width="*">제목</th>
			<th width="15%">작성자</th>
			<th width="10%">조회수</th>
			<th width="15%">작성일</th>
			<th width="8%">첨부</th>
		</tr>

	
	<!-- DB에서 가져오는 값을 실제 출력하는 부분 -->
	
	<!-- 게시물이 없을 때 -->
	<tr>
		<td colspan="6" align="center">
		 	등록된 게시물이 없어요!!!!!!
		</td>
	</tr>
	
	<!-- 게시물이 있을 때 -->
	<tr>
		<td></td>
		<td></td>
		<td></td>
		<td></td>
		<td></td>
		<td></td>
	</tr>	
	</table>
	
	<table border="1" width="90%">
		<tr align="center">
			<td></td>
			<td width="100"><button type="button">글쓰기</button></td>
		</tr>
	</table>

 

 

7. ListController.java (db 요청)

 

		//검색하기 파라미터 처리 할 맵
		Map<String, Object> map = new HashMap<>();
		
		String searchField = request.getParameter("searchField");
		String searchWord = request.getParameter("searchWord");
		
		if(searchWord != null) {
			map.put("searchField",searchField);
			map.put("searchWord", searchWord);
		}
		
		int totalCount = dao.selectCount(map);

 

 

8. MVCBoardDAO.java (selectcount 함수)

	public int selectCount(Map<String,Object> map) {
	
		int totalCount = 0;
		String query = "select count(*) from mvcboard";
		
		//동적 쿼리문
		if(map.get("searchWord") != null) {
			query += " where " + map.get("searchField") + " "
					+ " like '%" + map.get("searchWord")+ "%'";
		}
		
		try {
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			rs.next();
			totalCount = rs.getInt(1);
			
		}catch(Exception e) {
			System.out.print("게시물 카운트 중 예외 발생");
			e.printStackTrace();
		}
		
		return totalCount;
	}

 

 

 

9. ListController.java (페이징)

 

		//페이징
		ServletContext application = getServletContext();
		int pageSize = Integer.parseInt(application.getInitParameter("POSTS_PER_PAGE"));
		int blockPage = Integer.parseInt(application.getInitParameter("PAGES_PER_BLOCK"));
		
		int pageNum=1;
		String pageTemp = request.getParameter("pageNum");
		if(pageTemp != null && !pageTemp.equals("")) {
			pageNum = Integer.parseInt(pageTemp);
		}
		
		int start = (pageNum-1)*pageSize +1;
		int end = pageNum * pageSize;
		map.put("start", start);
		map.put("end", end);
	
		List<MVCBoardDTO> boardList = dao.selectListPage(map);
	
	}

 

 

10. MVCBoardDAO.java (selectListPage 함수)

 

	public List<MVCBoardDTO> selectListPage(Map<String,Object> map){
		
		List<MVCBoardDTO> board = new ArrayList<>();
		String query=" select *"
				+" from ("
				+" select rownum rNum, tb.* "
				+" from ("
				+" select *"
				+" from board";
				
				if(map.get("searchWord") != null){
					query += " WHERE " + map.get("searchField")+" "
						+ "LIKE '%" + map.get("searchWord") + "%'";
				}
	
				query += " order by num desc"
				+" )tb"
				+" )"
				+" where rNum between ? and ?";
		
				
		try {
			psmt = con.prepareStatement(query);
			psmt.setString(1, map.get("start").toString());
			psmt.setString(2, map.get("end").toString());
			rs = psmt.executeQuery();
			
			
			while(rs.next()) {
				MVCBoardDTO dto = new MVCBoardDTO();
				
				
				dto.setIdx(rs.getString(1));
				dto.setName(rs.getString(2));
				dto.setTitle(rs.getString(3));
				dto.setContent(rs.getString(4));
				dto.setPostdate(rs.getDate(5));
				dto.setOfile(rs.getString(6));
				dto.setSfile(rs.getString(7));
				dto.setDowncount(rs.getInt(8));
				dto.setPass(rs.getString(9));
				dto.setVisitcount(rs.getInt(10));

				board.add(dto);
			}
		}catch(Exception e) {
			System.out.print("게시물 조회 중 예외발생");
			e.printStackTrace();
		}
		return null;
	}

 

 

11. utils/BoardPage.java (페이지 번호 출력)

 

package utils;

public class BoardPage {
	
	//totalcount, pagesize : list.jsp에서 받아옴 
	public static String pagingStr(int totalCount, int pageSize, int blockPage, int pageNum, String reqUrl) {
		String pagingStr="";
		System.out.print("pagenum:" + pageNum);
		//전체 페이지수 출력
		int totalPages = (int)(Math.ceil(((double)totalCount/pageSize)));
		//페이지블록의 첫번째 시작값(ex. 1, 6, 11..)
		int pageTemp = (((pageNum -1)/blockPage)*blockPage) + 1; 
		System.out.print("pageTemp!!!!!!!!!!!!!!!" + pageTemp);
	
		//pageTemp가 1이 아닐때만(첫번재 블록에서는 안보임) 화면출력 (이전블록) 
		if(pageTemp != 1) {
			//reqUrl : list.jsp 브라우저 실행시 생성되는 주소값
			pagingStr += "<a href='" + reqUrl + "?pageNum=1'>[첫페이지]</a>"; //uri=BoardModel1paging/List.jsp
			pagingStr += "&nbsp;";
			pagingStr +="<a href='" + reqUrl + "?pageNum=" + (pageTemp - 1)
						+ "'>[이전 블록]</a>";
		}
		
		//각 페이지 번호 출력
		int blockCount = 1;
		while(blockCount <= blockPage && pageTemp <= totalPages) {
			if(pageTemp == pageNum) {
				pagingStr += "&nbsp;" + pageTemp +"&nbsp;";
			}else {
				pagingStr += "&nbsp;<a href='" + reqUrl + "?pageNum=" + pageTemp 
						+ "'>" + pageTemp + "</a>&nbsp;";
			}
			pageTemp++;
			blockCount++;
		}
		
		if(pageTemp <= totalPages) {
			pagingStr += "<a href='" + reqUrl +"?pageNum=" + pageTemp + "'>[다음 블록]</a>";
			pagingStr += "&nbsp;";
			pagingStr += "<a href='" + reqUrl + "?pageNum=" + totalPages + "'>[마지막 페이지]</a>";
		}
		
		return pagingStr;
		
	}

}

 

 

12. ListController.java (함수 호출, forward)

 

String pagingImg = BoardPage.pagingStr(totalCount, pageSize, blockPage, pageNum, "./list.do");
		map.put("pagingImg", pagingImg );
		map.put("totalCount", totalCount);
		map.put("pageSize", pageSize);
		map.put("pageNum", pageNum);
		
		request.setAttribute("boardLists", boardLists);
		request.setAttribute("map", map);
		request.getRequestDispatcher("/List.jsp").forward(request, response);

 

13. List.jsp

게시물 있는 부분과 없는부분 처리

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 2. 목록 -->
	<table border="1" width="90%">
		<tr>
			<th width="10%">번호</th>
			<th width="*">제목</th>
			<th width="15%">작성자</th>
			<th width="10%">조회수</th>
			<th width="15%">작성일</th>
			<th width="8%">첨부</th>
		</tr>

	
	<!-- DB에서 가져오는 값을 실제 출력하는 부분 -->
	
		<c:choose>
			<!-- 게시물이 없을 때 -->
			<c:when test="${empty boardLists }"> <!-- 비어있을 때 true-->
			<tr>
				<td colspan="6" align="center">
				 	등록된 게시물이 없어요!!!!!!
				</td>
			</tr>
			</c:when>
			
			<!-- 게시물이 있을 때 -->
			<c:otherwise>
					<c:forEach items="${boardLists }" var = "row" varStatus="loop">
						<tr>
							<td>${map.totalcount - (((map.pageNum-1)*map.pageSize) + loop.index)}</td> <!-- 페이지 숫자 감소???뭐야못들었어요  -->
							<td>${row.title }</td>
							<td>${row.name }</td>
							<td>${row.visitcount }</td>
							<td>${row.postdata }</td>
							<td>[DOWNLOAD]</td>
						</tr>
					</c:forEach>
			</c:otherwise>		
		</c:choose>
	</table>
	
	<table border="1" width="90%">
		<tr align="center">
			<td>${map.pagingImg }</td>
			<td width="100"><button type="button">글쓰기</button></td>
		</tr>
	</table>

'jsp' 카테고리의 다른 글

게시판_model2_2  (0) 2022.12.08
서블릿.do 에서 -> 액션.jsp  (0) 2022.12.07
@WebServlet, @WebInitParam  (0) 2022.12.07
servlet_Front Controller  (0) 2022.12.06
서블릿(servlet)  (0) 2022.12.06