前陣子頭兒讓寫一個webservice。說真的以前沒有寫過,還真是摸不著頭腦。后來頭兒就把hessian的地址給發(fā)了過來。給我指了一個方向。再學習2天后基本把項目要求的實現出來了。對于這種輕量級的東西還是很好學習也很容易上手的。
其實剛看到的時候也是自己先上網找了很多篇別人的學習筆記。基本寫的都差不多,不過挺通俗易懂的。后來看官網的例子發(fā)現其實也很容易懂。
官方地址:http://hessian./
下載的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和接口的類來返回給客戶端??蛻舳司涂梢允褂媒涌谥卸x的這些方法了。
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。我發(fā)現的最嚴重的一個就是這兩個版本在返回對象時候會出現異常。而且目前無法解決。所以選擇了使用bug修改過后的3.2.0。網上很多關于hessian的文章沒有提到這個事情是因為那些文章比較早,寫的時候3.1.5和3.1.6都沒有出來。
目前項目中使用hessian的部分還是比較穩(wěn)定的。以后有新的總結會及時更新。
補充:
---------------------------------------------------------------------------------------------------------- 2008-10-17
為什么服務器端是List對象,到了客戶端就是hashmap了呢?????
原因:我的list在上傳前保存的是對象,經測試也不是map型,但到服務端從list獲取的變成了map型,經分析是因為目錄結構的原因,如果客戶端和服務器端package的名字不一樣的話,就會造成服務端反序列化時出現問題。所以在使用List的時候一定要讓bean的package的名稱在客戶端和服務器端是一致的。 |
|