Hessian最佳實踐

前言:本文主要介紹‘獨立的Hessian技術’與‘結合Spring技術’的兩種Hessian接口開發模式及代碼示例。java

 

一.獨立的Hessian技術開發步驟

Hessian-Java服務器端必須具有如下幾點:
* 1.包含Hessian的jar包(hessian-4.0.37.jar)
* 2.設計一個接口,用來給客戶端調用(IHessian.java)
* 3.實現該接口的功能(IHessianImpl.java)
* 4.配置web.xml,配好相應的Servlet(web.xml)
* 5.對象必須實現Serializable接口(Foo.java)web

Hessian-JAVA服務端代碼預覽圖: spring

 

1.包含Hessian的jar包(hessian-4.0.37.jar)
re:可到Hessian官網http://hessian.caucho.com/下載最新的Hessian包或見本文附件。
服務器

2.設計一個接口,用來給客戶端調用(IHessian.java) 網絡

package my.hessian.service;

import my.hessian.model.Foo;

/**
 * 定義對外提供服務的接口(Hessian簡單入門)[純Hessian]
 * 
 * Hessian是一個簡單的鏈接Web服務的二進制協議
 * 
 * Hessian-JAVA服務器端必須具有如下幾點:
 * 1.包含Hessian的jar包
 * 2.設計一個接口,用來給客戶端調用
 * 3.實現該接口的功能
 * 4.配置web.xml,配好相應的Servlet
 * 5.對象必須實現Serializable接口
 * 
 * @author  WChao
 * @version  [My-1.0, 2016-2-21]
 */
public interface IHessian
{
    public Foo getFoo();
}
IHessian

3.實現該接口的功能(IHessianImpl.java) oracle

package my.hessian.service.impl;

import my.hessian.model.Foo;
import my.hessian.service.IHessian;

/**
 * 接口的具體實現類[純Hessian]
 * 
 * @author  WChao
 * @version  [My-1.0, 2016-2-21]
 */
public class IHessianImpl implements IHessian
{
    public Foo getFoo()
    {
        System.out.println("call getFoo method ~");
        Foo foo = new Foo();
        foo.setParam("Hi, This is my first Hessian demo.");
        return foo;
    }
}
IHessianImpl

4.配置web.xml,配好相應的Servlet(web.xml)app

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <!-- 配置HessianServlet, 此處ServiceServlet名字能夠自定義-->
        <servlet-name>ServiceServlet</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        
        <!-- 配置接口的具體實現類 -->
        <init-param>
            <param-name>service-class</param-name>
            <param-value>my.hessian.service.impl.IHessianImpl</param-value>
        </init-param>
    </servlet>
    <!-- 映射HessianServlet的訪問URL地址-->
    <servlet-mapping>
        <servlet-name>ServiceServlet</servlet-name>
        <url-pattern>/HessianFoo</url-pattern>
    </servlet-mapping>
    
    <!-- 
        Tips: Hessian與Spring集成的重要文件爲何叫remote-servlet.xml ?
        由於在web.xml中有配置:<servlet-name>remote</servlet-name>
        因此remote-servlet.xml的文件名必須以<servlet-name>中配置的servlet-name做爲文件名的開頭,
        且文件名的格式必須是[servlet-name]-servlet.xml格式,不然檢測不到。
        
        即:
        <param-value>remote-servlet</param-value>因此文件名爲remote-servlet.xml
     -->
    <servlet>
        <servlet-name>remote</servlet-name>
        <!-- 使用Spring的代理Servlet -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- init-param的配置可選,remote-servlet.xml文件默認放置WEB-INF/下面 -->
        <!-- 若是想自定義remote-servlet.xml名字,修改namespace對應param-value便可 -->
        <!-- 
        <init-param>
            <param-name>namespace</param-name>
            <param-value>remote-servlet</param-value>
        </init-param>
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>remote</servlet-name>
        <url-pattern>/remoting/*</url-pattern>
    </servlet-mapping>

</web-app>
web.xml

5.對象必須實現Serializable接口(Foo.java)jsp

package my.hessian.model;

import java.io.Serializable;

/**
 * 建立一個Foo類,同時實現序列化接口,
 * Description: Foo實現了序列化接口後就能夠進行序列化,而後就能夠經過網絡將序列化後的Foo傳輸到另外一臺計算機上
 * 
 * @author  WChao
 * @version  [My-1.0, 2016-2-21]
 */
public class Foo implements Serializable
{
    private static final long serialVersionUID = 1L;
    
    private String param = "";
    
    public String getParam()
    {
        return param;
    }
    
    public void setParam(String param)
    {
        this.param = param;
    }
    
    public String toString()
    {
        return this.param;
    }
}
Foo

  

Hessian-Java客戶端必須具有如下幾點:
* 1.java客戶端包含hessian.jar的包(hessian-4.0.37.jar) 
* 2.具備和服務器端結構同樣的接口及涉及Bean對象(MyHessianServer.jar-Foo.class)
* 3.利用HessianProxyFactory調用遠程接口(HessianClient.java)maven

Hessian-JAVA客戶端端代碼預覽圖:ide

 

1.java客戶端包含hessian.jar的包(hessian-4.0.37.jar) 
re: 可到Hessian官網:http://hessian.caucho.com/,下載最新的Hessian包或見本人附件。


2.具備和服務器端結構同樣的接口及涉及Bean對象(MyHessianServer.jar-Foo.class)
re: 見本文附件中的MyHessianServer.jar。


3.利用HessianProxyFactory調用遠程接口(HessianClient.java)

package my.hessianclient;

import java.net.MalformedURLException;

import my.hessian.model.Foo;
import my.hessian.service.IHessian;
import my.hessian.service.IHessianOfSpring;

import com.caucho.hessian.client.HessianProxyFactory;

/**
 * 調用純Hessian的客戶端
 * 
 * 客戶端必須具有如下幾點: 
 * 1.java客戶端包含hessian.jar的包 
 * 2.具備和服務器端結構同樣的接口及涉及Bean對象
 * 3.利用HessianProxyFactory調用遠程接口
 * 
 * @author  WChao
 * @version  [My-1.0, 2016-2-21]
 */
public class HessianClient
{
    
    public static void main(String[] args) throws MalformedURLException
    {
        /* 
        <servlet>
            <!-- 配置HessianServlet, 此處ServiceServlet名字能夠自定義-->
            <servlet-name>ServiceServlet</servlet-name>
            <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
            
            <!-- 配置接口的具體實現類 -->
            <init-param>
                <param-name>service-class</param-name>
                <param-value>my.hessian.service.impl.IHessianImpl</param-value>
            </init-param>
        </servlet>
        <!-- 映射HessianServlet的訪問URL地址-->
        <servlet-mapping>
            <servlet-name>ServiceServlet</servlet-name>
            <url-pattern>/HessianFoo</url-pattern>
        </servlet-mapping>
         */

        // 使用HessianProxyFactory Hessian代理工廠直接調用
        HessianProxyFactory factory = new HessianProxyFactory();
        
        // 在服務器端的web.xml文件中配置的HessianServlet映射的訪問URL地址
        // 純Hessian接口
        String url = "http://localhost:8080/HessianServer/HessianFoo";
        // 建立IHessian接口的實例對象
        IHessian iHessian = (IHessian) factory.create(IHessian.class, url);
        
        Foo myFoo = iHessian.getFoo();
        System.out.println(myFoo);
        
        System.out.println("------------------------------------------------------");
        
        // HessianServiceExporter only supports POST requests
        // Hessian與Spring集成接口
        url = "http://localhost:8080/HessianServer/remoting/IHessianOfSpring";
        IHessianOfSpring iHessianOfSpring = (IHessianOfSpring) factory.create(IHessianOfSpring.class, url);
        
        myFoo = iHessianOfSpring.getFoo();
        System.out.println(myFoo);
        
        // 打印結果:
        // Hi, This is my first Hessian demo.
        // ------------------------------------------------------
        // Hi, This is my first Hessian + Spring demo.
    }
}
HessianClient

 

二.Hessian+Spring 接口開發步驟

Hessian+Spring服務端開發步驟與獨立的Hessian接口的區別:

a、web.xml配置不一樣

<servlet>
    <servlet-name>remote</servlet-name>
    <!-- 使用Spring的代理Servlet -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- init-param的配置可選,remote-servlet.xml文件默認放置WEB-INF/下面 -->
    <!-- 若是想自定義remote-servlet.xml名字,修改namespace對應param-value便可 -->
    <!-- 
    <init-param>
        <param-name>namespace</param-name>
        <param-value>remote-servlet</param-value>
    </init-param>
    -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>remote</servlet-name>
    <url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
web.xml

b、多了remote-servlet.xml文件及配置

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 接口的具體實現類 -->
    <bean id="iHessianOfSpringImpl" class="my.hessian.service.impl.IHessianOfSpringImpl" />

    <!-- 使用Spring的HessianServie作代理 -->
    <bean name="/IHessianOfSpring"
        class="org.springframework.remoting.caucho.HessianServiceExporter">
        <!-- service引用具體的實現實體Bean-->
        <property name="service" ref="iHessianOfSpringImpl" />
        <property name="serviceInterface" value="my.hessian.service.IHessianOfSpring" />
    </bean>

    <!-- 能夠配置多個HessianServiceExporter代理Bean -->
</beans>
remote-servlet.xml

 

Hessian+Spring客戶端開發步驟與獨立的Hessian接口的區別:

一、除了能夠使用HessianProxyFactory Hessian代理工廠直接調用,還能夠使用HessianProxyFactoryBean Hessian代理工廠Bean來完成接口調用

package my.hessianclient;

import my.hessian.model.Foo;
import my.hessian.service.IHessianOfSpring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 調用Hessian與Spring集成接口的客戶端
 * Description: 使用HessianProxyFactoryBean Hessian代理工廠Bean來完成接口調用
 * 
 * @author  WChao
 * @version  [My-1.0, 2016-2-21]
 */
public class HessianAndSpringClient
{
    public static void main(String[] args)
    {
        ApplicationContext contex = new ClassPathXmlApplicationContext("remote-client.xml");
        
        // 得到客戶端的Hessian代理工廠bean
        IHessianOfSpring i = (IHessianOfSpring) contex.getBean("myClient");
        Foo myFoo = i.getFoo();
        System.out.println(myFoo);
        
        // 打印結果:
        // Hi, This is my first Hessian + Spring demo.
    }
}
HessianAndSpringClient

 

二、多了remote-client.xml的Spring文件配置

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 客戶端Hessian代理工廠Bean -->
    <bean id="myClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
        <!-- 請求代理Servlet路徑 -->        
        <property name="serviceUrl">
            <value>http://localhost:8080/HessianServer/remoting/IHessianOfSpring</value>
        </property>
        <!-- 接口定義 -->
        <property name="serviceInterface">
            <value>my.hessian.service.IHessianOfSpring</value>
        </property>
    </bean>
</beans>
remote-client.xml

 

代碼下載:

Hessian服務端:HessianServer, Hessian客戶端:HessianClient

 

 

POI:

 

轉:https://community.oracle.com/docs/DOC-887397

 

轉:http://blog.csdn.net/spp_1987/article/details/13770637

相關文章
相關標籤/搜索