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

servlet源码和生命周期

    博客分类:
  • Java
阅读更多

这里是servlet的类图之间的设计关系,里面接口、抽象类我只写上关键的方法让大家参考:



 

下面根据类图关系和servlet的生命周期讲解:

一、servlet容器(如tomcat)加载servlet类,读入其.class类文件到内存
二、servlet容器开始针对这个servlet,创建ServletConfig对象(他的主要任务就是读取配置文件的相关信息,想我们写一个Servlet时,就要配置.XML文件,指定自己的Servlet在哪个地方,还有是否经过过滤器等等)
三、 servlet容器创建servlet对象4. servlet容器调用servlet对象的init(ServletConfig config)方法,在这个init方法中,建立了sevlet对象和servletConfig对象的关联,执行了如下的代码:
 
 

public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init(); //调用了无参的 init()方法 
    }
    /***
     *     无参的init()方法
     * @throws ServletException
     */
    public void init() throws ServletException {

    }

    public void init(ServletConfig config) throws ServletException
    {  
      this.config = config;  //将容器创建的servletConfig 对象传入,并使用私有成员变量引用该servletConfig对象  
      this.init();   
    }
 //获取初始化参数 
    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();
    }

public ServletContext getServletContext() {
        return getServletConfig().getServletContext();
    }
 有的人会问设计者为什么要写两个init()方法呢?
这是因为这里的config对象的引用就来自Init(ServletConfig config)执行的结果.
所以如果子类需要覆盖了父类的init(ServletConfig config)方法,则首先要调用父类的init(ServletConfig config)方法,也就是先加入 super.init(config) 语句来先执行父类的方法.否则,会产生空指针异常 java.lang.NullPointerException ,因为config对象的引用为空。
 
为了避免这样的情况的产生,GenericServlet的设计人员 在GenericServlet中又定义了一个无参数的init()空方法. 且在init(servletConfig config)方法最后也调用了这个无参的空方法
Java代码
public void init(ServletConfig config) throws ServletException 

    this.config=config; 
    init();      

public void init(ServletConfig config) throws ServletException
{
    this.config=config;
    init();    
}
所以,我们只需覆盖这个无参的init方法加入自己的初始代码即可,而无需覆盖带参数的父类的init方法.如果有多个重载的init方法,对以servlet而言,servlet容器始终就之调用servlet接口中的那个方法:init(ServletConfig config) (当然也会执行已经覆盖的无参的init()方法),其他的覆盖的init方法不会执行。
通过以上的初始化步骤建立了servlet对象和sevletConfig对象的关联,而servletConfig对象又和当前容器创建的ServleContext对象获得关联.
 
五、运行时阶段当容器接受到访问特定的servlet请求时,针对这个请求,创建对应的ServletRequest对象和 ServletResponse对象,并调用servlet的service()方法,service()根据从ServletRequest对象中获得 客户的请求信息并将调用相应的doxxx方法等进行响应,再通过ServletResponse对象生成响应结果,然后发送给客户端,最后销毁创建的ServletRequest 和ServletResponse
在抽象类中GenericServlet中service()是一个抽象方法,但在HttpServlet中对这个方法进行了实现。servlet 接口中定义的service()方法中的两个参数分别是servletRequest 和 ServletResponse 这两个类型。当前的http请求,如果需要在这个service()方法内部使用http消息特有的功能,也就是要调用 HttpServletRequest 和HttpServletResponse来中定义的方法时,需要将请求和响应对象进行一个类型的转换,所以,在GenericServlet中,使用了 两个方法来共同完成这个工作。
实现父类GenericServlet中的service(ServltRequest req,ServeltResponse res)抽象方法
为什么在Servlet中的service方法?
service(ServletRequest servletrequest, ServletResponse servletresponse)
而不是用HttpServletRequest和HttpServletResponse呢?这是因为这样定义就与应用层的任何协议没有任何关系.在HttpServlet重载service()这样就可以向下转型。查看源代码
相应的Java代码:
/**
   * 通过参数的向下转型,然后调用重载的
     */
    public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException
    {
        HttpServletRequest request;
        HttpServletResponse response;
        try
        {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        }
        catch(ClassCastException e)
        {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response);
    }
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();
        if(method.equals("GET"))
        {
            long lastModified = getLastModified(req);
            if(lastModified == -1L)
            {
                doGet(req, resp);
            } else
            {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < (lastModified / 1000L) * 1000L)
                {
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else
                {
                    resp.setStatus(304);
                }
            }
        } else
        if(method.equals("HEAD"))
        {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else
        if(method.equals("POST"))
            doPost(req, resp);
        else
        if(method.equals("PUT"))
            doPut(req, resp);
        else
        if(method.equals("DELETE"))
            doDelete(req, resp);
        else
        if(method.equals("OPTIONS"))
            doOptions(req, resp);
        else
        if(method.equals("TRACE"))
        {
            doTrace(req, resp);
        } else{
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object errArgs[] = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
        }
六、、销毁阶段:只有当web应用被终止时,servlet才会被销毁。servlet容器现调用web应用中所有的Servlet对象的 destroy()方法,然后再销毁这些servlet对象,此外,容器还销毁了针对各个servlet所创建的相关联的serveltConfig对象
注意在Servlet生命周期中init()和destory()方法只调用一次,是单列模式

  • 大小: 140.4 KB
1
0
分享到:
评论

相关推荐

    Servlet 介绍 以及Servlet生命周期(详细)

    总的来说,Servlet是Java Web开发中的基础,理解和掌握Servlet的生命周期对于开发高效、可靠的Web应用至关重要。结合源码分析和适当的工具,如调试器和日志记录,可以更好地理解和优化Servlet的性能。在实际项目中,...

    Servlet生命周期与工作原理

    Servlet生命周期主要分为三个阶段:初始化、响应客户请求和终止。下面将详细阐述这三个阶段以及Servlet的工作原理。 1. 初始化阶段: 当Servlet容器(如Tomcat)启动时,可以通过在`web.xml`配置文件中设置`...

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

    标签"Servlet源码"和"javax.servlet.Servlet源码"强调了对Servlet API源代码的学习和理解。掌握源码可以帮助开发者更好地运用Servlet,解决实际问题。而"Servlet-api-src"则表明这是一个关于Servlet API源代码的资源...

    servlet源码和笔记

    在这个“servlet源码和笔记”资料中,我们将会深入探讨Servlet的工作原理、生命周期以及如何在实际项目中应用。 1. **Servlet基本概念** Servlet是一个Java类,它扩展了Java平台的功能,使得开发者可以创建动态的...

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

    Jakarta Servlet API 4.0是Servlet规范的最新版本,它包含了对HTTP协议处理、生命周期管理、会话跟踪、安全性和性能优化等方面的全面增强。本篇文章将围绕jakarta-servletapi-4-src.zip这个源码包,深入剖析Servlet ...

    servlet的架构与生命周期

    servlet的架构与生命周期 博文链接:https://shangdiyefankun.iteye.com/blog/126204

    servlet源码

    `destroy()`在Servlet生命周期结束时调用,用于释放资源;`getServletInfo()`则返回关于Servlet的信息。 2. **GenericServlet类** GenericServlet是Servlet接口的一个抽象实现,提供了默认的服务实现。它使用多...

    java+servlet源码

    - Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。 - 初始化:通过调用init()方法,仅在Servlet首次被请求时执行。 - 服务:处理每个客户端请求,调用doGet()或doPost()方法。 - 销毁:当Web应用停止...

    javax.servlet源码

    在给定的"javax.servlet源码.zip"文件中,你将能够看到 javax.servlet 包内所有相关类和接口的源代码。这些源代码对于理解Servlet工作原理、学习如何编写自定义Servlet和过滤器以及调试与Servlet相关的代码非常有...

    servlet源码包

    1. **Servlet生命周期**:了解Servlet的初始化、服务、销毁过程,以及如何通过`init()`, `service()`, `destroy()`方法控制这些过程。 2. **请求处理流程**:观察`HttpServletRequest`和`HttpServletResponse`如何...

    Servlet源码

    Servlet源码的分析能帮助我们深入理解HTTP请求处理流程、服务器生命周期管理以及Java Web开发的底层机制。Apache Tomcat是一款广泛应用的Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范。在这里,...

    j2ee17:servlet01:jsp结束,servlet的配置和生命周期

    在"Servlet01:jsp结束,servlet的配置和生命周期"这个主题中,我们将讨论以下几个关键知识点: 1. **Servlet简介**:Servlet是Java类,遵循Servlet接口,用于扩展服务器的功能,特别是Web服务器。它们可以接收和...

    javax-servlet源码包和jar文件

    2. **Servlet生命周期**: 一个Servlet经历了加载、初始化、服务、销毁四个阶段。初始化阶段,Servlet被加载并实例化,调用`init()`方法;服务阶段,每次请求都会创建一个ServletRequest和ServletResponse对象,调用`...

    韩顺平servlet源码

    "韩顺平servlet源码"可能是一个教学示例或练习项目,它涵盖了使用Servlet进行数据库交互和用户界面实现的基本概念和技术。让我们深入探讨Servlet的工作原理、如何链接数据库以及创建用户界面的关键知识点。 1. **...

    servlet反编译源码

    Servlet的生命周期包括三个主要阶段:加载与初始化、服务和销毁。当服务器启动或第一次接收到对Servlet的请求时,Servlet容器(如Tomcat)会加载并实例化Servlet。接着,调用Servlet的init()方法进行初始化,我们...

    博客jsp+javabean+servlet源码

    Servlet生命周期包括初始化、服务、销毁三个阶段,通过Override `doGet` 和 `doPost` 方法来处理GET和POST请求。开发者还可以使用Filter进行请求拦截和响应处理,以实现如权限控制、日志记录等功能。 在MyBlog这个...

    serlvet 源码 servlet-src 源文件

    2. **GenericServlet**:这是一个抽象类,实现了Servlet接口和ServletConfig接口,提供了通用的生命周期方法和服务方法。开发者可以通过继承GenericServlet来创建Servlet,但通常更倾向于使用HttpServlet。 3. **...

    servlet 源码

    通过分析和学习Servlet源码,可以深入了解HTTP请求的处理流程,以及如何利用Servlet API构建动态Web应用。同时,对于Java Web开发的深入理解和优化具有重要意义。在实际项目中,了解Servlet的工作原理有助于更好地...

Global site tag (gtag.js) - Google Analytics