一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Spring 遠(yuǎn)程http調(diào)用

 木有銀 2011-07-20
核心提示:Spring HTTP invoker簡(jiǎn)介 Spring HTTP invoker是spring框架中的一個(gè)遠(yuǎn)程調(diào)用模型,執(zhí)行基于HTTP的遠(yuǎn)程調(diào)用(意味著可以通過防火墻),并使用java的序列化機(jī)制在網(wǎng)絡(luò)間傳遞對(duì)象??蛻舳丝梢院茌p松的像調(diào)用本地對(duì)象一樣調(diào)用遠(yuǎn)程服務(wù)器上的對(duì)象,這有點(diǎn)類似于we

Spring HTTP invoker簡(jiǎn)介
Spring HTTP invoker是spring框架中的一個(gè)遠(yuǎn)程調(diào)用模型,執(zhí)行基于HTTP的遠(yuǎn)程調(diào)用(意味著可以通過防火墻),并使用java的序列化機(jī)制在網(wǎng)絡(luò)間傳遞對(duì)象??蛻舳丝梢院茌p松的像調(diào)用本地對(duì)象一樣調(diào)用遠(yuǎn)程服務(wù)器上的對(duì)象,這有點(diǎn)類似于webservice,但又不同于webservice,區(qū)別如下:

 

webservice

HTTP invoker

跨平臺(tái),跨語(yǔ)言

只支持java語(yǔ)言

支持SOAP,提供wsdl

不支持

結(jié)構(gòu)龐大,依賴特定的webservice實(shí)現(xiàn),如xfire

結(jié)構(gòu)簡(jiǎn)單,只依賴于spring框架本身

 
項(xiàng)目中使用哪種遠(yuǎn)程調(diào)用機(jī)制取決于項(xiàng)目本身的要求。

 

²        HTTP invoker 服務(wù)模式

 HTTP invoker 服務(wù)模式

 說明:

1.       服務(wù)器端:通過HTTP invoker服務(wù)將服務(wù)接口的某個(gè)實(shí)現(xiàn)類提供為遠(yuǎn)程服務(wù)

2.       客戶端:通過HTTP invoker代理向服務(wù)器端發(fā)送請(qǐng)求,遠(yuǎn)程調(diào)用服務(wù)接口的方法

3.       服務(wù)器端與客戶端通信的數(shù)據(jù)需要序列化

 

配置服務(wù)器端和客戶端的步驟

配置服務(wù)器端
1.       添加springJAR文件

建議使用spring2+.jar版本

2.       創(chuàng)建服務(wù)接口

3.       創(chuàng)建服務(wù)接口的具體實(shí)現(xiàn)類

4.       公開服務(wù)

 

配置客戶端
1.  添加springJAR文件

建議使用spring2+.jar版本

2.       創(chuàng)建服務(wù)接口

3.       訪問服務(wù)

 

實(shí)例講解

服務(wù)器端

1.服務(wù)接口:UcService.java

它提供兩項(xiàng)服務(wù),查詢用戶信息和記錄日志,如下:

  1. public interface UcService {   
  2.   
  3.            public UserInfo getUserInfobyName(String userName);   
  4.   
  5.            public int recordLog(String username, String point, String operate, String desc);   
  6.   
  7. }   

說明:舉這個(gè)列子是因?yàn)槠浔容^有代表性,它將展示普通數(shù)據(jù)類型(int,long等)和復(fù)雜數(shù)據(jù)類型(DTO等)的遠(yuǎn)程調(diào)用方式。UserInfo是一個(gè)普通的DTO,代碼如下:

  1. public class UserInfo implements Serializable {   
  2.   
  3.     private static final long serialVersionUID = -6970967506712260305L;   
  4.   
  5.     /**用戶名*/  
  6.   
  7.     private String userName;   
  8.   
  9.     /**電子郵箱*/  
  10.   
  11.     private String email;   
  12.   
  13.     /**注冊(cè)日期*/  
  14.   
  15.     private Date registDate;   
  16.   
  17.     
  18.   
  19.     public String getUserName() {   
  20.   
  21.         return userName;   
  22.   
  23.     }   
  24.   
  25.     public void setUserName(String userName) {   
  26.   
  27.         this.userName = userName;   
  28.   
  29.     }   
  30.   
  31.     public String getEmail() {   
  32.   
  33.         return email;   
  34.   
  35.     }   
  36.   
  37.     public void setEmail(String email) {   
  38.   
  39.         this.email = email;   
  40.   
  41.     }   
  42.   
  43.      public Date getRegistDate() {   
  44.   
  45.         return registDate;   
  46.   
  47.     }   
  48.   
  49.     public void setRegistDate(Date registDate) {   
  50.   
  51.         this.registDate = registDate;   
  52.   
  53.     }   
  54.   
  55. }   
  56.   

注意:因?yàn)槭窃诰W(wǎng)絡(luò)間傳輸對(duì)象,所以需要將UserInfo實(shí)現(xiàn)Serializable接口,并指定一個(gè)serialVersionUID(任意值即可,同時(shí)客戶端也要有這個(gè)類,否則在客戶端接收對(duì)象時(shí)會(huì)因?yàn)閟erialVersionUID不匹配而出現(xiàn)異常)

 回到UcService.java,它提供了兩個(gè)服務(wù)(在這里一個(gè)方法代表一個(gè)服務(wù)功能),我們需要具體的實(shí)現(xiàn)類來實(shí)現(xiàn)真正的服務(wù)

 

2.實(shí)現(xiàn)類是UCServiceImpl.java

  1. public class UCServiceImpl implements UcService {   
  2.   
  3.     private static Logger pointrecordlog = Logger.getLogger("pointrecordlog");   
  4.   
  5.     private static Logger logger = Logger.getLogger(UCServiceImpl.class);   
  6.   
  7.     private UcFacade ucFacade;   
  8.   
  9.     public void setUcFacade(UcFacade ucFacade) {   
  10.   
  11.         this.ucFacade = ucFacade;   
  12.   
  13.     }   
  14.   
  15.     public UserInfo getUserInfobyName(String userName) {   
  16.   
  17.         UserInfo user = null;   
  18.   
  19.         try {   
  20.   
  21.             user = ucFacade.getUserInfoDetail(userName);   
  22.   
  23.             logger.debug("get userinfo success by  username:" + userName);   
  24.   
  25.         } catch (Throwable t) {   
  26.   
  27.             logger.error("get userinfo fail by  username:" + userName, t);   
  28.   
  29.         }   
  30.   
  31.         return user;   
  32.   
  33.     }   
  34.   
  35.     public int recordLog(String username, String point, String operate, String desc) {   
  36.   
  37.         int result = 0;   
  38.   
  39.         try {   
  40.   
  41.             pointrecordlog.info(username + " - " + point + " - " + operate + " - " + desc);   
  42.   
  43.         } catch (Throwable t) {   
  44.   
  45.             result = -1;   
  46.   
  47.             logger.error(t);   
  48.   
  49.         }   
  50.   
  51.         return result;   
  52.   
  53.     }   
  54.   
  55. }   
  56.   

說明:ucFacade是通過spring注入的一個(gè)數(shù)據(jù)查詢類,因?yàn)樗chttp invoker沒有直接關(guān)系,所以不進(jìn)行介紹。

3.公開服務(wù)UcService.java

²        WEB-INF/application-context.xml:將接口聲明為HTTP invoker服務(wù)

  1. <bean id="httpService"  
  2.   
  3.         class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">  
  4.   
  5.         <property name="service">  
  6.   
  7.             <ref bean="ucService" />  
  8.   
  9.         </property>  
  10.   
  11.         <property name="serviceInterface"  
  12.   
  13.             value="com.netqin.baike.service.UcService">  
  14.   
  15.         </property>  
  16.   
  17.     </bean>  
  18.   
  19.     <bean id="ucService" class="com.netqin.baike.service.impl.UCServiceImpl"/>  
  20.   

說明:HttpInvokerServiceExporter實(shí)際上是一個(gè)spring mvc控制器,它處理客戶端的請(qǐng)求并調(diào)用服務(wù)實(shí)現(xiàn)。

²         WEB-INF/service-servlet.xml:HttpInvokerServiceExporter實(shí)際上是一個(gè)spring mvc控制器,所以需要為其提供spring URL 處理器,這里我們使用SimpleUrlHandlerMapping

  1. <bean  
  2.   
  3.         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  4.   
  5.          <property name="mappings">  
  6.   
  7.             <props>  
  8.   
  9.                   <prop key="/httpService">httpService</prop>  
  10.   
  11.             </props>  
  12.   
  13.         </property>  
  14.   
  15.     </bean>  
  16.   

²         WEB-INF/web.xml:配置spring監(jiān)聽及DispatcherServlet

  1. <context-param>  
  2.   
  3.         <param-name>contextConfigLocation</param-name>  
  4.   
  5.         <param-value>  
  6.   
  7.             /WEB-INF/application-context.xml   
  8.   
  9.         </param-value>  
  10.   
  11.     </context-param>  
  12.   
  13.     
  14.   
  15.     <listener>  
  16.   
  17.         <listener-class>  
  18.   
  19.             org.springframework.web.context.ContextLoaderListener   
  20.   
  21.         </listener-class>  
  22.   
  23.     </listener>  
  24.   
  25.     
  26.   
  27. <servlet>  
  28.   
  29.         <servlet-name>service</servlet-name>  
  30.   
  31.         <servlet-class>  
  32.   
  33.             org.springframework.web.servlet.DispatcherServlet   
  34.   
  35.         </servlet-class>  
  36.   
  37.         <load-on-startup>1</load-on-startup>  
  38.   
  39.     </servlet>  
  40.   
  41.     
  42.   
  43.     <servlet-mapping>  
  44.   
  45.         <servlet-name>service</servlet-name>  
  46.   
  47.         <url-pattern>/service/*</url-pattern>  
  48.   
  49.     </servlet-mapping>  
  50.   

說明:不了解為什么這么配置的可以去看看spring mvc方面的資料。

好了,經(jīng)過以上配置,一個(gè)基于spring HTTP invoker的遠(yuǎn)程服務(wù)就完成了,服務(wù)的地址為:

http://${serviceName}:${port}/${contextPath}/service/httpService

 

客戶端

1.       創(chuàng)建服務(wù)接口及網(wǎng)絡(luò)間傳輸?shù)腄TO類

為了方便,可以將服務(wù)器端創(chuàng)建好的的UcService.java和UserInfo.java拷貝到客戶端,或打個(gè)jar包放到lib下。

2.       配置訪問服務(wù)

²       WEB-INF/application-context.xml:如果項(xiàng)目中已經(jīng)存在spring配置文件,則不需要?jiǎng)?chuàng)建該文件,需要配置HTTP invoker的代理

  1. <bean id="httpService"  
  2.   
  3. class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
  4.   
  5.         <property name="serviceUrl">  
  6.   
  7.             <value> http://${serviceName}:${port}/${contextPath}/service/httpService   
  8.   
  9. </value>  
  10.   
  11.         </property>  
  12.   
  13.         <property name="serviceInterface"  
  14.   
  15.             value="com.netqin.baike.service.UcService">  
  16.   
  17.         </property>  
  18.   
  19. </bean>  
  20.   

說明:客戶端使用HttpInvokerProxyFactoryBean代理客戶端向服務(wù)器端發(fā)送請(qǐng)求,請(qǐng)求接口為UcService的服務(wù)

注意:需要修改serviceUrl為實(shí)際的服務(wù)器地址

²         WEB-INF/web.xml:配置spring監(jiān)聽

如果項(xiàng)目沒有spring環(huán)境,則需要在web.xml中加入對(duì)spring的支持

  1. <context-param>  
  2.   
  3.         <param-name>contextConfigLocation</param-name>  
  4.   
  5.         <param-value>  
  6.   
  7.             /WEB-INF/application-context.xml   
  8.   
  9.         </param-value>  
  10.   
  11.     </context-param>  
  12.   
  13.     
  14.   
  15.     <listener>  
  16.   
  17.         <listener-class>  
  18.   
  19.             org.springframework.web.context.ContextLoaderListener   
  20.   
  21.         </listener-class>  
  22.   
  23. </listener>  
  24.   

 

3.       訪問服務(wù)方法

u         讀取spring上下文,以遠(yuǎn)程調(diào)用getUserInfobyName方法為例

²         在jsp,servlet,action等等文件中

  1. UcService service = (UcService) WebApplicationContextUtils   
  2.   
  3.         .getRequiredWebApplicationContext(   
  4.   
  5.             request.getSession().getServletContext()).getBean(   
  6.   
  7.             "httpService");   
  8.   
  9. UserInfo user = service.getUserInfobyName("hanqunfeng");   
  10.   

 ²         如果不想配置spring運(yùn)行環(huán)境,可以使用如下方式:

  1. ApplicationContext applicationContext    
  2.   
  3. new FileSystemXmlApplicationContext("classpath:application-context.xml");   
  4.   
  5. service = (UcService) applicationContext.getBean("httpService");   

u         依賴注入,遠(yuǎn)程調(diào)用recordLog方法為例

²         在WEB-INF/application-context.xml中加入如下配置:

  1. <bean id="abc" class="com.netqin.test.abc">  
  2.   
  3.         <property name="service">  
  4.   
  5.             <ref bean="httpService" />  
  6.   
  7.         </property>  
  8.   
  9. </bean>  
  10.   

²         為com.netqin.test.abc中加入對(duì)service的set方法:

  1. private UcService service;   
  2.   
  3.     public void setService(UcService service){   
  4.   
  5.         this.service = service;   
  6.   
  7.     }   
  8.   
  9.     
  10.   
  11.     public String recordUserLog(String username,String point,String operate,String desc){   
  12.   
  13.         String result = service.recordLog(username, point, operate, desc);   
  14.   
  15.         return result;   
  16.   
  17. }   
  18.   

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    免费特黄欧美亚洲黄片| 亚洲高清一区二区高清| 日韩欧美第一页在线观看| 色哟哟国产精品免费视频| 亚洲精品成人福利在线| 亚洲熟女诱惑一区二区| 日韩毛片视频免费观看| 高清一区二区三区不卡免费| 欧美人妻盗摄日韩偷拍| 亚洲一区二区三区四区性色av| 国产成人精品国内自产拍| 好吊日在线观看免费视频| 亚洲欧美日产综合在线网| 国产无摭挡又爽又色又刺激| 精品推荐久久久国产av| 亚洲中文字幕综合网在线| 91欧美日韩中在线视频| 欧美成人精品国产成人综合| 老司机精品视频在线免费看| 欧美精品亚洲精品一区| 午夜国产精品福利在线观看| 年轻女房东2中文字幕| 欧美精品久久男人的天堂| 日韩中文字幕免费在线视频| 日韩中文字幕视频在线高清版 | 国产欧美日韩精品成人专区| 日韩偷拍精品一区二区三区| 成人午夜在线视频观看| 很黄很污在线免费观看| 久久精品视频就在久久| 风间中文字幕亚洲一区| 日本中文字幕在线精品| 精品国产亚洲av成人一区| 久久综合九色综合欧美| 隔壁的日本人妻中文字幕版| 高清免费在线不卡视频| 日本理论片午夜在线观看| 中国少妇精品偷拍视频| 国产日韩综合一区在线观看| 国产精品九九九一区二区| 亚洲精品偷拍视频免费观看|