上面三个东西都是什么关系呀?





先看图





注意几点

1 GenericServlet有两个init方法#

2 GenericServlet既实现了ServletConfig方法,它自己由依赖一个ServletConfig(就是说,GenericServlet中有一个成员变量的类型是ServletConfig)






pageContext是在jsp中用的,可以获得页面范围内的一些数据。

ServletContext,里面存放的是Application范围内的参数

ServletConfig里面存放的是本serlvet内部的参数。

关于范围问题

我们看一小段代码

 

  <servlet>
    <servlet-name>dd</servlet-name>
     <init-param>
       <param-name>glt</param-name>
       <param-value>dlf love glt</param-value>
    </init-param>
    <servlet-class>cdm.core.action.dd</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>dd</servlet-name>
    <url-pattern>/servlet/dd</url-pattern>
  </servlet-mapping>

	<context-param>
		<param-name>dlf</param-name>
		<param-value>glt love dlf</param-value>
	</context-param>

在我们的servlet里,在init或者doget/dopost里 写下面的代码:

		System.out.println("dd config "+servletConfig.getInitParameter("glt"));
		System.out.println(" context "+getServletContext().getInitParameter("dlf"));

如果我们肯看一下上面的uml图,就能发现,我们直接在servlet里调用getInitParameter,和上面的servletConfig.getInitParameter是一样的。





当时的一个小疑问

我们知道,ServletConfig里面保存的是本servlet的参数。

那么我猜想,最终保存数据的那个实现了ServletConfig对象的类,里面肯定有一个成员变量是map类型的

上面的图里,genericServlet里面的getInitParameter调用的是ServletConfig的getInitParameter。

那数据到底在哪里呢?

换句话说,GenericServlet里面的ServletConfig到底是个什么类型呢?

开启debug模式

最终,我们能找到StandardWrapperFacade类,它实现了ServletConfig,并且,它包装了StandardWrapper,而StandardWrapper就是我们要找的终极目标。

    /**

     * The initialization parameters for this servlet, keyed by

     * parameter name.

     */

    protected HashMap<String, String> parameters = new HashMap<String, String>();

为什么会有一个facade。

这个东西叫门面模式。

这么吧,大家看看两个类各有多大,你就明白了。

感谢glt

glt?glt是谁?

我媳妇!

程序员有个媳妇多不容易呀,我也就只能在这里炫一下了

参考资料

web.xml中在Servlet中获取context-param和init-param内的参数

PageContext ServletContext ServletConfig辨析的更多相关文章

  1. ServletContext+ServletConfig内容

    ServletConfig { ① //读取web.xml配置信息 ServletConfig config = this.getServletConfig(); //读取类名称 config.get ...

  2. 第一个web程序(web.xml , ServletConfig , ServletContext)

    一:第一个jsp程序 1.项目设计结构 2.新建Person.java package com.java.demo; public class Person { public void printSt ...

  3. JavaWeb学习笔记:ServletConfig()和ServletContext()

    ServletConfig()和ServletContext() 1.ServletConfig() ServletConfig是一个接口,它由server提供商来实现. ServletConfig封 ...

  4. servletconfig和servletcontext学习

    servletconfig java.lang.String getInitParameter(java.lang.String name)  //根据参数名获取参数值 java.util.Enume ...

  5. Server,Servlet,ServletConfig,ServletContext,Session,Request,Response

    Server流程 解析URL->找到应用->找到Servlet->实例化Servlet->调用init->调用service->返回响应->调用destroy ...

  6. ServletContext(重要)

    一个项目只有一个ServletContext对象! 我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据! 这个对象在Tomcat启动时就创建,在Tomcat关 ...

  7. javaWEB总结(4):ServletContext对象方法

    前言:之前每次学到ServletContext对象都会抗拒,跳着学,后面才发现有很多不懂的原理都在这个对象里面,后悔莫及,所以今天特地把他单放在一篇文章里,算是对他的忏悔. 1.什么是ServletC ...

  8. [原创]java WEB学习笔记06:ServletContext接口

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. ServletContext对象应用——三天免登录

    1.用到的知识点: (1)Cookie (2)Session (3)ServletContext 其中Cookie和Session是会话技术的组成部分,一次会话从打开浏览器的某个站点开始,到浏览器关闭 ...

随机推荐

  1. webstorm2017破解

    选择"license server" 输入:http://idea.imsxm.com/ 2017支持vue了

  2. LintCode题解之比较字符串

    使用标记的方式,先遍历一遍B,出现一次就记录一次出现次数,然后遍历A,将记录的B的出现次数消去,最后检查一下记录的标记位是不是都消去了,总共需要检查三次,即进行三次O(n)的遍历. 然后总结出规律如果 ...

  3. Mongo DB 初识

    前言 2016年伊始,开始研究NoSql.看了couchdb,cloudant,cassandra,redis.却一直没有看过排行榜第一的mongo,实属不该.近期会花时间研究下mongo.本文是初识 ...

  4. Android输入控件详解

    输入控件 输入控件是您的应用用户界面中的交互式组件.Android 提供了多种可在 UI 中使用的控件,如按钮.文本字段.定位栏.复选框.缩放按钮.切换按钮等. 向 UI 中添加输入控件与向 XML ...

  5. 使用java操作HDFS

    新建Java Project; 1,右击项目,属性,Java Build Path,Libraries,Add External JARs(haddopp根目录下的所以jar): 2,做一下项目关联, ...

  6. 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。

    int findMaxDifBt2Nums(int* arr, int len) { int maxItem = arr[0], minItem = arr[0]; for (int i = 1; i ...

  7. 将树形递归转换为loop

    class Stack(object): def __init__(self,**kwargs): self.__dict__.update(kwargs) def __str__(self): re ...

  8. Python 继承标准类时发生了什么

    定义标准类dict的一个子类c: >>> class c(dict): pass >>> y=c({1:2,3:4}) >>> y {1: 2, ...

  9. linux源码编译安装OpenCV

    为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以 ...

  10. java.io.FileNotFoundException: ..\lib\commons-el.jar

    安装openfire成功后,启动遇到java.io.FileNotFoundException: ..\lib\commons-el.jar错误,并不是缺少了jar包,只需以管理员身份运行即可解决.