前陣子頭兒讓寫一個(gè)webservice。說(shuō)真的以前沒(méi)有寫過(guò),還真是摸不著頭腦。后來(lái)頭兒就把hessian的地址給發(fā)了過(guò)來(lái)。給我指了一個(gè)方向。再學(xué)習(xí)2天后基本把項(xiàng)目要求的實(shí)現(xiàn)出來(lái)了。對(duì)于這種輕量級(jí)的東西還是很好學(xué)習(xí)也很容易上手的。
其實(shí)剛看到的時(shí)候也是自己先上網(wǎng)找了很多篇?jiǎng)e人的學(xué)習(xí)筆記。基本寫的都差不多,不過(guò)挺通俗易懂的。后來(lái)看官網(wǎng)的例子發(fā)現(xiàn)其實(shí)也很容易懂。
其實(shí)hessian很強(qiáng)大,但是我用的時(shí)候只用到了它很少的一部分功能,所以我也就說(shuō)說(shuō)這點(diǎn)吧。
還是先定義一個(gè)供客戶端和服務(wù)器端使用的接口,里邊放上應(yīng)用需要的方法。
----------------------------------------------------------------------------------------------------------
public interface IBasic {
//返回用戶的姓名,為了測(cè)試返回字符串
public String getUserName();
//返回一個(gè)用戶的對(duì)象,用來(lái)測(cè)試返回對(duì)象
public User getUserInfo();
//添加新用戶
public boolean AddUser(User u);
}
----------------------------------------------------------------------------------------------------------
至于User就是一個(gè)標(biāo)準(zhǔn)的JAVABEAN。這里需要注意的一點(diǎn)是。因?yàn)樵谶h(yuǎn)程調(diào)用過(guò)程中兩邊都需要用到這個(gè)bean。所以這個(gè)bean一定要保持一樣。繼承序列的時(shí)候最好都一樣的號(hào)。
然后來(lái)說(shuō)一下服務(wù)器端的程序。這里要實(shí)現(xiàn)所有接口中的方法。
----------------------------------------------------------------------------------------------------------
public class BasicService implements IBasic {
//根據(jù)自己的邏輯來(lái)返回一個(gè)字符串給客戶端
public String getUesrName() {
String name = "hanxiaoyue";
return name;
}
//這里就可以獲取一個(gè)User然后返回給客戶端
public User getUserInfo() {
User u = new User();
u.setUsername("hanxiaoyue");
u.setAge(22);
return u;
}
//這里就可以通過(guò)用戶傳遞過(guò)來(lái)的參數(shù)來(lái)進(jìn)行操作
public boolean AddUser(User u) {
String name = u.getUsername();
boolean res = false;
if(name != null && !name.equals("")) {
res = true;
}
return res;
}
}
----------------------------------------------------------------------------------------------------------
ok,服務(wù)器端寫好后就是客戶端了。如果想在服務(wù)器端測(cè)試的話就寫一個(gè)測(cè)試類就ok。其實(shí)跟在客戶端唯一不同的就是地址不一樣。
----------------------------------------------------------------------------------------------------------
public class BasicClient {
public static void main() throw Exception {
//這里的端口號(hào)貌似是必須加上的。我當(dāng)時(shí)加上就報(bào)錯(cuò)了。后邊的TestHessian是項(xiàng)目名稱。test/usertest就是servlet的名字了。在后邊xml里配置一下就ok。
HessianProxyFactory factory = new HessianProxyFactory();
//通過(guò)這里構(gòu)建一個(gè)hessian的代理工廠來(lái)根據(jù)url和接口的類來(lái)返回給客戶端??蛻舳司涂梢允褂媒涌谥卸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();
}
}
----------------------------------------------------------------------------------------------------------
最后我們來(lái)說(shuō)說(shuō)在web.xml里是如何配置的。其實(shí)很簡(jiǎn)單。
----------------------------------------------------------------------------------------------------------
<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,到這里基本一套流程就都下來(lái)了。其實(shí)在實(shí)際用的時(shí)候比這個(gè)稍微復(fù)雜了一點(diǎn)。但是大概的流程都是一樣的。這里特別要說(shuō)的就是之前提到的3.1.5和3.1.6的bug。我發(fā)現(xiàn)的最嚴(yán)重的一個(gè)就是這兩個(gè)版本在返回對(duì)象時(shí)候會(huì)出現(xiàn)異常。而且目前無(wú)法解決。所以選擇了使用bug修改過(guò)后的3.2.0。網(wǎng)上很多關(guān)于hessian的文章沒(méi)有提到這個(gè)事情是因?yàn)槟切┪恼卤容^早,寫的時(shí)候3.1.5和3.1.6都沒(méi)有出來(lái)。
目前項(xiàng)目中使用hessian的部分還是比較穩(wěn)定的。以后有新的總結(jié)會(huì)及時(shí)更新。
補(bǔ)充:
---------------------------------------------------------------------------------------------------------- 2008-10-17
為什么服務(wù)器端是List對(duì)象,到了客戶端就是hashmap了呢?????
原因:我的list在上傳前保存的是對(duì)象,經(jīng)測(cè)試也不是map型,但到服務(wù)端從list獲取的變成了map型,經(jīng)分析是因?yàn)槟夸浗Y(jié)構(gòu)的原因,如果客戶端和服務(wù)器端package的名字不一樣的話,就會(huì)造成服務(wù)端反序列化時(shí)出現(xiàn)問(wèn)題。所以在使用List的時(shí)候一定要讓bean的package的名稱在客戶端和服務(wù)器端是一致的。