这是我的配置文件作出回应:弹簧4 MVC地点更改,但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()};
}
}
ApplicationConfig:
@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}
当我点击链接打开英语,俄语,JSP重载和当前locale值在JSP显示俄语和英语(取决于链接)。所以语言环境更改成功。出现名称为localceCookie
的Cookie,它包含ru或en值取决于所选语言环境,但JSP值label.testLocale
仅显示en
语言环境的值,并且不会更改。我查了很多问题,其中大部分都是关于localeInterceptor的。
我尝试了Tomcat,Jetty,JBoss(现在是野蛮)应用服务器。我尝试了不同的浏览器。另外,我发现this tutorial,项目不起作用,我为控制器做了一些类似@RequestMapping
的更改,但区域设置在此示例中不起作用。
UPDATE#1
因此到@TechBreak的答案i执行以下操作: 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 useRequestMappingHandlerMapping
,在这两种情况下,问题依然存在。在label.properties我有俄语,它是默认的语言环境,在label_en.properites英语语言。俄语区域设置为默认语言环境。
最终配置
这是在配置
@Bean
public RequestMappingHandlerMapping handlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setInterceptors(localeChangeInterceptor());
return handlerMapping;
}
的重要组成部分,为默认的locale我做labels_ru.properties和英语语言环境中我做了labels.properties。
其中是您的labels_ru.properties?在它缺席的情况下,它将用于默认属性文件。 – ScanQR
src/main/Java/resources – dikkini
它不应该在java下。它应该位于java资源目录中。 – ScanQR