前面简单的分析了一下DispatcherServlet,接下来分析一下Controller,在web的MVC中,Controller就是其中的C,启动的一些页面逻辑处理,页面映射的功能:

首先看看超类:

public interface Controller {
//处理请求,最后返回一个ModelAndView对象,这里的ModelAndView就是我们前面分析过:在DispatchServlet中的doDispath()这个方法里面
//会通过render方法得到ModelAndView对象,如果返回一个null,并不代表这是错误的,而是表示这个request已经执行完了,所以不能够
//通过render方法得到ModelAndView
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

上面已经讲得很清楚了。就是在DispatcherSerlvet中,每一个request请求都会被拦截,然后在根据各自配置的bean在Controller走一遭,返回一个ModelAndView。

在Controller的子类有一个需要看一下,就是:

public abstract class AbstractController extends WebContentGenerator implements Controller {

我们看到它不仅继承了Controller,还继承了 WebContentGenerator,那我们先看看这个类都是干嘛的:

源码:

public abstract class WebContentGenerator extends WebApplicationObjectSupport {

    /** HTTP method "GET" */
public static final String METHOD_GET = "GET"; /** HTTP method "HEAD" */
public static final String METHOD_HEAD = "HEAD"; /** HTTP method "POST" */
public static final String METHOD_POST = "POST"; private static final String HEADER_PRAGMA = "Pragma"; private static final String HEADER_EXPIRES = "Expires"; private static final String HEADER_CACHE_CONTROL = "Cache-Control"; /** Set of supported HTTP methods */
private Set<String> supportedMethods; private boolean requireSession = false; /** Use HTTP 1.0 expires header? */
private boolean useExpiresHeader = true; /** Use HTTP 1.1 cache-control header? */
private boolean useCacheControlHeader = true; /** Use HTTP 1.1 cache-control header value "no-store"? */
private boolean useCacheControlNoStore = true; private int cacheSeconds = -; private boolean alwaysMustRevalidate = false;
/***
  some operation about attr
***/ }

明白了,其实就时对缓存的一系列操作。下面对重要的属性分析一下:

1.supportedMethods:表示支持的请求方法,我们可以看到前面已经定义了三个常量,不错,这三个就是默认的请求方法,我们可以自己添加所支持的请求方法。

2requireSession:当前的这个请求是否必须session,如果设置了必须,那么请求当没有带session的话,是会报错的。

3 后面的这几个都是关于缓存的操作,包括HTTP1.0和HTTP1.1

4.alwaysMustRevalidate :如果一个处理器继承了LastModified,那么最好是设置为true,他能自动的计算lastModified。不过如果一个处理器没有继承,即使设置了true

也是没有用的。

从上面的分析知道了WebContentGenerator的作用,也就是说,WebContentGenerator有的功能,AbstractController也会具有这些的功能。除了这些功能外,

AbstractController很重要的一个功能就是继承Controller的那个方法,

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception { // Delegate to WebContentGenerator for checking and preparing.
checkAndPrepare(request, response, this instanceof LastModified); // Execute handleRequestInternal in synchronized block if required.  
    //串行化设置
if (this.synchronizeOnSession) {
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
return handleRequestInternal(request, response);
}
}
}
    //AbstractController提供的模板方法,子类的实现都是写在其中了。
return handleRequestInternal(request, response);
}

至于其他的AbstractController的子类,其实就是springmvc不同业务开发出来了Controller,以供我们可以根据自己的业务需要来进行调用。这里就不分析了。提供一个自己实现的Controller参考:

public class TestController extends AbstractController{

    @Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv=new ModelAndView();
System.out.println("=====");
mv.setViewName("index");
return mv;
} }

配置文件:

    <bean id="/index" class="com.hotusm.controller.TestController"/>

    <!-- 这里配置视图解析器 -->
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 视图适配器 -->
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

这种都是以前的用法,也就是为了理解,才会那么些,现在的项目大部分都是利用注解的形式了,

springmvc(2)Controller源码简单解析的更多相关文章

  1. springmvc(1)DispatcherServlet源码简单解析

    springmvc的简单配置 1.首先需要在web.xml中配置DispatcherServlet,这个类是springmvc的核心类,所以的操作都是由这里开始,并且大部分都是在这里面实现的,比如各种 ...

  2. node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例)

    title: node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例) date: 2020-11-27 tags: node native sqlite3 前言 简单来 ...

  3. Spring之SpringMVC的Controller(源码)分析

    说明: 例子就不举了,还是直接进入主题,本文主要是以SpringMVC的Controller接口为入点,来分析SpringMVC中C的具体实现和处理过程. 1.Controller接口 public ...

  4. Okhttp源码简单解析(一)

    业余时间把源码clone下来大致溜了一遍,并且也参阅了其余大神的博客,在这里把自己的心得记录下来共享之,如有不当的地方欢迎批评指正.本文是Okttp源码解析系列的第一篇,不会深入写太多的东西,本篇只是 ...

  5. ForkJoinPool源码简单解析

    ForkJoin框架之ForkJoinTask  java  阅读约 62 分钟 前言 在前面的文章"CompletableFuture和响应式编程"中提到了ForkJoinTas ...

  6. StringBudiler源码简单解析

    StringBudiler源码 继承关系树 底层实现 默认容量() 特别的添加方法(append) 1.继承关系树 继承自AbstractStringBuilder与StringBuffer同族 2. ...

  7. 源码深度解析SpringMvc请求运行机制(转)

    源码深度解析SpringMvc请求运行机制 本文依赖的是springmvc4.0.5.RELEASE,通过源码深度解析了解springMvc的请求运行机制.通过源码我们可以知道从客户端发送一个URL请 ...

  8. SpringMVC 源码深度解析&lt;context:component-scan&gt;(扫描和注冊的注解Bean)

    我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...

  9. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

随机推荐

  1. MVVM架构~knockoutjs系列之文本框数符长度动态统计功能

    返回目录 这个功能为什么要写呢,因为在之前做了一个前端的页面效果,使用JS写的,感觉很累,真的,对于一个文本框长度动态统计,你要写blur,press,down什么的事件,太麻烦了,这时,我想到了kn ...

  2. JSONP浅析

    DEMO : JSONP示例 为什么使用JSONP JSONP和JSON是不一样的.JSON(JavaScript Object Notation)是一种基于文本的数据交换方式,或者叫做数据描述格式. ...

  3. Jquery实现一组复选框单选

    完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  4. Linux下MakeFile初探

    make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单 ...

  5. MySQL(二) 数据库数据类型详解

    序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...

  6. 快速入门系列--WCF--07传输安全、授权与审核

    这部分主要涉及企业级应用的安全问题,一般来说安全框架主要提供3个典型的安全行为:认证.授权和审核.除了典型的安全问题,对于一个以消息作为通信手段的分布式应用,还需要考虑消息保护(Message Pro ...

  7. sys.dm_db_wait_stats

    sys.dm_db_wait_stats 返回在操作期间执行的线程所遇到的所有等待的相关信息. 可以使用此聚合视图来诊断 Azure SQL Database 以及特定查询和批处理的性能问题. 执行查 ...

  8. 《BI那点儿事》Microsoft 逻辑回归算法——预测股票的涨跌

    数据准备:一组股票历史成交数据(股票代码:601106 中国一重),起止日期:2011-01-04至今,其中变量有“开盘”.“最高”.“最低”.“收盘”.“总手”.“金额”.“涨跌”等 UPDATE ...

  9. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  10. 简明 Git 命令速查表

    本文总结了git常用的命令,以便学习者使用时查阅~   几个专用名词的译名如下 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote ...