@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/beans
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 |