0
点赞
收藏
分享

微信扫一扫

PageContext ServletContext ServletConfig辨析


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




先看图


PageContext ServletContext ServletConfig辨析_ServletContext



注意几点


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内的参数​​


举报

相关推荐

0 条评论