java web上下文_如何理解“每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文” | 学步园...

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

我是通过看书中JSP中的application内置对象看到的这些。书中有这样一句JSP语句:

后来看到这个语句被编译成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翻译过来是环境,上下文的意思。

很多地方怕说“环境”太好理解了,所以干脆翻译成“上下文”。”

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值