内容简介: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 项目:
项目依赖
在 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
:
因此我们可以将 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)
模板文件和静态资源文件的缓存问题
当修改 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 给Markdown添加视频支持
- 为nginx添加SSL支持模块
- PostgreSQL添加了GSSAPI加密支持
- NutzBoot v2.1.5 添加单元测试支持及 ssdb 支持
- Docker Desktop添加对Kubernetes的支持
- Brave 1.19.86 发布,添加本地 IPFS 支持
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。