SpringBoot使用JSP(官网Demo)
最开始接触java的时候,前端页面基本都是用jsp来写,最近公司项目要使用SpringBoot重构,查看SpringBoot文档,发现SpringBoot不建议使用JSP,因为jsp在使用内嵌servlet容器时会有一些限制
虽然以后项目中也会将jsp替换成Template Engines,而且这都是前端的事情,其实与后端并无比较大的联系,但比较好奇Springboot中对jsp的使用,故根据官方文档进行了简单测试验证
如果使用JSP,则需要将项目打包成war包,jar包不支持JSP。
打开JSP sample,这是一个github上的项目,点击Code标签页,clone or download下载源码,这里下载的代码中包含有很多个springboot项目,其中spring-boot-samples中包含有我们需要的spring-boot-sample-web-jsp
解压下载的文件,spring-boot-samples下项目很多,我们根据需要在eclipse中只导入spring-boot-sample-web-jsp项目,导入时可能出现以下异常
点击finish -- ok,pom.xml文件中出现异常
选择Mark goal validate as ignored in pom.xml忽略掉该信息
点击OK
此时若项目上还有红色的叉号,则在项目名称上右键 -- Maven -- Update Project -- OK。
项目结构
包sample.jsp下有两个类
控制器WelcomeController
package sample.jsp; import java.util.Date; import java.util.Map; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class WelcomeController { @Value("${application.message:Hello World}") private String message = "Hello World"; @GetMapping("/") public String welcome(Map<String, Object> model) { model.put("time", new Date()); model.put("message", this.message); return "welcome"; } @RequestMapping("/foo") public String foo(Map<String, Object> model) { throw new RuntimeException("Foo"); } }
启动类SampleWebJspApplication.java
package sample.jsp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class SampleWebJspApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SampleWebJspApplication.class); } public static void main(String[] args) { SpringApplication.run(SampleWebJspApplication.class, args); } }
两个jsp页面
welcome.jsp
<!DOCTYPE html> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html lang="en"> <body> <c:url value="/resources/text.txt" var="url"/> <spring:url value="/resources/text.txt" htmlEscape="true" var="springUrl" /> Spring URL: ${springUrl} at ${time} <br> JSTL URL: ${url} <br> Message: ${message} </body> </html>
error.jsp
<!DOCTYPE html> <html lang="en"> <body> Something went wrong: ${status} ${error} </body> </html>
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <!-- Your own application should inherit from spring-boot-starter-parent --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-samples</artifactId> <version>${revision}</version> </parent> <artifactId>spring-boot-sample-web-jsp</artifactId> <packaging>war</packaging> <name>Spring Boot Web JSP Sample</name> <description>Spring Boot Web JSP Sample</description> <properties> <main.basedir>${basedir}/../..</main.basedir> <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot> </properties> <dependencies> <!-- Compile --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!-- Provided --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!-- Test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> <plugin> <groupId>org.eclipse.m2e</groupId> <artifactId>lifecycle-mapping</artifactId> <version>1.0.0</version> <configuration> <lifecycleMappingMetadata> <pluginExecutions> <pluginExecution> <pluginExecutionFilter> <groupId> io.spring.javaformat </groupId> <artifactId> spring-javaformat-maven-plugin </artifactId> <versionRange> [0.0.6,) </versionRange> <goals> <goal>validate</goal> </goals> </pluginExecutionFilter> <action> <ignore></ignore> </action> </pluginExecution> </pluginExecutions> </lifecycleMappingMetadata> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
以上为该Demo官网pom文件,但其中内容个人觉得有多余,spring-boot-starter-tomcat和tomcat-embed-jasper在spring-boot-starter-web中已经有引用,所以可以去掉
启动主函数
页面访问:http://localhost:8080/
页面访问:http://localhost:8080/foo
一、本例中启动类继承了SpringBootServletInitializer,重写了configure方法,如果去掉该类的集成,能不能正常运行程序,其实是可以的(添加server.port=8081端口,与8080区分,测试)
二、SpringBootServletInitializer是做什么用处的?
springboot官方文档中 “91.1 Create a Deployable War File”有对该类的具体描述
三、按照当前pom.xml中配置,打包(eclipse中执行package),出现以下异常
[ERROR] Failed to execute goal io.spring.javaformat:spring-javaformat-maven-plugin:0.0.6:validate (default) on project spring-boot-sample-web-jsp: Formatting violations found in the following files:
日志中也给出了建议,使用:spring-javaformat:apply修复该问题
spring-javaformat:apply执行结束后,再次执行package,打包成功,打包过程中,会有很多的jar包下载。
进入到target目录,执行:java -jar .\spring-boot-sample-web-jsp-2.1.2.RELEASE.war,程序启动后,页面访问正常。
四、上面官方文档已经讲,打成可执行jar包,不支持JSP,下面尝试一下,是否如此,首先去掉主函数中集成SpringBootServletInitializer类,去掉重写的方法,pom.xml中war改为jar
1、运行主函数,jsp可正常访问
2、执行clean package打包,打包时出现异常,也许此异常与JSP无关,但此处就不在进行处理重新打包,毕竟官网也已经声明可执行jar不支持JSP
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) on project spring-boot-sample-web-jsp: You have 2 Checkstyle violations. -> [Help 1]
五、以上demo跑通后,也需要自己新建一个使用jsp的web项目,来运行测试下。