교재 실습/자바 웹 개발 워크북

96. 실력 향상 훈련 (2)

Jint 2022. 8. 20. 13:41

3. 훈련 1 프로젝트 목록 페이지 구현

첫 번째 훈련은 프로젝트 목록 페이지를 출력하는 것이다.

 

1) DAO 인터페이스 생성

프로젝트 데이터를 처리할 DAO의 인터페이스를 정의한다. 패키지 이름은 spms.dao이고, 인터페이스 이름은 ProjectDao 이다. 그리고 프로젝트 목록을 반환하는 다음 메서드를 선언해야 한다.

List<Project> selectList() throws Exception; //프로젝트 목록 반환 메서드

 

2) DAO 구현체 생성

ProjectDao 인터페이스를 구현한 MySqlProjectDao 클래스를 생성한다. 패키지 이름은 spms.dao 이다. Project 객체에는 프로젝트 번호(PNO), 이름(PNAME), 시작일(STA_DATE), 종료일(END_DATE), 상태(STATE) 값이 들어있어야 한다. 목록은 최신 등록 순으로 정렬되어야 한다.

 

3) 페이지 컨트롤러 생성

spms.controls 패키지에 ProjectListController 클래스를 생성한다. MySqlProjectDao 객체를 사용하여 프로젝트 목록 데이터를 준비한다.

 

4) JSP 페이지 생성

프로젝트 목록 페이지를 출력하는 'webapp/project/ProjectList.jsp'를 작성한다(그림 1).

그림 1 (프로젝트 목록 페이지)

 

- 훈련 1 결과 소스

첫 번째 훈련의 결과 소스이다. 훈련을 먼저 수행한 다음에 결과 소스를 봐야 실력이 는다.

소스 파일 설명
spms/dao/ProjectDao.java ProjectDao 인터페이스 정의
spms/dao/MySqlProjectDao.java ProjectDao 인터페이스를 구현한 클래스
spms/controls/ProjectListController.java 프로젝트 목록 페이지를 처리하는 페이지 컨트롤러
webapp/project/ProjectList.jsp 프로젝트 목록 페이지를 생성하는 뷰 컴포넌트

 

- DAO 인터페이스 - ProjectDao

package spms.dao;

import java.util.List;

import spms.vo.Project;

//ProjectDao 인터페이스 정의
public interface ProjectDao {
	List<Project> selectList() throws Exception; //프로젝트 목록 반환 메서드
}

 

- DAO 구현체 - MySqlProjectDao

package spms.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import spms.annotation.Component;
import spms.vo.Project;

@Component("projectDao")
public class MySqlProjectDao implements ProjectDao {
	
	//DataSource 인터페이스
	DataSource ds;
	
	//DataSource 인터페이스 객체 주입
	public void setDataSource(DataSource ds) {
		this.ds = ds;
	}
	
	//프로젝트 목록 조회
	@Override
	public List<Project> selectList() throws Exception {
		Connection connection = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			connection = ds.getConnection(); //커넥션 객체 가져오기
			stmt = connection.createStatement();
			rs = stmt.executeQuery(
				"SELECT PNO, PNAME, STA_DATE, END_DATE, STATE "
			  + "FROM PROJECTS "
			  + "ORDER BY PNO DESC"
			);
			ArrayList<Project> projects = new ArrayList<Project>();
			while(rs.next()) {
				projects.add(new Project().setNo(rs.getInt("PNO"))
										  .setTitle(rs.getString("PNAME"))
										  .setStartDate(rs.getDate("STA_DATE"))
								          .setEndDate(rs.getDate("END_DATE"))
								          .setState(rs.getInt("STATE"))	);
			}
			return projects;
		} catch (Exception e) {
			throw e;
		} finally {
			try {if (rs != null) rs.close();} catch(Exception e) {}
			try {if (stmt != null) stmt.close();} catch(Exception e) {}
			try {if (connection != null) connection.close();} catch(Exception e) {}
		}
	}
	
}

 

- 페이지 컨트롤러 - ProjectListController

package spms.controls;

import java.util.Map;

import spms.annotation.Component;
import spms.dao.MySqlProjectDao;

@Component("/project/list.do")
public class ProjectListController implements Controller {
	
	//인스턴스 변수
	MySqlProjectDao projectDao;
	
	//셋터 메서드
	public ProjectListController setProjectDao(MySqlProjectDao projectDao) {
		this.projectDao = projectDao;
		return this;
	}

	//Controller 인터페이스 구현 메서드
	@Override
	public String execute(Map<String, Object> model) throws Exception {
		model.put("projects", projectDao.selectList());
		return "/project/ProjectList.jsp";
	}
	
}

 

- 뷰 컴포넌트 - ProjectList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>프로젝트 목록</title>
</head>
<body>
<jsp:include page="/Header.jsp"/>
<h1>프로젝트 목록</h1>
<p><a href='add.do'>신규 프로젝트</a></p>
<table border="1">
	<tr>
		<th>번호</th>
		<th>제목</th>
		<th>시작일</th>
		<th>종료일</th>
		<th>상태</th>
		<th></th>
	</tr>
	<c:forEach var="project" items="${projects}">
		<tr> 
			<td>${project.no}</td>
			<td><a href='update.do?no=${project.no}'>${project.title}</a></td>
			<td>${project.startDate}</td>
			<td>${project.endDate}</td>
			<td>${project.state}</td>
			<td><a href='delete.do?no=${project.no}'>[삭제]</a></td>
		</tr>
	</c:forEach>
</table>
<jsp:include page="/Tail.jsp"/>
</body>
</html>

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr