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

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

1.0在DispatcherServlet中找到getHandlerAdapter()方法

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

3.0获取ModelAndView:

4.0真正的执行者:

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

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

MAVEN所需的依赖节点:

    <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3..RELEASE</version>
</dependency> <!--spring web jar 包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3..RELEASE</version>
</dependency> <!--springmvc jar 包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3..RELEASE</version>
</dependency> <!--spring-ormjar 包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3..RELEASE</version>
</dependency> <dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.</version>
</dependency> <!--servlet api包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency> <dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.</version>
</dependency> <dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.</version>
</dependency> </dependencies> <build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>

web.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Archetype Created Web Application</display-name> <!--中央调度器-->
<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:applicationContextfirst.xml</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>

示例一:实现简单的访问

准备名称为FirstController的类

public class FirstController implements Controller{

    /*第一个示例实现Controller接口*/
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView av=new ModelAndView();
av.setViewName("index");
return av;
} }

编写applicationfirst.xml:

 <!--第一种方式实现-->
<!--处理器-->
<bean id="firstController" class="cn.happy.controller.FirstController"></bean> <!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello">firstController</prop>
</props>
</property>
</bean> <!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

效果图:

实例二:(注解方式)

@org.springframework.stereotype.Controller
public class FirstController { /*第二个示例注解方式*/
@RequestMapping("")
public String index(){
return "index";
} @RequestMapping("")
public String index2(){
return "index2";
} }

applicationfirst.xml中的配置:

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

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

效果图:

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

applicationfirst.xml中的配置:

<!--第三种实现方式 不同的访问名称AbstractResolver-->
<!--处理器-->
<bean id="firstController" class="cn.happy.controller.FirstController">
</bean> <!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean> <!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/h1">firstController</prop>
<prop key="/h2">firstController</prop>
</props>
</property>
</bean>

效果图:

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

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

先来第一种方式:PropertiesMethodNameResolver

public class FirstController extends MultiActionController{
/*继承MultiActionController propertiesMethodNameResolver*/
public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response) {
ModelAndView av=new ModelAndView();
av.setViewName("index");
return av;
} public ModelAndView doSecond(HttpServletRequest request, HttpServletResponse response){
ModelAndView av=new ModelAndView();
av.setViewName("index2");
return av;
} }

applicationfirst.xml中的配置:

<!--第四种方式实现 第一种 MultiActionSesolver-->
<!--处理器-->
<bean id="firstController" class="cn.happy.controller.FirstController">
<!--关联方法名称解析器-->
<property name="methodNameResolver" ref="propertiesMethodNameResolver"></property>
</bean> <!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean> <!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*">firstController</prop>
</props>
</property>
</bean> <!--方法名称解析器 PropertiesMethodNameResolver-->
<bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/h1">doFirst</prop>
<prop key="/h2">doSecond</prop>
</props>
</property>
</bean>

效果图:

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

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

public class FirstController extends MultiActionController{
/*继承MultiActionController parameterMethodNameResolver*/
public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response) {
ModelAndView av=new ModelAndView();
av.setViewName("index");
return av;
} public ModelAndView doSecond(HttpServletRequest request, HttpServletResponse response){
ModelAndView av=new ModelAndView();
av.setViewName("index2");
return av;
} }

applicationContextfirst.xml的配置:

  <!--第四种方式实现  第二种 MultiActionSesolver-->
<!--处理器-->
<bean id="firstController" class="cn.happy.controller.FirstController">
<!--关联方法名称解析器-->
<property name="methodNameResolver" ref="parameterMethodNameResolver"></property>
</bean> <!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean> <!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*">firstController</prop>
</props>
</property>
</bean> <!--方法名称解析器 PropertiesMethodNameResolver-->
<bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="actionName"></property>
</bean>

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

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

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

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

public class FirstController extends MultiActionController{
public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response) {
ModelAndView av=new ModelAndView();
av.setViewName("jd");
return av;
} }

applicationContextfirst.xml的配置:

    <!--外部资源方式-->
<!--处理器-->
<bean id="firstController" class="cn.happy.controller.FirstController">
<property name="methodNameResolver" ref="parameterMethodNameResolver"></property>
</bean>
<!--方法名称解析器-->
<bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
</bean> <!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*">firstController</prop>
</props>
</property>
</bean> <!--外部资源-->
<bean id="jd" class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="http://www.jd.com"></property>
</bean> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"></bean>

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

内部资源访问:

只需要更改一处即可:

 <!--外部资源-->
<bean id="jd" class="org.springframework.web.servlet.view.JstlView">
<property name="url" value="index2.jsp"></property>
</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. UINavigationBar 的视觉效果

    有很多属性可以决定导航栏的视觉效果,下面做一下总结 barStyle 属性 白底黑字 default 黑底白字 black blackOpaque 和 blackTranslucent 已被 Depr ...

  2. 解决axios请求本地的json文件在打包后路径出错问题

    vue 项目中使用axios请求了本地项目的static文件夹下的json文件,使用npm run build 打包后,在Hbuilder编辑器打开,页面报错404: 在浏览器打开的路径 http:/ ...

  3. 【bzoj2422】 Times 前缀和

    本来想练一下树状数组的,看到网上某人的blog后点了进来. 第一眼发现不会,出去上了个厕所发现离散化后不是一道简单前缀和题吗. 考虑到每一个人出现且仅出现一次,且出现的时间是在一个连续的区间内. 那么 ...

  4. NOIP上机测试注意事项

    由于近期模拟题原地**次数较多,故写一篇警示文 1,头文件 1.1正式比赛中,反正我不敢用bits/stdc++.h. 1.2正式比赛中,建议打出以下十个库 #include<iostream& ...

  5. centos 7 keepalived故障邮件通知实战(附Python邮件发送脚本)

    centos 7 keepalived故障邮件通知实战(附Python邮件发送脚本) #####################     sendmail.py  begin     ######## ...

  6. 我与GitHub的第一次——自制音乐文件修改器

    背景: 随机播放,所有的音乐播放器里面现在几乎都有这个功能吧.但是有没有发现,自己的播放器在选择随机播放的时候,经常会听到重复顺序的歌曲呢?反正我是有这样的感觉,无耐自己平时下的歌曲都是“歌手名—歌曲 ...

  7. invokespecial与invokevirtual指令的区别

    package com.test19; class Father { public void publicMethod() { privateMethod(); // this是Son对象,调用Fat ...

  8. 前端通信:ajax设计方案(一)---集成核心请求

    报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉 ...

  9. Java虚拟机(六):JVM调优工具

    工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...

  10. MySQL命令行导入导出数据

    参考:http://www.cnblogs.com/xcxc/archive/2013/01/30/2882840.html 这篇文章写得非常好,又简洁,而且深入浅出,排版也非常好看,不会像网上的只是 ...