Servlet简介

4.1Servlet简介
1.Servlet 是什么?
Servlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的Java 程序。除了 Java Servlet API,Servlet 还可以使用用以扩展和添加到 API 的 Java类软件包。Servlet 在启用 Java 的 Web 服务器上或应用服务器上运行并扩展了该服务器的能力。Javaservlet对于Web服务器就好象Java applet对于Web浏览器。Servlet装入Web服务器并在Web服务器内执行,而applet装入Web浏览器并在Web浏览器内执行。JavaServlet API 定义了一个servlet 和Java使能的服务器之间的一个标准接口,这使得Servlets具有跨服务器平台的特性。
Servlet 通过创建一个框架来扩展服务器的能力,以提供在Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并让 Servlet建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet。装入后,Servlet 继续运行直到其它客户机发出请求。Servlet 的功能涉及范围很广。例如,Servlet 可完成如下功能:
(1) 创建并返回一个包含基于客户请求性质的动态内容的完整的HTML页面。
(2) 创建可嵌入到现有 HTML 页面中的一部分 HTML页面(HTML 片段)。
(3) 与其它服务器资源(包括数据库和基于 Java 的应用程序)进行通信。
(4) 用多个客户机处理连接,接收多个客户机的输入,并将结果广播到多个客户机上。例如,Servlet可以是多参与者的游戏服务器。
(5) 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至applet的新连接,并将该连
接保持在打开状态。当允许客户机和服务器简单、高效地执行会话的情况下,applet也可以启动客户浏览器和服务器之间的连接。可以通过定制协议或标准(如IIOP)进行通信。
(6) 对特殊的处理采用 MIME 类型过滤数据,例如图像转换和服务器端包括(SSI)。
(7) 将定制的处理提供给所有服务器的标准例行程序。例如,Servlet可以修改如何认证用户。
2.Servlet 的生命周期
Servlet 的生命周期始于将它装入 Web 服务器的内存时,并在终止或重新装入Servlet 时结束。
(1) 初始化
在下列时刻装入 Servlet:
 如果已配置自动装入选项,则在启动服务器时自动装入
 在服务器启动后,客户机首次向Servlet 发出请求时
 重新装入Servlet 时装入 Servlet 后,服务器创建一个 Servlet 实例并且调用 Servlet 的 init()方法。在初始化阶段,Servlet 初始化参数被传递给 Servlet 配置对象。
(2) 请求处理
对于到达服务器的客户机请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。服务器调用Servlet 的 service() 方法,该方法用于传递“请求”和“响应”对象。service() 方法从“请求”对象获得请求信息、处理该请求并用“响应”对象的方法以将响应传回客户机。service()方法可以调用其它方法来处理请求,例如 doGet()、doPost() 或其它的方法。
(3) 终止
当服务器不再需要 Servlet, 或重新装入 Servlet的新实例时,服务器会调用 Servlet 的 destroy() 方法。
3. Java Servlet API
Java Servlet 开发工具(JSDK)提供了多个软件包,在编写Servlet 时需要用到这些软件包。其中包括两个用于所有 Servlet 的基本软件包:javax.servlet和 javax.servlet.http。可从sun公司的Web站点下载 Java Servlet 开发工具。 下面主要介绍javax.servlet.http提供的HTTPServlet应用编程接口。
HTTPServlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类,该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 <FORM> 和</FORM>标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中init() 和 destroy() 方法是继承的。
(1) init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。无论有多少客户机访问 Servlet,都不会重复执行 init() 。
缺省的 init() 方法通常是符合要求的,但也可以用定制init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init()方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service()方法之前,应确保已完成了 init() 方法。
(2) service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet对象,该对象的service() 方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖service() 方法。只需覆盖相应的 do 方法就可以了。
 当一个客户通过HTML表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
 当一个客户通过HTML表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
Servlet的响应可以是下列几种类型:
一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。
一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。
(3) destroy() 方法
destroy() 方法仅执行一次,即在服务器停止且卸装Servlet时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet时将统计数字保存在文件中。另一个示例是关闭数据库连接。
当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy()方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy()方法时,这些线程已终止或完成。
(4) GetServletConfig()方法
GetServletConfig()方法返回一个 ServletConfig对象,该对象用来返回初始化参数和ServletContext。ServletContext接口提供有关servlet 的环境信息。
(5) GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet的信息,如作者、版本、版权。
当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要“请求”和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个通信途径。javax.servlet软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用“请求”对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet可以调用“响应”对象的方法发送响应,该响应是准备发回客户机的。
4.2创建HTTP Servlet
创建一个 HTTP Servlet,通常涉及下列四个步骤:
1. 扩展 HttpServlet 抽象类。
2. 重载适当的方法。]如覆盖(或称为重写)doGet()或doPost()方法。
3. 如果有 HTTP 请求信息的话,获取该信息。用 HttpServletRequest对象来检索 HTML 表格所
提交的数据或 URL 上的查询字符串。“请求”对象含有特定的方法以检索客户机提供的信息,有3个可用的方法:
 getParameterNames(),
 getParameter(),
 getParameterValues()。
4. 生成 HTTP 响应。HttpServletResponse对象生成响应,并将它返回到发出请求的客户机上。它
的方法允许设置“请求” 标题和“响应”主体。“响应”对象还含有 getWriter() 方法以返回一个 PrintWriter对象。使用 PrintWriter 的 print() 和 println() 方法以编写 Servlet 响应来返回给客户机。或者,直接使用out对象输出有关HTML文档内容。
一个servlet样例(ServletSample.java)如下:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

publicclass ServletSample extends HttpServlet { // 第一步: 扩展 HttpServlet抽象类。

public void doGet (HttpServletRequestrequest, HttpServletResponse response)
throws ServletException, IOException{ // 第二步:重写doGet()方法

String myName = "";// 第三步:获取HTTP 请求信息
java.util.Enumeration keys = request.getParameterNames();
while (keys.hasMoreElements());
{
key = (String) keys.nextElement();
if (key.equalsIgnoreCase("myName"))
myName = request.getParameter(key);
}
if (myName == "")
myName = "Hello";
// 第四步:生成 HTTP 响应。
response.setContentType("text/html");
response.setHeader("Pragma","No-cache");
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");

out.println("<head><title>Justa basic servlet</title></head>");
out.println("<body>");
out.println("<h1>Justa basic servlet</h1>");
out.println ("<p>"+ myName + ", this is a very basic servlet that writesan HTML
page.");
out.println ("<p>Forinstructions on running those samples on your WebSphere应用服务器,"+
"open the page:");
out.println("<pre>http://<em>your.server.name</em>/IBMWebAs/samples/index.aspl</pre>");
out.println("where <em>your.server.name</em>is the hostname of your WebSphere应用服
务器.");
out.println("</body></html>");
out.flush();
}
}
上述ServletSample类扩展 HttpServlet抽象类、重写doGet()方法。在重写的doGet()方法中,获取HTTP 请求中的一个任选的参数(myName),该参数可作为调用的URL 上的查询参数传递到 Servlet。使用示例如下:http://your.server.name/servlet/ServletSample?myname=Michael
4.3调用 Servlet
要调用 Servlet 或 Web 应用程序,请使用下列任一种方法:由URL 调用、在 <FORM> 标记中调用、在 <SERVLET>标记中调用、在 JSP 文件中调用、在ASP 文件中调用。
1. 由 URL 调用 Servlet
这里有两种用 Servlet 的 URL 从浏览器中调用该Servlet 的方法:
(1) 指定 Servlet 名称:当用 WebSphere应用服务器管理器来将一个 Servlet 实例添加(注册)到服务器配置中时,必须指定“Servlet 名称”参数的值。例如,可以指定将hi作为HelloWorldServlet的 Servlet 名称。要调用该 Servlet,需打开 http://your.server.name/servlet/hi。也可以指定Servlet 和类使用同一名称(HelloWorldServlet)。在这种情况下,将由 http://your.server.name/servlet/HelloWorldServlet来调用 Servlet 的实例。
(2) 指定 Servlet 别名:用 WebSphere应用服务器管理器来配置 Servlet 别名,该别名是用于调用 Servlet 的快捷 URL。快捷 URL 中不包括 Servlet名称。
2. 在 <FORM> 标记中指定Servlet
可以在 <FORM> 标记中调用 Servlet。HTML格式使用户能在 Web 页面(即从浏览器)上输入数据,并向 Servlet 提交数据。例如:
<FORM METHOD="GET"ACTION="/servlet/myservlet">
<OL>
<INPUT TYPE="radio"NAME="broadcast" VALUE="am">AM<BR>
<INPUT TYPE="radio"NAME="broadcast" VALUE="fm">FM<BR>
</OL>
(用于放置文本输入区域的标记、按钮和其它的提示符。)
</FORM>
ACTION 特性表明了用于调用 Servlet 的 URL。关于METHOD的特性,如果用户输入的信息是通过 GET 方法向 Servlet 提交的,则 Servlet 必须优先使用 doGet()方法。反之,如果用户输入的信息是通过 POST 方法向 Servlet 提交的,则 Servlet 必须优先使用 doPost()方法。使用 GET 方法时,用户提供的信息是查询字符串表示的 URL 编码。无需对 URL 进行编码,因为这是由表单完成的。然后URL 编码的查询字符串被附加到 Servlet URL 中,则整个 URL 提交完成。URL 编码的查询字符串将根据用户同可视部件之间的交互操作,将用户所选的值同可视部件的名称进行配对。例如,考虑前面的HTML 代码段将用于显示按钮(标记为 AM 和 FM),如果用户选择 FM 按钮,则查询字符串将包含 name=value的配对操作为broadcast=fm。因为在这种情况下,Servlet 将响应 HTTP 请求,因此 Servlet应基于 HttpServlet 类。Servlet 应根据提交给它的查询字符串中的用户信息使用的 GET 或 POST方法,而相应地使用 doGet() 或 doPost() 方法。
3.在 <SERVLET> 标记中指定Servlet
当使用 <SERVLET> 标记来调用 Servlet时,如同使用 <FORM> 标记一样,无需创建一个完整的 HTML 页面。作为替代,Servlet 的输出仅是HTML 页面的一部分,且被动态嵌入到原始 HTML 页面中的其它静态文本中。所有这些都发生在服务器上,且发送给用户的仅是结果HTML 页面。建议在 Java 服务器页面(JSP)文件中使用 <SERVLET> 标记。请参阅有关JSP 技术
原始 HTML 页面中包含 <SERVLET>和 </SERVLET> 标记。 Servlet 将在这两个标记中被调用,且 Servlet 的响应将覆盖这两个标记间的所有东西和标记本身。如果用户的浏览器可以看到HTML 源文件,则用户将看不到 <SERVLET> 和 </SERVLET> 标记。要在Domino Go Webserver 上使用该方法,请启用服务器上的服务器端包括功能。部分启用过程将会涉及到添加特殊文件类型SHTML。当 Web 服务器接收到一个扩展名为 SHTML 的 Web 页面请求时,它将搜索 <SERVLET>和 </SERVLET> 标记。对于所有支持的 Web 服务器,WebSphere应用服务器 将处理 SERVLET标记间的所有信息。下列 HTML 代码段显示了如何使用该技术。
<SERVLET NAME="myservlet"CODE="myservlet.class" CODEBASE="url"initparm1="value">
<PARAM NAME="parm1"VALUE="value">
</SERVLET>
使用 NAME 和 CODE 属性带来了使用上的灵活性。可以只使用其中一个属性,也可以同时使用两个属性。NAME 属性指定了 Servlet 的名称(使用 WebSphere应用服务器 管理器配置的),或不带 .class扩展名的 Servlet 类名。CODE 属性指定了 Servlet 类名。使用 WebSphere应用服务器 时,建议指定NAME 和 CODE,或当 NAME 指定了 Servlet 名称时,仅指定 NAME。如果仅指定了 CODE,则会创建一个NAME=CODE 的 Servlet 实例。装入的 Servlet 将假设 Servlet 名称与 NAME 属性中指定的名称匹配。然后,其它SHTML 文件可以成功地使用 NAME 属性来指定 Servlet 的名称,并调用已装入的 Servlet。NAME的值可以直接在要调用 Servlet 的 URL 中使用。如果 NAME 和 CODE 都存在,且 NAME 指定了一个现有Servlet,则通常使用 NAME 中指定的 Servlet。由于 Servlet 创建了部分 HTML 文件,所以当创建Servlet 时,将可能会使用 HttpServlet 的一个子类,并优先使用 doGet() 方法(因为 GET方法是提供信息给 Servlet 的缺省方法)。另一个选项是优先使用 service() 方法。另外, CODEBASE是可选的,它指定了装入 Servlet 的远程系统的 URL。请使用 WebSphere应用服务器 管理器来从 JAR文件配置远程 Servlet 装入系统。
在上述的标记示例中,initparm1 是初始化参数名,value是该参数的值。可以指定多个“名称-值”对的集合。利用 ServletConfig 对象(被传递到 Servlet 的init() 方法中)的 getInitParameterNames() 和 getInitParameter()方法来查找参数名和参数值的字符串数组。在示例中,parm1 是参数名,并在初始化 Servlet 后被才被设置某个值。因为只能通过使用“请求”对象的方法来使用以<PARAM> 标记设置的参数,所以服务器必须调用 Servlet service() 方法,以从用户处传递请求。要获得有关用户的请求信息,请使用getParameterNames()、getParameter() 和 getParameterValues()方法。
初始化参数是持续的。假设一台客户机通过调用一个包含某些初始化参数的SHTML 文件来调用 Servlet。并假设第二台客户机通过调用第二个 SHTML 文件来调用同一个 Servlet,且该SHTML 中未指定任何初始化参数。那么第一次调用 Servlet 时所设置的初始化参数将一直可用,并且通过所有其它SHTML 文件而调用的所有后继 Servlet 都不会更改该参数。直到 Servlet 调用了 destroy()方法后,才能重新设置初始化参数。例如,如果另一个 SHTML 文件指定了另一个不同的初始化参数值,虽然已此时已装入了Servlet,但该值仍将被忽略。
4.在 JSP 文件中调用 Servlet
可以从 JavaServer 页面(JSP)文件中调用 Servlet。请参阅JSP技术部分。
5.在 ASP 文件中调用 Servlet
如果在 Microsoft Internet InformationServer(IIS)上有遗留的 ASP 文件,并且无法将 ASP 文件移植成 JSP 文件时,可用 ASP 文件来调用Servlet。在 WebSphere应用服务器 中的 ASP 支持包括一个用于嵌入 Servlet 的 ActiveX控制,下面介绍ActiveX 控制AspToServlet 的方法和属性。
该方法说明如下:
(1) String ExecServletToString(StringservletName);执行 ServletName,并将其输出返回到一个字符串中。
(2) ExecServlet(String servletName);执行ServletName,并将其输出直接发送至 HTML 页面。
(3) String VarValue(String varName);获得一预置变量值(其它格式)。
(4) VarValue(String varName, StringnewVal);设置变量值。变量占据的总大小应小于 0.5 个千字节(Kbyte)。且仅对配置文件使用这些变量。
其属性如下:
 BooleanWriteHeaders;若该属性为真,则 Servlet 提供的标题被写入用户处。缺省值为假。
 BooleanOnTest;若该属性为真,服务器会将消息记录到生成的 HTML 页面中。缺省值为假。
下列ASP 脚本示例是以 Microsoft VisualBasic Scripting(VBScript)书写的。
<%
' Small sample asp file to showthe capabilities of the servlets and the ASP GateWay ...
%>
<H1> Starting the ASP->JavaServlet demo</H1>
<%
' Create a Servlet gateway objectand initialize it ...
Set javaasp = Server.CreateObject("AspToServlet.AspToServlet")
' Setting these properties isonly for the sake of demo.
' These are the default values...
javaasp.OnTest = False
javaasp.WriteHeaders = False
' Add several variables ...
javaasp.VarValue("gal")= "lag"
javaasp.VarValue("pico")="ocip"
javaasp.VarValue("tal")= "lat"
javaasp.VarValue("paz")= "zap"
javaasp.VarValue("variablename with spaces") = "variable value with spaces"
%>
<BR>
Lets check the variables
<%
Response.Write("variablegal = ")
Response.Write(javaasp.VarValue("gal"))
%>
<BR>
<%
Response.Write("variablepico = " & javaasp.VarValue("pico"))
%>

<BR>
<HR>
<%
galout = javaasp.ExecServletToString("SnoopServlet")
If javaasp.WriteHeaders = TrueThen
%>
Headers were written <%
Else
%>
Headers were not written <%
End If
Response.Write(galout)
%>
<H1> The End ...</H1>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值