프로필사진
컨트롤러 구현(1) - 핵심 어노테이션(@Controller, @RequestMapping, @RequestParam, @ModelAttribute)

2019. 11. 14. 23:14🔴 Spring

300x250

- @Controller : Controller 클래스 정의

문법 1 : 요청 URL만 선언 - @RequestMapping(/"요청한 URL")

문법 2 : 요청 방식 지정 - @RequestMapping(value="/요청한 URL", method=RequestMethod.POST)

view 지정 방법 (메소드 반환 값에 따른 view page 지정)

방법 1 : ModelAndView - setViewName()메소드 파라미터로 설정

방법 2 : String - 메소드의 리턴값


- @RequestMapping : HTTP요청 URL를 처리할 Controller 메소드 정의

동일한 URL로 GET/POST방식 모두 처리하기

<MemberLoginController.java>

package com.bitcamp.mvc.member;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


@Controller
@RequestMapping("/member/memberLogin") //공통 URL처리 -> 2가지 방식에 따라 다른 처리

public class MemberLoginController {
	
	@RequestMapping(method = RequestMethod.GET) // 1. get방식일때
	public String getForm() {
		
		return "member/loginForm2"; // + .jsp
	}
	
	@RequestMapping(method = RequestMethod.POST) // 2. post방식일때
	public String login(HttpServletRequest request, Model model) {
						// Model객체 사용 -> Model과 연결 (결과 데이터 담음)
		
		String id = request.getParameter("uId");
		String pw = request.getParameter("uPw");
				
		System.out.println(id+"&&"+pw);
		
		// 결과 데이터 담기 (=modelAndView.addObject)
		model.addAttribute("id",id); // => EL로 받아줌
		model.addAttribute("pw",pw);
		
		return "member/login"; // + .jsp
	}

}

get방식 (=정보 입력 안함) → <loginForm2.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인폼</title>
</head>
<body>
	<h1>Login Form</h1>
	<hr>
	
	<form action="memberLogin" method="post"> <!-- MemberLoginController의 2번째 방식 -->
	아이디: <input type="text" name="uId">
	비밀번호: <input type="password" name="uPw">
	<input type="submit" value="로그인">
	</form>
</body>
</html>

post방식(=정보 입력함) → <login.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>로그인 결과 페이지</h1>
	<h2>
	id : ${id }, ${login.uId }, ${user.uId } / pw : ${pw }, ${login.uPw }, ${user.uPw } 
	</h2>
</body>
</html>


- @RequestParam : HTTP요청에 포함된 파라미터 참조 시 사용


- @ModelAttribute : HTTP요청에 포함된 파라미터를 모델 객체로 바인딩 → 'name'으로 정의한 모델 객체는 다음 뷰에서 사용 가능

<SearchController.java>

package com.bitcamp.mvc.member;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.bitcamp.mvc.domain.SearchType;

@Controller
public class SearchController {
	
	@RequestMapping("/search/search")
	public String searchForm() {
		return "search/form"; <--- VIEW PAGE
	}
	
	@ModelAttribute("searchType") // 리턴값 -> view에서 공유할 수 있음
	public List<SearchType> getSearchType(){
		
		List<SearchType> options = new ArrayList<SearchType>();
		
		options.add(new SearchType(1, "전체"));
		options.add(new SearchType(2, "제목"));
		options.add(new SearchType(3, "내용"));
		options.add(new SearchType(4, "제목+내용"));
		
		return options;
	}
	
	@ModelAttribute("popularList")
	public String[] getPopularList() {
		return new String[] {"일번","이번","삼번","사번"};
	}
}

<LoginController.java>

package com.bitcamp.mvc.member;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Required;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.bitcamp.mvc.domain.Login;

@Controller
public class LoginController {
	
	// 로그인 폼 페이지 요청
	@RequestMapping(value="/member/login")
	public String getLoginForm() {
		// 메소드 리턴값 String으로 view page지정함
		
		// View Path : Resolver의 범위에 포함된 경로
		return "member/loginForm"; // = /WEB-INF/views/member/loginForm.jsp로 페이지 이동
	}
	
	// 로그인 처리
												// 속성 추가(method방식) = 사용자의 요청을 좀 더 세분화 한 것 
												// <form method="post" 일때만 처리해줌
	@RequestMapping(value="/member/loginProcess", method = RequestMethod.POST) 
									// 로그인 폼에 입력한 내용 받기 위함 (request)
	public ModelAndView loginProcess(HttpServletRequest request) {
		
		String id = request.getParameter("uId");
		String pw = request.getParameter("uPw");
		
		System.out.println(id +"/"+ pw);
		
		ModelAndView modelAndView = new ModelAndView();
		
		// View Name 설정
		modelAndView.setViewName("member/login"); // = /WEB-INF/views/member/login.jsp로 페이지 이동
		modelAndView.addObject("id",id);
		modelAndView.addObject("pw",pw);
		
		return modelAndView;
	}
	
	@RequestMapping("/member/loginProc")
	public String loginproc(@RequestParam(value = "uId", defaultValue = "cool") String id, 
							// request.getParameter("uId") -> id에 대입
							// defaultValue -> null값이 들어왔을 때 디폴트값
							@RequestParam(value = "uPw", required = false) String pw,
							Model model
							) {
		
		System.out.println(id+"--"+pw);
		
		model.addAttribute("id",id);
		model.addAttribute("pw",pw);
		
		return "member/login";
	}
	
	@RequestMapping("/member/loginOk")
	/*public String loginOk(Login login) {
	 * -> <login.jsp> ${login.uId}로 호출해야함
	 * */
	public String loginOk(@ModelAttribute("user") Login login) {
	// @ModelAttribute : 이름 설정해주기
	// -> <login.jsp> ${user.uId}로 호출해야함
		
		System.out.println(login.getuId() +":"+ login.getuPw() );
		
		login.setuId(login.getuId()+"1212");
		
		return "member/login";
	}
}

- HTML폼에 입력한 데이터 → 자바 빈 객체로 전달 ⇒ @RequestMapping이 적용된 메소드의 파라미터로 자바빈 타입 추가 설정

자바 Bean 객체 : 기본 생성자, private변수, getter/setter

<Login.java>

package com.bitcamp.mvc.domain;

public class Login {
	
	private String uId;
	private String uPw;
	
	private void login() {
		// TODO Auto-generated method stub

	}
	
	public String getuId() {
		return uId;
	}
	public void setuId(String uId) {
		this.uId = uId;
	}
	public String getuPw() {
		return uPw;
	}
	public void setuPw(String uPw) {
		this.uPw = uPw;
	}
	
	
}

<login.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>로그인 결과 페이지</h1>
	<h2>
	id : ${id }, ${login.uId }, ${user.uId } / pw : ${pw }, ${login.uPw }, ${user.uPw } 
	</h2>
</body>
</html>

${user.uId }, ${user.uPw }에 출력됨!

300x250