一、简单介绍下:Spring HTTP invoker 是 spring 框架中的一个远程调用模型,执行基于 HTTP 的远程调用,具体实体类需要序
列化,如此才可以实现网络间对象的传递,以便客户端调用远程服务器上的对象。主要使用了三个重要对象:
HttpInvokerServiceExporter绑定接口及接口实现,由此可知spring需配置两个属性,serviceInterface及service。
HttpRequestHandlerServlet将客户端请求转给同名bean(即下面需要配置的服务名称)。
HttpInvokerProxyFactoryBean绑定服务端URL及服务端设定的接口,由此可知spring需配置两个属性,serviceUrl及
serviceInterface。废话不多说,看实现。
二、具体实现如下:
1、jar包准备:commons-logging-1.1.jar;spring-2.5.6.jar
2、服务端:
(1)新建个实体对象,实现serializable接口
package com.erayt.domain;
import java.io.Serializable;
public class User implements Serializable{
private String userName;
private String passWord;
private int age;
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 getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [userName=" + userName + ", passWord=" + passWord
+ ", age=" + age + "]";
}
}
(2)新建接口类
package com.erayt.service;
import com.erayt.domain.User;
public interface IUserHttpService {
public void addUser(User user);
}
(3)简单实现(2)中的接口
package com.erayt.service.impl;
import com.erayt.domain.User;
import com.erayt.service.IUserHttpService;
public class UserHttpServiceImpl implements IUserHttpService {
public void addUser(User user) {
System.out.println(user);
}
}
(4)配置spring,在Spring配置文件中声明一个HttpInvokerServiceExporter类的bean,共三部分
--服务名称(如userExporter)
--服务类型(如com.erayt.service.IUserHttpService )
--服务实现类,一般引用其它bean(如userHttpService)
(5)web.xml配置,在web.xml中声明一个与服务与服务名称同名的Servlet(当然这个Servlet类Spring已经提供即HttpRequestHandlerServlet,这家伙的作用就是直接把请求扔给同名的bean),然后声明servlet-mapping将其map到指定URL,这样客户就可以通过这个URL访问到对应服务。
JavaRemoteCall
contextConfigLocation
classpath:applicationContext.xml
userExporter
org.springframework.web.context.support.HttpRequestHandlerServlet
userExporter
/remoting/RMI
org.springframework.web.context.ContextLoaderListener
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
3、客户端
(1)在spring bean配置文件中创建一个类HttpInvokerProxyFactoryBean的bean,指定serviceUrl属性为服务器端的服务提供的URL,serviceInterface属性为服务器端配置的服务类型。
http://localhost:8085/JavaRemoteCall/remoting/RMI
com.erayt.service.IUserHttpService
(2)新建接口,需与服务端保持一致
package com.erayt.service;
import com.erayt.domain.User;
public interface IUserHttpService {
public void addUser(User user);
}
(3)客户端测试类(前提服务端要部署到Tomcat并启动着)
package com.erayt.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.erayt.domain.User;
import com.erayt.service.IUserHttpService;
public class RMITest {
public static void main(String[] args) {
try{
ApplicationContext ctx= new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
IUserHttpService batchService=(IUserHttpService)ctx.getBean("userProvider");
User user = new User();
user.setUserName("张三");
user.setPassWord("123");
user.setAge(18);
batchService.addUser(user);
}catch(Exception e){
e.printStackTrace();
System.exit(1);//同步调用失败
}
}
}
结果如下:User [userName=张三, passWord=123, age=18]