controller service dao db
에서 역방향으로 돌아가 JDBC에 전달하는 개념
만든 패키지 : controller,service,dao,vo, +common(템플릿)
작성한 XML: driver.xml/student-sql.xml
DAO 관리: student-sql.xml
JDBCTemplate 관리: driver.xml
마지막 단계: view 안에 student 폴더를 만든 후 selectall.jsp
1. index.html (전반적으로 a href로 표현되는 html)
<!
-- 03/22 4. 학생 정보조회-->
<li>
<!
-- 현재 페이지 주소 : /JSPProject2/index.html -->
<!
-- 목표 페이지 주소 : /JSPProject2/student/selectAll-->
<a href="http://twelve727./m/student/selectAll">4. 학생 전체 조회</a>
</li>
2. edu.kh.jsp. 경로로 생성되는 파일
만든 패키지 : controller,service,dao,vo, +common(템플릿)
작성한 XML: driver.xml/student-sql.xml
DAO 관리: student-sql.xml
JDBCTemplate 관리: driver.xml
3. 컨트롤러 – 서비스 – DAO – VO – COMMON 순서로 코드 작성
index.html 작성: 첫 페이지에서 링크를 넘어서는 화면 출력
driver.xml 작성:
<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>driver.xml file</comment>
<!
-- entry : K:V로 한 쌍 -->
<entry key="driver">oracle.jdbc.driver.OracleDriver</entry>
<entry key="url">jdbc:oracle:thin:@localhost:1521:xe</entry>
<entry key="user">workbook</entry>
<entry key="password">1234</entry>
</properties>
student-sql.xml 작성: 수신할 DB 구문 작성
<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="selectAll">
SELECT STUDENT_NO, STUDENT_NAME, STUDENT_ADDRESS, DEPARTMENT_NAME
FROM TB_STUDENT
JOIN TB_DEPARTMENT USING(DEPARTMENT_NO)
</entry>
</properties>
JDBCTemplate
DB 연결Connection
자동 커밋 X, 객체 자원 반환(close)
JDBC에서 반복적으로 사용되는 코드를 모은 클래스
모든 필드, 메소드는 static 로서 다루어집니다
어디에서나 클래스명, 필드명/클래스명, 메소드명으로 출력하기 위해서
private static Connection conn = null;
public static Connection getConnection() {
// try 문 시작!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
try {
} if(conn == null || conn.isClosed()) {
Properties prop = new Properties()
tring filePath
= JDBCTemplate.class.getResource("/edu/kh/jsp/sql/driver.xml").getPath();
prop.loadFromXML( new FileInputStream(filePath));
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
// catch 문 시작!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
} catch(Exception e) {
System.out.println("(Connection 생성 중 예외 발생)");
e.printStackTrace();
}
return conn;
}
// Connection 객체 반환 메소드 !
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
public static void close(Connection conn) {
try {
if(conn !
=null && !
conn.isClosed()) conn.close();
} catch(Exception e) {
e.printStackTrace();
}
}
// Statement(부모), PrepareStatement(자식) 객체 자원 반환 메서드 !
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
public static void close(Statement stmt) {
try {
if(stmt !
=null & !
stmt.isClosed()) stmt.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs) {
try {
if(rs !
=null & !
rs.isClosed()) rs.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void commit(Connection conn) {
try {
if(conn !
=null && !
conn.isClosed()) conn.commit();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void rollback(Connection conn) {
try {
if(conn !
=null && !
conn.isClosed()) conn.rollback();
} catch(Exception e) {
e.printStackTrace();
}
}
}
컨트롤러
controller 에서 extends HttpServlet + @WebServlet(“/jstl”) 작성 후 doget 로서 받는다
(do get) throws exception 해준 후
RequuestDispatcher dispatcher = req.getRequestDispatcher (요청의 위임을 받는 주소를 작성)
dispatcher.forward(req, resp); 포워드
package edu.kh.jsp.student.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
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 edu.kh.jsp.student.model.service.StudentService;
import edu.kh.jsp.student.model.vo.Student;
@WebServlet("/student/selectAll")
public class SelectAllServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 서비스 객체 생성
StudentService service = new StudentService();
try {
List<Student> stdList = service.selectAll();
// 조회 결과를 request에 세팅
req.setAttribute("stdList", stdList);
// 요청 위임
RequestDispatcher dispather
= req.getRequestDispatcher("/WEB-INF/views/student/selectall.jsp");
dispather.forward(req, resp);
} catch(Exception e) {
e.printStackTrace();
}
}
}
VO
Student 객체의 기본 생성자/파라미터 생성자/get, set/override 등
DAO
statement 객체 작성, 버스 스터드, 리턴,
finally return 까지
package edu.kh.jsp.student.model.dao;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static edu.kh.jsp.common.JDBCTemplate.*;
import edu.kh.jsp.student.model.vo.Student;
public class StudentDAO {
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
private Properties prop;
public StudentDAO() {
try {
String filePath
= StudentDAO.class.getResource("/edu/kh/jsp/sql/student-sql.xml").getPath();
prop = new Properties();
prop.loadFromXML(new FileInputStream(filePath));
}catch(Exception e) {
e.printStackTrace();
}
}
/**
* @param conn
* @return
*/
public List<Student> selectAll(Connection conn) throws Exception {
// 결과 저장용 변수 선언
List<Student> stdList = new ArrayList<>();
// try 에서 SQL 작성하기
// studen-sql의 <entry> 태그 안에 있는걸 가져오는 개념
try {
String sql = prop.getProperty("selectAll");
// Statement 객체 생성
stmt = conn.createStatement();
// Statement 버스태워 보냄, Query인 이유? 조회여서
// SQL 수행 했으니 결과(resultset) 반환 받기
rs = stmt.executeQuery(sql);
while(rs.next()) {
String studentNo = rs.getString("STUDENT_NO");
String studentName = rs.getString("STUDENT_NAME");
String studentAddress = rs.getString("STUDENT_ADDRESS");
String departmentName = rs.getString("DEPARTMENT_NAME");
stdList.add(
new Student(studentNo, studentName, studentAddress, departmentName)
);
}
} finally {
// finally 이유 ? 사용한 JDBC 객체 자원 반환
close(rs);
close(stmt);
}
// return 이유 ? 결과값 반환
return stdList;
}
}
서비스
Connection 생성 및 토잭 처리, 반환까지
package edu.kh.jsp.student.model.service;
import java.sql.Connection;
import java.util.List;
import static edu.kh.jsp.common.JDBCTemplate.*;
import edu.kh.jsp.student.model.dao.StudentDAO;
import edu.kh.jsp.student.model.vo.Student;
public class StudentService {
private StudentDAO dao = new StudentDAO();
public List<Student> selectAll() throws Exception {
// Connection 생성
// static .* 붙여주면 더 이상 JDBC 필요 XX
Connection conn = getConnection();
List<Student> stdList = dao.selectAll(conn);
// 트잭 처리
// connection 반환
close(conn);
return stdList;
}
}
selectAllServlet
객체 만들기/ 검색결과를 요청으로 설정/ 요청 위임
package edu.kh.jsp.student.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
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 edu.kh.jsp.student.model.service.StudentService;
import edu.kh.jsp.student.model.vo.Student;
@WebServlet("/student/selectAll")
public class SelectAllServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 서비스 객체 생성
StudentService service = new StudentService();
try {
List<Student> stdList = service.selectAll();
// 조회 결과를 request에 세팅
req.setAttribute("stdList", stdList);
// 요청 위임
RequestDispatcher dispather
= req.getRequestDispatcher("/WEB-INF/views/student/selectall.jsp");
dispather.forward(req, resp);
} catch(Exception e) {
e.printStackTrace();
}
}
}
selectAll.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 lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>학생 전체 조회</title>
</head>
<body>
<table border="1">
<tr>
<th>학번</th>
<th>이름</th>
<th>학과</th>
<th>주소</th>
</tr>
<c:forEach var="student" items="${stdList}">
<tr>
<td>${student.studentNo}</td>
<td>${student.studentName}</td>
<td>${student.departmentName}</td>
<td>${student.studentAddress}</td>
</tr>
</c:forEach>
</table>
</body>
</html>