4课
JavaServer Pages技术

[<<返回] [目录] [下一个>>]

利用JavaServer PagesTM(JSP) 技术,我们可以将servlet代码段直接转化 成静态的HTML页面。当使用浏览器装载JSP页面时, servlet代码就会生效,应用 服务器创建、编辑、装载和运行一个背景servlet,来执行servlet代码段,并返 回一个HTML页面或打印一个XML报告。

本课与第3课“Cooperating Enterprise Bean”不同的是, 本课中使用的是JSP页面而不是 BonusServlet

创建JSP页面

JSP页面看起来像HTML页面,servlet代码段嵌在各种类型的前导(<%) 和结尾( %>)JSP 标签之间。没有HttpServlet 方法,如init, doGetdoPost。相反地,本应出现在这些方法中的代码直接 嵌入在使用JSPscriplet标签的JSP页面中。

下面的JSP页面( Bonus.jsp)与 第三课中的BonusServlet是等同的。代码列表后是对JSP标签更详细的描述。 注意,JSP标签不能被嵌套。不能将JSP注释标签嵌套在JSPscriplet标签中。

<HTML>
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
  <%--  Comment
    Scriptlet for import statements
    <%@ indicates a jsp directive --%>
  <%@ page import="javax.naming.*" %>
  <%@ page import="javax.rmi.PortableRemoteObject" %>
  <%@ page import="Beans.*" %>
  <%-- Comment
    Scriptlet to get the parameters, 
    convert string to Integer to int for bonus
    calculation, and declare/initialize bonus
    variable. <% indicates a jsp scriptlet  --%>
  <%! String strMult, socsec; %>
  <%! Integer integerMult; %>
  <%! int multiplier; %>
  <%! double bonus; %>
<%
  strMult = request.getParameter("MULTIPLIER");
  socsec = request.getParameter("SOCSEC");
  integerMult = new Integer(strMult);
  multiplier = integerMult.intValue();
  bonus = 100.00;
%>
  <%-- Comment
    Scriptlet to look up session Bean --%>
<%
  InitialContext ctx = new InitialContext();
  Object objref = ctx.lookup("calcs");
  CalcHome homecalc = (CalcHome)
                    PortableRemoteObject.narrow(
                    objref, CalcHome.class);
%>
  <%-- Comment
    Scriptlet to create session Bean, 
    call calcBonus method, and retrieve a database
    record by the social security number 
   (primary key) --%>
<%
  try {
    Calc theCalculation = homecalc.create();
    Bonus theBonus = theCalculation.calcBonus(
                                  multiplier, 
                                  bonus, 
                                  socsec);
    Bonus record = theCalculation.getRecord(socsec);
%>
  <%-- Comment
    HTML code to display retrieved data
    on returned HTML page.  --%>
    <H1>Bonus Calculation</H1>
    Social security number retrieved: 
                    <%= record.getSocSec() %>
    <P>
    Bonus Amount retrieved: <%= record.getBonus() %>
    <P>
  <%-- Comment
    Scriptlet to catch DuplicateKeyException --%>
<%
  } catch (javax.ejb.DuplicateKeyException e) {
    String message = e.getMessage();
%>
  <%-- Comment
    HTML code to display original data passed to JSP
    on returned HTML page --%>
    Social security number passed in: <%= socsec %>
    <P>
    Multiplier passed in: <%= strMult %>
    <P>
    Error: <%= message %>
  <%-- Comment
    Scriptlet to close try and catch block --%>
<%
  }
%>
  <%--  Comment
    HTML code to close HTML body and page --%>
</BODY>
</HTML>

注释

Bonus.jsp的前7行完全是HTML,后面是JSP注释。 JSP注释和HTML注释类似,不同的是,这些注释是以<%-- 而不是<!--开头的。你可以在JSP文件中使用JSP注 释或HTML注释。HTML注释被发送到客户的web浏览器上,显示为部分的HTML页面, JSP注释被抽除,不会出现在生成的HTML页面中。

注: 如果在JSP注释中加一个冒 号,如<%--Comment: Scriptlet for import statements---, 会发生运行上的错误,将冒号去掉,错误就不会发生。

<HTML>
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
<%-- Comment
Scriptlet for import statements
<%@ indicates a jsp directive --%>

指令

JSP指令是JSP页面转换成servlet时由JSP引擎处理的指令。 本实例中所采用 的指令指示JSP引擎包含某些数据包和类。指令被<%@%>指令标签括起。

<%@ page import="javax.naming.*" %>
<%@ page import="javax.rmi.PortableRemoteObject" %>
<%@ page import="Beans.*" %>

声明

利用JSP声明可以以scriplet语言的形式设置变量,以便以后使用。在使用这 些变量的同时,还可以在表达式和scriplet中对变量进行声明。 其范围是整个 JSP页面,因此,没有实例变量的概念。也就是说,你无须声明在一个以上的表达 或scriplet中使用的实例变量。声明通常被<%!%>声明标签括起。可以有多重声明。例如, <%! 双bonus;字符串文本;%>

  <%! String strMult, socsec; %>
  <%! Integer integerMult; %>
  <%! int multiplier; %>
  <%! double bonus; %>

Scriptlets

JSPscriplet可以让你将Java代码段嵌入到JSP页面中。这个嵌入的代码直接被 插入到生成的servlet中。 这个scriplet使用以上提到的指令中声明的变量。 scriplet被<%%> scriplet标签括起。

<<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>

预定义变量

一个scriplet可以使用以下预先定义的变量: session, request, response, outin。 本实例中使用 的是request预定义变量,它是一个HttpServletRequest 对象。类似的, response 是一个 HttpServletResponse对象,out 是一个PrintWriter对象, in是一个BufferedReader 对象。

预定义变量在scriplet中的使用方式同它们在servlet中的使用方式相同,不 同的是,你不用对它们进行声明。

<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>

表达式

JSP表达式可以让你动态地检索和计算直接被插入到JSP页面中的值。 在这个 范例中,表达式从Bonus entity bean中检索到社会安 全号码,并将其放到JSP页面上。

<H1>Bonus Calculation</H1>
Social security number retrieved:
<%= record.getSocSec() %>
<P>
Bonus Amount retrieved: <%= record.getBonus() %>
<P>

JSP-Specific标签

JavaServer Pages 1.1 规范中对JSP-Specific标签进行了定义, JSP-Specific标签可以让你扩展JSP的新特性,为那些需要查看并修改JSP页面的 可视化设计人员省去了许多复杂的工作。本课中的JSP范例没有使用这些 JSP-SPECIFIC标签,但在下一课中你会看到关于这些标签的范例。1.1规程范对 JSP-Specific标签的定义如下:

jsp:forwardjsp:include 指示JSP引擎从当前的页面切换到另一个JSP页面。

jsp:useBean , jsp:setPropertyjsp:getProperty 允许 你在一个JSP页面中进行嵌入或使用JavaBean技术。

jsp:plugin可自动下载合适的Java插件到客户端, 以便用正确的Java平台来执行applet。

修改bonus.html

bonus.html唯一需要做的修改是使HTML表单调用 Bonus.jsp的参数是ACTION 而不是BonusServlet

<HTML>
<BODY BGCOLOR = "WHITE">
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<FORM METHOD="GET" ACTION="Bonus.jsp">
<P>
Enter social security Number:
<P>
<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>
<P>
Enter Multiplier:
<P>
<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>
<P>
<INPUT TYPE="SUBMIT" VALUE="Submit">
<INPUT TYPE="RESET">
</FORM>
</FORM>
</BLOCKQUOTE>
</BODY>
</HTML>

启动平台和工具

在运行这个实例之前,需要启动J2EE服务器、部署工具和Cloudscape数据库。 在不同的窗口中,键入以下命令:

j2ee -verbose
deploytool
cloudscape -start

如果该办法不成功,则从J2EE目录中键入。

Unix

j2sdkee1.2.1/bin/j2ee -verbose
j2sdkee1.2.1/bin/deploytool
j2sdkee1.2.1/bin/cloudscape -start

Windows

j2sdkee1.2.1\bin\j2ee -verbose
j2sdkee1.2.1\bin\deploytool
j2sdkee1.2.1\bin\cloudscape -start

移除WAR文件

由于JSP页面被添加到Web组件中,所以必须将前一课的WAR文件删除,用JSP页 面创建一个新的WAR文件。

本地应用:

  • 点击2BeansApp图标,以便能够看到它的应用组 件。
  • 选择BonusWar
  • 从编辑菜单中选择“删除”。

创建新WAR文件

文件菜单:

  • 选择“新Web 组件”

介绍 :

  • 阅读后点击“下一步”。

WAR文件一般属性:

: 在部署 工具中出现一个小错误。确保你首先添加Bonus.jsp然 后才是bonus.html。 如果你先添加bonus.html, 部署工具就会将bonus.html放置到Bonus.jsp 的位置,将Bonus.jsp放到bonus.html 应该放的位置。如果发生这种现象,你可以手动地将它们复制到其应该所在的正 确位置。也就是部署时正确的位置::
~/j2sdkee1.2/public_html/JSPRoot/bonus.html
~/j2sdkee1.2/public_html/JSPRoot/WEB-INF/classes/Bonus.jsp
  • 指定BonusWar为显示名称。
  • 点击“添加”。
  • 进入ClientCode目录,添加Bonus.jsp
  • 点击“下一步”。
  • 进入ClientCode目录,添加bonus.html
  • 点击“完成”。

WAR文件一般属性:

  • 点击“下一步”。

选择组件类型:

  • 选定Describe a JSP,点击“下一步”。

组件一般属性:

  • 使Bonus.jsp为JSP文件名。
  • 显示名称为BonusJSP
  • 点击“完成”。

检查窗口:

  • 选择Web Context。
  • 指定JSPRoot

验证和部署J2EE应用

在部署应用之前最好能够运行检验器。验证程序将挑出应用组件中的错误,如 编译器未曾捕捉到的丢失的enterprise bean方法。

验证:

  • 选定2BeansApp,从“工具”菜单中选择“验证 器”。
  • 在弹出的对话框中,点击“OK”。 窗口将通知 你测试成功。
  • 关闭验证程序窗口,准备部署应用。

部署:

  • 从“工具”菜单中选择“部署应用”。 一个“部署BonusApp ”对话框会弹出。
  • 验证“目标服务器”选项或者是本地主机或是运行J2EE服务器的主机的名称
注: 不要选择“Return Client Jar”选项。只有在为客户程序部署独立的应用时才选择这个选项。本实例使用了 一个servlet和HTML页面,因此,不应该选择这个选项。若选择这个选项,会生成 一个带有独立应用所需部署信息的JAR文件。
  • 点击“下一步”。 确定CalcBean的JNDI名称 为calcsBonusBean的J NDI名称为bonus。 如果不是,则需要将JNDI名称键 入,然后按下回车键。
  • 点击“下一步”。 确定“上下文根目录”名称显示为JSPRoot。 如果不是,则需要将其键入,然后按下回车键。
  • 点击“下一步”。
  • 点击“完成”开始部署。此时,会弹出一个显示部署操作状态的对话框。
  • 完成后,左侧的三个状态条都将阴影化,如 图16所示。点击“OK”。

 

Deployment Progress
图16 : 部署应用

运行J2EE应用

web 服务器的运行端口默认为8000。 若要打开bonus.html 页面,可进入以下地址, http://localhost:8000/BonusRoot/bonus.html,这是部署工具放置HTML 文件的位置。

: 部署工具将Bonus.jsp 放在public_html/JSPRoot目录下,将bonus.html 放在public_html/JSPRoot/WEB-INF/classes目录下, 这种放置与他们所属的目录正好相反。 需要把他们手动复制到正确的位置,也就 是:public_html/JSPRoot/bonus.htmlpublic_html/JSPRoot/WEB-INF/classes/Bonus.jsp.
  • 填入社会安全号码和乘数。
  • 点击“提交”按钮。Bonus.jsp会对传入的数据 进行处理,并返回一个带bonus计算值的HTML页面。
Bonus Calculation

Social Security number retrieved: 777777777
Bonus Amount Retrieved: 200.0

如果两次提交的社会安全号码相同,会出现类似于以下的信息:

Bonus Calculation

Soc Sec passed in: 777777777
Multiplier passed in: 2
Error: Duplicate primary key

多信息

另一种使用JavaServer页面技术的方法是与JavaBeansTM技术共同使用,此时, JSP页面会为用户显示一个格式,并调用JavaBean处理被输入到表格中的数据。可 以进入以下网址查看范例: java.sun.com/j2ee/j2sdkee/techdocs/guides/ejb/html/Client.fm.html"

进入下面的网址,你还会看到一篇有关JavaServer页面和JavaBeans技术详细 说明的文章: Building Your own JSP Components (创建自定义的JSP组件)

[TOP]

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null