在前一步中通过包含另一个控件构建了封装一些有用逻辑的控件。在这一步,将工作转移到它自己的项目中以获得更大的可移植性。
可以看出,Java控件不一定要有自己的项目。对于很多目的来说,在控件容器的同一个项目中直接使用控件源文件完全没有问题。但是如果设计一个可能在很多个项目中都用得到的控件时呢?将一组源文件从一个项目拷贝到另一个项目中是很烦人的。与此相反,可以开发一个控件,使这个控件最终打包在一个JAR文件中,这样在移动控件时做到不混乱就容易得多。
在控件自己的项目中开发它就可以做到这一点。控件项目基本上与您一直使用的项目是一样的。不过,控件项目包括支持控件作为一个单独发布的包的文件和注释。甚至可以在一个项目中开发多个控件的源代码,并将它们打包成一个JAR文件发布。
现在将开始创建一个项目,可以在这个项目中继续开发控件的源文件。
创建POVerify的控件项目,执行以下操作:
1. 在Application选项卡上,右击FistJavaControl文件夹并选择New-->Project。
2. 在New Project对话框中,在左上方窗格中选择Business Logic。在右上方窗格中,选择Control Project。
3. 在Project Name域中,键入PurchasingControls。
4. 单击Create。
WebLogic Workshop添加PurchasingControls文件夹以包含新的项目。
5. 找到到包含控件源代码的poVerify文件夹。
6. 在Workspace选项卡上,单击poVerify文件夹,将它拖到purchasingControls文件夹中并释放到那里,如下图所示。
7. 打开刚移动的poVerify文件夹,然后在Design View中打开POVerify.jcs。
8. 确保单击控件的设计以选中它。
9. 在控件的设计选中时,找到Property Editor。
10. 在Property Editor中,找到jc-jar属性并如下图所示编辑它的属性:

这些属性提供了WebLogic Workshop用来向使用它的开发人员展示信息的所用的信息。标签对应于菜单和面板上的控件名;icon-16属性值是与IDE中控件相关的图像的相对路径;组名对应于列出控件的子菜单。最后,如果查看POVerify.jcs源代码,那么将会看到这些属性的值已经作为注释属性写入源代码中。
11. 右击purchasingControls文件夹,指向New,然后单击Folder。
12. 在Create New Folder对话框中,在提供的文本框中键入图像,然后单击OK。
13. 单击下面的图像,将它拖到WebLogic WOrkshop的Applicaiton选项卡中,并将它释放到刚创建的images文件夹中。
现在应用程序看起来像下面这样:

在打包及测试控件项目之前,应该对这个控件进行增强。用少量代码,就可以让使用这个控件的应用程序开发人员在插入采购订单信息之前,在数据库中检查可用的库存。为了使这项功能成为可选的,要让控件开放一个指定是否进行库存检查的属性。
首先定义这个属性。为此,要创建POVerify-tags.xml文件以包含控件属性的描述。
创建指定进行库存检查的属性,执行以下操作:
1. 在Application选项卡,在PurchasingControls文件夹下面,右击poVerify文件夹并选择New-->Choose File Type。
2. 在New File对话框中,在左边窗格中单击Business Logic。
3. 在右边窗格中单击XML File。
4. 在文件名文本框中键入POVerify-tags.xml。
5. 单击Create。
WebLogic Workshop会创建新的XML文件并打开它。它应该包含一个简单的XML声明和标记。
6. 编辑POVerify-tags.xml,用下面的XML代码替换里面所有内容。
Verifies purchase order information
Specifies whether to check inventory before updating the database
false
仔细看这段XML,不难看到属性的细节。元素有一个name属性,它指定这个属性叫什么名字(databaseActions)。元素描述这个属性。这个属性元素包含有关databaseActions属性的唯一属性checkInventory的信息。属性元素的"required"属性设置为false,表明使用这个控件的开发人员不需要真正设置这个控件就可以让它工作。因而,在这里必须包含元素,这样WebLogic Workshop才知道在开发人员没有明确设定时使用什么值。最后,与数据类型类似,元素指定属性的类型。当开发人员试图设置它的值时,WebLogic Workshop将用这个值做一些验证--对于布尔值,IDE将提供一个包括"true"和"false"选项的下拉列表。
7. 编辑完这个文件后,保存并关闭它。
要添加检测库存的代码,执行以下操作:
1. 打开ItemsDatabseControl.jcx文件的源代码。
2. 编辑源代码,紧挨着文件后面的最后一个花括号前面添加下面的粗体代码。
/**
* @jc:sql statement="SELECT quantityAvailable FROM items WHERE itemNumber = {itemNumber}"
*/
int checkInventory(int itemNumber);
新代码添加了一个检查库存并返回特定物品号的可用数量的方法。
3. 打开POVerify.jcs并查看其源代码。
4. 在文件上方,紧挨着POVerify类声明前面,编辑注释使它变为下面的形式 (添加粗体显示的行):
/**
* @jcs:jc-jar group-name="Purchasing Controls" icon-16="images/poVerify.gif" version="1.0" description="Submits a purchase order." label="POVerify"
* @jcs:control-tags file="POVerify-tags.xml"
*/
public class POVerify
这样会将刚定义的属性与控件本身连接在一起,从而WebLogic Workshop可以正确地显示属性。
5. 如下编辑addPurchaseOrder方法代码,使它可以将返回值更新为布尔值,并添加余下的粗体内容。
/**
* @common:operation
*/
public boolean addPurchaseOrder(String poNumberString, int customerID,
int itemNumber, int quantity)
{
int poNumber = formatPO(poNumberString);
/*
* Use the JbcContext object's getControlAttribute method to retrieve the
* checkInventory attribute's value set by the developer using the control.
*/
String checkInventoryString =
context.getControlAttribute("jc:databaseActions", "checkInventory");
boolean checkInventory = new Boolean(checkInventoryString).booleanValue();
/*
* If the checkInventory attribute has been set to true, then
* check inventory before performing the database inserts.
*/
if (checkInventory)
{
int quantityAvailable = itemsDB.checkInventory(itemNumber);
/*
* If the number of items available is equal to or greater than
* the number requested, then go ahead and update the database.
*/
if (quantityAvailable >= quantity) {
int customersInserted = itemsDB.insertItemCustomer(poNumber, customerID);
int itemsInserted = itemsDB.insertPOItem(poNumber, itemNumber, quantity);
return true;
}
else { return false; }
}
/*
* If the checkInventory attribute is set to false, then
* simply perform the database inserts and return true to indicate it has
* been done.
*/
else {
int customersInserted = itemsDB.insertItemCustomer(poNumber, customerID);
int itemsInserted = itemsDB.insertPOItem(poNumber, itemNumber, quantity);
return true;
}
}
注意:这些改变添加了获取使用控件的开发人员设置的checkInvertory属性值的代码。当然,在测试时您就是那位开发人员。这个属性值将设置为注释OrderEntry.jws中控件声明的标记。其他的代码还会利用这个属性值确定在插入数据之前是否检查库存。
控件已经在自己的项目中了,下面还需要创建它、将它打包、并使它在用来测试的web服务中可用。
创建及打包POVerify控件,执行以下操作:
· 右击PurchasingControls文件夹,再单击Build PurchasingControls。
编辑控件代码,将它打包为JAR文件,并将控件作为库,使应用程序中的其他代码可以使用它。在在FirstJavaControl应用程序中的Libraries文件夹中可以看到所得到的JAR文件。
新的JAR文件PurchasingControls.jar包含了WebLogic Workshop访问这个控件需要的所有信息。JAR文件是打包Java组件的标准方式。
最后,需要编辑用来测试的web服务,使它可以正确地测试更新的控件方法。
更新订单项Web服务,执行以下操作:
1. 打开OrderEntry.jws文件并编辑verifyPO方法源代码,使它成为下面的形式。注意只需要改变粗体的部分。
/**
* @common:operation
*/
public boolean verifyPO(String poNumberString, int customerID, int itemNumber,
int quantity)
{
return poVerifyControl.addPurchaseOrder(poNumberString, customerID,
itemNumber, quantity);
}
2. 单击Design View选项卡并选择POVerify控件,如下所示。
3. 查看控件的Property Editor,如下所示。
如果当前没有显示Property Editor,可以从View菜单中选择它或者按Alt+Enter显示它。选择了POVerify控件后,就可以看到通过创建控件属性定义文件POVerify-tags.xm所定义的属性。
4. 单击checkInventory属性的值下拉菜单,再单击true。

测试POVerify控件,执行以下操作:
1. 保证OrderEntry web服务在WebLogic Workshop中可见。
2. 单击Start按钮。
3. 出现Test View后,如下填写测试表单:

4. 单击verifyPO。
片刻之后,Test View会刷新显示测试的结果。本次测试的结果应该与上一次不同,因为它会发现,由上述物品号指定的物品的可用数量为3。由于将checkInventory属性设置为true,并且没有足够的可用数量,因此对这个请求的响应为"false"。
观察Test View,可以注意到它添加了一个checkInventory报告,如下所示:
还要注意缺少了在本教程上一步中见到的两个插入方法。最后,应该看到服务的响应为false。

如果要进行另一次测试,可以将控件的checkInventory属性改为false并用上面的同样参数重新进行测试。如果这样做的话,将会看到数据库成功地插入了,因为控件不再检查库存。
|