如何在SpringBoot中整合Themyleaf(或者是freemark等都可以试试)与Jsp(真正意义上达到共存,互不干扰)

原创
2019/03/22 17:13
阅读数 2.8K

其实很简单,根本不需要像网上那么麻烦

  • 步骤1: 将你的jsp依赖加载进来
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- spring boot 内置tomcat jsp支持 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- spring boot 内置tomcat jsp支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

大致意思就是把Spring自带的tomcat排除,然后添加上Tomcat的支持,顺带加上一个自己的tomcat依赖,原因是这样你就可以打war包了(tomcat为provided)

  • 步骤2:
    1. 你可以直接把jsp页面放到webapp下面,然后直接访问即可,哦对了,你首先得保证你的启动配置是对的,为了保证正确性,参考这个去做:

      设置了以后呢,你的内嵌tomcat启动也会以你项目的webapp目录为base目录了,否则你目录都访问不到,你还想访问jsp?
    2. 你也可以把他放到WEB-INF里面,由于Tomcat安全策略,该目录是不允许访问的,怎么办呢?按照网上的那些方法直接建立个Controller,然后转发?
@Controller
@RequestMapping("/jsptest")
public class testJspController {
    @RequestMapping
    public void openTestJsp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        return "farward:WEB-INF/reportFiles/test.jsp";
    }
}

你可以试试,绝对行不通。。。因为你没在DispatchServlet中配置Jsp视图解析器(还真有这个解析器).
解释一下就是正常的jsp解析其实是由JspServlet控制的,而它和DispatchServlet是同级的.
当你直接访问服务器jsp文件的时候,如xxx.jsp(没放在WEB-INF里面),这个请求会直接被JspServlet给拦截到,因为它匹配(*.jsp)
所以你只要步骤二的 1 完成了,你现在就可以直接访问jsp了,当然你的其他模板的页面也照常访问即可,除非你作死的将其他模板的请求Url设置为.jsp结尾。
那怎么办呢?我想要既经过Controller层(想做权限控制,或数据处理啥的),又想访问Jsp,还不想把我原来的视图解析器给禁用。 那就只能这样了,先经过Controller,再数据处理,再把真正的jsp路径作为一个新请求转发出去,当然不是return "xxx/xxx.jsp";这样子你仍然是无法访问的。 正解是:

@Controller
@RequestMapping("/jsptest")
public class testJspController {
    @RequestMapping
    public void openTestJsp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("WEB-INF/reportFiles/test.jsp").forward(request,response);
    }
}

将这个请求丢到DispatcherServlet之外,让JspServlet拦截到xxx.jsp的请求,就可正常访问到Jsp文件了,同时相应的数据也已经在Controller层处理过了。
大概就是上图的样子了。
End.

展开阅读全文
加载中

作者的其它热门文章

打赏
0
5 收藏
分享
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部