面试题:Spring MVC 中的国际化支持是如何实现的?

在Spring MVC中,国际化(i18n)支持是通过LocaleResolverMessageSourceLocaleChangeInterceptor等组件实现的。以下是实现国际化的步骤和关键组件:

1. 配置 LocaleResolver

LocaleResolver用于确定当前请求的Locale。Spring提供了几种实现,如AcceptHeaderLocaleResolverSessionLocaleResolverCookieLocaleResolver

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.US); // 设置默认Locale
    return slr;
}

2. 配置 MessageSource

MessageSource用于加载不同Locale的资源文件(如messages.propertiesmessages_fr.properties等)。

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

3. 配置 LocaleChangeInterceptor

LocaleChangeInterceptor用于根据请求参数(如lang)动态更改Locale。

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName("lang"); // 默认参数名为"locale",这里改为"lang"
    return lci;
}

4. 注册拦截器

LocaleChangeInterceptor注册到Spring MVC的拦截器链中。

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(localeChangeInterceptor());
}

5. 创建资源文件

src/main/resources目录下创建资源文件,如:

  • messages.properties(默认)
  • messages_fr.properties(法语)
  • messages_zh.properties(中文)

示例内容:

# messages.properties
greeting=Hello

# messages_fr.properties
greeting=Bonjour

# messages_zh.properties
greeting=你好

6. 在控制器中使用国际化消息

在控制器中,可以使用MessageSource@RequestHeader注解来获取国际化消息。

@Controller
public class MyController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/greeting")
    public String greeting(Model model, Locale locale) {
        String greeting = messageSource.getMessage("greeting", null, locale);
        model.addAttribute("greeting", greeting);
        return "greeting";
    }
}

7. 在视图中使用国际化消息

在视图(如JSP、Thymeleaf)中,可以使用Spring的标签或表达式来显示国际化消息。

JSP示例:

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<html>
<head>
    <title>Greeting</title>
</head>
<body>
    <h1><spring:message code="greeting" /></h1>
</body>
</html>

Thymeleaf示例:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Greeting</title>
</head>
<body>
    <h1 th:text="#{greeting}"></h1>
</body>
</html>

8. 切换Locale

通过在URL中添加lang参数来切换Locale。例如:

  • http://localhost:8080/greeting?lang=en(英语)
  • http://localhost:8080/greeting?lang=fr(法语)
  • http://localhost:8080/greeting?lang=zh(中文)

总结

Spring MVC的国际化支持通过以下组件实现:

  • LocaleResolver:确定当前请求的Locale。
  • MessageSource:加载不同Locale的资源文件。
  • LocaleChangeInterceptor:根据请求参数动态更改Locale。

在面试中,理解这些组件及其配置方式是关键。

THE END
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容