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 += " ";
pagingStr +="<a href='" + reqUrl + "?pageNum=" + (pageTemp - 1)
+ "'>[이전 블록]</a>";
}
//각 페이지 번호 출력
int blockCount = 1;
while(blockCount <= blockPage && pageTemp <= totalPages) {
if(pageTemp == pageNum) {
pagingStr += " " + pageTemp +" ";
}else {
pagingStr += " <a href='" + reqUrl + "?pageNum=" + pageTemp
+ "'>" + pageTemp + "</a> ";
}
pageTemp++;
blockCount++;
}
if(pageTemp <= totalPages) {
pagingStr += "<a href='" + reqUrl +"?pageNum=" + pageTemp + "'>[다음 블록]</a>";
pagingStr += " ";
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 |