zoukankan      html  css  js  c++  java
  • SpringMVC相关

    一、简介

        Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。SpringMVC是一种web层的mvc框架,用于替代servlet(处理响应请求,获取表单参数,表单验证等)

    二、工作流程

    1、用户发送请求至前端控制器DispatcherServlet。

    2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

    3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

    4、 DispatcherServlet调用HandlerAdapter处理器适配器。

    5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

    6、Controller执行完成返回ModelAndView。

    7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

    8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

    9、ViewReslover解析后返回具体View.

    10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。 

    11、DispatcherServlet响应用户。

    三、理解

    1、为什么要使用springMVC?

        SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化日常Web开发。(处理业务数据的对象和显示业务数据的视图之间存在紧密耦合)

    2、什么是MVC设计模式?

        MVC即Model-View-Controller,将应用按照Model(模型)、View(视图)、Controller(控制)这样的方式分离。

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

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

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

    3、SpringMVC的特点

    • 清晰的角色划分:控制器(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。

    4、SpringMVC的优点

    • 让我们能非常简单的设计出干净的Web层和薄薄的Web层
    • 进行更简洁的Web层的开发
    • 天生与Spring框架集成(如IoC容器、AOP等)
    • 提供强大的约定大于配置的契约式编程支持
    • 非常灵活的数据验证、格式化和数据绑定机制
    • 支持Restful风格

    5、SpringMVC的入门程序

    web.xml

    1.  
      <web-app>
    2.  
      <servlet>
    3.  
      <!-- 加载前端控制器 -->
    4.  
      <servlet-name>springmvc</servlet-name>
    5.  
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    6.  
      <!--
    7.  
      加载配置文件
    8.  
      默认加载规范:
    9.  
      * 文件命名:servlet-name-servlet.xml====springmvc-servlet.xml
    10.  
      * 路径规范:必须在WEB-INF目录下面
    11.  
      修改加载路径:
    12.  
      -->
    13.  
      <init-param>
    14.  
      <param-name>contextConfigLocation</param-name>
    15.  
      <param-value>classpath:springmvc.xml</param-value>
    16.  
      </init-param>
    17.  
      </servlet>
    18.  
      <servlet-mapping>
    19.  
      <servlet-name>springmvc</servlet-name>
    20.  
      <url-pattern>*.do</url-pattern>
    21.  
      </servlet-mapping>
    22.  
      </web-app>

    springmvc.xml

    1.  
      <beans>
    2.  
      <!-- 配置映射处理器:根据bean(自定义Controller)的name属性的url去寻找handler;springmvc默认的映射处理器是BeanNameUrlHandlerMapping-->
    3.  
      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    4.  
       
    5.  
      <!-- 配置处理器适配器来执行Controller ,springmvc默认的是SimpleControllerHandlerAdapter
    6.  
      -->
    7.  
      <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    8.  
       
    9.  
      <!-- 配置自定义Controller -->
    10.  
      <bean id="myController" name="/hello.do" class="org.controller.MyController"></bean>
    11.  
       
    12.  
      <!-- 配置sprigmvc视图解析器:解析逻辑视图;
    13.  
      后台返回逻辑视图:index
    14.  
      视图解析器解析出真正物理视图:前缀+逻辑视图+后缀====/WEB-INF/jsps/index.jsp
    15.  
      -->
    16.  
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    17.  
      <property name="prefix" value="/WEB-INF/jsps/"></property>
    18.  
      <property name="suffix" value=".jsp"></property>
    19.  
      </bean>
    20.  
      </beans>

    自定义处理器

    1.  
      public class MyController implements Controller{
    2.  
       
    3.  
      public ModelAndView handleRequest(HttpServletRequest arg0,
    4.  
      HttpServletResponse arg1) throws Exception {
    5.  
      ModelAndView mv = new ModelAndView();
    6.  
      //设置页面回显数据
    7.  
      mv.addObject("hello", "欢迎学习springmvc!");
    8.  
       
    9.  
      //返回物理视图
    10.  
      //mv.setViewName("/WEB-INF/jsps/index.jsp");
    11.  
       
    12.  
      //返回逻辑视图
    13.  
      mv.setViewName("index");
    14.  
      return mv;
    15.  
      }
    16.  
      }

    6、SpringMVC常用注解及其作用

    @Controller:标识这个类是一个控制器

    @RequestMapping:给控制器方法绑定一个uri

    @ResponseBody:将java对象转成json,并且发送给客户端

    @RequestBody:将客户端请求过来的json转成java对象

    @RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射

    @PathVarible:用于获取uri中的参数,比如user/1中1的值

    Rest风格的新api

    @RestController相当于@Controller+ @ResponseBody

    @GetMapping@DeleteMapping@PostMapping@PutMapping

    其他注解

    @SessionAttribute:声明将什么模型数据存入session

    @CookieValue:获取cookie值

    @ModelAttribute:将方法返回值存入model中

    @HeaderValue:获取请求头中的值

    7、SpringMVC和Struts2的对比

    框架机制:SpringMVC的入口是servlet,而Struts2是filter。

    Filter在容器启动后就初始化,服务停止后销毁,晚于Servlet;Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

    拦截机制:

        Struts2:1、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性;

        2、一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,说明属性参数是让多个方法共享的;

        3、Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

        SpringMVC:1、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架;
        2、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改;

    Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

    性能方面:SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

    配置方面:spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少);
    SpringMVC可以认为已经100%零配置。

    设计思想:Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

    集成方面:SpringMVC集成了Ajax。

    注意:springmvc是单例模式的框架,但它是线程安全的,因为springmvc没有成员变量,所有参数的封装都是基于方法的,属于当前线程的私有变量. 因此是线程安全的框架。所以效率高。

    struts action是多例的。所以可以使用成员变量获取参数。所以效率低。

    新鲜刺激的东西永远都有,玩之前掂量掂量自己几斤几两
  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/banxianer/p/13967226.html
Copyright © 2011-2022 走看看