Chinaunix首页 | 论坛 | 博客
  • 博客访问: 210815
  • 博文数量: 29
  • 博客积分: 3470
  • 博客等级: 中校
  • 技术积分: 840
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-17 15:35
文章分类
文章存档

2011年(2)

2010年(17)

2009年(2)

2008年(8)

我的朋友

分类: Java

2010-01-02 15:01:36

在应用中使用 Hessian

在应用中使用 Hessian

作者:终南   <>

对于 Hessian 的基本介绍,可以参见 Hessian 简介。在应用程序的实际开发中,情况往往比较复杂,但是 Hessian 是一个功能比较强大的 Web service 框架,提供了诸如访问受到 BASIC 认证保护的服务、传递Date、List、Map等常用类型以及对象等复杂数据类型的功能。

1. 使用 Basic 认证保护 Web 服务

如果没有认证机制,那么能够连接到 Web service 服务器上的客户端都有可能访问到 Web 服务。可以利用 Web 服务器的安全机制将 Web service 配置成 Basic 认证模式,这样访问 Web service 的客户端都必须提供用户名和密码才能访问。就 Tomcat 来说,对于在 Hessian 简介中介绍的应用,可以在 web.xml 增加一下内容来设置 hello 服务使用安全认证机制:



   
    users
    org.apache.catalina.UserDatabase




   
      Hessian Example
      /hello
   

   
       tomcat
   
   



    BASIC
    Hessian Example



   
    tomcat


这样,只有属于 tomcat 这个角色的用户才能访问 hello 服务。
相应地,在编写 Hessian 客户端程序的时候,就必须提供用户名和密码,才能访问。HessianProxyFactory 提供了 setUser() 和 setPassword() 两个方法用来设置用户名和密码。对于上述应用,应该在代码中添加:

    factory.setUser("tomcat");
    factory.setPassword("tomcat");

2. 让 Web service 返回数组

在 Basic.java 接口中增加方法:

public String[] getNames();

在 BasicService.java 中实现该方法:

public String[] getNames() {
   return new String[] { "Apache", "Tomcat", "Hessian" };
}

在客户端可以这样访问:

    String[] names = basic.getNames();
    for(int i = 0; i < names.length; i++)
    {
        System.out.println(names[i]);
    }

3. 让 Web service 返回一个对象

(1)不成功的做法
创建一个简单 JavaBean 类 Person,只包含三个属性:
package example;

import java.util.Date;

public class Person{
private int id = 0;
private String name = "";
private Date birthday = null;

public Person(int id, String name, Date birthday) {
   super();
   this.id = id;
   this.name = name;
   this.birthday = birthday;
}

public int getId() {
   return id;
}
public void setId(int id) {
   this.id = id;
}
public String getName() {
   return name;
}
public void setName(String name) {
   this.name = name;
}
public Date getBirthday() {
   return birthday;
}
public void setBirthday(Date birthday) {
   this.birthday = birthday;
}

}

在接口中定义:

public Person getPerson(int id);

在服务类中实现:

public Person getPerson(int id) {
   Person p = null;
   switch (id) {
   case 1:
    p = new Person(1, "Tom", new java.util.Date(1980, 1, 1));
    break;
   case 2:
    p = new Person(2, "Rose", new java.util.Date(1981, 1, 1));
    break;
   default:
    break;
   }
   return p;
}

客户端程序
   
    Person p = basic.getPerson(1);
    System.out.println(p.getName());

运行客户端程序,抛出异常:

Exception in thread "main" com.caucho.hessian.client.HessianConnectionException: 500: java.io.IOException: Server returned HTTP response code: 500 for URL:
at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:202)
at $Proxy0.getPerson(Unknown Source)
at example.BasicClient.main(BasicClient.java:25)

查看服务器日志,得到异常信息:
java.lang.IllegalStateException: Serialized class example.Person must implement java.io.Serializable
at com.caucho.hessian.io.SerializerFactory.getDefaultSerializer(SerializerFactory.java:262)
at com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:234)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:406)
...

异常提示 example.Person 必须实现 java.io.Serializable 接口。

(2)Serializable 和序列化
对于简单数据类型,如int, double, char,数组等,以及常用的一些类型,如String,java.util.Date,List, Map等,Hessian 本身对其进行了特殊处理,也就是 Hessian 对其进行了序列化操作,但是 Hessian 不可能了解其他的类以及在您的应用程序中使用的那些类。对于这些类,Hessian 则要求这些类本身能够被序列化,也就是要求这些必须实现 Serializable 接口。

(3)正确的做法
让 Person 实现 Serializable 接口,则 Person.java 应该被修改成:
package example;

import java.io.Serializable;
import java.util.Date;

public class Person implements Serializable{
private int id = 0;
private String name = "";
private Date birthday = null;
...

重新启动 Web 服务器,就可以成功运行客户端程序了。

4. 让 Web service 返回一个包含 Person 对象 List

在 Basic.java 接口中增加方法:

public List listPersons();

在 BasicService.java 中实现该方法:

public List listPersons() {
   List list = new ArrayList();
   list.add(new Person(1, "Tom", new java.util.Date(1980, 1, 1)));
   list.add(new Person(2, "Rose", new java.util.Date(1981, 1, 1)));
   return list;
}

在客户端可以这样访问:

    List list = basic.listPersons();
    System.out.println(list.size());
   

 原文地址 http://hi.baidu.com/li_zhongnan/blog/item/3ff32750346a076a84352419.html
 发表于: 2009-05-26,修改于: 2009-05-26 15:14 已浏览942次,有评论0条 推荐 投诉

  网友评论

阅读(894) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~