spring-boot 与 jsp 集成(使用 gradle)

spring-boot 与 jsp 集成(使用 gradle)

spring boot 默认采用 thymeleaf 模板引擎,其默认的配置就支持 thymeleaf 。

然后很多的工程以前就使用 jsp 来编写,切换到 thymeleaf 的代价太大,实在没有必要,在找了网上的一些资料后,做了一下 spring-boot 与 jsp 的集成配置。

整个配置的关键点有几个:

  1. 确定 jsp 目录
  2. 让 spring-boot 采用正确的 view 解析类
  3. 使用支持 jsp 的容器插件

如果以 war 方式打包,应用类需要继承 SpringBootServletInitializer ,才会被容器正确加载。

start.spring.io 下载一个支持 web 的项目骨架代码后,开始进行定制。

确定 jsp 目录

spring boot 默认的模板目录为 src/resources/templates ,而一般遗留项目(包括使用 maven)时,可能会用 WebContentsrc/webapp 目录作为资源目录,然后把 jsp 放到 WEB-INF/jsp 目录下以防止被直接读取。

假设现在放在 src/webapp/WEB-INF/jsp 目录下,因此,首先需要调整相应的配置,在 application.properties (或 application.yml),修改如下:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

这样就能指定从src/webapp 目录加载视图文件,并以 .jsp 作为后缀,这些配置会被 spring boot 中的配置属性 bean WebMvcProperties 接收。

WebMvcProperties 除了视图的前缀、后缀外,还包含日期格式之类的一些配置。

使用正确的 view 解析类

事实上,并不需要显式地配置视图解析类,spring boot 会自动找到合适的试图解析器和解析类。如果打开了 debug ,可见到加载了对应的 bean WebMvcAutoConfiguration

WebMvcAutoConfiguration 这个自动化配置的类中,会配置一个 InternalResourceViewResolver
的 bean :

@Bean
@ConditionalOnMissingBean
public InternalResourceViewResolver defaultViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix(this.mvcProperties.getView().getPrefix());
    resolver.setSuffix(this.mvcProperties.getView().getSuffix());
    return resolver;
}

可见,在缺省情况下,就会创建一个默认的 view resolver 来进行视图的解析。 InternalResourceViewResolver 的构造函数,在发现 classpath 下存在 jstl 类库时,会自动以 JstlView 类作为视图。

public InternalResourceViewResolver() {
    Class<?> viewClass = requiredViewClass();
    if (InternalResourceView.class == viewClass && jstlPresent) {
        viewClass = JstlView.class;
    }
    setViewClass(viewClass);
}

采用支持 jsp 的容器

默认生成的项目结构中,会采用 tomcat 作为嵌入式的容器,但是并没有包含支持 jsp 的组件,因此,需要增加依赖:

runtime('org.apache.tomcat.embed:tomcat-embed-jasper')

如果使用到 jstl ,由于部分容器是不带 jstl 的,因此还需要增加 jstl 的依赖。

compile('javax.servlet:jstl')

运行

最后,汇总一下修改的内容:

  1. build.gradle

    增加 tomcat jasper 和 jstl

     compile('javax.servlet:jstl')
     runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
  2. 修改 application.properties

    修改 prefix 和 suffix

     spring.mvc.view.prefix=/WEB-INF/jsp/
     spring.mvc.view.suffix=.jsp
  3. 编写 jsp 和 controller 类

    controller

     @Controller
     class IndexController {
         @GetMapping("/")
         fun index(): String {
             return "index"
         }
     }

    index.jsp

     <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    
     <html>
     <head>
         <title>Index</title>
     </head>
     <body>
     <h1>Hello, world!</h1>
     </body>
     </html>
  4. 打包运行

posted @ 2018-09-10 17:41 drop * 阅读(...) 评论(...) 编辑 收藏