您的位置:首页 > 理论基础 > 计算机网络

spring httpinvoker

2013-08-18 13:11 344 查看
14.7 使用httpInvoker提供远程服务
使用HttpInvoker,不需要额外的类库。和Hessian的轻量级传输协议不同的是,Spring
HttpInvoker使用Java序列化来序列化参数和返回值,然后基于HTTP协议传输经序列化后的对象。当参数或返回值是复杂类型,并且不能通过Hessian的序列化机制序列化时,HttpInvoker就很有优势。
14.7.1
输出业务对象
14.7.2
客户端连接服务
14.7.1输出业务对象
通过HttpInvoker提供远程服务与Hessian非常相似:Spring为Hessian提供HessianServiceExporter,Spring为HttpInvoker提供HttpInvokerServiceExporter。该类也可将普通baen实例输出成远程服务。配置方法与HessianServiceExporter也非常相似。
下面是使用HttpInvokerServiceExporter提供远程服务的示例。在该示例里,远程服务bean的方法会返回一个Person对象,注意:Person对象必须实现Serializable或Externalizable接口,因为采用了Java序列化机制来传输参数和返回值。下面是远程服务提供类:
public class HelloImpl implements Hello

{
//远程服务方法,该方法返回一个可序列化的对象
public Person hello(String name)

{
Person p = new Person();
p.setName(name);
p.setAge(13);
return p;
}
}
下面是Person的实现类,该类实现了Serializable接口:
public class Person implements Serializable
{
//Person类的两个属性
private String name;
private int age;
//name属性的getter方法
public String getName()
{
return name;
}
//name属性的setter方法
public void setName(String name)

{
this.name = name;
}
//age属性的getter方法
public int getAge()
{
return age;
}
//age属性的setter方法
public void setAge(int age)
{
this.age = age;
}
}
然后修改web.xml配置文件,该配置文件里,需要让DispatcherServlet拦截匹配模式的请求,该请求由DispatcherServlet转发给context中对应的bean处理。修改后的web.xml配置文件如下:
<?xml version="1.0"encoding="ISO-8859-1"?>

<!-- Web应用配置文件的文件头,包含dtd等信息-->

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTDWeb Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- Web应用配置文件的根元素-->

<web-app>
<!-- 配置DispatcherServlet-->

<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置该Servlet随应用启动时候启动-->

<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置DispatcherServlet映射的url-->

<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
</web-app>
上面配置文件中,没有使用ContextLoaderListener来初始化ApplicationContext,也没有指定ApplicationContext配置文件的位置。这些都是通过DispatcherServlet默认加载的,DispatcherServlet在创建时,会加载ApplicationContext,默认查找的配置文件为:[servlet-name]-servlet.xml文件。对该配置默认加载remoting-servlet.xml文件。因此,在WEB-INF下提供remoting-servlet.xml文件即可。remoting-servlet.xml文件如下:
<?xml version="1.0"encoding="UTF-8"?>

<!-- Spring配置文件的文件头,包含dtd等信息-->

<!DOCTYPE beans PUBLIC"-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- Spring配置文件的根元素-->

<beans>
<!-- 配置业务服务bean-->

<bean id="helloService"class="lee.HelloImpl"/>

<!-- 将业务服务bean暴露成远程服务-->

<bean name="/helloService"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<!-- 指定需要暴露的业务服务bean-->

<property name="service"ref="helloService"/>

<!-- 指定暴露的远程服务实现的接口-->

<propertyname="serviceInterface" value="lee.Hello"/>

</bean>
</beans>
DispatcherServlet转发请求的默认策略是:将请求转发到context中与请求同名的bean。上面配置中远程服务的url为:http://localhost:8888/httpInvoker/remoting/helloService,其中httpInvoker为该应用的虚拟路径。

14.7.2客户端连接服务
Spring提供了HttpInvokerProxyFactoryBean工厂bean连接服务。类似于Hessian的HessianProxyFactoryBean,配置HttpInvokerProxyFactoryBean时,只需指定服务的url以及服务实现的接口。通过使用代理,Spring可将调用转换成POST请求发送到指定服务。详细的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring配置文件的文件头,包含dtd等信息-->

<!DOCTYPE beans PUBLIC"-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- Spring配置文件的根元素-->

<beans>
<!-- 配置测试bean,该测试bean依赖于远程服务bean-->

<bean id="test"class="lee.Test">

<!-- 配置依赖注入-->

<property name="hello">
<ref local="helloService"/>
</property>
</bean>
<!-- 配置连接远程服务的bean-->

<bean id="helloService"class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<!-- 远程服务的url-->

<property name="serviceUrl"value="http://localhost:8888/httpInvoker/remoting/helloService"/>

<!-- 远程服务所实现的接口-->

<propertyname="serviceInterface" value="lee.Hello"/>

</bean>
</beans>
通过上面的配置,客户端可以访问httpInvoker提供的服务,默认情况下,HttpInvokerPropxy使用J2SE的HTTP
Client功能。可通过设置httpInvokerRequestExecutor属性使用Commons HttpClient。通过对配置文件简单修改,将
<bean id="helloService"class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<!-- 远程服务的url-->

<property name="serviceUrl"value="http://localhost:8888/httpInvoker/remoting/helloService"/>

<!-- 远程服务所实现的接口-->

<propertyname="serviceInterface" value="lee.Hello"/>

</bean>
修改成:
<bean id="helloService"class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<!-- 远程服务的url-->

<property name="serviceUrl"value="http://localhost:8888/httpInvoker/remoting/helloService"/>

<!-- 远程服务所实现的接口-->

<propertyname="serviceInterface" value="lee.Hello"/>

<!-- 指定使用Commons HttpClient功能-->

<propertyname="httpInvokerRequestExecutor">

<bean
class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"/>
</property>
</bean>

客户端调用:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

"/remote-client.xml");

UserService service = (UserService) applicationContext

.getBean("remoteService");

User user = service.getUser("Tom", "123");

System.out.println(user.getUserName() + "---" + user.getPassWord());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: