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);

}

}

相关推荐