Spring Boot 添加 JSP 支持

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

内容简介: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 支持


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

查看所有标签

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

利用Python进行数据分析

利用Python进行数据分析

Wes McKinney / 唐学韬 / 机械工业出版社 / 2013-11-18 / 89.00

【名人推荐】 “科学计算和数据分析社区已经等待这本书很多年了:大量具体的实践建议,以及大量综合应用方法。本书在未来几年里肯定会成为Python领域中技术计算的权威指南。” ——Fernando Pérez 加州大学伯克利分校 研究科学家, IPython的创始人之一 【内容简介】 还在苦苦寻觅用Python控制、处理、整理、分析结构化数据的完整课程?本书含有大量的实践案例,......一起来看看 《利用Python进行数据分析》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试