너굴 개발 일지

210427_JSP 관련 데이터 다루기 문제 본문

JSP,Serlvet

210427_JSP 관련 데이터 다루기 문제

너굴냥 2021. 4. 27. 23:07

사진의 흐름도에 따라서 각 화면과 데이터 처리를 담당하는 jsp 파일로 구성된 프로젝트를 만드시오

(db 테이블 설계 및 데이터 저장이 먼저 이뤄져야 한다)

 

문제1

 

흐름도

db 데이터 저장

프로젝트

 

프로젝트 코드

더보기
GoodsInfoInitForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="DBError.jsp"%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.sql.Statement"%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>상품 정보 조회</title>
</head>

<body>
	<h3>상품코드를 입력하세요</h3>
		<form action="GoodsInfoReader.jsp" method="post">
		상품코드:
		<input type="text" name="code" required="required" /><br />
		<input type="submit" value="확인" />
		</form>
		
		<hr />
		<h4>상품 목록</h4>
		
</body>
</html>
GoodsInfoReader.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="DBError.jsp"%>
<%@ page import="java.sql.Connection,java.sql.PreparedStatement,java.sql.ResultSet" %>
<%@ page import="java.sql.DriverManager" %>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.Statement"%>


<%!
	// 오라클 드라이버 주소, id, pwd, 쿼리문은 바뀔일이 거의 없으니 전역변수로 선언 !
	// 접속주소/ 아이디/ 비밀번호/ 필요한 객체 선언
	String url ="jdbc:oracle:thin:@127.0.0.1:1521:XE";
	String userid = "bjy";
	String userpw = "qorwjddus96";
	
	Connection conn = null;
	PreparedStatement pstmt = null;
	
	String query_pstmt = "select * from goodsinfo where code=?";
%>
<%
	// GoodsInfoReader.jsp : goodsinfo 테이블로부터 code 값을 이용하여 검색
	// 검색 결과값을 GoodsInfoViewer.jsp에게 넘길 것이기에 html 코드 삭제(사용자 화면 없음)
	// 전달 후 자원 해제
	String code = request.getParameter("code");

	try{
		// 1. JDBC 드라이버 로드
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		// 2. DB 연결 객체 생성
		conn = DriverManager.getConnection(url, userid, userpw);
		
	 	/** 목록 출력을 위한  **/
	 	
		// 3. PreparedStatement 객체 생성
		pstmt = conn.prepareStatement(query_pstmt);
		
		// 4. sql 쿼리문 ? 를 바인딩(치환)
		pstmt.setString(1, code);
				
		// 5. SQL 쿼리문 실행 요청
		ResultSet rs = pstmt.executeQuery(); // sql 쿼리문 실행 요청
		
		if(rs.next()){
			String title = rs.getString("title");
			String writer = rs.getString("writer");
			int price = rs.getInt("price");
			
			// 결과 값을 GoodsInfoViewer.jsp 에게 전달하기 위한 코드
			session.setAttribute("CODE", code);
			session.setAttribute("TITLE", title);
			session.setAttribute("WRITER", writer);
			session.setAttribute("PRICE", new Integer(price));
			// setAttribute()는 객체를 값으로 넘겨주기에 price라고 쓰면 int값이 안넘어간다
			// 만약 try 구문에 forward 메서드 실행하면 바로 페이지가 넘어가기에 자원 해제 불가 
		
		}else{
			// 검색 실패했을 경우 (없는 코드 번호)
			System.out.println("없는 코드 번호입니다");
		}
		
	}finally{
		// 6. 자원(리소스) 해제
		try{
			if(pstmt != null){
				pstmt.close();
			}
			if(conn != null){
				conn.close();
			}
		}catch(Exception e){
			// 에러 발생하면 DBError.jsp 로 넘기기에 출력 구문 X
		}
		
		// request로 값 저장했을경우
		//RequestDispatcher rd = request.getRequestDispatcher("GoodsInfoViewer.jsp");
		// rd.forward(request, response);
		response.sendRedirect("GoodsInfoViewer.jsp");
		
	}
%>
GoodsInfoViewer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>상품 정보 출력</title>
</head>

<body>
	<h3>상품 정보</h3>
	코드 : ${CODE }<br />
	제목 : ${TITLE }<br />
	저자 : ${WRITER }<br />
	가격 : <fmt:formatNumber value="${PRICE }" type="currency"></fmt:formatNumber>
	
	<input type="button" value="수정" onclick="document.location.href='GoodsInfoEditForm.jsp'"/>
</body>
</html>
GoodsInfoEditForm.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>
	<h4>상품 정보를 수정한 후 수정 버튼을 누르십시오.</h4>
        <form action="GoodsInfoUpdate.jsp" method="get">
            코드: <input type="text" name="code" size="5" value="${CODE }" readonly="readonly" /> <br />
            제목: <input type="text" name=title size=50 placeholder="${TITLE }"/> <br />
            저자: <input type="text" name=writer size=20 placeholder="${WRITER }"/> <br />
            가격: <input type="text" name=price size=8 placeholder="${PRICE }"/>원 <br />
            <input type="submit" value="수정" />
        </form>
</body>
</html>
GoodsInfoUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="DBError.jsp" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@page import="java.sql.DriverManager"%>

<%! 
  	// 접속주소 / 아이디 / 비밀번호 / 필요한 객체 선언
	String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
	String userid="bjy";
	String userpw="qorwjddus96";
	
	Connection conn=null;
	PreparedStatement pstmt=null;
	
	String query="update goodsinfo set title=?,  writer=?, price=? where code=?";
%>
<%
	// request.setCharacterEncoding("UTF-8");
	String code = request.getParameter("code");
	String title = request.getParameter("title");
	String writer = request.getParameter("writer");
	String price = request.getParameter("price");
	
	System.out.println(code+"<=======code=========");
	System.out.println(title+"<=======title=========");
	System.out.println(writer+"<=======writer=========");
	System.out.println(price+"<=======price=========");
	
	// GoodsInfoReader.jsp : goodsinfo 테이블로부터 code 값을 이용하여 검색
	// 검색된 결과 값을 GoodsInfoViewer.jsp 에게 전달 후, 자원(리소스)를 해제
	try{
		// 1. JDBC 드라이버 로드
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		// 2. 데이터베이스 연결 객체 생성(얻기)
		conn=DriverManager.getConnection(url, userid, userpw);
		
		// 3. PreparedStatement  객체 생성(얻기)
		pstmt=conn.prepareStatement(query);
		
		// 4. ?를 바인딩(치환)
		pstmt.setString(4, code);	
		pstmt.setString(1, title);	
		pstmt.setString(2, writer);	
		pstmt.setInt(3, Integer.parseInt(price));	
				
		// 5. SQL 쿼리문 실행 요청후 결과 처리
		int n=pstmt.executeUpdate();   // SQL 쿼리문 실행 요청
		
		// 요청후 결과
		System.out.print(n+"<================");
	}finally{
		// 6. 자원(리소스) 해제
		try{
			if(pstmt != null){
				pstmt.close();
			}
			if(conn != null){
				conn.close();
			}
		}catch(Exception e){
		}
	}

	response.sendRedirect("GoodsInfoInitForm.jsp");
%>
DBError.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
</head>

<body>
	<h3>예외처리 페이지 : 에러 페이지</h3>
	다음과 같은 에러가 발생하였습니다.<br />
	<%= exception.getMessage() %><br />
	
</body>
</html>
DBTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="DBError.jsp"%>
<%@ page import="java.sql.Connection, java.sql.DriverManager" %>
<%!
	// 클래스의 전역(멤버)변수처럼 선언 할 경우 (특히 메서드 선언은 반드시 필요) -> <%!
	String url ="jdbc:oracle:thin:@127.0.0.1:1521:XE";
	String userid = "bjy";
	String userpw = "qorwjddus96";
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>오라클 접속 테스트 </title>
</head>

<body>
	<h3>데이터베이스 연결 테스트</h3>
	<%
		// 1. 데이터베이스 (JDBC) 드라이버 로드
		Class.forName("oracle.jdbc.driver.OracleDriver");
	
		// 2. 데이터베이스 연결 객체 Connection 생성
		Connection conn = DriverManager.getConnection(url,userid,userpw);
		
		// 3. 데이터베이스 연결 확인
		if(conn != null){
			out.print("bjy로 연결되었습니다.<br />");
			conn.close();
			out.print("bjy로 연결이 해제되었습니다.<br />");
		}else{
			out.print("bjy로 연결할 수 없습니다.<br />");
		}
	%>
</body>
</html>

 

Q) GoodsInfoReader.jsp에서 데이터 정보를 request 객체가 아닌 session에 저장한 이유 ?

흐름을 보면 GoodsInfoReader -> GoodsInfoViewer -> GoodsInfoEditForm.jsp 순서인데 request 내장 객체는 요청 단위

로 유지되기에 새로운 페이지로 이동할 때마다 다시 request 내장 객체에 저장하고 데이터를 꺼내야 하는 번거로움 때문에 session 객체 사용

 

Q) GoodsInfoReader.jsp에서 페이지 이동시 forward()가 아닌 sendRedirect()를 사용한 이유?

공유할 데이터를 session에 저장했기 때문에 sendRedirect() 메서드 사용하여도 데이터를 잃지 않는다 하지만 GoodsInfoReader.jsp에서 데이터를 request.setAttribute() 메서드로 저장하였다면 forward()를 사용해야 한다sendRedirect()는 객체 공유가 안되기에 request.setAttribute()를 사용하여도 다음 페이지에서 데이터를 불러올 수 없다

 


문제 2) 아래와 같은 결과가 나올 수 있도록 프로젝트를 수정하시오

 

수정 프로젝트

 

해당 코드

더보기
Goods.java

package com.bjy.dto;

public class Goods {
	private String code=null;
	private String title=null;
	private String writer=null;
	private int price=0;
	
	public Goods() {
	}
	
	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getTitle() {
		return title;
	}

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

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}


	public void goodsToString() {
		System.out.println("code : " + this.getCode() + "\t" + "title : " + this.getTitle() + "\t" +  "writer : " + this.getWriter() +  "\t" + "price : " + this.getPrice());
	}
}
DBError.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
</head>

<body>
	<h3>예외처리 페이지 : 에러 페이지</h3>
	다음과 같은 에러가 발생하였습니다.<br />
	<%= exception.getMessage() %><br />
	
</body>
</html>
GoodsInfoInitForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8" errorPage="DBError.jsp"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.bjy.dto.Goods" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
	ArrayList<Goods> list = (ArrayList<Goods>)request.getAttribute("GOODS_List");
pageContext.setAttribute("movieList", list);
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>상품 조회 및 목록 화면</title>
</head>
<body>
	<h3>상품 코드를 입력하십시오</h3>
	<form action="GoodsInfoReader.jsp">
		상품코드 : <input type="text" name="searchcode" size="5" maxlength="5" />
		<input type="submit" value="검색" />
	</form>
	<hr />
	<b>상품 목록</b>
	<table border="1">
		<tr>
			<td>번호</td>
			<td>코드</td>
			<td>이름</td>
			<td>저자</td>
			<td>가격</td>
		</tr>
		<c:forEach var="goods" items="${movieList }" varStatus="status"> 
			<tr>
				<td>${status.count }</td>
				<td>${goods.getCode() }</td>
				<td>${goods.getTitle() }</td>
				<td>${goods.getWriter() }</td>
				<td>${goods.getPrice() }</td>
			</tr>
	</c:forEach>
	</table>
</body>
</html>
GoodsInfoReader.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="DBError.jsp"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>

<%@ page import="java.util.ArrayList" %>
<%@ page import="com.bjy.dto.Goods" %>
<%!
	String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
	String id = "bjy";
	String pwd = "qorwjddus96";
	
	String query="";
	String query_where="";
	
	Connection conn = null;
	PreparedStatement pstmt = null;
	Statement stmt = null;
	
	ArrayList<Goods> goodsList = null;
%>
<%

	String searchcode;
	query="select * from goodsinfo";
	query_where=" where code=?";
	try{
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		conn=DriverManager.getConnection(url, id, pwd);
		
		ResultSet rs=null;
		searchcode = request.getParameter("searchcode");
		
		if(searchcode == null){
			System.out.println("// 자바코드영역 "+query);
			stmt=conn.createStatement();
			rs=stmt.executeQuery(query);
		}else{
			System.out.println("=====searchcode.length() > 0=========");
			query=query + query_where;
			System.out.println("========query + query_where=========" + query);
			
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, searchcode);
			rs=pstmt.executeQuery();
						
		}
		
		// 결과 처리 (결과 값을 GoodsInfoViewer.jsp 에게 전달)
		goodsList=new ArrayList<Goods>();
		Goods goods=null;
		System.out.print("///////goodsList.size()///////"+goodsList.size());
		
		while(rs.next()){
			String code=rs.getString("code");
			String title=rs.getString("title");
			String writer=rs.getString("writer");
			int price=rs.getInt("price");
			
			goods=new Goods();
			goods.setCode(code);
			goods.setTitle(title);
			goods.setWriter(writer);
			goods.setPrice(price);
			
			goodsList.add(goods);
		}
		System.out.print("//--------GOODS_List.size()///////"+goodsList.size());
		request.setAttribute("GOODS_List", goodsList);
		
	}finally{
		// 6. 자원(리소스) 해제
		try{
			if(pstmt != null){
				pstmt.close();
			}
			if(conn != null){
				conn.close();
			}
		}catch(Exception e){
		}
	}

	RequestDispatcher rd=request.getRequestDispatcher("GoodsInfoInitForm.jsp");
	rd.forward(request, response);
	// redirect() 안 쓴 이유 : 객체 싣을 수 없기에, 파라미터값만 넘길 수 있으니까  ( 객체 공유 뷸가)
	// RequestDispatcher.forward() => 객체를 전달 할 수 있다
    // 	response.sendRedirect("GoodsInfoViewer.jsp?code=10001") => 파라미터로 전달 
%>
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
</head>

<body>
	<%	response.sendRedirect("GoodsInfoReader.jsp"); %>
</body>
</html>

 

Q) com.bjy.dto 패키지의 Goods.java 파일에 매개변수 생성자가 없는 이유 ?

먼저 dto는 Date Transfer Object로 정보(데이터)를 싣고 다니는 객체를 의미한다. 데이터마다 필수로 입력하지 않아도 되는 데이터가 있을 수 있기에 기본 생성자만 두고 객체 데이터를 다루고 싶다면 getter/setter 메서드 이용한다

 

Q) GoodsInfoReader.jsp에서 페이지 이동시 sendRedirect() 메서드가 아닌 forward() 를 사용한 이유 ?

sendRedirect()로 하게 되면 파라미터값만 넘길 수 있기에 (String만 넘길 수 있고 Object 객체 넘길 수 없음) Goods 객체가 담긴 ArrayList 객체를 넘길 수 없다. 그리고 sendRedirect()메서드는 객체 공유가 안되기에 setAttribute() 메서드로 데이터 저장하여도 다음 페이지에서 불러올 수 없다