Hessian学习/使用总结

来源:百度文库 编辑:神马文学网 时间:2024/04/30 03:47:24
       前阵子头儿让写一个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。                       String url = http://localhost:80/TestHessian/test/usertest;                       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里是如何配置的。其实很简单。----------------------------------------------------------------------------------------------------------             usertest        com.caucho.hessian.server.HessianServlet                    home-class             study.hessian.BasicService                            home-api            study.hessian.IBasic                        usertest        /test/usertest    ----------------------------------------------------------------------------------------------------------          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的名称在客户端和服务器端是一致的。