vlambda博客
学习文章列表

MVC框架模式与SpringMVC框架

点击蓝字


MVC框架模式与SpringMVC框架


1. 框架与设计模式

框架、设计模式这两个概念很容易被人混淆,但其实这两者之间还是存在差别的。框架通常是代码重用,而设计模式是设计重用。 
设计模式是对反复出现的问题的解决方案的描述,是一种思想用于处理细节的,比框架更加抽象。框架是已经用代码实现的,可以执行也可以复用。设计模式是比框架更小的元素,一个框架往往会包含一个或者多个设计模式。框架总是针对某一特定领域的,而设计模式则可以适用于各个应用。


常见的框架模式: 
MVC, ORM等。


常见的框架: 
C++语言的MFC、qt、 gtk,Java语言的SSH,Python语言的django等。


常见的设计模式: 
代理模式,抽象工厂模式等23种设计模式。


2. MVC框架模式

MVC: Model View Controller 模型-视图-控制器 
视图:用户看到并与之交互的界面。

模型:表示企业数据和业务规则。在MVC的3个部件中,模型拥有最多的处理任务。被模型返回的数据是独立的,与数据格式无关。这样的一个模式能够为多个视图提供数据,这样一来模型的代码只需要写一次便能够被多个视图重用,减少了代码的重复性。

控制器:接受用户的输入并调用相应的模型和视图来完成用户的需求,所以当用户点击web页面中的超链接和发送表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并根据请求来调用哪个模型去处理请求,然后在决定用哪个视图来显示返回的数据。


3. SpringMVC框架

3.1 SpringMVC简介

springMVC框架是基于Java的实现了MVC框架模式的请求驱动类型的轻量级框架。前端控制器是DispatcherServlet接口实现类,映射处理器是HandlerMapping接口实现类,视图解析器是ViewResolver接口实现类,页面控制器是Controller接口实现类。SpringMVC的工作流程图如下:

(1)客户端请求提交到前端控制DispatcherServlet; 
(2)前端控制器DispatcherServlet查找一个或者多个映射处理器HandlerMapping,从而确定调用哪个页面控制器Controller对请求进行处理; 
(3)DispatcherServlet将请求提交给Controller; 
(4)Controller根据业务逻辑对请求进行处理,并返回ModelAndView; 
(5)DispatcherServlet查找一个或者多个ViewResolver,得到ModelAndView指定的视图view,并将model中的数据传入视图view中进行渲染; 
(6)DispatcherServlet将渲染后的视图返回响应;


由上述过程可见,DispatcherServlet是Spring MVC的核心,它负责协调SpringMVC的各个组成部分对所有的Http请求进行处理,其主要工作如下: 
(1)截获符合特定格式的Http请求; 
(2)初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久层的WebApplicationContext关联起来; 
(3)初始化Spring MVC的各个组件,并装配到DispatcherServlet中;


3.2 SpringMVC框架中的接口

DispatcherServlet接口:Spring提供的前端控制器,所有的请求都是由它来进行分发。在DispatcherServlet将请求分发到对应的Controller之前,需要借助Spring提供的HandlerMapping才能定位到相应的Controller.

HandlerMapping接口:完成客户请求到Controller的映射。

Controller接口:需要为并发用户处理请求,在实现Controller接口时,必须保证线程安全且可重用。 
在Controller完成用户请求的处理,返回ModelAndView对象给DispatcherServlet,ModelAndView对象中包含了模型Model和视图View。 
从宏观角度进行考虑,DispatcherServlet是整个Web应用的控制器;从微观角度进行考虑,Controller是单个Http请求处理过程的控制器。

ViewResolver接口:根据ModelAndView对象在web应用查找view视图,并将model中是数据传入到view视图中进行渲染。


3.3 SpringMVC框架优势

(1)角色清晰,分工明确,进行更简介的web开发; 
(2)和其他Spring框架无缝集成; 
(3)强大的JSP标签库; 
(4)HandlerMapping, ViewResolver等能够简单地进行定制;


3.4 SpringMVC常用注解

1、@Controller

在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求中的数据经过业务处理层处理后封装为一个Model,然后将该Model返回相应的View进行显示。在SpringMVC中提供了一个非常简单的定义Controller的方法,你无需继承特定的类或者实现特定的接口,你只需要用@Controller注解标记一个类是Controoller,然后采用@RequestMapping和@RequestParam等一些注解用于定于URL和Controller方法之间的映射,这样Controller便能够被外界访问。此外,Controller不会直接依赖HttpServletRequest和HttpServletResponse等HttpServlet对象,这些对象可以通过Controller方法参数来获得。 
采用@Controller注册一个bean到spring上下文中时,bean默认的ID名称是类名开头字母小写,也可以自己指定bean的名称:

MVC框架模式与SpringMVC框架

@Controller注解在一个类上,表明该类是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的所有方法,并检测该类中的方法是否使用了@RequestMapping注解。@Controller注解只是定义一个控制器,@RequestMapping注解的方法才是真正处理请求的处理器。单单使用了Controller注解还不能说明该类就是SpringMVC的控制器,因为这个时候Spring还无法获取该类,我们可以通过如下两种方式将@Controller注解的控制器类交给spring进行管理:

MVC框架模式与SpringMVC框架


2、@RequestMapping

method:指定请求的方法类型;

consumes:指定请求提交的内容类型(Content-Type),例如application/json,text/html;

produces:指定返回的内容类型,仅当请求头部中Accept包含指定类型时方法才进行处理;

params:请求中必须包含某些参数时,方法才进行处理;

headers:请求header中必须包含某些指定的header值,方法才进行处理;


3、@Resource和@Autowired

@Resource和@Autowired都是bean注入时使用,但是其实@Resource并不是spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入; 
@Resource和@Autowired的共同点:两者都可以使用在字段或者setter方法上,如果使用在了字段上,那么就不再需要setter方法。

@Resource和@Autowired的不同点:

@Autowired注解是由spring提供的,需要导入org.springframework.beans.factory.annotation.Autowired,只按照byType进行注入。在默认情况下,它要求依赖的对象必须存在,如果允许null,可以通过属性required设置为false进行设置。如果我们需要辅助通过byName进行装配bean,我们可以结合@Qualifier注解一起使用。

@Resource注解默认是按照byName进行装配bean,由J2EE提供,需要导入javax.annotion.Resource。@Resource注解包含两个重要的属性: name和type,Spring将@Resource注解中的name属性解析为bean的名字,将type属性解析为bean的类型。 
当@Resource注解的name属性时,Spring将按照byName方式进行bean注入,找不到将会抛出异常; 
当使用type属性时,将按照byType方式进行bean注入,找不到或者找到多个将会抛出异常; 
如果同时使用了这两个属性,那么将会从Spring上下文中查找指定类型指定名字bean进行装配,找不到将会抛出异常; 
如果两个属性都没有使用,那么将会按照默认方式byName进行bean注入。


4、@ModelAttribute 
@ModelAttribute注解有两种用法:一种是用在拥有返回值的方法上,方法的返回值将会作为Model中指定属性的值;另一种是用在请求处理方法参数上,方法参数将会从Model的属性列表中获取指定属性的值。通过@ModelAttribute(“xxxx”)可以指定属性的名称。在Controller的请求处理方法调用之前,@ModelAttribute注解的方法都会被首先执行。


5、@SessionAttributes 
@SessionAttibutes注解只能用在类上,不能使用在方法上。该注解将Model属性列表中指定的一些属性保存到Session对象中。


6、@PathVariable 
该注解用于将请求URL的模板变量提取出来,应用到请求处理方法参数中。


7、@RequestParam 
@RequestParam主要用于SpringMVC后台请求处理方法中获取参数,类似与request.getParameter(“name”), 该注解包含三个属性:required, defaultValue, value,其中required表示请求中是否必须包含该参数,defaultValue表示请求中没有包含该参数时的默认值,value表示传入的参数的名称。


8、@ResponseBody 
该注解用于将Controller请求处理方法返回的对象,通过适当的HttpMessageConverter转换为指定的格式,保存到Response对象的body区。


9、@Component 
相当于通用的注解。


10、@Repository 
用于注解DAO层。

JIKE

极客·Geek社团

图文编辑:徐紫萱

排版编辑:徐紫萱