- 浏览: 238608 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mhsjlove:
正则表达式的捕获组比这好用多了
高效率分离字符串到一个Map中 -
yk0025:
正在研究中。。。
Antx学习总结 -
asialee:
博主这块写的挺好的,我完全看了,不过我也写了一些关于编解码器的 ...
Netty源代码框架剖析( 二 ) -
he_wen:
不能够停止tomcat的话 kill -9 进程号 得到进程 ...
检查tomcat是否宕机 -
zhangyou1010:
catalina.sh stop 如果这个不能停止tomc ...
检查tomcat是否宕机
这里是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()方法只调用一次,是单列模式
发表评论
-
编程中注意事项
2012-10-18 15:23 1174最近的机器内存又爆满了,除了新增机器内存外,还应该好好re ... -
java线程池的设计思想
2012-07-03 20:25 1753ExecutorService executorForFM = ... -
java 代码规范
2012-02-16 16:25 1415java 代码规范 一、方法的规范 ... -
代码质量保证
2011-10-27 18:31 1536本文分为四节如:如何提高代码的可读性、一般异常的处理机制、JV ... -
高效率分离字符串到一个Map中
2010-12-08 21:10 2135package test.hewen; import j ... -
Java集合 之 如何动态控制HashMap
2010-12-08 20:29 3515本文章主要是控制HashMap权限如:设置一把锁(这里实现是通 ... -
Java集合 之 动态数组
2010-12-08 19:44 1473注意:首先本程序是根 ... -
泛型的内部原理与应用
2010-09-20 00:08 1509一、下面是说明泛型的基本原理与代码的应用 /** * ... -
注解与反射
2010-09-19 12:29 1769一、java 1.5的新特新注解和枚举 二、本文主要讲解注解 ... -
JavaBean内省的用法
2010-09-19 11:30 2012Introspector (Java Platform SE ... -
反射之类加载器详解和委托加载
2010-09-18 23:09 1869父类加载器。 下面用例子进行说明如: public ... -
Java流总结
2010-09-14 17:06 1570一、IO流的三种分类方式 1.按流的方向分为:输 ... -
Java容器
2010-09-10 14:51 4430一、List接口 ArrayList,对象加入之后大都是为了 ... -
java比较陌生的语法
2010-09-10 11:35 1072一、 Java并没有虚构函数,但是有finalize ... -
JAVA API String小细节之享元模式
2010-09-10 10:01 1477GOF:运用共享技术有效地支持大量细粒度的对象。 解释一下 ... -
Java对日期操作处理类
2010-09-08 21:08 4763项目中经常用到对日期 ...
相关推荐
总的来说,Servlet是Java Web开发中的基础,理解和掌握Servlet的生命周期对于开发高效、可靠的Web应用至关重要。结合源码分析和适当的工具,如调试器和日志记录,可以更好地理解和优化Servlet的性能。在实际项目中,...
Servlet生命周期主要分为三个阶段:初始化、响应客户请求和终止。下面将详细阐述这三个阶段以及Servlet的工作原理。 1. 初始化阶段: 当Servlet容器(如Tomcat)启动时,可以通过在`web.xml`配置文件中设置`...
标签"Servlet源码"和"javax.servlet.Servlet源码"强调了对Servlet API源代码的学习和理解。掌握源码可以帮助开发者更好地运用Servlet,解决实际问题。而"Servlet-api-src"则表明这是一个关于Servlet API源代码的资源...
在这个“servlet源码和笔记”资料中,我们将会深入探讨Servlet的工作原理、生命周期以及如何在实际项目中应用。 1. **Servlet基本概念** Servlet是一个Java类,它扩展了Java平台的功能,使得开发者可以创建动态的...
Jakarta Servlet API 4.0是Servlet规范的最新版本,它包含了对HTTP协议处理、生命周期管理、会话跟踪、安全性和性能优化等方面的全面增强。本篇文章将围绕jakarta-servletapi-4-src.zip这个源码包,深入剖析Servlet ...
servlet的架构与生命周期 博文链接:https://shangdiyefankun.iteye.com/blog/126204
`destroy()`在Servlet生命周期结束时调用,用于释放资源;`getServletInfo()`则返回关于Servlet的信息。 2. **GenericServlet类** GenericServlet是Servlet接口的一个抽象实现,提供了默认的服务实现。它使用多...
- Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。 - 初始化:通过调用init()方法,仅在Servlet首次被请求时执行。 - 服务:处理每个客户端请求,调用doGet()或doPost()方法。 - 销毁:当Web应用停止...
在给定的"javax.servlet源码.zip"文件中,你将能够看到 javax.servlet 包内所有相关类和接口的源代码。这些源代码对于理解Servlet工作原理、学习如何编写自定义Servlet和过滤器以及调试与Servlet相关的代码非常有...
1. **Servlet生命周期**:了解Servlet的初始化、服务、销毁过程,以及如何通过`init()`, `service()`, `destroy()`方法控制这些过程。 2. **请求处理流程**:观察`HttpServletRequest`和`HttpServletResponse`如何...
Servlet源码的分析能帮助我们深入理解HTTP请求处理流程、服务器生命周期管理以及Java Web开发的底层机制。Apache Tomcat是一款广泛应用的Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范。在这里,...
在"Servlet01:jsp结束,servlet的配置和生命周期"这个主题中,我们将讨论以下几个关键知识点: 1. **Servlet简介**:Servlet是Java类,遵循Servlet接口,用于扩展服务器的功能,特别是Web服务器。它们可以接收和...
2. **Servlet生命周期**: 一个Servlet经历了加载、初始化、服务、销毁四个阶段。初始化阶段,Servlet被加载并实例化,调用`init()`方法;服务阶段,每次请求都会创建一个ServletRequest和ServletResponse对象,调用`...
"韩顺平servlet源码"可能是一个教学示例或练习项目,它涵盖了使用Servlet进行数据库交互和用户界面实现的基本概念和技术。让我们深入探讨Servlet的工作原理、如何链接数据库以及创建用户界面的关键知识点。 1. **...
Servlet的生命周期包括三个主要阶段:加载与初始化、服务和销毁。当服务器启动或第一次接收到对Servlet的请求时,Servlet容器(如Tomcat)会加载并实例化Servlet。接着,调用Servlet的init()方法进行初始化,我们...
Servlet生命周期包括初始化、服务、销毁三个阶段,通过Override `doGet` 和 `doPost` 方法来处理GET和POST请求。开发者还可以使用Filter进行请求拦截和响应处理,以实现如权限控制、日志记录等功能。 在MyBlog这个...
2. **GenericServlet**:这是一个抽象类,实现了Servlet接口和ServletConfig接口,提供了通用的生命周期方法和服务方法。开发者可以通过继承GenericServlet来创建Servlet,但通常更倾向于使用HttpServlet。 3. **...
通过分析和学习Servlet源码,可以深入了解HTTP请求的处理流程,以及如何利用Servlet API构建动态Web应用。同时,对于Java Web开发的深入理解和优化具有重要意义。在实际项目中,了解Servlet的工作原理有助于更好地...