spring:
开源的(可以查看源代码),免费的,轻量级的(依赖的jar少)
IOC AOP
框架:代码的半成品
spring两个重要部分:
1.IOC AOP
2.控制反转和面向切面编程
spring是一个一站式的框架
三层框架
1.表示层:springMVC
2.业务逻辑层:spring ioc
3.数据访问层:提供了一个JDBCTemplate
spring的控制核心思想 IOC AOP
IOC:控制反转 将创建对象的权利交给spring管理,管理bean的生命周期。
AOP: 面向切面编程,面向对象编程
耦合度(依赖于高,关联度高)
spring提供的版本:xml,工厂,反射
spring 事务
声明式事务(hibernate)
/*spring环境搭建步骤
导包
配置spring的配置文件
spring的配置文件放到src下,名称任意
*/
使用spring
1.加载spring的配置文件(测试是否集成成功)
ApplicationContext con=new ClassPathXmlApplicationcationContext(“xml的名字”)
2.再来从xml调用getBean里的id
user user=(user)con.getBean(“user”);//强转为一个user类
user.add();//(就可以调用user里的东西了)
DI: 依赖注入,Spring管理bean与bean之间的关系
spring创建对象
1.bean标签模式
给属性赋值有多少种方法
1.set方法赋值
property
字符串 value
对象赋值 ref–引用另一个对象
list
string[]
map
2.构造方法赋值
//啃死chua kete
2.bean静态工厂模式
方法:
给属性赋值
用构造方法给属性赋值
DI:依赖注入
ref:引用另一个对象
生命周期:(scope属性调用)
singleton:单实例对象(默认是单实例)
prototype:多实例对象
request:在一次HTTP请求中,一个bean定义对应的一个实列
session:在一次HTTP Session中,一个bean定义对应一个实列
SpringORM:对象关系映射
SpringAOP:核心内容
SpringCore:核心包
sessionStatus使用例子:
@RequestMapping(“test2”)
public ModelAndView totest2(SessionStatus status){
ModelAndView mv=new ModelAndView();
//isComplete 只用于销毁modelAndview中放session中的值
//如果session没销毁
if (!status.isComplete()) {
//就让session销毁
status.setComplete();
}
mv.setViewName(“forward:/index.jsp”);
return mv;
}
静态代理模式:
代理一种借口,创建一个被代理接口的一模一样的对象出来,调用方法的时候,可以修改代码
动态代理模式(InvocationHandler):
可以代理任何接口,创建一个被代理接口的一模一样的对象出来,调用方法的时,可以修改代码
日志功能:调用现在这个方法的同时把另一个方法也调用出来 、
Aop术语:
连接点:可以添加新功能方法
切入点:真正添加日志的功能的方法
增强/通知:新添加的功能
切面:将日志的功能添加到切入点的过程
异常通知参数:Throwable
环绕通知参数:ProceedingJoinPoint 再用参数名调用proceed(前进的意思)
前置通知:在调用切入点方法之前执行
后置通知:在调用切入点方法之后执行
环绕通知:在调用方法之前执行一次,方法执行之后执行
异常通知:切入点方法出现异常,会执行这个方法
spring 管理事务
声明式事务
只需要声明即可,不需要使用代码
xml配置
配置事务的步骤
1.配置事务管理器
2.配置增强(事务),事务增强,spring
3.配置切面
注解版本
配置事务的步骤
1.配置事务管理器
2.开启事务注解
3.在需要添加事务的类上添加注解
每一个action方法都可以访问到
spring mvc让所有的controller和handler方法都可以访问到
事务只读:只能用到查询身上,增删改不能使用只读事务
springmvc也是让所有的controller/handler方法都可以访问到
BS架构执行流程(BS 浏览器到服务器 CS客户端到服务器)
处理器映射器(handlerMapping):配置文件中中配置
处理器适配器(handleradpter):执行controller方法
controller返回ModelAndView
视图解析器:得到真正的视图
视图渲染:将数据存储作用于中
springmvc 执行原理
BS 执行流程 B 浏览器 到 S服务器
CS cient 客户端 到 S服务器
springmvc执行流程
(请求)
1.前段控制器
2.处理器映射
3.处理器适配器
4.controller方法
5.视图解析器
BS MVC(model view controller)三层框架
(“fowrd”,“hello”)
forward:转发 地址栏不发生变化,request 作用域中的值没有丢失
redirect:重定向 重定向 地址栏发生变化,request 作用域中的值丢失
转发和重定向不经过视图解析器,不用加前缀和后缀
@Requestparam 直接接受前台参数
defaultValue :默认值
required=true 是否必须指定
简单参数
对象作为参数
spring mvc对象作为参数, 前台页面上直接写对象里面的属性就可以了
复杂的数据类型
数组
声明数据类型 数据名和前台页面上的name属于一致
集合
不能直接在参数中声明,在实体类中声明
获取前台参数
1.直接接受前台参数
@requestParam(name=“跟前台保持一致”)随机写一个名称
2.类 类型
前台页面的name属性和实体类中的属性名保持一致,就可以封装
复杂的数据类型
数组 名称一致即可
集合 名称一致,但是需要在实体类中
@ModelAttribute
1.指定存在作用域的键值
2.将类对象直接存储在作用域中存储的时候键是类的名称首字母小写(回显)
Model和ModelMap两个作用一样
@CookieValue:浏览器中的一个文本 键值对形式存在
@RequestHeader:浏览器中的一个文本 键值对形式存在
@SessionStatus:发到session里面
spring mvc 不支持string类型换成date类型因为日期的格式是多种多样的
然后提供了转换接口提供了转换器,将string类型转成date类型
requestScope:默认存储的作用域是request取值
sessionScope:默认存储的作用域是session取值
ssionAttributes:作用就是讲ModelAndView中的数据绑定到session作用域范围内
国际化
1.让spring 开启国际化
2.创建语音包
3.使用国际化
springmvc支持校验
1.导包hibenrate
2.在spring.xml配置localValidatorFactoryBean 供应商hibernate
3.<mvc:annocation-driven validator=""/>
4.使用校验
(NotEmpty Pattern)
1.在实体类中添加校验器
2.在controller方法中,要校验的对象钱,添加@Validated。BindingResult
5.判断是否校验出错,将错误信息显示的页面上
springmvc校验支持国际化
1.localValidatorFactoryBean配置国际化属性
validationMessageSource=“国际化的bean”
2.在实体类中,校验的message属性变成{key}
分组校验:
1.创建接口,表示组 登录,注册
2.指定校验器属于哪一组,在校验器里面添加属性groups
3.在controller方法@validated()指定校验组
自定义校验
1.创建一个校验
属性@Constraint(validatedBy = {PhoneValidator.class})
2.创建校验规则 类实现ConstrainValidator
3.使用校验:注解名
上传
1.spring mvc 支持上传
2.spirng 上传
getOriginalFilename() 文件名
restFul :前段控制器如果是 / 静态资源会被拦截,必须放过静态资源
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
restful格式
1.在web配置 /
2.在路径上{占位符}
3.注解@pathVariable
spring mvc 实现拦截器
1.创建一个类,实现一个拦截器接口,handlerlnterceptor
2.spring mvc配置拦截器
springmvc 拦截器里面三个方法的使用时机?
1. preHandler:controller方法执行之前
2.postHandler:controller方法执行之后,返回modelAndview方法之前
3.afterCompletion:controller方法执行之后
enctype="multipart/form-data”(多文件格式)
拦截器:
<!-- 配置拦截器,可以设置拦截路径 -->
<!-- <mvc:interceptor> -->
<!-- 映射路径 **为通配符 多个路径使用多个 /目录/目录 -->
<!-- <mvc:mapping path="/**"/> -->
<!-- 放行的时候(放行方法),需要写全部的路径 记得加/-->
<!-- <mvc:exclude-mapping path="/findall"/>-->
<!-- <mvc:exclude-mapping path="/getmenu"/>-->
<!-- 拦截器 Bean -->
<!-- <bean class="cn.baisi.Interceptpor.Interceptpor"></bean> -->
<!-- </mvc:interceptor> -->