java - 为 JSP 和 Thymeleaf 设置两个模板解析器

标签 java spring-boot thymeleaf

我有一个现有的 Spring Boot 应用程序,它使用 JSP 作为 View 。我想逐步将 View 技术转移到 Thymeleaf。

JSP View 解析器在 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 添加第二个 View 解析器,用于不作为 JSP 存在的 View ?这样应用程序在请求 View 时会尝试两个 View 解析器。

编辑

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

@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 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

关于java - 为 JSP 和 Thymeleaf 设置两个模板解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323054/

相关文章:

java - 如何实现 Spring Boot Controller 以 json 形式返回查询结果

Tomcat 中的 spring-boot app war 部署,现有的 spring web 应用程序失败

java - Thymeleaf - 将变量传递给 Controller

java - 解决 Thymeleaf 缺乏可选支持的问题

java - 分配后清除()字节缓冲区是一种好习惯吗?

java - .net 程序员学习 Java EE 的资源

java - Spring Boot 设置包含通过环境变量的配置文件

java - Spring mvc thymeleaf 。如何将白标签错误页面显示为模式或弹出窗口或 toast

java - 为什么 Cookie 名称和值分别是 'http' 和 'proxy' 而没有在 eclipse 中创建?

java - getNextEntry() 不将文件夹显示为条目?