Spring HTTP Invoker

来源:互联网 发布:seo软件 编辑:程序博客网 时间:2024/06/16 09:01
Spring HTTP Invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用,也就是说,可以通过防火墙,并使用java的序列化机制在网络间传递对象。客户端可以很轻松的像调用本地对象一样调用远程服务器上的对象,要注意的一点是,服务端、客户端都是使用Spring框架。下面通过一个例子,来 讲解Spring HTTP Invoker的使用,这里使用的是Spring2.5.6框架
Spring HTTP Invoker的整体流程如下 (下图显示整个调用的过程)
  1. 客户端
    1. 向服务器发送远程调用请求
      远程调用信息-->封装为远程调用对象-->序列化写入到远程调用http请求中-->向服务器端发送
    2. 接收服务器端返回的远程调用结果
      服务器端返回的远程调用结果HTTP响应——>反序列化为远程调用结果对象
  2. 服务端
    1. 接收客户端发送的远程调用请求
      客户端发送的远程调用HTTP请求——>反序列化为远程调用对象——>调用服务器端目标对象的目标方法处理
    2. 向客户端返回远程调用结果
      服务器端目标对象方法的处理结果——>序列化写入远程调用结果HTTP响应中——>返回给客户端。


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. 建立web项目
  2. 导入jar包
    1. spring.jar
    2. spring-webmvc.jar
    3. commons-logging-1.1.2.jar
  3. 在web.xml新增如下配置文件
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <servlet>
            <servlet-name>application</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
          
        <servlet-mapping>
            <servlet-name>application</servlet-name>
            <url-pattern>/*</url-pattern>
    </servlet-mapping>

  4. WEB-INF下增加application-servlet.xml(注意xml文件的命名,这里的application要和servlet-name名字保持一致)配置如下
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?xmlversion="1.0"encoding="UTF-8"?>
    <!DOCTYPEbeans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans>
        <beanid="userService"class="org.felix.service.impl.UserServiceImpl"/>
        <!-- 基于Url映射方式,这个配置,就是把userService接口,提供给远程调用 -->
        <beanid="httpService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
            <propertyname="service"ref="userService"/>
            <propertyname="serviceInterface"value="org.felix.service.UserService"/>
        </bean>
        <!-- 远程服务的URL -->
        <bean
            class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
             <propertyname="mappings">
                <props>
                      <propkey="/test">httpService</prop>
                </props>
            </property>
        </bean>
    </beans>

  5. 建立相关类和包结构,如下图所示

  6. 各类代码如下
    User类,需要实现Serializable接口
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package org.felix.model;
     
    import java.io.Serializable;
     
    public class User implementsSerializable {
         
        /**
         *
         */
        privatestatic final long serialVersionUID = 1L;
        privateString name;
        privateString password;
        publicString getName() {
            returnname;
        }
        publicvoid setName(String name) {
            this.name = name;
        }
        publicString getPassword() {
            returnpassword;
        }
        publicvoid setPassword(String password) {
            this.password = password;
        }
         
    }
    UserService接口
    ?
    1
    2
    3
    4
    5
    6
    7
    package org.felix.service;
     
    import org.felix.model.User;
     
    public interface UserService {
        voidadd(User u);
    }
    UserService接口的实现类UserServiceImpl
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package org.felix.service.impl;
     
    import org.felix.model.User;
    import org.felix.service.UserService;
     
    public class UserServiceImpl implementsUserService {
     
        @Override
        publicvoid add(User u) {
            System.out.println("add user["+ u.getName() + "]");
        }
     
    }

配置客户端
  1. 复制服务端工程,重命名一下,工程结构如下图

  2. src目录下新建application-servlet.xml配置如下
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xmlversion="1.0"encoding="UTF-8"?>
    <!DOCTYPEbeans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans>
        <beanid="httpTestService"
        class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
            <propertyname="serviceUrl">
                <value>http://localhost:8080/felix_0400_SpringHttp_Server/test</value>
            </property>
            <propertyname="serviceInterface">
                <value>org.felix.service.UserService</value>
            </property>
        </bean>
    </beans>
  3. 新建测试类TestSpringHttp代码如下
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import org.felix.model.User;
    import org.felix.service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
     
    public class TestSpringHttp {
        privatestatic ApplicationContext context =new ClassPathXmlApplicationContext("application-servlet.xml");
         
        publicstatic UserService getUserService(){
            return(UserService)context.getBean("httpTestService");
        }
        publicstatic void main(String[] args) {
            User user =new User();
            user.setName("felix");
            user.setPassword("felix");
            getUserService().add(user);
        }
    }

0 0
原创粉丝点击