-
학원 day46. JSP실습기록 2022. 11. 9. 23:50
< 요청파라미터 값 보내고 조회하기 실습 >
< 상품을 데이터베이스에 등록하고 상품리스트 페이지로 돌아가는 기능 구현하기 실습 >
- 정보를 조회하는 요청을 할 경우 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에 정의된 도서정보 조회하는 메소드를 실행해서 책정보를 조회한다. 조회된 책정보를 표현한다.
'기록' 카테고리의 다른 글
학원 day48. 게시판 만들기 실습, 페이지 네비게이션 (0) 2022.11.12 학원 day47. 웹 실습, 페이징처리 (0) 2022.11.11 학원 day45. JSP(2) 구성요소, 내장객체, 요청파라미터값 전달방식 (0) 2022.11.08 학원 day44(2). Tomcat, JSP (0) 2022.11.07 학원 day44. 네트워크 (0) 2022.11.07