如何在SpringBoot中整合Themyleaf(或者是freemark等都可以試試)與Jsp(真正意義上達到共存,互不干擾)
阿新 • • 發佈:2019-03-23
其實很簡單,根本不需要像網上那麼麻煩
- 步驟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:
- 你可以直接把jsp頁面放到webapp下面,然後直接訪問即可,哦對了,你首先得保證你的啟動配置是對的,為了保證正確性,參考這個去做:
設定了以後呢,你的內嵌tomcat啟動也會以你專案的webapp目錄為base目錄了,否則你目錄都訪問不到,你還想訪問jsp? - 你也可以把他放到WEB-INF裡面,由於Tomcat安全策略,該目錄是不允許訪問的,怎麼辦呢?按照網上的那些方法直接建立個Controller,然後轉發?
- 你可以直接把jsp頁面放到webapp下面,然後直接訪問即可,哦對了,你首先得保證你的啟動配置是對的,為了保證正確性,參考這個去做:
@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層處理過了。
大概就是上圖的