JavaSpring4MVC语言环境已更改,但JSP对此没有响应
这是我的配置文件:
初始值设定项:
public class Initializer implements WebApplicationInitializer {
private static final String DISPATCHER_SERVLET_NAME = "dispatcher";
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(ApplicationConfig.class);
servletContext.addListener(new ContextLoaderListener(ctx));
servletContext.setInitParameter("defaultHtmlEscape", "true");
servletContext.addListener(new HttpSessionEventPublisher());
servletContext.addListener(new RequestContextListener());
FilterRegistration.Dynamic fr = servletContext.addFilter("encodingFilter",
new CharacterEncodingFilter());
fr.setInitParameter("encoding", "UTF-8");
fr.setInitParameter("forceEncoding", "true");
fr.addMappingForUrlPatterns(null, true, "/*");
servletContext.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
.addMappingForUrlPatterns(null, false, "/*");
ServletRegistration.Dynamic servlet = servletContext.addServlet(DISPATCHER_SERVLET_NAME,
new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
servlet.setAsyncSupported(true);
ctx.setServletContext(servletContext);
}
public Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[]{characterEncodingFilter, new DelegatingFilterProxy()};
}
}
应用程序配置:
@Configuration
@EnableWebMvc
@ComponentScan("com.example.*")
@PropertySource("classpath:app.properties")
public class ApplicationConfig extends WebMvcConfigurerAdapter {
private static final Charset UTF8 = Charset.forName("UTF-8");
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
OpenSessionInViewInterceptor sessionInViewInterceptor = new OpenSessionInViewInterceptor();
sessionInViewInterceptor.setSessionFactory(sessionFactory);
registry.addWebRequestInterceptor(sessionInViewInterceptor);
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource();
ret.setBasenames("classpath:messages", "classpath:labels", "classpath:exceptions");
ret.setDefaultEncoding(UTF8.name());
return ret;
}
// @Bean
// public SessionLocaleResolver localeResolver() {
// // TODO locale
// Locale ruLocale = new Locale.Builder().setLanguage("ru").build();
// SessionLocaleResolver localeResolver = new SessionLocaleResolver();
// localeResolver.setDefaultLocale(ruLocale);
// return localeResolver;
// }
@Bean
public CookieLocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setCookieName("localceCookie");
cookieLocaleResolver.setCookieMaxAge(3600);
return cookieLocaleResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("locale");
return localeChangeInterceptor;
}
}
我有LocaleChangeInterceptor,CookieLocaleResolver,MessageSource。我有labels.properties
和labels_en.properties
JSP:
Language : <a href="?locale=en">English</a>|<a href="?locale=ru">Russian</a>
<h2>
lable.testLocale : <spring:message code="lable.testLocale" text="default text" />
</h2>
Current Locale : ${pageContext.response.locale}
当我点击链接English、Russian、JSP重载时,JSP上的当前区域设置值显示俄语和英语(取决于链接)。所以语言环境的改变是成功的。出现名为localceCookie
的Cookie,它包含ru或en值,具体取决于所选的区域设置,但JSP值label.testLocale
仅显示en
区域设置的值,并且不会更改。我查了很多问题,大多数都是关于localeInterceptor的
我尝试了Tomcat、Jetty、JBoss(现在是wildfly)应用服务器。我尝试了不同的浏览器。另外,我发现this tutorial,project不工作,我对controller做了一些更改,比如@RequestMapping
,但在本例中locale不工作
更新#1
根据@TechBreak的回答,我做了以下工作: 1.更改捆绑包的基本名称,并在CookieLocaleResolver中设置默认区域设置
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource();
ret.setBasenames("/WEB-INF/messages", "/WEB-INF/labels", "/WEB-INF/exceptions");
ret.setDefaultEncoding(UTF8.name());
return ret;
}
@Bean
public CookieLocaleResolver localeResolver() {
Locale ruLocale = new Locale.Builder().setLanguage("ru").build();
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setDefaultLocale(ruLocale);
cookieLocaleResolver.setCookieName("localceCookie");
cookieLocaleResolver.setCookieMaxAge(3600);
return cookieLocaleResolver;
}
- 将捆绑包移动到/WEB-INF/
问题依然存在
更新#2
现在,我的配置如下所示:
@Configuration
@EnableWebMvc
@ComponentScan("com.example.*")
@PropertySource("classpath:app.properties")
public class ApplicationConfig extends WebMvcConfigurerAdapter {
@Autowired
private SessionFactory sessionFactory;
private static final Charset UTF8 = Charset.forName("UTF-8");
@Bean
public static PropertySourcesPlaceholderConfigurer propertiesBean() {
return new PropertySourcesPlaceholderConfigurer();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("/assets/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
@Bean
public RequestMappingHandlerMapping handlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setInterceptors(localeChangeInterceptor());
return handlerMapping;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
OpenSessionInViewInterceptor sessionInViewInterceptor = new OpenSessionInViewInterceptor();
sessionInViewInterceptor.setSessionFactory(sessionFactory);
// registry.addWebRequestInterceptor(sessionInViewInterceptor);
registry.addInterceptor(localeChangeInterceptor());
}
// @Bean
// public SimpleControllerHandlerAdapter simpleControllerHandlerAdapter() {
// return new SimpleControllerHandlerAdapter();
// }
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource();
ret.setBasenames("/WEB-INF/labels");
ret.setDefaultEncoding(UTF8.name());
return ret;
}
// @Bean
// public SessionLocaleResolver localeResolver() {
// // TODO locale
// Locale ruLocale = new Locale.Builder().setLanguage("ru").build();
// SessionLocaleResolver localeResolver = new SessionLocaleResolver();
// localeResolver.setDefaultLocale(ruLocale);
// return localeResolver;
// }
@Bean
public CookieLocaleResolver localeResolver() {
Locale ruLocale = new Locale.Builder().setLanguage("ru").build();
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setDefaultLocale(ruLocale);
cookieLocaleResolver.setCookieName("localceCookie");
cookieLocaleResolver.setCookieMaxAge(3600);
return cookieLocaleResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
// TODO locale
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("locale");
localeChangeInterceptor.setHttpMethods(HttpMethod.GET.name(), HttpMethod.POST.name());
return localeChangeInterceptor;
}
}
我尝试了DefaultAnnotationHandlerMapping
,但它已被弃用,而且Spring says to use{
最终配置
这是配置的重要部分
@Bean
public RequestMappingHandlerMapping handlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setInterceptors(localeChangeInterceptor());
return handlerMapping;
}
对于默认语言环境,我制作了标签。属性和英语语言环境我制作了标签。财产
# 1 楼答案
当你使用
然后必须将资源包文件从当前
src/main/resources
移动到WEB-INF
的资源目录请阅读以下文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/ReloadableResourceBundleMessageSource.html
它说,为了能够重新加载,它们应该放在
WEB-INF
目录中我还发现你需要做如下配置
编辑:还要确保你有标签。属性文件已定义