📌 update.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%-- /springmvc1/src/main/webapp/WEB-INF/view/user/update.jsp --%>
<!DOCTYPE html><html><head><meta charset="UTF-8">
<title>사용자 정보 수정</title></head>
<body>
<h2>사용자 정보 수정</h2>
<form:form modelAttribute="user" method="post" action="update">
<spring:hasBindErrors name="user">
<font color="red">
<c:forEach items="${errors.globalErrors}" var="error">
<spring:message code="${error.code}" />
</c:forEach>
</font>
</spring:hasBindErrors>
<table>
<tr><td>아이디</td>
<td><form:input path="userid" readonly="true" />
<font color="red"><form:errors path="userid" /></font></td></tr>
<tr><td>비밀번호</td><td><form:password path="password" />
<font color="red"><form:errors path="password" /></font></td></tr>
<tr><td>이름</td><td><form:input path="username" />
<font color="red"><form:errors path="username" /></font></td></tr>
<tr><td>전화번호</td><td><form:input path="phoneno" />
<font color="red"><form:errors path="phoneno" /></font></td></tr>
<tr><td>우편번호</td><td><form:input path="postcode" />
<font color="red"><form:errors path="postcode" /></font></td></tr>
<tr><td>주소</td><td><form:input path="address" />
<font color="red"><form:errors path="address" /></font></td></tr>
<tr><td>이메일</td><td><form:input path="email" />
<font color="red"><form:errors path="email" /></font></td></tr>
<tr><td>생년월일</td><td><form:input path="birthday" />
<font color="red"><form:errors path="birthday" /></font></td></tr>
<tr><td colspan="2" align="center">
<input type="submit" value="수정">
<input type="reset" value="초기화"></td></tr>
</table></form:form></body></html>
📌 UserController.java 내용 추가
package controller;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import logic.ShopService;
import logic.User;
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private ShopService service;
@GetMapping("*") // * : 그 외 모든 get 방식 요청
public ModelAndView getUser() {
ModelAndView mav = new ModelAndView();
mav.addObject(new User());
return mav;
}
@PostMapping("join")
public ModelAndView join (@Valid User user, BindingResult bresult) {
ModelAndView mav = new ModelAndView();
if(bresult.hasErrors()) { //입력값 오류 발생
mav.getModel().putAll(bresult.getModel());
//전반적인 오류코드 등록
bresult.reject("error.input.user");
return mav;
}
//db에 회원정보 등록
try {
service.userInsert(user);
mav.addObject("user", user);
//DataIntegrityViolationException : 중복키 오류
// 같은 이름의 userid 값이 존재
} catch(DataIntegrityViolationException e) {
e.printStackTrace();
bresult.reject("error.duplicate.user");
mav.getModel().putAll(bresult.getModel());
return mav;
}
mav.setViewName("redirect:login");
return mav;
}
/*
* 로그인 - POST 방식 요청
* 1. 유효성 검증
* User객체에 저장된 파라미터 값을 이용하여 유효성검증
* 2. 입력받은 userid, password로 db에서 해당 정보를 읽기.
* - userid가 없는 경우
* - password가 틀린 경우
* - 정상적인 사용자인 경우 : session에 로그인 정보 등록하기
* session.setAttribute("loginUser", user 객체)
*/
@PostMapping("login")
public ModelAndView login(@Valid User user, BindingResult bresult, HttpSession session) {
ModelAndView mav = new ModelAndView();
//1. 유효성 검증
if(bresult.hasErrors()) {
mav.getModel().putAll(bresult.getModel());
bresult.reject("error.input.login");
return mav;
}
//2. 입력받은 userid, password로 db에서 해당 정보를 읽기.
try {
User dbUser = service.getUser(user.getUserid());
if(user.getPassword().equals(dbUser.getPassword())) { //정상적인 사용자 인 경우
session.setAttribute("loginUser", dbUser);
} else {
bresult.reject("error.login.password");
mav.getModel().putAll(bresult.getModel());
return mav;
}
//EmptyResultDataAccessException : 해당 레코드 없음
} catch(EmptyResultDataAccessException e) { //id가 없는 경우 예외처리
bresult.reject("error.login.id");
mav.getModel().putAll(bresult.getModel());
return mav;
}
mav.setViewName("redirect:mypage?id=" + user.getUserid());
return mav;
}
//http://localhost:8088/springmvc1/user/logout
@RequestMapping("logout") //핵심 메서드 : 기본 실행 메서드 (진짜 수행에 기본이 되는)
public String loginCheckLogout(HttpSession session) {
session.invalidate();
return "redirect:login";
}
/*
* AOP 설정하기 : UserLoginAspect 클래스의 userIdCheck 메서드로 구현하기.
* 1. pointcut : UserController 클래스의 idCheck로 시작하는 메서드이고,
* 마지막 매개변수의 id,session인 경우
* 2. 로그인 여부 검증
* - 로그인이 안된경우 로그인 후 거래하세요. 메세지 출력. login페이지 호출
* 3. admin이 아니면서, 로그인 아이디와 id값이 다른 경우
* 본인만 거래 가능합니다. 메세지 출력. item/list 페이지 호출
*/
@RequestMapping("mypage")
public ModelAndView idCheckMypage(String id, HttpSession session) {
ModelAndView mav = new ModelAndView();
//회원 정보를 조회하여 user 이름으로 뷰 전달
User user = service.getUser(id);
// List<Sale> salelist = service.salelist(id);
mav.addObject("user", user);
// mav.addObject("salelist", salelist);
return mav;
}
**@GetMapping("update")
public ModelAndView idCheckUser(String id, HttpSession session) {
ModelAndView mav = new ModelAndView();
//회원 정보를 조회하여 user 이름으로 뷰 전달
User user = service.getUser(id);
mav.addObject("user", user);
return mav;
}
@PostMapping("update")
public ModelAndView idcheckUpdate (@Valid User user, BindingResult bresult, HttpSession session) {
ModelAndView mav = new ModelAndView();
if(bresult.hasErrors()) {
mav.getModel().putAll(bresult.getModel());
bresult.reject("error.update.user");
return mav;
}
//비밀번호 검증 : 로그인된 정보의 비밀번호로 검증.
User loginUser = (User)session.getAttribute("loginUser");
if(!loginUser.getPassword().equals(user.getPassword())) {
mav.getModel().putAll(bresult.getModel());
bresult.reject("error.login.password");
return mav;
}
//비밀번호 일치인 경우 : DB에 내용을 수정
try {
service.userUpdate(user);
//session에 로그인 정보 수정
session.setAttribute("loginUser", user);
mav.setViewName("redirect:mypage?id=" + user.getUserid());
} catch (Exception e) {
e.printStackTrace();
throw new LoginException("고객 정보 수정 실패","update?id=" + user.getUserid());
}
return mav;
}**
}
📌 massage.properties 내용 추가
## src/main/resources/messages.txt => src/main/resources/messages.properties 변경
error.login.password=비밀번호를 확인하세요.
error.input.user=회원가입 입력항목을 확인하세요
**error.update.user=회원수정 입력항목을 확인하세요**
error.input.login=로그인 입력항목을 확인하세요
typeMismatch.birthday=생년월일은 YYYY-MM-DD 형식으로 입력해 주세요
error.duplicate.user=중복된 아이디 입니다.
error.login.password=비밀번호 오류 입니다.
error.login.id=아이디가 존재하지 않습니다.
error.userid.search=아이디를 찾을 수 없습니다.
error.password.search=비밀번호를 찾을 수 없습니다.
error.required.userid=아이디를 입력하세요
error.required.email=EMAIL을 입력하세요
error.required.phoneno=전화번호를 입력하세요
## src/main/resources/messages.txt => src/main/resources/messages.properties \\uBCC0\\uACBD
error.login.password=\\uBE44\\uBC00\\uBC88\\uD638\\uB97C \\uD655\\uC778\\uD558\\uC138\\uC694.
error.input.user=\\uD68C\\uC6D0\\uAC00\\uC785 \\uC785\\uB825\\uD56D\\uBAA9\\uC744 \\uD655\\uC778\\uD558\\uC138\\uC694
**error.update.user=\\uD68C\\uC6D0\\uC218\\uC815 \\uC785\\uB825\\uD56D\\uBAA9\\uC744 \\uD655\\uC778\\uD558\\uC138\\uC694**
error.input.login=\\uB85C\\uADF8\\uC778 \\uC785\\uB825\\uD56D\\uBAA9\\uC744 \\uD655\\uC778\\uD558\\uC138\\uC694
typeMismatch.birthday=\\uC0DD\\uB144\\uC6D4\\uC77C\\uC740 YYYY-MM-DD \\uD615\\uC2DD\\uC73C\\uB85C \\uC785\\uB825\\uD574 \\uC8FC\\uC138\\uC694
error.duplicate.user=\\uC911\\uBCF5\\uB41C \\uC544\\uC774\\uB514 \\uC785\\uB2C8\\uB2E4.
error.login.password=\\uBE44\\uBC00\\uBC88\\uD638 \\uC624\\uB958 \\uC785\\uB2C8\\uB2E4.
error.login.id=\\uC544\\uC774\\uB514\\uAC00 \\uC874\\uC7AC\\uD558\\uC9C0 \\uC54A\\uC2B5\\uB2C8\\uB2E4.
error.userid.search=\\uC544\\uC774\\uB514\\uB97C \\uCC3E\\uC744 \\uC218 \\uC5C6\\uC2B5\\uB2C8\\uB2E4.
error.password.search=\\uBE44\\uBC00\\uBC88\\uD638\\uB97C \\uCC3E\\uC744 \\uC218 \\uC5C6\\uC2B5\\uB2C8\\uB2E4.
error.required.userid=\\uC544\\uC774\\uB514\\uB97C \\uC785\\uB825\\uD558\\uC138\\uC694
error.required.email=EMAIL\\uC744 \\uC785\\uB825\\uD558\\uC138\\uC694
error.required.phoneno=\\uC804\\uD654\\uBC88\\uD638\\uB97C \\uC785\\uB825\\uD558\\uC138\\uC694
📌 ShopService.java 내용 추가
package logic;
import java.io.File;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import dao.ItemDao;
import dao.UserDao;
/*
* @Component : 해당 클래스를 객체화
* - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
*/
@Service //@Component + Service 기능
public class ShopService {
@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
private ItemDao itemDao;
@Autowired
private UserDao userDao;
public List<Item> itemList() {
return itemDao.list();
}
public Item getItem(Integer id) {
return itemDao.getItem(id);
}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용
public void itemCreate(@Valid Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
}
//maxid : item테이블 중 최대 id 값
int maxid = itemDao.maxId();
item.setId(maxid+1);
itemDao.insert(item);
}
private void uploadFileCreate(MultipartFile file, String uploadPath) {
//uploadPath : 파일이 업로드 되는 폴더
String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
File fpath = new File(uploadPath);
if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
try {
//파일의 내용 => uploadPath + orgFile 로 파일 저장
file.transferTo(new File(uploadPath + orgFile)); //파일업로드
} catch(Exception e) {
e.printStackTrace();
}
}
public void itemUpdate(Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
}
itemDao.update(item);
}
public void itemDelete(Integer id) {
itemDao.delete(id);
}
public void userInsert(@Valid User user) {
userDao.insert(user);
}
public User getUser(String userid) {
return userDao.selectOne(userid);
}
**public void userUpdate(@Valid User user) {
userDao.update(user);
}**
}
📌 UserDao.java 내용 추가
package dao;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;
import logic.User;
@Repository
public class UserDao {
private NamedParameterJdbcTemplate template;
private Map<String, Object> param = new HashMap<>();
private RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
@Autowired
public void setDataSource(DataSource dataSource) {
template = new NamedParameterJdbcTemplate(dataSource);
}
public void insert(@Valid User user) {
SqlParameterSource param = new BeanPropertySqlParameterSource(user);
String sql = "insert into useraccount"
+ " (userid, password, username, phoneno, postcode,"
+ "address, email, birthday)"
+ " values(:userid, :password, :username, :phoneno, :postcode,"
+ " :address, :email, :birthday)";
template.update(sql, param);
}
public User selectOne(String userid) {
param.clear();
param.put("userid", userid);
//EmptyResultDataAccessException : 해당 레코드 없을 때 예외 발생
return template.queryForObject("select * from useraccount where userid=:userid", param, mapper);
}
**public void update(User user) {
SqlParameterSource param = new BeanPropertySqlParameterSource(user);
String sql = "update useraccount set username=:username, "
+ " birthday=:birthday, phoneno=:phoneno, postcode=:postcode,"
+ "address=:address, email=:email where userid=:userid";
template.update(sql, param);
}**
}
'수업(국비지원) > Spring' 카테고리의 다른 글
| [Spring] (MVC 2) 아이디-비밀번호 찾기(idsearch, pwsearch, search) (0) | 2023.04.21 |
|---|---|
| [Spring] (MVC 2) 회원 탈퇴(delete), 비밀번호 수정(password) (0) | 2023.04.21 |
| [Spring] (MVC 2) 마이페이지 생성(mypage, UserLoginAspect, UserController, kiclayout) (0) | 2023.04.21 |
| [Spring] (MVC 2) 상품 주문하기(checkout, CartController, UserLoginAspect, CartAspect) (0) | 2023.04.21 |
| [Spring] (MVC 2) AOP설정 - 로그인,로그아웃 알림 (0) | 2023.04.21 |