`

servlet 研究

阅读更多

下面是servlet的类图: 

javax.servlet.servlet接口源码

package javax.servlet; //Tomcat源码版本:6.0.20  

import java.io.IOException;

public interface Servlet {

	// 负责初始化Servlet对象。容器一旦创建好Servlet对象后,就调用此方法来初始化Servlet对象
	public void init(ServletConfig config) throws ServletException;

	// 方法负责响应客户的请求,提供服务。当容器接收到客户端要求访问特定的servlet请求时,就会调用Servlet的service方法
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException;

	/*
	 * Destroy()方法负责释放Servlet
	 * 对象占用的资源,当servlet对象结束生命周期时,servlet容器调用此方法来销毁servlet对象.
	 */
	public void destroy();

	/*
	 * 说明:Init(),service(),destroy() 这三个方法是Servlet生命周期中的最重要的三个方法。
	 */

	/*
	 * 返回一个字符串,在该字符串中包含servlet的创建者,版本和版权等信息
	 */
	public String getServletInfo();

	/*
	 * GetServletConfig: 返回一个ServletConfig对象,该对象中包含了Servlet初始化参数信息
	 */
	public ServletConfig getServletConfig();
}

javax.servlet.ServletConfig接口源码

package javax.servlet;

import java.util.Enumeration;

public abstract interface ServletConfig {

	/*
	 * 获取servlet名称
	 */
	public abstract String getServletName();
	
	/*
	 * 获取servlet容器
	 */
	public abstract ServletContext getServletContext();
	
	/*
	 * 根据servlet初始化参数名称获取相应的值
	 */
	public abstract String getInitParameter(String paramString);
	
	/*
	 * 获取servlet初始化参数所有名称
	 */
	public abstract Enumeration getInitParameterNames();
} 

javax.servlet.ServletConfig测试

package com.longweir.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration; 

public class ConfigTestServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=GBK");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");		
		out.println("  <HEAD><TITLE>实现ServletConfig接口的方法的servlet</TITLE></HEAD>");
		out.println("  <BODY>");
        out.println("Servlet的名称是:"+getServletName()+"<br>");  //获取当前的servlet的名称,即 ConfigTestServlet
        out.println("下面是为该servlet配置的初始化参数: <br>");  //对于该Servlet的参数配置在web.xml的<servlet></servlet>代码段中
        Enumeration e=this.getInitParameterNames(); 
        while (e.hasMoreElements())
        {
        	String key=(String)e.nextElement();
        	String value=this.getInitParameter(key);
        	out.println("key="+key+";"+"value="+value+"<br>");       	
        }        
		out.println(" </BODY>");
		out.println("</HTML>");
		out.close();
	}
}

GenericSerlvet抽象类源码

package javax.servlet;

import java.io.IOException;
import java.util.Enumeration;

//抽象类GenericServlet实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable这两个接口 
public abstract class GenericServlet 
    implements Servlet, ServletConfig, java.io.Serializable
{
    //私有变量,保存 init()传入的ServletConfig对象的引用
    private transient ServletConfig config;
    
    //无参的构造方法
    public GenericServlet() { }
    

    /*
    ------------------------------------
    以下方法实现了servlet接口中的5个方法
    实现Servlet接口方法开始
    ------------------------------------
    */    
    
    
    /*
    实现接口Servlet中的带参数的init(ServletConfig Config)方法,将传递的ServletConfig对象的引用保存到私有成员变量中,
    使得GenericServlet对象和一个ServletConfig对象关联.
    同时它也调用了自身的不带参数的init()方法
    **/
    
    public void init(ServletConfig config) throws ServletException {
      this.config = config;
      this.init();   //调用了无参的 init()方法
    }

    //无参的init()方法
    public void init() throws ServletException {

    }
    
    
    //空实现了destroy方法
    public void destroy() { }    
        
     
    //实现了接口中的getServletConfig方法,返回ServletConfig对象
    public ServletConfig getServletConfig() 
    {
       return config;
    }    

    //该方法实现接口<Servlet>中的ServletInfo,默认返回空字符串
    public String getServletInfo() {
       return "";
    }
    
    
    //唯一没有实现的抽象方法service(),仅仅在此声明。交由子类去实现具体的应用 
   //在后来的HttpServlet抽象类中,针对当前基于Http协议的Web开发,HttpServlet抽象类具体实现了这个方法
   //若有其他的协议,直接继承本类后实现相关协议即可,具有很强的扩展性
      
    public abstract void service(ServletRequest req, ServletResponse res)
 throws ServletException, IOException;
    
    /*
    ------------------------------------
    实现Servlet接口方法结束
    ------------------------------------
    */
    
    
    
    
    
    

  /*
  ---------------------------------------------
   *以下四个方法实现了接口ServletConfig中的方法
   实现ServletConfig接口开始
  ---------------------------------------------
   */
 
  //该方法实现了接口<ServletConfig>中的getServletContext方法,用于返回servleConfig对象中所包含的servletContext方法
    public ServletContext getServletContext() {
       return getServletConfig().getServletContext();
    }
    
    //获取初始化参数
    public String getInitParameter(String name) {
     return getServletConfig().getInitParameter(name);
    }
    
    //实现了接口<ServletConfig>中的方法,用于返回在web.xml文件中为servlet所配置的全部的初始化参数的值
    public Enumeration getInitParameterNames() {
       return getServletConfig().getInitParameterNames();
   
   //获取在web.xml文件中注册的当前的这个servlet名称。没有在web.xml 中注册的servlet,该方法直接放回该servlet的类名。
   //法实现了接口<ServleConfig>中的getServletName方法  
    public String getServletName() {
        return config.getServletName();
    }
    
   /*
  ---------------------------------------------
   实现ServletConfig接口结束
  ---------------------------------------------
 */ 
        

    public void log(String msg) {
       getServletContext().log(getServletName() + ": "+ msg);
    }  
   
   
    public void log(String message, Throwable t) {
       getServletContext().log(getServletName() + ": " + message, t);
    }
}

 

在javax.servlet.Servlet接口中,定义了针对Servlet生命周期最重要的三个方法,按照顺序,依次是init(),Serveice()和destroy()这三个方法.

 

Servlet初始化阶段,包括执行如下四个步骤:
1. servlet容器(如tomcat)加载servlet类,读入其.class类文件到内存
2. servlet容器开始针对这个servlet,创建ServletConfig对象
3. servlet容器创建servlet对象
4. servlet容器调用servlet对象的init(ServletConfig config)方法,在这个init方法中,建立了sevlet对象和servletConfig对象的关联

 

运行时阶段:
当容器接受到访问特定的servlet请求时,针对这个请求,创建对应的ServletRequest对象和 ServletResponse对象,并调用servlet的service()方法,service()根据从ServletRequest对象中获得客户的请求信息
并将调用相应的doxxx方法等进行响应,再通过ServletResponse对象生成响应结果,然后发送给客户端,最后销毁创建的ServletRequest 和ServletResponse

 

销毁阶段:

只有当web应用被终止时,servlet才会被销毁。servlet容器现调用web应用中所有的Servlet对象的 destroy()方法,然后再销毁这些servlet对象,此外,容器还销毁了针对各个servlet所创建的相关联的serveltConfig对象。我们可以在destroy方法的实现中,释放servlet所占用的资源,如关闭数据库连接,关闭文件输入输出流等。

 

在这里该注意的地方:

在servlet生命周期中,servlet的初始化和和销毁阶段只会发生一次,而service方法执行的次数则取决于servlet被客户端访问的次数。

 

Servlet里的cookie技术:
cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段,是由Netscape公司开发出来的。

cookie技术的好处:

    1,Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点。
    2,Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径。

创建一个cookie

//里面的两个参数分别是cookie的名和cookie的值
response.addCookie(new Cookie("abc","10000000"));

获取cookie

Cookie[] cook =request.getCookies();//用一个Cookie数组来接收
for(int j=0;j<cook.length;j++){//通过循环来打印Cookie
        cook[j].getName()://取cookie的名  
        cook[j].getValue()://去cookie的值
}

 

Servlet里的过滤器:

(1)过滤器的主要作用:

1,任何系统或网站都要判断用户是否登录。

2,网络聊天系统或论坛,功能是过滤非法文字

3,统一解决编码
(2)怎么创建一个过滤器:

1,生成一个普通的class类,实现Filter接口(javax.servlet.Filter;)。

2,重写接口里面的三个方法:init,doFilter,destroy。
3,然后在web.xml配置过滤器。

 

Servlet里的监听器:
监听器的作用:自动执行一些操作。
三种servlet监听器:

对request的监听。对session的监听。对application的监听。

怎么创建一个监听器:

1,生成一个普通的class类,如果是对ServletConext的监听,则实现ServletConextListener。
2,然后重写里面的五个方法:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/*
 * 对ServletContextLinstener进行监听
 */
public class ServletConextListener implements ServletContextListener, ServletContextAttributeListener {

	private ServletContext servletContext;
	private String AttributeName;
	private Object AttributeValue;

	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("####ServletContext上下文销毁");
	}

	public void contextInitialized(ServletContextEvent sce) {
		servletContext = sce.getServletContext();
		System.out.println("####上下文初始化");
		System.out.println("####ServletContext当前初始目录为:" + this.servletContext.getRealPath("/"));
	}

	public void attributeAdded(ServletContextAttributeEvent sce) {
		AttributeName = sce.getName();
		AttributeValue = sce.getValue();
		System.out.println("####ServletContext增加一个属性:");
		System.out.println("AttributeName:" + AttributeName);
		System.out.println("AttributeValue:" + AttributeValue);
	}

	public void attributeRemoved(ServletContextAttributeEvent sce) {
		AttributeName = sce.getName();
		AttributeValue = sce.getValue();
		System.out.println("####ServletContext删除一个属性:");
		System.out.println("AttributeName:" + AttributeName);
		System.out.println("AttributeValue:" + AttributeValue);
	}

	public void attributeReplaced(ServletContextAttributeEvent sce) {
		AttributeName = sce.getName();
		AttributeValue = sce.getValue();
		System.out.println("####ServletContext替换一个属性:");
		System.out.println("AttributeName:" + AttributeName);
		System.out.println("AttributeValue:" + AttributeValue);
	}

}

 

如果需要更深入的了解,请参考

"Servlet 工作原理解析":http://www.ibm.com/developerworks/cn/java/j-lo-servlet/

  • 大小: 178.7 KB
分享到:
评论

相关推荐

    servlet源码 servlet-api-src javax.servlet.Servlet源码

    而"Servlet-api-src"则表明这是一个关于Servlet API源代码的资源,可能包含了一些示例、注释或者解析,对于学习和研究Servlet API的实现非常有益。 在压缩包文件的文件名称列表中,如果包含的是`javax`,那么可能...

    jakarta-servletapi-4-src.zip servlet源码

    源码中,可以研究DispatcherServlet如何解析请求,以及如何将请求映射到相应的Servlet或Filter。 三、HTTP请求与响应处理 Jakarta Servlet API 4.0改进了对HTTP/2的支持,使得性能得到提升。`HttpServletRequest`和...

    servlet-api_servlet_

    通过提供的压缩包子文件名称“servlet-api”,我们可以推测这可能是一个只包含Servlet API的库,可能用于升级开发环境中的旧版Servlet库,或者用于独立学习和研究Servlet API的各个组件和功能。使用这个新的jar包,...

    Jsp-and-Servlet:Jsp和Servlet研究资料库

    本研究资料库聚焦于这两个技术,旨在深入理解它们的概念、工作原理以及如何在实际项目中有效应用。 **1. JSP(JavaServer Pages)** JSP是一种服务器端脚本语言,它允许开发者将HTML代码与Java代码混合编写,用于...

    基于JSP+JavaBean+Servlet模式的图书管理系统的研究和实现

    《基于JSP+JavaBean+Servlet模式的图书管理系统的研究与实现》 图书管理系统是信息化建设中的重要组成部分,它能够高效地管理和检索图书信息,为图书馆的日常运营提供便利。本项目采用经典的JSP(JavaServer Pages...

    正在研究servlet3的朋友们,有谁需要servlet3 api(英文版)的吗, 见附件

    Servlet3是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,提升了Web应用程序的灵活性和可扩展性。这篇博文分享了Servlet3的...如果你正在研究Servlet3,这份资源无疑会成为你的得力助手。

    简单的servlet例子新闻网站 全

    通过研究项目中的分页代码,我们可以学习如何优雅地处理分页逻辑,以及如何在响应中传递分页信息,如当前页数、总页数等。 此外,这个项目可能还涵盖了MVC(Model-View-Controller)设计模式的应用。在Servlet中...

    servlet 案例

    Servlet是Java Web开发中的核心组件,它主要用于处理HTTP请求并生成动态响应。...通过深入研究`ApplicationServlet`的源代码,我们可以更好地掌握Servlet的工作原理,并将其应用于更复杂的Web应用程序中。

    servlet容器工作原理

    ### Servlet容器工作原理 #### 一、概述 Servlet容器,如Tomcat,是Java Web应用的基础组成部分之一。...此外,深入研究`javax.servlet.Servlet`接口以及其实现细节,对于构建高效可靠的Web应用也是必不可少的。

    Servlet之Filter深入讲解及实例研究

    7. **实例研究** 在给定的链接`http://blog.csdn.net/evankaka/article/details/45480101`中,博主Evankaka详细介绍了如何创建和配置Filter,以及如何在实际项目中应用Filter,包括字符编码转换和登录检查的示例,...

    servlet内存驻留验证

    - 分析web.xml或使用注解(如`@WebServlet`)来研究Servlet的配置。 - 使用内存分析工具(如JVisualVM、MAT等)监控服务器的内存使用情况,查看Servlet实例何时创建、何时销毁,以及在内存中的存活时间。 - 模拟多个...

    javaIDEA新手研究的ajax访问servlet,html获取后台数据

    3. **Servlet处理请求**:在Servlet中,你需要重写`doGet`或`doPost`方法来处理Ajax请求。根据请求参数执行相应的业务逻辑,例如从数据库查询数据。 4. **响应数据**:Servlet处理完请求后,可以通过`response....

    JavaServlet帮助文档

    Java Servlet技术是Java平台上的一个核心特性,用于构建动态web应用程序。Servlet是Java语言编写的服务端组件,它们扩展了服务器的...通过深入研究这个文档,你可以掌握Servlet的核心概念,提高你的Java Web开发技能。

    Servlet Jsp 技术概述 pdf

    Servlet和JSP(JavaServer Pages)是Java Web开发中的核心技术,用于构建动态Web应用程序。...通过深入研究这份PDF文档,你可以掌握这两种技术的基本概念,为进一步学习Spring MVC、Struts等高级框架打下坚实基础。

    旅游管理系统 jsp+servlet.zip

    开发者可以通过研究这些源码来理解系统的实现方式,学习如何整合JSP、Servlet和数据库,以及如何设计和组织Web应用的各个部分。 6. **毕业设计/课程设计作业**:这表明该系统可能是作为高等教育中的一个实践项目,...

    SERVLET技术实现数据库查询

    Servlet技术是Java Web开发中的重要组成部分,主要用于处理HTTP请求并...通过运行和研究这个项目,开发者不仅可以深入了解Servlet和SpringMVC的工作原理,还能掌握如何高效地处理数据库查询,以及增强用户界面的功能。

    Servlet小例子源码

    Servlet、Filter和Listener是Java Web开发中的三大核心组件,它们在构建动态Web应用程序时起着至关重要的作用。这个"Servlet小例子源码"压缩包显然...通过深入研究和实践,初学者可以快速提升自己的Java Web开发技能。

    Servlet3-sources-code

    **Servlet3源码解析** Servlet技术是Java Web开发中的核心组件,它允许开发者编写服务器端程序来处理HTTP请求。...所以,无论你是初学者还是经验丰富的开发者,研究Servlet3的源码都将是一个非常有价值的学习过程。

    jsp 购物车源码 servlet

    通过研究这个简单的购物车项目,你可以了解到Web应用的基本架构,以及JSP和Servlet协同工作的模式。这对于理解和掌握Java Web开发基础非常有帮助。在实践过程中,不断调试和改进代码,加深对这些概念的理解,将有助...

Global site tag (gtag.js) - Google Analytics