📄 j-scwcd-2-3.html
字号:
<tr>
<td class="hbg" height="21" width="160"></td><td class="bbg" valign="top" height="21" colspan="2"> <a href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/" class="mainlink">IBM 主页</a><span class="divider"> | </span><a href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/products/index.shtml" class="mainlink">产品与服务</a><span class="divider"> | </span><a href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/support/index.shtml" class="mainlink">支持与下载</a><span class="divider"> | </span><a href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/account/index.shtml" class="mainlink">个性化服务</a></td>
</tr>
</table>
<TABLE width="100%" cellspacing="0" cellpadding="0" border="0">
<TR>
<TD bgcolor="#ffffff" height="1" width="150"><IMG src="../i/c.gif" width="150" height="1"></TD>
</TR>
<TR>
<TD bgcolor="#cc6633" height="3" width="150"><IMG src="../i/c.gif" width="150" height="3"></TD>
</TR>
<TR>
<TD bgcolor="#333333" height="1" width="150"><IMG src="../i/c.gif" width="150" height="1"></TD>
</TR>
<TR>
<TD bgcolor="#000000" height="1" width="150"><IMG src="../i/c.gif" width="150" height="1"></TD>
</TR>
<TR>
<TD bgcolor="#ffffff" height="1" width="150"><IMG src="../i/c.gif" width="150" height="2"></TD>
</TR>
</TABLE>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td><font size="-1" face="Verdana, sans-serif"><a href="/developerWorks/cn/index.shtml">developerWorks 中国网站</a> : <a href="/developerWorks/cn/java/index.shtml">JAVA</a> : <a href="/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle?OpenView&Count=50">教学 - 在线教程</a></font>
<br>
<img alt="Java 认证成功之路,第 2 部分:SCWCD" src="imagemaster/masthead.jpg"></td><td width="*" valign="bottom" align="right"><a border="0" href="j-scwcd.zip"><img alt="下载 ZIP 文件" border="0" src="../i/icon-zip.gif"></a><a target="_blank" href="../tutorial_eng/index.html" border="0"><img alt="英文原文" border="0" src="../i/icon-source.gif"></a>
</td>
</tr>
<tr>
<td height="2" colspan="2"><img height="2" width="1" src="../i/c.gif"></td>
</tr>
</table>
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR>
<TD width="150" height="1" bgcolor="#000000" colspan="6"><IMG alt="" height="1" width="150" src="../i/c.gif"></TD>
</TR>
<TR>
<TD background="../i/sw-gold.gif"><a border="0" href="index.html" onMouseOver="iOver('topmain'); iOver('bottommain'); self.status=mainblurb; return true;" onMouseOut="iOut('topmain'); iOut('bottommain'); self.status=''; return true;"><img alt="主菜单" border="0" src="../i/main.gif" name="topmain"></a></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topsection'); iOver('bottomsection'); self.status=sectionblurb; return true;" onMouseOut="iOut('topsection'); iOut('bottomsection'); self.status=''; return true;" href="index2.html"><img alt="章节菜单" border="0" src="../i/section.gif" name="topsection"></a></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topfeedback'); iOver('bottomfeedback'); self.status=feedbackblurb; return true;" onMouseOut="iOut('topfeedback'); iOut('bottomfeedback'); self.status=''; return true;" href="j-scwcd-15-3.html"><img alt="给出此教程的反馈意见" border="0" src="../i/feedback.gif" name="topfeedback"></a></TD><TD width="100%" background="../i/sw-gold.gif"><img src="../i/c.gif"></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topprevious'); iOver('bottomprevious'); self.status=previousblurb; return true;" onMouseOut="iOut('topprevious'); iOut('bottomprevious'); self.status=''; return true;" href="j-scwcd-2-2.html"><img alt="上页" border="0" src="../i/previous.gif" name="topprevious"></a></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topnext'); iOver('bottomnext'); self.status=nextblurb; return true;" onMouseOut="iOut('topnext'); iOut('bottomnext'); self.status=''; return true;" href="j-scwcd-2-4.html"><img alt="下页" border="0" src="../i/next.gif" name="topnext"></a></TD>
</TR>
</TABLE>
<table bgcolor="ffffff" cellspacing="0" cellpadding="2" border="0" height="400" width="100%">
<tr valign="bottom">
<a name="navskip"></a><td height="25" colspan="4"><img alt="2.servlet 模型" src="imagemaster/titlebar2.jpg" border="0" height="25" width="562"></td>
</tr>
<tr>
<td bgcolor="ffffff" width="15"> </td><td bgcolor="ffffff" width="12"> </td><td valign="top" align="left" bgcolor="ffffff" width="*">
<p>
<br>
<table cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="90%"><font size="4" face="Verdana, Arial, Helvetica"><b>Servlet 生命周期</b></font></td><td width="200" align="right"><font size="1" face="Verdana, Arial, Helvetica"><nobr> 第 3 页(共7 页)</nobr></font></td>
</tr>
</table>
<br>
<br>
</p>
<font size="2" face="Verdana, Arial, Helvetica">
<p>servlet 生命周期由一系列事件组成,这些事件定义了 servlet 是如何加载和实例化、初始化,它如何处理来自客户机的请求,以及它是如何从服务器中删除的。</p>
<p>
<b>加载和实例化</b>
<br>
对于 Web 应用程序的部署描述符中定义的每个 servlet,servlet 容器查找并加载 servlet 类型的类。当启动 servlet 引挚本身时,这可能发生,或者后来当实际把客户机请求委托给 servlet 时也可能发生这种情况。之后,它实例化一个或多个 servlet 类的对象实例,用于服务客户机请求。</p>
<p>
<b>初始化</b>
<br>
在实例化后,在容器准备处理客户机请求前,它初始化一个 servlet。容器是通过下面方式初始化 servlet:调用它的 <code>init()</code> 方法,并传递实现 <code>ServletConfig</code> 接口的对象。在 <code>init()</code> 方法中,servlet 可以从部署描述符中读取配置参数,或者执行任何其他一次性活动,因此 servlet 容器有且仅有一次调用 <code>init()</code> 方法。</p>
<p>
<b>请求处理</b>
<br>
在 servlet 被初始化后,容器就可以准备处理客户机请求。当客户机请求到来时,就通过 <code>service()</code> 方法,并把请求和响应对象作为参数传递,从而把请求委托给 servlet。在 HTTP 请求中,请求和响应对象分别是 <code>HttpServletRequest</code> 和 <code>HttpServletResponse</code> 的实现。在 <code>HttpServlet</code> 类中,<code>service()</code> 方法针对每种类型的 HTTP 请求,调用不同的处理程序方法:<code>doGet()</code> 方法用于 <code>GET</code> 请求,<code>doPost()</code> 方法用于 <code>POST</code> 请求,等等。</p>
<p>
<b>从服务中删除</b>
<br>
出于各种原因(比如要节省内存资源),servlet 容器可能决定从服务中删除 servlet。为此,servlet 容器对 servlet 调用 <code>destroy()</code> 方法。调用
<code>destroy()</code> 方法后,servlet 不可能再服务其他的客户机请求了。现在 servlet 实例成为了垃圾收集对象。</p>
<p>
<b>获取请求参数和头</b>
<br>
servlet 容器把请求参数作为一组“名-值”对存储。<code>ServletRequest</code> 接口的下面方法用于获取客户机发送的参数:</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public String getParameter(String name);
public java.lang.String[] getParameterValues(String name);
public java.util.Enumeration getParameterNames();
</code>
</pre>
<p>
<code>getParameter()</code> 方法返回指定参数的单值。对于有多个值的参数,要使用 <code>getParameterValues()</code> 方法。当参数值未知时,<code>getParameterNames()</code> 方法是有用的;它把所有参数名作为 <code>Enumeration</code> 给出。</p>
<p>
<b>获取请求头</b>
<br>
HTTP 请求头可以使用 <code>HttpServletRequest</code>
接口的下面方法获取:</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public String getHeader(String name);
public java.util.Enumeration getHeaders(String name);
public java.util.Enumeration getHeaderNames();
</code>
</pre>
<p>例如:</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public void doPost(HttpServletRequest req,HttpServletResponse res){
Enumeration headers=req.getHeaderNames();
while(headers.hasMoreElements()) {
String header=(String)headers.nextElement();
System.out.println("Header is "+header);
}
}
</code>
</pre>
<p>
<b>获取初始化参数</b>
<br>
servlet 的初始化参数可以使用
<code>ServletConfig</code> 接口的下面方法获取。</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public String getInitParameter(String name);
public java.util.Enumeration getInitParameterNames();
</code>
</pre>
<p>
<b>设置响应</b>
<br>
<code>ServletResponse</code> 接口的下面方法可用于设置发送回客户机的响应。</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public void setContentType(String type);
</code>
</pre>
<p>该方法设置发送回客户机的响应的内容类型。默认值是“text/html”。</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public java.io.PrintWriter getWriter();
public javax.servlet.ServletOutputStream getOutputStream();
</code>
</pre>
<p>
<code>getWriter()</code> 方法返回一个 <code>PrintWriter</code> 对象,该对象可以把字符文本发送给客户机。<code>getOutputStream()</code> 方法返回一个 <code>ServletOutputStream</code> ,它适合于在响应中写入二进制数据。这两个方法中的任何一个可用于写响应,但二者都使用是不可以的。如果调用 <code>getOutputStream()</code> 后调用
<code>getWriter()</code>,或反之亦然,就会抛出 <code>IllegalStateException</code>。</p>
<p>例如:</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public void doGet(HttpServletRequest req,HttpServletResponse res) {
res.setContentType("text/html");
PrintWriter pw=res.getWriter();
pw.println("Hello World");
pw.close();
}
</code>
</pre>
<p>
<b>设置响应头</b>
<br>
响应头向浏览器提供了有关接收到的响应的附加信息。头信息是作为“名-值”对存储的。<code>HttpServletResponse</code> 接口的下面方法可用于设置头信息。</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public void setHeader(String name, String value);
public void setIntHeader(String name, int value);
public void setDateHeader(String name, long value);
</code>
</pre>
<p>
<b>重定向请求</b>
<br>
可以发送临时重定向消息给浏览器,该消息会把浏览器引导到另一个 URL。<code>HttpServletResponse</code> 接口提供了这个方法。</p>
<pre>
<code style="font-family: Courier New, Courier, monospace; font-size: 12">
public void sendRedirect( String location );
</code>
</pre>
<p>该方法可以接受相对 URL;servlet 容器将把相对 URL 转换为绝对 URL,然后发送给客户机。如果该方法是在提交响应后调用的,就抛出
<code>IllegalStateException</code>。</p>
<br>
</font></td>
</tr>
</table>
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR>
<TD background="../i/sw-gold.gif"><a border="0" href="index.html" onMouseOver="iOver('topmain'); iOver('bottommain'); self.status=mainblurb; return true;" onMouseOut="iOut('topmain'); iOut('bottommain'); self.status=''; return true;"><img alt="主菜单" border="0" src="../i/main.gif" name="bottommain"></a></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topsection'); iOver('bottomsection'); self.status=sectionblurb; return true;" onMouseOut="iOut('topsection'); iOut('bottomsection'); self.status=''; return true;" href="index2.html"><img alt="章节菜单" border="0" src="../i/section.gif" name="bottomsection"></a></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topfeedback'); iOver('bottomfeedback'); self.status=feedbackblurb; return true;" onMouseOut="iOut('topfeedback'); iOut('bottomfeedback'); self.status=''; return true;" href="j-scwcd-15-3.html"><img alt="给出此教程的反馈意见" border="0" src="../i/feedback.gif" name="bottomfeedback"></a></TD><TD width="100%" background="../i/sw-gold.gif"><img src="../i/c.gif"></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topprevious'); iOver('bottomprevious'); self.status=previousblurb; return true;" onMouseOut="iOut('topprevious'); iOut('bottomprevious'); self.status=''; return true;" href="j-scwcd-2-2.html"><img alt="上页" border="0" src="../i/previous.gif" name="bottomprevious"></a></TD><TD background="../i/sw-gold.gif"><a border="0" onMouseOver="iOver('topnext'); iOver('bottomnext'); self.status=nextblurb; return true;" onMouseOut="iOut('topnext'); iOut('bottomnext'); self.status=''; return true;" href="j-scwcd-2-4.html"><img alt="下页" border="0" src="../i/next.gif" name="bottomnext"></a></TD>
</TR>
<TR>
<TD width="150" height="1" bgcolor="#000000" colspan="6"><IMG alt="" height="1" width="150" src="../i/c.gif"></TD>
</TR>
</TABLE>
<TABLE width="100%" cellpadding="0" cellspacing="0" border="0">
<TR>
<TD width="100%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td><img alt="" height="1" width="1" src="../i/c.gif"></td>
</tr>
<tr valign="top">
<td class="bbg" height="21"> <a class="mainlink" href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/ibm/index.shtml">关于 IBM</a><span class="divider"> | </span><a class="mainlink" href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/ibm/privacy/index.shtml">隐私条约</a><span class="divider"> | </span><a class="mainlink" href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/ibm/legal/index.shtml">法律条款</a><span class="divider"> | </span><a class="mainlink" href="/developerWorks/cgi-bin/click.cgi?url=http://www-900.ibm.com/cn/ibm/contact/index.shtml">联系 IBM</a></td>
</tr>
</table>
</TD>
</TR>
</TABLE>
<script src="//www.ibm.com/common/stats/stats.js" language="JavaScript1.2" type="text/javascript"></script>
<noscript>
<img border="0" alt="" height="1" width="1" src="//stats.www.ibm.com/rc/images/uc.GIF?R=noscript"></noscript>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -