其實很簡單,根本不須要像網上那麼麻煩java
<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
@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