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);
}
}
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);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.