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 {

/***
* 服務器端業務邏輯實現
* [b][color=red]注意:參數必須是封裝類型 比如 int此處必須定義爲Integer封裝類型 [/color][/b]
* @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);
}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章