2012-12-05 3 views
2

저는 Spring MVC World에서 매우 새롭고 당신을위한 질문입니다.Spring MVC에서 컨트롤러 메소드의 매개 변수

STS 템플릿으로 새로운 Spring MVC 프로젝트를 만들었습니다.

:

그래서 지금은 그 실행되면,이이 프로젝트의 유일한 컨트롤러 클래스의 코드

을 표시 현재 날짜와 시간과의 Hello World 메시지를 표시, 최소한의 프로젝트를

package org.gnagna.bla; 

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 

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

/** 
* Handles requests for the application home page. 
*/ 
@Controller 
public class HomeController { 

private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 

/** 
* Simply selects the home view to render by returning its name. 
*/ 
@RequestMapping(value = "/", method = RequestMethod.GET) 
public String home(Locale locale, Model model) { 
    logger.info("Welcome home! The client locale is {}.", locale); 

    Date date = new Date(); 
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

    String formattedDate = dateFormat.format(date); 

    model.addAttribute("serverTime", formattedDate); 

    return "home"; 
} 

} 

따라서 이라는 "[/]"URL로 HTTP GET 호출을 처리하는 메서드가 하나만 있습니다.

1) 모델

2)가 포함 로케일 목적 :이 방법은 두 입력 파라미터를 수신하여 볼 수

이 clead가 아니라는 것은,이 방법은 입력 파라미터에 관한 사용자에 대한 일부 정보

그러나이 사용자는 누가이 Locale 객체를 만들며 이것이 내 컨트롤러에서 입력 매개 변수로 전달 될 때?

TNX

안드레아

+0

이것은 문제와는 아무런 관련이 없지만 Java 관례에 따르면 메소드 이름은 동사이어야합니다. http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html – Bal

답변

4

LocaleResolver의은을 다하고 있습니다.

하나의 이러한 확인자는 결국 호출하고있는 @RequestMapping 메서드 (사용자의 경우 "홈"메서드)의 매개 변수를 검사하는 데 HandlerMethodInvokere에서 사용됩니다. Locale 파라미터를 넘었을 경우는, 간단히 로케일 해석자를 사용해 Locale 객체를 꺼내 인수로서 건네줍니다.

당신은 여기에 대한 자세한 정보를 볼 수 있습니다 http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch16s06.html

http://templth.wordpress.com/2010/07/21/configuring-locale-switching-with-spring-mvc-3/

http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/이 같은 해당 요청의 특별한 paramerter을 사용하여 서버에 로케일 정보를 보낼 수 있습니다 GET 요청에

+0

음 ... alredy는 Spring 애플리케이션의 internazionalization에 대한 튜토리얼을 읽었지만이 경우에는 servlet-context.xml 및 web.xml 파일에 LocalResolver가 선언되지 않았습니다 ... 이유가 무엇입니까? – AndreaNobili

+1

로케일 해석자를 지정하지 않으면 Spring은 기본적으로 [AcceptHeaderLocaleResolver]로 설정됩니다 (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/i18n). /AcceptHeaderLocaleResolver.html). 따라서 항상 하나의 로케일 해석자가 있습니다. –

+0

잘 작동하는지 잘 이해한다면 나에게 말해 줘야한다. Spring은 내 HTTP 요청의 헤더 안쪽에이 로컬 클라이언트를 기본으로 제공하므로 내 전달할 수있는 Locale 객체의 storede라는 "지역"을 알고있다. 내 컨트롤러 메서드의 입력 매개 변수로 사용됩니다 ... 맞습니까? 감사합니다. – AndreaNobili

1

, ?language=en. 그러나 문제는 서블릿 컨테이너가 language 매개 변수가 로케일 정보를 담고있는 매개 변수라는 것을 알고 있는지 여부입니다. 스프링 MVC 컨테이너가이 특별한 로케일 매개 변수에 대해 알려하려면 두 가지가 우는 소리처럼 targer-servlet.xml에 특별한 인터셉터를 추가해야합니다

<bean id="localeChangeInterceptor" 
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
    <property name="paramName" value="language" /> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" > 
    <property name="interceptors"> 
     <list> 
     <ref bean="localeChangeInterceptor" /> 
     </list> 
    </property> 
</bean> 

것은 지금, 당신의 서블릿 컨테이너로 전달 된 로케일 매개 변수의 값을 알고있다 귀하의 GET 요청. 그러나 선택한 언어 링크를 기반으로 로켈을 변경하고 이에 따라 속성 파일의 메시지를 표시 할 사람이 필요합니다. localeResolver라는 특별한 콩이 우는 소리처럼 일을하는 구조에 관해서 : 같은 (지금

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
    <property name="defaultLocale" value="en" /> 
</bean> 

을 당신이 당신의 GET 요청 처리기 방법에 로케일 객체를 사용하려는 경우, 당신은 public String home(Locale locale, Model model) 같은 방법 서명을 쓰기 당신이 한 일).그런 다음 서블릿 컨테이너는 호출하기 전에 메쏘드 매개 변수로 로케일 객체를 추가하는 작업을 얻습니다.

관련 문제