2

私はSpring MVC Worldの初心者で、あなたに質問です。

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 呼び出しを処理する、 called homeと呼ばれるメソッドは 1 つしかありません。これは私には明らかです。

これが明らかにされていないことは、このメソッドの入力パラメーターに関するものです。このメソッドは 2 つの入力パラメーターを受け取ることがわかります。

1) モデル

2) ユーザーに関する情報を含む Locale オブジェクト

しかし: 誰がこの Locale オブジェクトを作成し、いつコントローラに入力パラメータとして渡されるのでしょうか?

TNX

アンドレア

4

2 に答える 2

4

LocaleResolver がそれを行っています。

そのようなリゾルバーの 1 つは、最終的にHandlerMethodInvokereによって使用され、呼び出している @RequestMapping メソッド (この場合は「ホーム」メソッド) のパラメーターを検査します。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/

于 2012-12-05T16:37:27.360 に答える
1

GETリクエストでは、のようなリクエストの特別なパラメータを使用して、ロケール情報をサーバーに送信できます?language=enlanguageしかし、問題は、パラメータがロケール情報を持つパラメータであることをサーブレットコンテナがどのように認識するかです。Spring MVCコンテナーにこの特別なロケールパラメーターを知らせるには、次のように特別なインターセプターを2つ追加する必要があります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リクエストで渡されたロケールパラメータの値を認識します。ただし、選択した言語リンクに基づいてロケールを変更し、それに応じてプロパティファイルからメッセージを表示する人が必要です。次のように、名前の付いた特別なBeanlocaleResolverがその仕事をするために助けに来ます。

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

ここで、GETリクエストハンドラメソッドでロケールオブジェクトを使用する場合は、メソッドシグネチャを次のように記述しますpublic String home(Locale locale, Model model)(これまでに行ったことなど)。次に、サーブレットコンテナは、そのロケールオブジェクトを呼び出す前にメソッドパラメータとして配置するという追加のジョブを取得し、魔法のようにメソッド内に取得します。

于 2012-12-05T17:16:54.533 に答える