스프링 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

+ Recent posts