HessianServlet+srpingMVC 作为服务器端和客户端的实现以及解析
首先需要导入对应jar包
hessian-4.0.7.jar
spring对应的jar包
1:服务器端实现
a:作为服务器端,要有接受请求的类
packagewww.hessian;
importjava.lang.reflect.Method;
importjavax.servlet.http.HttpServletRequest;
importcom.www.services.server.ServiceContext;
importcom.www.framework.support.SpringHandler;
/***
*功能:Hessian服务服务器端实现方式
*@authorjinp
*/
publicclassHessianServletextendscom.caucho.hessian.server.HessianServlet{
/**
*序列化
*/
privatestaticfinallongserialVersionUID=-8846684123470577456L;
/**
*通过className和method要能找到具体那个类的那个方法.
*className为类名,参考本类getClass()方法实现方式
*method为方法名。
*params为调用方法的函数(不定参数)。
*/
publicObjectservice(StringclassName,Stringmethod,Object...params){
//通过Hessian的方式获取HttpServletRequest
HttpServletRequestreq=(HttpServletRequest)ServiceContext.getContextRequest();
//获取当前IP地址
StringipFrom=req.getRemoteAddr();
System.out.println("hessian:"+ipFrom);
//ip地址过滤可以忽略
//if(UserControlUtil.isAllowedHessianIp(ipFrom)){
try{
Classc=getClass(className);
Methodm=null;
if(params==null||params.length<1){
m=c.getMethod(method,null);
}else{
Class[]paramClass=newClass[params.length];
inti=0;
for(finalObjectobj:params){
paramClass[i++]=obj.getClass();
}
m=c.getMethod(method,paramClass);
}
returnm.invoke(SpringHandler.getBean(className),params);
}catch(Exceptione){
e.printStackTrace();
}
//}
returnnull;
}
/***
*通过类名获取当前的class类
*1:className可以为实现类的第一个字母的小写(该方式为在spring中获取的方式,因为已经加载到spring中)
*实现方式:Classc=SpringHandler.getBean(className).getClass();
*@paramclassName
*@return指定类对象
*/
privatefinalClassgetClass(StringclassName){
Classc=SpringHandler.getBean(className).getClass();
returnc;
}
/***
*通过类名获取当前的class类
*2:className也可以为类的全路径+类名,改方式通用
*实现方式:Classc=Class.forName(className)
*@paramclassName
*@return指定类对象
*/
privatefinalClassgetClass(StringclassName){
Classc=null;
try{
c=Class.forName(className);
}catch(ClassNotFoundExceptione){
try{
c=Class.forName(className);
}catch(ClassNotFoundExceptione1){
}
}
returnc;
}
}
web.xml配置:
<servlet>
<servlet-name>HessianServlet</servlet-name>
<servlet-class>www.hessian.MMBHessianServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HessianServlet</servlet-name>
<url-pattern>/enter/rpc/hes.jsp</url-pattern>
</servlet-mapping>
packagewww.hessian.ware;
/***
*服务器端业务逻辑实现
*@authorAdministrator
*
*/
publicclassOrderService{
/***
*服务器端业务逻辑实现
*注意:参数必须是封装类型比如int此处必须定义为Integer封装类型
*@parami
*@return
*/
publicintgetCount(Integeri){
//相关处理
i=i+10;
returni;
}
}
2:客户端实现
packagewww.hessian;
/***
*Hessian客户端实现接口
*@authorAdministrator
*
*/
publicinterfaceHessianService{
publicObjectservice(StringclassName,Stringmethod,Object...params);
}
Hessian客户端实现类:
packagewww.hessian;
importjava.net.MalformedURLException;
importcom.caucho.hessian.client.HessianProxyFactory;
/***
*Hessian客户端实现类
*@authorAdministrator
*
*/
publicclassServiceClient{
/**
*注意:返回值一定要用复合类型来接收,并判断是否为null。
*网络异常会导致返回为null。
*比如:不能直接将返回转义为intboolean等,需要是封装类型IntegerBoolean。
*如:booleanresult=(Boolean)ServiceClient.service(url,"sample.StudentService","delete",1);
*是错误的!!
*应为:Booleanresult=(Boolean)ServiceClient.service(url,"sample.StudentService","delete",1);
*因为result有可能为null。
*@paramurl服务地址
*@paramclassName类名,要求为全类名,如:mmb.service.order.OrderService,可以省略:mmb.service,相当于只在mmb.service下查找指定的类。
*@parammethod调用的方法名
*@paramparams参数列表
*@return返回值
*/
publicstaticObjectservice(Stringurl,StringclassName,Stringmethod,Object...params){
HessianProxyFactoryfactory=newHessianProxyFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
try{
HessianServiceservice=(HessianService)factory.create(HessianService.class,url);
returnservice.service(className,method,params);
}catch(MalformedURLExceptione){
e.printStackTrace();
}
returnnull;
}
/**
*注意:返回值一定要用复合类型来接收,并判断是否为null。
*网络异常会导致返回为null。
*比如:不能直接将返回转义为intboolean等。
*如:booleanresult=(Boolean)ServiceClient.service(url,"sample.StudentService","delete",1);
*是错误的!!
*应为:Booleanresult=(Boolean)ServiceClient.service(url,"sample.StudentService","delete",1);
*因为result有可能为null。
*@paramurl服务地址
*@paramouttime超时时长(毫秒)
*@paramclassName类名,要求为全类名,如:mmb.service.order.OrderService,可以省略:mmb.service,相当于只在mmb.service下查找指定的类。
*@parammethod调用的方法名
*@paramparams参数列表
*@return返回值
*/
publicstaticObjectservice(Stringurl,longouttime,StringclassName,Stringmethod,Object...params){
HessianProxyFactoryfactory=newHessianProxyFactory();
factory.setConnectTimeout(outtime);
factory.setReadTimeout(outtime);
try{
HessianServiceservice=(HessianService)factory.create(HessianService.class,url);
returnservice.service(className,method,params);
}catch(MalformedURLExceptione){
e.printStackTrace();
}
returnnull;
}
publicstaticvoidmain(Stringargs[]){
//定义该Url,在访问该url的时候会通过拦截器进入指定的类中(参考web.xml)
Stringurl="http://127.0.0.1:8080/hessianPro/enter/rpc/hes.jsp";
intdeliver=(Integer)ServiceClient.service(url,"www.hessian.ware.OrderService","getCount",0);
System.out.println(deliver);
}
}