一、SpringMVC简介

    SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,并管理应用所需对象的生命周期,为简化日常开发,提供了很大便利。

    SpringMVC提供了总开关DispatcherServlet;请求处理映射器(Handler Mapping)和处理适配器(Handler Adapter),视图解析器(View Resolver)进行视图管理;动作处理器Controller接口(包含ModelAndView,以及处理请求响应对象request和response),配置灵活,支持文件上传,数据简单转化等强大功能。

  二、工作流程与介绍

      (1)客户端通过url发送请求

      (2-3)核心控制器Dispatcher Servlet接收到请求,通过系统或自定义的映射器配置找到对应的handler,并将url映射的控制器controller返回给核心控制器。

      (4)通过核心控制器找到系统或默认的适配器

      (5-7)由找到的适配器,调用实现对应接口的处理器,并将结果返回给适配器,结果中包含数据模型和视图对象,再由适配器返回给核心控制器

      (8-9)核心控制器将获取的数据和视图结合的对象传递给视图解析器,获取解析得到的结果,并由视图解析器响应给核心控制器

      (10)核心控制器将结果返回给客户端

 

    三、代码截图

web.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. version="3.0">
  6.  
  7. <!-- 配置:所有请求由SpringMVC管理-->
  8. <servlet>
  9. <servlet-name>DispatcherServlet</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>DispatcherServlet</servlet-name>
  15. <url-pattern>*.do</url-pattern>
  16. </servlet-mapping>
  17.  
  18. </web-app>

DispatcherServlet-servlet.xml:

  1. url处理映射的三种方式:[通过访问路径找到对应的控制器]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- DispatcherServlet拦截所有请求 -> 通过访问url路径找到对应的控制器 -> 通过适配器调用控制器的方法
  6. -> 控制器里面的方法处理业务 -> 通过视图解析器返回数据到页面 -> 形成视图 -->
  7.  
  8. <!-- 1.配置url处理映射
  9. url处理映射的三种方式:[通过访问路径找到对应的控制器]
  10. 1.BeanNameUrlHandlerMapping:通过url名字找到对应的bean的name控制器
  11. 2.SimpleUrlHandlerMapping:[简单的url处理映射]通过key找到bean的id的控制器
  12. 3.ControllerClassNameHandlerMapping:[控制器的类名处理映射]-不用配置访问路径,
  13. 默认的访问路径就是类名,首字母大写变小写,加.do ->userController.do
  14. -->
  15. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  16. <!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">-->
  17. <!--<property name="mappings">-->
  18. <!--<props>-->
  19. <!--<prop key="/user1.do">userController</prop>-->
  20. <!--<prop key="/user2.do">userController</prop>-->
  21. <!--<prop key="/user3.do">userController</prop>-->
  22. <!--</props>-->
  23. <!--</property>-->
  24. <!--</bean>-->
  25. <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
  26. <!-- 2.配置控制器处理适配器[配置如何调用控制器的方法]
  27. 两种方式:(返回值不同)
  28. 第一种:SimpleControllerHandlerAdapter
  29. 功能:执行controller,调用controller里面的方法,返回modelAndView
  30. -->
  31. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
  32. <!-- 第二种:HttpRequestHandlerAdapter
  33. 功能:执行controller,调用controller里面的方法,返回null
  34. -->
  35. <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
  36. <!-- 3.配置控制器-->
  37. <!--<bean name="/user.do" class="com.lg.controller.UserController"></bean>-->
  38. <!--<bean id="userController" class="com.lg.controller.UserController"></bean>-->
  39. <bean class="com.lg.controller.UserController"></bean>
  40. <bean name="/http.do" class="com.lg.controller.HttpController"></bean>
  41. <!-- 4.配置资源解析器-->
  42. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  43. <property name="prefix" value="/WEB-INF/views"></property>
  44. <property name="suffix" value=".jsp"></property>
  45. </bean>
  46.  
  47. </beans>
  1.  

UserController:

  1. package com.lg.controller;
  2.  
  3. import org.springframework.web.servlet.ModelAndView;
  4. import org.springframework.web.servlet.mvc.Controller;
  5.  
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8.  
  9. public class UserController implements Controller {
  10.  
  11. @Override
  12. public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
  13.  
  14. ModelAndView mav=new ModelAndView("/user/usrelist");
  15.  
  16. mav.addObject("name","liu");
  17. return mav;
  18. }
  19. }

HttpController:

  1. package com.lg.controller;
  2.  
  3. import org.springframework.web.HttpRequestHandler;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9.  
  10. public class HttpController implements HttpRequestHandler {
  11. @Override
  12. public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. // ModelAndView mav=new ModelAndView("/user/usrelist");
  14. //
  15. // mav.addObject("name","liu");
  16. // return mav;
  17. request.setAttribute("name","liu");
  18. request.getRequestDispatcher("/WEB-INF/views/user/usrelist.jsp").forward(request,response);
  19. }
  20. }

以下组件通常使用框架提供实现:
1、DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

2、HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

4、HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

5、 ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

6、View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。

四、适配器作用

    SpringMVC涉及的映射器,视图解析器的作用不难理解,映射器负责将前端请求的url映射到配置的处理器,视图解析器将最终的结果进行解析,但中间为什么要经过一层适配器呢,为什么不经映射器找到controller后直接执行返回呢?

    那是因为SpringMVC为业务处理器提供了多种接口实现(例如实现了Controller接口),而适配器就是用来根据处理器实现了什么接口,最终选择与已经注册好的不同类型的Handler Adapter进行匹配,并最终执行,例如,SimpleControllerHandlerAdapter是支持实现了controller接口的控制器,如果自己写的控制器实现了controller接口,那么SimpleControllerHandlerAdapter就会去执行自己写的控制器中的具体方法来完成请求。

springmvc url处理映射的三种方式:的更多相关文章

  1. SpringMVC返回json数据的三种方式

    1.第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew. 如:<bean id="defaultJsonView" cla ...

  2. SpringMVC返回json数据的三种方式(转)

    原文:https://blog.csdn.net/shan9liang/article/details/42181345# 1.第一种方式是spring2时代的产物,也就是每个json视图contro ...

  3. springmvc 异常统一处理的三种方式详解

    1 描述  在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦 ...

  4. SpringMVC访问静态资源的三种方式(转)

    本文转自:http://www.iigrowing.cn/springmvc_fang_wen_jing_tai_zi_yuan_de_san_zhong_fang_shi.html 如何你的Disp ...

  5. 转转转!SpringMVC访问静态资源的三种方式

    如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  6. 当配置 DispatcherServlet拦截“/”,SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  7. SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  8. 【转】SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  9. SpringMVC上传文件的三种方式(转)

    直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...

随机推荐

  1. LintCode刷题笔记--Longest Increasing Subsequence

    标签: 动态规划 描述: Given a sequence of integers, find the longest increasing subsequence (LIS). You code s ...

  2. SAS之大话PDV

    SAS之大话PDV 之所以说是数据源,而非输入缓冲区的原因上一条推送已经说明,这里就不再啰嗦啦. 这里我们且将DATA步流程简单地分为从数据源读入到pdv和从pdv写入数据集. IF语句 & ...

  3. HTML-DOM实例——实现带样式的表单验证

        HTML样式 基于table标签来实现页面结构 <form id="form1"> <h2>增加管理员</h2> <table&g ...

  4. iPhone开发之深入浅出 (7) — ARC总结

    原文链接:http://www.yifeiyang.net/development-of-the-iphone-simply-7/ 通过前面几篇文章的介绍,我想大家应该对ARC有了一个比较完整的理解. ...

  5. LintCode_408 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示). 思路 string s = ""; 目标字符串 cp 存储进位;取 0或1 sum = a[i] + b[i] + cp;分为 ...

  6. 权限系统的设计模式 ACL RBAC ABAC

    ACL(Access Control List):访问权限列表  如: user1-->AC1 user1-->AC2 user2-->AC1    此时权限汇总成一个列表 这种设计 ...

  7. java定时(循环)执行一个方法

    java中设置定时任务用Timer类可以实现. 一.延时执行 首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行.代码如下: package test ...

  8. Python内存机制简介

    1: 变量不是盒子,应该把变量视作便利贴.变量只不过是标注,所以无法阻止为对象贴上多个标注.标注就是别名: >>> a = [1, 2, 3] >>> b = a ...

  9. Laravel请求和输入

    该篇文章主要介绍Laravel获取用户请求和输入信息的方法.获取基本输入信息: //获取输入数据,不用担心所使用的HTTP方法 $id = Input::get('id'); //可以指定默认值 $i ...

  10. jq获取浏览器可视窗口的高度

    <script> var window_height = $(window).height(); </script>