`
wade6
  • 浏览: 273499 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet学习整理(三)—— servletContext

 
阅读更多

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只会放一个应用。

  • 大小: 21.9 KB
  • 大小: 23 KB
  • 大小: 28.8 KB
分享到:
评论

相关推荐

    servlet中的ServletContext的使用

    在Servlet的世界里,`ServletContext`扮演着至关重要的角色。它是一个全局的、跨.servlet共享的上下文对象,为整个Web应用提供了一个共享数据和资源的平台。在这个实例中,我们将深入探讨`ServletContext`如何用于...

    35、servlet--servletContext

    三、使用`servletContext`的例子 例如,我们可以在Servlet的初始化方法中设置一个全局属性: ```java public void init(ServletConfig config) throws ServletException { ServletContext context = config....

    浅析javax.servlet.Servlet,ServletContext接口

    在Java Web开发中,`javax.servlet`包下的`Servlet`和`ServletContext`接口扮演着至关重要的角色。这两个接口是Servlet API的核心部分,它们为Web应用程序提供了一种标准的方式来处理HTTP请求并管理全局数据。 首先...

    servlet学习资料大全(教程)

    从Servlet 3.0开始,引入了异步处理能力、注解配置、ServletContext监听器等新特性,使得Servlet开发更加高效和便捷。 综上所述,这份"Servlet学习资料大全(教程)"将覆盖以上所有知识点,无论你是初学者还是希望...

    ServletContext与ServletConfig关系

    在 Servlet 编程中,ServletConfig 和 ServletContext 两个对象经常被混淆,然而它们有着截然不同的作用域和用途。 首先, lets 看看 ServletConfig 对象。ServletConfig 对象是 Servlet 的配置对象,用于存储 ...

    servlet学习手册

    3. 使用Servlet上下文(ServletContext)共享数据和监听器(ServletContextListener)来监听服务器或应用级别的事件。 4. Session管理,了解如何在不同请求之间保持用户状态,以及如何处理session过期和失效。 5. ...

    ServletContext

    `ServletContext`是Java Web开发中的一个关键概念,它是Servlet API的一部分,主要用于在多个Servlet之间共享信息。在Myeclipse这样的集成开发环境中,我们经常会用到`ServletContext`来增强应用程序的功能和交互性...

    web笔记 —— Servlet

    三、Servlet编程 1. 继承HttpServlet类:最常见的创建Servlet的方式是继承javax.servlet.http.HttpServlet类,并重写doGet()、doPost()等方法。 2. 注解方式:除了传统的web.xml部署描述符,还可以使用@WebServlet...

    servlet学习入门教材

    ### Servlet学习入门教材知识点概述 本教材旨在帮助初学者理解并掌握Servlet的基础概念与核心技术,以便于更好地在Java Web开发领域进行深入探索。以下将详细阐述该教材中的关键知识点: #### 1. Servlet简介 - **...

    Servlet学习笔记

    ### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...

    JavaWeb新版教程Servlet-1vlet-ServletContext对象的介绍.avi

    JavaWeb新版教程Servlet-1vlet-ServletContext对象的介绍.avi

    ServletContext读取web应用中的资源文件.doc

    为了实现这一点,ServletContext 接口提供了一些方法来读取 web 应用中的资源文件,这些方法是依靠 Servlet 容器来实现的。Servlet 容器根据资源文件相对于 web 应用的路径,返回关联资源文件的 IO 流、资源文件在...

    JavaWeb新版教程Servlet-1vlet-ServletContext对象作用的演示.avi

    JavaWeb新版教程Servlet-1vlet-ServletContext对象作用的演示.avi

    JavaWeb的servlet学习的帮助文档

    Servlet是Java Web开发中的核心组件,它是一种Java类,用于扩展服务器的功能,处理来自...J2EE 1.5和Java EE API的中英文对照版文档是学习Servlet的重要参考资料,可以帮助开发者更深入地理解Servlet及其工作原理。

    javax.servlet_api.chm中文版英文版

    4. **ServletConfig** 和 **ServletContext**:ServletConfig对象提供了Servlet的配置信息,而ServletContext则代表整个Web应用程序的上下文,可用于共享数据或注册监听器。 5. **Servlet生命周期**:包括初始化、...

    JavaWeb新版教程Servlet-1vlet-ServletContext像map一样存取数据.avi

    JavaWeb新版教程Servlet-1vlet-ServletContext像map一样存取数据.avi

    Servlet学习文档md文件和pdf

    在Servlet生命周期中,有三个关键阶段:加载、初始化和服务。当服务器启动或根据需求时,Servlet容器(如Tomcat)会加载Servlet类。接着,容器调用`init()`方法进行初始化,这里可以进行一次性的配置设置。一旦...

    JSP Servlet 学习笔记源码

    本学习笔记源码提供了全面的学习资源,涵盖了这两个技术的基础到高级应用,旨在帮助开发者深入理解并熟练掌握JSP和Servlet。 1. **JSP基础**: JSP是一种服务器端的脚本语言,它将HTML、CSS、JavaScript与Java代码...

    servlet学习的一个例子

    在这个“servlet学习的例子”中,我们将深入理解Servlet的工作原理,以及如何在Java环境中结合JSP(JavaServer Pages)来构建动态Web应用。 1. **Servlet基础**: - Servlet是Java API的一部分,它定义了服务器端...

Global site tag (gtag.js) - Google Analytics