框架总结

Spring核心:
控制反转:DI(依赖注入)
1、setter注入
给需要注入的属性生成set方法
xml中配置注入对象(service)和被注入对象(dao)的bean
在注入对象的bean中使用property(只针对set方法)来引入被注入对象
name:set方法去掉set之后首字母小写的名字
ref:被注入对象的bean标签的id属性的值
2、构造器注入
生成有参构造器
xml中配置注入对象(service)和被注入对象(dao)的bean
在注入对象的bean中使用constructor来引入被注入对象
index:参数的下标,如果只有一个参数可以写,默认是从0开始
如果constructor是按照参数的顺序去写的,那么index可以省略
ref:被注入对象的bean标签的id属性的值
value:基本数据类型
name:参数名称
3、注解注入
@Autowired(默认通过类型去匹配)
在xml中添加打开注解的开关
<context:annotation-config />
在xml中配置需要注入的对象和被注入对象(只需要配置对象,不用配置属性信息)
在类中的需要注入的对象上方添加@Autowired
@Component(@Controller @Service @Repository)
==>
@Controller:控制层Servlet
@Service:业务层
@Repository:持久层
在类的上面添加上@Component
在xml中配置注解扫描
<context:component-scan base-package=“com.soft”/>
@Component修饰的类,在注入之后的ID值默认为类名的首字母小写;
也可以自定义类名,@Component(“name”)
面向切面:
代理的作用:在原有逻辑不变的基础上,增加新的功能。
基于注解
常用注解:
@Before:前置增强
@AfterReturning:后置增强
returning属性可以接收方法的返回值,需要在代理类中的方法发的参数中
写上Object并且Object后面名称要与returning属性的名字保持一致
@Around:环绕增强 ,方法返回值必须是Object
@AfterThrowing:异常抛出时的增强
@After:最终增强,相当与try-catch-finally中的finally
@Aspect:用在类上,用来标识这个是一个增强类
@Pointcut:定义切点表达式
基于注解的实现方式
1、配置事务管理器
2、将datasource注入到事务管理器中




3、@Transactional
类的上:整个类的所有方法都需要添加事务
方法上:该方法需要添加事务
4、tx:annotation-driven/开启事务注解
如果类上和方法上都有@Transactional,默认先使用方法上的注解。
mybatis的动态sql:
:自动删除多余的and/or
:test判断
:
collection:list/array
item:代表集合或者数组中的对象的别名
separator:以固定的字符分割循环中的值
open:以固定字符开始
close:以固定字符结束
index:下标
mybatis中插入数据返回主键
在insert标签之中使用标签来返回主键
mybatis的最主要功能:
1:将xml(或注解)和参数映射为sql交给jdbc去执行
2:对于查询,将jdbc查询出的结果集映射为对象,将映射好的对象返回给用户
mybatis传入数据为空问题:(无效列类型)
在#{}中的值的后面写上“,jdbcType=Type”
mybatis处理返回Map中空值,丟失问题:
在配置中加上



Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
Mybatis一对一、一对多的关联查询(高级映射resultMap) :



select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}












select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}














Mybatis中一级缓存和二级缓存:
一级缓存:sqlSession
用户在做查询操作的时候,先从一级缓存中查询,如果有了,直接返回给用户,如果没有:
判断下二级缓存是否开启,开启了从二级缓存中查询,查到返回给用户,查不到:发送sql到数据查询,
将返回的结果分别放到一级和二级缓存
二级缓存:SqlsessionFactory 默认不开启
放整个项目的共享数据
Mybatis分页插件:
使用PageHelper ph=new PageHelper();
ph.startPage(1,2);设置当前页和每页显示条数
查询操作后从PageInfo中取得结果集
Mybatis中#{}和KaTeX parse error: Expected 'EOF', got '#' at position 19: …区别是什么: #̲{}是预编译处理,{}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
Servlet执行流程:
客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,
并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,
当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。
SpringMVC的执行流程:
springMVC是由dispatchservlet为核心的分层控制框架。
首先客户端发出一个请求web服务器解析请求url并去匹配dispatchservlet的映射url,
如果匹配上就将这个请求放入到dispatchservlet,dispatchservlet根据mapping映射配置去寻找相对应的handel,
然后把处理权交给找到的handel,handel封装了处理业务逻辑的代码,
当handel处理完后会返回一个逻辑视图modelandview给dispatchservlet,
此时的modelandview是一个逻辑视图不是一个正式视图,
所以dispatchservlet会通过viewresource视图资源去解析modelandview,
然后将解析后的参数放到view中返回到客户端并展现。
Struts工作流程:
a) 客户端发出一个请求到servlet容器
b) 请求经过一些列过滤被filterdispatcher调用,filterdispatch通过actionMapper去找相对应的action。
c) Actionmapper找到对应的action返回给filterdispatch,dispatch把处理权交给actionproxy
d) Actionproxy通过配置文件找到对应的action类
e) Actionproxy创建一个actionIinvocation的实例处理业务逻辑
f) 一旦action处理完毕,actioninvocation负责根据stuts.xml的配置找到对应的返回结果。返回结果通常是jsp页面。
SpringMVC导入导出:
jar
poi -> xls
poi-ooxml -> xlsx
导出
1、创建workbook
2、创建sheet
3、创建行
4、创建单元格
5、给单元格赋值
6、将workbook交给ServletOutPutStream输出到页面
response.setHeader(“content-disposition”, “attachment;filename=user”+suffix);
导入
1、读取文件流,创建workbook
2、读取sheet
3、读取行
4、读取单元格
5、读取单元格的值
6、封装数据
7、插入数据库
Servlet上传下载:
上传:
1、要上传的文件
req.getPart(name);获取文件的所有信息
req.getHeader();通过header获取文件名 fileName
2、目的地(放在web-inf,为的是不让轻易访问)
/web-inf/upload
req.getServletContext().getRealPath("/WEB-INF/upload") 路径名
路径 + fileName = 文件的完整路径
part.wirte(文件的完整路径);
不可取 D:*****\wtpwebapps\ServletDemo\WEB-INF
取相对路径,获取该项目所在的路径
*****
上传文件的必要要求:
form表单中要加一个属性:enctype=“multipart/form-data”
servlet类中需要加一个注解:@MultipartConfig
下载:
1、文件名
在url中拼接filename(注册成功,放到数据库中,查询的时候可以查出来,方法到req,通过el表达式获取)
2、文件存放的路径
req.getServletContext().getRealPath("/WEB-INF/upload");
路径 + filename = 完整路径
File file = new File(完整路径)
new FileInputStream(file)
byte[] b = new byte[available()]
// 设置resp的头信息
resp.setHeader(“content-disposition”, “attachment-file;filename=” + filename);
resp.getOutputStream().write(b);

SpringMVC上传下载
上传:
1、form表单中必须添加enctype=“multipart/form-data”
2、请求必须是post
SpringMVC中配置
jar
commons-fileupload-1.3.3.jar
commons-io-2.2.jar
1、form表单中必须添加enctype=“multipart/form-data”
2、请求必须是post
3、在控制层方法中添加参数:MultipartFile
4、通过参数MultipartFile操作
getBytes();// 获取byte数组
getSize();//获取文件大小
getInputStream();// 获取输入流
transferTo(new File(“d://a.jgp”));// 把文件写入磁盘
5、在springmvc配置文件中添加上传的文件解析器







blob:二进制类型
clob:大字符类型
下载
原理:
把数据通过ServletOutputStream响应到浏览器的过程
要求设置头信息
content-disposition
attachment;filename=xxx
SpringMVC配置
1、在控制层方法上添加返回值:ResponseEntity<byte[]>
2、获取文件(byte数组)
从数据库中读取
mapper映射文件返回类型:requestType="[B"
从磁盘读取
FileInputStream.read(byte[])
3、设置头信息
setContentDispositionFormData(“attachment”, “fileName”);
4、返回ResponseEntity<byte[]>
T body
传的是文件的字节数组
MultiValueMap<String, String> headers
头信息
HttpStatus status
状态码:OK(200)
ResponseEntity<byte[]>(byte[], headers, HttpStatus.OK)

ModelAndView的两作用:
1:指定返回页面
2:在返回页面的同时添加属性
转发(forward)和重定向(Redirect):
1:转发url是不变的,重定向url地址是会变成目标地址
2:转发可以传值,重定向不可传值
3:转发不能访问本工程以外的路径,重定向可以访问本工程以外的路径
拦截器和过滤器的区别:
1:拦截器是基于java的反射机制的,过滤器是基于函数回调
2:拦截器不依赖于servlet容器,过滤器依赖与servlet容器
3:拦截器只能对action请求起作用,过滤器则可以几乎所有的请求起作用
4:拦截器可以访问action上下文,值栈里的对象,而过滤器不能
5:在action的生命周期中,拦截器可多次调用,过滤器只能在容器初始化时被调用一次
jsp与servlet的相同点与不同点及联系:
相同点:jsp,servlet本质上都是java类
不同点:jsp侧重视图,servlet主要用于控制逻辑
联系:jsp是servlet技术的扩展,本质上就是servlet的简易方式
jsp的作用域:
request一次请求,
session所在的浏览器,如果浏览器不关闭,则一直存在默认的session生命周期30分钟,
application:作用在服务器,如果服务器不关闭,则一直存在
pagecontext:作用于一个页面
session的清理和清容区别:
session清理缓存是指按照缓存中对象的状态的变化来同步更新数据库,清空是session的关闭
Struts2怎么从单例模式变成双例模式:
Struts2默认为单例模式,可在类上面加上注解@Scope("")改为双例模式
list遍历

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值