有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

当我点击链接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;
}
  1. 将捆绑包移动到/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{},在这两种情况下问题仍然存在。在标签上。属性我有俄语,它是默认的语言环境,在label_en中。掌握英语。并将俄语语言环境作为默认语言环境

最终配置

这是配置的重要部分

@Bean
public RequestMappingHandlerMapping handlerMapping() {
    RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
    handlerMapping.setInterceptors(localeChangeInterceptor());
    return handlerMapping;
}

对于默认语言环境,我制作了标签。属性和英语语言环境我制作了标签。财产


共 (1) 个答案

  1. # 1 楼答案

    当你使用

    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>
    

    编辑:还要确保你有标签。属性文件已定义