Java程序员Spring入门2【拦截器与分模块开发】

🍡系列文章🍡

🚀🚀🚀 前导课笔记
🍕 JavaWeb学习笔记01 BS架构 Maven Tomcat Servlet

🍔 JavaWeb学习笔记02 request和response

🍟 JavaWeb学习笔记03 JSP MVC
🌭 JavaWeb学习笔记04 cookie与session


🚀🚀🚀 Spring以及SpringMVC入门
🍕 Spring入门1 Spring框架[Bean的注入]
🍔 Spring入门2 Spring框架[拦截器与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

查看更多文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值