2016-11-24 64 views
1

这是我的配置文件作出回应:弹簧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.propertieslabels_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。

    +0

    其中是您的labels_ru.properties?在它缺席的情况下,它将用于默认属性文件。 – ScanQR

    +0

    src/main/Java/resources – dikkini

    +0

    它不应该在java下。它应该位于java资源目录中。 – ScanQR

    回答

    2

    当你是你使用

    ReloadableResourceBundleMessageSource

    ,那么你必须从当前src/main/resources移动你的资源包文件资源的WEB-INF的目录。

    请阅读文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/ReloadableResourceBundleMessageSource.html

    它说,可以重新加载它们应该被投入WEB-INF目录。

    我也看到,你需要做以下的配置等同,

    <bean id="handlerMapping" 
         class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
         <property name="interceptors"> 
          <ref bean="localeChangeInterceptor" /> 
         </property> 
        </bean> 
    

    编辑:另外,还要确保你有label_ru.properties文件中定义。

    +0

    它没有帮助。请检查我的问题,我更新它。 – dikkini

    +0

    @dikkini你可以先尝试单个基名吗? ret.setBasenames( “/ WEB-INF /标签”); – ScanQR

    +0

    我很困惑为什么你添加了本地拦截器到hibernate相关的http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewInterceptor.html – ScanQR

    相关问题