Spring HTTP Invoker使用

Spring HTTP Invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用,也就是说,可以通过防火墙,并使用java的序列化机制在网络间传递对象。客户端可以很轻松的像调用本地对象一样调用远程服务器上的对象,要注意的一点是,服务端、客户端都是使用Spring框架。


整体流程如下: 

1.服务器端:通过Spring HTTP Invoker,将服务接口的某个实现类提供为远程服务。 
2.客户端:通过Spring HTTP Invoker代理,向服务端发送请求,远程调用服务端接口。 

注意事项:由于是通过网络传输,所以服务端、客户端的POJO类,都要实现Serializable接口,进行序列化、反序列化。

Spring HTTP Invoker有两种实现方式 
1.基于Url映射方式,远程系统处理请求的方式同SpringMVC的controller类似,所有的请求通过在web.xml中的 org.springframework.web.servlet.DispatcherServlet统一处理,根据url映射,去对应的 【servlet名称-servlet.xml】文件中,查询跟请求的url匹配的bean配置

2.基于Servlet方式,由org.springframework.web.context.support.HttpRequestHandlerServlet去拦截url- pattern匹配的请求,如果匹配成功,去ApplicationContext中查找name与servlet-name一致的bean,完成远程方法调用。

下面我们使用第一种方式实现测试。

1.在pom.xml添加依赖jar包

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.             <groupId>org.springframework</groupId>  
  3.             <artifactId>spring-context</artifactId>  
  4.             <version>4.0.9.RELEASE</version>  
  5.         </dependency>  
  6.         <dependency>  
  7.             <groupId>org.springframework</groupId>  
  8.             <artifactId>spring-expression</artifactId>  
  9.             <version>4.0.9.RELEASE</version>  
  10.         </dependency>  
  11.         <dependency>  
  12.             <groupId>org.springframework</groupId>  
  13.             <artifactId>spring-web</artifactId>  
  14.             <version>4.0.9.RELEASE</version>  
  15.         </dependency>  
  16.         <dependency>  
  17.             <groupId>org.springframework</groupId>  
  18.             <artifactId>spring-webmvc</artifactId>  
  19.             <version>4.0.9.RELEASE</version>  
  20.         </dependency>  
  21.         <dependency>  
  22.             <groupId>org.springframework</groupId>  
  23.             <artifactId>spring-tx</artifactId>  
  24.             <version>4.0.9.RELEASE</version>  
  25.         </dependency>  
  26.         <dependency>  
  27.             <groupId>commons-fileupload</groupId>  
  28.             <artifactId>commons-fileupload</artifactId>  
  29.             <version>1.3.1</version>  
  30.         </dependency>  
  31.         <dependency>  
  32.             <groupId>org.apache.httpcomponents</groupId>  
  33.             <artifactId>httpclient</artifactId>  
  34.             <version>4.3.2</version>  
  35.         </dependency>  

2.定义接口及实现类

User.Java

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.slimsmart.spring.httpinvoker.demo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class User implements Serializable{  
  6.   
  7.     private static final long serialVersionUID = 1L;  
  8.       
  9.     private String name;  
  10.     private int age;  
  11.       
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     @Override  
  25.     public String toString() {  
  26.         return "name="+name+",age="+age;  
  27.     }  
  28. }  
UserService.java

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.slimsmart.spring.httpinvoker.demo;  
  2.   
  3. public interface UserService {  
  4.     User getUser(User user);  
  5. }  
UserServiceImpl.java
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.slimsmart.spring.httpinvoker.demo;  
  2.   
  3. public class UserServiceImpl implements UserService{  
  4.   
  5.     public User getUser(User user) {  
  6.         System.out.println(user.toString());  
  7.         user.setAge(100);  
  8.         user.setName("Hello "+user.getName());  
  9.         return user;  
  10.     }  
  11. }  

3.服务端spring配置

applicationContext.xml

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  6.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  7.                 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  8.                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"  
  9.     default-lazy-init="true">  
  10.   
  11.     <description>spring invoker服务</description>  
  12.     <bean id="userServiceimpl" class="cn.slimsmart.spring.httpinvoker.demo.UserServiceImpl" />  
  13. </beans>  
applicationContext-httpinvoker-exporter.xml

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  6.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  7.                 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  8.                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"  
  9.     default-lazy-init="true">  
  10.   
  11.     <description>spring invoker服务</description>  
  12.   
  13.     <!-- 通过Spring HttpInvoker机制暴露远程访问服务 -->    
  14.     <bean name="/userService" id="userServiceExporter"  
  15.         class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">  
  16.         <property name="service" ref="userServiceimpl"/>  
  17.         <property name="serviceInterface" value="cn.slimsmart.spring.httpinvoker.demo.UserService" />  
  18.     </bean>  
  19.       
  20.     <!--  也可以使用如下配置,制定调用注册地址   
  21.      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">    
  22.         <property name="mappings">    
  23.             <props>    
  24.                 <prop key="/userService">userServiceExporter</prop>    
  25.             </props>    
  26.         </property>    
  27.      </bean>   
  28.     -->  
  29. </beans>  

4.web.xml配置

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     id="WebApp_ID" version="2.5">  
  6.     <display-name>web_demo</display-name>  
  7.       
  8.     <!-- 加载服务配置文件 -->    
  9.     <context-param>    
  10.        <param-name>contextConfigLocation</param-name>    
  11.        <param-value>classpath*:/applicationContext.xml</param-value>    
  12.     </context-param>    
  13.       
  14.     <listener>  
  15.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  16.     </listener>  
  17.       
  18.     <servlet>  
  19.         <servlet-name>dispatcherServlet</servlet-name>  
  20.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  21.         <init-param>  
  22.             <param-name>contextConfigLocation</param-name>  
  23.             <param-value>classpath*:/applicationContext-httpinvoker-exporter.xml</param-value>  
  24.         </init-param>  
  25.          <!-- 配置该Servlet随应用启动时候启动 -->    
  26.         <load-on-startup>1</load-on-startup>  
  27.     </servlet>  
  28.       
  29.     <servlet-mapping>  
  30.         <servlet-name>dispatcherServlet</servlet-name>  
  31.         <url-pattern>/remoting/*</url-pattern>  
  32.     </servlet-mapping>  
  33.       
  34.       
  35.     <session-config>  
  36.         <session-timeout>30</session-timeout>  
  37.     </session-config>  
  38.       
  39.     <welcome-file-list>  
  40.         <welcome-file>index.html</welcome-file>  
  41.     </welcome-file-list>  
  42.       
  43. </web-app>  

5.客户端spring配置

applicationContext-httpinvoker-client.xml

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  6.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  7.                 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  8.                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"  
  9.     default-lazy-init="true">  
  10.   
  11.     <description>spring invoker服务</description>  
  12.   
  13.     <bean id="httpInvokerRequestExecutor"  
  14.         class="org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor">  
  15.         <property name="connectTimeout" value="3000" />  
  16.         <property name="readTimeout" value="60000" />  
  17.     </bean>  
  18.   
  19.     <bean id="userService"  
  20.         class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
  21.         <property name="serviceUrl"  
  22.             value="http://127.0.0.1:8080/spring-httpinvoker-demo/remoting/userService" />  
  23.         <property name="serviceInterface"  
  24.             value="cn.slimsmart.spring.httpinvoker.demo.UserService" />  
  25.         <!--  默认HttpInvokerProxy使用了JDK的HTTP功能,但是了你也可以使用Apache的HttpComponents客户端来设置httpInvokerRequestExecutor属性  -->  
  26.         <property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecutor" />  
  27.     </bean>  
  28. </beans>  

6.客户端调用

UserServiceTest.java

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.slimsmart.spring.httpinvoker.demo;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class UserServiceTest {  
  7.   
  8.     public static void main(String[] args) {  
  9.         @SuppressWarnings("resource")  
  10.         ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-httpinvoker-client.xml");  
  11.         UserService userService = (UserService)context.getBean("userService");  
  12.         User user = new User();  
  13.         user.setAge(25);  
  14.         user.setName("张三");  
  15.         System.out.println(userService.getUser(user));;  
  16.     }  
  17. }  
工程代码: http://download.csdn.net/detail/tianwei7518/8466547
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值