You are here

整合JSP

 

JSP

引入依赖

<!--WEB支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--jsp页面使用jstl标签-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

<!--用于编译jsp-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

application.properties or yml配置(已测试不行)

需要在配置文件中配置jsp路径。

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

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

添加JSP路径

jsp必须放在\src\main\webapp\WEB-INF\jsp 里,放在其它路径不行,比如: src/main/resources:  META-INF/resources, resources, static, public

@Configuration
public class MyWebAppConfigurer implements WebMvcConfigurer {

@Bean
public InternalResourceViewResolver defaultViewResolver()
{
   InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
   viewResolver.setViewClass( JstlView.class );
   viewResolver.setPrefix( "/WEB-INF/jsp/" );
   viewResolver.setSuffix( ".jsp" );
   return viewResolver;
}
}

本地开发和打包war,注意<scope>provided</scope>。无法打包成jar,因为jar不含webapp这个目录。启动应用必须用
mvn clean spring-boot:run
否则访问jsp会有404 error
参照:
 Spring Boot干货系列:(五)开发Web应用之JSP篇

 

 

静态资源

默认资源映射

Spring Boot对静态资源的默认扫描路径是:

classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
读取的优先级如下:
src/main/resources
    META-INF/resources > resources > static > public

如果把所有js css全部放在 比如classpath:/static之下不分层级,访问没有问题。但如果static下含子文件夹,那么spring无法扫描,所以需要添加配置类将路径加入。
如果将static置于传统webapp之下,也需要手动添加配置类。
Ref:Spring Boot无法访问css,js等静态资源的问题

添加静态资源路径

通过代码修改:

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("/static/").addResourceLocations("classpath:/static/"); 
}

}

 

但是WebMvcConfigurerAdapter已经deprecated,千万不能用WebMvcConfigurationSupport替换,而是要用WebMvcConfigurer接口。否则static resource会一直404无法访问。

@Configuration
public class MyWebAppConfigurer implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("/static/").addResourceLocations("classpath:/static/"); 
}

}

如果一个资源放在classpath:/static/里,那么访问路径可以省略static:
http://localhost/static/test/test.js OK
http://localhost/test/test.js OK

使用外部目录

如果我们要指定一个绝对路径的文件夹(如 H:/myimgs/ ),则只需要使用 addResourceLocations 指定即可。

// 可以直接使用addResourceLocations 指定磁盘绝对路径,同样可以配置多个位置,注意路径写法需要加上file: registry.addResourceHandler("/myimgs/**").addResourceLocations("file:H:/myimgs/");

 

通过配置文件配置

Spring Boot也为我们提供了可以直接在 application.properties(或.yml)中配置的方法。 

# 默认值为 /**
spring.mvc.static-path-pattern=
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开,

 

使用webjars

Spring Boot 静态资源处理

 

 

打包

注意:如果你的应用将被打包成jar,那就不要使用src/main/webapp文件夹。尽管该文件夹是一个共同的标准,但它仅在打包成war的情况下起作用,如果产生一个jar,多数构建工具都会静悄悄的忽略它!所以根据需要进行配置

如果要将最终的打包形式改为war的话,还需要对pom.xml文件进行修改,因为spring-boot-starter-web中包含内嵌的tomcat容器,所以直接部署在外部容器会冲突报错。这里有两种方法可以解决,如下方法一

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
      <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
      </exclusion>
  </exclusions>
</dependency>

在这里需要移除对嵌入式Tomcat的依赖,这样打出的war包中,在lib目录下才不会包含Tomcat相关的jar包,否则将会出现启动错误。
还有一个很关键的关键点,就是tomcat-embed-jasper中scope必须是provided。

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

因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有这个javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了。这个关键点同样适应于下面说的第二种方法。

方法二
直接添加如下配置即可:

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

这种方式的好处是,打包的war包同时适合java -jar命令启动以及部署到外部容器中。

 

 

为什么整合jsp后必须通过spring-boot:run方式启

SpringBoot(四):静态资源的访问和配置
Spring Boot 静态资源处理
Serving Static Web Content with Spring Boot