多种模板同时存在区别(Jsp、FreeMarker、Thymeleaf)

模板优先级

  • FreeMarker视图解析器优先级:
    在这里插入图片描述
  • Thymeleaf视图解析器优先级:
    在这里插入图片描述
  • Jsp优先级最低

测试代码

创建01.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>01.html--thymeleaf</h1>
</body>
</html>

创建02.ftlh:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>02.ftlh--freemarker</h1>
</body>
</html>

创建03.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>03.jsp</h1>
</body>
</html>

分别将Thymeleaf和FreeMarker模板放在templates目录下,将jsp文件放在webapp目录下
接着我们编写Controller:

@Controller
public class HelloController {
    @GetMapping("/{path}")
    public String gethello(@PathVariable String path){
        return path;
    }
}

编写配置类:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/",".jsp");
        //registry.order(1);
    }
}

我们在ContentNegotiatingViewResolver类中打上断点:
在这里插入图片描述

Thymeleaf与FreeMarker同时存在

  • 当请求http://localhost:8080/01
    在这里插入图片描述
    在这里插入图片描述
  • 当请求http://localhost:8080/02
    在这里插入图片描述

在这里插入图片描述

  • 当请求http://localhost:8080/03
    在这里插入图片描述
    FreeMarker和thymeleaf优先级相同,FreeMarker的位置靠前一点,所以先进行的是FreeMarker视图解析器的遍历,由于checksource方法,所以FreeMarker会检查视图是否可用,如果可用就会加入到候选视图中去,当请求01时,FreeMarker的checksource方法发现视图不可用,所以并没有加入到候选视图中,之后进行thymeleaf视图解析器的遍历,因为thymeleaf的不检查视图是否存在,所以不管视图有没有问题,都会加入到候选视图中去,当请求02时,发现候选视图中也有thymeleaf视图(但是这个视图是有问题的不能使用的),最后进入getBestView方法,找出最合适的视图,按照MediaType和模板的优先级

Jsp与FreeMarker同时存在

我们将Jsp的优先级改为1,将高于FreeMarker的优先级

  • 当请求http://localhost:8080/01
    在这里插入图片描述

在这里插入图片描述

  • 当请求http://localhost:8080/02
  • 在这里插入图片描述

在这里插入图片描述

  • 当请求http://localhost:8080/03
    在这里插入图片描述

在这里插入图片描述
当我们请求01时因为我们去掉了Thymeleaf依赖所以没有页面显示;当我们请求02时,因为Jsp的优先级高于FreeMarker,加上Jsp的因为thymeleaf的checksource方法永远返回TRUE,所以不管视图有没有问题,都会加入到候选视图中去,最后进入getBestView方法时,按照优先级Jsp被优先匹配到,但是视图不可用,所以找不到页面

Thymeleaf与Jsp同时存在

  • 当请求http://localhost:8080/01
    在这里插入图片描述
  • 当请求http://localhost:8080/02
    在这里插入图片描述
  • 当请求http://localhost:8080/03
    在这里插入图片描述
    因为jsp的优先级低于Thymeleaf,thymeleaf的不检查视图是否存在,所以不管视图有没有问题,都会加入到候选视图中去,每一次请求都只有Thymeleaf模板,但是在03请求时候的视图有问题,找不到,所以报错

解决方法:
创建HandelInternalResourceViewExist类:

public class HandelInternalResourceViewExist extends InternalResourceView {
    @Override
    public boolean checkResource(Locale locale) throws Exception {
        File file = new File(getServletContext().getRealPath("/") + getUrl());
        return file.exists();
    }
}

修改Jsp优先级:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/",".jsp").viewClass(HandelInternalResourceViewExist.class);
        registry.order(1);
    }
}

成功访问03:
在这里插入图片描述

Thymeleaf、Jsp、FreeMarker同时存在

三个模板同时存在,只需要将两个模板使他们都具有检测能力,同理编写以下代码就可以共存
解决方法:
创建HandelInternalResourceViewExist类:

public class HandelInternalResourceViewExist extends InternalResourceView {
    @Override
    public boolean checkResource(Locale locale) throws Exception {
        File file = new File(getServletContext().getRealPath("/") + getUrl());
        return file.exists();
    }
}

修改Jsp优先级:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/",".jsp").viewClass(HandelInternalResourceViewExist.class);
        registry.order(1);
    }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值