Spring - @RequestParam
@RequestParam
@RequestParam은 Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션이다.
관련 속성은 아래와 같다.
| 이름 | 타입 | 설명 |
|---|---|---|
| value | String | 파라미터 이름 |
| required | boolean | 해당 파라미터가 반드시 필수 인지 여부. 기본값은 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"; } } }
===================================================================================
스프링2.5 Annotation 기반의 Controller를 만들때 편하게 사용할 수 있는 것이 @RequestParam 이다.
- 에제를 보면
- public ModelAndView add(@RequestParam("userId") long userId) {
- ...
- }
이전의 컨틀롤러와 비교해 보자. 더이상 HttpServletRequest 명시하지 않아도 된다.
- public ModelAndView add(HttpServletRequest req, HttpServletResponse res)
- throws Exception {
- String userId = req.getPrameter("userId");
- }
또 한가지의 장점은 이클립스 같은 IDE에서 주석을 만들때 자동으로 param 주석을 만들어 주어 가독성이 좋아진다.
- /**
- * 추가하기
- * @param userId
- */
- public ModelAndView add(@RequestParam("userId") long userId) {
- ...
- }
RequestParam은 기본적으로 필수 파라미터 이기 때문에 반드시 요청한 파라미터가 있어야 한다.
만약 요청에 따라 파라미터 없이 호출이 필요할때는
@RequestParam(value="userId", required=false) 로 설정하면 필수 파라미터조건을 해제할 수 있다.
단점은 위에 첫번째 소스와 같이 primitive type인 경우 인데, long 타입의 userId 값으로 설정했는데
만약 add.do?userId=&userName 이런식으로 "userId=" 아무런 값도 오지 않으면 IllegalStateException 오류가 발생합니다.
다음과 같이
- 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
===================================================================================
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. 03.<beans xmlns="http://www.springframework.org/schema/beans"04.xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"05.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"06.xsi:schemaLocation="http://www.springframework.org/schema/beans10. 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.@Controller09.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