2011-07-07 13 views
8

私は自分のWebページを完全に国際化し、URLを別の言語に翻訳したいと思っています。例えばhttp://example.tld/de/pagina Spring 3同じ内容の多言語URLを扱う方法

前述のすべてのページ

  • http://example.tld/en/page
  • は、同じコントローラによって処理し、同じコンテンツを表示する必要があります(もちろん、希望の言語に翻訳され、これは私が行う方法を知って - メッセージプロパティを使用して)。

    だから私の質問は以下のとおりです。

    1. @RequestMappingのアノテーションを使用してこの機能を実現するためにどのように?
    2. プロパティやXMLファイルにこのようなエイリアスを設定し、それをコントローラに「注入」できますか?すなわち:

    プロパティファイル:

    alias.page=page:pagina 
    

    コントローラ

    @RequestMapping("${alias.page}") 
    ... 
    

    またはこのような何かを。

    お返事ありがとうございます。

    @RequestMapping("myPage.do") 
    public String displayBasePage() { 
        return("pageName"); // a hard-coded JSP 
    } 
    

    @RequestMapping("/someidentifier/{pageName}.do" 
    public String displayBasePage (
         PathVariable("pageName") String pageName) { 
        return(pageName); // the language-specific JSP, or whatever else you want to do 
    } 
    

    春はこのRequestMapping/someidentifier/にマッチします、そしてあなたが使用できるようになります。春が要求をマッピングすることができるように

+1

私はこのようなものも探しています。カスタム@I18NRequestMapping( "alias.page")注釈を作成し、そこにフォームを処理することを考えましたか?それは実現可能でしょうか? – spike07

+0

、またはRequestMappingHandlerMapping用に独自のカスタムembeddedValueResolverを提供することもできます – spike07

答えて

4

は、私が最後にweb.xml

に新しいフィルタを公開し、その後

@Controller 
public class MultiLangController { 

    @RequestMapping(value="/page", method = RequestMethod.GET) 
    public String pageMethod() {   
     return ...; 
    }  
} 

のようになります。サーブレットFilter

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 

public class ExampleFilter implements Filter { 

    @Override 
    public void init(FilterConfig fc) throws ServletException {} 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
         FilterChain fc) throws IOException, ServletException { 

     // Needed for getting URL from request 
     final HttpServletRequest hsRequest = (HttpServletRequest) request; 
     String url = hsRequest.getRequestURI().substring(
         hsRequest.getContextPath().length() 
        ); 

     /* This is just simple example. Here you can connect to database 
      or read properties or XML file with your configuration */ 
     if ("/de/pagina".equals(url) || "/en/page".equals(url)) { 
      // change url and forward 
      RequestDispatcher dispatcher = request.getRequestDispatcher("/page"); 
      dispatcher.forward(request, response); 
     } else { 
      // Do nothing, just send request and response to other filters 
      fc.doFilter(request, response); 
     } 
    } 

    @Override 
    public void destroy() {} 
} 

要求を処理するためのコントローラメソッドの独自の実装を作成することで、この問題を解決してきました

<filter> 
    <filter-name>MyExampleFilter</filter-name> 
    <filter-class> 
     com.path.to.filter.ExampleFilter 
    </filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>MyExampleFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

トリック。このような柔軟性が必要ない場合は、おそらくUrlRewriteFilter(Javaの場合は.htaccessのアナログ)で十分です。

-1

は、その前に何かを、@RequestMappingPathVariableを使用しますpageNameの任意の値を入力してください。

関連する問題