SpringMVC框架浅淡
一.什么是springMVC
Spring公司推出的一款表现层的框架
二.springMVC的作用
a).接收请求和参数
b).将处理好的数据返回给指定的页面(指定页面的位置,将数据返回到页面展示)
三.springMvc的三大组件:处理器映射器,处理器适配器,视图解析器
Springmvc框架结构图(图片来自互联网)
1.需要程序员编写的组件:处理器handler也就是我们写的controller, 视图view也就是我们写的页面jsp
2.在项目中可以不配置处理器映射器和处理器适配器也可以正常使用, 但是每次请求都会去springMvc包下面找默认的配置文件dispatherServlet.properties, 去里面的处理器映射器和处理器适配器列表中, 逐个对比匹配执行,这样代码执行效率下降. 所以我们需要手动配置处理器映射器, 处理器适配器, 这样就不去找默认的配置文件了, 就直接去执行我们配置的组件.加快代码执行效率
3.springMvc在web.xml中的配置
/* 在springMvc中不起作用, 禁止使用
*.action 凡是以.action结尾的url都会进入到DispatcherServlet, DispatcherServlet会放行所有资源
/ 所有路径只要含有/的url路径都可以进入到DispatcherServlet, DispatcherServlet会放行.jsp结尾的文件, 但是其他文件
比如.css, .js, .jpg, .png等静态资源都不放行, 都被DispatcherServlet拦截住.
4. 注解驱动和注解扫描区别:
a.都需要配置,
b.注解扫描是使@Controller注解生效
c.注解驱动: 相当于手动配置最新版的注解形式的处理器映射器和处理器适配器, 可以加快代码执行效率.
d.视图解析器: 可以不配置但是controller方法中就要写页面的完整路径, 如果配置了视图解析器, 可以少写页面的路径的位置, 方便开发编码
e.springMvc.xml中需要配置的内容有: 注解扫描,注解驱动,视图解析器
四.SSM整合
1.dao层(单一职责原则)
mybatis的映射文件,接口文件,pojo类.通过****自动生成
SqlMapConfig.xml是mybatis的核心配置文件
applicationContext-dao.xml 数据源,连接池,会话工厂,mapper包扫描
2.service层:
applicationContext-service.xml @Service包扫描
applicationContext-trans.xml 配置事务(事务为保证数据的一致性,)
3.controller层:
springMvc.xml 注解扫描,注解驱动,视图解析器
4.web.xml
spring监听器,springMvc前端控制器
五.参数绑定(就是controller方法可以接受的参数类型)
1.SpringMvc默认支持的类型:
可在controller方法上按照需求自主加上的参数:HttpServletRequest,HttpServletResponse,HttpServletSession,Model;
2.简单数据类型:
String,Double,Float,Integer,boolean等,要求接受变量的名称必须和页面上input框的name属性值相同;
3.Pojo类型和Pojo包装类型:
要求页面上input框的name属性值必须等于pojo中的属性.属性.属性.....
4.自定义绑定类型
也叫作converter自定义转换器,因为SpringMvc可以自动帮我们转换简单类型的参数,对于像date日期类型和字符串之间的转换就需要我们自己手动转换, springMvc无法转换,就需要自己编写自定义转换器来完成.其实就是在controller方法接收到真正参数之前, 对参数进行类型预处理.
5.数组类型的参数绑定
使用场景:批量删除;
即可以在controller方法中直接接受数组,也可以将数组封装到vo的pojo里来接受,要求接受的变量名称必须等于页面复选框的name属性;
6.List类型参数绑定
使用场景:批量修改;
controller方法中无法直接接受List,需要将List封装到pojo中,集合的变量名称[循环的下标],集合中泛型的属性名称必须等于页面input框name的属性值;
六.Struts2和SpringMvc的区别:
1.Struts2有被SpringMvc取代的趋势;
2.Struts2:
前端控制器使用strutsPreparedAndExcuteFilter,是一个过滤器;
接受参数:采用模型驱动,也就是全局变量接受参数,因为全局变量线程不安全,所以struts的action采用多例的模式;
返回数据:采用值栈;
3.SpringMvc:
前端控制器采用DispatcherServlet,是一个servlet;
接受参数:采用方法级别的局部变量来接收参数,用完就销毁,线程安全,所以SpringMvc中的controller默认使用的是单例的;
返回数据:SpringMvc返回数据时用的是model,model底层采用的是Request域,所以SpringMvc返回数据用的是Request域;
七[email protected] 注解的使用
1.用在controller方法上:
作用:标记url到请求方法的映射,其实就是通过它指定的一段url找到需要执行的方法对象,
2.用在类上:
作用:为防止controller方法的url重复,所以在类上多加一层
3.限制请求类型:
作用:如果不进行配置,任何请求都可以访问,如果限制了请求类型,则只有规定的类型才可以访问到此方法;
eg:@RequestMapping(value = "/list", method = RequestMethod.POST)
八.Controller方法返回值
1.ModelAndView模型和视图
将返回的数据放入model中,可以返回给页面
view中记录了页面的位置
2.String:
a.返回字符串:
返回的字符串就是页面的位置
返回的数据可以借用默认参数model返回给页面
b.请求转发:(跳转到本类或其他类的方法使用)
特点:浏览器中的url地址不变,request域中的数据可以带到转发后的方法中;
规则:在SpringMvc中的请求转发,是返回的字符串,以"forward:"开头后面加上转发的url地址;
c.重定向:(跳转到本类或其他类的方法使用)
特点: 浏览器url地址发生改变, request域中的数据不能带到重定向后的方法中.
规则: 在springMvc中重定向, 是返回的字符串以"redirect:"开头后面加上重定向的url地址
重定向如果想将数据发送到重定向后的方法中可以借助于model, model虽然底层使用的request域,但是它内部对request域进行了扩展.
d.相对路径与绝对路径:
在springMvc中的请求转发和重定向中,在forward:和redirect:后面的url路径以斜杠/开头的是绝对路径, 不以斜杠/开头的就是相对路径
①.相对路径: 相对于当前路径, 如果当前路径计算失误, 那么相对路径有可能错误.
②.绝对路径: 绝对路径从项目名后开始算, 不管在什么时候使用绝对路径不会出错
4.void
一般情况不使用这个返回值, 都是在ajax异步提交的时候使用.
如果使用返回值为void, 那么返回页面的地址只能借助于原生的request或者是response;使用原生的request和response, 那么视图解析器不起作用, 所以页面要写完整的路径名称;这样就破坏了springMvc的体系流程, 不建议使用
九.SpringMvc中异常处理
作用: 异常是无尽的, 让用户看到500, 503体验不好, 所以需要从项目整体架构上hold住异常.
异常类型:
运行时异常, 就是bug
自定义异常, 就是代码都正确, 但是违反正常企业业务逻辑.
十.图片上传处理
springMvc对于图片上传的支持只有接口没有实现, 可以使用第三方实现, Fileupload
接收图片可以在controller方法中使用MultipartFile接口来接收, 接收的变量名称必须等于页面上上传域的name属性值
十一.Json数据交互
springMvc对json的支持只有接口,没事实现,我们可以用第三方实现(杰克逊实现),jackson.jar
将json格式字符串自动转换成java对象?
@RequestBody注解可以将传入的json格式字符串自动转换成pojo对象, 要求json的key必须等于pojo对象中的属性名称
将java对象自动转换成json格式字符串返回?
@ResponseBody注解可以将controller方法的返回值自动转换成json格式字符串返回.
十二.Springmvc实现Restful
其实restful就是对url命名的一种规范,
要求url中只有名词, 没有动词, 并且没有问号传参数.
十三.拦截器
拦截器作用: 拦截请求, 一般在做用户权限认证的时候使用比较多
单个拦截器执行顺序:
======Interceptor1==========preHandle====
======Interceptor1==========postHandle====
======Interceptor1==========afterCompletion====
多个拦截器的执行顺序: 等于在springMvc.xml中配置拦截器的顺序
======Interceptor1==========preHandle====
======Interceptor2==========preHandle====