-
控制接收用户请求的数据,委托给模型进行处理
-
控制器通过模型(Model)处理数据并得到处理结果
-
控制器将模型数据在视图(View)中展示
web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。 -
控制器将视图response响应给用户
通过视图展示给用户要的数据或处理结果。
- 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给
DispatcherServlet
. -
DispatcherServlet
根据View进行渲染视图(即将模型数据填充至视图中)。
++以下组件通常使用框架提供实现:++
DispatcherServlet
:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
HandlerMapping
:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlAdapter
:通过扩展处理器适配器,支持更多类型的处理器。
++下边两个组件通常情况下需要开发++:
View
:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。
第一步:建立一个Web项目
第三步:前端控制器配置
Springmvc默认加载WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定义处指定加载的配置文件,如下:
第五步:配置处理器映射器
第六步:配置处理器适配器
第七步:配置视图解析器
prefix
和suffix
:查找视图页面的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址“WEB-INF/jsp/hello.jsp”
第八步:后端控制器开发
// 设置逻辑视图名,最终视图地址=前缀+逻辑视图名+后缀
ModelAndView
:包含了模型数据及逻辑视图名
第九步:后端控制器配置
第十一步:部署在tomcat测试
通过请求:,如果页面输出“Hello World!
从上边的步骤可以看出,通常情况下我们只需要编写后端控制器和视图。
将后端控制器的bean name作为请求的url。
HandlerAdapter会把后端控制器包装为一个适配器,支持多种类型的控制器开发,这里使用了适配器设计模式。
简单控制器处理器适配器.
HTTP请求处理器适配器.
// 也可以自定义响应内容
从上边可以看出此适配器器的controller方法没有返回ModelAndView
,可通过response
修改定义响应内容。
该控制器能把请求参数封装到一个命令对象(模型对象)中。
* 通过构造函数设置命令对象 * 字符串转换为日期属性编辑器使用命令控制器完成查询列表及表单提交
* 注册属性编辑器(字符串转换为日期)以上可以解决post请求乱码问题。
对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:
另外一种方法对参数进行重新编码:
@RequestMapping
:请求到处理器功能方法的映射规则
- springmvc是基于方法开发,请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
- Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
不要在action类中定义方法所用到的变量,变量要定义到方法体中。因为方法是在栈内存中,不会导致线程问题。
标识该类为控制器类,@controller
、@service
、@repository
分别对应了web应用三层架构的组件即控制器、服务接口、数据访问接口。
实现restFul,所有的url都是一个资源的链接,有利于搜索引擎对网址收录。
如果通过Post访问则报错:
如果通过Post访问则报错:
14.请求数据绑定(重点)
Controller方法通过形参接收页面传递的参数。
通过request对象获取请求信息
通过model向页面传递数据,如下:
自动将请求参数绑定到功能处理方法的命令/表单对象上。
Controller方法通过形参接收命令/表单对象。
日期型需要添加属性编辑器:
页面上以pojo对象中属性名称命名:
将pojo对象中的属性名于传递进来的属性名对应,如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中
页面上以pojo对象名点属性名命名:
如果采用类似struts中对象.属性的方式命名,需要将pojo对象作为一个包装对象的属性,action中以该包装对象作为形参。
使用情景:页面提交批量数据以数组接受
List中存放对象,并将定义的List放在包装类中,action使用包装对象接收。
包装类中定义List对象,并添加get/set方法如下:
在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。
包装类中定义Map对象如下:
action中将map定义在包装对象中,以包装对象接收数据。--!>注意:包含日期的要进行格式转换(放到action中)
// 使用注解进行日期格式数据转换
// 指定日期类型及日期数据的格式
value
:参数名字,即入参的请求参数名字,如value=“studentid”表示请求的参数区中的名字为studentid的参数的值将传入;
required
:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;
defaultValue
:默认值,表示如果请求中没有同名参数时的默认值
形参名称为groupid
,但是这里使用value="group"
限定参数名为group
,所以页面传递参数的名必须为group
。
这里通过required=true
限定groupid参数为必需传递,如果不传递则报400错误,由于使用了defaultvalue=”2”
默认值即使不传group参数它的值为”2”,所以页面不传递group也不会报错,如果去掉defaultvalue=”2”
且定义required=true
则如果页面不传递group
则会报错。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上
Contrller方法返回结果重定向到一个url地址,如果方式:
由于新发起一个request
原来的参数在转发时就不能传递到下一个url,如果要传参数可以/user/userlist.action
后边加参数,如下:
页面上请求的是一个json串,页面上实现时需要拼接一个json串提交到action。
* 请求json单个对象,返回json单个对象 //将json对象传成字符串从上图可以看出请求的数据是json格式
从上图可以看出响应的数据也是json格式,json数据的内容是从User对象转换得来。
采用form提交是最常用的作法,通常有post和get两种方法,响应json数据是为了方便客户端处理,实现如下:
从上图可以看出请求的数据是标准的key/value格式。
从上图可以看出响应的数据也是json格式,json数据的内容是从User对象转换得来。
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
针对某种mapping配置拦截器
针对所有mapping配置全局拦截器
从日志看出第一个拦截器的preHandler方法返回false
后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且controller也不执行了。
//如果是登录页面则放行 //如果用户已登录也放行 //用户没有登录挑战到登录页面
preHandle
按拦截器定义顺序调用