![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SSM框架学习笔记
文章平均质量分 61
天上的云川
博客分享积累,记录成长,欢迎讨论
展开
-
Spring中的事件监听
案例分析引入事件监听首先我们假定一个场景,我们此时有一个登录的功能,根据用户名和密码进行登录。然后此时想要添加一个新的功能,如果一个用户登录成功就给这个用户发送短信提醒该用户(正常情况是异地登录才会发送短信提醒,这里为了简化需求,只要登录就发送短信提醒用户)我们先来看一种实现方式:// 注意这里是伪代码public void login(String username, String password) { if(根据username查看数据库当中是否有这个用户) { 获取这个用户的数据库中的原创 2022-05-16 20:21:38 · 3895 阅读 · 6 评论 -
springMVC执行流程
博客原文地址 超链接因为担心下次找不到了,所以复制一下,方便以后复习SpringMVC执行流程:用户发送请求至前端控制器DispatcherServletDispatcherServlet收到请求调用处理器映射器HandlerMapping。处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。DispatcherServlet根据处理器Handler获取处理器适配器转载 2021-03-24 21:00:41 · 85 阅读 · 0 评论 -
spring的aopxml配置中的环绕通知为什么要在对应的方法中加入ProceedingJoinPoint这个类作为参数
问题:为什么spring的aop配置中的环绕通知需要在通知的方法加入一个ProceedingJoinPoint参数,并且为什么要调用getArgs()和proceed(Object[] args)方法呢?陈述:我们可以先来分析前置通知和后置通知,以及最终通知和异常通知。前面说的这四种通知类型,都是能直接锁定通知在程序执行时执行的位置的。为什么这么说呢?比如前置通知,这个通知能够准确定位到它应该执行的位置,是因为它并不用关心我们通知本身的内容,他只要在对应的切入点表达式的位置前执行就可以了;后置原创 2021-03-24 17:02:47 · 678 阅读 · 0 评论 -
动态代理
这里我们拿代理商、生产商、我,三个角色举例子,首先编写我们的生产商类,该类中有一个销售方法,和一个售后方法作为代理商,它有一个选择生产厂家的准则,而这个准则在我们的java程序中就是接口所以这个时候,Producer类如果像作为代理商的生产商的话,就必须达到这个要求,也就是实现这个接口然后我们编写我们的消费者类,也就是我这个角色按照平时我们,如果想购买东西,那么我们会直接去找生产商购买,如果我们想要找代理商来购买东西的话,就要使用动态代理了动态代理的特点字节码随用随创建,随用随加载原创 2021-03-21 18:55:34 · 321 阅读 · 0 评论 -
spring中的c命名空间和p命名空间是什么?
p命名空间spring中的p命名空间就是为了更加方便的使用set方法注入属性内容举例说明:User实体类public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; }原创 2021-03-21 18:18:41 · 2150 阅读 · 1 评论 -
搭建整合环境
环境准备1、创建数据库和表结构 create database ssm; use ssm; create table account( id int primary key auto_increment, name varchar(20), money double );2、创建maven工程配置pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org原创 2021-01-28 14:21:22 · 176 阅读 · 0 评论 -
SpringMVC的拦截器
拦截器的概述SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。拦截器和过滤器的功能比较类似,有区别:①过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。② 拦截器是SpringMVC框架独有的。③过滤器配置了/*,可以拦截任何资源。④拦截器只会对控制器中的方法进行拦截,如果访问的是 jsp,html,css,image 或者 js 是不会进原创 2021-01-28 10:05:34 · 118 阅读 · 0 评论 -
SpringMVC的异常处理
异常处理思路Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理springMVC的异常处理1、首先编辑自定义的异常类,用于提示用2、改写原先可能报错的controller将可能报错的地方使用trycatch包裹起来,然后再将catch抛出我们自己创建的异常,在这个异常中传递进去我们想要提示的信息,此时该方法如果报错,就将我们定义的这个异常抛出去,如果我们像显示自定义的异常中存储的信息的话,就原创 2021-01-27 18:33:33 · 307 阅读 · 0 评论 -
SpringMVC实现文件上传
文件上传回顾SpringMVC传统方式文件上传SpringMVC跨服务器方式文件上传原创 2021-01-26 18:53:31 · 4017 阅读 · 0 评论 -
响应数据和结果视图
返回值分类1、返回值是字符串Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器解析为物理视图的地址。转换为物理视图地址就是实际上执行时访问的地址图片说明 逻辑地址物理视图地址:举例示范jsp页面controller类中的方法跳转的成功页面执行成功注意:访问WEB-IND中的pages包中的success.jsp时地址栏并不发生改变看到了185...原创 2021-01-25 12:02:12 · 186 阅读 · 0 评论 -
springMVC常用注解
@RequestParam该注解用于参数前1、作用:把请求中指定名称的参数给控制器中的形参赋值2、属性value:请求参数中的名称。required:请求参数中的属性必须和value或者name相同,否则运行报错。默认值:true。表示必须提供相同的属性值,如果不提供将报错。举例示范当我们的请求参数属性为name,但是我们的控制器接中的形参名为username时,我们想接收到这个参数,该怎么办?此时请求参数时传不进来的,这是我们需要使用 @RequestParam注解了@Req原创 2021-01-24 11:49:44 · 237 阅读 · 0 评论 -
获取Servlet原生的API
如何在控制器中使用原生的ServletAPI对象只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象原创 2021-01-24 10:08:28 · 112 阅读 · 0 评论 -
自定义类型转换器
1原创 2021-01-23 12:00:43 · 351 阅读 · 0 评论 -
请求参数的绑定
请求参数的绑定说明1、绑定机制表单提交的数据都是k=value格式username=haha&password=123SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的要求:提交表单的key和参数的名称是相同的2、支持的数据类型基本数据类型和字符串类型实体类型(JavaBean)集合数据类型(List、map集合等)基本数据类型和字符串类型jsp页面为controller页面为点击超链接后得到传递的参数参数绑定实体类对原创 2021-01-23 11:53:58 · 187 阅读 · 0 评论 -
@RequestMapping注解
@RequestMapping注解的作用及用法该注解的作用为:用于请求URL和处理请求方法之间的对应关系,该注解的用法为查看该注解的源码得知,该注解可以作用于方法上也可以作用于类上,当我们假设请求的url为/user/test的时候我们可以把方法所在的类注解为一级目录/user,然后对应的方法为二级目录/test举个例子:@RequestMapping注解的属性这里不全部介绍value属性和path属性作用相同,用于请求URL和处理请求方法之间的对应关系,查看源码得知他们两个原创 2021-01-23 10:12:23 · 263 阅读 · 0 评论 -
springMVC入门案例
入门程序的需求:搭建开发环境我们在创建项目的时候maven选择骨架为webapp首先配置pom.xml,由于我的jdk是1.9的所以要设置项目构建时的jdk版本,并且指定默认的spring 的版本<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.9</maven.comp原创 2021-01-22 12:04:54 · 96 阅读 · 0 评论 -
spring基于注解的声明式事务控制
配置事务管理器开启spring对注解事务的支持在需要使用事务支持的地方使用@Transactional注解该注解的属性用于控制事务原创 2021-01-21 11:09:01 · 131 阅读 · 0 评论 -
spring基于XML的声明式事务控制
首先再我们的ioc容器中配置事务管理器的bean对象然后给事务管理器中注入数据源然后配置事务通知,此时我们需要重新导入事务的约束,因为一开始我们没有导入aop和tx的约束<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"原创 2021-01-21 11:03:31 · 103 阅读 · 0 评论 -
JdbcTemplate使用介绍
jdbctemplate使用步骤原始步骤创建数据源创建JdbcTemplate对象将数据源传入JdbcTemplate对象使用JdbcTemplate对象执行sql语句但是同样我们呢可以看到,这样的写法依赖性很高我们可以使用spirng的ioc容器来降低这样的高依赖性使用ioc容器配置的方式的步骤创建jdbctemplate的bean给jdbctemplate的bean注入datasource创建datasource的bean给datasource的bean注入所需数据(用原创 2021-01-20 12:07:20 · 987 阅读 · 0 评论 -
spring基于注解的aop配置
@Aspect该注解用于声明切面,用于声明当前被修饰的类为切面,该注解中只有一个value属性,用于配置当前切面的唯一标识@Pointcut()该注解用于配置通用的切入点表达式,该注解的括号中填写需要的切入点表达式,并且该注解用于修饰方法的,如果表达式中有参数的话就在方法中加参数如果想调用该切入点表达式的话就填写方法名pt1()@Before()该注解用于配置前置通知,括号中填写切入点表达式,如果想调用通用的该切入点表达式的话就填写方法名,比如上一个例子的pt1()@AfterReturni原创 2021-01-19 12:03:09 · 270 阅读 · 0 评论 -
四种常用的通知类型及优化重复的切入点表达式
xml配置前置、后置、异常和最终通知前置通知在切入点方法执行之前执行后置通知在切入点正常执行之后执行异常通知在切入点方法执行产生异常之后执行最终通知无论切入点方法是否正常执行,他都会在其后面执行但是这样的切入点表达式过于繁琐解决重复的切入点表达式问题如何解决呢?使用<aop:pointcut id="唯一标识" expression="重复的切入点表达式"></aop:pointcut>"示例如下注意当我们的<aop:pointcut>标签写原创 2021-01-19 11:14:56 · 188 阅读 · 0 评论 -
切入点表达式的写法
1、关键字execution(切入点表达式)2、表达式的格式访问修饰符 返回值 包名.包名...类名.方法名(参数列表)标准的表达式写法public void com.hegong.service.impl.AccountServiceImpl.saveAccount()全通配写法:* *..*.*(..)给被代理对象的所有方法都加上通知3、表达式写法细节访问修饰符可以省略返回值可以使用通配符,表示任意返回值例如* com.hegong.service.impl.AccountSe原创 2021-01-19 09:35:30 · 876 阅读 · 0 评论 -
spring基于xml的aop
我们有一个utils包,该包中有一个Logger类,该类有一个模拟打印日志的方法如果我们想要每一次在执行业务层的方法前都执行该类的打印日志的方法,我们应该怎么办呢?业务层接口如下业务层实现类如下很简单我们只需要利用动态代理的方式,动态代理业务层的实现类,动态增强该实现类中的切入点方法,实现在执行接口中的方法前执行打印日志的这个方法就可以了,但是这样很不方便,那我们如何使用spring的xml配置来实现这个功能呢?使用spring的xml配置实现首先导入spring-aop的xml配置的依赖原创 2021-01-18 20:31:48 · 182 阅读 · 0 评论 -
spring中的AOP
AOP概述什么是aop百度百科的介绍是------在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。aop的作用及优势aop在程序运行期间,在不修改源原创 2021-01-18 11:23:46 · 80 阅读 · 0 评论 -
分析事务问题并编写CounnectionUtils
我们有如下代码该方法是一个转账的方法,如果当我们在这段代码中故意加上一个错误时会发生什么事情呢?当执行测试前数据库中的账户信息如下执行代码后控制台报错(意料之中)然后查看数据库发现转账出现问题了,我们第一时间想到的肯定是没有加事务管理,才导致的,但是真的是这样吗?我们的更新操作和查询操作,都需要事务管理才能进行,不然就会出现事务回滚,但是更新操作和查询操作我们都可以成功执行,这说明我们是存在事务管理的,那为什么还会出现这种情况呢?这是因为我们每次使用查询更新的方法后,都会创建一个新的原创 2021-01-16 11:22:11 · 150 阅读 · 0 评论 -
spring中的junit问题
我们的单元测试代码中为什么明明我们使用注解注入了成员变量,但是运行后还是显示空指针异常呢?首先我们要明白应用程序的入口时main方法,那为什么junit单元测试中没有main方法也能执行呢?因为junit中集成了一个main方法,该方法可以判断当前测试类中有拿写方法有@Test注解,junit就会让有@Test注解的方法执行而junit是不会管我们是否采用了spring的,所以在执行代码时也就不会为我们读取配置文件或者配置类来创建spring的核心容器了这就是为什么我们使用了注解注入成员变量但原创 2021-01-16 09:42:03 · 207 阅读 · 0 评论 -
spring的新注解
新注解如果我们只根据之前的所学的注解的话,会发现,这些注解只能作用于我们自己所写的类上,而且无论如何都还是需要一个xml文件配置,一些基本信息这时候我们引入了这两个注解@Configuration该注解用于指定某个类为配置类,@Compontent该注解用于通过注解指定spring在创建容器时要扫描的包,它和xml配置文件中的作用相同,该注解的属性中有两个分别为value、basePackages,这两个属性就是用来配置要扫描的包的全限定名称的,用于指定spring创建容器时要扫描的包原创 2021-01-15 11:13:38 · 293 阅读 · 1 评论 -
spring注解配置
注解配置分为四类1、用于创建对象的注解@Component该注解的作用就和再xml配置文件中的bean标签的作用时一样的,就是用于把当前类对象存入spring容器当中查看该注解的源码发现,有一个value属性该value属性用于指定bean的id,当我们不写的时候,它默认值是当前类名并且首字母小写...原创 2021-01-14 11:50:37 · 757 阅读 · 0 评论 -
spring的依赖注入
什么是依赖注入?依赖注入的全名为Dependency Injection,依赖关系的维护就称之为依赖注入,能注入的数据有三类:基本类型和String、其他bean类型(在配置文件中或者注解配置过的bean)、复杂类型(也叫集合类型),注入的方式有三种:使用构造函数提供、使用set方法提供、使用注解提供依赖的注入1、构造函数的注入构造函数的注入我们需要使用constructor-arg标签,该标签使用的为止是在bean标签内部,该标签中的属性都有,如下五个type:用于执行要注入的数据的数据类型,原创 2021-01-13 11:29:59 · 557 阅读 · 2 评论 -
spring对bean对象的管理细节
创建bean对象的三种方式使用默认构造函数创建在spring配置文件中使用bean标签,配以id和class属性后,且没有其他属性和标签时。采用的就是默认构造创建bean对象,此时如果类中没有默认构造函数,则对象无法创建就像这样如果我们的要创建的bean对象的默认构造函数没有的时候,我们在使用这种方式创建bean对象的话就会出现无法被实例化的错误,这就是由于没有默认构造导致的使用工厂中的普通方法创建对象(使用某个类中的普通方法创建对象,并存入spring容器)假设我们在使用jar包的时候,原创 2021-01-12 21:29:06 · 222 阅读 · 0 评论 -
核心容器的两个接口引发的问题
ApplicationContext:他在构建核心容器的时候,创建对象采取的策略是采用立即加载的方式,也就是说,只要一读取完配置文件就立即创建配置文件中配置的对象BeanFactory:它在构建核心容器时,创建对象采取的策略时采用立即加载的方式,也就是说,什么时候我们根据id获取对象了,什么时候才真正的创建对象。...原创 2021-01-12 11:53:47 · 62 阅读 · 0 评论 -
如何获取核心容器对象?
我们如何获取核心容器对象呢?通过核心容器对象ApplicationContext的三个实现类来获取该核心容器对象ClassPathXmlApplication:它可以加载类路径下的配置文件,要求配置文件必须在类路径下,不再的话加载不了FileSystemXmlApplication:它可以加载粗盘任意路径下的配置文件(必须有访问权限)AnnotationConfigApplicationContext:它是用于读取注解创建容器的第一种获取核心容器对象的方式 ApplicationContex原创 2021-01-12 11:31:01 · 268 阅读 · 0 评论 -
spring中的ioc
为什么ioc叫做控制反转?百度百科的解释是控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。拿我们之前的代码举例,我们的AccountServ原创 2021-01-12 11:07:20 · 92 阅读 · 0 评论 -
以前代码中的问题
案例环境目录由于这里我们没有创建web工程,所以ui包代表web工程中的存放servlet的包,内容分别如下dao包中的接口dao包中的接口的实现类service包中的接口service包中的接口的实现类ui包中的Client类,我们可以看到其实这就是我们最开始学习web过程中最基本的结构,但是这有着一个致命的问题问题1:耦合性太高这样很强的耦合性就让我们代码的独立性很差,这是由于什么导致的呢?这是由于像这样使用new关键字创建对象导致的,如果当我们删除一个类后他就会原创 2021-01-11 12:09:18 · 245 阅读 · 0 评论 -
什么是程序的耦合性?
程序的耦合性指的就是程序之间的依赖关系,包括类之间的依赖关系、方法之间的依赖关系,而解耦就是降低程序之间的依赖关系。我们在实际开发中应该做到编译期不依赖,运行时才依赖类之间解耦的思路:使用反射来创建对象,而避免使用new关键字通过读取配置文件来获取要创建的对象全限定类名...原创 2021-01-11 09:24:48 · 1786 阅读 · 0 评论 -
mybatis的注解配置的特殊点
注解配置中如何起别名?使用 Results和Result注解来解决起别名的问题@Results(id=" ",value={ @Result(id=true,column=" ",property=" "), @Result(column=" ",property=" "), @Result(column=" ",property=" "),})Results注解中的id为唯一标识,方便其他方法使用起的别名,其他方法想使用这一组别名的话,只需要配置@ResultMap(value原创 2021-01-09 11:12:26 · 206 阅读 · 0 评论 -
mybatis中的缓存
一、缓存的基本概念1、什么是缓存?存在于内存中的临时shuju2、为什么使用缓存?减少和数据库的交互次数,提高效率3、什么样的数据能使用缓存,什么样的数据不能使用缓存?适用于缓存:经常查询并且不经常改变,而且数据的正确与否对最终结果影响不大的不适用于缓存的:经常改变的数据,数据的正确与否对最终结果影响很大的,例如:商品的库存、银行的汇率二、mybatis中的一级缓存和二级缓存1、一级缓存它指的是Mybatis中SqlSession对象的缓存。当我们执行查询之后,查询的结果同时会存入到原创 2021-01-08 11:30:32 · 76 阅读 · 0 评论 -
一对一实现延迟加载
实现一个账户对应一个 用户,加载的时候实现延迟加载1、封装数据库表对应的实体类配置账户表的JavaBean类public class Account implements Serializable { private Integer id; private Integer uid; private double money; private User user; public User getUser() { return user;原创 2021-01-08 10:23:32 · 121 阅读 · 0 评论 -
延迟加载和立即加载的概念
在一对多的多表查询当中,当我们有一个用户,它有100个账户。问题1在查询用户的时候,要不要把关联的账户查出来?很显然最合适的做法应该是,我们需要谁就查询出来谁,而不是说在查询用户的时候,关联的账户也被查出来。当我们的用户对象只有一个,但是关联的账户信息有一千个,而我们只想查询一个用户信息,但是因为关联了账户信息所以也把一千个账户信息加载出来了,这样看来这种操作是非常浪费资源的由此引入了延迟加载延迟加载真正在使用数据时才发起查询,不使用的时候不查询。也称之为按需加载(懒加载)问题2在原创 2021-01-08 09:52:32 · 342 阅读 · 0 评论 -
mybatis中的多表查询
表之间的关系有几种一对多:一个用户可以有多个订单,用户和订单间的关系就是一对多的关系多对一:多个订单属于同一个用户,订单和用户之间的关系就是一个多对一的关系一对一:一个人只能由一个身份证号,一个身份证号只能属于一个人,人和身份证号之间的关系就属于一对一多对多:一个学生可以被多个老师交过,一个老师可以交多个学生,老师和学生之间就是多对多特例:如果拿出每一个订单,他都只能属于一个用户。所以mybatis就把多对一看成了一对一mybatis中的多表查询示例:账户和用户一个用户可以有多个账户原创 2021-01-06 21:30:23 · 553 阅读 · 0 评论