ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day46. JSP실습
    기록 2022. 11. 9. 23:50

    < 요청파라미터 값 보내고 조회하기 실습 >

    요청파라미터의 name은 같게 해줘야 하지만 변수의 이름이 같을 필요는 없다.


    < 상품을 데이터베이스에 등록하고 상품리스트 페이지로 돌아가는 기능 구현하기 실습 >

     

    - 정보를 조회하는 요청을 할 경우 HTML컨텐츠를 응답으로 받는다.

    - 정보를 추가/변경/삭제하는 요청을 할 경우 응답으로 전달할 정보가 없다. 대신 정보를 조회할 수 있는 요청 URL을 응답으로 보낸다. 그러면 톰캣은 다시 요청메시지를 분석해서 브라우저에 조회화면을 내려보낸다. 

    - 브라우저가 재요청할 URL을 응답으로 보내는 코드 : response.sendRedirect("list.jsp");

    - 재요청할 URL을 응답으로 보낼 때 응답코드가 302임을 검사창(F12)에서 확인할 수 있다. (응답코드에 대해서는 다음에 배울 예정)

    - 로그인하면 다시 홈페이지화면이 나오는 것도 이와 같은 방식이다.

    - 코드 작성 패턴 : JSP에서 요청파라미터값을 조회하는 자바코드를 작성하고, XML에 쿼리를 정의하고, DAO에서 쿼리 실행하는 메소드를 구현하고, JSP에서 실행한다.

     

    < register.jsp >

    <%@page import="com.sample.dao.ProductDao"%>
    <%@page import="com.sample.vo.Product"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	//form.jsp의 입력폼에서 register.jsp로 제출한 요청파라미터값 조회하기
    	String name = request.getParameter("name");
    	String maker = request.getParameter("maker");
    	int price = Integer.parseInt(request.getParameter("price"));
    	double discountRate = Double.parseDouble(request.getParameter("discountRate"));
    	int stock = Integer.parseInt(request.getParameter("stock"));
    	
    	// Product 객체를 생성해서 전달받은 상품정보를 객체에 담는다.
    	Product product = new Product();
    	product.setName(name);
    	product.setMaker(maker);
    	product.setPrice(price);
    	product.setDiscountRate(discountRate);
    	product.setStock(stock);
    	
    	// ProductDao 객체를 생성하고, 상품정보를 테이블에 저장하는 메소드를 실행시킨다.
    	ProductDao productDao = new ProductDao();
    	productDao.insertProduct(product);
    	
    	// 브라우저에게 재요청할 URL을 응답으로 보낸다.
    	response.sendRedirect("list.jsp");
    %>

    < products.xml >

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 
    	"http://ibatis.apache.org/dtd/sql-map-2.dtd">
     
    <sqlMap>
    
    	<!-- 
    		상품번호로 상품정보 하나를 조회하는 쿼리
    			SQL 실행에 필요한 값 : 상품번호 (int)
    			SQL 실행 후 획득되는 값 : 상품정보 한 행 (Product)
    			
    			public Product getProductByNo(int productNo) { 
    				return (Product) SqlMapper.selectOne("getProductByNo", productNo);
    			}
    			* SqlMapper.selectOne() 메소드는 resultClass 속성에 지정된 객체를 생성해서 조회결과를 저장하고, 그 객체를 반환한다.
    			* SqlMapper.selectOne() 메소드는 조회결과가 오직 한 행만 조회될 때 사용하는 메소드다.
    			    - 조회조건의 값의 기본키 컬럼의 값, 고유키 컬럼의 값일 때만 조회결과가 한 행만 조회된다.
    	 -->
    	<select id="getProductByNo" parameterClass="int" resultClass="com.sample.vo.Product">
    		select
    			product_no              as no,
    			product_name            as name, 
    			product_maker           as maker,
    			product_price           as price,
    			product_discount_rate   as discountRate,
    			product_stock           as stock,
    			product_on_Sell         as onSell,
    			product_created_date    as createdDate,
    			product_updated_date    as updatedDate
    		from
    			sample_products
    		where
    			product_no = #value#	
    	</select>
    	
    	<!-- 
    		모든 상품정보를 조회하는 쿼리
    			SQL 실행에 필요한 값 : 없음
    			SQL 실행 후 획득되는 값 : 상품정보 여러 행 (List<Product>)
    			
    			public List<Product> getAllProducts() { 
    				return (List<Product>) SqlMapper.selectList("getAllProducts");
    			}
    			* SqlMapper.selectList() 메소드는 List객체를 생성해서 반환한다.
    			* 조회된 모든 행에 대해서 아래의 작업을 반복 수행한다. 
    			    resultClass 속성에 지정된 객체를 생성해서 조회결과를 한 행씩 저장하고, 그 객체를 List객체에 저장한다.
    			* SqlMapper.selectList() 메소드는 조회결과가 여러 행 조회될 때 사용하는 메소드다.
    			    - 조회조건의 값의 기본키 컬럼의 값, 고유키 컬럼의 값이 아닐 때는 조회결과가 여러 행이다.
    	 -->
    	<select id="getAllProducts" resultClass="com.sample.vo.Product">
    		select 
    			product_no              as no,
    			product_name            as name, 
    			product_maker           as maker,
    			product_price           as price,
    			product_discount_rate   as discountRate,
    			product_stock           as stock,
    			product_on_Sell         as onSell,
    			product_created_date    as createdDate,
    			product_updated_date    as updatedDate
    		from
    			sample_products
    		order by 
    			product_no desc		
    	</select>
    	
    	<!-- 
    		새 상품정보를 저장하는 쿼리
    			SQL 실행에 필요한 값 : 상품정보(Product)
    			
    				public void insertProduct(Product product) {
    					SqlMapper.insert("insertProduct", product);
    				}
    			* SqlMapper.insert() 메소드는 INSERT문을 실행한다.
    			* SqlMapper.insert() 메소드는 반환값이 없다.
    	 -->
    	<insert id="insertProduct" parameterClass="com.sample.vo.Product">
    		insert into sample_products
    			(product_no, product_name, product_maker, product_price, product_discount_rate, product_stock)
    		values
    			(sample_products_seq.nextval, #name#, #maker#, #price#, #discountRate#, #stock#)
    	</insert>
    </sqlMap>

    < ProductDao.java >

    package com.sample.dao;
    
    import java.util.List;
    
    import com.sample.util.SqlMapper;
    import com.sample.vo.Product;
    
    public class ProductDao {
    	
    	public Product getProductByNo(int productNo) {
    		return (Product) SqlMapper.selectOne("getProductByNo", productNo); //selectOne은 Object로 반환하기 때문에 형변환 필요!
    	}
    
    	@SuppressWarnings("unchecked")
    	public List<Product> getAllProducts() {		
    		return (List<Product>) SqlMapper.selectList("getAllProducts");
    	}
    	
    	public void insertProduct(Product product) {
    		SqlMapper.insert("insertProduct", product);
    	}
    }

    상품리스트 조회하기

    < list.jsp >

    <%@page import="com.sample.vo.Product"%>
    <%@page import="java.util.List"%>
    <%@page import="com.sample.dao.ProductDao"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
    <title>상품 리스트</title>
    </head>
    <body>
       <div class="container py-5">
          <h1>상품 리스트</h1>
          
          <p>상품 리스트를 확인하세요 <a href="form.jsp" class="btn btn-primary btn-sm float-end">상품 등록</a></p>
          <%
          	// 데이터베이스 엑세스 기능이 구현된 ProductDao객체를 생성한다.
          	ProductDao productDao = new ProductDao();
          	// 모든 상품정보를 제공하는 메소드를 실행해서 상품 목록을 획득한다.
          	List<Product> productList = productDao.getAllProducts();
          %>
          <table class="table">
             <thead>
                <tr>
                   <th>번호</th>
                   <th>제품명</th>
                   <th>제조사</th>
                   <th>가격</th>
                   <th>할인가격 (할인율)</th>
                   <th>판매여부</th>
                </tr>
             </thead>
             <tbody>
             <%
             	// 조회된 상품정보로 HTML 태그를 생성한다.
             	for (Product product : productList) {
             %>
                <tr>
                   <td><%=product.getNo() %></td>
                   <td><a href="detail.jsp?proNo=<%=product.getNo()%>"><%=product.getName() %></a></td>
                   <td><%=product.getMaker() %></td>
                   <td><%=product.getPrice() %> 원</td>
                   <td><strong class="text-danger"><%=product.getPrice() %> 원</strong> <strong><%=product.getDiscountRate() %></strong></td>
                   <td><%=product.getOnSell() %></td>
                </tr>
             <% 
             	}
             %>
             </tbody>
          </table>
       </div>
    </body>
    </html>

     

    상품 상세정보 조회하기

    < detail.jsp >

    <%@page import="com.sample.vo.Product"%>
    <%@page import="com.sample.dao.ProductDao"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
    <title>상품 상세정보</title>
    </head>
    <body>
       <div class="container my-5">
          <h1>상품 상세정보</h1>
          
       <%
          // locahost/web-sample/product/detail.jsp?proNo=상품번호 
          // 위의 요청으로 요청객체에 전달된 요청파라미터값 조회하기
          int productNo = Integer.parseInt(request.getParameter("proNo"));
       
       	  // ProductDao 객체를 생성하고, 상품번호를 전달받아서 상품상세정보를 반환하는 메소드를 실행한다.
       	  ProductDao productDao = new ProductDao();
       	  Product product = productDao.getProductByNo(productNo);
       %>
          <p><strong class="text-danger"><%=productNo %></strong>번 상품의 상세정보를 확인하세요.</p>
          
          <table class="table table-bordered">
             <colgroup>
                <col style="width: 15%;">
                <col style="width: 35%;">
                <col style="width: 15%;">
                <col style="width: 35%;">
             </colgroup>
             <tbody>
                <tr>
                   <th>상품 번호</th>
                   <td><%=product.getNo() %></td>
                   <th>등록일자</th>
                   <td><%=product.getCreatedDate() %></td>
                </tr>
                <tr>
                   <th>상품명</th>
                   <td><%=product.getName() %></td>
                   <th>제조회사</th>
                   <td><%=product.getMaker() %></td>
                </tr>
                <tr>
                   <th>가격</th>
                   <td><%=product.getPrice() %> 원</td>
                   <th>할인가격</th>
                   <td><%=product.getPrice() %> 원</td>
                </tr>
                <tr>
                   <th>재고수량</th>
                   <td><%=product.getStock() %></td>
                   <th>판매여부</th>
                   <td><%=product.getOnSell() %></td>
                </tr>
             </tbody>
          </table>
          <div class="text-end">
             <a href="list.jsp" class="btn btn-outline-primary">목록</a>
          </div>
       </div>
    </body>
    </html>

    링크를 동적으로 생성하기


    < 실습2 > 

    1. 도서 목록 표시하기
       - books.xml에 모든 책정보를 조회하는 SQL을 정의한다.
       - BookDao.java에 위에서 정의한 SQL 구문을 실행하는 메소드를 정의한다.
       - book/list.jsp에서 BookDao에 정의된 메소드를 실행해서 모든 책정보를 조회한다.
       - 조회된 책정보를 html 컨텐츠를 생성한다.
    
    2. 신규 도서 등록하기
       - books.xml에 신규 도서정보를 저장하는 SQL을 정의한다.
       - BookDao.java에 위에서 정의한 SQL 구문을 실행하는 메소드를 정의한다.
       - book/register.jsp
          book/form.jsp에서 book/register.jsp로 제출한 폼 입력값을 조회한다.
          Book객체를 생성해서 도서정보를 저장한다.
          BookDao.java에 정의된 신규 도서 저장하는 메소드를 실행해서 책정보를 저장시킨다.
          list.jsp를 재요청하는 URL을 응답으로 보낸다.
    
    3. 도서 상세 정보 표시하기
       - book.xml에 책번호를 전달받아서 도서 정보를 조회하는 SQL을 정의한다.
       - BookDao.java에 위에서 정의한 SQL 구문을 실행하는 메소드를 정의한다.
       - book/list.jsp에서 책제목에 링크를 추가한다.
          * 링크를 클릭하면 책번호가 detail.jsp로 전달되도록 쿼리스트링을 URL뒤에 붙인다.
       - book/detail.jsp
          book/list.jsp에서 book/detail.jsp로 전달한 책번호를 조회한다.
          BookDao.java에 정의된 도서정보 조회하는 메소드를 실행해서 책정보를 조회한다.
          조회된 책정보를 표현한다.

     

    댓글

Designed by Tistory.