티스토리 뷰

Servlet JSP

Model 데이터를 구조화

Programmers 2021. 5. 14. 15:12
반응형

목표:
1. Model데이터를 구조화하는 이유에 대해서 안다.
2. Model데이터를 구조화하여 구현한다.



개념화된 데이터 = 엔티티 = 개체 = 사용자형 자료형 = 구조적인 데이터

Model데이터를 구조화하는 이유
 반복되는 코드를 줄일 수 있고 속성이라는 이름으로 묶어서 표현하면 코드가 직관적이며 가독성이 높아진다

데이터 구조화 방법1

반복되는 코드를 한번에 묶어서 표현한다.

 

데이터 구조화 방법2

개체를 만들어 속성을 호출하는 것처럼 사용한다. (실제로는 getters와 setters를 통해서 사용)

코드:

/* Notice.java */
package com.newlecture.web.entity;

import java.util.Date;

/* Notice 클래스에 속성을 정의 Notice라는 Entity객체 */
public class Notice {
	private int id; //id도 추가
	private String title;
	private String writerId;
	private Date regdate;
	private String hit;
	private String files; 
	private String content;
	
	/* 기본생성자 */
	public Notice() {
		
	}
	
	/* 오버로드 생성자 추가 */
	public Notice(int id, String title, String writerId, Date regdate, String hit, String files, String content) {
		
		this.id = id;
		this.title = title;
		this.writerId = writerId;
		this.regdate = regdate;
		this.hit = hit;
		this.files = files;
		this.content = content;
	}

	/* Getters and Setters 추가 */
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWriterId() {
		return writerId;
	}

	public void setWriterId(String writerId) {
		this.writerId = writerId;
	}

	public Date getRegdate() {
		return regdate;
	}

	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}

	public String getHit() {
		return hit;
	}

	public void setHit(String hit) {
		this.hit = hit;
	}

	public String getFiles() {
		return files;
	}

	public void setFiles(String files) {
		this.files = files;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	/* ToString 생성 */
	@Override
	public String toString() {
		return "Notice [id=" + id + ", title=" + title + ", writerId=" + writerId + ", regdate=" + regdate + ", hit="
				+ hit + ", files=" + files + ", content=" + content + "]";
	}
}

Notice.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;

import com.newlecture.web.entity.Notice;

@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");
			
			/* notice라는 변수를 생성, 오버로드 생성자를 이용*/
			/* 들어가는 속성의 순서를 잘 확인해야한다 */
			Notice notice = new Notice(
								id,
								title,
								writerId,
								regdate,
								hit,
								files,
								content
							);
			
			/* 하나의 그릇(notice)에 담아서 호출 */
			request.setAttribute("n", notice);
			
						
			/* 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);
	}
}

이전에 사용하던 request.setAttribute()들을 모두 주석처리하고
 notice 객체를 생성하고 모든 값을 담은 단 하나의 request.setAttribute()를 호출한다.

 

<!-- detail.jsp 일부-->
<!-- 코드블럭을 제거하고 EL을 사용 -->
	<th>제목</th>
	<td class="text-align-left text-indent text-strong text-orange" colspan="3">${n.title}</td>
</tr>
<tr>
	<th>작성일</th>
	<td class="text-align-left text-indent" colspan="3">${n.regdate}</td>
</tr>
<tr>
	<th>작성자</th>
	<td>${n.writerId}</td>
	<th>조회수</th>
	<td>${n.hit}</td>
</tr>
<tr>
	<th>첨부파일</th>
	<td colspan="3">${n.files}</td>
</tr>
<tr class="content">
	<td colspan="4">${n.content}</td>
</tr>

기존의 코드블럭을 EL로 대체해서 코드를 간결하게 만듦

결과:

출력 결과는 이전과 동일.

 

 

반응형

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

View페이지 은닉하기  (1) 2021.05.14
목록페이지 MVC model2로 수정  (0) 2021.05.14
JSP MVC model2로 변경하기  (0) 2021.05.13
자세한 페이지 MVC model1으로 변경하기  (0) 2021.05.11
자세한 페이지 구현  (0) 2021.05.10
댓글
공지사항