Spring HTTP Invoker 學習小記

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新增以下配置文件
    <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名字保持一致)配置以下
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans>
    	<bean id="userService" class="org.felix.service.impl.UserServiceImpl" />
    	<!-- 基於Url映射方式,這個配置,就是把userService接口,提供給遠程調用 -->
    	<bean id="httpService"  class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
            <property name="service" ref="userService"/>
            <property name="serviceInterface" value="org.felix.service.UserService"/>
        </bean>
        <!-- 遠程服務的URL -->
        <bean
            class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
             <property name="mappings">
                <props>
                      <prop key="/test">httpService</prop>
                </props>
            </property>
        </bean>
    </beans>

  5. 創建相關類和包結構,以下圖所示

  6. 各種代碼以下
    User類,須要實現Serializable 接口
    package org.felix.model;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
    	
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private String name;
    	private String password;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	
    }
    UserService接口
    package org.felix.service;
    
    import org.felix.model.User;
    
    public interface UserService {
    	void add(User u);
    }
    UserService接口的實現類UserServiceImpl
    package org.felix.service.impl;
    
    import org.felix.model.User;
    import org.felix.service.UserService;
    
    public class UserServiceImpl implements UserService {
    
    	@Override
    	public void add(User u) {
    		System.out.println("add user[" + u.getName() + "]");
    	}
    
    }

配置客戶端
  1. 複製服務端工程,重命名一下,工程結構以下圖

  2. src目錄下新建application-servlet.xml配置以下
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans>
    	<bean id="httpTestService"
    	class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
    		<property name="serviceUrl">
    			<value>http://localhost:8080/felix_0400_SpringHttp_Server/test</value>
    		</property>
    		<property name="serviceInterface">
    			<value>org.felix.service.UserService</value>
    		</property>
    	</bean>
    </beans>
  3. 新建測試類TestSpringHttp代碼以下
    import org.felix.model.User;
    import org.felix.service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    public class TestSpringHttp {
    	private static ApplicationContext context = new ClassPathXmlApplicationContext("application-servlet.xml");
    	
    	public static UserService getUserService(){
    		return (UserService)context.getBean("httpTestService");
    	}
    	public static void main(String[] args) {
    		User user = new User();
    		user.setName("felix");
    		user.setPassword("felix");
    		getUserService().add(user);
    	}
    }

  4. 運行程序在控制檯輸出以下

參考文章 java

  1. Spring中HttpInvoker遠程調用使用實例

  2. Spring HTTP Invoker例子 web

  3. 《Spring技術內幕》學習筆記17——Spring HTTP調用器實現遠程調用

相關文章
相關標籤/搜索