- 浏览: 273514 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
" target="_blank" ...
spring框架学习笔记(二)——spring的ioc之Resource -
15533921258:
楼主写的真不错啊,很多人的博客只说客户端发一次请求就会生成ht ...
Servlet学习整理(四)—— ServletRequest和ServletResponse -
rc111x:
当你所有的东西都弄好之后,在项目里面启动jetty服务器后出现 ...
利用maven创建webx3项目——实现简单的留言板(六) -
rc111x:
rc111x 写道L_Griselda 写道L_Griseld ...
利用maven创建webx3项目——实现简单的留言板(六) -
rc111x:
L_Griselda 写道L_Griselda 写道你好,我想 ...
利用maven创建webx3项目——实现简单的留言板(六)
ServletContext简介
如果想获取servlet运行时的环境信息,比如初始化参数、资源url等,那么就了解ServletContext吧。
在servlet规范中,ServletContext接口定义为servlet运行环境的信息,也就是说可以从这个接口的实现对象中获取一切关于运行环境的东西;
那么这个接口的实现在哪?
这个接口的实现当然是在servlet引擎中了,由servlet引擎的提供商负责维护。
ServletContext对象是什么时候生成的呢?
Servlet容器在启动时会加载Web应用,并为每个Web应用创建一个唯一的ServletContext对象;通过这个对象能够获得初始化参数、log事件、资源的URL和实现Web应用范围内的数据共享;
对于分布式的应用呢?
当web应用分布在多个虚拟机上时,web应用在所分布的每个虚拟机上都拥有一个ServletContext实例。缺省情况下,ServletContext不是分布式的,并且只存在于一个虚拟机上。
详细的介绍参见——《servlet规范》。
注意:ServletContext常常被翻译成“servlet上下文”,刚开始很难理解这个词,最后才明白就是ServletContext,坑爹啊,这种最基本的接口竟被翻译了一半。
ServletContext与应用访问路径
每一个ServletContext在web服务中都会有一个路径与之绑定,作为外部访问其所在web应用的根路径;
例如:如果路径http://localhost/myservlet/ 被绑定到某个ServletContext,那么所有以/myservlet/开头的请求都将路由到这个ServletContext所在的web应用中,且该路径为web应用的根路径。
通常这种路径的对应关系是在web服务器中配置的,例如tomcate在conf/server.xml中配置web应用的根路径,然后该路径被绑定到其运行生成的ServletContext。
ServletContext的应用举例
这里只列举了ServletContext两个比较常用的功能,目的是从实际代码的层面来加深对servletContext的理解。
1、获取初始化参数
接着上一篇的myservlet应用,在包com.myservlet.app.servlet下创建新的类ContextTestServlet.java,源码如下:
public class ContextTestServlet extends HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext sc= getServletContext(); StringBuilder sb = new StringBuilder(); sb.append("InitParameterNames:"); Enumeration e = sc.getInitParameterNames(); String name; while(e.hasMoreElements()){ sb.append("<p/>"); name = e.nextElement().toString(); sb.append(name); sb.append(":"); sb.append(sc.getInitParameter(name)); } output(response, sb.toString()); } private void output(HttpServletResponse response,String msg) throws IOException{ // 设置输出 response.setContentType("text/html;charset=GBK"); PrintWriter printWriter = response.getWriter(); printWriter.println("<HTML><HEAD><TITLE>myFirstServlet</TITLE>"); printWriter.println("</HEAD><BODY>"); printWriter.println(msg); printWriter.println("</BODY></HTML>"); } }
在servlet的实例中,通过getServletContext()方法即可获得其所在环境的ServletContext对象;
通过sc.getInitParameterNames()获得初始化参数集合;
通过sc.getInitParameter(name)获得初始化参数的值。
修改web.xml,配置新建的servlet和初始化参数,如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <context-param> <param-name>webName</param-name> <param-value>myservlet</param-value> </context-param> <context-param> <param-name>webStatus</param-name> <param-value>test</param-value> </context-param> <!-- MyFirstServlet --> <servlet> <servlet-name>my_first_servlet</servlet-name> <servlet-class>com.myservlet.app.servlet.MyFirstServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>my_first_servlet</servlet-name> <url-pattern>/hello.htm</url-pattern> </servlet-mapping> <!-- GetContextServlet --> <servlet> <servlet-name>contextTestServlet</servlet-name> <servlet-class>com.myservlet.app.servlet.ContextTestServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>contextTestServlet</servlet-name> <url-pattern>/viewContext.htm</url-pattern> </servlet-mapping> </web-app>
启动tomcat,在浏览器中输入:http://localhost:8080/viewContext.htm,即可看到以下结果。
2、应用范围内共享数据
在ContextTestServlet.java中添加代码,如下:
public class ContextTestServlet extends HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ...... sc.setAttribute("tag", "from ContextTestServlet"); } private void output(HttpServletResponse response,String msg) throws IOException{ ... ... } }
通过 sc.setAttribute("tag", "from ContextTestServlet")在servletContext中保存一个名为tag的属性。
修改MyFirstServlet.java的代码,如下:
public class MyFirstServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取用户的name String name = request.getParameter("name"); // 对name进行转码 if (name != null) { name = new String(name.getBytes("ISO-8859-1"), "GBK"); } else { name = "陌生人"; } ServletContext sc= getServletContext(); String tag = (String) sc.getAttribute("tag"); // 设置输出 response.setContentType("text/html;charset=GBK"); PrintWriter printWriter = response.getWriter(); printWriter.println("<HTML><HEAD><TITLE>myFirstServlet</TITLE>"); printWriter.println("</HEAD><BODY>"); printWriter.println("<h1>" + name + ":您好!"); printWriter.println("<p>" + tag); printWriter.println("</h1>"); printWriter.println("</BODY></HTML>"); } }
通过sc.getAttribute("tag")获取servletContext中的tag属性值
启动tomcat,在浏览器中输入:http://localhost:8080/hello.htm,得到如下结果:
然后访问http://localhost:8080/viewContext.htm,再访问http://localhost:8080/hello.htm,如下:
由此可见,在ContextTestServlet中设置的tag属性,通过servletContext在同一应用的其他Servlet中得到了共享,即实现了应用范围内的数据共享。
问题:
1、Servlet容器、servlet引擎、servlet程序,和web服务器,web应用程序它们到底有什么不同,有什么联系?
web服务器是网络上提供信息浏览的程序,同时也是信息的载体;
但是信息的组织和维护需要在web服务器上运行一个合适的web应用程序;
web应用程序可以使用多种技术来实现,目前使用最广泛的是servlet技术;
使用servlet技术需要编写servlet程序,而且要使用servlet引擎来运行这些程序,所以这就要求web服务器中内嵌servlet引擎,为了管理这些servlet程序和servlet引擎的动作,就抽象出一个servlet容器的概念。
总起来说,运行在web服务器上的程序就是web应用程序;servlet引擎,servlet程序都要在servlet容器上运行,有些web服务器可以直接作为servlet容器。
2、Tomcat启动时会对多个Web应用各自创建一个jvm还是只创建一个公用JVM?
Tomcat启动一次(一个进程)创建一个JVM,所有的Web应用在同一个JVM中跑。
如果一个应用弄挂了JVM,所有应用就都挂了。
所以,为了避免一个应用(war)搞垮jvm带来的麻烦,一般一个Tomcat只会放一个应用。
发表评论
-
Servlet学习整理(六)——session
2012-12-24 23:51 1323session简介 http是一个无状态的协议,为了实现与特 ... -
Servlet学习整理(五)—— filter
2012-12-12 23:17 1799Filter Filter是可以重复 ... -
Servlet学习整理(四)—— ServletRequest和ServletResponse
2012-12-01 22:32 11720基于Servlet的web应用交互过程 web应用一般是基于 ... -
Servlet学习整理(二)—— 实现基于servlet的简单web应用
2012-11-20 00:03 7462这里先简单的实现一个基于servlet的web应用,便于理解后 ... -
Servlet学习整理(一)——认识servlet
2012-11-16 09:35 1901Servlet规范 Servlet规范是 ... -
深入理解Java Servlet与Web容器之间的关系
2011-12-09 11:40 62【51CTO特稿】 自从计算机软件开发进入网络 ... -
servlet单实例多线程模式原理和开发注意事项
2011-12-03 22:18 199原文:http://www.iteye.com/topic/2 ... -
【实际问题】Servlet单实例多线程的线程安全问题
2011-12-03 22:08 1323涉及的关键字:JVM、堆 ... -
【转】Servlet中listener和filter的总结
2011-12-03 14:20 67转自:http://ruowu.javaeye.com/ ... -
getServletConfig() 和getServletContext()
2011-11-25 14:24 90getServletConfig() ... -
ServletContext.getRequestDispatcher和Request.getRequestDispatcher这两个有什么区别?
2011-11-25 14:25 166ServletRequest.getRequ ... -
构建有状态 Web 应用程序
2011-11-22 14:58 36虽然jsp已经不是最新的技术,但是这篇文章中涉及的ser ... -
Servlet有状态管理——Web 层
2011-11-22 14:17 100Servlet有状态管理——Web 层 Serv ... -
servlet 体系结构
2011-11-22 14:02 384servlet 体系结构 人们通常将模型-视图-控制器 ... -
servlet filter初探
2011-11-22 12:25 41参考 《J2EE 探索者: 使用 Java ... -
【实际问题】关于“The type ** is not accessible due to restriction on required library”
2011-11-22 11:10 2600按照上一篇《javax.servlet不存在的问题 ... -
【实际问题】javax.servlet不存在的问题
2011-11-19 16:24 1214最近在看servlet,想跑一个Filter试试,结果就是找 ... -
ServletContext
2011-11-25 14:25 73servlet容器在启动时会加载w ... -
ServletContext
2011-11-18 09:40 1servlet容器在启动时会加载web应 ...
相关推荐
在Servlet的世界里,`ServletContext`扮演着至关重要的角色。它是一个全局的、跨.servlet共享的上下文对象,为整个Web应用提供了一个共享数据和资源的平台。在这个实例中,我们将深入探讨`ServletContext`如何用于...
三、使用`servletContext`的例子 例如,我们可以在Servlet的初始化方法中设置一个全局属性: ```java public void init(ServletConfig config) throws ServletException { ServletContext context = config....
在Java Web开发中,`javax.servlet`包下的`Servlet`和`ServletContext`接口扮演着至关重要的角色。这两个接口是Servlet API的核心部分,它们为Web应用程序提供了一种标准的方式来处理HTTP请求并管理全局数据。 首先...
从Servlet 3.0开始,引入了异步处理能力、注解配置、ServletContext监听器等新特性,使得Servlet开发更加高效和便捷。 综上所述,这份"Servlet学习资料大全(教程)"将覆盖以上所有知识点,无论你是初学者还是希望...
在 Servlet 编程中,ServletConfig 和 ServletContext 两个对象经常被混淆,然而它们有着截然不同的作用域和用途。 首先, lets 看看 ServletConfig 对象。ServletConfig 对象是 Servlet 的配置对象,用于存储 ...
3. 使用Servlet上下文(ServletContext)共享数据和监听器(ServletContextListener)来监听服务器或应用级别的事件。 4. Session管理,了解如何在不同请求之间保持用户状态,以及如何处理session过期和失效。 5. ...
`ServletContext`是Java Web开发中的一个关键概念,它是Servlet API的一部分,主要用于在多个Servlet之间共享信息。在Myeclipse这样的集成开发环境中,我们经常会用到`ServletContext`来增强应用程序的功能和交互性...
三、Servlet编程 1. 继承HttpServlet类:最常见的创建Servlet的方式是继承javax.servlet.http.HttpServlet类,并重写doGet()、doPost()等方法。 2. 注解方式:除了传统的web.xml部署描述符,还可以使用@WebServlet...
### Servlet学习入门教材知识点概述 本教材旨在帮助初学者理解并掌握Servlet的基础概念与核心技术,以便于更好地在Java Web开发领域进行深入探索。以下将详细阐述该教材中的关键知识点: #### 1. Servlet简介 - **...
### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...
JavaWeb新版教程Servlet-1vlet-ServletContext对象的介绍.avi
为了实现这一点,ServletContext 接口提供了一些方法来读取 web 应用中的资源文件,这些方法是依靠 Servlet 容器来实现的。Servlet 容器根据资源文件相对于 web 应用的路径,返回关联资源文件的 IO 流、资源文件在...
JavaWeb新版教程Servlet-1vlet-ServletContext对象作用的演示.avi
Servlet是Java Web开发中的核心组件,它是一种Java类,用于扩展服务器的功能,处理来自...J2EE 1.5和Java EE API的中英文对照版文档是学习Servlet的重要参考资料,可以帮助开发者更深入地理解Servlet及其工作原理。
4. **ServletConfig** 和 **ServletContext**:ServletConfig对象提供了Servlet的配置信息,而ServletContext则代表整个Web应用程序的上下文,可用于共享数据或注册监听器。 5. **Servlet生命周期**:包括初始化、...
JavaWeb新版教程Servlet-1vlet-ServletContext像map一样存取数据.avi
在Servlet生命周期中,有三个关键阶段:加载、初始化和服务。当服务器启动或根据需求时,Servlet容器(如Tomcat)会加载Servlet类。接着,容器调用`init()`方法进行初始化,这里可以进行一次性的配置设置。一旦...
本学习笔记源码提供了全面的学习资源,涵盖了这两个技术的基础到高级应用,旨在帮助开发者深入理解并熟练掌握JSP和Servlet。 1. **JSP基础**: JSP是一种服务器端的脚本语言,它将HTML、CSS、JavaScript与Java代码...
在这个“servlet学习的例子”中,我们将深入理解Servlet的工作原理,以及如何在Java环境中结合JSP(JavaServer Pages)来构建动态Web应用。 1. **Servlet基础**: - Servlet是Java API的一部分,它定义了服务器端...