Spring MVC体系结构和处理请求控制器

MVC设计模式

  通常的Web项目,架构模式基本分层

  •   数据库访问接口:DAO层
  •   处理业务逻辑:Service层
  •   数据实体:POJO
  •   负责前端请求的接受处理:Servlet
  •   负责前端页面展示:JSP

  MVC设计模式:它是软件工程中的一种软件架构模式。它强制性地使软件系统的输入、处理和输出分开。把软件系统分为三个基本部分:模型(Model)、视图(View)、控制器(Controller)

  •   视图(View):负责格式化数据并把他们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。对应组件:JSP或者HTML文件
  •   控制器(Controller):负责接收并转发请求,对进行处理后指派视图并将响应结果发送给客户端。对应组件Servlet
  •   模型(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,负责数据逻辑(业务规则)的处理和实现数据操作。对应组件:JavaBean(处理业务逻辑Service层,数据库操作相关的DAO层,贯穿各层之间的数据模型,数据实体POJO)

  MVC的两种模式

  (1)JSP Model1

  •   业务流程较为简单时,可以把控制器的功能交给视图实现。故Model1模式只有视图和模型,没有控制器(JSP+JavaBean)
    •   浏览器 - 请求 - JSP - JavaBean - 数据库 - JavaBean - JSP -响应 - 浏览器

   (2) JSP Model2

  •   相比JSPModel1,业务流程复杂时,就需要把业务流程控制交给控制器来实现。即(JSP+Servlet+JavaBean)
    •   浏览器 - 请求 - Servlet  - JavaBean- JSP - 数据库 - JavaBean - JSP -Servlet -响应 - 浏览器

 

  MVC处理过程

  MVC的整体结构,对于MVC三个部分(模型、视图、控制器)功能职责分别进行了相应的阐述

  (1)首先视图提供系统与用户交互的界面,并发送用户输入给控制器

  (2)控制器接收用户的请求,并决定应该调用哪个模型来进行处理

  (3)模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)

  (4)控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过视图呈现给用户结果

  MVC优缺点

  1. 优点
    1. 多视图共享一个模型,大大提高代码的可重用性
    2. MVC三个模块相互独立,松耦合架构
    3. 控制器提高了应用程序的灵活性和可配置性
    4. 有利于软件工程化管理

  通过MVC的设计模式最终可以打造出一个松耦合+高重用性+高可适用性的架构

   2.缺点

    1. 原理复杂
    2. 增加了系统结构和实现的复杂性
    3. 视图对模型数据的低效率访问

  MVC来说:并不适合小型甚至中型规模的项目,花费大量时间将MVC应用到规模并不是很大的应用程序通常得不偿失

 

Spring MVC介绍及其环境搭建

  Spring MVC框架介绍

   Spring MVC是Spring框架中用于Web应用开发的一个模块,是Spring提供的一个基于MVC设计式的优秀Web开发框架,本质上相当于Servlet。在MVC设计模式中,Spring MVC作为控制器来建立模型与视图的数据交互,是机构最清晰的MVC Model2实现。

  Spring MVC框架中,Controller替换Servlet来担负控制器的职责,Controller接收请求,调用相应的Model进行处理,处理器完成业务处理后返回处理结果。Controller调用相应的View并对处理结果进行视图渲染,最终相应给客户端。

  Spring MVC环境搭建

   在idea中新建Web Project后,使用Spring MVC框架的步骤

  1. 引入jar文件
  2. 在web.xml中配置Servlet,定义DispatcherServlet
    1.   Spring MVC是基于Servlet的,DispatcherServlet是整个Spring MVC框架的核心,它负责截获请求并将其分派给相应的处理器处理。那么配置Spring MVC,首先要进行DispatcherServlet的配置,当然跟所有的Servlet一样,用户必须在web.xml中进行配置。
      1.  
        <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <!--初始化参数-->
        <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
        </servlet-mapping>
  3. 创建Spring MVC的配置文件
    1.   项目工程下创建resources目录(Source Folder),在目录下添加Spring MVC的xml配置文件
      1. <?xml version="1.0" encoding="utf-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        <bean name="/index.html" class="com.controller.IndexController"/>
        <!--视图对应-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
        </bean>
        </beans>
      2. 
         DispatcherServlet将一个请求通过咨询HandlerMapping的Bean,交给特定的Controller处理,Spring提供了多种处理器映射(HandlerMapping)支持
        1. org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
        2. org.springframework.web.servlet.handler.SimpleUrlHanderMapping
        3. org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
        4. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping等。
        5. 可以根据需求进行处理器映射选择,Spring默认使用BeanNameUrlHandlerMapping,即在Spring容器中查找与请求URL同名的Bean。
  4. 创建Controller(处理请求的控制器)
    1.   配置好相关环境,开始编写Controller和View
      1.   
        public class IndexController extends AbstractController {
        protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        System.out.print("hello,SpringMVC!");
        return new ModelAndView("index");
        }
        }
  5. 创建View
    1.   根据spring-servlet.xml中配置的prefix(前缀)路径和suffix(后缀)-.jsp,我们在WEB-INF下创建jsp文件夹,在文件夹下创建jsp视图-index.jsp,由于IndexController返回的逻辑视图名称为index,那么通过视图解析器会将视图逻辑解析为/WEB-INF/jsp/index.jsp。
  6. 部署运行
    1.   当用户发送URL请求,根据web.xml中对DispatcherServlet的配置,找到相应bean标签中的name属性名通过返回相应属性名,并根据HandlerMapping找到处理相应请求的Controller来处理请求;Controler处理完后,返回ModelAndView对象;该对象告诉DispatcherServlet需要通过那个视图来进行数据模型展示,DispatcherServlet根据视图解析器把Controller返回的逻辑视图名转换成真正的View并输出。逻辑视图名并不是真正的视图而只是视图名的一部分,通过springmvc.xml中指定的前缀后缀与逻辑视图名的拼接得到最好的视图名进行渲染

   7. 更改HeandlerMapping(处理器映射)

    首先更改Spring MVC的处理器映射的配置为支持注解式处理器,配置标签,它是Spring MVC提供的一键式配置方法,配置此标签,Spring MVC会帮助我们自动做一些注册组件之类的事情。

  <mvc:annotation-driven/>

  <context:component-scan base-package="com.controller"/>

  注解:@Controller - 指定为控制器类

     @RequestMapping("/index") - 设置唯一的URL 可以看做Handler

 

Spring MVC框架的请求处理流程及体系结构

    

  

  1. 首先用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息决定选择页面控制器(Controller)来进行处理,并把请求委托给它
  2. 页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
  3. 前端控制器回收控制权,然后根据返回的逻辑视图名,选择相应的真正视图,进行渲染

Spring MVC框架的特点

  1.清晰的角色划分。SpringMVC在Model、View和Controller方面提供了一个非常清晰的角色划分,这三个方面真正是各司其职。

  2.灵活的配置功能。因为Spring的核心是IoC,同样在实现MVC上,也可以吧各种类当作Bean来通过XML配置。

  3.提供了大量额控制器接口和实现类。开发者可以使用Spring提供的控制器实现类,也可以自己实现控制器接口。

  4.真正做到与View层的实现无关(JSP、Velocity、XSLT等)。它不会强制开发者使用JSP,也可以根据项目需要使用Velocity、XSLT等技术、

  5.国际化支持

  6.面向接口编程

  7.Spring提供了Web应用开发的一整套流程

Spring MVC总结

  框架搭建

  请求处理流程

  核心组件

    DispatcherServlet(前端处理器)

    Handler(请求处理器)

    HandlerMapping(处理器映射)

      使用bean方式指定

      <bean name="/index.html" class="com.controller.IndexController"/>

      使用注解方式指定@Controller - @RequestMapping

      <mvc:annotation-driven />
      <context:component-scan base-package="com.controller"/>

   HandlerAdapter

   ViewResolver

参数传递

  @RequestMapping - 可以在类定义和方法定义,定义的参数是全局唯一,如果有相同级别相同名称则会报错,类级别大于方法级别 | 

  映射规则:

    通过请求URL映射:

      RequestMapping请求的参数底层定义的是数组类型所以定义的方式可以为:@RequestMapping("/index") @RequestMapping({"/index","/"}) @RequestMapping(value="/index")

    通过请求参数进行映射:方法参数直接入参的话,方法入参名必须与请求名保持一致

    通过请求方式进行映射:get \ post

      @RequestMapping(value="/index",method=RequestMethod.GET,params="username")

  @RequestParam - 在控制器类中指定参数入参

    value - 请求的入参参数 public String method(@RequestParam(value="username",required=false)String username)

    required - 请求的参数是否必须设置了这个参数如果为false不必要参数的话,不想输入参数时,@RequestMapping设置了参数还是必须输入参数,所以不想输入参数时:1.将required设置为false,2.将@RequestMapping的入参参数取消

ModelAndView

  控制器处理方法的返回值若为ModelAndView,则包含视图信息,又包含模型数据信息。有了该对象后,Spring MVC就可以使用视图对模型数据进行渲染。

  (1)添加模型数据

    ModelAndView addObject(String attributeName,Object attributeValue);该方法第一个参数为key,第二个参数为value。key值可以随意指定必须保证在Model的作用域中唯一。

  (2)ModelAndView addAllObjects(Map<String,?> modelMap);模型对象也是一个Map对象,可以添加Map对象到Model中。

  (3)void setView(View view);指定一个具体的视图对象。

  (4)void setViewName(String viewName);指定一个逻辑视图名

Model

  除了可以使用ModelAndView对象返回模型数据,还可以使用Spring MVC提供的Model对象来完成模型数据传递。

  Model addAttribute(String value) - 默认以对象的类型作为key值 string

  Model addAttribute(Object obj,String value) 

  Model addAllAttributes(Map<String,?> modelMap)

  把需要传递的参数放入Model中即可,返回字符串类型的逻辑视图名。在JSP页面中直接使用EL表达式即可获得参数

posted @ 2019-06-28 20:00  Slike劫  阅读(456)  评论(0编辑  收藏  举报