Spring

스프링 웹 프로젝트 MVC - 책 상세 화면 만들기 04

록's 2023. 3. 16. 14:51
728x90
반응형

책 상세 화면 만들기

 

 

책 상세 정보를 보여주기 위한 화면을 만든다.

 

 

 

책 상세 쿼리 작성

책 상세 화면을 조회하는 쿼리를 작성한다.

 

매퍼 XML에 쿼리를 옮긴다.

src/main/resources/sqlmap/book_SQL.xml

// book_SQL.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="book">
	<insert id="insert" parameterType="hashMap" useGeneratedKeys="true" keyProperty="book_id">
		<![CDATA[
		insert into book
		(title, category, price)
		values
		(#{title}, #{category}, #{price})
		]]>
	</insert>
	
	<select id="select_detail" parameterType="hashMap" resultType="hashMap">
    <![CDATA[
        select
        title,
        category,
        price,
 		insert_date
        from
        book
        where
        book_id = #{bookId}   
    ]]>
</select>
</mapper>

 

 

 

책 상세 DAO 메소드 작성

src/main/java/sample/spring/codehows/BookDao.java

// BookDao.java

package sample.spring.codehows;

import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class BookDao {
	@Autowired
	SqlSessionTemplate sqlSessionTemplate;	
	
	public int insert(Map<String, Object> map) {
		return this.sqlSessionTemplate.insert("book.insert", map);
	}
	>> 추가
	public Map<String, Object> selectDetail(Map<String, Object> map) {
		return this.sqlSessionTemplate.selectOne("book.select_detail", map);
	}
}

 

sqlSessionTemplate  selectOne 메소드는 데이터를 한 개만 가져올 때

쿼리 결과 행 수가 0개면 selectOne 메소드는 null을 반환

쿼리 결과가 여러 개면 TooManyResultsException 예외 발생

 

 

 

책 상세 서비스 클래스 메소드 생성

src/main/java/sample/spring/codehows/BookServiceImpl.java

package sample.spring.codehows;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl implements BookService {
	 @Autowired
	 BookDao bookDao;

	 @Override
	 public String create (Map<String, Object> map) {
		 int affectRowCount = this.bookDao.insert(map);
		 if(affectRowCount == 1) {
			 return map.get("book_id").toString();
		 }
		 return null;
	 }
	  >>> 추가
	 @Override
	 public Map<String, Object> detail(Map<String, Object> map) {
		 return this.bookDao.selectDetail(map);
	 }
}

detail 쪽 마우스 놔두고 create() 하면 생성

 

 

 

쿼리 스트링

책 상세 화면의 URI는 /detail?bookId=1 형식이다.

주소창을 통해 파라미터가 서버로 전달되는 형태를 쿼리 스트링(Query String)이라고 부른다.
HTTP 규격에서 쿼리 스트링은 URL(Uniform Resource Locator) 끝에 ?로 시작한다. 각 항목은 &로 이어지며, 개별 항목의 키와 값은 =로 구분하게 된다.

 

ex) /sample/test?a=1&b=2 웹 주소가 있다고 해 보면 아래와 같다.

  • URL : /sample/test
  • 쿼리 스트링 : ?a=1&b=2
  • 쿼리 스트링의 시작 : ?
  • 쿼리 스트링의 항목 구분 : &
  • 쿼리 스트링의 항목들 : a=1 ,b=2
  • URI : /sample/test?a=1&b=2

 

책 상세 컨트롤러 메소드 추가

책 상세 URL이 입력되면 실행되는 메소드를 작성

 

// BookController.java

package sample.spring.codehows;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;


... (생략) ...

@RequestMapping(value = "/detail", method = RequestMethod.GET)
    public ModelAndView detail(@RequestParam Map<String, Object> map) {
        Map<String, Object> detailMap = this.bookService.detail(map);

        ModelAndView mav = new ModelAndView();
        mav.addObject("data", detailMap);
        String bookId = map.get("bookId").toString();
        mav.addObject("bookId", bookId);
        mav.setViewName("/book/detail");
        return mav;
	}
}

@RequestParam 어노테이션에 의해 쿼리 스트링 파라미터를 읽을 수 있다.

스프링은 http 메소드를 구분하지 않고 파라미터를 GET, POST 동일한 방법으로 읽을 수 있게 한다.

 

 

 

책 상세 뷰 작성

detail.jsp 뷰 파일을 생성한다.

src/main/webapp/WEB-INF/views/book/detail.jsp

 

// detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
<title>책 상세</title>
</head>
<body>
	<h1>책 상세</h1>
	<p>제목 : ${ data.title } </p>
	<p>카테고리 : ${ data.category } </p>
	<p>가격 : <fmt:formatNumber type="number" maxFractionDigits="3" value="${ data.price }" /></p>
	<p> 입력일 : <fmt:parseDate value="${data.insert_date}" var="dateFmt" pattern="yyyymmdd"/>
   	<fmt:formatDate value="${dateFmt}" pattern="yyyy-MM-dd"/></p>
	
	<p>
		<a href="/update?bookId=${bookID}">수정</a>
	</p>
	<form method="POST" action="/delete">
		<input type="hidden" name="bookId" value="${bookId}" />
		<input type="submit" value="삭제" />
	</form>
	<p>
		<a href="/list">목록으로</a>
	</p>
</body>
</html>

 

 

책 상세 화면 확인하기

서버를 클릭하고 ctrl + alt + d를 눌러 디버깅 모드로 시작하거나 ctrl + alt + s를 눌러 서버 모드로 시작한다.
브라우저에 http://localhost:8080/detail?bookId=1 주소로 접속해서 화면이 나오는지 확인

 

시간을 넣을려고 했으나 오류 문제로 시간을 지움.

(넣는 방법 알게 되면 시간 추가예정)

 

 

 

 

 

 

728x90
반응형