前面简单的分析了一下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. 第1讲 Redis部署与基本操作

    目录 一.简介 二.安装 1.默认安装位置 2.指定安装位置 3.安装的可执行文件的作用 三.启动与关闭 四.配置文件 五.Redis的数据类型 1. 共计5种类型 2. String(子串类型) 3 ...

  2. Android开发学习之路-GSON使用心得(OCR图片识别)

    在安卓中解析JSON串可以使用的方法有很多,比如说用官方提供的JSONObject或者谷歌提供的开源库GSON,以及一些第三方开源库. 这里用的是GSON,为了测试方便,借助了一个百度的api,一个图 ...

  3. Java线程:线程状态的转换

    Java线程:线程状态的转换   一.线程状态   线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下:   1.新状态:线程对象已 ...

  4. Java正则表达式应用详解

    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字 ...

  5. fir.im Weekly - 人人都需要的 IT 技能图谱

    AlphaGo 与李世石的人机世纪大战落下帷幕,不禁让人思考<失控> 中说道的 "机器正在生物化,而生物正在工程化 ".作为人类,在未来能否保全最后的智力骄傲成为一个疑 ...

  6. ftp下载目录下所有文件及文件夹内(递归)

    ftp下载目录下所有文件及文件夹内(递归)   /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...

  7. javascript_basic_01之概述

    1.javascript组成: ①核心ECMAScript:②文档对象模型DOM(Document Object Model):③浏览器对象模型BOM(Browser Object Model): 2 ...

  8. linux命令 - export - 设置环境变量

    linux命令 - export - 设置环境变量 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供 ...

  9. jQuery学习易忘细节

    1.类似于alert(""),但不会中断页面操作:console.log("last"); 2.javascript是HTML5以及所有现代浏览器中的默认脚本语 ...

  10. LLBL Gen Template Studio 2.x

    Template Studio for LLBLGen Pro released Today we released Template Studio, a full-featured IDE for ...