??????我們的項目用到了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
莫多 閱讀(2181)
評論(0) 編輯 收藏 所屬分類:
Spring