现在的位置: 首页 > 综合 > 正文

如何理解“每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文”

2017年11月07日 ⁄ 综合 ⁄ 共 2217字 ⁄ 字号 评论关闭

        开始看到这句话感到很头疼啊,这些日子光看那些基本语法啊什么的,看到这个问题突然感觉一点也不明白。经过上网查,看书才稍微懂得了一点,但是仅仅是懂得了一点点,怕自己忘了,也写在博客里边。

        我是通过看书中JSP中的application内置对象看到的这些。书中有这样一句JSP语句:<% = application . getAttribute(“counter”)%>

        后来看到这个语句被编译成servlet时是这样的:ServletContext sc = getServletConfig() .getServletContext() ;                 out . println (sc . getAttribute(“counter”));

        看到这我就对上边这句话“getServletConfig() . getServletContext() ;”非常的不理解。

        经过查阅明白了以下几点:

        1、  application内置对象是javax.servlet.ServletContext的实例,同时我们也要知道在四种属性范围中application是最大的,是在整个web应用程序中有效。

        2、  知道application内置对象是javax.servlet.ServletContext的实例,也就不难理解为什么编译成servlet之后会出现ServletContext sc声明语句。因为application是在JSP中才有的,在servlet中是没有的,所以servlet还要编译成与application相对应的对象,也就是ServletContext的实例对象。

        3、  对于ServletContext和ServletConfig的理解确实不敢胡言乱语。在此附下某些网友的观点:

        l  “其实ServletContext就是用来存东西的。他伴随Servlet存在而存在,当你关闭浏览器,他仍然存在。每一个Servlet有一个上下文,只要这个Servlet没有消失,他就一直存在。具体的运用,例如,当客户访问我的Servlet时,我要记录下他的一些信息,比如IP,用户名,登陆状态之类的,以便我识别此用户。当他关了浏览器,再次访问我的页面时,我仍然能认出,访问者依然是他。类似的还有session,cookie之类的,都是用来存东西,具体的差别请参阅相关资料。”

        l  “条件:假设说我们有一个WEB应用,这个WEB应用中有10个SERVLET。
在这里,这个WEB应用就拥有一个它自己的仓库-ServletContext,而这10个Servlet则共享这个大仓库,并且各自拥有属于他们自己的小仓库-ServletConfig。
ServletContext就是一个全局的概念,它属于应用,但我们有时候不想让某些参数被其他Servlet应用,仅仅想在自己的Servlet中被共享,这时候就需要把它保存在ServletConfig中,换句话说,从【一个Servlet】来看,ServletConfig是它的全局,而从一个【Servlet集合(Web应用)】来看,ServletContext是它的全局。”

        l  “假设现在要运行一个应用。
1.Tomcat启动→读入xml文件
2.容器为这个应用建立一个新的ServletContext实例,应用的所有部分都共享这个上下文
3.如果xml中有定义上下文的初始参数,则容器首先创建初始参数实例(应该就像一个Bean一样)
4.把初始化参数实例的引用交给ServletContext
5.容器建立一个新的servlet,这时建立一个新的ServletConfig对象,并且为这个ServletConfig对象提供一个ServletContext的引用
6.调用servlet的init()方法初始化servlet
由第5步可以看出,每个servlet中都有一个上下文(ServletContext)的引用,因此,servlet都知道这个上下文。
但是ServletContext的实例比Servlet先诞生,所以ServletContext诞生的时候并不知道Servlet的存在。
在JAVA EE API文档中
ServlectContext拥有获得Servlet的方法
例如:Servlet getServlet(String name)  
但是,这一类的方法已经废弃了,从注释中可以看出,原先的这些方法返回的值是null,也就是无法获得servlet
因此,ServlectContext诞生的时候并不知道Servlet的存在,它的诞生仅仅是因为容器诞生了~~
我个人感觉,ServletContext中并没有Servlet的信息,相反,每个Servlet中都持有ServletContext的引用。”

        l  “这个servlet上下文是这样来的
ServletContext,拆成两个字就是servlet context。
context翻译过来是环境,上下文的意思。
很多地方怕说“环境”太好理解了,所以干脆翻译成“上下文”。”

具体是怎么样,我也不肯定,我只能从各位网友的观点中尽量吸取知识。

不过通过这件事儿还是让我明白了很重要的一点:每天把这书背知识点效率不高,也不能让自己慢慢变成一个知其然而不知其所以然的人。搞技术必须要能追问,一定要刨根问底,要不然总是会被别人踩在脚下。

抱歉!评论已关闭.