반응형
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Front Controller</title>
</head>
<body>
<h2>프론트컨트롤러 프로젝트 연습하기</h2><hr>
<a href="<%= request.getContextPath() %>/sample/main.do">sample 메인페이지로 이동</a>
<br>
<a href="<%= request.getContextPath() %>/sample/board1List.do">
sample 게시판1 페이지로 이동
</a><br>
<a href="<%= request.getContextPath() %>/sample/board2List.do">
sample 게시판2 페이지로 이동
</a><br>
<!--
sample 게시판1 페이지로 이동 클릭시 WEB-INF/sample/list1.jsp를 출력
sample 게시판2 페이지로 이동 클릭시 WEB-INF/sample/list2.jsp를 출력
-->
<br>
<a href="<%= request.getContextPath() %>/board/main.do">board 메인페이지로 이동</a>
</body>
</html>
FrontController
package frontControllerPJT.controller;
/*
frontcontroller의 역할!
모든 가상경로를 제일 처음 맞이하여 역할에 맞는 컨트롤러로 기능 처리를 넘기는 중간 매개체 역할을 한다
효과 : 가상경로마다 servlet을 선언하지 않고 역할에 맞춰서 servlet을 선언하기 때문에
servlet이 무한증식하지 않고 비교적 깔끔하게 프로젝트 구조를 구성할 수 있다
해야 할 일 : 요청 uri를 분석하여 어떤 컨트롤러로 기능을 요청해야하는지 분석 후 처리
*/
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("*.do")
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontController() {}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
URL : 도메인을 포함한 경로
URI : 도메인을 제외한 경로
*/
System.out.println("frontcontroller 실행 url:"+request.getRequestURI());
//1. 요청 uri 정보를 가지고 온다
String uri = request.getRequestURI();
//2. 프로젝트 경로를 가지고 온다.
String contextPath = request.getContextPath();
//3. 요청 uri에서 필요없는 프로젝트 경로를 제외한 uri를 가지고 온다
String comment = uri.substring(contextPath.length()+1);
/*
/frontControllerPJT/sample/main.do에서
/frontControllerPJT/ 부분이 잘림
*/
System.out.println(comment);
//4. 3번에서 찾은 요청 경로에서 /를 기준으로 문자열을 자른다.
String[] comments = comment.split("/");
System.out.println("comments[0] : "+comments[0]);
//5. 만들어진 문자열 배열의 첫번째 문자열이 어떤 컨트롤러로 기능을 요청해야할지 결정한다.
if(comments[0].equals("sample")) {
//SampleController 에게 처리 전달
SampleController sample = new SampleController(request,response,comments);
}else if(comments[0].equals("board")) {
BoardController board = new BoardController(request,response,comments);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
BoardController
package frontControllerPJT.controller;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import frontControllerPJT.util.DBConn;
import frontControllerPJT.vo.NoticeBoardVO;
public class BoardController {
public BoardController(HttpServletRequest request
, HttpServletResponse response
, String[] comments) throws ServletException, IOException {
if(comments[comments.length-1].equals("main.do")) {
//comments의 마지막 인덱스 값이 main.do이면 main메소드 호출
main(request,response);
}
}
public void main(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException {
Connection conn = null; //DB 연결
PreparedStatement psmt = null; //SQL 등록 및 실행. 보안이 더 좋음!
ResultSet rs = null; //조회 결과를 담음
List<NoticeBoardVO> boardList = new ArrayList<>();
//try 영역
try{
conn = DBConn.conn();
String sql = "select nno,title,uid,n.uno,content,filename, "
+ "date_format(n.rdate,'%Y-%m-%d') as rdate,n.state,hit,top_yn "
+ "from notice_board n "
+ "inner join user u "
+ "on n.uno = u.uno ";
sql += " where n.state='E' ";
sql += "order by top_yn desc, nno desc ";
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while(rs.next()){
NoticeBoardVO board = new NoticeBoardVO(
rs.getString("nno"),
rs.getString("uno"),
rs.getString("title"),
rs.getString("content"),
rs.getString("rdate"),
rs.getString("hit"),
rs.getString("state"),
rs.getString("top_yn"),
rs.getString("filename"),
rs.getString("uid")
);
boardList.add(board);
}
request.setAttribute("boardList", boardList);
request.getRequestDispatcher("/WEB-INF/notice/list.jsp").forward(request, response);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
DBConn.close(rs, psmt, conn);
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="frontControllerPJT.vo.*" %>
<%
List<NoticeBoardVO> boardList = (List<NoticeBoardVO>)request.getAttribute("boardList");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Front Controller</title>
</head>
<style>
td{
text-align:center;
}
</style>
<body>
<h2>공지사항 목록 페이지</h2><hr>
<table>
<thead>
<tr>
<th>글번호</th>
<th>제목</th>
<th width="80px">작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<!-- /board/main.do 요청시 데이터베이스 notice_board
테이블의 전체 데이터를 해당 영역에 출력하세요
-->
<%
int num = boardList.size();
for(NoticeBoardVO n : boardList){
%>
<tr>
<td width="60px;" style="color:<%= n.getTop_yn().equals("Y") ? "red" : "black" %>";>
<%
if(n.getTop_yn().equals("Y")){
%>★<%
num--;
}else{
%>
<%= num-- %>
<%
}
%>
</td>
<td>
<a href="view.do?nno=<%= n.getNno() %>" style="color:<%= n.getTop_yn().equals("Y") ? "red" : "black" %>";>
<%= n.getTitle() %>
</a>
</td>
<td>
<%= n.getUid() %>
</td>
<td>
<%= n.getRdate() %>
</td>
<td width="60px;">
<%= n.getHit() %>
</td>
</tr>
<%
}
%>
</tbody>
</table>
</body>
</html>
반응형
'Java' 카테고리의 다른 글
[Servlet] FrontController 게시글 수정하기 삭제하기 (0) | 2024.10.25 |
---|---|
[Servlet] FrontController 게시글 상세 조회 (0) | 2024.10.24 |
[Servlet] Front Controller (0) | 2024.10.19 |
[Servlet] 게시글 삭제 (0) | 2024.10.14 |
[Servlet] 게시글 수정 (0) | 2024.10.13 |