hessian入门教程
一. hession入门
1 创建服务器端
导入hessian包
【第1步】 编写服务器端接口com.hessian.server.Hello.java
package com.hessian.server;
/**
* hessian 服务接口,用于客户端调用
* Hessian建立的远程调用,是对服务的接口进行调用
*
* @author莫小哆_ly 2012-1-16
*/
publicinterface Hello {
/**
* 测试字符串
* @return
*/
public String sayHello();
}
【第2步】 编写接口实现类com.hessian.server.impl.HelloImpl.java
package com.hessian.server.impl;
import com.hessian.server.Hello;
/**
* 实现服务端接口
*
* @author莫小哆_ly 2012-1-16
*/
publicclass HelloImpl implements Hello {
private String hello = "Hello World";
@Override
public String sayHello() {
returnhello;
}
//Getter/Setter
public String getHello() {
returnhello;
}
publicvoid setHello(String hello) {
this.hello = hello;
}
}
【第3步】 修改配置文件WEB-INF/web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>hessianServer</display-name>
<!-- 用户键入的URL不包含action名称、JSP页面或其他资源,依次寻找文件 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-api</param-name>
<param-value>com.hessian.server.Hello</param-value>
</init-param>
<init-param>
<param-name>home-class</param-name>
<param-value>com.hessian.server.impl.HelloImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
【第4步】 编写服务端的测试jsp页面index.jsp
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入类 -->
<%@pageimport="java.util.*"%>
<%@pageimport="com.caucho.hessian.client.HessianProxyFactory"%>
<%@pageimport="com.hessian.server.Hello"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>hessian</title>
</head>
<body>
<%
// Hessian代理工厂
HessianProxyFactory factory = new HessianProxyFactory();
// 控制台打印
System.out.println("test");
// jsp页面打印
out.println("<h3>test</h3>");
//获得访问配置的Servlet路径
String url = ("http://" + request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/hello");
System.out.println(url);
out.println("request.getServerName() ==== " + request.getServerName() + "<br/>");
out.println("request.getServerPort() ==== " + request.getServerPort() + "<br/>");
out.println("request.getContextPath() ==== " + request.getContextPath() + "<br/>");
//使用Hessian工厂获得接口的具体实现类
Hello hello = (Hello) factory.create(Hello.class, url);
out.println("<h2>" + hello.sayHello() + "<h2>");
%>
</body>
</html>
2 创建客户端
导入hessian包
【第1步】 编写客户端接口com.hessian.server.Hello.java
与服务器端保持一致
package comhessian.server;
/**
*
* hessian 服务接口,用于客户端调用
* Hessian建立的远程调用,是对服务的接口进行调用
*
* @author 莫小哆_ly 2012-1-16
*/
publicinterface Hello {
/**
* 测试字符串
* @return
*/
public String sayHello();
}
【第2步】 编写客户端测试类com.hessian.client.simpleTest.java
package com.hessian.client;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
import com.hessian.server.Hello;
/**
* 客户端测试
*
* @author 莫小哆_ly 2012-1-16
*/
publicclass SimpleTest {
publicstaticvoid main(String[] args) {
String url = "http://10.21.140.47:8080/myHessianServer/hello";
// Hessian代理工厂
HessianProxyFactory factory = new HessianProxyFactory();
Hello hello;
try {
// 使用Hessian工厂获得接口的具体实现类
hello = (Hello) factory.create(Hello.class, url);
// 直接调用接口方法,实际通过服务器端执行实现类方法,返回结果
System.out.println("远程调用:" + hello.sayHello());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
3 执行
run as Server --- myHessianServer
run as Java Aplication --- myHessianClient
4 后记
二. spring 同hessian基础
1. Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。传输对象时,需要序列化(implement Serialization)
2. 在进行基于Hessian的项目开发时,应当注意以下几点:
▲JAVA服务器端必须具备以下几点:
·包含Hessian的jar包
·设计一个接口,用来给客户端调用(服务器端和客户端均有)
·实现该接口的功能
·配置web.xml,配好相应的servlet
·对象必须实现Serializable 接口
·对于复杂对象可以使用Map的方法传递
▲客户端必须具备以下几点:
·java客户端包含Hessian.jar的包。
·具有和服务器端结构一样的接口。包括命名空间都最好一样
·利用HessianProxyFactory调用远程接口。
hessian+Spring远程过程调用 教程
1 创建服务器端
导入jar包
【第1步】 创建实体类suning.entity.User.java
package suning.entity;
/**
*
* 用户信息实体类
*
* @author 莫小哆_ly 2012-2-14
*/
publicclass User {
// 用户名
private String userName;
// 密码
private String passWord;
// 注册时间
private String registeredTime;
public User() {
}
// 用于登录
public User(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
}
// 用于注册
public User(String userName, String passWord, String registeredTime) {
this.userName = userName;
this.passWord = passWord;
this.registeredTime = registeredTime;
}
// Getter/Setter
public String getUserName() {
returnuserName;
}
publicvoid setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
returnpassWord;
}
publicvoid setPassWord(String passWord) {
this.passWord = passWord;
}
public String getRegisteredTime() {
returnregisteredTime;
}
publicvoid setRegisteredTime(String registeredTime) {
this.registeredTime = registeredTime;
}
}
【第2步】 创建服务接口suning.server.Login.java
package suning.server;
/**
*
* hessian 服务接口,用于客户端调用
* Hessian建立的远程调用,是对服务的接口进行调用
*
* @author 莫小哆_ly 2012-1-16
*/
publicinterface Login {
/**
* 登录服务
* @return
*/
public String login(String username,String password);
}
【第3步】 编写服务接口实现类suning.server.impl.LoginImpl.java
package suning.server.impl;
import suning.entity.User;
import suning.server.Login;
/**
* 实现服务端接口
*
* @author 莫小哆_ly 2012-1-16
*/
publicclass LoginImpl implements Login {
@Override
public String login(String username, String password) {
//可用数据库连接查询
User user = new User("admin", "admin");
if ((user.getUserName().equals(username)) && (user.getPassWord().equals(password))) {
return"SUCCESS";
}
return"ERROR";
}
}
【第4步】 编写Spring配置文件WEB-INF/remoting-servlet.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 接口实现类路径 -->
<beanid="loginImpl"class="suning.server.impl.LoginImpl"/>
<!-- 创建远程调用的服务/loginService,服务中注入LoginImpl的实现。 远程需要获得这个远程调用的服务(/loginService,注意名字前有个/ -->
<beanname="/loginService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 声明接口路径 -->
<propertyname="serviceInterface"value="suning.server.Login"/>
<!-- 接口与实现类配置 -->
<propertyname="service"ref="loginImpl"/>
</bean>
</beans>
【第5步】 编写Web项目配置文件WEB-INF/web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>myHessianSpringServer</display-name>
<!-- 用户键入的URL不包含action名称、JSP页面或其他资源,依次寻找文件 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-api</param-name>
<param-value>suning.server.Login</param-value>
</init-param>
<init-param>
<param-name>home-class</param-name>
<param-value>suning.server.impl.LoginImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
【第6步】 编写服务端测试jsp页面index.jsp
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入类 -->
<%@pageimport="com.caucho.hessian.client.HessianProxyFactory"%>
<%@pageimport="suning.server.Login"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>hessian-spring-server</title>
</head>
<body>
<%
// Hessian代理工厂
HessianProxyFactory factory = new HessianProxyFactory();
// 控制台打印
System.out.println("test");
// jsp页面打印
out.println("<h3>test</h3>");
//获得访问配置的Servlet路径
String url = ("http://" + request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/remoting/loginService");
System.out.println(url);
//使用Hessian工厂获得接口的具体实现类
Login login = (Login) factory.create(Login.class, url);
out.println("<h2>" + login.login("admin","admin") + "<h2>");
%>
</body>
</html>
2 创建客户端,不注入Spring
【Java Project】
导入hessian-4.0.7.jar
【第1步】 创建客户端接口suning.server.Login.java
package suning.server;
/**
*
* hessian 服务接口,用于客户端调用
* Hessian建立的远程调用,是对服务的接口进行调用
*
* @author 莫小哆_ly 2012-1-16
*/
publicinterface Login {
/**
* 登录服务
* @return
*/
public String login(String username,String password);
}
【第2步】 编写客户端测试类suning.client.SimpleTest.java
package suning.client;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
import suning.server.Login;
/**
* 客户端测试[Java Project]
*
* @author 莫小哆_ly 2012-1-16
*/
publicclass SimpleTest {
publicstaticvoid main(String[] args) {
// 2. 未用Spring配置
String url = "http://10.21.140.47:8080/myHessianSpringServer/remoting/loginService";
HessianProxyFactory factory = new HessianProxyFactory();
Login loginOpera;
try {
loginOpera = (Login) factory.create(Login.class, url);
// 直接调用接口方法,实际通过服务器端执行实现类方法,返回结果
System.out.println("远程调用:" + loginOpera.login("1", "admin"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
// 3. 未用Spring配置
url = "http://10.21.140.47:8080/myHessianSpringServer/login";
factory = new HessianProxyFactory();
try {
loginOpera = (Login) factory.create(Login.class, url);
// 直接调用接口方法,实际通过服务器端执行实现类方法,返回结果
System.out.println("远程调用:" + loginOpera.login("admin", "admin"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
3 创建客户端,同样注入Spring
【Dynamic Web Project】
导入jar包
【第1步】 创建客户端接口suning.server.Login.java
package suning.server;
/**
*
* hessian 服务接口,用于客户端调用
* Hessian建立的远程调用,是对服务的接口进行调用
*
* @author 莫小哆_ly 2012-1-16
*/
publicinterface Login {
/**
* 登录服务
* @return
*/
public String login(String username,String password);
}
【第2步】 创建Spring配置文件suning.resource.bean.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<beanid="myHessianSpringClient"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<!-- 本地调用服务URL -->
<propertyname="serviceUrl">
<value>http://10.21.140.47:8080/myHessianSpringServer/remoting/loginService
</value>
</property>
<!-- 本地接口路径 -->
<propertyname="serviceInterface">
<value>suning.server.Login</value>
</property>
</bean>
</beans>
【第3步】 编写Web项目配置文件WEB-INF/web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"version="2.5">
<display-name>hessianSpringClient</display-name>
<!-- 设置Spring容器加载配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- /com/resources/applicationContext.xml -->
<param-value>classpath:/suning/resource/bean.xml</param-value>
</context-param>
<!--Spring ApplicationContext 载入 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
【第4步】 编写客户端测试类suning.client.SimpleTest.java
package suning.client;
import java.net.MalformedURLException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.caucho.hessian.client.HessianProxyFactory;
import suning.server.Login;
/**
* 客户端测试[Web Project]
*
* @author 莫小哆_ly 2012-1-16
*/
publicclass SimpleTest {
publicstaticvoid main(String[] args) {
// 1. 服务器端注入Spring
// 1.1 客户端注入Spring
// 分析Spring配置文档
ApplicationContext appContext = new ClassPathXmlApplicationContext(
"suning/resource/bean.xml");
// 获取配置的bean - bean.xml
Login loginSpringOpera = (Login) appContext.getBean("myHessianSpringClient");
// 直接调用接口方法,实际通过服务器端执行实现类方法,返回结果
System.out.println("远程调用:" + loginSpringOpera.login("admin", "admin"));
// 1.2 客户端未注入Spring[可以创建Java Project]
String url = "http://10.21.140.47:8080/myHessianSpringServer/remoting/loginService";
HessianProxyFactory factory = new HessianProxyFactory();
Login loginOpera;
try {
loginOpera = (Login) factory.create(Login.class, url);
// 直接调用接口方法,实际通过服务器端执行实现类方法,返回结果
System.out.println("远程调用:" + loginOpera.login("1", "admin"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
// 2. 服务器端及客户端都未注入Spring
url = "http://10.21.140.47:8080/myHessianSpringServer/login";
factory = new HessianProxyFactory();
try {
loginOpera = (Login) factory.create(Login.class, url);
// 直接调用接口方法,实际通过服务器端执行实现类方法,返回结果
System.out.println("远程调用:" + loginOpera.login("admin", "admin"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
4 运行
run as Server --- hessianSpringServer
run as Server --- hessianSpringClient(客户端为Java Project时,不需要运行)
run as Java Aplication --- hessianSpringClient /suning/client/SimpleTest.java