이때까지 앞에서 작성했던 코드들은 JAVA 코드와 HTML 코드가 군데 군데 흩어져 있어 찾기 힘들었다.
그래서 JAVA 코드는 JAVA 코드끼리 HTML 코드는 HTML 코드끼리 모으려고 한다.
그러기 위해서는 임시 변수를 이용해서 코드를 분리해줘야 한다.
코드를 나눠주는 Model과 Model을 사용해서 화면을 출력하는 View,
이 Model을 만들어내는 코드인 Controller로 이루어진 MVC 방식을 사용해보도록 하겠다.
앞에서 나눠져 있던 JAVA 코드와 HTML 코드를 한 곳에 모아서 가져와야 한다.
여기서 사용하고 있는 ResultSet은 아래의 HTML쪽 코드에서 사용할 수 없으므로
임시 변수 즉, 모델을 준비해주도록 한다.
Model1
<%@page import="java.util.Date"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int id = Integer.parseInt(request.getParameter("id"));
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String sql = "SELECT * FROM NOTICE WHERE ID=?";
String USER = "system";
String PASSWORD = "oracle";
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setInt(1,id);
ResultSet rs = st.executeQuery();
rs.next();
String title = rs.getString("TITLE");
Date regDate = rs.getDate("REGDATE");
String writer_id = rs.getString("WRITER_ID");
Integer hit = rs.getInt("HIT") ;
String files = rs.getString("FILES");
String content = rs.getString("CONTENT");
rs.close();
st.close();
conn.close();
%>
Model1은 JAVA 코드를 위쪽으로 옮겨 이를 Controller라고 하고
여기서 만들어낸 Model을 지역적으로 View에서 사용하는 것이다.
Controller와 View 부분을 물리적으로 나누는 방식인 Model2 방법을 사용해보자.
Controller는 Servlet으로, View는 JSP로 된다.
근데 결국 JSP는 결과물이 Servlet이기에 Servlet이 2개가 된다.
그러면 이 Model이 Model1의 Model과 다르게 지역 변수로 사용할 수 없게 된다.
그래서 Servlet과 Servlet을 이어줄 수 있는 방법이 필요하다.
또한 Controller의 Servlet에서 View의 Servlet(JSP) 쪽으로 값을 넘길 때
사용할 수 있는 공유 방법이 필요하다.
Controller와 View를 나누면 서로 개별적으로 유지 관리가 되며 재사용할 때도 편하다.
이는 https://myblog1128.tistory.com/93 에서 다뤘으니 참고하도록 하자.
공유 방법으로 내장 객체인 request를 사용하며
JAVA 코드를 따로 뽑아내서 Controller 클래스로 아래와 같이 만들어준다.
Model2
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(name="noticeDetailController", urlPatterns="/notice/detail")
public class NoticeDetailController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String sql = "SELECT * FROM NOTICE WHERE ID=?";
String USER = "system";
String PASSWORD = "oracle";
try {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setInt(1,id);
ResultSet rs = st.executeQuery();
rs.next();
String title = rs.getString("TITLE");
Date regDate = rs.getDate("REGDATE");
String writer_id = rs.getString("WRITER_ID");
Integer hit = rs.getInt("HIT") ;
String files = rs.getString("FILES");
String content = rs.getString("CONTENT");
req.setAttribute("title", title);
req.setAttribute("regDate", regDate);
req.setAttribute("writer_id", writer_id);
req.setAttribute("hit", hit);
req.setAttribute("files", files);
req.setAttribute("content", content);
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException se) {
se.printStackTrace();
}
req.getRequestDispatcher("/notice/detail.jsp").forward(req, resp);
}
}
request를 공유하게 되므로 setAttribute()로 저장한 값들을
View에서도 getAttribute()를 사용해서 아래와 같이 사용할 수 있게 된다.
<tbody>
<tr>
<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("writer_id") %></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>
</tbody>
'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
JSTL(JSP Standard Tag Library)과 중간 정리 (0) | 2023.07.22 |
---|---|
Model 데이터 구조화하고 View 페이지 은닉하기 (0) | 2023.07.18 |
JSP에서 Oracle 사용하기 (0) | 2023.07.16 |
JSP의 페이지 지시자를 이용한 인코딩 (0) | 2023.07.15 |
EL 연산자와 EL의 데이터 저장소 (0) | 2023.07.11 |