HessianServlet+srpingMVC 作为服务器端和客户端的实现以及解析

首先需要导入对应jar包
hessian-4.0.7.jar
spring 对应的jar包

1:服务器端实现
a: 作为服务器端,要有接受请求的类

package www.hessian;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;

import com.www.services.server.ServiceContext;
import com.www.framework.support.SpringHandler;

/***
* 功能:Hessian服务服务器端实现方式
* @author jinp
*/
public class HessianServlet extends com.caucho.hessian.server.HessianServlet {

    ​ /**
    ​ *  序列化
    ​ */
    ​ private static final long serialVersionUID = -8846684123470577456L;
    ​
    ​ /**
    ​ * 通过className 和 method 要能找到具体那个类的那个方法.
    ​ * className为类名,参考本类 getClass()方法实现方式
    ​ * method为方法名。
    ​ * params为调用方法的函数(不定参数)。
    ​ */
    ​ public Object service(String className, String method, Object... params) {
    ​    // 通过 Hessian 的方式获取 HttpServletRequest
    ​    HttpServletRequest req = (HttpServletRequest) ServiceContext.getContextRequest();
    ​    // 获取当前IP地址
    ​     String ipFrom = req.getRemoteAddr();
    ​     System.out.println("hessian:"+ipFrom);
    ​    // ip地址过滤 可以忽略
    ​     // if(UserControlUtil.isAllowedHessianIp(ipFrom)){
    ​    ​     try {
    ​    ​        Class c = getClass(className);
    ​    ​        Method m = null;
    ​    ​        if (params == null || params.length < 1) {
    ​    ​            ​m = c.getMethod(method, null);
    ​    ​        } else {
    ​    ​    ​        Class[] paramClass = new Class[params.length];
    ​    ​    ​        int i = 0;
    ​    ​    ​        for (final Object obj : params) {
    ​    ​    ​            ​paramClass[i++] = obj.getClass();
    ​    ​    ​        }
    ​    ​    ​        m = c.getMethod(method, paramClass);
    ​    ​        }
    ​    ​        return m.invoke(SpringHandler.getBean(className), params);
    ​    ​     } catch (Exception e) {
    ​    ​        e.printStackTrace();
    ​    ​     }
    ​     // }
    ​ 
    ​    return null;
    ​ }
    ​
    ​ /***
    ​ * 通过类名获取当前的class类
    ​ * 1:className可以为实现类的第一个字母的小写(该方式为在spring中获取的方式,因为已经加载到spring中)
    ​ * 实现方式:Class c = SpringHandler.getBean(className).getClass();
    ​ * @param className
    ​ * @return 指定类对象
    ​ */
    ​ private final Class getClass(String className) {
    ​ Class c = SpringHandler.getBean(className).getClass();
    ​ return c;
    ​ }
    ​
    ​ /***
    ​ * 通过类名获取当前的class类
    ​ * 2:className也可以为类的全路径+类名,改方式通用
    ​ * 实现方式:Class c = Class.forName(className)
    ​ * @param className
    ​ * @return 指定类对象
    ​ */
    ​ private final Class getClass(String className) {
    ​    ​ Class c = null;
    ​    ​ try {
    ​    ​    ​ c = Class.forName(className);
    ​    ​ } catch (ClassNotFoundException e) {
    ​    ​    ​ try {
    ​    ​    ​     ​ c = Class.forName(className);
    ​    ​    ​ } catch (ClassNotFoundException e1) {
    ​    ​    ​ }
    ​    ​ }
    ​    ​ return c;
    ​ }

}


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>


package www.hessian.ware;
/***
* 服务器端业务逻辑实现 
* @author Administrator
*
*/
public class OrderService {

/***
* 服务器端业务逻辑实现 
* 注意:参数必须是封装类型  比如 int此处必须定义为Integer封装类型
* @param i
* @return
*/
public int getCount(Integer i){
// 相关处理
i=i+10 ;
return  i  ;
}

}


2:客户端实现


package www.hessian;

/***
* Hessian客户端 实现接口
* @author Administrator
*
*/
public interface HessianService {
public Object service(String className, String method, Object... params);
}

Hessian客户端 实现类:
package www.hessian;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;

/***
* Hessian客户端 实现类 
* @author Administrator
*
*/
public class ServiceClient {


/**
* 注意:返回值一定要用复合类型来接收,并判断是否为null。
* 网络异常会导致返回为null。
* 比如:不能直接将返回转义为int boolean等,需要是封装类型 Integer Boolean 。
* 如:boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 是错误的!!
* 应为:Boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 因为result有可能为null。
* @param url 服务地址
* @param className 类名,要求为全类名,如: mmb.service.order.OrderService, 可以省略: mmb.service,相当于只在mmb.service下查找指定的类。
* @param method 调用的方法名
* @param params 参数列表
* @return 返回值
*/
public static Object service(String url,String className,String method, Object ... params ){
HessianProxyFactory factory=new HessianProxyFactory(); 
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
try {
HessianService service=(HessianService) factory.create(HessianService.class, url);
return service.service(className, method, params);
} catch (MalformedURLException e) {
e.printStackTrace();

return null;
}

/**
* 注意:返回值一定要用复合类型来接收,并判断是否为null。
* 网络异常会导致返回为null。
* 比如:不能直接将返回转义为int boolean等。
* 如:boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 是错误的!!
* 应为:Boolean result = (Boolean)ServiceClient.service(url,"sample.StudentService", "delete", 1);
* 因为result有可能为null。
* @param url 服务地址
* @param outtime 超时时长(毫秒)
* @param className 类名,要求为全类名,如: mmb.service.order.OrderService, 可以省略: mmb.service,相当于只在mmb.service下查找指定的类。
* @param method 调用的方法名
* @param params 参数列表
* @return 返回值
*/
public static Object service(String url, long outtime,String className,String method, Object ... params ){
HessianProxyFactory factory=new HessianProxyFactory(); 
factory.setConnectTimeout(outtime);
factory.setReadTimeout(outtime);
try {
HessianService service=(HessianService) factory.create(HessianService.class, url);
return service.service(className, method, params);
} catch (MalformedURLException e) {
e.printStackTrace();

return null;
}

public static void main(String args[]){
// 定义该Url,在访问该url的时候会 通过拦截器进入指定的类中 (参考web.xml)
String url="http://127.0.0.1:8080/hessianPro/enter/rpc/hes.jsp";
int deliver = (Integer)ServiceClient.service(url, "www.hessian.ware.OrderService", "getCount", 0);
System.out.println(deliver);
}

}

你可能感兴趣的:(hessian)