Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519805
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: Java

2010-11-02 14:21:17

4.1 Servlet简介
  1.Servlet 是什么?
  Servlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的 Java 程序。除了 Java Servlet API,Servlet 还可以使用用以扩展和添加到 API 的 Java 类软件包。Servlet 在启用 Java 的 Web 服务器上或应用服务器上运行并扩展了该服务器的能力。Java servlet对于Web服务器就好象Java applet对于Web浏览器。Servlet装入Web服务器并在Web服务器内执行,而applet装入Web浏览器并在Web浏览器内执行。Java Servlet 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提供的HTTP Servlet应用编程接口。
  HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由
标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一 个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.*;

  public class ServletSample extends HttpServlet { // 第一步: 扩展 HttpServlet 抽象类。
  
  public void doGet (HttpServletRequest request, 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("Just a basic servlet");
  out.println("");
  out.println("

Just a basic servlet

");
  out.println ("

" + myName + ", this is a very basic servlet that writes an HTML
   page.");
  out.println ("

For instructions on running those samples on your WebSphere应用服务器,   "+
  "open the page:");
  out.println("

");
  out.println("where your.server.name is the hostname of your WebSphere应用服
  务器.");
  out.println(" ");
  out.flush();
  }
  }
  上述ServletSample类扩展 HttpServlet 抽象类、重写doGet()方法。在重写的doGet()方法中,获取HTTP 请求中的一个任选的参数(myName),该参数可作为调用的 URL 上的查询参数传递到 Servlet。使用示例如下:。
  4.3 调用 Servlet
  要调用 Servlet 或 Web 应用程序,请使用下列任一种方法:由 URL 调用、在
标记中调用、在 标记中调用、在 JSP 文件中调用、在 ASP 文件中调用。
  1. 由 URL 调用 Servlet
  这里有两种用 Servlet 的 URL 从浏览器中调用该 Servlet 的方法:
  (1) 指定 Servlet 名称:当用 WebSphere应用服务器 管理器来将一个 Servlet 实例添加(注册)到服务器配置中时,必须指定“Servlet 名称”参数的值。例如,可以指定将hi作为HelloWorldServlet 的 Servlet 名称。要调用该 Servlet,需打开 。也可以指定 Servlet 和类使用同一名称(HelloWorldServlet)。在这种情况下,将由 来调用 Servlet 的实例。
  (2) 指定 Servlet 别名:用 WebSphere应用服务器 管理器来配置 Servlet 别名,该别名是用于调用 Servlet 的快捷 URL。快捷 URL 中不包括 Servlet 名称。
  2. 在 标记中指定 Servlet
  可以在 标记中调用 Servlet。HTML 格式使用户能在 Web 页面(即从浏览器)上输入数据,并向 Servlet 提交数据。例如:
  
  

      AM

      FM

      

  (用于放置文本输入区域的标记、按钮和其它的提示符。)
  
  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 时,如同使用
标记一样,无需创建一个完整的 HTML 页面。作为替代,Servlet 的输出仅是 HTML 页面的一部分,且被动态嵌入到原始 HTML 页面中的其它静态文本中。所有这些都发生在服务器上,且发送给用户的仅是结果 HTML 页面。建议在 Java 服务器页面(JSP)文件中使用 标记。请参阅有关 JSP 技术
  原始 HTML 页面中包含 标记。 Servlet 将在这两个标记中被调用,且 Servlet 的响应将覆盖这两个标记间的所有东西和标记本身。如果用户的浏览器可以看到 HTML 源文件,则用户将看不到 标记。要在 Domino Go Webserver 上使用该方法,请启用服务器上的服务器端包括功能。部分启用过程将会涉及到添加特殊文件类型 SHTML。当 Web 服务器接收到一个扩展名为 SHTML 的 Web 页面请求时,它将搜索 标记。对于所有支持的 Web 服务器,WebSphere应用服务器 将处理 SERVLET 标记间的所有信息。下列 HTML 代码段显示了如何使用该技术。
  
  
  

  使用 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 后被才被设置某个值。因为只能通过使用“请求”对象的方法来使用以 标记设置的参数,所以服务器必须调用 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 Information Server(IIS)上有遗留的 ASP 文件,并且无法将 ASP 文件移植成 JSP 文件时,可用 ASP 文件来调用 Servlet。在 WebSphere应用服务器 中的 ASP 支持包括一个用于嵌入 Servlet 的 ActiveX 控制,下面介绍ActiveX 控制AspToServlet 的方法和属性。
该方法说明如下:
  (1) String ExecServletToString(String servletName);执行 ServletName,并将其输出返回到一个字符串中。
  (2) ExecServlet(String servletName);执行 ServletName,并将其输出直接发送至 HTML 页面。
  (3) String VarValue(String varName);获得一预置变量值(其它格式)。
  (4) VarValue(String varName, String newVal);设置变量值。变量占据的总大小应小于 0.5 个千字节(Kbyte)。且仅对配置文件使用这些变量。
  其属性如下:
 Boolean WriteHeaders;若该属性为真,则 Servlet 提供的标题被写入用户处。缺省值为假。
 Boolean OnTest;若该属性为真,服务器会将消息记录到生成的 HTML 页面中。缺省值为假。
  下列ASP 脚本示例是以 Microsoft Visual Basic Scripting(VBScript)书写的。
  <%
  ' Small sample asp file to show the capabilities of the servlets and the ASP GateWay ...
  %>
  

Starting the ASP->Java Servlet demo


  <%
  ' Create a Servlet gateway object and initialize it ...
  Set javaasp = Server.CreateObject("AspToServlet.AspToServlet")
  ' Setting these properties is only 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("variable name with spaces") = "variable value with spaces"
  %>
  

  Lets check the variables
  <%
  Response.Write("variable gal = ")
  Response.Write(javaasp.VarValue("gal"))
  %>
  

  <%
  Response.Write("variable pico = " & javaasp.VarValue("pico"))
  %>
  
  

  

  <%
  galout = javaasp.ExecServletToString("SnoopServlet")
  If javaasp.WriteHeaders = True Then
  %>
  Headers were written <%
  Else
  %>
  Headers were not written <%
  End If
  Response.Write(galout)
  %>
  

The End ...



5.1 JSP简介
  JSP(JavaServer Pages)是一种基于Java的脚本技术。在JSP 的众多优点之中,其中之一是它能将 HTML 编码从 Web 页面的业务逻辑中有效地分离出来。用 JSP 访问可重用的组件,如 Servlet、JavaBean 和基于 Java 的 Web 应用程序。JSP 还支持在 Web 页面中直接嵌入 Java 代码。可用两种方法访问 JSP 文件:浏览器发送 JSP 文件请求、发送至 Servlet 的请求。
  1. JSP 文件访问 Bean 或其它能将生成的动态内容发送到浏览器的组件。图5-1说明了该 JSP 访问模型。当 Web 服务器接收到一个 JSP 文件请求时,服务器将请求发送至 WebSphere应用服务器。WebSphere应用服务器 对 JSP 文件进行语法分析并生成 Java 源文件(被编译和执行为 Servlet)。Java 源文件的生成和编译仅在初次调用 Servlet 时发生,除非已经更新了原始的 JSP 文件。在这种情况下,WebSphere应用服务器 将检测所做的更新,并在执行它之前重新生成和编译 Servlet。



图5-1:浏览器发送 JSP 文件请求

  2. 发送至 Servlet 的请求生成动态内容,并调用 JSP 文件将内容发送到浏览器。图5-2说明了该访问模型。该访问模型使得将内容生成从内容显示中分离出来更为方便。WebSphere应用服务器 支持 HttpServiceRequest 对象和 HttpServiceResponse 对象的一套新方法。这些方法允许调用的 Servlet 将一个对象放入(通常是一个 Bean)请求对象中,并将该请求传递到另一个页面(通常是一个 JSP 文件)以供显示。调用的页面从请求对象中检索 Bean, 并用 JSP 来生成客户机端的 HTML。



图5-2:发送至 Servlet 的请求

  5.2 JSP示例
  浏览器通过一个Web 页面中的HTML表单请求一个servlet(PopulateBeanServlet),该servlet创建一个名为 dataBean 的DataBean 实例,并调用 JSP 文件将内容发送到浏览器。Servlet 示例和 JSP 文件示例说明了启用内容分离的 JSP 访问模型。
  A. Servlet 是由下列Web 页面中的 HTML 表单来调用的。
  
  
  

运行 PopulateBeanServlet


  

您是否希望运行 PopulateBeanServlet?
  
  
  
  


  
  
  B. 被请求的servlet为PopulateBeanServlet, 其源代码如下:
  /******************************************************************
  *Servlet 示例:PopulateBeanServlet.java
  *这个servlet创建一个名为 dataBean 的DataBean 实例,设置dataBean的若干个属性,
  *将dataBean放置在当前“请求”对象中,
  *调用 JSP 文件(DisplayData.jsp)来格式化并显示dataBean的数据
  ********************************************************************/
  import java.io.*;
  import java.beans.Beans;
  import javax.servlet.*;
  import javax.servlet.http.*;
  import javax.ejb.CreateException;

  public class PopulateBeanServlet extends HttpServlet {
  public void Service(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  try {
  dataBean = (DataBean) Beans.instantiate(this.getClass().getClassLoader(), "DataBean");
  }
  catch (Exception ex) {
  throw new ServletException("Can't create BEAN of class DataBean: "
  metaData.setSQL(getSQLString());
  }
  // Set some Bean properties (content generation)
  dataBean.setProp1("Value1");
  dataBean.setProp2("Value2");
  dataBean.setProp3("Value3");
  // To send the Bean to a JSP file for content formatting and display
  // 1) 将dataBean放置在当前“请求”对象中,
  ((com.sun.server.http.HttpServiceRequest) req).setAttribute("dataBean", dataBean);
  // 2) 使用callPage 方法调用JSP文件,文件名为DisplayData.jsp,并把请求对象传递给JSP。
  ((com.sun.server.http.HttpServiceResponse) res).callPage("/DisplayData.jsp", req);
  } //end of service mehtod
  } /* end of class PopulateBeanServlet */

  C. 被调用的JSP文件为DisplayData.jsp,其内容如下:
  
  
  
  Bean Data Display
  
  
  
  
  

  
  
  
  <% out.println("The value of Bean property 1 is " + dataBeans.getProp1());
  %>

  
  

The value of Bean property 2 is
  <%= dataBean.getProp2() %>



  
  

The value of Bean property 3 is
  
  



  
  

  5.3 JSP 语法
  JSP 文件(扩展名为 .jsp)可以包含指令(或称为指示语句)、Class-wide 变量和方法、直接插入的 Java 代码(scriptlet)、访问 JavaBean、变量数据的 HTML 模型、变量数据的 Java 表达式的组合。
  1.JSP 指令
  使用 JSP 指令(在<%@ 和 %>内的)来指定所使用的脚本语言、Servlet 实现的接口、Servlet 扩展的类、Servlet 导入的软件包。JSP 指令的一般语法形式为:<%@ 指令名 ="值" %>。其中有效的指令名为:
  (1) language:文件中所使用的脚本语言。此时对于 Java 程序设计语言来说,仅 java 为有效值和缺省值。该指令作用于整个文件。当多次使用该指令时,只有第一次使用是有效的。示例如下:<%@ language ="java" %>。
  (2) Method:由嵌入的 Java 代码(scriptlet)生成的方法的名称。生成的代码会成为指定方法名的主体。缺省的方法是service。当多次使用该指令时,只有第一次使用是有效的。示例如下:<%@ method ="doPost" %>。
  (3) Import:Servlet 导入的 Java 语言软件包名或类名列表,该列表是用逗号分隔的。在 JSP 文件中,可以多次指定该指令来导入不同的软件包。示例如下:<%@ import ="java.io.*,java.util.Hashtable" %>。
  (4) content_type :生成的响应的 MIME 类型。缺省值为 text/html。当多次使用该指令时,只有第一次使用是有效的。 该指令可用以指定在其中对页面进行编码的字符集。示例如下:<%@ content_type ="text/html; charset=gb2312" %>。
  (5) mplements:用于生成 Servlet 实现的 Java 语言接口列表,该列表是用逗号分隔的。可以在一个 JSP 文件中多次使用该命令,以实现不同的接口。示例如下:<%@ implements = "javax.servlet.http.HttpSessionContext" %>。
  (6) extends:Servlet 扩展的 Java 语言类的名称。该类必须是有效的,且不能是一个 Servlet 类。该指令作用于整个 JSP 文件。当多次使用该指令时,只有第一次使用是有效的。示例如下:<%@ extends ="javax.servlet.http.HttpServlet" %>。
  2.class-wide 变量和方法
  使用 标记来说明 Servlet 类的 class-wide 变量和 class-wide 方法。一般语法如下:
  
  属性 runat=server 是必需的,它表明该标记是用于服务器端处理的。指定 class-wide 变量和方法的示例如下:
  

  3.访问 JavaBean
  JSP 对 JavaBean 的支持使您能通过 Web 站点重复使用组件。JavaBean 可以是类文件或串行化 Bean,也可由 Servlet 动态生成。请使用 标记来创建一个 Bean 实例,以使从 JSP 文件的任何地方都可对该实例进行访问。标记 的语法为:
     type ="class_or_interface_name" introspect="yes|no"
  beanName="ser_filename" create="yes|no"
  scope="request|session|userprofile" >
  
  

  其中的属性及其含义如下:
  (1) name:用于在相应的范围(由 scope 属性指定)内查找 Bean 的名称。例如,这可能是用于存储 Bean 的会话(session)关键值。该值是分大小写的。
  (2) varname:用于在 JSP 文件中的任何地方引用 Bean 的名称。该属性是可选的。缺省值为 name 属性值。该值是分大小写的。
  (3) type:Bean 的类文件名。该名称用于以代码说明 Bean 实例。缺省值为 Object 类型。该值是分大小写的。
  (4) Introspect:当该值为真时,JSP 处理器检查将所有的请求属性,并调用与请求属性匹配的 set 属性方法集(该属性是在 BeanInfo 中传递的)。该属性的缺省值为是。
  (5) BeanName:Bean 的 .class 文件名、Bean 软件包名或包含 Bean 的串行化文件(.ser 文件)的文件名。(该名称是给 Bean 实例程序的)。仅当 Bean 不在指定的范围中,且创建属性被设置成是时,才使用该属性。该值是分大小写的。文件路径必须在应用服务器的Java 类路径中指定,除非文件在 applicationserver_root\servlets 目录下。
  (6) Create:当该值为真时,如果处理器在指定的范围内没有找到 Bean,则 JSP 将创建一个 Bean 实例。缺省值为真。
  (7)Scope:Bean 的生命期。该属性是可选的,其缺省值为 request 。有效值为:
 request - 由 Servlet 将 Bean 设置成请求的上下文,该 Servlet 使用 JSP API 中描述的 API 调
用 JSP 文件。如果 Bean 不是请求上下文的一部分,则将创建该 Bean,并将其存储在请求上下文中,除非创建属性已设置为否。
 session - 如果当前对话中存在 Bean,则 Bean 已被重用。如果不存在 Bean,且创建属性设置
为是,则它已被创建并作为会话的一部分存储起来。
 userprofile - 由 Servlet 请求对象检索、造型成指定的类型,并进行内省的用户简要表文件。(在
IBM WebShere应用服务器中,缺省类型为 com.ibm.servlet.personalization.userprofile.UserProfile)。
  (8) param:属性和值配对的列表。属性是在 Bean 中用内省自动设置的。只在实例化 Bean 时,才对属性进行设置。
  除了使用 属性来设置 Bean 属性外,还可以使用其它三种方法:第一,在请求包含 Bean 的 Web 页面(JSP 文件)的 URL 时,指定查询参数。必须将内省属性设置成“是”。其示例如下: /signon.jsp?name=jones&password=d13x,其中 Bean 属性名将设置为 jones。第二种方法,将属性指定成由 HTML 标记提交的参数。必须将 mothod 属性设置成 post。将 action 属性设置成调用 Bean 的 JSP 文件的 URL。必须将 introspect 属性设置成“是”。其示例如下:
  


  
  
  

  第三中方法是使用 JSP 语法设置 Bean 属性。
  在指定了 标记后,就可以从 JSP 文件中的任何地方访问 Bean。这里有三种访问 Bean 属性的方法:使用 JSP scriptlet、使用 JSP 表达式、使用 标记(如同 变量数据的 HTML 模板语法中所说明的)。请参阅JSP示例(DisplayData.jsp 文件)以获取三个访问 Bean 方法的每个方法示例。
  4.直接插入的 Java 代码(scriptlet)
  可以在 JSP 文件的 <% 和 %> 标记间直接嵌入任何有效的 Java 语言代码。这样嵌入的代码称为 scriptlet。如果没有指定 method 指令,则生成的代码将成为 service 方法的主体。用于 Servlet 的 scriptlet 可以使用一个预定义的变量集,该变量集符合基本的 Servlet、输出和输入类:
  (1) request:由 javax.servlet.http.HttpServletRequest 定义的 Servlet 请求类
  (2) responses:由 javax.servlet.http.HttpServletRequest 定义的 Servlet 响应类
  (3) out:由 java.io.PrintWriter 定义的输出转录程序类
  (4) in:由 java.io.BufferedReader 定义的输入阅读程序类
  其示例如下:
  <%
  foo = request.getParameter("Name");
  out.println(foo);
  %>
  5.变量数据的 HTML 模板语法
  当页面被返回给浏览器时,应用服务器HTML 模板语法使您能将变量字段放在 HTML 页面上,并使 Servlet 和 JavaBean 可利用数据库的值动态地替换变量。该功能是 JSP 的一个 IBM 扩展,它使引用变量数据变得十分容易。该语法只能用于 JSP 文件中。HTML 模板语法包括:
 基本 HTML 模板语法;
 替代 HTML 模板语法;
 标记。
  这些标记通过 HTML 编写工具被设计成传递交互操作的标记。每一个标记有一个相应的结束标记。每一个标记是分大小写的,它们的一些属性也是分大小写的。IBM WebSphere Studio 使开发 JSP 文件以包含 HTML 模板语法变得更为容易。
  (1) 基本 HTML 模板语法
   标记是用于指定变量字段的基本标记。一般的语法为:
     property=property_name(optional_index).subproperty_name(optional_index)
  default=value_when_null>
  

  其中的属性及其含义如下:
 requestparm:要在请求对象内进行访问的参数。该属性是分大小写的,并且不能与Bean 和property属性一起使用。
 Requestattr:要在请求对象内进行访问的属性。属性应使用 setAttribute 方法设置。该属性是分大小写的,并且不能与 Bean 和property属性一起使用。
 Bean:由 标记在 JSP 文件中说明的 JavaBean 名。请参阅访问 JavaBean 以获得 标记的解释。该属性的值是分大小写的。当指定了 Bean 属性,但未指定property属性时,在替换中将使用完整的 Bean 。例如,如果 Bean 是类型 String 且未指定属性,则将替代 string 的值。
 Property:访问替换的 Bean 的属性。该属性的值是分大小写的,并且是属性的独立场所名。该属性不能与 requestparm 属性一起使用。
 Default:当 Bean 属性值为空时,显示可选的字符串。如果字符串包含多个字,则该字符串必须包含在一对双引号中(例如 "HelpDesk number")。该属性的值是分大小写的。如果未指定值,则当属性值为空时,用空字符串替代。
  基本语法的示例如下:
  
  
  
  
  在大多数情况下,property属性的值就是属性名。但是,可以通过指定property属性的全格式来访问属性的某一属性(子属性)。这个全格式也提供选择项给您来指定索引属性的一个索引。该可选的索引可以是一个常数(例如 2)或如重复设置 HTML 标记中描述的索引。使用属性标记的全格式示例如下:
  
  
  
  (2) 替代 HTML 模板语法
  HTML 标准不允许在 HTML 标记中嵌入 HTML 标记。因而,就无法在另一个 HTML 标记中嵌入标记。作为代替,请使用 HTML 模板替代语法。要使用替代语法:
 请使用来包含 HTML 标记,在该标记中指出替代内容。
 指定 Bean 和property属性:
 要指定 Bean 和属性特性,请使用下列格式:$(bean=b property=p default=d),其中 b、p 和 d
作为描述基本语法的值。
 要指定 requestparm 属性,请使用下列格式:$(requestparm=r default=d),其中 r 和 d 作为
描述基本语法的值。
 要指定 requestattr 属性,请使用下列格式:$(requestattr=r default=d),其中 r 和 d 作为描述
基本语法的值。
  替代 HTML 模板语法的示例如下:
  
  
  

  
    &city$(requestparm=city default="Research Triangle Park")&email=
  $(bean=userInfo property=email)>Show map of city

  

  (3) 标记
  标记的语法为:
  
  

  其中:
 index:是用于标识该重复数据块的一个可选的名称。该值是分大小写的。
 Start:是用于该重复数据块的一个可选的开始索引值。缺省值为 0 。
 End:是用于该重复数据块的一个可选的结束索引值。最大值是 2,147,483,647。如果结束属性的值小于开始属性的值,则忽略结束属性。
  下面的示例 1、2 和 3 显示了如何使用标记。如果所有的索引属性拥有 300 个或更少的元素,则这些示例将产生相同的输出。如果拥有的元素多于 300 个,示例 1 和示例 2 将显示所有的元素,而示例 3 将只显示前 300 个元素。示例 1 用缺省开始和结束索引显示了隐式索引:使用最小索引属性数的 bean 限制了循环重复的次数。
  


  
  

  
  
  
  

  示例 2 显示了索引、开始索引和结束索引:
  
  
  

  
  
  
  
  
  

  示例 3 用隐式开始索引显示了显式索引和结束索引。虽然指定了索引属性,仍可对索引过的属性城市进行隐式索引,因为不需要(i)。
  
  
  

  
  
  
  
  
  

  可以嵌套数据块。独立索引每个数据块。该能力对交叉两个 bean 上的交错属性或含有子属性的属性非常有用。在示例中,将两个数据块嵌套,用以显示用户购物手推车上每一张压缩光盘上的歌曲列表。
  
  


  
  
  

  

  

  

  

  6.变量数据的 Java 表达式
  当处理 JSP 文件时,要指定分解一个 Java 语言表达式,请使用 JSP 表达式标记 <%= 和 %>。该表达式被评估和转换成一个字符串,并加以显示。原语类型,如 int 和 float 都自动转换成字符串表示法。在该示例中,foo 是在
阅读(747) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-02 17:11:32

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com