今天讲解一下在Springmvc中的HandlerAdaptor执行流程,明白这个过程,你就能画出下面的图:

接下来我们就来看看具体的实现过程吧。

1.0在DispatcherServlet中找到getHandlerAdapter()方法

2.0进入getHandlerAdapter()具体的方法实现内

3.0获取ModelAndView:

4.0真正的执行者:

简单地了解一下,还是用具体的代码来加强印象吧。

先把项目的架构搭建完成,依赖节点导入,进行下面的操作。

MAVEN所需的依赖节点:

  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.3</version>
  6. </dependency>
  7.  
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-context</artifactId>
  11. <version>4.3..RELEASE</version>
  12. </dependency>
  13.  
  14. <!--spring web jar 包-->
  15. <dependency>
  16. <groupId>org.springframework</groupId>
  17. <artifactId>spring-web</artifactId>
  18. <version>4.3..RELEASE</version>
  19. </dependency>
  20.  
  21. <!--springmvc jar 包-->
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-webmvc</artifactId>
  25. <version>4.3..RELEASE</version>
  26. </dependency>
  27.  
  28. <!--spring-ormjar 包-->
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-orm</artifactId>
  32. <version>4.3..RELEASE</version>
  33. </dependency>
  34.  
  35. <dependency>
  36. <groupId>org.aspectj</groupId>
  37. <artifactId>aspectjweaver</artifactId>
  38. <version>1.8.</version>
  39. </dependency>
  40.  
  41. <!--servlet api包-->
  42. <dependency>
  43. <groupId>javax.servlet</groupId>
  44. <artifactId>servlet-api</artifactId>
  45. <version>2.5</version>
  46. </dependency>
  47.  
  48. <dependency>
  49. <groupId>org.apache.taglibs</groupId>
  50. <artifactId>taglibs-standard-spec</artifactId>
  51. <version>1.2.</version>
  52. </dependency>
  53.  
  54. <dependency>
  55. <groupId>org.apache.taglibs</groupId>
  56. <artifactId>taglibs-standard-impl</artifactId>
  57. <version>1.2.</version>
  58. </dependency>
  59.  
  60. </dependencies>
  61.  
  62. <build>
  63. <resources>
  64. <resource>
  65. <directory>src/main/java</directory>
  66. <includes>
  67. <include>**/*.xml</include>
  68. <include>**/*.properties</include>
  69. </includes>
  70. </resource>
  71. </resources>
  72. </build>

web.xml的配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. xsi:schemaLocation="
  6. http://java.sun.com/xml/ns/javaee
  7. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  8. version="2.5">
  9. <display-name>Archetype Created Web Application</display-name>
  10.  
  11. <!--中央调度器-->
  12. <servlet>
  13. <servlet-name>springmvc</servlet-name>
  14. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  15. <init-param>
  16. <param-name>contextConfigLocation</param-name>
  17. <param-value>classpath:applicationContextfirst.xml</param-value>
  18. </init-param>
  19. </servlet>
  20.  
  21. <servlet-mapping>
  22. <servlet-name>springmvc</servlet-name>
  23. <url-pattern>/</url-pattern>
  24. </servlet-mapping>
  25.  
  26. </web-app>

示例一:实现简单的访问

准备名称为FirstController的类

  1. public class FirstController implements Controller{
  2.  
  3. /*第一个示例实现Controller接口*/
  4. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  5. ModelAndView av=new ModelAndView();
  6. av.setViewName("index");
  7. return av;
  8. }
  9.  
  10. }

编写applicationfirst.xml:

  1. <!--第一种方式实现-->
  2. <!--处理器-->
  3. <bean id="firstController" class="cn.happy.controller.FirstController"></bean>
  4.  
  5. <!--处理器映射器-->
  6. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  7. <property name="mappings">
  8. <props>
  9. <prop key="/hello">firstController</prop>
  10. </props>
  11. </property>
  12. </bean>
  13.  
  14. <!--视图解析器-->
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>

效果图:

实例二:(注解方式)

  1. @org.springframework.stereotype.Controller
  2. public class FirstController {
  3.  
  4. /*第二个示例注解方式*/
  5. @RequestMapping("")
  6. public String index(){
  7. return "index";
  8. }
  9.  
  10. @RequestMapping("")
  11. public String index2(){
  12. return "index2";
  13. }
  14.  
  15. }

applicationfirst.xml中的配置:

  1. <!--第二种方式实现-注解-->
  2. <!--配置包扫描器-->
  3. <context:component-scan base-package="cn.happy.controller"></context:component-scan>
  4.  
  5. <!--视图解析器-->
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  7. <property name="prefix" value="/"></property>
  8. <property name="suffix" value=".jsp"></property>
  9. </bean>

现在项目中注解式开发还是不错的,简单,简洁。

效果图:

  1. 示例三:(根据不用访问名称来实现访问同一页面)
  1. public class FirstController extends AbstractController{
  2. /*不同的访问名称访问同一个方法*/
  3. protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
  4. ModelAndView av=new ModelAndView();
  5. av.setViewName("index");
  6. return av;
  7. }
  8.  
  9. }

applicationfirst.xml中的配置:

  1. <!--第三种实现方式 不同的访问名称AbstractResolver-->
  2. <!--处理器-->
  3. <bean id="firstController" class="cn.happy.controller.FirstController">
  4. </bean>
  5.  
  6. <!--视图解析器-->
  7. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  8. <property name="prefix" value="/"></property>
  9. <property name="suffix" value=".jsp"></property>
  10. </bean>
  11.  
  12. <!--处理器映射器-->
  13. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  14. <property name="mappings">
  15. <props>
  16. <prop key="/h1">firstController</prop>
  17. <prop key="/h2">firstController</prop>
  18. </props>
  19. </property>
  20. </bean>

效果图:

上图是接口Controller的实现类,我们可以很清晰的看到Controller-------->AbstractController------->MultiActionController,还有一些其他的子类,在这里我们就不一一介绍了,就拿MultiActionController为例。

上面的圈起来的两个类,就是方法名称解析所用到的。

先来第一种方式:PropertiesMethodNameResolver

  1. public class FirstController extends MultiActionController{
  2. /*继承MultiActionController propertiesMethodNameResolver*/
  3. public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response) {
  4. ModelAndView av=new ModelAndView();
  5. av.setViewName("index");
  6. return av;
  7. }
  8.  
  9. public ModelAndView doSecond(HttpServletRequest request, HttpServletResponse response){
  10. ModelAndView av=new ModelAndView();
  11. av.setViewName("index2");
  12. return av;
  13. }
  14.  
  15. }

applicationfirst.xml中的配置:

  1. <!--第四种方式实现 第一种 MultiActionSesolver-->
  2. <!--处理器-->
  3. <bean id="firstController" class="cn.happy.controller.FirstController">
  4. <!--关联方法名称解析器-->
  5. <property name="methodNameResolver" ref="propertiesMethodNameResolver"></property>
  6. </bean>
  7.  
  8. <!--视图解析器-->
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  10. <property name="prefix" value="/"></property>
  11. <property name="suffix" value=".jsp"></property>
  12. </bean>
  13.  
  14. <!--处理器映射器-->
  15. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  16. <property name="mappings">
  17. <props>
  18. <prop key="/*">firstController</prop>
  19. </props>
  20. </property>
  21. </bean>
  22.  
  23. <!--方法名称解析器 PropertiesMethodNameResolver-->
  24. <bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
  25. <property name="mappings">
  26. <props>
  27. <prop key="/h1">doFirst</prop>
  28. <prop key="/h2">doSecond</prop>
  29. </props>
  30. </property>
  31. </bean>

效果图:

另一种方式:ParameterMethodNameResolver,先来一张图看一下

当你不指定paramName的时候默认为action

  1. public class FirstController extends MultiActionController{
  2. /*继承MultiActionController parameterMethodNameResolver*/
  3. public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response) {
  4. ModelAndView av=new ModelAndView();
  5. av.setViewName("index");
  6. return av;
  7. }
  8.  
  9. public ModelAndView doSecond(HttpServletRequest request, HttpServletResponse response){
  10. ModelAndView av=new ModelAndView();
  11. av.setViewName("index2");
  12. return av;
  13. }
  14.  
  15. }

applicationContextfirst.xml的配置:

  1. <!--第四种方式实现 第二种 MultiActionSesolver-->
  2. <!--处理器-->
  3. <bean id="firstController" class="cn.happy.controller.FirstController">
  4. <!--关联方法名称解析器-->
  5. <property name="methodNameResolver" ref="parameterMethodNameResolver"></property>
  6. </bean>
  7.  
  8. <!--视图解析器-->
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  10. <property name="prefix" value="/"></property>
  11. <property name="suffix" value=".jsp"></property>
  12. </bean>
  13.  
  14. <!--处理器映射器-->
  15. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  16. <property name="mappings">
  17. <props>
  18. <prop key="/*">firstController</prop>
  19. </props>
  20. </property>
  21. </bean>
  22.  
  23. <!--方法名称解析器 PropertiesMethodNameResolver-->
  24. <bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  25. <property name="paramName" value="actionName"></property>
  26. </bean>

指定了方法名称解析器的参数,效果图如下:

   
当注释掉之后,默认为action,效果图:

  1. <!--方法名称解析器 PropertiesMethodNameResolver-->
  2. <bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  3. <!--<property name="paramName" value="actionName"></property>-->
  4. </bean>

最后再来一组,访问外部资源和访问内部资源

  1. public class FirstController extends MultiActionController{
  2. public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response) {
  3. ModelAndView av=new ModelAndView();
  4. av.setViewName("jd");
  5. return av;
  6. }
  7.  
  8. }

applicationContextfirst.xml的配置:

  1. <!--外部资源方式-->
  2. <!--处理器-->
  3. <bean id="firstController" class="cn.happy.controller.FirstController">
  4. <property name="methodNameResolver" ref="parameterMethodNameResolver"></property>
  5. </bean>
  6. <!--方法名称解析器-->
  7. <bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  8. </bean>
  9.  
  10. <!--处理器映射器-->
  11. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  12. <property name="mappings">
  13. <props>
  14. <prop key="/*">firstController</prop>
  15. </props>
  16. </property>
  17. </bean>
  18.  
  19. <!--外部资源-->
  20. <bean id="jd" class="org.springframework.web.servlet.view.RedirectView">
  21. <property name="url" value="http://www.jd.com"></property>
  22. </bean>
  23.  
  24. <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"></bean>

在浏览器地址栏中填写如图所示地址:

内部资源访问:

只需要更改一处即可:

  1. <!--外部资源-->
  2. <bean id="jd" class="org.springframework.web.servlet.view.JstlView">
  3. <property name="url" value="index2.jsp"></property>
  4. </bean>

效果图:

Springmvc中的HandlerAdaptor执行流程的更多相关文章

  1. shell中命令的执行流程

    在shell中,一个命令有3中写法: 1 可以直接写(Normal Command) 2 可以放在双引号中("Command") 3 可以放在单引号中('Comand') 这3中写 ...

  2. Django 中 admin 的执行流程

    Django 中 admin 的执行流程 1 循环加载执行所有已经注册的 app 中的 admin.py 文件 def autodiscover(): autodiscover_modules('ad ...

  3. springMVC的架构与执行流程

    SpringMVC术语 前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU. 处理器映射器(HandlerMapping):根据URL去查找处理器 处理器(Han ...

  4. 深入理解java中HelloWorld的执行流程

    HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家! 贴出HelloWorld ...

  5. Linux中Shell的执行流程

    Shell执行流程 1.Printthe info of reminding 打印提示信息 2.Waitinguser for input(wait) 等待用户输入 3.Acceptthe comma ...

  6. 【u-boot】u-boot中initf_dm()函数执行流程(转)

    前部分设备模型初始化 为了便于阅读,删掉部分代码,只留关键的过程: static int initf_dm(void){    int ret;    ret = dm_init_and_scan(t ...

  7. springMVC容器简介和执行流程

    先来看一下,初始化的大体流程:  然后,我们再来看一下,我们的控制器DispatcherServlet的类图及继承关系.  系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到 ...

  8. SpringMVC(关于HandlerMapping执行流程原理分析)

    请求过来先碰见中央调度器(前端调度器) //Determine handler for the current request; 对当前请求决定交给哪个handler, 当前请求地址过来 处理器执行链 ...

  9. TTCN中PTC的执行流程

    一些概念 Component(測试组件或者測试成分),TTCN接触下来最频繁的就是MTC(Main Test Component,主測试组件),在执行測试用例前,须要首先创建一个MTC.在testca ...

随机推荐

  1. jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)

    JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...

  2. linux,修改文件夹权限

    chmod -R 777 dist/ chown windseek:staff dist/   改变dist的权限到staff组里的windseek用户下   alias ll=`ls -al`   ...

  3. centos安装 Anaconda3及使用

    下载安装 下载地址https://www.anaconda.com/download/ 旧版本下载https://repo.continuum.io/archive/ 比如下载Anaconda3-4. ...

  4. vertical-tical

    通常我们需要垂直对齐并排的元素. CSS提供了一些可实现的方法:有时我用浮动float来解决,有时用position: absolute来解决,有时甚至是“肮脏”地手动添加的margin或paddin ...

  5. 【BZOJ4916】神犇和蒟蒻 杜教筛

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4916 第一个询问即求出$\sum_{i=1}^{n} { \mu (i^2)} $,考虑 ...

  6. CPM(Cluster Percolation method)派系过滤算法

    一.概念 (1)完全子图/全耦合网络/k-派系:所有节点全部两两相连 图1 这些全耦合网络也成为派系,k-派系表示该全耦合网络的节点数目为k 1)k-派系相邻:两个不同的k-派系共享k-1个节点,认为 ...

  7. 剑指offer三十三之丑数

    一.题目 如果一个数的因子中,出去1和本身以外,质数因子只包含2.3和5,则把改数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质数因子7. 习惯上我们把1当做是第一个 ...

  8. (转)Linux ldconfig 与 ldd指令

    原文:https://blog.csdn.net/iamzhangzhuping/article/details/49203981 一.ldconfig ldconfig是一个动态链接库管理命令,为了 ...

  9. python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面

    如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argum ...

  10. tensorflow进阶篇-3

    #-*- coding:utf-8 -*- #Tensorflow的嵌入Layer import numpy as np import tensorflow as tf sess=tf.Session ...