如何在SpringBoot中整合Themyleaf(或者是freemark等均可以試試)與Jsp(真正意義上達到共存,互不干擾)

其實很簡單,根本不須要像網上那麼麻煩java

  • 步驟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)web

  • 步驟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";這樣子你仍然是沒法訪問的。 正解是:spring

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

相關文章
相關標籤/搜索