Spring Boot(JSP,Mybatis)

상품 수정

작성자
vita
작성일
2023-11-19 23:18
조회
81

상품 수정

상품 수정의 전반적인 흐름은 아래와 같습니다.





 

1. detail.jsp에서 [수정] 버튼을 누르면 http://localhost/update 주소를 요청하고 ProductController의 update() method가 호출됩니다.

2. Controller에서 받은 입력값을 DAO에 보냅니다.

3. DAO는 mapper에 자료를 전달하여 테이블의 레코드가 수정됩니다.

4. Controller에서 다시 http://localhost/list 로 이동하여 상품목록 화면에 반영됩니다.

 

 

1. detail.jsp

빨간색으로 표시된 부분을 작성하시기 바랍니다.

 


<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

[생략]

<title>Insert title here</title>

<script>

function product_update(){

   document.form1.action="/update";

   document.form1.submit();

}

</script>

</head>

<body>

<h2>상품 정보 편집</h2>

<form name="form1" method="post" enctype="multipart/form-data">

<table>

[생략]

   <tr>

       <td>상품이미지</td>

       <td>

[생략]

       </td>

   </tr>

   <tr>

       <td colspan="2" align="center">

           <input type="hidden" name="product_code" value="${product.product_code}">

           <input type="button" value="수정" onclick="product_update()">

           <input type="button" value="목록" onclick="location.href='/'">

       </td>

   </tr>

</table>

</form>

</body>

</html>


 

[해설]

 


<input type="button" value="수정" onclick="product_update()">


 

[수정] 버튼을 클릭하면 Javascript 함수 product_udpate()가 실행됩니다.




<script>

function product_update(){

}

</script>


 

[수정] 버튼을 누를 때 실행할 Javascript 함수를 추가합니다.

Javascript는 <script>~</script> 영역에 작성합니다.

 

Javascript의 함수 형식은 아래와 같습니다.

 

function 함수이름(){

}




   document.form1.action="/update";


 

document는 현재 웹문서를 가리키는 Javascript 객체입니다.

document.form1 은 현재 문서에서 name이 form1인 태그를 의미합니다.

name이 form1인 폼에 입력한 내용을 받을 주소를 http://localhost/update 로 지정하는 것입니다.




   document.form1.submit();


 

name이 form1인 태그에 입력한 내용을 서버로 보냅니다.




<input type="hidden" name="product_code" value="${product.product_code}">


 

어떤 레코드를 수정할 것인지 primary key인 상품코드를 보내야 합니다.  이렇게 화면에 굳이 표시할 필요가 없을 수 있으나 값을 보내야 하는 경우에는 hidden 태그를 사용합니다.

 

 

2. ProductDAO.java

update() method를 작성합니다.

 


package com.example.product;

@Repository

public class ProductDAO {

[생략]

   public Map<String, Object> detail(String product_code) {

[생략]

   }

   public void update(Map<String, Object> map) {

       sqlSession.update("product.update", map);

   }

}


 

[해설]

 


   public void update(Map<String, Object> map) {

       sqlSession.update("product.update", map);

   }


 

Controller에서 전달한 값이 map에 저장됩니다.

id가 update 태그에 저장된 sql 명령어가 실행됩니다.

 

 

3. product.xml

id가 update인 태그를 작성합니다.

 


<?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="product">

[생략]

   

   <select id="detail" resultType="java.util.Map">

       select * from product

       where product_code=#{product_code}

   </select>

   

   <update id="update">

       update product

       set product_name=#{product_name},

           price=#{price},

           description=#{description},

           filename=#{filename}

       where product_code=#{product_code}

   </update>

   

</mapper>


 

[해설]

 

map에 전달된 값들이 #{변수}에 매핑되어 레코드가 수정됩니다.

 


   <update id="update">

       update product

       set product_name=#{product_name},

           price=#{price},

           description=#{description},

           filename=#{filename}

       where product_code=#{product_code}

   </update>





4. ProductController.java

update() method를 작성합니다.

 


package com.example.product;

@Controller

public class ProductController {

[생략]

   @RequestMapping("/detail/{product_code}")

   public ModelAndView detail(@PathVariable String product_code, ModelAndView mav) {

[생략]

   }

   @RequestMapping("/update")

   public String update(@RequestParam Map<String, Object> map, @RequestParam MultipartFile img,

           HttpServletRequest request) {

       String filename = "-";

       if (img != null && !img.isEmpty()) {

           filename = img.getOriginalFilename();

           try {

               ServletContext application = request.getSession().getServletContext();

               String path = application.getRealPath("/resources/images/");

               img.transferTo(new File(path + filename));

           } catch (Exception e) {

               e.printStackTrace();

           }

       } else {

           String product_code = map.get("product_code").toString();

           Map<String, Object> product = productDao.detail(product_code);

           filename = product.get("filename").toString();

       }

       map.put("filename", filename);

       productDao.update(map);

       return "redirect:/list";

   }

}


 

[해설]

 


   @RequestMapping("/update")

   public String update(@RequestParam Map<String, Object> map, @RequestParam MultipartFile img, HttpServletRequest request) {


 

write() method와 비슷한 형식입니다.

첨부파일을 제외한 값들은 Map에 저장되고 첨부파일은 MultipartFile에 저장됩니다.




  if (img != null && !img.isEmpty()) {

 

  } else {

 

  }


 

새로운 첨부파일이 있는지에 따라 처리하는 로직입니다.




String product_code = map.get("product_code").toString();

Map<String, Object> product = productDao.detail(product_code);

filename = product.get("filename").toString();

map.put("filename", filename);


 

새로운 첨부파일이 없는 경우에는 map에 저장된 상품코드를 조회하여 상품코드에 해당하는 레코드를 가져와서 파일이름을 저장합니다.




       productDao.update(map);


 

레코드를 수정합니다.




       return "redirect:/list";


 

수정 완료 후 상품리스트로 이동합니다.

 

 

5. 상품 수정 실행 결과 확인

상품 상세 화면에서 [수정] 버튼을 누르면 상품 정보가 변경됩니다.




Scroll to Top