어제 했던 예제(model1)을 model2방식으로 변경 할 것이다.
** mode1 : JSP파일내에서 데이터를 처리하고 화면을 보여준다,
각 페이지 마다 역할을 분담한다.
JSP 에서는 화면(VIEW)
DAO 파일을 만들어서 데이터 처리
DTO 파일을 만들어서 데이터 전달
Servlet을 통하여 명령(데이터를 DTO파일한테 전달하거나 DAO파일을 불러 실행)
** DAO 는 데이터 베이스에 접근하여 일을 처리하는 오브젝트
DTO 는 파일을 전달하는 역할을 하는 오브젝트 (JavaBeans)
goodsIndex.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>코드 번호 조회</title>
</head>
<body>
<h2>상품 코드 번호를 입력해주세요.</h2>
<form action="search">
코드번호 입력 : <input type="text" name="code" size="5" maxlength="5" required="required" />
<br /> <input type="submit" value="확인" />
</form>
</body>
</html>
action="search" => servlet mapping:search
서블릿으로 넘기기 때문에 mapping명으로 값을 넘겨준다.
searchServlet.java
package com.jdh.controller;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
import com.jdh.dao.GoodsDAO;
import com.jdh.dto.GoodsDTO;
@WebServlet("/search")
public class SearchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 넘겨준 값을 받을 변수 생성
String code = request.getParameter("code");
//2. 접속 코드를 가지고 있는 GoodsDAO 객체 생성
GoodsDAO dao = GoodsDAO.getInstance();
//3. GoodsDAO 객체의 gstGoods() 메소드 호출 후 결과값 받기 -> DTO객체가 필요.(결과값을 저장받아야하니깐)
GoodsDTO dto = dao.getGoods(code);
//테스트 코드(값을 잘 가져왔는지.) dto쪽에 전에 사용했던 테스트 메소드를 만들어서 결과값을 확인하는 방법도 있다.(반드시 결과값이 들어왔는지 확인!!!)
//4. 결과 값을 GoodsIndex.jsp로 전달
HttpSession session = request.getSession();
session.setAttribute("DTO", dto); // 두 페이지에서 동일한 값을 사용하기 위해서 session에 저장
//request값 전달(변수를 사용했으니 RequestDispatcher)
RequestDispatcher rd = request.getRequestDispatcher("goodsInfo.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
넘어온 값으로 한페이지만 사용한다면 request로 받아 저장해서 값을 넘겨도 되지만
** request.setAttribute("DTO", dto); => 다음 수정페이지에서 사용을 못한다..
넘어온 값을 계속 사용해야하기 때문에 session으로 저장했다.
HttpSession session = request.getSession();
** JSP와 다르게 Servlet는 내장 객체가 없다.
session을 사용하기 위해서는 HttpSession이 가지고 있는 session을 통하여 객체를 만들어줘야한다.
*** DAO 페이지 ***
package com.jdh.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jdh.dto.GoodsDTO;
/** 데이터베이스에 접속, 쿼리실행에 관련된 모든 메소드를 보유 : SingleTone Pattern **/
public class GoodsDAO {
//객체를 저장할 멤버변수 선언 (자기 자신을 저장)
public static GoodsDAO instance =null;
//private 생성자로 변경
private GoodsDAO() {
}
//SingleTon
public static GoodsDAO getInstance() {
if(instance == null) {
instance = new GoodsDAO();
}
return instance;
}
public Connection getConnection() {
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/web_db?uesSSL=false";
String id = "dahoon226";
String pw = "ekgns00";
//JSP때는 에러페이지로 예외처리를 했는데 자바코드이기 때문에 그방법을 사용할 수 없다.
//try~catch를 하거나 throws를 통하여 예외처리 throws로 예외처리시 객체를 사용할때 다시 예외처리 필요ㅏ.
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,id,pw);
} catch(ClassNotFoundException e) {
System.err.println("DIRVER ERR : "+e.getMessage());
} catch(SQLException e) {
System.err.println("CONN ERR : " + e.getMessage());
}
return conn;
}//getConnection() END
데이터베이스 접속관련
매번 데이터 접속할때마다 연결메소드를 작성하면 불편하여 나온 방법.
아무나 가져다 쓸 수 있게 메소드를 생성 해놓은것.
: static을 이용하여 공유할 수 있도록 선언
*** DAO 설계시 주의사항
- 생성자를 외부에서 객체 생성하지 못하도록 반드시 private 생성자명(){ }
- 내부에서는 객체를 반환할 수 있도록 public메소드가 필요!!
- Connection 객체는 단 한개만 생성될 수 있도록 작업.
입력된 코드번호 조회
/** 코드를 이용하여 해당 데이터를 추출하여 반환 **/
//getGoods는 searchServlet에서 호출해서 사용됨.
//결과인 GoodsDTO 객체를 SearchServlet으로 반환.
public GoodsDTO getGoods(String code) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "SELECT * FROM goodInfo where code = ?";
//사용이 끝나서 rs가 닫히면 rs값을 밖으로 뺼수가 없으므로 값을 빼기 위해 dto변수에 값을 저장 시킨다.
GoodsDTO dto = null;
try {
//위에 만들어둔 메소드
conn = getConnection();
pstmt = conn.prepareStatement(query);
pstmt.setString(1, code);
rs = pstmt.executeQuery();
if(rs.next()) {
//dto 객체 생성
dto = new GoodsDTO();
//dto에 값을 저장
dto.setCode(rs.getString("code"));
dto.setTitle(rs.getString("title"));
dto.setWriter(rs.getString("writer"));
dto.setPrice(rs.getInt("price"));
}
} catch(SQLException e) {
System.err.println("SEARCH ERR" + e.getMessage());
} finally {
try {
if(rs != null) {
rs.close();
}
if(pstmt != null) {
pstmt.close();
}
if(conn != null) {
conn.close();
}
} catch(SQLException e) {
System.err.println("CLOSE ERR : "+e.getMessage());
}
}
//servlet으로 값을 전달
return dto;
}//getGoods(String code) END
데이터를 한번에 전달할 수 있도록 DTO 변수를 생성하여 이 안에 값을 담아서 전달한다.
담은 값은 다시 서블릿으로 전달하면 서블릿에서 다음 과정을 실행 시킬 것이다.
goodsInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 정보</title>
</head>
<body>
<h3>상품 정보</h3>
코드 : ${DTO.getCode() } <br />
제목 : ${DTO.getTitle() } <br />
작성자 : ${DTO.getWriter() } <br />
가격 : ${DTO.getPrice() } <br />
<input type="button" value="수정하기" onclick="document.location.href='goodsUpdate.jsp'" />
</body>
</html>
전 페이지에서 변수명 DTO에 값을 담아 전달 했으므로 DTO가 가지고있는 값을 꺼내 출력.
goodsUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>수정 페이지</title>
</head>
<body>
<h2>수정 페이지</h2>
<form action="update" method="get">
코드 : <input type="text" value="${DTO.getCode() }" name="code" readonly="readonly" /><br />
제목 : <input type="text" placeholder="${DTO.getTitle() }" name="title" required="required" /><br />
작성자 : <input type="text" placeholder="${DTO.getWriter() }" name="writer" required="required" /><br />
가격 : <input type="text" placeholder="${DTO.getPrice() }" name="price" required="required" /><br />
<br />
<input type="submit" value="수정하기" />
</form>
</body>
</html>
코드는 수정할 수 없도록 readonly속성 부여!!
값을 다음 서블릿인 update으로 넘길 것이기에 action부분이 수정이 됐다.
UpdateServlet.java
package com.jdh.controller;
import java.io.IOException;
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.jdh.dao.GoodsDAO;
import com.jdh.dto.GoodsDTO;
@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("UpdateServlet의 doGet() 실행"");
// 1.수정된 값을 추출
String code = request.getParameter("code");
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String price = request.getParameter("price");
GoodsDTO dto = new GoodsDTO();
dto.setCode(code);
dto.setTitle(title);
dto.setWriter(writer);
dto.setPrice(Integer.parseInt(price));
//2. GoodsDAO 객체 생성(DB접속을 해야하니깐)
GoodsDAO dao = GoodsDAO.getInstance();
//3. GoodsDAO 객체의 updateGoods()에게 추출한 값들을 전달
dao.updateGoods(dto);
//4. 결과값을 확인 하기 위한 goodsIndex.jsp
response.sendRedirect("goodsIndex.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
수정된 값을 변수를 생성하여 저장해준 후
그 값을 다시 DTO객체를 생성하여 저장 시켜준다.
Update관련 DAO페이지
/** 코드를 이용하여 해당 레코드의 데이터를 수정 **/
public void updateGoods(GoodsDTO dto) {
Connection conn = null;
PreparedStatement pstmt = null;
String query = "UPDATE goodInfo SET title = ?, writer = ?, price = ? WHERE code = ?";
try {
conn = getConnection();
pstmt = conn.prepareStatement(query);
pstmt.setString(4,dto.getCode());
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getWriter());
pstmt.setInt(3, dto.getPrice());
pstmt.executeUpdate();
} catch(SQLException e) {
System.err.println("UPDATE ERR : "+e.getMessage());
} finally {
try {
if(pstmt != null) {
pstmt.close();
}
if(conn != null) {
conn.close();
}
} catch(SQLException e) {
System.err.println("CLOSE ERR : "+e.getMessage());
}
}
}//updateGoods(GoodsDTO dto) END
값을 수정만 하면되기에 리턴값이 없다.
** DAO는 한페이지에 데이터 관련 메소드들을 정의
오늘 배운 내용을 토대로
검색기능과 수정, 간단한 회원가입 만들기
코드 자체는 위에 파일과 크게 차이나는것은 없다.
내일 로그인 및 추가된 회원가입을 실습하니
이런 기능들만 모아서 따로 정리해볼 생각이다!!
'Learn > KH정보교육원' 카테고리의 다른 글
로그인,회원가입 구현하기 - 1 (0) | 2021.04.29 |
---|---|
[KH정보교육원 당산] 37일차 (로그인, 회원가입 구현) (0) | 2021.04.29 |
[KH정보교육원 당산] 35일차 (검색기능을 통하여 리스트 출력) (0) | 2021.04.27 |
[KH정보교육원 당산] 34일차 (JSTL 실습, Servlet) (0) | 2021.04.26 |
[KH정보교육원 당산] 33일차 (Cookie, Session, JavaBeans, EL , JSTL) (0) | 2021.04.23 |