本章将演示如何开发、部署和运行由主流转换JavaBeans 组件和用JavaServer Pageh(JSP)创建的Web页面客户端组成的简单Web应用。该应用首先部署并运行在Apache Software Foundation(www.apache.org)开发出来的Java Servlet和JSP容器,即Tomcat上,且与Java Web Services Developer Pack(Java WSDP)包含在一起。本章作为引言,介绍了如何利用Tomcat部署Web服务和Web应用。本章中的材料为该教程中其他章节提供了基础。
设置
注意:在开始开发示例应用前,将先阅读关于该教程中的说明,然后继续本节的学习。
获取示例代码
该示例的源代码可以在<JWSDP_HOME>/docs/tutorial/examples/gs/,即解压该教程的捆绑包时所创建的一个目录中找到。如果想在线阅读该教程,可以从下面的地址下载教程捆绑包:
示例代码的布局
在该示例应用中,源代码目录按照“实现Web服务程序设计的最佳做法”来组织,这些最佳做法的更多细节描述在<JWSDP_HOME>/docs/tomcat/appdev/deployment.html文件中。基本上而言,这个文档说明了在创建Web应用时检查它的运行时结构很有用。Web应用被定义为标准布局中目录和文件的分层结构。这样的分层结构可以通过它的未包装格式访问,其中在这种格式中每一个目录和文件分别位于单独的文件系统中,或者以Web应用档案(或WAR)文件这样的包装格式存在。前一种格式在开发期间更有用,而后者通常用在分发应用以便安装时。
为了便于创建所需格式的WAR文件,最好布置一下Tomcat在执行与WAR格式本身所需结构相同的应用时所使用的文件。在该示例应用中,<JWSDP_HOME>/docs/tutorial/examples/gs/是该应用源代码的根目录。该应用由如下文件组成,其中这些文件位于/gs目录或者/gs的子目录中。
-
/src/converterApp/ConverterBean.java——包含
yenAmount
和euroAmount属性的get和set方法的
JavaBeans组件,其中这两个属性用来将美元转换为日元并将日元转换到欧元。 -
/web/index/jsp——Web客户端,它是一个接受将被转换的值的JavaServlet页面、提交该值的按钮,以及该转换的结果。
Tomcat应用开发指南中一个关键的建议是从包含可部署应用的目录分层中分离出包含源代码的目录分层。进行这种分离有以下优点:
如 创建Ant的生成和部署文件一节中所述,Ant开发工具使得这种目录分层的创建和处理变得相对简单。
该文档的其余部分演示了如何创建、构建、部署和运行该示例应用。
设置路径变量
在PATH环境变量的前面添加Java WSDP、Java2软件开发工具包和标准版(J2SE,SDK)的bin目录,以便Tomcat的Java WSDP启动脚本覆盖其他的安装,这一点非常重要。
另外,大多数例子是和Ant 1.5.1版的配置文件一起分发的,其中Ant是包含在Java WSDP中的一个可移植的生成工具。这个与Java WSDP一起发布的Ant的版本设置了jwsdp.home环境变量,这是示例生成文件所必须的。为保证能使用该Ant版本,必须在
PATH前面添加<JWSDP_HOME>/jakarta-ant-1.5.1/bin
。
创建生成属性文件
为了调用更多的Ant任务,需要在主目录内布置命名为build.properties文件。在Solaris操作系统上,主目录的格式通常为/home/your_login_name。在Windows操作环境中(例如Windows 2000)主目录一般是c:\Document and Settings\yourProfile。
Build.properties文件包含的纯文本格式的用户名和密码与安装期间设置的用户名和密码匹配。在Java WSDP的安装期间输入的用户名和密码存储在<JWSDP_HOME>/conf/tomcat-users.xml中。
出于安全目的,Tomcat Manager在同意你访问服务器之前,首先要验证你(定义在build.properties文件中)是否有权安装和重载这些应用(定义在tomcat-user.xml中)。
如果还没有在主目录中创建build.properties文件,那么可以这么做。文件将如下所示:
username=your_username
注意:出于安全目的,需要创建只有你自己才能读取的build.properties文件。
安装程序创建的Tomcat-users.xml文件如下所示:
<?xml version='1.0'?>
<tomcat-users>
<role rolename="admin"/>
<role rolename="manager"/>
<role rolename="provider"/>
<user username="your_username
" password="your_password
"
roles="admin,manager,provider"/>
既然已经为运行该示例应用而下载了应用程序并得到了环境设置,本小节将简单地介绍运行该应用程序所需的步骤。每步讨论的详细细节可在相关页面中找到。
1.遵循设置中的步骤。
2.改变该应用的目录<JWSDP_HOME>/docstutorial/examples/gs(见创建Getting Started应用)。
3.通过在终端提示窗口中输入下列命令编译源文件(见使用Ant构建Getting Started应用):
编译错误一节中列出了其中可能出现的编译错误。
4.通过在终端提示窗口中输入下列命令启动Tomcat(见启动Tomcat )
<JWSDP_HOME>/bin/startup.sh (Unix platform)
<JWSDP_HOME>\bin\startup (Microsoft Windows)
5.通过在终端提示窗口中输入下列命令来利用Ant部署Web应用(见使用Ant安装应用程序)
ant install
部署中出现的错误见部署错误。
6.启动Web浏览器,输入下列URL运行示例应用程序(见运行Gerzring Started应用程序):
http://localhost:8080/GSApp
7.通过在终端提示窗口中输入下列命令关闭Tocmat:(见关闭Tomcat)
<JWSDP_HOME>/bin/shutdown.sh (Unix platform)
<JWSDP_HOME>\bin\shutdown (Microsoft Windows)
创建Getting Started应用
示例应用程序包含ConverterBean类、Web组件、用来构建并运行应用程序的文件,以及部署描述符。对于本示例,我们将创建一个命名为gs/的顶级项目源目录。该示例应用程序中的所有文件都创建自这个根目录。
ConverterBean组件
该示例程序中ConverterBean组件通常与JSP页面结合起来使用,其结果应用是一个能够将美元转换成日元并将日元转换成欧
元的表单。ConverterBean组件的源代码在<JWSDP_HOME>/doca/tutorial/example/gs/src/converterApp/目录内。
ConverterBean组件编码
该示例中的ConverterBean组件包含两个属性,yenAmount和euroAmount,以及这些属性的set和get方法。ConverterBean组件的源代码如下:
//ConverterBean.java
package converterApp;
import java.math.*;
public class ConverterBean{
private BigDecimal yenRate;
private BigDecimal euroRate;
private BigDecimal yenAmount;
private BigDecimal euroAmount;
/** Creates new ConverterBean */
public ConverterBean() {
yenRate = new BigDecimal ("138.78");
euroRate = new BigDecimal (".0084");
yenAmount = new BigDecimal("0.0");
euroAmount = new BigDecimal("0.0");
}
public BigDecimal getYenAmount () {
return yenAmount;
}
public void setYenAmount(BigDecimal amount) {
yenAmount = amount.multiply(yenRate);
yenAmount = yenAmount.setScale(2,BigDecimal.ROUND_UP);
}
public BigDecimal getEuroAmount () {
return euroAmount;
}
public void setEuroAmount (BigDecimal amount) {
euroAmount = amount.multiply(euroRate);
euroAmount =
euroAmount.setScale(2,BigDecimal.ROUND_UP);
}
Web客户端
Web客户端包含在JSP页面<JWSDP_HOME>/docs/tutorial/examples/gs/web/index.jap中。JSP页面是包含静态和动态内容的基于文本的文档。静态内容能表示成基于任何文本格式的模板数据,比如HTML、WML、或者XML格式。JSP元素构成了动态内容。
Web客户端编码
JSP页面index.jsp用来创建表单,该表单在应用的客户端运行时出现在Web浏览器中。JSP页面是静态HTML标记和JSP元素的典型混合体。如果开发过Web页面,应该熟悉创建表单<form>和菜单<select>的HTML文档结构声明(<head>,<body>,等等)和HTML声明。示例中的这些突出行包含了下列JSP结构类型:
· 指示(<%@page ... %>
)ConverterBean类中的导入类,并且设置页面返回的内容类型。
· 这个jsp:usebean元素声明页面将使用存储在指定作用域内并可从该作用域访问的一个bean。默认的作用域是页面,因此
我们就不明确在示例中设置它。
· jsp:setProperty元素用来设置JSP页面中的JavaBean组件属性。
· Jsp.getProperty元素用来检索JSP页面中的JavaBean组件。
· Scriplets(<%...%
>)检索amount请求参数的值,将其转换成BigDecimal,并且将该值转换为日元或者欧元。
· 表达式(<%= ...%
>)将amount的值插入到响应中。
<%-- index.jsp --%>
<%@ page import="converterApp.ConverterBean,java.math.*" %>
<%@ page contentType="text/html; charset=ISO-8859-5" %>
<html>
<head>
<title>Currency Conversion Application</title>
</head>
<body bgcolor="white">
"<jsp:useBean id="converter"
class="converterApp.ConverterBean"/>
<h1><FONT FACE="ARIAL" SIZE=12>Currency Conversion Application
</FONT></h1>
<hr>
<p><FONT FACE="ARIAL" SIZE=10>Enter an amount to convert:</p>
</FONT>
<form method="get">
<input type="text" name="amount" size="25">
<br>
<p>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>
<%
String amount = request.getParameter("amount");
if ( amount != null && amount.length() > 0 ) {
%>
<p><FONT FACE="ARIAL" SIZE=10><%= amount %> dollars are
<jsp:setProperty name="converter" property="yenAmount"
value="<%= new BigDecimal(amount)%>" />
<jsp:getProperty name="converter" property="yenAmount" /> Yen.
<p><%= amount %> Yen are
<jsp:setProperty name="converter" property="euroAmount"
value="<%= new BigDecimal(amount)%>" />
<jsp:getProperty name="converter" property="euroAmount" />
Euro. </FONT>
<%
}
%>
</body>
</html>