· JSPBeans4:JavaServer Pages with Beans
在这个练习里,你将更新一个 JavaBean ,用它来在两个 servlets 之间通信,其中第二个 servlet 是从一个 JavaServer Page 生成的。 JSP 的目的是显示客户选择的可能要购买的玩具。
许多网页有复杂的布置。这很难在一个 servlet 里用编程的方法表达。这是服务器端脚本技术的主要理由。 JSP 编程模型的力量在于隔离可重用的组件 (JavaBeans) 里的应用代码,而不污染演示 HTML 模板。
你将把一个 JavaBean 的一些状态扩展为属性,以便使用 HTML 模板语法的 JSP 容易地使用这个 JavaBean 。你还将用 JSP 标记和 JSP HTML 模板标记 (insert 、 repeat) 来扩充 HTML 文件。
第一部分:更新 JKToys JavaBean
1. 在这个练习里我们将在 com.ibm.waslab.common 包里工作。我们从在类 JKToyOrder 上打开一个类浏览器开始。选择这个类的 BeanInfo view 。这个类是用来维护当前选择的要定购的玩具的。 It is populated by the TotalPurchaseServlet 。我们会让一个 JSP 表示“ order review ”信息,而不是用现在输出 HTML 和动态内容的 displaySelections 方法。
为了做到这个,我们需要一个新的方法来以 ”JavaBean” 风格的方式循环过一个选择的玩具。这需要把列表作为一个 Indexed Property 。
创建一个新的 IndexedProperty,orderedToy ,在类 JKToyOrder 里。为了做到这个,单击 Property Wizard 按钮。在结果对话框 check readable,writeable,indexed 。提供 Property 的名字为 orderedToy ,选择 Property 的类型为 com.ibm.waslab.common.Toy( 这个将被向导转化为 Toy[]) 。对我们的目的而言, uncheck 规定 property 为 bound 的 box 。按 Finish.
2. 返回到类的 Methods 或 Hierarchy 视图,来实现刚才生成的 4 个方法。如果你看类定义,你会发现一个新的实例变量名字叫 fieldOrderedToy ,类型为 Toy[] 。这个是 Bean Property wizard 产生的。这个实例变量并不需要,因为玩具已经存在一个实例变量叫 orderedToys, 类型为 java.util.Stack 。这个实例变量已经在类的其它地方被使用了。
删除变量 fieldOrderedToy ,保存类。你将会在步骤 1 里 Property wizard 产生的三或四个附属方法里得到错误标记。
3. 编辑四个附属方法的每一个。使用 java.util.Stack 和 java.util.Vector 的正确的方法 ( 例如 CopyInto,elementAt,setElementAt,....) 来实现这个四个方法的每一个。 ( 需要帮助的话,看这个练习的末尾的答案。 )
应该注意到, setOrderedToy(int Toy) 和 getOrderedToy(int) 方法也许会抛一个 ArrayOutOfBoundsException 异常。这个异常会触发 JSP 里 <REPEAT> 标记里循环的结束。
4. 验证类 JKToyOrder 实现 java.io.Serializable 。
5. 最后,输出 com.ibm.waslab.common 包到以下路径:
[x:]\IBMVJava\ide\project_resources\IBM WebSphere Test Environment\servlets
[x:]\WebSphere\AppServer\servlets( 只有在要在 VAJava 外面运行时才需要 )
第二部分:调用 JSP
1. 打开 com.ibm.waslab.servlet2.TotalPurchaseServlet 。编辑 doPost() 方法。在方法的底部 ( 在另一个块里 ) , displaySelections 被调用。这个需要被对 JSP 的调用掉换。第一步是把 JKToyOrder 对象放进 HttpSession 对象或 HttpServletRequest 对象。
为了把定单对象加进会话,增加以下的代码:
session.putValue(“OrderedToys”,toysToBuy);
注意,定单从会话里取得的键是 ”OrderedToys” 。
可选的, JavaBean 可以被放在请求范围 ( 而不是会话 ), 把 setAttribute 方法用在 com.sum.serve.http.HttpServiceRequest 对象。
2. 下一步是调用 callPage() 方法来调用 JSP 。 CallPage 在回应对象里被调用。 callPage 是一个 com.sun.server.http.HttpServiceResponse 类上的方法。你必须先把 res 造型为类型 com.sun.server.http.HttpServiceResponse 。以下的代码将足够了 ( 如果你加了一个 import 语句到类定义里面 ) 。
HttpServiceResponse response=(HttpServiceResponse) res;
response.callPage(“/JKToys/html/jktoys_display_order.jsp”,req);
第三部分: Populating the JSP
1. 最后一步是创建 JSP 文件。文件 jktoys_display_order_start.jsp( 在 x:\www\html\JKToys\html 目录里找到 ) 包含从 displaySelection 方法里提取的 HTML (从 com.ibm.waslab.servlet2.TotalPurchaseServlet )。你将需要为 ”OrderedToys”Bean 增加一个 BEAN 标记。这个可以被放在文件的任何地方(在 Bean 被引用以前)。
2. 你还将要把 TABLE 的 <tr> 块包进一个 <REPEAT> 块。用 insert 标记和 JSP 表达式把动态内容插入 HTML 表格。
注意:你还将要增加一个 scriptlet 来在 REPEAT 块的开头测试一个 ArrayOutOfBoundsException( 在任何静态内容被推到回应流里去以前 ) 。也要注意, getPriceAsString() 方法没有同一个 Property( 在 JkToyOrder 类或 Toy 类 ) 联系起来。 <INSERT> 标记不能用来显示这个信息,除非方法在每一个各自的类里被 prompted 为一个 Property 。如果你不想 ”prompt “这个属性的话,这个方法可以用 scriptlet 来调用。
或者,你可以只用 scriptlet 和 JSP 表达式而不是 <REPEAT> 和 <REPEAT> 标记。
3. 保存更新过的 JSP 文件为 jktoys_display_order.jsp 。 ( 注意新的文件名!!! ) 测试正确的操作。
你在这个练习里作了什么
在这个练习里,你作了一个典型的 Servlet->Bean->JSP “控制”流。注意, JSP 文件可以被 HTML WYSIWYG 编辑器维护和编辑(同在 Java 方法里管理它不一样)。
答案:
public Toy getOrderedToy(int index) throws
ArrayIndexOutOfBoundsException{
return (Toy)orderedToys.elementAt(index);
}
public com.ibm.waslab.common.Toy[] getOrderedToy(){
com.ibm.waslab.commom.Toy[] toys=new
com.ibm.waslab.common.Toy{orderedToys.size()};
orderedToys.copyInto(toys);
return toys;
}
public void setOrderedToy(int index,Toy orderedToy)throws
ArrayIndexOutOfBoundsException{
orderedToys.setElementAt(orderedToy,index);
}
public void setOrderedToy(com.ibm.waslab.common.Toy[] orderedToy)
{
orderedToys=new java.util.Stack();
int max=orderrdToy.length;
for (int i=0;i<max;i++)
orderedToys.addElement(orderedToy[i]);
}
JSP 的答案参见: x:\www\html\JKToys\jspSolutions\jktoys_display_order_soln.jsp 。
· Studio5:WebSphere Studio Servlet Wizards在这个练习里,你将使用 IBM WebSphere Studio 的一个向导来创建一个客户管理界面。产生的 servlet 和 JSP 页面是让站点管理员能查看数据库里所有 JKToys 客户的记录。按照这个这个练习,你将能用 Studio servlet wizard 来建立更复杂的 servlets 和 JSP 的骨架。
对所有的练习,确信你用 USEID 为 id 和 PASSWORD 为口令登录进去的。
1. 你将用 IBM WebSphere Studio,version 1.0 (从此以后用 Studio 指代),建立一个简单的管理应用。选择 Start,Programs,IBM WebSphere,Studio 1.0,WebSphere Studio ,启动 Studio 。这将带来 Developer Workbench,Studio 的主窗口。 Workbench 给出一个基于项目的网站视图。从 File 菜单选择 New Project 选项创建一个新的项目。在 Name 域,输入 JKToys, 按“确定”按钮。
2. 建立管理应用的第一步是建立一个 SQL 查询对象。为了做到这个,你将利用 Workbench 提供的 SQL 向导。从 Tools 菜单选择 SQL Wizard... 项目。
3. 向导显示为一个对话框,有一个 ”tabbed” 象 notebook 的外观。当它最初弹出时,对话框显示 Welcome 页面,问将要产生的 SQL 命令文件的名字。输入 ViewAllCustomer 到 name 输入域,按 Next 按钮。
4. 在下一页 (Logon) ,输入 jdbc:db2:JKToys 到数据库 URL 输入域; USERID 到用户输入域; PASSWORD 到口令输入域。在 Driver 输入域选择 IBM DB2 UDB local 。输入这些值以后,按 Connect 按钮。这会连接数据库,取得 JKToys 数据库的元数据。
5. 确信 Select Statement 类型被 checked 。还 check USERID.CUSTOMER 表。按 Next 按钮。
6. 因为只有一个表, Join 是不需要的。按 Next 按钮。
7. 对 Columns 入口,先按 Select all 按钮,然后是 Add 按钮。然后按 Next.
8. 你在建立的查询要从数据库取得所有的行。所以,你不要 where 子句。按 Next 按钮。
9. 按 Finish 来完成 SQL 语句。
10. 接着我们将运行 Data Access Servlet Wizard 。为了启动向导,从 Tools 菜单选择 Studio Wizard... 项目。 Studio Wizard 是一个同 SQL wizard 相似的对话框。
11. 在 Welcome tab ,选择 Data Access Servlet ,按 Next 按钮。
12. 在“第二个” Welcome tab ,输入 ViewCustomer 到 Name 输入域,按 Next 。
13. 在 SQL 语句页面,“ select from an active project” 选项应该被选中, ViewAllCustomers.sql 应该被选中。按 Next 。
14. 在输入页,确信 ”Yes please” 被选中。按 Next 。
15. 对 InputLayout, 输入:为 Page title 输入 View All Customers; 清除 User prompt 的输入; Check Submit button check box, 把文字改为 View All Customers;uncheck Reset button 输入。按 Next 。
16. 对输出页面接受缺省值(所有列)。按 Next 。
17. 在 Heading 输入域增加文字 JKToys Customers. 然后选择输出字段 ( 每次一个 ) ,用上下箭头移动字段,使得它们可以以以下的顺序出现: LNAME , FNAME , AGE , ADDR , CITY , STATE , ZIP , CUSTNO 。按 Next 。
18. 选择不要创建一个 custom Error Page 。按 Next 。
19. 按 Finish 来生成 Servlet,DataBean,Output JSP 和 Input HTML 文件。一旦确认对话框消失,你应该看到以下文件在 Workbench 在 JKToys 项目里: ViewAllCustomers.sql;ViewCustomersOutputPage.jsp;ViewcustomersInputPage.html 。如果你看 classes/JKToys 文件夹,你还会发现: ViewCustomersServlet.java;ViewCustomersServlet.servlet;ViewCustomersServletBean.java;
ViewCustomersServlet.class;ViewCustomersServletBean.class 。
20. 在发表这个应用之前,编辑 ViewCustomersServlet.servlet ,在 Workbench 里双击这个文件。这个文件是 XML 的 servlet 配置文件。我们要改变 ”default-page” 的路径。在第 5 行,在 <URL> 后面,插入 ”/JKToys/html” 。缺省页面的路径现在应该是 /JKToys/html/ViewCustomersOutputPage.jsp 。
21. 下一步是发表到 JKToys 站点。为了作这个,先创建一个“ Publishing Server” 。从 Options 菜单里选择 Publishing servers... 选项。
22. 按 Add 按钮。在 New Publishing Server Settings 对话框,输入 JKToys 到 Name 输入域。 Check Local radio button 。然后,选择 html 目标,按“浏览”按扭。在文件浏览器里,定位 / 打开 x:\www\html\JKToys\html(x 是 IBM HTTP Server 文件根所在的驱动器字母 ) 。然后,选择 html 目标,按“浏览”按扭。在文件浏览器里,定位 / 打开 x:\WebSphere\Appserver\servlets 。最后,按“确定”按钮。
23. 为了发表,在 Workbench 左手的树视图里选择 JKToys 站点。从 File 菜单选择 Publish 选项。当 Select Publishing Server 对话框弹出来,选择 JKToys 作为服务器;按 Continue 按钮。然后按 Publish 按钮。最后按“确定”让对话框消失。
24. 为了测试这个应用,我们将在 VA Java 外面运行,使用 IBM HTTP Server 。确信 SERunner 被停止。然后启动 IBM HTTP Server 。
25. 在一个浏览器,打开 URL http://127.0.0.1/JKToys/html/ViewCustomerInputPage.html 。按 View All Customers 按钮。这将调用 servlet ,它将创建一个访问 bean 的实例, ViewCustomersServletBean ,然后调用执行 Bean 的方法来发布 SQL 查询。 Bean 被放在请求范围内,键是 viewCustomersServletBean 。 Servlet 对 ViewCustomersOutputPage.jsp 执行一个 callPage ,在一个 HTML 表格里显示 SQL 查询的输出。
26. 最后的步骤是看产生的代码。尤其是,看输出 JSP 和 ServletBean.
IBM WebSphere Studio 里的两个不同的向导被用来建立小的网络应用来查询客户数据库,返回内容作为动态内容。有许多不同的工具可用来执行业务数据的 Web 网关。而向导能有效地建立 servlet 、 ”servlet bean” 、 JSP ,从而支持 JSP 编程。
(未完待续)








