🍡系列文章🍡
🚀🚀🚀 前导课笔记
🍕 ✨JavaWeb学习笔记01BS架构 Maven Tomcat Servlet
🍔 ✨JavaWeb学习笔记02
request和response
🍟 ✨JavaWeb学习笔记03
JSP MVC
🌭 ✨JavaWeb学习笔记04cookie与session
🚀🚀🚀 Spring以及SpringMVC入门
🍕 ✨Spring入门1Spring框架[Bean的注入]
🍔 ✨Spring入门2Spring框架[拦截器与maven进阶]
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、拦截器
1.概念
拦截器跟过滤器其实不一样
我们来看看一个完整的业务流程来区分一下拦截器和过滤器,拦截器其实是用来在SpringMVC中动态拦截控制器方法的执行,如下图问号的地方
由于归属不同,SpringMvc提供的功能在拦截器里面是可以轻松操作的,可能在过滤器里面就不太方便操作
拦截器主要在控制器前后执行
入门案例
步骤1–在controller包中创建一个interceptor包中的类ProInterCeptor【继承HandlerInterceptor说明这是拦截器】
这里放在controller包中的好处是,不用单独再让SPringmvc再扫描一次,因为上面SpringMVC已经扫描了contriller包了
/**
* 拦截器
*/
@Component
public class ProInterCeptor implements HandlerInterceptor {
//拦截之前运行的代码
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("hello");
return true;//这里执行的是逻辑拦截,flase可以终止拦截操作
}
//拦截之后运行的代码
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("bye");
}
// 拦截之后的之后运行的代码
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("end");
}
}
步骤2–配置执行什么样的请求时拦截器会执行【在Support中配置】,因为我们这里controller的文件路径是book
所以当我们请求是book或是book/*的时候就可以拦截
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
/**
* 过滤静态资源
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
}
/**
* 拦截器配置 -- 这里的意思是请求当访问book路径的时候 就执行拦截
*/
@Autowired
private ProInterCeptor proInterCeptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//这里是你加的哪种拦截器,bean注入
registry.addInterceptor(proInterCeptor).addPathPatterns("/book","/book/*");
}
}
步骤总结【相当于声明一个拦截器bean,然后用配置类的方法把拦截器加载上,并告诉ta什么时候除法拦截器】
简化开发
执行流程
效果图
拦截器参数
通常只有第一个最常用,第三个的异常可以使用自定义异常来处理
拦截器链
当有三个拦截器时,假如pre2是false,那么post3,2,1都不执行,after3,2不执行,但是由于pre1是true的,after1还是会执行【下图蓝色线条】【即pre是true的话after必然执行或者说false前面的pre和after会执行】
多拦截器配置如下
@Autowired
private ProInterCeptor proInterCeptor;
@Autowired
private ProInterCeptor2 proInterCeptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//这里是你加的哪种拦截器,bean注入
registry.addInterceptor(proInterCeptor).addPathPatterns("/book","/book/*");
registry.addInterceptor(proInterCeptor2).addPathPatterns("/book","/book/*");
}
二、Maven进阶
1.分模块开发
在一个大项目中,商品的实体类可能要用订单【别人项目中】的实体类,就需要共享domain包中的实体类,我们能不能把这个东西做成像jar包一样共享使用呢?
这里就需要分模块开发【方便模块间相互调用】
效果如下图,我们把ssm_maven项目中的pojo包和dao包单独拉出来做成一个模块
我们要怎么操作呢?
随便找个地方创建新模块,使用maven创建,但不选择从原型中创建
这里注意创建的模块父项为None,模块要直属于项目,【假设Spring_02_Maven为总项目,我们要创建一个名字为name的模块】注意下图位置蓝色的部分区域,ide会自动创建直属于模块的模块,因此我们要删掉
工件作为坐标第一个默认为com.公司名称
这样子就创建好了模块了
下面以及黑马程序员视频例子来继续介绍
【这里要把domain单独拉出来做为一个模块】
我们只需要在新模块中创建同名包,然后把Book剪切过去即可,之后旧模块maven_02_ssm的domain包就可以删掉了
接下来,我们会发现旧模块中用到Book的类会爆红,要怎么办呢?我们就需要到新模块【pojo】的依赖了
新模块的坐标其实就在新模块的pom文件中,如下
从旧模块中导入新模块的依赖即可
其实真正开发的时候都是各做各的模块,然后把别人的依赖导进来
好了,现在我们直接运行,发现报错【新模块的jar包找不到】
我们去看看其他依赖是否已经导入,在maven的本地仓库中找,其实还是能找到的,但是本地仓库中我们没有发现新模块【pojo】的jar包
【因为本地仓库压根没有这个坐标,所以报错,只是IDEA识别到了【所以不暴红?】所以我们需要把新模块的依赖手动安装到本地仓库中
【点击maven生命周期里面的install即可】之后在maven本地仓库中就可以找到jar包了
疑难杂症
安装完了即可运行
下面,我们尝试给dao包分模块【按照上面步骤,我们把BookDao拉到新建的模块中】发现book和Insert爆红,这里的book其实也要引用pojo的依赖
关于select的注解就需要引用数据库和mybatis的模块
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
而后,原来模块中引用dao的依赖【记得把dao的模块install,把依赖安装到仓库去】
依赖传递
我们来看依赖传递
下面红色部分的那个依赖有一些子依赖,表示它下面又依赖了一些东西,
这里可以看到,ssm_maven中直接依赖了pojo,也间接通过dao依赖了pojo,所以这里其实可以直接把直接依赖去掉
【依赖的优先级】
假如要查看依赖的关系,可以点击下图绿色图片来查看
可选依赖和排除依赖
可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源不具有依赖传递性
排除依赖是隐藏当前资源对应的依赖关系
假如我Dao中用到一个依赖x版本1.0,同时不想给ssm_maven模块知道我用了什么模块【就是说等ssm_maven模块使用这个依赖的时候要再导包一次】,我可以在Dao中隐藏这个x1.0模块,【dao用的依赖不想给别人用】
假如Dao是别人的公司做好的依赖【里面有不适用我现在开发的依赖】,又无法直接修改别人的依赖,那么我们可以在ssm_maven引用Dao的依赖时候把那个不适合的模块排除掉【用了别人的东西,发现不想用,可以排除掉】
聚合
现在我们开发的依赖如下
修改了一个模块之后,不知道依赖这个模块的其他模块是否能正常使用
此处参考博客
现在要改为聚合的形式【当一个模块修改了,整个项目需要同时进行构建】
聚合
最后在聚合工程中install
步骤
回顾一下
项目的打包方式:
jar:默认情况,说明该项目为java项目
war:说明该项目为web项目
pom:说明该项目为聚合或继承(后面会讲)项目
继承
在上面模块中,这些模块中的依赖很不少是重复的,【假如要修改版本,会很麻烦】这些可以简化吗?
假如有一个父工程,只需要用子工程去继承父工程就能使用父工程的依赖,那么只用把依赖都写到父工程中就可以了
继承:描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
步骤
<!-- 打包方式为pom, 聚合工程-->
<packaging>pom</packaging>
<!-- 设置管理的模块的名称 -->
<modules>
<module>../ssm_maven</module>
<module>../ssm_maven_dao</module>
<module>../ssm_maven_pojo</module>
</modules>
<dependencies>
可以简化配置和减少版本冲突
可以看到
<!-- 可选依赖,就是子项目继承了之后可以选择是否使用这个依赖-使用的话就手动导包,但是不用写版本号 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
自定义属性
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
资源文件加载属性
假如我们要把jdbc.properties配置文件的数据也如同上面一样去配置,直接把数据写在pom文件中,然后 jdbc.properties 通过${jdbc.url}的格式去加载pom的数据
配置文件在旧模块中,而这里在聚合模块中书写pom
<!-- 自定义属性-->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<!-- 自定义属性 之后要让配置文件使用的话需要扩大范围 如果不扩大范围的话这里的配置智能在pom中使用 -->
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=false</jdbc.url>
</properties>
<build>
<!-- 扩大范围 -->
<resources>
<resource>
因为这里是在父项目里面写的,所以可以使用${project.basedir}找到子项目的resources
<directory>${project.basedir}/src/main/resources/</directory>
扩大范围-告诉resources里面的文件也可以引用pom的数据
<filtering>true</filtering>
</resource>
</resources>
</build>
多环境开发
【maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境】
<!-- 配置多环境 -->
<profiles>
<!-- 开发环境 -->
<profile>
<id>env_dep</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=false</jdbc.url>
</properties>
<!-- 是否为默认环境 -->
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<!-- 生产环境 -->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db?useSSL=false</jdbc.url>
</properties>
<!-- 是否为默认环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db?useSSL=false</jdbc.url>
</properties>
<!-- 是否为默认环境 -->
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
配置好之后直接使用命令启动不同的环境即可!
总结
以上,就是spring中拦截器的使用以及maven进阶的一些知识内容,感谢你的观看QAQ