(一)Spring MVC
Spring MVC 是一个典型的MVC框架,是Spring内置的Web框架,可以作为应用项目的展示层,继Spring 2.0对Spring
MVC进行重大升级后,Spring 2.5又为Spring MVC引入了注解驱动功能,再到3.0时代,全面支持REST的网络服务和更容易的网
络编程(Spring MVC 3.0)(最新Spring MVC 4.0)
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,Spring MVC 分离了控制器、模型对
象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制,适用在我们的表现层到action模块中,是MVC架构模式
中真正的Controller,在流程处理方面更加灵活,可以很容易的进行扩展,可以和Spring框架进行无缝集成
(二)SpringMVC 架构
Spring Web MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规
则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们整体看一下Spring Web MVC处理请求的流程:
* Spring Web MVC处理请求的流程
* Spring Web MVC架构
(1)Spring MVC的核心是DispatcherServlet,当客户端发送一个请求时,这个请求经过一系列过滤器处理,然后
DispatcherServlet会接收到这个请求;
(2)DispatcherServlet会从HandlerMapping对象中查找与请求匹配的Controller,并将结果返回给
DispatcherServlet;
(3)DispatcherServlet将请求转发给目标Controller,如果定义有拦截器,则会经过这些拦截器处理;
(4)标Controller处理完成业务逻辑后,会返回一个结果给DispatcherServlet;
(5)DispatcherServlet根据结果查询ViewResolver,找到与之对应的视图对象,同样将结果返回给
DispatcherServlet;
(6)DispatcherServlet根据指定的显示结果,调用模板对象渲染view;
(7)将view返回给客户端;
根据上面的说明,可以很很明显的看出,Spring MVC的核心是Servlet,并且创建的Controller其实也是一个Servlet
(三)SpringMVC 优势
1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器
(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对
象(Command,请求参数绑定到的对象就叫命令对象)、表单对象(Form Object,提供给表单展示和提交到的对象就叫表单
对象);
2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;
3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;
4、和Spring 其他框架无缝集成,是其它Web框架所不具备的;
5、可适配,通过HandlerAdapter可以支持任意的类作为处理器;
6、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;
7、功能强大的数据验证、格式化、绑定机制;
8、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;
9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
10、强大的JSP标签库,使JSP编写更容易;还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程
支持、基于注解的零配置支持等等
(四)SpringMVC 注解(Controller与Requestmapping)
@Controller
@RequestMapping("/helloworld")
public class Helloworld {
@RequestMapping(method=RequestMethod.GET)
public ModelAndView hello() {
ModelAndView mv = new ModelAndView();
mv.setViewName("helloworld");
return mv;
}
}
@Requestmapping的可选参数:
(1)value:表示需要匹配的url的格式
(2)method:表示所需处理请求的http 协议(如get,post,put,delete等),可选值为RequestMethod这个enum的值。
(3)params:格式为”paramname=paramvalue” 或 “paramname!=paramvalue”。不带参数则表示paramvalue可以为
任意值。如params = {"param1=1","param2!=2","param3"},表示对应的url必须包括param1,param2,param3三个参数,其中
param1的值必须为1,param2的值不能为2,param3的值可以为任意值。
(4)headers:用来限定对应的reqeust请求的headers中必须包括的内容,例如headers={"Connection=keep-alive"}, 表
示请求头中的connection的值必须为keep-alive
(五)SpringMVC 总结
Spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void
(1)ModelAndView(模型视图)
通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面 , 使用
addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。 调用addObject()方法
将值设置到一个名为ModelMap的类属性,ModelMap是LinkedHashMap的子类, 具体请看类
@RequestMapping("show1")
public ModelAndView show1(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("/demo2show");
mav.addObject("account", "account -1");
return mav;
}
小结:
1、使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很
大的灵活性,而模型数据又可以通过 ModelMap 控制。
2、使用void、map、Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
3、使用String、ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。