码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-08-10 11:34:52      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:springmvc   行数据   文件夹   rop   校验   org   封装   接口调用   创建   

①MVC小结:

1.MVC处理过程

对于MVC的三部分(模型Model、视图View、控制器Controller)功能职责分别进行了相应的阐述,并描述了各部分之间的调用关系。

技术分享图片

MVC整体的处理过程:

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

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

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

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

 

2.MVC优缺点

  1)优点

    (1)多视图共享一个模型,大大提高代码的可重用性。

    (2)MVC三个模块相互独立,松耦合架构。

    (3)控制器提高了应用程序的灵活性和可配置性。

    (4)有利于软件工程化管理。

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

  2)缺点

    (1)原理复杂。

    (2)增加了系统结构和实现的复杂性。

    (3)视图对模型数据的低效率访问。

对于MVC来说,它并不适合小型甚至中性规模的项目,花费大量时间将MVC应用到规模并不是很大的应用程序通常得不偿失,所以对于MVC设计模式的使用要根据具体的应用场景来决定。

 

②Spring MVC框架介绍

  Spring MVC是Spring框架中用于Web应用开发的一个模块,是Spring提供的一个基于MVC设计模式的优秀Web开发框架,它本质上相当于Servlet。在MVC设计模式中,

Spring MVC作为控制器(Controller)来建立模型与视图的数据交互,是结构最清晰的MVC Model2实现,可称为一个典型的MVC框架。

  在Spring MVC框架中,Controller替换Servlet来担负控制器的职责,Controller接收请求,调用相应的Model进行处理,处理器完成业务处理后返回处理结果。Controller调用相应的

View并对处理结果进行视图渲染,最终客户端得到相应消息。

 

③Spring MVC环境搭建

使用Spring MVC框架步骤如下:

  (1)引入jar文件。

  (2)Spring MVC配置:

    1)在web.xml中配置Servlet,定义DispatcherServlet。

    2)创建Spring MVC的配置文件。

  (3)创建Controller(处理请求的控制器)。

  (4)创建View(JSP等)。

  (5)部署运行。

 

1)下载需要的jar文件

  (1)spring-web-3.2.13.RELEASE.jar:在Web应用开发时使用Spring框架所需的核心类。

  (2)Spring-webmvc-3.2.13.RELEASE.jar:Spring MVC框架相关的所有类,包含框架的Servlets,Web MVC框架,以及对控制器和视图的支持。

 

2)在web.xml中配置Servlet

  Spring MVC是基于Servlet的,DispatcherServlet是整个Spring MVC框架的核心,它负责截获请求并将其分派给相应的处理器处理。那么配置Spring MVC,首先就要进行DispatcherServlet的配置,

当然跟所有的Servlet一样,用户必须在web.xml中进行配置。关键代码??:

<!-- 配置Spring MVC的核心控制器 DispatcherServlet -->
<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的配置文件(springmvc-servlet.xml)

  在项目工程下创建resources目录(注:Source Folder),并在此目录下添加Spring MVC的xml配置文件,为了方便框架集成的时候各个配置文件更好的区分,我们可将此文件命名为“springmvc-servlet.xml”。

在该配置文件中,我们使用Spring MVC最简单配置方式来进行配置,关键代码??:

<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 配置处理器映射 HandlerMapping -->
    <bean name="/index.html" class="cn.smbms.controller.IndexController" />

    <!-- 配置视图解析器 -->
    <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

   1)配置处理器映射

  DispatcherServlet要将一个请求交给哪个特定的Controller处理,它需要咨询一个Bean,这个Bean就叫做HandlerMapping,它的作用就是把一个URL请求指定给一个Controller处理。

Spring默认选中BeanNameUrlHandlerMapping处理器映射,即在Spring容器中查找与请求URL同名的Bean。这个映射器不需要配置,根据请求的URL路径映射到控制器Bean的名称。如下代码所示??:   

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

指定的URL请求:/index.html,处理该URL请求的控制器:cn.smbms.controller.IndexController。

  2)配置视图解析器

  DispatcherServlet会找到一个视图解析器,将控制器返回的逻辑视图名称转换成渲染结果的实际视图。使用InternalResourceViewResolver定义该视图解析器。通过配置prefix(前缀)和suffix(后缀),

将视图逻辑名解析为/WEB-INF/jsp/<viewName>.jsp。

 

4)创建Controller

  到目前为止,Spring MVC的相关环境配置已经完成,接下来编写Controller和View,就可以运行测试了。

  在src下新建包cn.smbms.controller,并在该包下新建class:IndexController.java,如何将该javaBean变成一个可以处理前端请求的控制器?需要继承org.springframework.web.servlet.mvc.AbstractController,

并实现HandleRequestInternal方法,关键代码如下??:

package cn.smbms.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class IndexController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        System.out.println("hello,spring mvc!");//在控制台输出日志信息
        return new ModelAndView("index");
    }

}

 

5)创建View

  在第二步配置视图解析器时,根据所定义prefix(前缀)——/WEB-INF/jsp/he suffix(后缀)——.jsp,我们需要在WEB-INF下创建jsp文件夹,并在该文件夹下创建真正的JSP视图——index.jsp,

并在该视图上输出“hello,Spring MVC!”,关键代码如下??:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP ‘index.jsp‘ starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>hello,Spring MVC!</body>
</html>

  由于控制器IndexController返回的逻辑视图名称为index,那么通过视图解析器,会将视图逻辑名解析为/WEB-INF/jsp/index.jsp,得到真正的JSP视图名。

 

6)部署运行

  到目前为止,所有的环境搭建一级示例的编码工作一级完成,下面可以编译后部署到Tomcat下运行测试。

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

1)Spring MVC框架的请求处理流程

    技术分享图片

 Spring MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(处理器)来进行处理。分析Spring MVC请求处理的流程步骤??

  (1)首先用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息(如URL)来决定选择哪个页面控制器(Controller)来进行处理,并把请求委托给它,即Servlet控制器的控制逻辑部分。

  (2)页面控制器接收到到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)。

  (3)前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的真正视图,并把模型数据传入以便将视图渲染展示。

  (4)前端控制器再次收回控制权,将响应结果返回给用户,至此整个流程结束。

  

2)Spring MVC框架的体系结构

    技术分享图片

Spring MVC通过一个前端控制器(DispatcherServlet)接收所有的请求,并将具体工作委托给其他组件进行处理,DispatcherServlet处于核心地位,它负责协调组织不同组件完成请求处理并返回响应。每个组件所负责的工作内容??

  (1)客户端发出HTTP请求,Web应用服务器接受此请求。若匹配DispatcherServlet的请求映射路径(在web.xml中指定),则Web容器将该请求转交给DispatcherServlet处理。

  (2)DispatcherServlet接收到该请求后,将根据请求的信息(包括URL、请求参数、HTTP方法等)及HandlerMapping的配置(在<servletName>-servlet.xml中配置)找到处理请求的处理器(Handler)。

  (3)当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HanlerAdapter可以理解为具体使用Handler来干活的人。

  (4)在请求信息到达真正调用Handler的处理方法之前的这段时间内,Spring MVC还完成了很多工作,它会将请求信息以一定方式转换并绑定到请求方法的入参中,对于入参的对象会进行数据转换、数据格式化以及数据校验等。

       这些都做完之后,最后才真正地调用Handler的处理方法进行相应的业务逻辑处理。

  (5)处理器完成业务逻辑处理之后将返回一个ModelAndView对象给DispatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息。

  (6)ModelAndView对象中包含的是“逻辑视图名”,而非真正的视图对象。DispatcherServlet会通过ViewResolver将逻辑视图名解析为真正的视图对象View。当然,负责数据展示的视图可以为JSP、XML、PDF、JSON等多种数据格式,

      对应Spring MVC均可灵活配置。

  (7)当得到真正的视图对象View后,DispatcherServlet会使用ModelAndView对象中的模型数据对View进行视图渲染。

  (8)最终客户端获得响应消息,根据配置,可以是普通的HTML页面,也可以是一个XML或者JSON格式的数据等。

 

3)Spring MVC框架的特点

  (1)清晰地角色划分。Spring MVC在Model、View和Controller方面提供了一个非常清晰的角色划分,这三个方面真正是各司其职、各负其责。

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

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

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

  (5)国际化支持。

  (6)面向接口编程。

  (7)Spring提供了Web应用开发的一整套流程,不仅仅是MVC,它们之间可以很方面地结合一起。

 

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

标签:springmvc   行数据   文件夹   rop   校验   org   封装   接口调用   创建   

原文地址:https://www.cnblogs.com/jarvis7/p/Spring-MVC.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!