Spring 3, как работать с мультиязычным URL с тем же контентом - PullRequest
9 голосов
/ 07 июля 2011

Я хочу полностью интернационализировать свою веб-страницу и перевести URL-адреса на разные языки.Например,

Все вышеупомянутые страницы должны обрабатываться одним и тем же контроллером и отображать одинаковое содержимое (перевод на желаемый языкконечно, это я знаю, как это сделать - используя свойства сообщения).

Итак, мои вопросы:

  1. Как реализовать эту функцию, используя @RequestMapping аннотацию?
  2. Могу ли я настроить такие псевдонимы в свойствах или XML-файле и затем «внедрить» их в контроллер?то есть:

файл свойств:

alias.page=page:pagina

Контроллер

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

Или как-то так.

Спасибо за ответы.

Ответы [ 2 ]

5 голосов
/ 06 августа 2011

Я решил эту проблему, создав собственную реализацию сервлета 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() {}
}

Тогда метод контроллера для обработки запроса будет выглядеть как

@Controller
public class MultiLangController {

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

Наконец, опубликуйте новый фильтр в web.xml

<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 (аналог .htaccess для Java).

0 голосов
/ 23 июля 2011

Используйте PathVariable в @RequestMapping, с чем-то перед ним, чтобы Spring мог отобразить запрос:

@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
}

Spring будет соответствовать /someidentifier/ к этому RequestMapping, и вы можете использовать любое значение для pageName.

...