首页 > 解决方案 > Thymeleaf 如果表达式不适用于主题参数值

问题描述

我的应用程序中有一个主题解析器。有两个主题:黑色和白色。

<p th:text="${param.theme}">

</p>

这将返回当前主题,深色或白色。但是,那

<p th:if="${param.theme == 'white'}">
    white theme
</p>

什么都不输出。

我希望这个实现主题切换。如何让它发挥作用?

Java 配置代码。

public class WebConfig  implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() {

        var templateResolver = new SpringResourceTemplateResolver();

        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("classpath:/templates/");
        templateResolver.setSuffix(".html");

        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {

        var templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);

        return templateEngine;
    }

    @Bean
    public ViewResolver viewResolver() {

        var resolver = new ThymeleafViewResolver();
        var registry = new ViewResolverRegistry(null, applicationContext);

        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);

        return resolver;
    }

    @Bean
    public ThemeSource themeSource() {

        var themeSource = new ResourceBundleThemeSource();
        themeSource.setBasenamePrefix("themes/");
        return themeSource;
    }

    @Bean
    public ThemeResolver themeResolver(){

        var resolver = new CookieThemeResolver();
        resolver.setCookieMaxAge(604800);
        resolver.setCookieName("mytheme");
        resolver.setDefaultThemeName("dark");
        return resolver;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        var themeChangeInterceptor = new ThemeChangeInterceptor();
        themeChangeInterceptor.setParamName("theme");
        registry.addInterceptor(themeChangeInterceptor);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
    }

标签: javaspringspring-bootthymeleaf

解决方案


尝试这个。

     public class DataInterceptor extends HandlerInterceptorAdapter
      {
            @Override public void postHandle( HttpServletRequest request, 
           HttpServletResponse response, Object handler, ModelAndView 
             modelAndView ) throws Exception
           {
    if( modelAndView != null )
    {
        setup( modelAndView.getModel(), request );
    }
}

              private void setup( Map<String, Object> model, HttpServletRequest request )
                         {
                    String theme = RequestContextUtils.getTheme( request ).getName();
                         model.put( "theme", theme);

                             }
      }

推荐阅读