Hessian其实很像web service,只不过它的协议不是SOAP,而是它自己规定的binary协议。Hessian的server端提供一个servlet基类,client端获得一
个service接口(也就是stub)之后调用上面的方法,stub将方法调用marshal之后通过HTTP传到server,server借助reflection调用service方法。
实战开始,先到www.caucho.com上去下载一个Resin,在宝宝的网上也有(itbaby.jss.cn)
然后在itbaby.jss.cn上下载一个HessianCSharp的DLL文件,供C#使用
1.开始,在Resin解压后,我在WEB-INF中建立一个目录itbaby,然后按Resin的帮助在itbaby目录下写了两个类
PlusAPI和PlusService
PlusAPI的CODE如下:
package itbaby;
public interface PlusAPI
{
public String Plus2Str(int A,int B);
}
-------------------------------------------
PlusService的CODE如下:
package itbaby;
public class PlusService implements PlusAPI
{
public String Plus2Str(int A,int B)
{
int iSum = A + B;
String sSum = Integer.toString(iSum);
return sSum;
}
}
2.在WEB-INF目录下建了个web.xml文件(注意原来的Resin带的我都删除了)
内容如下:
<web-app xmlns="http://caucho.com/ns/resin">
<servlet servlet-name="plus" servlet-class="com.caucho.hessian.server.HessianServlet">
<init-param service-class="itbaby.PlusService"/>
<init-param api-class="itbaby.PlusAPI"/>
</servlet>
<servlet-mapping url-pattern="/itbabywebsvc/plus" servlet-name="plus"/>
</web-app>
3.写一个JSP的测试文件(test.jsp),看看两个类是否运行正常
<%@ page import="com.caucho.hessian.client.HessianProxyFactory" %>
<%@ page import="itbaby.PlusAPI" %>
<%
HessianProxyFactory factory = new HessianProxyFactory();
// http://localhost:8080/itbabywebsvc/plus
String url = ("http://" +
request.getServerName() + ":" + request.getServerPort() +
request.getContextPath() + "/itbabywebsvc/plus");
PlusAPI plus = (PlusAPI) factory.create(PlusAPI.class, url);
out.println("100 + 50 = " + plus.Plus2Str(100,50)+"<br>");
out.println("150 + 200 = " + plus.Plus2Str(150,200)+"<br>");
%>
运行结果输出:
100 + 50 = 150
150 + 200 = 350
表示两个类运行正常
[b]4.开始写C#的客户端调用,启动VS.Net2003,新建一个Windows应用程序,当然你也可以使用ASP.NET,在默认的Form1上添加一个Button1的按钮.[/b]
然后添加一个引用HessianCSharp.DLL,(就是让你下载的那个DLL)
5.添加一个类文件,命名为:PlusAPI.cs,CODE如下:
using System;
namespace HsnTest
{
public interface PlusAPI
{
string Plus2Str(int A,int B);
}
}
在Button1的Click中添加如下CODE:
private void button1_Click(object sender, System.EventArgs e)
{
CHessianProxyFactory factory = new CHessianProxyFactory();
string url="http://localhost:8080/itbabywebsvc/plus";
PlusAPI test = (PlusAPI)factory.Create(typeof(PlusAPI), url);
string sValue = "5 + 10 =" + test.Plus2Str(5,10);
MessageBox.Show(sValue );
}
别忘了应用命名空间
using hessiancsharp.client;
好了,运行,看到如下结果
总结:我们可以考虑这样来使用JAVA的方法,Hessian还有 For PHP,Python,C++的类库,有兴趣的朋友可以在Caucho.com上多看看,多一句话,宝宝的网站就是用Resin,我使用Resin好多年了,小巧实用,大型的项目我也使用过,非常稳定
[b]再一例子[/b]
1.Hello.java
package server;
public interface Hello {
String hello(String name);
}
2 HelloImpl.java
package server.impl;
import server.Hello;
public class HelloImpl implements Hello {
public String hello(String name) {
return "hello, " + name + "! Welcome to use Hessian.";
}
}
3.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hessianService</servlet-name>
<servlet-class>
com.caucho.hessian.server.HessianServlet
</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>server.impl.HelloImpl</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessianService</servlet-name>
<url-pattern>/hessianService</url-pattern>
</servlet-mapping>
[color=red]<!---另一配置方式
<servlet>
<!-- 配置Servlet名,后面根据该名完成远程服务映射 -->
<servlet-name>hessianService</servlet-name>
<!-- Hessian远程服务需要HessianServlet暴露 -->
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<!-- 使用init-param配置服务的实现类 -->
<init-param>
<param-name>home-class</param-name>
<param-value>
server.Hello
</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>server.impl.HelloImp</param-value>
</init-param>
<!-- 随应用启动而启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
......
<!-- 映射Servlet的url,该Servlet的url就是Hessian服务名 -->
<servlet-mapping>
<servlet-name>hessianService</servlet-name>
<url-pattern>/hessianService</url-pattern>
</servlet-mapping>
---->[/color]
</web-app>
4。远程调用RometoTest.java
package client;
import java.net.MalformedURLException;
import server.Hello;
import com.caucho.hessian.client.HessianProxyFactory;
public class RomoteTest {
public static void main(String[] args) {
String url = "http://localhost:8080/hessianService";
HessianProxyFactory factory = new HessianProxyFactory();
try {
Hello hello = (Hello) factory.create(Hello.class, url);
System.out.println(hello.hello("kingtoon"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
个service接口(也就是stub)之后调用上面的方法,stub将方法调用marshal之后通过HTTP传到server,server借助reflection调用service方法。
实战开始,先到www.caucho.com上去下载一个Resin,在宝宝的网上也有(itbaby.jss.cn)
然后在itbaby.jss.cn上下载一个HessianCSharp的DLL文件,供C#使用
1.开始,在Resin解压后,我在WEB-INF中建立一个目录itbaby,然后按Resin的帮助在itbaby目录下写了两个类
PlusAPI和PlusService
PlusAPI的CODE如下:
package itbaby;
public interface PlusAPI
{
public String Plus2Str(int A,int B);
}
-------------------------------------------
PlusService的CODE如下:
package itbaby;
public class PlusService implements PlusAPI
{
public String Plus2Str(int A,int B)
{
int iSum = A + B;
String sSum = Integer.toString(iSum);
return sSum;
}
}
2.在WEB-INF目录下建了个web.xml文件(注意原来的Resin带的我都删除了)
内容如下:
<web-app xmlns="http://caucho.com/ns/resin">
<servlet servlet-name="plus" servlet-class="com.caucho.hessian.server.HessianServlet">
<init-param service-class="itbaby.PlusService"/>
<init-param api-class="itbaby.PlusAPI"/>
</servlet>
<servlet-mapping url-pattern="/itbabywebsvc/plus" servlet-name="plus"/>
</web-app>
3.写一个JSP的测试文件(test.jsp),看看两个类是否运行正常
<%@ page import="com.caucho.hessian.client.HessianProxyFactory" %>
<%@ page import="itbaby.PlusAPI" %>
<%
HessianProxyFactory factory = new HessianProxyFactory();
// http://localhost:8080/itbabywebsvc/plus
String url = ("http://" +
request.getServerName() + ":" + request.getServerPort() +
request.getContextPath() + "/itbabywebsvc/plus");
PlusAPI plus = (PlusAPI) factory.create(PlusAPI.class, url);
out.println("100 + 50 = " + plus.Plus2Str(100,50)+"<br>");
out.println("150 + 200 = " + plus.Plus2Str(150,200)+"<br>");
%>
运行结果输出:
100 + 50 = 150
150 + 200 = 350
表示两个类运行正常
[b]4.开始写C#的客户端调用,启动VS.Net2003,新建一个Windows应用程序,当然你也可以使用ASP.NET,在默认的Form1上添加一个Button1的按钮.[/b]
然后添加一个引用HessianCSharp.DLL,(就是让你下载的那个DLL)
5.添加一个类文件,命名为:PlusAPI.cs,CODE如下:
using System;
namespace HsnTest
{
public interface PlusAPI
{
string Plus2Str(int A,int B);
}
}
在Button1的Click中添加如下CODE:
private void button1_Click(object sender, System.EventArgs e)
{
CHessianProxyFactory factory = new CHessianProxyFactory();
string url="http://localhost:8080/itbabywebsvc/plus";
PlusAPI test = (PlusAPI)factory.Create(typeof(PlusAPI), url);
string sValue = "5 + 10 =" + test.Plus2Str(5,10);
MessageBox.Show(sValue );
}
别忘了应用命名空间
using hessiancsharp.client;
好了,运行,看到如下结果
总结:我们可以考虑这样来使用JAVA的方法,Hessian还有 For PHP,Python,C++的类库,有兴趣的朋友可以在Caucho.com上多看看,多一句话,宝宝的网站就是用Resin,我使用Resin好多年了,小巧实用,大型的项目我也使用过,非常稳定
[b]再一例子[/b]
1.Hello.java
package server;
public interface Hello {
String hello(String name);
}
2 HelloImpl.java
package server.impl;
import server.Hello;
public class HelloImpl implements Hello {
public String hello(String name) {
return "hello, " + name + "! Welcome to use Hessian.";
}
}
3.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hessianService</servlet-name>
<servlet-class>
com.caucho.hessian.server.HessianServlet
</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>server.impl.HelloImpl</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessianService</servlet-name>
<url-pattern>/hessianService</url-pattern>
</servlet-mapping>
[color=red]<!---另一配置方式
<servlet>
<!-- 配置Servlet名,后面根据该名完成远程服务映射 -->
<servlet-name>hessianService</servlet-name>
<!-- Hessian远程服务需要HessianServlet暴露 -->
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<!-- 使用init-param配置服务的实现类 -->
<init-param>
<param-name>home-class</param-name>
<param-value>
server.Hello
</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>server.impl.HelloImp</param-value>
</init-param>
<!-- 随应用启动而启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
......
<!-- 映射Servlet的url,该Servlet的url就是Hessian服务名 -->
<servlet-mapping>
<servlet-name>hessianService</servlet-name>
<url-pattern>/hessianService</url-pattern>
</servlet-mapping>
---->[/color]
</web-app>
4。远程调用RometoTest.java
package client;
import java.net.MalformedURLException;
import server.Hello;
import com.caucho.hessian.client.HessianProxyFactory;
public class RomoteTest {
public static void main(String[] args) {
String url = "http://localhost:8080/hessianService";
HessianProxyFactory factory = new HessianProxyFactory();
try {
Hello hello = (Hello) factory.create(Hello.class, url);
System.out.println(hello.hello("kingtoon"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}