Hessian学习

前阵子头儿让写一个webservice。说真的以前没有写过,还真是摸不着头脑。后来头儿就把hessian的地址给发了过来。给我指了一个方向。再学习2天后基本把项目要求的实现出来了。对于这种轻量级的东西还是很好学习也很容易上手的。
其实刚看到的时候也是自己先上网找了很多篇别人的学习笔记。基本写的都差不多,不过挺通俗易懂的。后来看官网的例子发现其实也很容易懂。
官方地址: http://hessian.caucho.com/
下载的jar包也在这里。我使用的是 hessian-3.2.0-src.jar。事实证明3.1.5和3.1.6都有很多的bug不推荐使用。
其实hessian很强大,但是我用的时候只用到了它很少的一部分功能,所以我也就说说这点吧。
还是先定义一个供客户端和服务器端使用的接口,里边放上应用需要的方法。
----------------------------------------------------------------------------------------------------------
public interface IBasic {
//返回用户的姓名,为了测试返回字符串
public String getUserName();
//返回一个用户的对象,用来测试返回对象
public User getUserInfo();
//添加新用户
public boolean AddUser(User u);
}
----------------------------------------------------------------------------------------------------------
至于User就是一个标准的JAVABEAN。这里需要注意的一点是。因为在远程调用过程中两边都需要用到这个bean。所以这个bean一定要保持一样。继承序列的时候最好都一样的号。
然后来说一下服务器端的程序。这里要实现所有接口中的方法。
----------------------------------------------------------------------------------------------------------
public class BasicService implements IBasic {
//根据自己的逻辑来返回一个字符串给客户端
public String getUesrName() {
String name = "hanxiaoyue";
return name;
}
//这里就可以获取一个User然后返回给客户端
public User getUserInfo() {
User u = new User();
u.setUsername("hanxiaoyue");
u.setAge(22);
return u;
}
//这里就可以通过用户传递过来的参数来进行操作
public boolean AddUser(User u) {
String name = u.getUsername();
boolean res = false;
if(name != null && !name.equals("")) {
res = true;
}
return res;
}
}
----------------------------------------------------------------------------------------------------------
ok,服务器端写好后就是客户端了。如果想在服务器端测试的话就写一个测试类就ok。其实跟在客户端唯一不同的就是地址不一样。
----------------------------------------------------------------------------------------------------------
public class BasicClient {
public static void main() throw Exception {
//这里的端口号貌似是必须加上的。我当时加上就报错了。后边的TestHessian是项目名称。test/usertest就是servlet的名字了。在后边xml里配置一下就ok。
HessianProxyFactory factory = new HessianProxyFactory();
//通过这里构建一个hessian的代理工厂来根据url和接口的类来返回给客户端。客户端就可以使用接口中定义的这些方法了。
IBasic basic = (IBasic)factory.create(IBasic.class,url);
User u = basic.getUserInfo();
User u2 = new User();
u2.setUsername("hanxiaoyue");
boolean res = basic.AddUser(u2);
String username = basic.getUserName();
}
}
----------------------------------------------------------------------------------------------------------
最后我们来说说在web.xml里是如何配置的。其实很简单。
----------------------------------------------------------------------------------------------------------
<servlet>
<servlet-name>usertest<servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet<servlet-class>
<init-param>
<param-name>home-class<param-name>
<param-value>study.hessian.BasicService<param-value>
</init-param>
<init-param>
<param-name>home-api<param-name>
<param-value>study.hessian.IBasic<param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>usertest<servlet-name>
<url-pattern>/ test/usertest<url-pattern>
<servlet-mapping>
----------------------------------------------------------------------------------------------------------
ok,到这里基本一套流程就都下来了。其实在实际用的时候比这个稍微复杂了一点。但是大概的流程都是一样的。这里特别要说的就是之前提到的3.1.5和3.1.6的bug。我发现的最严重的一个就是这两个版本在返回对象时候会出现异常。而且目前无法解决。所以选择了使用bug修改过后的3.2.0。网上很多关于hessian的文章没有提到这个事情是因为那些文章比较早,写的时候3.1.5和3.1.6都没有出来。
目前项目中使用hessian的部分还是比较稳定的。以后有新的总结会及时更新。
补充:
---------------------------------------------------------------------------------------------------------- 2008-10-17
为什么服务器端是List对象,到了客户端就是hashmap了呢?????
原因:我的list在上传前保存的是对象,经测试也不是map型,但到服务端从list获取的变成了map型,经分析是因为目录结构的原因,如果客户端和服务器端package的名字不一样的话,就会造成服务端反序列化时出现问题。所以在使用List的时候一定要让bean的package的名称在客户端和服务器端是一致的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值