- 浏览: 234510 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1096最近的机器内存又爆满了,除了新增机器内存外,还应该好好re ... -
java线程池的设计思想
2012-07-03 20:25 1673ExecutorService executorForFM = ... -
java 代码规范
2012-02-16 16:25 1376java 代码规范 一、方法的规范 ... -
代码质量保证
2011-10-27 18:31 1512本文分为四节如:如何提高代码的可读性、一般异常的处理机制、JV ... -
高效率分离字符串到一个Map中
2010-12-08 21:10 2016package test.hewen; import j ... -
Java集合 之 如何动态控制HashMap
2010-12-08 20:29 3399本文章主要是控制HashMap权限如:设置一把锁(这里实现是通 ... -
Java集合 之 动态数组
2010-12-08 19:44 1428注意:首先本程序是根 ... -
泛型的内部原理与应用
2010-09-20 00:08 1488一、下面是说明泛型的基本原理与代码的应用 /** * ... -
注解与反射
2010-09-19 12:29 1737一、java 1.5的新特新注解和枚举 二、本文主要讲解注解 ... -
JavaBean内省的用法
2010-09-19 11:30 1986Introspector (Java Platform SE ... -
反射之类加载器详解和委托加载
2010-09-18 23:09 1852父类加载器。 下面用例子进行说明如: public ... -
Java流总结
2010-09-14 17:06 1542一、IO流的三种分类方式 1.按流的方向分为:输 ... -
Java容器
2010-09-10 14:51 4405一、List接口 ArrayList,对象加入之后大都是为了 ... -
java比较陌生的语法
2010-09-10 11:35 1048一、 Java并没有虚构函数,但是有finalize ... -
JAVA API String小细节之享元模式
2010-09-10 10:01 1451GOF:运用共享技术有效地支持大量细粒度的对象。 解释一下 ... -
Java对日期操作处理类
2010-09-08 21:08 4665项目中经常用到对日期 ...
相关推荐
servlet的架构与生命周期 博文链接:https://shangdiyefankun.iteye.com/blog/126204
注:本示例中有5章图片,但因为上传比较麻烦,所以就放在附件中 博文链接:https://lvp.iteye.com/blog/234610
NULL 博文链接:https://chaoyi.iteye.com/blog/2072178
NULL 博文链接:https://zachary-guo.iteye.com/blog/626276
NULL 博文链接:https://1601844782.iteye.com/blog/2273999
1.Servlet入门源代码第一个2.javaweb标准工程结构3.servlet开发与基本配置4.请求参数的发送与接收5.get与post请求6.servlet生命周期7.注解简化配置8.启动时加载servlet
使用JAVA语言写的项目管理软件,可以跟踪任务和bug的进度,实现对任务和bug全生命周期管理。 这个项目是很早之前开发的(大约在2008年前后),所以使用的技术是传统的JSP/Servlet+JDBC方式。虽然技术比较老了,但是...
教务管理系统(jsp+servlet+mysql).rar 是一个计算机专业的 JSP 源码资料包,它包含了一个完整的教务管理系统的源代码和相关文档。...Servlet 的编写和配置,了解 Servlet 的生命周期和工作原理;MySQL
目前的我理解的Servlet生命周期: Request(POST / GET,HttpSession)-(HTTP)-> [Servlet(create,service(doGet,doPost),destroy)]-(HTTP)->响应单击访问Java Servlet 4.0的官方文档。
java基础 一、仓库说明 Java基础类型,容器,并发,IO流,...Servlet基础,生命周期执行过程 Http请求详解,握手挥手流程简介 会话跟踪技术,Session和Cookie详解 过滤器、监听器、拦截器,应用详解 Servlet 集成 C3P0
jsp book 讲解jsp和servlet各个生命周期,请求过程来龙去脉。
4.3.1 Activity的生命周期演示 190 4.3.2 Activity与Servlet的相似性与 区别 194 4.4 本章小结 195 第5章 使用Intent和IntentFilter 第5章 进行通信 196 5.1 Intent对象详解 197 5.1.1 使用Intent...
通过该课程设计使学生进一步理解和掌握软件开发模型、软件生命周期、软件过程等理论在软件项目开发过程中的意义和作用,培养学生按照软件工程的原理、方法、技术、标准和规范,进行软件开发的能力,培养学生的合作...
1、 Servlet容器:Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP(JSP本质上是一个Servlet)的生命周期,以及管理它们的共享数据。 2、 Tomcat服务器:Tomcat 是一个免费的开放源代码的Servlet容器...
通过这个资料包,用户可以深入理解JSP与Servlet的结合方式,掌握JSP页面的生命周期,了解如何在JSP页面中嵌入Java代码和调用JavaBean组件。该资料包内含丰富的示例项目,涵盖了从基础的页面布局、表单处理到复杂的...
是JSP和servlet全生命周期讲解的经典书书籍随书源码,虽然叫初步,实际上下册非常深入,堪称经典。
您可以在Tomcat上配置多个Web应用程序,并使用Tomcat管理Web应用程序的生命周期。 2. 设计数据库 在搭建小区服务网站之前,您需要先设计数据库。我们推荐使用MySQL数据库,因为它是一种功能强大且易于使用的关系型...