Spring Boot 添加 JSP 支持

栏目: JSP · 发布时间: 7年前

内容简介:Spring Boot 添加 JSP 支持

Spring MVC 支持多种模板技术 包括 JSP FreeMarker Thymeleaf 等

Spring Boot 官方并不推荐使用 JSP 模板引擎 如果有可能 应尽量避免使用 JSP 因为当使用嵌入式 Servlet 容器时 对使用 JSP 模板引擎有几个已知的限制 以下是 Spring Boot 支持自动配置的模板引擎(其中并不包含 JSP):

  • FreeMarker
  • Groovy
  • Thymeleaf
  • Mustache

环境

  • JDK 8
  • Maven 3
  • IntelliJ IDEA 2016
  • Spring Boot 1.5.2.RELEASE

项目结构

创建一个普通的 Java 项目:

Spring Boot 添加 JSP 支持

项目依赖

pom.xml 配置文件中添加内嵌 Tomcat 容器依赖 scope 声明为 provided:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-tomcat</artifactId>
 <scope>provided</scope>
</dependency>

pom.xml 配置文件中添加 JSP 编译依赖 否则启动报错:

<dependency>
 <groupId>org.apache.tomcat.embed</groupId>
 <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

完整的 pom.xml 配置:

<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>
 <groupId>org.fanlychie</groupId>
 <artifactId>spring-boot-with-jsp</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>war</packaging>
 <name>spring-boot-with-jsp</name>
 <url>http://maven.apache.org</url>

 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.5.2.RELEASE</version>
 </parent>

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <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>
 </dependency>
 </dependencies>

 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>

</project>

虽然是普通 Java 项目 其中 packaging 一定要声明为 war 类型 否则打包运行出错

<packaging>war</packaging>

控制器

@Controller
public class WelcomeController{

 @GetMapping("/")
 public String welcome(ModelMap model){
 model.put("message", "Welcome guys!");
 return "welcome";
 }

}

主应用程序类

@SpringBootApplication
public class Application{

 public static void main(String[] args){
 SpringApplication.run(Application.class);
 }

}

JSP

src/main/webapp/WEB-INF/jsp/welcome.jsp

<%@ page pageEncoding="UTF-8" %>
<html>
 <head>
 <title>欢迎页</title>
 <link href="/css/main.css" rel="stylesheet" />
 </head>
 <body>
 <h1>${message}</h1>
 </body>
</html>

CSS

Spring Boot 默认将静态资源文件映射到类路径下的目录包括:

  • /META-INF/resources/
  • /resources/
  • /static/
  • /public/

org.springframework.boot.autoconfigure.web.ResourcesProperties

Spring Boot 添加 JSP 支持

因此我们可以将 css js images 等静态资源文件放在 /src/main/resources/static/ 目录下

src/main/resources/static/css/main.css

body {
 padding: 0;
 color: #444;
 width: 222px;
 margin: 100px auto;
 font-family: SimSun;
 background-color: #FBFBFB;
 text-shadow: rgba(50,50,50,0.3) 2px 2px 3px;
}

application.properties

上面提到 Spring Boot 中使用 JSP 模板引擎有几个已知的限制 Spring Boot 对 JSP 模板引擎没有提供自动配置的支持 因此需要在 src/main/resources 目录中创建一个 application.properties 属性配置文件 并添加以下两行配置信息

src/main/resources/application.properties

# 页面前缀的目录
spring.mvc.view.prefix:/WEB-INF/jsp/
# 页面后缀的名称
spring.mvc.view.suffix:.jsp

运行

直接运行 Application 中的 main 方法 或者通过 maven 执行 mvn spring-boot:run

 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v1.5.2.RELEASE)

2017-04-02 23:50:26.397 INFO 12900 --- [ main] org.fanlychie.Application : Starting Application on FANLYCHIE-PC with PID 12900 (F:\dev\workspace\idea\spring-boot-with-jsp\target\classes started by fanlychie in F:\dev\workspace\idea\spring-boot-with-jsp)
2017-04-02 23:50:26.399 INFO 12900 --- [ main] org.fanlychie.Application : No active profile set, falling back to default profiles: default
2017-04-02 23:50:26.439 INFO 12900 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@2bea5ab4: startup date [Sun Apr 02 23:50:26 CST 2017]; root of context hierarchy
2017-04-02 23:50:27.739 INFO 12900 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-04-02 23:50:27.749 INFO 12900 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
2017-04-02 23:50:27.750 INFO 12900 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.11
2017-04-02 23:50:27.924 INFO 12900 --- [ost-startStop-1] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2017-04-02 23:50:27.927 INFO 12900 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2017-04-02 23:50:27.927 INFO 12900 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1490 ms
2017-04-02 23:50:28.046 INFO 12900 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2017-04-02 23:50:28.051 INFO 12900 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-04-02 23:50:28.051 INFO 12900 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-04-02 23:50:28.051 INFO 12900 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-04-02 23:50:28.051 INFO 12900 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2017-04-02 23:50:28.262 INFO 12900 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@2bea5ab4: startup date [Sun Apr 02 23:50:26 CST 2017]; root of context hierarchy
2017-04-02 23:50:28.320 INFO 12900 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[GET]}" onto public java.lang.String org.fanlychie.controller.WelcomeController.welcome(org.springframework.ui.ModelMap)
2017-04-02 23:50:28.322 INFO 12900 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-04-02 23:50:28.322 INFO 12900 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-04-02 23:50:28.345 INFO 12900 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-04-02 23:50:28.345 INFO 12900 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-04-02 23:50:28.378 INFO 12900 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-04-02 23:50:28.566 INFO 12900 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-04-02 23:50:28.640 INFO 12900 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-04-02 23:50:28.644 INFO 12900 --- [ main] org.fanlychie.Application : Started Application in 2.536 seconds (JVM running for 2.87)

Spring Boot 添加 JSP 支持

模板文件和静态资源文件的缓存问题

当修改 css js 等静态资源文件的内容或模板文件的内容时 刷新客户端浏览器 发现内容还是老的 说明 Spring Boot 内置的 Servelt 容器并没有实时重新加载修改过的文件内容 你只能在每次修改静态资源文件时 虽然不需要重启服务 但是你要重新编译一次 IntelliJ IDEA 中按一次 Ctrl + F9 即可

若想实现热加载(live reload)可参考:

解决 IntelliJ IDEA 无法热加载 Spring Boot 模板文件和静态资源文件

打包运行

执行打包命令 得到 spring-boot-with-jsp-1.0-SNAPSHOT.war

关于部署 不能直接将 war 包部署到独立的 Tomcat 服务中 这样会找不到静态资源文件 关于这个问题 我做了多种尝试 然而还没有找到有效的解决方法

这里我们可以通过命令行 java -jar 的方式启动 首先打开 Terminal:

执行 java -jar target/spring-boot-with-jsp-1.0-SNAPSHOT.war

Spring Boot 添加 JSP 支持


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

挑战编程技能

挑战编程技能

Brian P. Hogan / 臧秀涛 / 人民邮电出版社 / 2017-2 / 39.00元

新手程序员在具备了理论基础后,面对实际项目时,往往不知道如何解决问题;有经验的程序员在学习了一门新语言后,也会有很多不知道如何使用的特性。针对程序员的这一普遍困惑,资深软件工程师Brian P. Hogan在这本书中总结了57道练习题,教他们如何锤炼技能。这些练习题的难度会逐渐增加,使得编程训练充满挑战又乐趣多多。一起来看看 《挑战编程技能》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具