【问题标题】:Set up two template resolvers for JSP and Thymeleaf为 JSP 和 Thymeleaf 设置两个模板解析器
【发布时间】:2017-05-10 10:26:23
【问题描述】:

我有一个现有的 Spring Boot 应用程序,它使用 JSP 获取视图。我想逐步将视图技术转移到 Thymeleaf。

JSP 视图解析器在 application.properties 中设置:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

JSP 位于:

src/main/resources/META-INF/resources/WEB-INF/views/

是否可以为 Thymeleaf 添加第二个视图解析器,用于不作为 JSP 存在的视图?这样应用程序会在请求视图时尝试两个视图解析器。

编辑

我也尝试了以下配置,但没有成功:

@Bean
public InternalResourceViewResolver jspViewResolver() {
    final InternalResourceViewResolver vr = new InternalResourceViewResolver();
    vr.setPrefix("/META-INF/resources/WEB-INF/views/");
    vr.setSuffix(".jsp");
    vr.setViewClass(JstlView.class);
    vr.setOrder(1);
    return vr;
}

@Bean
public TemplateResolver templateResolver() {
    final ServletContextTemplateResolver tr = new ServletContextTemplateResolver();
    tr.setPrefix("templates/th/");
    tr.setSuffix(".html");
    tr.setTemplateMode("HTML5");
    return tr;
}

@Bean
public SpringTemplateEngine templateEngine() {
    final SpringTemplateEngine te = new SpringTemplateEngine();
    // te.addTemplateResolver(jspViewResolver());
    te.setTemplateResolver(templateResolver());
    te.setMessageSource(databaseMessageSource);
    return te;
}

@Bean
public ViewResolver viewResolver() {
    final ThymeleafViewResolver vr = new ThymeleafViewResolver();
    vr.setTemplateEngine(templateEngine());
    vr.setOrder(2);
    return vr;
}

【问题讨论】:

    标签: java spring-boot thymeleaf


    【解决方案1】:

    您可以尝试通过 Java Config 进行配置。

    package com.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    import org.springframework.web.servlet.view.JstlView;
    import org.thymeleaf.spring4.view.ThymeleafViewResolver;
    
    @SpringBootApplication
    public class Application extends WebMvcConfigurerAdapter{
    
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.viewResolver(new ThymeleafViewResolver());
    
            InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
            internalResourceViewResolver.setViewClass(JstlView.class);
            internalResourceViewResolver.setPrefix("/WEB-INF/views");
            internalResourceViewResolver.setSuffix(".jsp");
            registry.viewResolver(internalResourceViewResolver);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    请记住,InternalResourceViewResolver 应该排在最后。

    另外一个关于 SO 的有用答案

    1. How to use multiple ViewResolvers in Spring?
    2. Spring MVC with multiple view resolvers

    【讨论】:

    • 这会导致“org.thymeleaf.exceptions.TemplateInputException:解析模板“home”时出错,模板可能不存在或可能无法被任何配置的模板解析器访问”,就像它不存在一样尝试第二个选项,即 jsp view-respover,它将能够解析“home”。我也尝试在您的示例中设置视图解析器的顺序,但没有任何效果。
    • @yglodt 您是否在两个解析器上为您的特定情况配置前缀和后缀?
    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 2016-01-27
    • 2016-01-30
    • 1970-01-01
    • 2016-05-29
    • 2017-09-10
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多