상품 수정
상품 수정
상품 수정의 전반적인 흐름은 아래와 같습니다.
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. 상품 수정 실행 결과 확인
상품 상세 화면에서 [수정] 버튼을 누르면 상품 정보가 변경됩니다.