《pro Spring》学习笔记之Spring HTTP 远程方法调用

原创 2007年09月22日 16:59:00

除了使用Spring集成RMI,AXIS来实现Webservice,Spring也提供了一套自身的类WebService 实现,这就是传说中《Spring HTTP Invoker》,下面我们来看如何使用

同样,本文分别服务端和客户端两个projcet

服务端:

服务接口:

 

package ch16.SimpleHTTP;
public interface HelloWorld ...{
    
public String getMessage();
}

 

服务实现

 

package ch16.SimpleHTTP;
public class SimpleHelloWorld implements HelloWorld ...{
    
public String getMessage() ...{
        
return "hello world http";
    }

}

 

使用Spring配置文件发布一个HTTP调用者服务HttpInvoker-servlet.xml(命名问题后面会有介绍)

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
    
xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>

<bean name="/helloWorld" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
  
<property name="service">
    
<bean class="ch16.SimpleHTTP.SimpleHelloWorld"/>
  
</property>
  
<property name="serviceInterface">
    
<value>ch16.SimpleHTTP.HelloWorld</value>
  
</property>
</bean>
</beans>

 

这个配置清晰易懂,但需要注意HttpInvokerServiceExporter被指定为/helloWorld,当处理请求时候,Spring的DispatcherServlet使用定义了的HandlerMapping去寻找被定义了路由请求的控制器,在这个例子中,我们定义了一个BeanNameUrlHandlerMapping当作我们唯一的HandlerMapping的实现,顾名思义,BeanNameUrlHandlerMapping将被用来根据进入的请求来映射到不同的URL所以在这个例子中,如果某个进入的请求URI(去掉主机名,上下文路径,servlet映射后)是/helloWorld,BeanNameHandlerMapping将路它到/helloWorld

我们的配置文件是通ContextLoaderServlet加载,默认的defaultHandlerMapping和上配置文件的内容都是由DispatcherServlet加载,所以,对文件的命名非常重要,需要把文件放到WEB-INF目录下,并且命名为<servlet-name-servlet.xm的方式,这里由于web.xml中servle名为httpInvoke,顾命名为httpInvoker-servlet.xml

web.xml

 

<context-param>
      
<param-name>contextConfigLocation</param-name>
      
<param-value>/WEB-INF/httpInvoker-servlet.xml</param-value>
</context-param>
  
<servlet>
      
<servlet-name>httpInvoker</servlet-name>
      
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      
<load-on-startup>3</load-on-startup>
    
</servlet>
  
   
<servlet-mapping>
    
<servlet-name>httpInvoker</servlet-name>
    
<url-pattern>/http/*</url-pattern>
  
</servlet-mapping>

 

客户端:

首先把服务端的服务接口打包成jar,放到客户端的classpath下,或直接copy接口文件

客户端配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
    
xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="helloWorldService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
  
<property name="serviceUrl">
    
<value>http://localhost:81/ProSpringStudyWeb/http/helloWorld</value>
  
</property>
  
<property name="serviceInterface">
    
<value>ch16.SimpleHTTP.HelloWorld</value>
  
</property>
</bean>
</beans>

 

测试代码:

 

package ch16.SimpleHTTP;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test ...{

    
public static void main(String[] args) ...{
        ApplicationContext context 
= new ClassPathXmlApplicationContext("ch16/SimpleHTTP/applicationContext.xml");
        HelloWorld helloWorld
=(HelloWorld)context.getBean("helloWorldService");
        System.out.println(helloWorld.getMessage());
    }


}


 

运行客户端后运行测试程序,后台可打印出:

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
hello world http

《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端...

《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务...
  • chjttony
  • chjttony
  • 2011年06月18日 17:30
  • 12055

《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端...
  • lcczzu
  • lcczzu
  • 2015年07月16日 10:59
  • 211

Spring学习笔记之使用远程服务

远程调用是客户端应用和服务端应用之间的会话。在客户端,它所需要的一些功能并不在该应用的实现范围之内,所以应用要想能提供这些功能的·其他系统寻求帮助。而远程应用通过远程服务暴露这些功能。 RPC(re...

Spring 学习笔记(七)——远程服务

一、Spring 使用 RMI

《Spring技术内幕》学习笔记19——Spring RMI实现远程调用

1.Spring除了使用基于HTTP协议的远程调用方案,还为开发者提供了基于RMI机制的远程调用方法,RMI远程调用网络通信实现是基于TCP/IP协议完成的,而不是通过HTTP协议。 在Spring...
  • lcczzu
  • lcczzu
  • 2015年07月16日 11:00
  • 412

《Spring技术内幕》学习笔记18——Spring使用Hessian实现远程调用

1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持。 Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实...

《Spring技术内幕》学习笔记18——Spring使用Hessian实现远程调用

1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持。 Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用...
  • chjttony
  • chjttony
  • 2011年06月25日 16:18
  • 14206

Pro Android学习笔记(七九):服务(4):远程服务的实现

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/ 在上一学习中,我们已经用AIDL定义了R...

Pro Android学习笔记(八十):服务(5):访问远程服务

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/ 和Local service不同,rem...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《pro Spring》学习笔记之Spring HTTP 远程方法调用
举报原因:
原因补充:

(最多只允许输入30个字)