⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0128.htm

📁 精通struts源码,孙卫琴.经过更新后的,请查收,
💻 HTM
字号:
<html>

<head>
<title>新时代软件教程:操作系统 主页制作 服务器 设计软件 网络技术 编程语言 文字编辑</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋体}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1  {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
<p align="center"><big><strong>Lifecycle 方法</strong></big></p>
<div align="right">---摘自互联网</div>

<br>3.1&nbsp;重编Init&nbsp;初始化方法&nbsp;<br>
<br>
在初始化过程中,&nbsp;servlet应当准备好它要安排的一些资源,&nbsp;以便这个servlet&nbsp;能够接收请求,做到这些可以不用考虑多线程,&nbsp;因为在servlet初始化是只能是单进程的。&nbsp;一旦初始化方法完成,&nbsp;servlet就能接收客户端的请求。&nbsp;当然如果初始化不能成功,这个方法会扔出throw&nbsp;UnavailableException解释的.&nbsp;<br>
<br>
初始化方法使用ServletConfig&nbsp;对象作为参数.&nbsp;这个方法应该保存这个对象,&nbsp;以便它能有方法getServletConfig返回.&nbsp;最简单的办法是,搞出一个新类,他的初始化方法数调用super.init.&nbsp;如果确实这样做,&nbsp;你就应当自己保存ServletConfig&nbsp;对象,&nbsp;并且自己重编getServletConfig&nbsp;方法以便它能从新的位置得到对象.&nbsp;<br>
<br>
下面是个初始化方法的例子.&nbsp;它是来自Survey&nbsp;Servlet的初始化方法,&nbsp;从一个表单接收输入然后存储到文件中,为了存储survey信息,&nbsp;它需要一个目录.&nbsp;它以初始化参数接收这个目录.&nbsp;<br>
<br>
<br>
public&nbsp;void&nbsp;init(ServletConfig&nbsp;config)<br>
throws&nbsp;ServletException<br>
{<br>
super.init(config);<br>
<br>
//获取目录<br>
resultsDir&nbsp;=&nbsp;getInitParameter("resultsDir");<br>
<br>
//如果没有目录,&nbsp;不处理客户端<br>
if&nbsp;(resultsDir&nbsp;==&nbsp;null)&nbsp;{<br>
throw&nbsp;new&nbsp;UnavailableException&nbsp;(this,<br>
"Not&nbsp;given&nbsp;a&nbsp;directory&nbsp;to&nbsp;write&nbsp;survey&nbsp;results!");<br>
}<br>
}<br>
<br>
这里的初始化方法调用super.init&nbsp;方法来管理安排ServletConfig对象.&nbsp;这个初始化方法也设置了一个字段:&nbsp;resultsDir,&nbsp;作为初始化参数提供的目录名.&nbsp;如果没有目录名被提供,&nbsp;这个&nbsp;servlet扔出一个不适用的解释.&nbsp;如果初始化&nbsp;方法成功完成,servlet将能处理客户端请求&nbsp;<br>
<br>
初始化参数&nbsp;<br>
<br>
初始化参数的规定是一个服务器方面的规定。如果初始化参数被规定,&nbsp;都可以用同样的方法得到:&nbsp;用&nbsp;getInitParameter方法.&nbsp;这个方法将参数名作为自己的参数项.&nbsp;<br>
<br>
3.2&nbsp;重编Destroy&nbsp;方法&nbsp;<br>
<br>
当服务器卸载一个servlet,&nbsp;它将调用servlet的destroy方法.&nbsp;这个&nbsp;destroy方法是与初始化方法相反,同时从内存中释放servlet.&nbsp;<br>
<br>
并不是所有的调用了初始化init方法是也必须调用destroy方法.&nbsp;<br>
<br>
对于大多数的servlets,&nbsp;一些初始化的工作必须反做的.&nbsp;如,&nbsp;假设有一个servlet,它在初始化时打开一个数据库连接,他的destroy&nbsp;方法如下显示:需要关闭这个连接的&nbsp;<br>
<br>
<br>
/**<br>
*&nbsp;关闭数据库连接<br>
*/<br>
public&nbsp;void&nbsp;destroy()&nbsp;{<br>
try&nbsp;{<br>
con.close();<br>
}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br>
while(e&nbsp;!=&nbsp;null)&nbsp;{<br>
log("SQLException:&nbsp;"&nbsp;+&nbsp;e.getSQLState()&nbsp;+&nbsp;'\t'&nbsp;+<br>
e.getMessage()&nbsp;+&nbsp;'\t'&nbsp;+<br>
e.getErrorCode()&nbsp;+&nbsp;'\t');<br>
e&nbsp;=&nbsp;e.getNextException();<br>
}<br>
}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br>
e.printStackTrace();<br>
}<br>
}<br>
<br>
关于一个Servlet中断涉及的多线程&nbsp;<br>
<br>
但一个服务器卸载一个servlet,&nbsp;它会在所有的service已经完成后调用&nbsp;destroy.&nbsp;如果你的操作运行需要很长时间,&nbsp;但destroy&nbsp;被调用时还有线程在运行.&nbsp;这个servlet编写者有责任确保所有的线程都已经完成;&nbsp;<br>
<br>
长时间运行响应客户端请求的那些servlet应当保留当前有多少方法在运行的记录.&nbsp;他的&nbsp;long-running&nbsp;方法应当周期性地轮询以确保他们能够继续运行下去.&nbsp;如果servlet被destroy方法调用,&nbsp;那么这个long-running&nbsp;方法如果必要必须停止工作或清除.&nbsp;<br>
<br>
举例,&nbsp;变量serviceCounter用来统计有多少service方法在运行,&nbsp;变量&nbsp;shuttingDown显示这个servlet是否被destory.&nbsp;每个变量有它自己的获取方法:&nbsp;<br>
<br>
<br>
public&nbsp;ShutdownExample&nbsp;extends&nbsp;HttpServlet&nbsp;{<br>
private&nbsp;int&nbsp;serviceCounter&nbsp;=&nbsp;0;<br>
private&nbsp;Boolean&nbsp;shuttingDown;<br>
...<br>
//&nbsp;serviceCounter<br>
protected&nbsp;synchronized&nbsp;void&nbsp;enteringServiceMethod()&nbsp;{<br>
serviceCounter++;<br>
}<br>
protected&nbsp;synchronized&nbsp;void&nbsp;leavingServiceMethod()&nbsp;{<br>
serviceCounter--;<br>
}<br>
protected&nbsp;synchronized&nbsp;int&nbsp;numServices()&nbsp;{<br>
return&nbsp;serviceCounter;<br>
}<br>
//shuttingDown<br>
protected&nbsp;setShuttingDown(Boolean&nbsp;flag)&nbsp;{<br>
shuttingDown&nbsp;=&nbsp;flag;<br>
}<br>
protected&nbsp;Boolean&nbsp;isShuttingDown()&nbsp;{<br>
return&nbsp;shuttingDown;<br>
}<br>
}<br>
<br>
这个service方法每次在它进入时要增加,而在它返回退出时要减少:&nbsp;<br>
<br>
protected&nbsp;void&nbsp;service(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)<br>
throws&nbsp;ServletException,&nbsp;IOException<br>
{<br>
enteringServiceMethod();<br>
try&nbsp;{<br>
super.service(req,&nbsp;resp);<br>
}&nbsp;finally&nbsp;{<br>
leavingServiceMethod();<br>
}<br>
}<br>
<br>
destroy方法应当检查serviceCounter,&nbsp;如果存在长时间方式运行的话,&nbsp;设置变量shuttingDown&nbsp;.&nbsp;这个变量将会让那个正在处理请求的线程知道:该结束了,关闭吧!&nbsp;destroy&nbsp;方法应当等待这几个service&nbsp;方法完成,&nbsp;这样就是一个清楚的关闭过程了.&nbsp;<br>
<br>
<br>
public&nbsp;void&nbsp;destroy()&nbsp;{<br>
/*&nbsp;检查是否有线程在运行,如果存在,告诉他们stop.&nbsp;*/<br>
if&nbsp;(numServices()&nbsp;>&nbsp;0)&nbsp;{<br>
setShuttingDown(true);<br>
}<br>
<br>
/*&nbsp;等待他们stop.&nbsp;*/<br>
while(numService()&nbsp;>&nbsp;0)&nbsp;{<br>
try&nbsp;{<br>
thisThread.sleep(interval);<br>
}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br>
}<br>
}<br>
}<br>
<br>
long-running&nbsp;方法如必要应当检查这个变量,并且解释他们的工作:&nbsp;<br>
<br>
public&nbsp;void&nbsp;doPost(...)&nbsp;{<br>
...<br>
for(i&nbsp;=&nbsp;0;&nbsp;((i&nbsp;&lt;&nbsp;lotsOfStuffToDo)&nbsp;&&&nbsp;!isShuttingDown());&nbsp;i++)&nbsp;{<br>
try&nbsp;{<br>
partOfLongRunningOperation(i);<br>
}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br>
}<br>
}<br>
}<br>
<br>
3.3&nbsp;提供关于Servlet的信息<br>
/**<br>
*&nbsp;This&nbsp;is&nbsp;a&nbsp;simple&nbsp;example&nbsp;of&nbsp;an&nbsp;HTTP&nbsp;Servlet.&nbsp;It&nbsp;responds&nbsp;to&nbsp;the&nbsp;GET<br>
*&nbsp;and&nbsp;HEAD&nbsp;methods&nbsp;of&nbsp;the&nbsp;HTTP&nbsp;protocol.<br>
*/<br>
public&nbsp;class&nbsp;SimpleServlet&nbsp;extends&nbsp;HttpServlet&nbsp;{&nbsp;<br>
<br>
...<br>
<br>
public&nbsp;String&nbsp;getServletInfo()&nbsp;{<br>
return&nbsp;"A&nbsp;simple&nbsp;servlet";<br>
}<br>
}

  </table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -