Spring Boot 添加 JSP 支持

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

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


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

查看所有标签

猜你喜欢:

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

无界

无界

(美)艾米莉·内格尔·格林(Emily Nagle Green) / 卞斌 / 机械工业出版社 / 2011-5 / 39.00元

"数十亿人身在其中、数十万亿美元的新生意,你我此生最大的科技革命,这次转型将如何改变我们的生活? 又如何使我们做生意的方式起革命性的变化? 无界会比你所想更快降临,将创造数兆美元的新价值。你的行动够快吗?这本放眼未来的著作,结合专家的洞见、战术性工具,以及扬基集团独有的无界趋势数据,提供你需要的一切。" 未来的世界和企业,会走向无界的状态,也就是人、构想和产品经由一张全球性的数字......一起来看看 《无界》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

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

UNIX 时间戳转换