1. 程式人生 > >如何在SpringBoot中整合Themyleaf(或者是freemark等都可以試試)與Jsp(真正意義上達到共存,互不干擾)

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

開發十年,就只剩下這套架構體系了! >>>   

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

  • 步驟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層處理過了。
大概就是上圖的