Hessian, 短小精悍的webService 解決方案
可能你不知道這個單詞:Hessian, 我查過, 是:hessian n. 粗麻布 , 我暈倒, 怎麼這麼多的Java愛好者, 把這些名字都取得稀奇古怪。
言規正傳, 我們萊說這塊:粗麻布 (它的英文發音也很奇怪), 這個140K的東西, 可以替代Webservice, 或者說它就是一個webService的構建者,可以實現非SOAP協議的遠程事務調用, 對象傳遞和大文件傳遞。
先看看怎麼部署它,我用的Java Container是他的哥哥Resin(也是一個奇怪的名字),先把這個140kb的Jar拷貝到你的webapp目錄的WEB-INF下的lib目錄裏面。, 接下來我們做一個tutorship:
先建立一個接口, 相當於EJB裏面的stub,如下:
package app.demo;
public interface BasicAPI {
public String hello();
public User getUser();
}
再建立一個實現類:
package app.demo;
public class BasicService implements BasicAPI{
private String _greeting = "Hello, world";
public void setGreeting(String greeting)
{
_greeting = greeting;
}
public String hello()
public String hello()
public String hello()
public String hello()
public String hello()
public String hello()
{
return _greeting;
}
public User getUser(){
public User getUser(){
public User getUser(){
public User getUser(){
public User getUser(){
public User getUser(){
return new User("prance","meshow");
}
}
爲了查看它是否可以傳遞對象, 我們再建立一個可以序列化的User對象
package app.demo;
public class User implements java.io.Serializable {
String userName="snoopy";
String password ="showme";
public User( String user, String pwd){
this.userName =user;
this.password =pwd;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
}
好了接下部署在你的webapp下面, 申明一下, 這個麻布可以在它哥哥的早期版本下面使用, 我在resin2.1.10下面測試是可以的, 廢話不說, 直接配置web.xml如下
<servlet servlet-name="hello"
servlet-class="com.caucho.hessian.server.HessianServlet">
<init-param service-class="app.demo.BasicService"/>
<init-param api-class="app.demo.BasicAPI"/>
</servlet>
<servlet-mapping url-pattern="/hello" servlet-name="hello"/>
人們的好奇心就是沒有救, 我訪問了一下這個servlet, 大家可能很奇怪, 我沒有寫servlet呀, 當然, 在hessian-3.0.13.jar裏面有, 你如果看到一行字:
Hessian Requires POST
沒錯,就是它。
先試一下用客戶程序來訪問它:
代碼如下:
package app.demo;
import com.caucho.hessian.client.HessianProxyFactory;
public class BasicClient {
public static void main(String []args)
throws Exception
{
String url = "http://127.0.0.1:81/demo/hello";
HessianProxyFactory factory = new HessianProxyFactory();
HessianProxyFactory factory = new HessianProxyFactory();
HessianProxyFactory factory = new HessianProxyFactory();
HessianProxyFactory factory = new HessianProxyFactory();
HessianProxyFactory factory = new HessianProxyFactory();
HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + basic.hello());
System.out.println("Hello: " + basic.getUser() .getUserName() );
System.out.println("Hello: " + basic.getUser().getPassword() );
}
}
}
}
}
}
}
直接執行, 結果是這樣的:
Hello: Hello, world
Hello: prance
Hello: meshow
這個結果說明, 從一個client application是可以調用hessian的, 而且可以傳遞對象。
最後用一個jsp來檢驗一下:
<%@ page import="com.caucho.hessian.client.HessianProxyFactory,
app.demo.BasicAPI"%>
<%@page language="java" %>
<%
String url = ("http://" +request.getServerName() + ":" + request.getServerPort() +
request.getContextPath() + "/hello");
out.println(url);
HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);
out.println("Hello: " + basic.hello());
out.println("Hello: " + basic.getUser() .getUserName() );
out.println("Hello: " + basic.getUser().getPassword() );
%>
好了, 全部測試完畢, 簡簡單單, 快快樂樂。