1. 拦截器
配套视频:【编程不良人】2021年SpringBoot最新最全教程_哔哩哔哩_bilibili
1.1 拦截器介绍
filter 过滤器: 过滤器可以拦截javaweb中请求,进行放行、中断等功能 强大之处: 可以拦截一切资源 .jsp、.html、.css、.img ..... 1.定义: 拦截器类似于javaweb中filter功能,但只能拦截controller相关的请求 2.作用: 将controller中共有代码放入到拦截器中执行,减少controller中代码冗余 3.拦截器特性: 1).拦截器只能拦截controller相关请求 2).拦截器可以中断请求轨迹 3).请求之前如果该请求配置了拦截器,请求会先经过拦截器,拦截器放行之后执行请求的controller,controller执行完成之后会回到拦截器继续执行拦截器中的代码 4.拦截器开发 a.类 implement HandlerInterceptor接口 实现接口的类有默认实现的preHandler、postHandler、afterCompetition方法 preHandler 预先处理方法: 最先执行方法,返回值布尔类型 true:放行请求、fals:中断(后续不再执行) 返回结果为true时执行controller中内容 postHandler 过程中处理: controller返回之后回到postHandler这个方法执行,执行完成这个方法开始响应浏览器 afterCompletion 最后完成: 当响应结束之后会执行拦截器中这个方法内容 b.配置拦截器 springmvc配置方式:mvc:interceptors springmvc.xml springboot 提供了springmvc配置类: WebMvcConfigurer 类 implement WebMvcConfigurer接口{ //覆盖配置拦截器方法 1.使用哪个拦截器 2.拦截器拦截请求 3.排除那些请求 }
1.2 开发拦截器
MyInterceptor1
package com.study.interceptors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @ClassName MyInterceptor1 * @Description 自定义拦截器1 * @Author Jiangnan Cui * @Date 2022/6/4 12:20 * @Version 1.0 */ public class MyInterceptor1 implements HandlerInterceptor { //日志对象 private static final Logger logger = LoggerFactory.getLogger(MyInterceptor1.class); /** * @MethodName preHandle * @Description 最先执行的处理方法 * @param: request 请求对象 * @param: response 响应对象 * @param: handler 当前请求请求的控制器方法对象 XXXController#yyyy * @return: boolean * @Author Jiangnan Cui * @Date 2022/6/4 12:23 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // logger.debug("handler:{}",handler); logger.debug("1"); // response.sendRedirect(request.getContextPath()+"/403.jsp"); return true;//放行 } /** * @MethodName postHandle * @Description 执行控制器方法后执行该方法 * @param: request 请求对象 * @param: response 响应对象 * @param: handler 当前请求请求的控制器方法对象 XXXController#yyyy * @param: modelAndView 视图和模型,当前请求访问方法的ModelAndView对象 * @Author Jiangnan Cui * @Date 2022/6/4 12:26 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // logger.debug("modelAndView:{}",modelAndView);//view="xxx"; model={xxx} // logger.debug("model:{}",modelAndView.getModel()); // logger.debug("view:{}",modelAndView.getViewName()); logger.debug("2"); } /** * @MethodName afterCompletion * @Description 最后执行的方法,该方法类似于finally{}代码块,无论请求是否正确或出现异常总会执行 * @param: request 请求对象 * @param: response 响应对象 * @param: handler 当前请求请求的控制器方法对象 * @param: ex 控制器出现异常时的异常对象 * @Author Jiangnan Cui * @Date 2022/6/4 12:31 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.debug("3"); } }
MyInterceptor2
package com.study.interceptors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @ClassName MyInterceptor2 * @Description 自定义拦截器2 * @Author Jiangnan Cui * @Date 2022/6/4 12:20 * @Version 1.0 */ public class MyInterceptor2 implements HandlerInterceptor { //日志对象 private static final Logger logger = LoggerFactory.getLogger(MyInterceptor2.class); /** * @MethodName preHandle * @Description 最先执行的处理方法 * @param: request 请求对象 * @param: response 响应对象 * @param: handler 当前请求请求的控制器方法对象 XXXController#yyyy * @return: boolean * @Author Jiangnan Cui * @Date 2022/6/4 12:23 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // logger.debug("handler:{}",handler); logger.debug("4"); return true;//放行 } /** * @MethodName postHandle * @Description 执行控制器方法后执行该方法 * @param: request 请求对象 * @param: response 响应对象 * @param: handler 当前请求请求的控制器方法对象 XXXController#yyyy * @param: modelAndView 视图和模型,当前请求访问方法的ModelAndView对象 * @Author Jiangnan Cui * @Date 2022/6/4 12:26 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // logger.debug("modelAndView:{}",modelAndView);//view="xxx"; model={xxx} // logger.debug("model:{}",modelAndView.getModel()); // logger.debug("view:{}",modelAndView.getViewName()); logger.debug("5"); } /** * @MethodName afterCompletion * @Description 最后执行的方法,该方法类似于finally{}代码块,无论请求是否正确或出现异常总会执行 * @param: request 请求对象 * @param: response 响应对象 * @param: handler 当前请求请求的控制器方法对象 * @param: ex 控制器出现异常时的异常对象 * @Author Jiangnan Cui * @Date 2022/6/4 12:31 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.debug("6"); } }
1.3 配置拦截器
package com.study.config; import com.study.interceptors.MyInterceptor1; import com.study.interceptors.MyInterceptor2; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @ClassName MvcConfig * @Description 配置拦截器 * @Author Jiangnan Cui * @Date 2022/6/4 12:34 * @Version 1.0 */ @Configuration public class MvcConfig implements WebMvcConfigurer { /** * @MethodName addInterceptors * @Description 添加拦截器 * @param: registry 注册拦截器 * @Author Jiangnan Cui * @Date 2022/6/4 12:35 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor1()) //指定拦截器 .addPathPatterns("/**") //添加拦截路径,此处拦截所有 .excludePathPatterns("/file/**") //排除/不拦截的路径 .order(1);//指定拦截器执行顺序,参数为int类型数字,默认按照自然排序执行,数字相同时,按照配置顺序先后执行 registry.addInterceptor(new MyInterceptor2()) .addPathPatterns("/**") .excludePathPatterns("/file/**") .order(2); } }
注意:order用来指定多个拦截器的执行顺序,order书写是自然数,按照自然数从小到大顺序执行
1.4 开发控制器
package com.study.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @ClassName InterceptorController * @Description TODO * @Author Jiangnan Cui * @Date 2022/6/4 12:33 * @Version 1.0 */ @Controller @RequestMapping("interceptor") public class InterceptorController { private static final Logger logger = LoggerFactory.getLogger(InterceptorController.class); @RequestMapping("test") public String test(){ logger.debug("test is ok!"); return "success";//此处返回ModelAndView对象,会自动封装,此时只有view:success.jsp } }
1.5 项目目录结构
2. war包部署
配套视频:【编程不良人】2021年SpringBoot最新最全教程_哔哩哔哩_bilibili
2.1 思路
a.执行项目打包的方式为 "war",但默认创建springboot项目打包都是jar 因此需要修改项目的pom.xml: 添加:<packaging>war<packaging> b.去除springboot项目内嵌tomcat依赖 <!--tomcat解析jsp--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!--provided当前idea环境可用,打包不参与打包--> <scope>provided</scope> </dependency> <!--去掉内嵌的tomcat依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> c.在pom.xml的插件(plugins)中配置入口类 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--配置springboot入口类--> <configuration> <fork>true</fork> <!--增加jvm参数--> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <!--指定入口类--> <mainClass>com.baizhi.SpringbootDay6Application</mainClass> </configuration> </plugin> </plugins> </build> d.启动类添加配置 //1.继承SpringBootServletInitializer 不再使用内嵌容器启动,使用外部tomcat容器启动 //2.覆盖configure方法 public class Application extends SpringBootServletInitializer{ public static void main(String[] args) { SpringApplication.run(Application.class,args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } }
2.2 打包部署具体配置
pom.xml设置打包方式为war:
<groupId>com.study</groupId> <artifactId>spring-boot-day6</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-day6</name> <!--指定war包部署--> <packaging>war</packaging> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties>
在pom.xml的插件(plugin)中指定入口类:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--配置springboot入口类--> <configuration> <fork>true</fork> <!--增加jvm参数--> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <!--指定入口类--> <mainClass>com.study.SpringBootDay6Application</mainClass> </configuration> </plugin> </plugins> </build>
排除内嵌的tomcat:pom.xml中修改依赖
<!--tomcat解析jsp--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!--provided表示当前idea环境可用,打包时不参与打包--> <scope>provided</scope> </dependency> <!--去掉内嵌的tomcat依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!--当前idea环境可用,但打包时不参与打包--> <scope>provided</scope> </dependency>
配置入口类XxxApplication
@SpringBootApplication //继承SpringBootServletInitializer:不再使用内嵌tomcat容器启动,使用外部tomcat容器启动 public class SpringBootDay6Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootDay6Application.class, args); } //重写configure方法 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringBootDay6Application.class); } }
2.3 打包测试
打包顺序如下:
打包报错:
D:\Software_Development\JDK\bin\java.exe -Dmaven.multiModuleProjectDirectory=D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6 "-Dmaven.home=C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven3" "-Dclassworlds.conf=C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven3\bin\m2.conf" "-Dmaven.ext.class.path=C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven-event-listener.jar" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar=56634:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven3\boot\plexus-classworlds-2.6.0.jar" org.codehaus.classworlds.Launcher -Didea.version2020.1 -DskipTests=true package [INFO] Scanning for projects... [INFO] [INFO] ---------------------< com.study:spring-boot-day6 >--------------------- [INFO] Building spring-boot-day6 0.0.1-SNAPSHOT [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ spring-boot-day6 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Using 'UTF-8' encoding to copy filtered properties files. [INFO] Copying 1 resource [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.681 s [INFO] Finished at: 2022-06-04T17:29:55+08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project spring-boot-day6: Input length = 1 -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
通过上面报错信息可以发现可能是版本问题(3.2.0),解决办法参考链接:Failed to execute goal org.apache.maven.plugins:maven-resour_二炮的博客-CSDN博客,修改版本如下:
<!--SpringBoot打包依赖--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--在这里修改版本--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> </plugin> <!----> </plugins> </build>
重新打包,编译信息如下:
D:\Software_Development\JDK\bin\java.exe -Dmaven.multiModuleProjectDirectory=D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6 "-Dmaven.home=C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven3" "-Dclassworlds.conf=C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven3\bin\m2.conf" "-Dmaven.ext.class.path=C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven-event-listener.jar" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar=57250:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\plugins\maven\lib\maven3\boot\plexus-classworlds-2.6.0.jar" org.codehaus.classworlds.Launcher -Didea.version2020.1 -DskipTests=true package [INFO] Scanning for projects... [INFO] [INFO] ---------------------< com.study:spring-boot-day6 >--------------------- [INFO] Building spring-boot-day6 0.0.1-SNAPSHOT [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ spring-boot-day6 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ spring-boot-day6 --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 6 source files to D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6\target\classes [INFO] [INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ spring-boot-day6 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ spring-boot-day6 --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ spring-boot-day6 --- [INFO] Tests are skipped. [INFO] [INFO] --- maven-war-plugin:3.3.2:war (default-war) @ spring-boot-day6 --- [INFO] Packaging webapp [INFO] Assembling webapp [spring-boot-day6] in [D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6\target\spring-boot-day6-0.0.1-SNAPSHOT] [INFO] Processing war project [INFO] Copying webapp resources [D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6\src\main\webapp] [INFO] Building war: D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day6\target\spring-boot-day6-0.0.1-SNAPSHOT.war [INFO] [INFO] --- spring-boot-maven-plugin:2.7.0:repackage (repackage) @ spring-boot-day6 --- [INFO] Replacing main artifact with repackaged archive [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 16.423 s [INFO] Finished at: 2022-06-04T17:58:56+08:00 [INFO] ------------------------------------------------------------------------
出现上述提示信息,表示项目打包成功,生成的war包如下:
2.4 部署
1.Linux 安装jdk、安装tomcat、安装数据库、将打包好的war复制到tomcat webapps目录下 双击startup.sh启动 2.Windows 安装jdk后,将打包好的war复制到tomcat webapps目录下 双击startup.bat启动
此处以Windows为例进行说明:
(1)将打包好的war包重命名为springboot.war,复制到tomcat/webapps目录下
(2)双击bin目录下的startup.bat运行项目
出现上面错误是因为8080端口被占用,解决方案参考链接:Tomcat 8080 端口被占用解决方案_Wbbp的博客-CSDN博客_tomcat8080端口被占用怎么解决,可以在conf/server.xml中修改端口号:
保存修改后,继续双击startup.bat启动
出现上述提示,表示项目启动成功。
打开浏览器,访问地址:http://127.0.0.1:8888/springboot/interceptor/test 或者 http://127.0.0.1:8888/springboot/download.jsp 可以访问成功,表示项目部署成功!
3. Jar包部署
配套视频:【编程不良人】2021年SpringBoot最新最全教程_哔哩哔哩_bilibili
3.1 思路
a.<packaging>jar</packaging> 默认就是部署方式就是ja包部署 b.在target目录中获取对应打包好的jar文件 c.启动jar包 java -jar 对应jar文件名字 nohup &(其中,nohup &表示后台直接启动,不要日志) d.注意事项: 1.springboot项目在使用jsp模板时,jar包部署默认无法找到jsp页面,解决办法:修改插件版本为1.4.2,注意只有这唯一一个版本可用 <plugins> <!--版本必须为1.4.2版本--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.2.RELEASE</version> </plugin> </plugins> 2.指定jsp文件打包位置 <!--执行jsp文件打包位置--> <resources> <!-- 打包时将jsp文件拷贝到META-INF目录下--> <resource> <!-- 指定resources插件处理哪个目录下的资源文件 --> <directory>src/main/webapp</directory> <!--指定必须要放在此目录下才能被访问到--> <targetPath>META-INF/resources</targetPath> <includes> <include>**/**</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/**</include> </includes> <filtering>false</filtering> </resource> </resources> e.重新打包测试
3.2 打包部署具体配置
a.pom.xml设置打包方式为jar
<groupId>com.study</groupId> <artifactId>spring-boot-day5</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-day5</name> <!--指定jar包部署,此处不写,直接默认也是jar包部署--> <packaging>jar</packaging> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties>
注意:默认方式也是jar
b.执行打包
d.控制台命令窗口运行项目
jsp页面不能成功加载,注意:springboot在部署jsp时,插件版本必须指定为1.4.2版本,并进行jsp打包配置才可以,其他版本均不支持!!!即:其他版本无法读取到jsp文件
f.修改插件版本:在项目的pom.xml配置文件中build标签中修改
<build> <plugins> <!--jar包打包maven-plugin版本必须为1.4.2版本--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.2.RELEASE</version> </plugin> <!--在这里修改maven-resources-plugin版本--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> </plugin> </plugins> </build>
h.指定jsp打包配置:在项目的pom.xml配置文件中build标签中加入resources配置
<build> <plugins> <!--jar包打包maven-plugin版本必须为1.4.2版本--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.2.RELEASE</version> </plugin> <!--在这里修改maven-resources-plugin版本--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> </plugin> </plugins> <resources> <!-- 打包时将jsp文件拷贝到META-INF目录下--> <resource> <!-- 指定resources插件处理哪个目录下的资源文件 --> <directory>src/main/webapp</directory> <!--指定必须要放在此目录下才能被访问到--> <targetPath>META-INF/resources</targetPath> <includes> <include>**/**</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/**</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
重新打包部署测试即可!
重新clean报错:
Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:3.2.0:clean (default-clean) on project spring-boot-day5: Failed to clean project: Failed to delete D:\Software_Development\IDEA_code\SpringBoot\spring-boot-day5\target\spring-boot-day5-0.0.1-SNAPSHOT.jar
原因:jar包正在被占用,无法使用,需要在资源任务管理器关闭Java(TM) Platform SE binary,再重新clean即可
Windows控制台部署运行: 打开浏览器访问路径:http://localhost:8888/spring-boot-day5/upload.jsp
上传文件后:
以上均测试成功,表示项目部署成功!