Springboot整合jsp分享
总结一下Springboot整合jsp的详细步骤
总结一下Springboot整合jsp和Thymeleaf共存的详细步骤
一、整合步骤
SpringBoot前端如果要使用jsp了话,需要在pom文件中加入以下依赖。
1、Springboot工程导入两个依赖
<!-- 用于编译jsp springboot tomcat jsp 支持开启-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!--jstl的支持,c标签-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>compile</scope>
</dependency>
2、视图解析器识别jsp(配置文件配置视图属性)
#Spring boot视图配置(文件所在路径和文件类型)
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
3、在main文件夹下创建webapp文件夹,
1)然后在src/main/webapp下创建WEB-INF文件夹,以后的jsp文件就放在WEB-INF下面。(也可自定义文件夹名称,要在配置文件中指明路径)
2)然后点击Modules,找到web选项。(没有则点击+新建一个)
2.1 点击右边的“-”,这是Spring boot项目,不需要web.xml文件,直接删除即可。(如果没有就不要管,跳过)
2.2 点击中间的+号,(如果有就先-掉,或者修改)点击+号后选中webapp的路径(main下的webapp路径),这一步多说一下,这一步是指向jsp文件的根目录,这一步设置之后你点击webapp文件夹右键创建的时候才会在上面出现jsp的创建选项
3)文件夹中间有个小点了,被识别出来了,就可以右键新建jsp文件了
4)然后就可以请求访问了
重点:main启动时访问不了页面的,需要通过maven启动
避坑:
注意:main启动或者debug启动,如果启动用一直报404,可以用maven命令 spring-boot:run 启动,为啥?
[1] 官网文档中说:在打包为jar后,大多数构建工具不会打包webapp目录,而SB项目都是打包为jar,官方文档也说尽量避免使用jsp。解决办法就是使用maven命令启动,不会对功能有任何影响
二、springboot整合jsp运行方式
以下三种方式均可正常运行。
1、spring-boot:run 启动
使用命令 maven clean spring-boot:run或者使用idea的maven插件运行均可。
2、打成war包
设置pom.xml文件packaging属性应该为war。
<groupId>org.landy</groupId>
<artifactId>spring-boot-lesson-4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
执行打包命令 maven clean package
执行运行war包命令 java -jar war包名称
3、外部tomcat部署方法
确保provided 没有被注释。(provided表明该包只在编译和测试的时候用)
Spring Boot内嵌的Servlet API运行时由tomcat提供,需要在运行时剔除。
修改 SpringBootLesson4Application
类,需要继承 org.springframework.boot.web.support.SpringBootServletInitializer
,然后实现其configure方法,具体内容为return builder.sources(本类类名.class);(注意,这里不能是this,this是一个类的实例,而xxx.class是类的模板)。
外部容器部署的话,就不能依赖于Application的main方法启动了,而是要依赖于类似servlet的web.xml的方式来启动Spring的应用上下文了。此时需要继承SpringBootServletInitializer
并实现configure方法。
打包:maven clean package
放在tomcat下的webapp目录,重命名即可。
三、SpringBoot中jsp页面和Thymeleaf页面共存
导入thymeleaf和jsp的依赖
<!-- 用于编译jsp springboot tomcat jsp 支持开启-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!--jstl的支持,c标签-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>compile</scope>
</dependency>
<!--thymeleaf整合JSP需要用到下面的依赖-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
1、在WEB-INF下新建两个文件夹存各自的页面
2、配置文件导入thymeleaf的配置,jsp的不用导入
spring:
thymeleaf:
cache: false
suffix: .html
prefix: /WEB-INF/html
3、自定义一个视图解析器
package com.example.demo.controller;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
/**
* 主要配置多视图实现的视图解析器相关bean实例,将该视图解析器注册到容器中
*
* 其实关键点在于两个:
* 1、配置order属性:视图解析器优先级问题(就是决定先使用哪个解析器来解析视图)
* 2、配置viewnames属性(配置对应的视图解析器解析哪些格式的视图)
*/
@Configuration
public class ViewResolverConfiguration {
@Configuration//用来定义 DispatcherServlet 应用上下文中的 bean
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
//jsp页面的视图解析器,解析到webapp下的jsp/目录下查找对应的jsp页面
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
resolver.setViewNames("*");//这里是设置该视图解析器所要匹配哪些格式的视图“*”代表匹配所有格式“
resolver.setOrder(2);//优先级,Spring配置多个视图解析器,数字越小,优先级越高,越先匹配
return resolver;
}
/**
* 下面都是配置hymeleaf的视图解析器相关的内容
* 对thymeleaf的视图解析器,解析到webapp下的html目录下查找对应的页面
* @return
*/
@Bean
public ITemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setTemplateMode("HTML5");
templateResolver.setPrefix("WEB-INF/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("utf-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
// templateEngine
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolverThymeLeaf() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("utf-8");
viewResolver.setOrder(1);//设置该视图解析器优先级为1
//下面是设置该视图解析器所要匹配哪些格式的视图"html/*", "vue/*","jsps/*","templates/*"代表匹配"html/*", "vue/*","jsps/*","templates/*"格式的所有视图
viewResolver.setViewNames(new String[]{"html/*", "vue/*","jsps/*","templates/*"});
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 配置资源路径
* @param registry
*/
// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
// registry.addResourceHandler("/img/**").addResourceLocations("/img/");
// registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/" + "/static/");
// }
}
}
4、编写一个controller访问请求
@Controller
public class indexController {
@GetMapping("/jsp")
public String jsp(){
System.out.println("index");
return "jsp";
}
@GetMapping("/thy")
public String thy(){
System.out.println("thy");
//html文件夹下的thy页面
return "html/thy";
}
}
5、效果
注意:配置的路径和/不能错