至于学习hessian的原因,我这里不再做详细的描述,大家都知道。我这里给出我做一个demo的过程,和过程中遇到的问题,以及解决方式。好,现在开始。
1.创建一个java web工程。
我的工程名字叫做myhsn。
在工程内引入hessian的jar包和servlet-api.jar包,引入原因自己去baidu一下。
这是我的源文件目录
package com.myhsn.vo;
第一个抽象类,该类必须要序列化,否则不能做流的转换和传输。
/**
* @author whk
*
* 2014年6月9日
*/
public class User implements java.io.Serializable{
/**
*
*/
private static final long serialVersionUID = 7303692877211672764L;
private String userName;
private String passWord;
private int sex;
public User(String userName, String passWord, int sex){
super();
this.userName = userName;
this.passWord = passWord;
this.sex = sex;
}
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append(" UserName : ").append(userName).append(" \n ");
sb.append(" passWord : ").append(passWord).append(" \n ");
sb.append(" sex : ").append(sex).append(" \n ");
return sb.toString();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
我定义的调用接口
package com.myhsn.server;
import com.myhsn.vo.User;
/**
* @author whk
*
* 2014年6月9日
*/
public interface HessianServer {
public int addUser(User user);
public int addUser(String userName, String passWord, int sex);
public int editUser(User user);
}
我的接口实现类
package com.myhsn.server.impl;
import com.myhsn.server.HessianServer;
import com.myhsn.vo.User;
/**
* @author whk
*
* 2014年6月9日
*/
public class HessianServerImpl implements HessianServer {
@Override
public int addUser(User user) {
if(user == null){
return 0;
}
System.out.println(user.toString());
return 1;
}
@Override
public int addUser(String userName, String passWord, int sex) {
User user = new User(userName,passWord,sex);
System.out.println(user.toString());
return 1;
}
@Override
public int editUser(User user) {
System.out.println(user.toString());
return 1;
}
}
web.xml文件的配置,配置hessian中定义的servelt.
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>com.myhsn.server.HessianServer</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/adduser</url-pattern>
</servlet-mapping>
好,以上的工作全部完成,(以上都是在网上查到一些资料)启动服务,服务会正常启动。
编写我们的请求客户端代码
hessian要求客户端的调用接口必须和服务端的定义接口的包的路径和包名相同,这句话有点绕,就是在客户端要定义和服务端一样的包路径和接口文件。
package com.myhsn.server;
import com.myhsn.vo.User;
/**
* @author whk
*
* 2014年6月10日
*/
public interface HessianServer {
public int addUser(User user);
public int addUser(String userName, String passWord, int sex);
public int editUser(User user);
}
这个就是客户端定义的调用服务端的接口类。
创建调用函数,随便定义一个就可以了。
我的定义:
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
import com.myhsn.server.HessianServer;
import com.myhsn.vo.User;
public class HsnClient {
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException{
String url = "http://localhost/hsn/adduser";
HessianProxyFactory hpf = new HessianProxyFactory();
HessianServer hs = (HessianServer)hpf.create(url);
User user = new User("ttt","123456",1);
hs.addUser(user);
}
}
那么按照给定的流程,我们完成了所有的工作。现在让我们运行一下我们的客户端程序。
严重: Allocate exception for servlet hessian
java.lang.InstantiationException: com.myhsn.server.HessianServer
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:221)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1206)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
哇哦,咋个回事?咋出错了。
不着急,分析原因,你会发现,是实例化对象的错误,那么我们知道,在调用的时候,我们调用的是服务端的接口,并不是服务端的实现类。那么让我们换成实现类试试,也许奇迹就会出现。
修改我们服务端的web.xml
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>com.myhsn.server.impl.HessianServerImpl</param-value>
</init-param>
</servlet>
改成我们的实现类。
创建客户端的调用接口,之前的那个已经不能用了
package com.myhsn.server.impl;
import com.myhsn.vo.User;
public interface HessianServerImpl {
public int addUser(User user);
public int addUser(String userName, String passWord, int sex);
public int editUser(User user);
}
那么我们再次执行。
信息: JK: ajp13 listening on /0.0.0.0:8011
2014-6-10 10:36:59 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/22 config=null
2014-6-10 10:36:59 org.apache.catalina.startup.Catalina start
信息: Server startup in 348 ms
UserName : ttt
passWord : 123456
sex : 1
预期结果终于出来了,奇迹出现了。至于为什么跟网上写的不一样,我会在后面的章节中做解释。