hessian實現(客戶端服務端在同一個專案中)(轉)
Hessian是基於HTTP的輕量級遠端服務解決方案,Hessian像Rmi一樣,使用二進位制訊息進行客戶端和伺服器端互動。但與其他二進位制遠端呼叫技術(例如Rmi)不同的是,它的二進位制訊息可以移植其他非Java的語言中。
通過Servlet繫結服務
一、建立Hessian程式的4個步驟
- 定義一個遠端介面的介面。
- 定義一個實現該介面的類。
- 在web.xml中定義匯出Hessian服務需要的資訊。
- 編寫客戶端訪問程式碼。
二、程式的具體實現
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元。
=============================