112---spring mvc的优点,原理,设计思想,特点,相关参数

一、     SpringWeb MVC是什么

     Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架

     使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型

     框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

二、     SpringWeb MVC能帮我们做什么

     让我们能非常简单的设计出干净的Web层和薄薄的Web层

     进行更简洁的Web层的开发

     天生与Spring框架集成(如IoC容器、AOP等)

     提供强大的约定大于配置的契约式编程支持

     非常灵活的数据验证、格式化和数据绑定机制

     支持Restful风格

三、     SpringWeb MVC处理请求的流程

 

1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

3.DispatcherServlet请请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6.视图对象负责渲染返回给客户端

 

四、     MVC设计思想

 

MVC即Model-View-Controller,把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

视图(View)代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。

模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性。

控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。

 

 

 

五、     Spring MVC 特点

 

     清晰的角色划分:

控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(formobject)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、视图解析器(view resolver)等。每一个角色都可以由一个专门的对象来实现。

      强大而直接的配置方式:

将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。

      可适配、非侵入:

可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。

     可重用的业务代码:

可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。

     可定制的绑定(binding) 和验证(validation):

比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。

     可定制的handlermapping和view resolution:

Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些webMVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。

     灵活的model转换:

在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。

     可定制的本地化和主题(theme)解析:

支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。

     简单而强大的JSP标签库(SpringTag Library):

支持包括诸如数据绑定和主题(theme) 之类的许多功能。

     JSP表单标签库:

在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。

     Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。

 

 

 

六、     相关参数

 

  DispatcherServlet

应用了“ Front Controller”模式 – 是所有 SpringMVC 请求的中枢。

继承了HttpServlet,是一个Servlet,由WebApplicationContext 加载

如果不作其它配置,会加载默认组件

  HandlerMapping

 

将web请求映射到正确的处理器(handler)上 , 通常是一个 Controller

不需用自定义处理器映射  –已经内置了很多处理器映射策略

在处理器映射中通过配置拦截器(包括处理器执行前、执行后、或者执行前后运行拦截器)将使其功能更强大

 

          BeanNameUrlHandlerMapping

 

把一个 URL 影射到一个和它名字相同的已注册的bean– 比如 /simple 将影射到一个名为“/simple”的bean。

可以给bean多个名字 (别名) 通过空格来分隔

必须有一个name属性– “/”在xml中不能定义id属性

在bean名字中可以使用通配符 (/simple*)

是默认的HandlerMapping,如果在上下文中没有找到处理器映射,DispatcherServlet会为你创建一个BeanNameUrlHandlerMapping,但不鼓励

 

          Controller接口

 

负责处理请求

内部参数继承HttpServlet

•       handleRequest(HttpServletRequest,HttpServletResponse)

返回一个ModelAndView对象

所有实现都是线程安全的

基本不用自己实现接口– 已经提供了很多实用的实现类

  ModelAndView对象

 

封装了用来渲染页面的 model和view

Model 用 java.util.Map实现的

添加对象,可以不需用名字:

•       addObject(String, Object) – 用显式名字添加

•       addObject(Object) – 用默认名添加 (惯例优先)

View 用 StringView对象表示

类似 Struts的Action

•       自动作默认处理 (不用编码)

•       简单web处理

•       在web 层和service 层之间作相应的处理

–     参数处理

–     视图跳转

–     输入验证

 

  AbstractController

 

提供了简单的操作

用来处理一个简单的请求

protected ModelAndViewhandleRequestInternal(

 HttpServletRequest request,

 HttpServletResponse response) {

   String text = service.getText();

   return new ModelAndView(

       “simple”, “text”, text);

}

 

  ThrowawayController

 

中文叫做一次性控制器,也就像一次性筷子那样用完即丢

并不在Spring的Controller继承架构中,而是一个独立的接口定义

当映射的不是一个model 对象时很有用

Bean的作用域必须是prototype,他们本身不是线程安全的

 

  Command Controllers

提供了一种和数据对象交互的方式,并动态地将来自HttpServletRequest的参数绑定到指定的数据对象上。

功能和Struts中的ActionForm有点像,不过在Spring中,不需要实现任何接口来实现数据绑定

Command 可以是任何 POJO – 通常是一个 domain对象

提供的功能:

•       绑定用户类型

•       自动验证

•       自动创建command对象

AbstractCommandController – 提供绑定和验证

SimpleFormController – 除了提供绑定和验证, 还提供了工作流中的表单处理

•       对表单form处理很有用

•       具体细节后面介绍

AbstractWizardFormController – 适合涉及多个页面的表单form处理

 

 

  其他 Controllers

 

ServletWrappingController and ServletForwardingController  –为了Struts专门设计的,在spring拦截器里封装了Strutsservlet,作用相当于代理Struts的ActionServlet

ParameterizableViewController – 简单的返回一个指定的视图名称,不涉及客户端视图技术(从而避免了在Java代码中的硬编码)

UrlFilenameViewController –会检查URL,获取文件请求的文件名,并把它作为视图名加以使用。如:http://www.springframework.org/index.html对应的视图文件名是index    

 

  Interceptors

 

在请求前后添加其它功能

包括拦截器方法 – preHandle and postHandle

包括回调方法 – afterCompletetion

可以通过 HandlerMapping和一系列Controller关联上

实现 HandlerInterceptorWebRequestInterceptor

Spring 提供的几个实现

•    OvenXxxInViewInteceptor – 用于 ORM 架构JDO, JPAand Hibernate

•    UserRoleAuthorizationInterceptor– 用于各种角色授权验证

其他有用的扩展: 自定义安全,caching, …

<beans>

<bean id=”handlerMapping”class=”org.springframework.web.servlet.handler.SimpleUrlHandlerMapping”>

 <propertyname=”interceptors”> <list> <refbean=”officeHoursInterceptor”/> </list> </property>

<property name=”mappings”> <value>/*.form=editAccountFormController /*.view=editAccountFormController</value></property></bean>

<bean id=”officeHoursInterceptor”class=”samples.TimeBasedAccessInterceptor”> <propertyname=”openingTime” value=”9″/> <propertyname=”closingTime” value=”18″/></bean>

<beans>

 

 

 

package samples;

 public classTimeBasedAccessInterceptor extends HandlerInterceptorAdapter

 { private int openingTime;

    private int closingTime;

   public voidsetOpeningTime(int openingTime)

              {this.openingTime = openingTime; }

   public voidsetClosingTime(int closingTime)

         { this.closingTime =closingTime; }

  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  throws Exception

   { Calendar cal =Calendar.getInstance();

    int hour =cal.get(HOUR_OF_DAY);

    if (openingTime <= hour< closingTime) { return true; }

    else {response.sendRedirect(“http://host.com/outsideOfficeHours.html”);

      return false; } } }

 

  ViewResolver

 

从一个逻辑视图名映射到一个视图对象

可以排序, 所以能链在一起

对JSP用户, 通常实现

InternalResourceViewResolver:

<bean id=”internalResourceViewResolver” …

    <propertyname=”prefix” value=”/WEB-INF/jsp/” />

    <propertyname=”suffix” value=”.jsp” />

</bean>

 

  其他 ViewResolver实现

 

VelocityViewResolver – 针对Velocity templates设计的

FreeMarkerViewResolver – 针对 FreeMarkertemplates设计的

ResourceBundleViewResolver 

•    映射关系在一个 properties 文件

•    支持国际化

XmlViewResolver – 映射关系在XML文件

 

  视图 View

 

支持的几种视图模板技术:

•    InternalResourceView (JSP)

•    JstlView (JSP + JSTL)

•    VelocityView (Velocity)

•    FreeMarkerView (FreeMarker)

•    TilesView (Tiles)

•    TilesJstlView (Tiles + JSTL)

还支持渲染下列视图

•    Excel files

•    PDF files

•    XSLT results

•    Jasper Reports

 

 

  Spring MVC form处理

 

SimpleFormController提供了表单处理通用工作流程

•       提供了用户自定义标签,用来展示和处理常用的表单

•       默认, GET用于form展示 ,POST用于 form处理

通过一些Controller类实现表单展示处理

能处理完整的工作流– 这是亮点

 

  注册 Command 类

 

SimpleFormControllers 关联一个 Commandclass

•       因为是紧耦合, 配置这个Controller class是可以的

public class PlayerFormController  

   extends SimpleFormController {

 public PlayerFormController() {

   setCommandClass(Player.class);

   setCommandName(“player”);

}

 

  Spring MVC 其它特性

 

其它Spring MVC 功能这里不再介绍了,但很优秀

•       处理多请求

•       支持自定义主体

•       支持国际化

•       方便 ServletContextListener 初始化 Log4J

•       Spring MVC标签

 

   

    原文作者:Spring MVC
    原文地址: https://blog.csdn.net/lixiao1048/article/details/51869048
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞