tomcat与springmvc 结合 之---第16篇 servlet如何解析成员变量和DispatcherServlet如何解析

时间:2022-02-21 07:02:36

writedby 张艳涛,用了两个星期将深入刨析tomcat看完了,那么接下来该看什么呢?真是不知道,知识这东西上一个月看的jvm,锁.多线程并发 又都忘了....

tomcat学完,我打算看springmvc因为,spring本质就是一个servlet, 叫DispatcherServlet,那么俩者联系紧密,打算结合二者,进行学习

昨天看了一天发现spring源码,看起来比tomcat要难,因为springmv太杂了

以前看过知道web.xml中的<servlet>标签解析,那么遇到了

 <servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.qcc.study.servlet02.LoginServlet</servlet-class>
<!-- 配置Servlet初始化参数 -->
<init-param>
<param-name>initParam</param-name>
<param-value>qcc</param-value>
</init-param>
<!-- Web容器启动时就加载并实例化该Servlet -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</servlet>

以上的参数该如何解析呢?这个init-param目的就是要给成员变量初始化值,看如何使用

package com.qcc.study.servlet02;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet {
   成员变量1 initParam = null;
    成员变量2=null;

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取servlet初始化参数:
String initParam = getServletConfig().getInitParameter("initParam");
System.out.println("initParam: ---->" + initParam); }

那么可以看到,

<init-parm>配置在<servlet>标签中,用来初始化当前的Servlet的,属于当前Servlet的配置,因此存放在 servletConfig对象中;
通过getServletConfig().getInitParameter("initParam")的方式获取;
如果通过源码来看webruleset中对"web-app/servlet/init-param" 解析

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

看 addInitParameter StandardWrapper中

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

可以看到其实参数以hashmap的方法来组织成键值对,如果使用的时候,实际上是从wrapper容器中取得的,和servlet.class没关系

如果在形成的servlet对象的成员变量赋值写在init()方法里面,最后形成的servlet对象的成员变量就是完全体了,这其实就是dispatchServlet的做法


先看一个dispatchservlet的配置文件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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>springmvcFirst</display-name>
<!-- springMVC前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器、映射器等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- url-pattern:*.action的请交给DispatcherServlet处理。 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping> </web-app>

看这其实是给servlet设值,那么看dispatchservlet的成员变量

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

重点看FrameworkServlet,是dispatcherServlet的父类, 其中有一个成员变量叫contextConfigLocation,对应了标签中的参数名

那么在哪里赋值的呢?

在HttpServletBean的init()方法里面

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

其中init(servletConfig)的调用逻辑

GenericServlet===>

    public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}

本类的this.init(),其实这里使用了模板方法,这个this是指的dispatchservlet对象,

    public void init() throws ServletException {

    }

所以调用的init()方法在 HttpServletBean 中

    public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() + "'");
} // Set bean properties from init parameters.
try {
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
initBeanWrapper(bw);
bw.setPropertyValues(pvs, true);
}
catch (BeansException ex) {
logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
throw ex;
} // Let subclasses do whatever initialization they like.
initServletBean(); if (logger.isDebugEnabled()) {
logger.debug("Servlet '" + getServletName() + "' configured successfully");
}
}

这个方法 在servlet调用getServletConfig()实际上是StandardWrapperFacade,他是StandardWrapper的门面类...

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

最后能看到BW是通过反射来实现属性的注入的

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析


另外说一点,这servlet类的设计,使用了模板方法,是在GenericServlet中的

    public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}

那么看tomcat的调用

tomcat与springmvc 结合 之---第16篇  servlet如何解析成员变量和DispatcherServlet如何解析

这个servlet对象就是dispatchservelet,这样子类调用父类的GenericServlet的init(servletconfig)方法,接着调用this(这个this是子类disptacherservlet对象,可以sout(this)验证).init()方法,

整个dispatcherservlet的调用思路就弄清楚了

tomcat与springmvc 结合 之---第16篇 servlet如何解析成员变量和DispatcherServlet如何解析的更多相关文章

  1. tomcat与springmvc 结合 之---第17篇 StandContext容器和SpringMVC的WebApplicationContext的联系

    writedby 张艳涛, 上一篇分析了,dispatcherservlet通过getServletConfig 方法获取了web.xml定义的<param-init>属性的过程 那么在如 ...

  2. tomcat与springmvc 结合 之---第19篇&lpar;下&comma;补充&rpar; springmvc 加载&period;xml文件的bean标签的过程

    writedby 张艳涛,上一篇写了springmvc对<mvc:annoXXXX/>标签的解析过程,其实是遗漏重要的细节,因为理解的不深入吧 今天接着解析<bean>标签 & ...

  3. tomcat与springmvc 结合 之---第19篇 springmvc 加载&period;xml文件的bean 过程

    writedby 张艳涛,看springmvc 的源码太难了,怎么办, 这篇文章主要分析了看透springmvc的第9章结尾的 如何解析xml 命名空间标签 <?xml version=&quo ...

  4. tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型

    writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...

  5. tomcat与springmvc 结合 之---第20篇 springmvc 对于加载的bean对象存储在哪里

  6. Spring&plus;SpringMVC&plus;MyBatis&plus;easyUI整合基础篇(六)maven整合SSM

    写在前面的话   承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...

  7. 如约而至,Java 10 正式发布! Spring&plus;SpringMVC&plus;MyBatis&plus;easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解&lpar;转载&rpar;

    如约而至,Java 10 正式发布!   3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...

  8. Spring&plus;SpringMVC&plus;MyBatis&plus;easyUI整合基础篇(一)项目简介

    很久之前就打算开始写一下自己的技术博客了,实在抽不出时间所以计划一直搁置了,最近项目进度渐渐缓了下来,不那么忙了,也因此开始筹备自己的博客.说到这次博客的主角,也是无心插柳找到的,来源于两年前自己写的 ...

  9. Spring&plus;SpringMVC&plus;MyBatis&plus;easyUI整合基础篇(三)搭建步骤

    框架介绍: 主角即Spring.SpringMVC.MyBatis.easyUI,大家应该也都有所了解,概念性的东西就不写了,有万能的百度.   工作环境:       jdk 1.7       m ...

随机推荐

  1. Cocos2d-x 核心概念 - 层&lpar;Layer&rpar;

    层(Layer) 一个简单的主界面是由是三个层叠加实现的,从上到下依次为,菜单层,精灵层,背景层 这个次序适用与事件的响应机制,菜单层最先接受到系统事件,然后精灵层,最后背景层 在事件传递的过程中,如 ...

  2. git常用命令-基本操作

    git常用命令-基本操作 1)      新增文件 新增了Test_1.java git add Test_1.java git commit –m “新增了Test_1.java” git push ...

  3. 最初步的正则表达式引擎&colon;nfa的转换规则。

    [在此处输入文章标题] 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码.为了 ...

  4. 关于用 MySQL 存储 Emoji

    http://www.v2ex.com/t/137724 如果你希望让你的网站或者 App 支持 Emoji,那么在初次设置 MySQL 时,有一些细节你需要知道. Emoji Emoji 字符的特殊 ...

  5. 字符编码的故事(ASCII,ANSI,Unicode,Utf-8区别)转载

    http://www.imkevinyang.com/2009/02/字符编解码的故事(ascii,ansi,unicode,utf-8区别).html 很久很久以前,有一群人,他们决定用8个可以开合 ...

  6. JNI&sol;NDK开发指南(二)——JVM查找java native方法的规则

    通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...

  7. Python 基础系列一:初识python&lpar;二&rpar;基本数据类型

    上节拾遗 1.编码转换过程,utf-8转换gbk 过程 经过解码(py27): x.decode('utf-8')-->unicode-->编码x.encode('gbk') ps:py3 ...

  8. 【学亮开讲】Oracle存储过程教学笔记(一)20181115

    --创建业主序列起始值为11 ; --不带传出参数的存储过程 create or replace procedure pro_owners_add ( v_name varchar2,--名称 v_a ...

  9. 好玩的Python库tqdm (转载)

    原文地址: https://blog.csdn.net/zejianli/article/details/77915751 可以显示循环的进度条的库,再也不用担心不知道程序跑到哪里还要跑多久了 tqd ...

  10. 大话java性能优化 pdf 下载(全本)

    扫加公众号,回复”大话java性能优化",免费获取此书.