上面三个东西都是什么关系呀?
先看图
注意几点
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是谁?
我媳妇!
程序员有个媳妇多不容易呀,我也就只能在这里炫一下了