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/

相关文章:

spring-boot - 已请求默认 Binder ,但没有可用于 'org.springframework.cloud.stream.messaging.DirectWithAttributesChannel' 的 Binder

Java Web 应用程序根据请求的来源重定向到 URL

html - 在 thymeleaf 中创建一个表

java - 将日期参数从 html 表单发送到 thymeleaf 中的 Controller

HTML 页面布局 - 多个表单标签

java - 使用自定义标记 (taglib) 在 JSP 上提示 Eclipse 代码

java - XML使用sax解析器java从特定的重复标签中获取值

java - 为什么JIT是JVM执行引擎的一部分?

java - Spring Security+Spring 4-禁用同一用户的多重登录

java - 对方法内部声明的方法进行单元测试