`

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进行服务器-客户端通讯

    这些示例可能包括了服务器端的服务接口和实现、web.xml配置、客户端的HessianProxyFactory使用,以及如何发起请求和处理响应的代码。 通过研究这些示例,你可以更深入地了解Hessian的工作流程,并学习如何在实际...

    hessian demo 包括服务端和客户端

    Hessian是一种高效的RPC(Remote Procedure Call)协议,它允许Java应用...通过学习这个Demo,你可以掌握如何设置Hessian服务端和客户端,以及如何进行远程方法调用,这对于构建分布式系统和服务有着重要的实践价值。

    hessian java +c# 数据测试

    在IT行业中,跨平台通信是常见的需求,而Hessian作为一种二进制协议,因其轻量级、...在实际开发中,开发者需要理解Hessian的工作原理,熟练掌握两端的库使用,确保数据正确传输和解析,从而实现高效稳定的远程调用。

    基于WebService的Hessian例子教程

    【描述】提供的教程包含了服务器端和客户端的实例代码,这两个例子旨在帮助开发者快速理解和应用Hessian。它们非常直观,可以直接运行,无需复杂配置,从而让你对Hessian的工作原理有深刻的理解。 首先,我们来了解...

    Hessian实战应用之获取客户端请求URL和重新转发客户端请求

    在IT行业中,Hessian是一种流行的二进制RPC(Remote Procedure Call)协议,它允许服务器和客户端之间高效地交换数据和调用服务。本篇将详细探讨Hessian在实战中的应用,特别是如何获取客户端请求的URL以及如何...

    使用hessian进行web与android端的通讯

    在提供的"**hessian-android使用案例**"文件中,可能包含了一个完整的示例项目,包括服务器端的Java代码和Android客户端的Java或Kotlin代码。通过研究这些代码,你可以更直观地了解Hessian在实际项目中的应用方式。 ...

    hessian服务端 客户端 可运行

    在这个“hessian服务端 客户端 可运行”的压缩包文件中,很可能包含了一个完整的示例,让我们来详细探讨Hessian在服务端和客户端的实现及其重要性。 首先,我们来理解一下Hessian服务端。在Java中,Hessian服务端...

    hessian轻量级 rpc实现

    2. 服务端:暴露服务,定义服务接口和实现类,启动HessianServlet,绑定到指定的URL。 3. 调用:通过代理对象调用服务接口的方法,Hessian会自动完成网络通信和序列化/反序列化操作。 五、示例——rpc4j-sample-web...

    hessian实例 helloworld

    具体的配置和实现细节未在描述中给出,但通常涉及Spring的bean配置、服务接口的实现以及客户端的Spring上下文初始化。 总的来说,Hessian提供了轻量级的远程调用解决方案,适合对性能有较高要求且希望避免复杂SOAP...

    hassian+spring +fileupload

    这个"FileUploader"压缩包很可能是包含了实现上述功能的源代码,包括服务器端的Hessian服务、Spring配置文件、客户端的调用示例等。通过学习和分析这些代码,你可以更深入地理解如何将Hessian和Spring结合,实现在...

    Hessian案列代码

    该库提供了服务器端和客户端的实现,并处理了序列化和反序列化的细节。 下面,我们来看看Hessian案例代码的一些关键部分: 1. **服务端(Server)**: - 首先,定义一个服务接口或者服务类,其中包含要暴露给...

    Hessian的小例子

    这个小例子将带你了解如何在Java环境中实现Hessian服务的客户端和服务器端。让我们深入探讨Hessian的核心概念以及如何在实际项目中应用。 首先,Hessian的目标是提供一种简单、快速、跨语言的序列化和远程调用机制...

    Hessian-4.0.7.jar和Hessiancsharp.dll(一个zip)

    Hessian-4.0.7.jar是Java实现的Hessian库,提供了服务器端和客户端的实现,使得Java应用可以方便地提供和调用Hessian服务。 Hessiancsharp.dll则是Hessian协议在C#平台上的实现,它允许.NET应用程序与使用Hessian-...

    hessian框架应用,实现远程调用,分布式开发

    2. **服务消费**:在客户端,开发者创建一个代理类,这个代理类是服务器端服务接口的实现,通过Hessian连接到服务器,实现远程调用。 三、`HessianServer`和`HessianClient`示例解析: `HessianServer`通常是一个...

    hessian实现远程调用

    - 在服务器端,需要将实现类绑定到一个特定的URL,以便客户端可以通过该URL调用。这通常通过创建一个HessianServlet并将其部署在Web服务器上来完成。HessianServlet会自动处理HTTP请求,并将方法调用转发到对应的...

    hessian通讯的安卓实现的简单DEMO

    开发者通常会使用Hessian库来实现客户端和服务端之间的通信,使得Android应用可以调用远程服务端的方法,就像调用本地方法一样方便。 3. **Hessian库的集成**:在Android项目中,需要引入支持Android的Hessian库,...

    hessian包及一个简单的使用实例

    这里我们提供了一个使用Hessian 4.0.37的简单实例,包括服务器端和客户端的创建。 #### 服务器端(Server) 首先,定义一个服务接口和其实现: ```java public interface HelloWorldService { String sayHello...

    Hessian入门案例源代码

    源代码通常包括服务器端和客户端两部分,它们展示了如何定义服务接口、实现服务、发布服务以及如何调用这些服务。 1. **Hessian服务接口定义**: 在Java中,服务通常定义为一个接口,包含若干个需要远程调用的方法...

    Hessian的jar包.zip

    2. Hessian服务器端:接收来自客户端的Hessian请求,解析数据,执行相应的服务方法,并将结果返回给客户端,同样是以Hessian格式。 3. 类型编码:Hessian定义了一套编码规则,可以有效地序列化和反序列化各种Java...

    spring springmvc hessian rpc客户端及服务端示例demo

    本示例着重介绍如何在Spring和SpringMVC框架中集成Hessian RPC,以实现客户端和服务端的通信。 Hessian是一种轻量级的二进制Web服务协议,由Caucho公司开发。它具有较高的传输效率,支持Java和.NET等多种语言,特别...

Global site tag (gtag.js) - Google Analytics