스프링 MVC1 : 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델
1. 요청 매핑 애노테이션을 이용한 경로 매핑
@Controller
public class RegisterController {
@RequestMapping("register/step1")
public String handleStep1() {
return "register/step1";
}
@RequestMapping("register/step2")
public String handleStep2() {
return "register/step2";
}
해당 코드를
@Controller
@RequestMapping("/register") 각 메서드에 공통되는 경로
public class RegisterController {
@RequestMapping("/step1") 공통 경로를 제외한 나머지 경로
public String handleStep1() {
return "register/step1";
}
@RequestMapping("/step2")
public String handleStep2() {
return "register/step2";
}
둘 다 처리하는 경로는 똑같음
2. GET과 POST 구분: @GetMapping, @PostMapping
해당 코드처럼 작성하면 같은 경로에 대해 GET과 POST방식을 각각 다른 메서드가 처리하도록 설정 가능
@GetMapping("/register/step2")
public String handleStep2Get() {
return "redirect:/register/step1";
}
@PostMapping("/register/step2")
public String handleStep2(Model model,
@RequestParam(defaultValue = "false") Boolean agree) {
System.out.println(agree);
if(!agree) {
return "/register/step1";
}
model.addAttribute("registerRequest", new RegisterRequest());
return "register/step2";
}
스프링 4.3 이전 버전까지는 밑에 처럼 @RequestMapping 애노테이션의 method 속성을 사용해서 HTTP 방식 제한
@RequestMapping(value = "/register/step1", method = RequestMethod.GET)
public String handleStep1() {
return "/register/step1";
}
@RequestMapping(value = "/register/step1", method = RequestMethod.POST)
public String handleStep1() {
return "/register/step2";
}
3. 요청 파라미터 접근
밑에 코드에서 value ( 타입 String ) : HTTP 요청 파라미터의 이름을 지정
defaultValue ( 타입 String ) : 요청 파라미터가 값이 없을 때 사용할 문자열 값을 지정, 기본값은 없음
@PostMapping("/register/step2")
public String handleStep2(
@RequestParam(value = "agree" defaultValue = "false") Boolean agree) {
if(!agree) {
return "/register/step1"; false면 기존 페이지 유지
}
return "register/step2"; true면 step2로 이동
}
JSP
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<h2>약관</h2>
<p>약관 내용</p>
<form action="step2" method="post">
<label>
<input type="checkbox" name="agree" value="true"> 약관 동의
</label>
<input type="submit" value="다음 단계" />
</form>
</body>
</html>
4. 리다이렉트 처리
밑에 코드 처럼 /register/step2 해당 경로 url에 입력 시 /register/step1 경로로 이동됨 예 ) 게시물 작성 후 다시 게시물 목록 페이지로 이동하고 싶을 때 사용하면 좋을 꺼 같다.
@GetMapping("/register/step2")
public String handleStep2Get() {
return "redirect:/register/step1";
}
5. 커맨드 객체를 이용해서 요청 파라미터 사용하기
form 전송 요청을 처리하는 컨트롤러 코드는 각 파라미터 값을 구하기 위해 밑에 이미지 처럼 처리할 순 있지만
요청 파라미터 개수가 증가할 때마다 코드 길이도 길어지는 단점이 있다.
스프링은 이런 불편함을 줄이기 위해 요청 파라미터의 값을 커맨드 객체에 담아주는 기능을 제공한다.
요청 파라미터의 값을 전달받을 수 있는 세터 메서드를 포함하는 객체를 커맨드 객체로 사용하면 된다.
밑에 코드처럼 작성하면 위에 처럼 작성을 안해줘도 된다.
@Controller
public class RegisterController {
private MemberRegisterService memberRegisterService;
public void setMemberRegisterService(MemberRegisterService memberRegisterService) {
this.memberRegisterService = memberRegisterService;
}
@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq) {
try {
memberRegisterService.regist(regReq);
return "register/step3";
}catch(DuplicateMemberException ex) {
return "register/step2";
}
}
Config에서 의존 주입도 해야된다.
@Configuration
public class ControllerConfig {
@Autowired
private MemberRegisterService memberRegisterService;
@Bean
public RegisterController registerController() {
RegisterController controller = new RegisterController();
controller.setMemberRegisterService(memberRegisterService);
return controller;
}
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입</title>
</head>
<body>
<h2>회원 정보 입력</h2> <!-- 커맨드객체 -->
<form:form action="step3" modelAttribute="registerRequest">
<p>
<label>이메일:<br/> <!-- 이미 있는 이메일이면 다시 폼을 보여줄 때 기존에 입력한 이메일, 이름이 폼에 채워짐 -->
<form:input path="email"/>
</label>
</p>
<p>
<label>이름:<br/>
<form:input path="name"/>
</label>
</p>
<p>
<label>비밀번호:<br/>
<form:password path="password"/>
</label>
<p>
<label>비밀번호 확인:<br/>
<form:password path="confirmPassword"/>
</label>
</p>
<input type="submit" value="가입 완료">
</form:form>
</body>
</html>
회원가입 완료 jsp에서 ${registerRequest.name}님 해당 코드로 누구 이름으로 회원가입 했는지 확인 가능하다.
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<p><strong>${registerRequest.name}님</strong>
회원 가입을 완료했습니다.</p>
<p><a href="<c:url value='/main'/>">[첫 화면 이동]</a></p>
</body>
</html>
<p><a href="<c:url value='/main'/>">[첫 화면 이동]</a></p> 해당 코드는 밑에 이미지 처럼 오버라이드하면 해당 프로젝트 실행 시 맨 처음 실행된다.
'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글
2023-08-24 68일차 (0) | 2023.08.24 |
---|---|
2023-08-23 67일차 (0) | 2023.08.23 |
2023-08-21 65일차 (0) | 2023.08.21 |
2023-08-18 64일차 (0) | 2023.08.20 |
2023-08-17 63일차 (0) | 2023.08.17 |