前言:
springboot官方推薦使用thymeleaf,並不推薦使用jsp,但有時候對jsp項目進行改造,使用jsp是無法避免的問題。下面就來看如何使用內置的tomcat和jsp結合起來開發web。
項目結構:
SpringBoot版本:2.1.6.RELEASE
webapp文件夾用來存放jsp文件,靜態文件夾仍然放在resources文件夾下的static文件下。
pom文件中添加的依賴:
使用內置tomcat的時候,僅需要下圖所示的三個依賴。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jsp頁面使用jstl標籤-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--內部tomcat用於編譯jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件:
application.properties 中需要配置端口號、jsp映射路徑的前綴和後綴。
server.port=8081
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
controller:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(HttpServletRequest request){
String message = "這是一個jsp程序";
request.setAttribute("message",message);
return "success";
}
}
jsp文件:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Success</title>
</head>
<body>
<h1>Success</h1>
<h1>這是一個分界線======</h1>
<h2>message:${message}</h2>
</body>
</html>
運行springboot的啓動類,即可在瀏覽器中訪問http://localhost:8081/hello,併成功獲得jsp頁面的訪問。
問題一:當使用IDEA的項目模塊構建多模塊的項目時,會出現訪問jsp頁面,報404錯誤的問題。
主要的原因是無法找到正確的路徑,tomcat啓動時候的路徑是:{$user.dir}+/WEB-INF/*jsp
所以需要將啓動的Working directory設置爲模塊工作文件夾$MODULE_WORKING_DIR$,如下圖所示。
問題二:出現一個警告:java.io.FileNotFoundException: E:\repository\xalan\xalan\2.7.1\serializer.jar (系統找不到指定的文件。)
解決辦法:添加一段代碼到主啓動類的後面
@SpringBootApplication
public class IcefoxFrameWebApplication {
public static void main(String[] args) {
SpringApplication.run(IcefoxFrameWebApplication.class, args);
}
//添加下面的代碼到自己的主啓動類中,能夠完美解決問題
@Bean
public TomcatServletWebServerFactory tomcatFactory(){
return new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
}
}