Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0

          ??????我們的項目用到了xmlrpc,不過還是用的2.x版本的。由于xmlrpc3.x地推出。提供了NULL,Serializable等的支持,將原來的Hashtable改成了Map,Vector改成了List。都是不錯的進步。所以我們決定從xmlrpc2.x升級到xmlrpc3.x.
          ??????在spring里面有幾個ServiceExporter,org.springframework.remoting.rmi.RmiServiceExporter、org.springframework.remoting.caucho.HessianServiceExporter、org.springframework.remoting.caucho.BurlapServiceExporter。不過沒有xmlrpc的serviceExporter,原來我們是自己封裝的XmlRpcServer,用servlet提供服務。(eg:http://localhost:8080/community/service/xmlrpc)沒有和spring集成雖然用了spring。
          ??? 考慮到spring的便利以及配置的同意我決定將xmlrpcService放入spring中。xmlrpc3.x和xmlrpc2.x的代碼基本上沒有一樣的。改了很多東西。除了類型變化之外,還添加了對異常的支持。詳細信息請參照xmlrpc3.x源代碼。
          XmlRpcServiceExporter.java

          package ?com.jdkcn.xmlrpc;

          import ?javax.servlet.ServletException;

          /**
          ?*?
          @author ?<a?href="mailto:rory.cn@gmail.com">somebody</a>
          ?*?
          @since ?2006-9-27?03:59:22?pm
          ?*?
          @version ?$Id?XmlRpcServiceExporter.java$
          ?
          */
          public ? class ?XmlRpcServiceExporter? extends ?RemoteExporter? implements
          ????????Controller,?InitializingBean?{
          ????
          ????
          private ?XmlRpcServletServer?server;
          ????
          ????
          public ?String?serviceName;
          ????
          ????
          public ?Resource?configFile;
          ????
          ????
          public ?Boolean?enabledForExtensions;
          ????
          ????
          public ? void ?setEnabledForExtensions(Boolean?enabledForExtensions)?{
          ????????
          this .enabledForExtensions? = ?enabledForExtensions;
          ????}

          ????
          public ? void ?setConfigFile(Resource?configFile)?{
          ????????
          this .configFile? = ?configFile;
          ????}

          ????
          public ?String?getServiceName()?{
          ????????
          return ?serviceName;
          ????}

          ????
          public ? void ?setServiceName(String?serviceName)?{
          ????????
          this .serviceName? = ?serviceName;
          ????}

          ????
          public ?XmlRpcServletServer?getXmlRpcServletServer()?{
          ????????
          return ?server;
          ????}
          ????
          ????
          /* ?(non-Javadoc)
          ?????*?@see?org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest,?javax.servlet.http.HttpServletResponse)
          ?????
          */
          ????
          public ?ModelAndView?handleRequest(HttpServletRequest?request,
          ????????????HttpServletResponse?response)?
          throws ?Exception?{
          ????????
          if ?( ! WebContentGenerator.METHOD_POST.equals(request.getMethod()))?{
          ????????????
          throw ? new ?ServletException( " XmlRpcServiceExporter?only?supports?POST?requests " );
          ????????}
          ????????server.execute(request,?response);
          ????????
          return ? null ;
          ????}

          ????
          /* ?(non-Javadoc)
          ?????*?@see?org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
          ?????
          */
          ????
          public ? void ?afterPropertiesSet()? throws ?Exception?{
          ????????server?
          = ? new ?XmlRpcServletServer();
          ????????server.setHandlerMapping(newXmlRpcHandlerMapping());
          ????????
          if ?(enabledForExtensions != null )?{
          ????????????((XmlRpcServerConfigImpl)?server.getConfig()).setEnabledForExtensions(enabledForExtensions.booleanValue());
          ????????}
          ????????
          ????}

          ????
          /** ?Creates?a?new?handler?mapping.?The?default?implementation?loads
          ?????*?a?property?file?from?the?resource
          ?????*?
          ?????
          */
          ????
          protected ?XmlRpcHandlerMapping?newXmlRpcHandlerMapping()? throws ?XmlRpcException?{
          ????????
          ????????SpringHandlerMapping?mapping?
          = ? new ?SpringHandlerMapping(getServiceInterface());
          ????????mapping.addHandler(getServiceName(),?getServiceInterface());
          ????????mapping.setTagetObject(getProxyForService());
          ????????
          return ?mapping;
          ????}
          ????
          }

          spring配置文件
          ????<bean?id="accountService"??class="com.jdkcn.service.impl.AccountServiceImpl">
          ????
          </bean>
          ????????
          <bean?name="rpcAccountService"?class="com.jdkcn.xmlrpc.XmlRpcServiceExporter">
          ????????
          <property?name="service">
          ????????????
          <ref?bean="accountService"/>
          ????????
          </property>
          ????????
          <property?name="serviceName">
          ????????????
          <value>jdkcn.accountService</value>
          ????????
          </property>
          ????????
          <property?name="enabledForExtensions">
          ????????????
          <value>true</value>
          ????????
          </property>
          ????????
          <property?name="serviceInterface">
          ????????????
          <value>com.jdkcn.service.AccountService</value>
          ????????
          </property>
          ????
          </bean>
          然后映射一個地址就可以通過xmlrpc訪問服務了
          ????<bean?id="urlMapping"?class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          ????????
          <property?name="mappings">
          ????????????
          <props>?
          ????????????????
          <prop?key="/account">rpcAccountService</prop>
          ????????????
          </props>
          ????????
          </property>
          ????
          </bean>
          web.xml
          ????<context-param>
          ????????
          <param-name>contextConfigLocation</param-name>
          ????????
          <param-value>
          ????????????classpath:spring/global.xml
          ????????
          </param-value>
          ????
          </context-param>
          ????
          ????
          <listener>
          ????????
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          ????
          </listener>

          ????????
          <servlet>
          ????????????
          <servlet-name>service</servlet-name>
          ????????????
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          ????????
          </servlet>

          ????????
          <servlet-mapping>
          ????????????
          <servlet-name>service</servlet-name>
          ????????????
          <url-pattern>/service/xmlrpc3/*</url-pattern>
          ????????
          </servlet-mapping>
          然后我們的service地址就是這樣的http://localhost:8080/service/xmlrpc3/account

          希望對大家有用,這里提供project下載。包含一個client程序。com.jdkcn.xmlrpc.Client

          點擊下載完整代碼

          創造共用協議:署名,非商業,保持一致?? 除經特別注明外,本文章版權歸莫多泡泡所有.
          署名,非商業用途,保持一致.???somebody(莫多)
          posted on 2006-10-22 16:12 莫多 閱讀(2183) 評論(0)  編輯  收藏 所屬分類: Spring

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62241
          • 排名 - 845

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黄梅县| 凤山市| 南安市| 姜堰市| 称多县| 宜兰市| 堆龙德庆县| 康乐县| 尼玛县| 榕江县| 梅州市| 武义县| 文安县| 开封市| 芷江| 义马市| 尉犁县| 亳州市| 民乐县| 临泉县| 师宗县| 汤原县| 花垣县| 昌江| 灯塔市| 华蓥市| 科技| 大名县| 安丘市| 大余县| 沙坪坝区| 龙州县| 吴川市| 内乡县| 宁海县| 镇赉县| 遵化市| 华蓥市| 嘉善县| 迭部县| 广丰县|