与服务端通信 第三节   通过Remoting与服务端通信
        本小节我们来学习借助 BlazeDS 使用 Remoting 方式与后台服务器通信,为了活跃下学习气氛我先用一个大家耳熟能详的例子来说明下什么是 Remoting 什么是 BlazeDS。
      

场景一:熟悉的音乐响起

“噔~噔噔 噔 噔 噔 噔,噔~噔噔 噔 噔 噔 噔”  

龟田小队长带领鬼子来到马家河子李家村,把村民们召集到打谷场。龟田喊话了

“八路軍の行方を言い出すのでさえすれば、皇軍がとても大きくて賞があります”。  

好,Remoting 的意向建立了,鬼子想知道八路的下落,而村民中汉奸恰巧能提供这个服务(Service),一对供应关系产生。需方:鬼子(前台 Flex),供方:汉奸(后台)。

场景二:村民议论纷纷

“这孙子说什么呢?”  

好,Remoting 关系虽然建立,但是由于语言不通(Flex 为 AS3 语言,后台为 Java 等语言),无法使双赢交易进行,汉奸急啊。

场景三:就在这时,肩负中日两国人民友谊桥梁之重任的翻译官出场

“太君说了,只要你们说出八路的下落,皇军大大滴有赏。”  “太君,我说,八路就在王二麻子家养伤,我给您带路。”  

翻译官在龟田耳边一番耳语,龟田脸上露出了狡黠的笑容。

“にで、りょしんだだでほうや”(你滴,良心大大滴好呀)。  

好,至此一次调用结束,这时我要是问“BlazeDS 在 Remoting 里是干嘛的呀”有悟性的朋友肯定会回答我“翻译官啊”。

 

 

学习目标

这一节我们采用一个用户登录的示例来演示通过Remoting与服务端通信。以下是完成后的截图,经过后台验证给出登陆信息。 (图九十)

 

准备工作

希望你对Java有一定了解,会写简单的Servlet。

BlazeDS 4 下载地址:下载  
Java 开发工具:Eclipse 3.4  
Servlet 容器:Tomcat 6.0  

实现步骤

接下去我们就一步步的来实现这一应用。

Server 端:

1、使用 Eclipse 3.4 建立一个 Dynamic Web Project。

2、将下载好的“blazeds-bin-4.x.x.xxxxx.zip”文件解压,得到以下两个文件。 (图九十一)

接下来我们再对其中名为“blazeds.war”的文件进行再次解压,得到以下目录结构。

       3、将上图中flex,lib两个文件夹以及web.xml三样东西复制到我们的 Web Project 的 WEB-INF 下并覆盖同名文件,得到以下的工程结构。 (图九十三)

图九十一

需要的blazeds文件

4、打开 web.xml 文件。将其中被注释掉的代码解禁。注意,还要将 useAppserverSecurity 的 value 由 true 改为 false。(图九十四)

修改前

修改后

5、为了体现 BlazeDS 的优势——即 AS3 对象和 Java 对象之间的自由映射转换,我们在这里定一个 Java Bean “User”用以维护用户名和密码等信息。

package cn.airia.fb4.vo;
public class User {
    private String username;
    private String password;
    public String getUsername() {
       return username;
    }
    public void setUsername(String username) {
       this.username = username;
    }
    public String getPassword() {
       return password;
    }
    public void setPassword(String password) {
       this.password = password;
    }
}

6、撰写核心代码 UserService.java,这个类会成为前台所调用的 RemoteClass,在这个类里我们使用 Hard Code 的方式实现用户登陆的验证。

package cn.airia.fb4.service;
 
import cn.airia.fb4.vo.User;
 
public class UserService {
    public String login(User user)
    {
       if(user.getUsername().equals("momoko") && user.getPassword().endsWith("123"))
       {
           return "Welcome "+user.getUsername();
       }
       else
       {
           return "Login failed";
       }
    }

}

7、打开 WEB-INF/flex/remoting-config.xml,在<server>...</server>标签中加入如下配置信息。用 source 来标记之前我们定义的类 UserService,来表示这个类被开放出来以供前台调用,同时我们也要为其设置一个 id 以标示这个类。

<destination id="userService">

    <properties>

        <source>cn.airia.fb4.service.UserService</source>

    </properties>

</destination>

以下是完整的remoting-config.xml (图九十五)

8、将项目添加到 Tomcat 中并启动,至此 Sever 端的操作全部完成,等待 Client 端调用。 (图九十六)

Client 端:

1、新建一个 Flex Project,注意急性子的同学手不要太快,Remoting 访问方式和 Httpservice 以及 webservice 有所区别需额外设置后方能“下一步”,我们在“应用服务器类型”一栏中选择“J2EE”和“BlazeDS”后点击“下一步”。 (图九十七)

在弹出窗体中进行设置

点击“验证配置 ”按钮,若无错误提示,即可进入下一步后直接按“完成”。

图九十五

remoting-config.xml

2、在“数据/服务”视图,我们来配置之前后台发布的 RemoteClass,点击“链接数据/服务”link。 (图九十九)

File:Flash_Builder_4_5Z_4J_remoting_image019.png

图九十六

项目添加至Tomcat

在弹出窗体中选择 BlazeDS 后下一步。 (图一百)

File:Flash_Builder_4_5Z_4J_remoting_image021.png

图一百

连接数据服务

图九十九

连接数据服务

有可能会询问你RDS的密码,我们可以选择不需要密码直接跳过这步,在接下来的弹出窗体中可以看到后台发布的 RemoteClass,简单设置下Service Name以及 Package Name 后,点击“完成”按钮。 (图一百零一)

File:Flash_Builder_4_5Z_4J_remoting_image023.png

图一百零一

设置Service

图九十三

复制文件到 WEB-INF

3、在 RemotingDemo.mxml 的 Design 视图中绘制界面,这里使用了两个 TextInput,一个 Button 和一个 Label 控件,这里分别为两个 TextInput 控件定义标示“textInputUsername”和“textInputPassword”。 (图一百零二)

File:Flash_Builder_4_5Z_4J_remoting_image025.png

图一百零二

绘制界面

4、在Design视图中选中 Button,在属性面板里点击铅笔按钮         ,选择“生成服务器调用”。 (图一百零三)

File:Flash_Builder_4_5Z_4J_remoting_image029.png

图一百零三

生成服务器调用

在弹出窗口中选择服务和操作后,点击“确定”按钮。 (图一百零四)

File:Flash_Builder_4_5Z_4J_remoting_image031.png

图一百零四

生成服务器调用

此时视图切换到 RemotingDemo.mxml 的 Source 视图。并自动生成了“login”按钮的点击处理事件代码段,我们对这段代码进行编辑,将“arg0”替换为一个 User 对象。

File:Flash_Builder_4_5Z_4J_remoting_image033.png

图九十

需要的blazeds文件

修改后的代码如下,我们可以看到这里的 User 类,是由系统参照 Server 端的定义自动为生成的。

protected function button_clickHandler(event:MouseEvent):void
{ 
    var user:User = new User();
    user.username = textInputUsername.text;
    user.password = textInputPassword.text;
    loginResult.token = userService.login(user);

}

5、切换到的 Design 视图,选择 Label 控件,在右侧的属性面板中,点击       按钮将其与返回结果绑定,点击“确定”按钮。(图一百零六)

File:Flash_Builder_4_5Z_4J_remoting_image037.png

图一百零六

Label绑定返回结果

图九十四

修改web.xml 的

useAppserverSecurity

File:Flash_Builder_4_5Z_4J_remoting_image039.png

图一百零七

绑定到数据

6、编码结束(其实我们基本没有手动编写代码噢 :) ),运行我们的程序看看效果吧。 (图一百零八)

File:Flash_Builder_4_5Z_4J_remoting_image041.png

图一百零八

完成测试

图九十七

新建FLEX项目

总结:

      BlazeDS 真的非常方便,建议会 J2EE 的同学从它开始上手。缺点嘛,BlazeDS 的 license 是基于 GNU GPL 协议,该协议大致意思就是,如果你在你的项目中使用了 BlazeDS,而你的项目又是以产品的形式销售给客户,那么你就必须把你的项目全部开源。如果你的客户是比较正规的国外公司,而你又不想开源,那么请慎用 BlazeDS 吧。

思考:

BlazeDS 可以与 Spring Bean 进行整合,有兴趣的同学可以回家试试。 BlazeDS 提供了 Message 服务,想全面了解 BlazeDS 的同学不妨用它的 Message 服务来实现一个简单聊天室。