1基本概念
2入门代码
3请求参数绑定
4常用注解
明确:
DispatcherServlet:术语:前端控制器
SpringMVC:表现层框架也是MVC设计模型的这么一个框架
功能:主要跟浏览器客户端进行数据的交互;
基本概念
MVC设计模型:在web层
M model模型:JavaBean对象:
V View视图: Jsp,html用来展示数据给用户
C Controller:控制器:Servlet把请求接收到
处理器映射器,处理器适配器,视图解析器称为SpringMVC的三大组件
简要分析springMVC和Struts2区别优势
共同点:都是表现层框架,基于MVC模型
顶层离不开ServletAip
处理机制都是一个核心控制器
区别:
MVC的入口是Servlet,而Struts2是Filter
MVC是基于方法设计(单例的),而Struts是基于类的,每次执行都会创建一个动作类(多例的)所以mvc效率更高
入门案列:
1:环境搭建
总体:创建一个项目,包目录补全,导入开发的jar包,配置前端的控制器
最后又写了一个spring的配置文件
使用骨架maven_webapp
添加键值对:archetypeCatalog:internal/解决maven工程创建过慢
jar包在springMVC第一天资料中
2web.xml中配置前端的控制器
作用:加载SpringMVC的配置文件,启动tomcat时候就把控制器实例化
Archetyoe Created Wed Application
dispatcherServlet
org…DispatcherServlet
dispatcherServlet同上保持一致
/"/"表示你发任何的请求都会经过servlet
配置过滤器;解决中文乱码
3:在resource目录下创建一个springmvc的配置文文件
约束
开启注解扫描:实例化对象
视图解析器:实例化spring中视图解析器对象。配置前缀和后缀
开启SpringMVC框架注解支持。
4编写控制器,编写一个类
添加一个@Controller:实例化自己编写的类
编写方法:前端链接对跳转到这个方法,方法上面添加路径@RequestMapping
5.前端jsp
添加一个连接:访问控制器中方法,方法上面的路径
访问jsp,来到控制器。根据访问的路径找到控制器中对应的方法,返回到控制器,控制器找到
视图解析器,视图解析器找到success.jsp
请求参数绑定
@RequestMapping(path=“hellow”)注解:
作用在方法,类上。
属性:
method{}:规定请求方式
parse{}:要求必须传输的参数,
header{}:发送请求中必须包含的请求头
绑定请求参数
请求参数绑定到javaBean中
要求:
javaBean中的属性名称和请求消息的键名一致
直接将javaBean作为方法的参数,就可以实现自动封装;
javaBean中有引用类型;想要封装,在页面input,name属性中,使用引用类型的类名点上类中的成员属性名称
请求参数绑定到List中:name=“list[0].uname”把值存到0位置上
请求参数绑定到Map中:name = “map[‘one’].uname”
自定义转换器
页面提交的数据全部都是字符串,
springMVC内部会自动将String转化成Intger
但是有些特例:
字符串转日期;
定义一个utils实现Converter<要转类型,转换后类型>
实现方法
在spring.xml中配置一个转换工厂,配置工厂属性,把自定义类配置进去
配置转化生效
获取原生ServletAPI(HttpServletRequest request,HttpServletResponse request。。。)
直接在方法参数上加参数就行了
常用注解:
RequestParams:把请求中指定名称的参数给控制器中的形参赋值
作用位置:形参类型前面
属性:
value:请求参数中的名称,
required:请求参数是否必须提供此参数:默认为ture
解决的问题:如果两端的名称不一样就封装不上的问题,
RequestBoy:用户获取请求体内容。直接使用得到key=value&key=value。。结构数据
属性
required:是否必须有请求体:默认true
作用位置:形参类型前面
get请求不适用
场景:异步提交数据时,用的是JONS数据格式
PathVaribale:用于绑定url中的占位符:
/spring/HelloController/pathVatibaleTest/刘怡
@RequestMapping(“pathVatibaleTest/{liuyi}”)
public void pathVatibaleTest(@PathVariable(“liuyi”) String msg) {
System.out.println(msg);刘怡
}
补充:{ }大括号
Requestheader:获取请求消息头;(不常用)
CookieValue:用于把指定cookie名称的值传入控制器方法参数不常用()
作用位置:方法形参上
想要拿到Cookie中的值
ModelAttribute:用于修饰方法和参数
在方法上:会在控制器方法执行之前执行
参数上:获取指定的数据给参数赋值
SessionAttr ibutes(value=“aa”):(将aa存入到Session域中)用于多次执行控制器方法间的参数共享
如果使用api那么耦合度高
作用位置:只能在类上
补充:
一. DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
处理器映射器,处理器适配器,视图解析器称为SpringMVC的三大组件
一、执行流程?
1、客户发起请求(request)到前端控制器
2、前端控制器请求handlermapping来查找对应的handler<控制器>
(通过xml配置和注解的方式
3、处理映射器根据查找的结果向前端控制器返回一个mapper
4、前端控制器去调用处理器去执行handler
5、处理器适配器执行handler
6、Handler执行完给处理器适配器返回一个modelandview
7,处理器适配器向前端控制器返回model and view
8,前端控制器请求视图解析器去进行视图解析
9视图解析器给前端控制器返回一个view
10前端控制器进行视图渲染
11前端控制器向用户响应结果
数据返回类型分类
1String:
两种方式:
1其实也是存在model里 使用el表达式
<%@ page contentType=“text/html;charset=UTF-8” language=“java” isELIgnored=“false” %>
2使用原生API关键字:这里不会使用视图解析器,所以要加上后缀,和前缀
请求转发:
return"forward:/WEB-INF/pages/success.jsp"
重定向:不能直接访问WEB-INF下资源
return"redirect:/index.jsp"
2void:自己使用原生的servlet的api
注意:这里没有用到视图解析器;
3ModelAndView:不仅可以放数据,还能实现页面跳转
setViewName()页面跳转:
addObject()存放数据:将对象存放到对象中,也会把对象放到request对象
4ResponseBody响应json数据
1:导入jar包
2:再返回类型前加入注释@ResponseBody
文件上传:
SpringMVC框架文件上传原理分析
request到前端控制器,这里配置了一个文件解析器
,调用文件解析器,解析request请求,
再将解析后的文件upload(文件解析器对象)传入到前端控制器,
调用相关方法,传入upload,
SpringMVC跨服务器方式的文件工程
优势:速度快,正规。
创建客户端的对象
Client.create();
和图片服务器进行连接
WebSource web = client.resource(path+filename);
上传文件
web.put(upload.getBytes());
页面出现一个异常出现友好页面
springmvc异常处理
在前端控制器配上异常处理器组件
1编写自定义异常类
继承Exception
2编写异常处理器的类
实现HandlerExceptionResolver,并实现方法
处理逻辑;
3配置异常处理器
springmvc编写拦截器
1编写拦截器类
实现接口HandlerInterceptor;并重写preHandle。处理逻辑
三种方法:returen true;就是放行;
postHadle:后处理方法,controller方法执行后,success.jsp执行之前。
afterCompletion:最终执行方法。做一些资源的释放。
2配置拦截器
mvc:interceptors
mvc:interceptor
//要拦截的具体方法
<mvc:mapping path="/user/*">
//配置拦截器对象
</mvc:interceptor>
</mvc:interceptors>