96. 실력 향상 훈련 (2)
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 결과 소스
첫 번째 훈련의 결과 소스이다. 훈련을 먼저 수행한 다음에 결과 소스를 봐야 실력이 는다.
소스 파일 | 설명 |
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