??????我們的項目用到了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;
????}
????
}
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="urlMapping"?class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
????????<property?name="mappings">
????????????<props>?
????????????????<prop?key="/account">rpcAccountService</prop>
????????????</props>
????????</property>
????</bean>
web.xml????????<property?name="mappings">
????????????<props>?
????????????????<prop?key="/account">rpcAccountService</prop>
????????????</props>
????????</property>
????</bean>
????<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????????<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>
希望對大家有用,這里提供project下載。包含一個client程序。com.jdkcn.xmlrpc.Client


署名,非商業用途,保持一致.???somebody(莫多)