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