티스토리 뷰

Servlet JSP

JSP MVC model2로 변경하기

Programmers 2021. 5. 13. 13:30
반응형

목표: MVC model2의 장점을 알고 MVC model1을 MVC model2로 변경하기

MVC model2란?
View와 Controller 부분을 물리적으로 나누는 방식

단점: 복합도가 높아진다

장점: 나누어져 있어서 개별적으로 관리가 가능(협업 가능), 재사용 가능
JSP는 요청이 오면 실행하기 때문에 가벼운 반면,
서블릿은 무겁지만 미리 컴파일을 해놓을 수있기 때문에 실행 속도가 빨라진다. 

Mode(bean)라는 세션에서는 request라는 저장소, 입력도구를 사용해서
Controller와 View를 물리적으로 나눌 수있다.

 

Controller 생성

 

코드:
Controller => NoticeDetailController.java

/* NoticeDetailController.java */
package com.newlecture.web.controller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

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("/notice/detail")
public class NoticeDetailController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		int id = Integer.parseInt(request.getParameter("id"));

		String url = "jdbc:oracle:thin:@localhost:1521/XE";
		String sql = "SELECT * FROM NOTICE WHERE ID=?";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, "programmers", "111111");
			PreparedStatement st = con.prepareStatement(sql);
			st.setInt(1, id);

			ResultSet rs = st.executeQuery();

			rs.next();

			String title = rs.getString("TITLE");
			String writerId = rs.getString("WRITER_ID");
			Date regdate = rs.getDate("REGDATE");	//util import
			String hit = rs.getString("HIT");
			String files = rs.getString("FILES");
			String content = rs.getString("CONTENT");
			
			/* request저장소에 값들을 저장*/
			request.setAttribute("title", title);
			request.setAttribute("writerId", writerId);
			request.setAttribute("regdate", regdate);
			request.setAttribute("hit", hit);
			request.setAttribute("files", files);
			request.setAttribute("content", content);
			

			rs.close();
			st.close();
			con.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//forward -> detail.jsp를 요청하면서 현재 사용중인 request 저장소와 출력도구를 공유한다.
		request.getRequestDispatcher("/notice/detail.jsp").forward(request, response);
	}
}

detail.jsp로부터 JAVA코드를 복사해서 붙여 넣는다.
필요한 부분들은 모두 import 해주고, 예외처리까지 해준다.
request를 이용해서 값들을 저장하고 dispatcher로 forward 해줘서 notice/detail.jsp로 값들을 넘겨준다.
그리고 notice/detail.jsp에서 request값을 출력하기 위해 코드를 수정해준다.

<!-- detail.jsp 일부 -->
	<th>제목</th>
	<td class="text-align-left text-indent text-strong text-orange" colspan="3"><%=request.getAttribute("title") %></td>
</tr>
<tr>
	<th>작성일</th>
	<td class="text-align-left text-indent" colspan="3"><%=request.getAttribute("regdate") %></td>
</tr>
<tr>
	<th>작성자</th>
	<td><%=request.getAttribute("writerId") %></td>
	<th>조회수</th>
	<td><%=request.getAttribute("hit") %></td>
</tr>
<tr>
	<th>첨부파일</th>
	<td colspan="3"><%=request.getAttribute("files") %></td>
</tr>
<tr class="content">
	<td colspan="4"><%=request.getAttribute("content") %></td>
</tr>
					

코드 내에서 request.getAttribute()를 통해서 값들을 전달받는다.

또한 NoticeDetailController.java에서 목록 id를 전달받기 위해서 list.jsp에서 코드를 수정해주어야 한다.

		<!-- list.jsp -->				
                <tbody>
			<!-- 데이터 베이스로부터 게시판목록을 출력하는 코드블록 -->					
			<% while(rs.next()){ %>
					
			<tr>
				<td><%=rs.getInt("ID")%></td>
				<td class="title indent text-align-left"><a href="detail?id=<%=rs.getInt("ID")%>"><%=rs.getString("TITLE") %></a></td>
				<!-- detail?id로 id를 전달해야한다. -->
				<td><%=rs.getString("WRITER_ID") %></td>
				<td>
					<%=rs.getDate("REGDATE") %>		
				</td>
				<td><%=rs.getInt("HIT") %></td>
			
				<%}%>
			
			</tbody>


이전에는 URL이 "detail.jsp? id"로 연결됐지만 이제 "detail? id"(NoticeDetailController-웹 서블릿 주소)로 변경한다.

결과:
 물리적으로 View(detail.jsp)와 Controller(NoticeDetailController.java)가 분리되었고, 출력 결과는 이전과 동일하다.

문제점:
 아직까지 View(detail.jsp) 내에 코드 블록이 지저분하게 구현되어있다.

 

반응형

'Servlet JSP' 카테고리의 다른 글

목록페이지 MVC model2로 수정  (0) 2021.05.14
Model 데이터를 구조화  (0) 2021.05.14
자세한 페이지 MVC model1으로 변경하기  (0) 2021.05.11
자세한 페이지 구현  (0) 2021.05.10
JDBC를 이용해 글 목록 구현  (0) 2021.05.10
댓글
공지사항