@RequestParam

@RequestParam은 Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션이다.
관련 속성은 아래와 같다.

이름타입설명
valueString파라미터 이름
requiredboolean해당 파라미터가 반드시 필수 인지 여부. 기본값은 true이다.

아래 코드와 같은 방법으로 사용되는데, 
해당 파라미터가 Request 객체 안에 없을때 그냥 null값을 바인드 하고 싶다면, pageNo 파라미터 처럼 required=false로 명시해야 한다.
name 파라미터는 required가 true이므로, 만일 name 파라미터가 null이면 org.springframework.web.bind.MissingServletRequestParameterException이 발생한다.

@Controller
public class HelloController {
 
    @RequestMapping("/hello.do")
    public String hello(@RequestParam("name") String name, //required 조건이 없으면 기본값은 true, 즉 필수 파라미터 이다. 파라미터 pageNo가 존재하지 않으면 Exception 발생.
			@RequestParam(value="pageNo", required=false) String pageNo){ //파라미터 pageNo가 존재하지 않으면 String pageNo는 null.
	...		
    }
}

위에서 작성한 LoginController의 login 메소드를 보면 파라미터 아이디와 패스워드를 Http Request 객체에서 getParameter 메소드를 이용해 구하는데,
@RequestParam을 사용하면 아래와 같이 변경할수 있다.

package com.easycompany.controller.annotation;
...
@Controller
public class LoginController {
 
	@Autowired
	private LoginService loginService;
 
	@RequestMapping(value = "/loginProcess.do", method = RequestMethod.POST)
	public String login(
			HttpServletRequest request,
			@RequestParam("id") String id,
			@RequestParam("password") String password) {		
 
		Account account = (Account) loginService.authenticate(id,password);
 
		if (account != null) {
			request.getSession().setAttribute("UserAccount", account);
			return "redirect:/employeeList.do";
		} else {
			return "login";
		}
	}
}


출처 - http://www.egovframe.org/wiki/doku.php?id=egovframework:rte:ptl:annotation-based_controller&s[]=requestmapping

===================================================================================

스프링2.5 Annotation 기반의 Controller를 만들때 편하게 사용할 수 있는 것이 @RequestParam 이다.

  1. 에제를 보면  
  2. public ModelAndView add(@RequestParam("userId") long userId) {  
  3. ...  
  4. }  

이전의 컨틀롤러와 비교해 보자. 더이상 HttpServletRequest 명시하지 않아도 된다.

  1. public ModelAndView add(HttpServletRequest req, HttpServletResponse res)  
  2. throws Exception {  
  3. String userId = req.getPrameter("userId");  
  4. }  

또 한가지의 장점은 이클립스 같은 IDE에서 주석을 만들때 자동으로 param 주석을 만들어 주어 가독성이 좋아진다.

  1. /**  
  2.      * 추가하기  
  3.      * @param userId  
  4. */  
  5. public ModelAndView add(@RequestParam("userId") long userId) {  
  6. ...  
  7. }  

RequestParam은 기본적으로 필수 파라미터 이기 때문에 반드시 요청한 파라미터가 있어야 한다.

만약 요청에 따라 파라미터 없이 호출이 필요할때는

@RequestParam(value="userId", required=false) 로 설정하면 필수 파라미터조건을 해제할 수 있다.

 

단점은 위에 첫번째 소스와 같이 primitive type인 경우 인데, long 타입의 userId 값으로 설정했는데

만약  add.do?userId=&userName 이런식으로 "userId=" 아무런 값도 오지 않으면 IllegalStateException 오류가 발생합니다.

다음과 같이

  1. java.lang.IllegalStateException: Optional long parameter 'targetUserId' is not present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.  

 

일단은 두번재와 같이 String으로 받은후 long 형으로 변환하는 메소드를 통해서 변환하면 되지만

뭔가 더 좋은 방법을 찾아봐야 겠네요.


출처 - http://parang.springlog.com/pages/1400852


===================================================================================















SearchController

public ModelAndView serchInternal()
@RequestParam("query") 는 반드시 넘겨야할 값 (required = false를 입력하지 않았을 경우)

ModelAndView로 리턴하면 jsp에서 값을 받아 들일 수 있다

defaultValue 전송되지 않았을 경우 기본값 1

public ModelAndView searchExternal()

메소드는 의무사항이 없기 때문에 external.do로 호출이 가능하다

 














dispatcher-servlet.xml
01.<?xml version="1.0" encoding="UTF-8"?>
02. 
10. 
11. 
12.<!-- 파라미터로 전송된 데이터 처리 -->
13.<bean id="searchController" class="madvirus.spring.chap06.controller.SearchController" />
14. 
15.<!-- View 글로벌 설정 -->
16.<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
17.<property name="prefix" value="/WEB-INF/view/" />
18.<property name="suffix" value=".jsp" />
19.</bean>
20.</beans>






SearchController.java
01.package madvirus.spring.chap06.controller;
02. 
03.import org.springframework.stereotype.Controller;
04.import org.springframework.web.bind.annotation.RequestMapping;
05.import org.springframework.web.bind.annotation.RequestParam;
06.import org.springframework.web.servlet.ModelAndView;
07. 
08.@Controller
09.public class SearchController {
10. 
11.@RequestMapping("/search/internal.do")
12.public ModelAndView serchInternal(
13.@RequestParam("query") String query,
14.@RequestParam(value = "p", defaultValue = "1"int pageNumber) {
15. 
16.System.out.println("query=" + query + ",pageNumber=" + pageNumber);
17. 
18.return new ModelAndView("search/internal");
19.}
20. 
21. 
22.@RequestMapping("/search/external.do")
23.public ModelAndView searchExternal(
24.@RequestParam(value = "query", required = false) String query,
25.@RequestParam(value = "p", defaultValue = "1"int pageNumber) {
26. 
27.System.out.println("query=" + query + "mpageNumber=" + pageNumber);
28. 
29.return new ModelAndView("search/external");
30.}
31.}







search/external.jsp
01.<%@ page language="java" contentType="text/html; charset=UTF-8"
02.pageEncoding="UTF-8"%>
03.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
04.<html>
05.<head>
06.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
07.<title>외부 검색</title>
08.</head>
09.<body>
10.외부 검색
11.</body>
12.</html>





search/internal.jsp 
01.<%@ page language="java" contentType="text/html; charset=UTF-8"
02.pageEncoding="UTF-8"%>
03.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
04.<html>
05.<head>
06.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
07.<title>내부 검색</title>
08.</head>
09.<body>
10.내부 검색
11.</body>
12.</html>


출처 - http://javai.tistory.com/567














'Framework & Platform > Spring' 카테고리의 다른 글

spring - Validator  (0) 2012.05.21
Spring - @ModelAttribute  (0) 2012.05.21
Spring - ModelAndView  (0) 2012.05.21
Spring - contextConfigLocation  (0) 2012.05.16
Spring - 기초 설정 - xml별 역할  (0) 2012.05.16
Posted by linuxism
,