首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

DWR 简化 Ajax 的 portlet 间通信(1)

DWR 简化 Ajax 的 portlet 间通信(1)

Portlet是基于 Java 平台的 Web 门户应用程序。JSR-168 是开发 portlet 应用程序的 Java Community Process 标准,它描述了 portlet 生命周期管理、portlet 容器合约、打包、部署以及与门户有关的其他方面。
异步 JavaScript + XML(或者叫做 Ajax)是一项用于开发丰富、交互的 Web 应用程序的技术。Ajax 组合了 XML、HTML、DHTML、JavaScript 和 DOM。
Portlet 和 Ajax 看起来彼此之间是完美搭配,因为它们都侧重于用 Web 浏览器作为向用户呈现用户界面的工具。把这两者与 Java 技术组合在一起的简易方式就是使用 DWR 库。DWR 是 Apache 许可下的开放源码 Java 库,用于构建基于 Ajax 的 Web 应用程序。DWR 的基本目的是向开发人员隐藏 Ajax 的细节。您在服务器端使用普通 Java 对象(POJO),而 DWR 动态地生成 JavaScript 代理函数,所以使用 JavaScript 的客户端开发感觉起来就像直接调用 JavaBean。DWR 的主要组件是一个 Java servlet,处理从浏览器到服务器的调用。
本文使用 DWR、基于三个 portlet 来构建一个示例 Ajax 应用程序。我将介绍如何把 DWR 与 porlet 应用程序集成,但是我不想深入 DWR 的幕后工作细节;在这个项目的 Web 站点和 developerWorks 的页面上(请参阅 获得细节)可以找到关于这个库的更多信息。要构建我描述的应用程序,需要 1.3 或以后版本的 Java 平台和符合 JSR-168 规范的的门户环境。我用来开发和测试这个代码的环境包含 IBM Rational Application Developer V6.0、Apache Jetspeed 2.0 portal 和 Java 5.0。
在开始之前,还应当熟悉 portlet 和 Ajax 开发。如果愿意学习关于这些主题的更多内容,请参阅下面的 小节。可以从 小节下载示例应用程序的完整代码,包括 DWR。
构建示例的 portlet 间通信应用程序我们的示例应用程序有三个 portlet:Orders、Order Details 和 Customer Details;图 1 显示了示例应用程序:
图 1. 示例应用程序Orders portlet 有一个订单列表。当用户点击订单号时,该 portlet 把订单号发送给 Order Details 和 Customer Details portlet,这两者然后显示适当的订单和客户细节。
设置开发环境在可以开发 portlet 之前,需要设置开发环境和 DWR。我使用 IBM Rational Application Developer V6.0,它对 Java portlet 开发具有内置的支持,但是其他开发环境也可以。按以下步骤开始:
  • 创建一个新的 JSR-168 portlet 项目。给项目起名为  InterPortletMessaging,但是现在还不创建任何 portlet。
  • 下载 dwr.jar(版本 1.1;请参阅 中的链接)。把 dwr.jar 添加到项目的 /WebContent//WEB-INF/lib 目录。
  • 打开 web.xml 并添加清单 1 中的代码。这会把 DWR servlet 添加到应用程序。这个 servlet 被用在后台处理请求并把响应发送回浏览器。

    清单 1. DWR servlet
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <servlet>

      <servlet-name>dwr-invoker</servlet-name>
      <display-name>DWR Servlet</display-name>
      <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
      <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
      </init-param>
    </servlet>

    <servlet-mapping>
      <servlet-name>dwr-invoker</servlet-name>
      <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>




  • 用清单 2 中的代码在 WEB-INF 目录创建一个名为 dwr.xml 的文件。这个文件是 DWR 的配置文件,它告诉容器哪些类在 JavaScript 中是可用的。DWR 读取这个 XML 文件并动态地生成把 Java 类表示成 JavaScript 类的 JavaScript 代码。这样您就可以在浏览器中提供由这些 Java 类提供的功能。目前还没有真正创建在清单 2 中引用的 Java 类,但是我们先来看一下。

    清单 2. dwr.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE dwr PUBLIC
       "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
       "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

    <dwr>
    <allow>
       <create creator="new" javascript="MessagingBean">
         <param name="class" value="msg.MessagingBean"/>
       </create>
    </allow>
    </dwr>




现在可以在 portlet 中使用 DWR 了。但是在创建示例 portlet 之前,需要创建一个消息 bean 和一个伪装数据库 bean(充当示例应用程序的后端)。
创建 MockupDB 和 MessagingBean清单 3 所示的 MockupDB是个单体类,模拟客户订单的数据库。所有订单都硬编码在这个类中。真实应用程序可能使用关系数据库系统,但这个示例对我们的目的来说足够了。
清单 3. MockupDB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package db;

import java.util.Hashtable;
import java.util.Map;

public class MockupDB {

private static MockupDB instance=new MockupDB();

private String[] orders=new String[4];
private Map orderDetails=new Hashtable();
private Map customerDetails=new Hashtable();

private MockupDB()
{
   String ordStart="ORD";
   orders[0]=ordStart+"000408015";
   orders[1]=ordStart+"001600023";
   orders[2]=ordStart+"000042000";
   orders[3]=ordStart+"011235813";

   orderDetails.put(orders[0],"1. WebSphere Everyplace Connection Manager<br/>"+
                    "2. WebSphere Portal");
   orderDetails.put(orders[1],"1. DB2 Universal Database<br/>2. DB2 Everyplace");
   orderDetails.put(orders[2],"1. Tivoli Access Manager for e-business <br/>2."+
                    "Tivoli Directory Integrator");
   orderDetails.put(orders[3],"1. IBM System z9<br/>2. IBM System p5 550 Express");

   customerDetails.put(orders[0],"<b>Systems and Technology Group</b><br/>"+
                       "Some Road<br/>Finland");
   customerDetails.put(orders[1],"<b>Global Financing</b><br/>Another Street"+
                       "<br/>Finland");
   customerDetails.put(orders[2],"<b>Software</b><br/>Yet Another Road"+
                       "<br/>Finland");
   customerDetails.put(orders[3],"<b>Global Services</b><br/>Still Another "+
                       "Street<br/>Finland");
}
   
public static MockupDB getInstance()
{
   return instance;
}
   
public String[] getOrders()
{
   return orders;
}
   
public String getOrderDetails(String orderNro)
{
   return (String)orderDetails.get(orderNro);
}

public String getCustomerDetails(String orderNro)
{
   return (String)customerDetails.get(orderNro);
}
}




清单 4 所示的 MessagingBean是个简单的 POJO,有两个方法,都接受订单号,但是分别返回订单细节和客户细节。MessagingBean从 MockupDB得到细节。
清单 4. MessagingBean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package msg;

import javax.servlet.http.HttpSession;

import db.MockupDB;

public class MessagingBean {

public MessagingBean()
{        
}
   
public String getOrderDetails(String orderNumber,HttpSession httpSession)
{
   String orderDetails=MockupDB.getInstance().getOrderDetails(orderNumber)
   httpSession.setAttribute("orderDetailsOrderNumber",orderNumber);
   httpSession.setAttribute("orderDetails",orderDetails);
   return orderDetails;
}

public String getCustomerDetails(String orderNumber,HttpSession httpSession)
{
   String customerDetails=MockupDB.getInstance().getCustomerDetails(orderNumber);
   httpSession.setAttribute("customerDetailsOrderNumber",orderNumber);
   httpSession.setAttribute("customerDetails",customerDetails);
   return customerDetails;
}
}




MessagingBean还把订单细节和客户细节添加到 HttpSession。
返回列表