1. 程式人生 > >hessian實現(客戶端服務端在同一個專案中)(轉)

hessian實現(客戶端服務端在同一個專案中)(轉)

Hessian是基於HTTP的輕量級遠端服務解決方案,Hessian像Rmi一樣,使用二進位制訊息進行客戶端和伺服器端互動。但與其他二進位制遠端呼叫技術(例如Rmi)不同的是,它的二進位制訊息可以移植其他非Java的語言中。

通過Servlet繫結服務

一、建立Hessian程式的4個步驟

  1. 定義一個遠端介面的介面。
  2. 定義一個實現該介面的類。
  3. 在web.xml中定義匯出Hessian服務需要的資訊。
  4. 編寫客戶端訪問程式碼。

二、程式的具體實現
1.首先我們先建立Web專案,並新建一個實體類,這個類需要實現Serializable介面。

package entity; 
import java.io.Serializable; 
public class Book implements Serializable { 
  private String name; 
  private double price; 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  public double getPrice() { 
    return price; 
  } 
  public void setPrice(double price) { 
    this.price = price; 
  } 
}

2.建立一個介面

package service; 
import java.util.List; 
import entity.Book; 
public interface BookService { 
  List<Book> getList(); 
}

3.建立一個類實現步驟二中的介面,並且這個類需要繼承HessianServlet類(這裡需要Hessian的jar檔案可以到這個網站下載)

package service.impl; 
import java.util.ArrayList; 
import java.util.List; 
import service.BookService; 
import com.caucho.hessian.server.HessianServlet; 
import entity.Book; 
public class BookServiceImpl extends HessianServlet implements BookService { 
    public List<Book> getList() { 
        List<Book> list=new ArrayList<Book>(); 
        Book b1=new Book(); 
        b1.setName("《資訊簡史》"); 
        b1.setPrice(56); 
        Book b2=new Book(); 
        b2.setName("《黑客與畫家》"); 
        b2.setPrice(48); 
        list.add(b1); 
        list.add(b2); 
        return list; 
    } 

}

4.到WEB-INF下的web.xml中配置資訊

<servlet> 
    <!-- 配置 HessianServlet,Servlet的命名任意-->
    <servlet-name>book</servlet-name> 
    <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> 
    <!--配置介面,param-name可配置的名稱有:home-api、api-class、object-api(可不配置)-->
    <init-param> 
        <param-name>home-api</param-name> 
        <param-value>service.BookService</param-value> 
    </init-param> 
    <!-- 配置介面實現類,此處param-name可配置的名稱有:home-class、service-class、object-class--> 
    <init-param> 
        <param-name>home-class</param-name> 
        <param-value>service.impl.BookServiceImpl</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>book</servlet-name> 
    <url-pattern>/book</url-pattern> 
</servlet-mapping>

5.配置好之後,部署專案到Tomcat伺服器,並啟動服務

6.編寫客戶訪問程式碼

package test; 
import java.util.List; 
import service.BookService; 
import com.caucho.hessian.client.HessianProxyFactory; 
import entity.Book; 
public class Test { 
  public static void main(String[] args) { 
    String url="http://127.0.0.1:8080/test/book"; 
    HessianProxyFactory factory=new HessianProxyFactory(); 
    try { 
      BookService bookService=(BookService) factory.create(BookService.class, url); 
      List<Book> list = bookService.getList(); 
      for (Book book : list) { 
        System.out.println(book.getName()+",定價為:"+book.getPrice()+"元。"); 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
}

7.執行客戶端程式碼,控制檯顯示結果為
===========控制檯============

《資訊簡史》,定價為:56.0元。
 《黑客與畫家》,定價為:48.0元。

=============================

Spring整合Hessian

注意事項:
Hassian 3.2.0採用了新的Hassian 2協議,而Spring2.5.6 只支援Hassian 1協議,所以spring 2.5.6所能支援的最大版本為Hassian 3.1.6,最好使用spring 2.5.6附帶的版本Hassian 3.1.3,而對Hassian 2的支援,需要 Spring 3.0。

1.首先我們建立一個介面

package service;
import java.util.List;
import entity.Book;
public interface BookService {
    List<Book> getList();
}

2.編寫一個類,只需實現步驟一中的介面

package service.impl;
import java.util.ArrayList;
import java.util.List;
import service.BookService;
import entity.Book;
public class BookServiceImpl implements BookService {
    public List<Book> getList() {
        List<Book> list=new ArrayList<Book>(); 
        Book b1=new Book(); 
        b1.setName("《資訊簡史》"); 
        b1.setPrice(56); 
        Book b2=new Book(); 
        b2.setName("《黑客與畫家》"); 
        b2.setPrice(48); 
        list.add(b1); 
        list.add(b2); 
        return list; 
    }
}

3.我們在WEB-INF下的web.xml中配置SpringMVC需要的資訊(spring整合hessian需要用到SpringMVC)

<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
 
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>

4.在applicationContext.xml配置bean資訊

<bean id="bookService" class="service.impl.BookServiceImpl"></bean>
    
    <bean id="BookService"
        class="org.springframework.remoting.caucho.HessianServiceExporter"
        p:service-ref="bookService"
        p:serviceInterface="service.BookService"
    />

5.現在WEB-INF目錄下新建springmvc-servlet.xml檔案,並配置一下。(可以把applicationContext.xml拷到目錄下改一下名字)

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/book">BookService</prop>
            </props>
        </property>
    </bean>

6.接下我們應該在客戶端程式applicationContext.xml中配置獲取服務的bean資訊(我這裡是在同一個applicationContext.xml檔案中編寫,但不影響測試功能)

<bean id="getBookService"
        class="org.springframework.remoting.caucho.HessianProxyFactoryBean"
        p:serviceUrl="http://127.0.0.1:8080/test/book"
        p:serviceInterface="service.BookService"
    />

7.現在我們編寫一下測試程式碼,在執行下面程式碼之前需要把專案部署到Tomcat中,並執行Tomcat

package test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;
import entity.Book;
public class Test {
    public static void main(String[] args) {
        ApplicationContext cxt=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService=(BookService) cxt.getBean("getBookService");
        List<Book> list = bookService.getList();
        for (Book book : list) {
            System.out.println(book.getName()+",定價為:"+book.getPrice()+"元。"); 
        }
    }

}

8.執行程式碼,控制檯顯示結果為
===========控制檯============

 《資訊簡史》,定價為:56.0元。
 《黑客與畫家》,定價為:48.0元。

=============================

轉自:https://www.cnblogs.com/qujiajun/p/4070182.html