webservice 开发在服务开发中非常常用,并且有多种实现方式今天我们就看下xfire开发服务实例。这里简单讲述与spring结合的开发实例。
1.首先我们需要在项目上下文定义我们的xfire配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/BANo-servlet.xml,
/WEB-INF/BANoContext.xml,
/WEB-INF/BANo-quartz.xml,
/WEB-INF/xfire-servlet.xml
</param-value>
</context-param>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/BANo-servlet.xml,
/WEB-INF/BANoContext.xml,
/WEB-INF/BANo-quartz.xml,
/WEB-INF/xfire-servlet.xml
</param-value>
</context-param>
<servlet>
<servlet-name>BANo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/BANo-servlet.xml,
/WEB-INF/BANoContext.xml,
/WEB-INF/xfire-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>BANo</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>com.plan.web.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<filter>
<filter-name>SessionTimeoutFilter</filter-name>
<filter-class>com.szpl.BANo.common.filter.SessionTimeoutFilter</filter-class>
<init-param>
<param-name>timeoutUrl</param-name>
<param-value>http://localhost:7001</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionTimeoutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.plan.fileupload.UploadServlet</servlet-class>
<!-- 上传附件的根目录 -->
<init-param>
<param-name>uploadRootPath</param-name>
<param-value>E:/land/uploadfiles/BANo/</param-value>
</init-param>
<!-- SWFTool安装路径 -->
<init-param>
<param-name>fileView_swfToolPath</param-name>
<param-value>C:/SWFTools/</param-value>
</init-param>
<!-- rfxview.swf路径 -->
<init-param>
<param-name>fileView_rfxviewPath</param-name>
<param-value>C:/SWFTools/swfs/rfxview.swf</param-value>
</init-param>
<!-- 预览文件存放目录 -->
<init-param>
<param-name>fileView_viewFilePath</param-name>
<param-value>D:/project/viewFile</param-value>
</init-param>
<!-- 文件预览虚拟目录 -->
<init-param>
<param-name>fileView_viewPath</param-name>
<param-value>/BANo</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/commons/fileupload/upload.do</url-pattern>
</servlet-mapping>
<servlet-name>BANo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/BANo-servlet.xml,
/WEB-INF/BANoContext.xml,
/WEB-INF/xfire-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>BANo</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>com.plan.web.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<filter>
<filter-name>SessionTimeoutFilter</filter-name>
<filter-class>com.szpl.BANo.common.filter.SessionTimeoutFilter</filter-class>
<init-param>
<param-name>timeoutUrl</param-name>
<param-value>http://localhost:7001</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionTimeoutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.plan.fileupload.UploadServlet</servlet-class>
<!-- 上传附件的根目录 -->
<init-param>
<param-name>uploadRootPath</param-name>
<param-value>E:/land/uploadfiles/BANo/</param-value>
</init-param>
<!-- SWFTool安装路径 -->
<init-param>
<param-name>fileView_swfToolPath</param-name>
<param-value>C:/SWFTools/</param-value>
</init-param>
<!-- rfxview.swf路径 -->
<init-param>
<param-name>fileView_rfxviewPath</param-name>
<param-value>C:/SWFTools/swfs/rfxview.swf</param-value>
</init-param>
<!-- 预览文件存放目录 -->
<init-param>
<param-name>fileView_viewFilePath</param-name>
<param-value>D:/project/viewFile</param-value>
</init-param>
<!-- 文件预览虚拟目录 -->
<init-param>
<param-name>fileView_viewPath</param-name>
<param-value>/BANo</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/commons/fileupload/upload.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>xfireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xfireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-name>xfireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xfireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<!--基于Xfile的WebSerivices -->
<!-- <servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WebServices/services.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet> -->
<!-- <servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping> -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
<session-timeout>60</session-timeout>
</session-config>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
2.配置我们相关的xfire配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- START SNIPPET: xfire -->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="3" />
<property name="urlMap">
<map>
<entry key="/WebServiceInterface">
<ref bean="sso"/>
</entry>
</map>
</property>
</bean>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- START SNIPPET: xfire -->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="3" />
<property name="urlMap">
<map>
<entry key="/WebServiceInterface">
<ref bean="sso"/>
</entry>
</map>
</property>
</bean>
<!-- Declare a parent bean with all properties common to both services -->
<bean id="sso" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceFactory">
<ref bean="xfire.serviceFactory"/>
</property>
<property name="xfire">
<ref bean="xfire"/>
</property>
<property name="serviceBean">
<ref bean="WebServiceInterfaceImpl"/>
</property>
<property name="serviceClass">
<value>com.szpl.cai.BANo.services.WebServiceInterface</value>
</property>
</bean>
<!--xfire服务的实现类
<bean id="caiServiceImpl" class="com.szpl.cai.services.impl.CaiServiceImpl">
<property name="planSupportLogDao" ref="planSupportLogDao" />
</bean>-->
<!-- END SNIPPET: xfire -->
<bean id="sso" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceFactory">
<ref bean="xfire.serviceFactory"/>
</property>
<property name="xfire">
<ref bean="xfire"/>
</property>
<property name="serviceBean">
<ref bean="WebServiceInterfaceImpl"/>
</property>
<property name="serviceClass">
<value>com.szpl.cai.BANo.services.WebServiceInterface</value>
</property>
</bean>
<!--xfire服务的实现类
<bean id="caiServiceImpl" class="com.szpl.cai.services.impl.CaiServiceImpl">
<property name="planSupportLogDao" ref="planSupportLogDao" />
</bean>-->
<!-- END SNIPPET: xfire -->
</beans>
下面讲解下配置文件,其实简单来说就是为了告诉spring handler 我声明的类是一个服务,那么怎么实现的呢?
1)首先定义使用spring handler ,使用SimpleUrlHandlerMapping拦截器映射类拦截我们的handler
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
2)然后定义urlmap 这里是定义我们拦截之后处理的类,看似一个简单的配置其实执行了一个复杂的过程。
3)定义我们的实现类信息。
<bean id="sso" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceFactory">
<ref bean="xfire.serviceFactory"/>
</property>
<property name="xfire">
<ref bean="xfire"/>
</property>
<property name="serviceBean">
<ref bean="WebServiceInterfaceImpl"/>
</property>
<property name="serviceClass">
<value>com.szpl.cai.BANo.services.WebServiceInterface</value>
</property>
</bean>
<!--xfire服务的实现类
<bean id="caiServiceImpl" class="com.szpl.cai.services.impl.CaiServiceImpl">
<property name="planSupportLogDao" ref="planSupportLogDao" />
</bean>-->
<property name="serviceFactory">
<ref bean="xfire.serviceFactory"/>
</property>
<property name="xfire">
<ref bean="xfire"/>
</property>
<property name="serviceBean">
<ref bean="WebServiceInterfaceImpl"/>
</property>
<property name="serviceClass">
<value>com.szpl.cai.BANo.services.WebServiceInterface</value>
</property>
</bean>
<!--xfire服务的实现类
<bean id="caiServiceImpl" class="com.szpl.cai.services.impl.CaiServiceImpl">
<property name="planSupportLogDao" ref="planSupportLogDao" />
</bean>-->
这里拦截到我们请求之后,交由XFireExporter进行处理,不难发现此类继承了servicebean 及实现了contralloer接口。源码如下
/* */ package org.codehaus.xfire.spring.remoting;
/* */
/* */ import javax.servlet.ServletContext;
/* */ import javax.servlet.http.HttpServletRequest;
/* */ import javax.servlet.http.HttpServletResponse;
/* */ import org.codehaus.xfire.service.Service;
/* */ import org.codehaus.xfire.service.ServiceInfo;
/* */ import org.codehaus.xfire.spring.ServiceBean;
/* */ import org.springframework.aop.framework.ProxyFactory;
/* */ import org.springframework.web.context.ServletContextAware;
/* */ import org.springframework.web.servlet.ModelAndView;
/* */ import org.springframework.web.servlet.mvc.Controller;
/* */
/* */ public class XFireExporter extends ServiceBean
/* */ implements Controller, ServletContextAware
/* */ {
/* */ private XFireServletControllerAdapter delegate;
/* */ private ServletContext context;
/* */
/* */ public void afterPropertiesSet()
/* */ throws Exception
/* */ {
/* 30 */ super.afterPropertiesSet();
/* */
/* 32 */ this.delegate = new XFireServletControllerAdapter(getXfire(), this.context, getXFireService().getName());
/* */ }
/* */
/* */ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
/* */ throws Exception
/* */ {
/* 48 */ return this.delegate.handleRequest(request, response);
/* */ }
/* */
/* */ protected Object getProxyForService()
/* */ {
/* 56 */ ProxyFactory proxyFactory = new ProxyFactory();
/* 57 */ proxyFactory.addInterface(getXFireService().getServiceInfo().getServiceClass());
/* */
/* 59 */ proxyFactory.setTarget(getServiceBean());
/* 60 */ return proxyFactory.getProxy();
/* */ }
/* */
/* */ public void setServiceInterface(Class intf)
/* */ {
/* 69 */ setServiceClass(intf);
/* */ }
/* */
/* */ public void setServletContext(ServletContext context)
/* */ {
/* 74 */ this.context = context;
/* */ }
/* */ }
/* */
/* */ import javax.servlet.ServletContext;
/* */ import javax.servlet.http.HttpServletRequest;
/* */ import javax.servlet.http.HttpServletResponse;
/* */ import org.codehaus.xfire.service.Service;
/* */ import org.codehaus.xfire.service.ServiceInfo;
/* */ import org.codehaus.xfire.spring.ServiceBean;
/* */ import org.springframework.aop.framework.ProxyFactory;
/* */ import org.springframework.web.context.ServletContextAware;
/* */ import org.springframework.web.servlet.ModelAndView;
/* */ import org.springframework.web.servlet.mvc.Controller;
/* */
/* */ public class XFireExporter extends ServiceBean
/* */ implements Controller, ServletContextAware
/* */ {
/* */ private XFireServletControllerAdapter delegate;
/* */ private ServletContext context;
/* */
/* */ public void afterPropertiesSet()
/* */ throws Exception
/* */ {
/* 30 */ super.afterPropertiesSet();
/* */
/* 32 */ this.delegate = new XFireServletControllerAdapter(getXfire(), this.context, getXFireService().getName());
/* */ }
/* */
/* */ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
/* */ throws Exception
/* */ {
/* 48 */ return this.delegate.handleRequest(request, response);
/* */ }
/* */
/* */ protected Object getProxyForService()
/* */ {
/* 56 */ ProxyFactory proxyFactory = new ProxyFactory();
/* 57 */ proxyFactory.addInterface(getXFireService().getServiceInfo().getServiceClass());
/* */
/* 59 */ proxyFactory.setTarget(getServiceBean());
/* 60 */ return proxyFactory.getProxy();
/* */ }
/* */
/* */ public void setServiceInterface(Class intf)
/* */ {
/* 69 */ setServiceClass(intf);
/* */ }
/* */
/* */ public void setServletContext(ServletContext context)
/* */ {
/* 74 */ this.context = context;
/* */ }
/* */ }
/* */ package org.codehaus.xfire.spring.remoting;
/* */
/* */ import javax.servlet.ServletContext;
/* */ import javax.servlet.http.HttpServletRequest;
/* */ import javax.servlet.http.HttpServletResponse;
/* */ import javax.xml.namespace.QName;
/* */ import org.codehaus.xfire.XFire;
/* */ import org.codehaus.xfire.service.Service;
/* */ import org.codehaus.xfire.service.ServiceRegistry;
/* */ import org.codehaus.xfire.transport.http.XFireServletController;
/* */ import org.springframework.web.servlet.ModelAndView;
/* */ import org.springframework.web.servlet.mvc.Controller;
/* */
/* */ public class XFireServletControllerAdapter extends XFireServletController
/* */ implements Controller
/* */ {
/* */ private QName serviceName;
/* */
/* */ public XFireServletControllerAdapter(XFire xfire, QName serviceName)
/* */ {
/* 34 */ this(xfire, null, serviceName);
/* */ }
/* */
/* */ public XFireServletControllerAdapter(XFire xfire, ServletContext context, QName name)
/* */ {
/* 46 */ super(xfire, context);
/* */
/* 48 */ this.serviceName = name;
/* */ }
/* */
/* */ protected String getService(HttpServletRequest request)
/* */ {
/* 53 */ return this.serviceName.getLocalPart();
/* */ }
/* */
/* */ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
/* */ throws Exception
/* */ {
/* 67 */ doService(request, response);
/* 68 */ return null;
/* */ }
/* */
/* */ protected Service getService(String name)
/* */ {
/* 73 */ return getServiceRegistry().getService(this.serviceName);
/* */ }
/* */
/* */ public void setServiceName(QName serviceName)
/* */ {
/* 78 */ this.serviceName = serviceName;
/* */ }
/* */ }
/* */ package org.codehaus.xfire.transport.http;
/* */
/* */ import java.io.IOException;
/* */ import java.io.PrintWriter;
/* */ import java.io.UnsupportedEncodingException;
/* */ import javax.activation.DataHandler;
/* */ import javax.servlet.ServletContext;
/* */ import javax.servlet.ServletException;
/* */ import javax.servlet.ServletOutputStream;
/* */ import javax.servlet.http.HttpServletRequest;
/* */ import javax.servlet.http.HttpServletResponse;
/* */ import javax.xml.stream.XMLStreamException;
/* */ import javax.xml.stream.XMLStreamReader;
/* */ import org.apache.commons.logging.Log;
/* */ import org.apache.commons.logging.LogFactory;
/* */ import org.codehaus.xfire.MessageContext;
/* */ import org.codehaus.xfire.XFire;
/* */ import org.codehaus.xfire.XFireFactory;
/* */ import org.codehaus.xfire.XFireRuntimeException;
/* */ import org.codehaus.xfire.attachments.Attachment;
/* */ import org.codehaus.xfire.attachments.Attachments;
/* */ import org.codehaus.xfire.attachments.StreamedAttachments;
/* */ import org.codehaus.xfire.exchange.InMessage;
/* */ import org.codehaus.xfire.handler.AbstractHandler;
/* */ import org.codehaus.xfire.service.Service;
/* */ import org.codehaus.xfire.service.ServiceRegistry;
/* */ import org.codehaus.xfire.transport.Channel;
/* */ import org.codehaus.xfire.transport.Transport;
/* */ import org.codehaus.xfire.transport.TransportManager;
/* */ import org.codehaus.xfire.util.STAXUtils;
/* */
/* */ public class XFireServletController
/* */ {
/* */ public static final String HTTP_SERVLET_REQUEST = "XFireServletController.httpServletRequest";
/* */ public static final String HTTP_SERVLET_RESPONSE = "XFireServletController.httpServletResponse";
/* */ public static final String HTTP_SERVLET_CONTEXT = "XFireServletController.httpServletContext";
/* 45 */ private static ThreadLocal requests = new ThreadLocal();
/* 46 */ private static ThreadLocal responses = new ThreadLocal();
/* 47 */ private static final Log logger = LogFactory.getLog(XFireServletController.class);
/* */ protected XFire xfire;
/* */ protected SoapHttpTransport transport;
/* */ protected ServletContext servletContext;
/* */
/* */ public XFireServletController(XFire xfire)
/* */ {
/* 56 */ this(xfire, null);
/* */ }
/* */
/* */ public XFireServletController(XFire xfire, ServletContext servletContext)
/* */ {
/* 61 */ this.xfire = xfire;
/* 62 */ this.servletContext = servletContext;
/* */
/* 65 */ this.transport = new XFireServletTransport();
/* */
/* 67 */ this.transport.addFaultHandler(new FaultResponseCodeHandler());
/* */
/* 69 */ Transport oldSoap = getTransportManager().getTransport("http://schemas.xmlsoap.org/soap/http");
/* */
/* 71 */ if (oldSoap != null) getTransportManager().unregister(oldSoap);
/* */
/* 73 */ getTransportManager().register(this.transport);
/* */ }
/* */
/* */ public static HttpServletRequest getRequest()
/* */ {
/* 78 */ return (HttpServletRequest)requests.get();
/* */ }
/* */
/* */ public static HttpServletResponse getResponse()
/* */ {
/* 83 */ return (HttpServletResponse)responses.get();
/* */ }
/* */
/* */ protected TransportManager getTransportManager()
/* */ {
/* 88 */ return getXFire().getTransportManager();
/* */ }
/* */
/* */ public void doService(HttpServletRequest request, HttpServletResponse response)
/* */ throws ServletException, IOException
/* */ {
/* 99 */ String serviceName = getService(request);
/* 100 */ if (serviceName == null) serviceName = "";
/* */
/* 102 */ ServiceRegistry reg = getServiceRegistry();
/* */
/* 104 */ response.setHeader("Content-Type", "UTF-8");
/* */ try
/* */ {
/* 108 */ requests.set(request);
/* 109 */ responses.set(response);
/* */
/* 111 */ boolean hasService = reg.hasService(serviceName);
/* 112 */ if ((serviceName.length() == 0) || (!hasService))
/* */ {
/* 114 */ if (!hasService)
/* */ {
/* 116 */ response.setStatus(404);
/* 119 */ }
/* */ generateServices(request, response);
/* */ return;
/* */ }
/* 123 */ if (isWSDLRequest(request))
/* */ {
/* 125 */ generateWSDL(response, serviceName);
/* */ }
/* */ else
/* */ {
/* 129 */ invoke(request, response, serviceName);
/* */ }
/* */ }
/* */ catch (Exception e)
/* */ {
/* 134 */ logger.error("Couldn't invoke servlet request.", e);
/* */
/* 136 */ if ((e instanceof ServletException))
/* */ {
/* 138 */ throw ((ServletException)e);
/* */ }
/* */
/* 142 */ throw new ServletException(e);
/* */ }
/* */ finally
/* */ {
/* 147 */ requests.set(null);
/* 148 */ responses.set(null);
/* */ }
/* */ }
/* */
/* */ protected boolean isWSDLRequest(HttpServletRequest request)
/* */ {
/* 154 */ return (request.getQueryString() != null) && (request.getQueryString().trim().equalsIgnoreCase("wsdl"));
/* */ }
/* */
/* */ protected void generateService(HttpServletResponse response, String serviceName)
/* */ throws ServletException, IOException
/* */ {
/* 161 */ response.setContentType("text/html");
/* 162 */ Service endpoint = getServiceRegistry().getService(serviceName);
/* 163 */ HtmlServiceWriter writer = new HtmlServiceWriter();
/* */ try
/* */ {
/* 166 */ writer.write(response.getOutputStream(), endpoint);
/* */ }
/* */ catch (XMLStreamException e)
/* */ {
/* 170 */ throw new ServletException("Error writing HTML services list", e);
/* */ }
/* */ }
/* */
/* */ protected void generateServices(HttpServletRequest request, HttpServletResponse response)
/* */ throws ServletException, IOException
/* */ {
/* 181 */ response.setContentType("text/html");
/* */
/* 183 */ HtmlServiceWriter writer = new HtmlServiceWriter(request);
/* */ try
/* */ {
/* 187 */ Object value = XFireFactory.newInstance().getXFire().getProperty("services.list.disabled");
/* 188 */ if ((value != null) && ("true".equals(value.toString().toLowerCase())))
/* 189 */ response.getOutputStream().write("Services list disabled".getBytes());
/* */ else {
/* 191 */ writer.write(response.getOutputStream(), getServiceRegistry().getServices());
/* */ }
/* */ }
/* */ catch (XMLStreamException e)
/* */ {
/* 196 */ throw new ServletException("Error writing HTML services list", e);
/* */ }
/* */ }
/* */
/* */ protected MessageContext createMessageContext(HttpServletRequest request, HttpServletResponse response, String service)
/* */ {
/* 205 */ XFireHttpSession session = new XFireHttpSession(request);
/* 206 */ MessageContext context = new MessageContext();
/* 207 */ context.setXFire(getXFire());
/* 208 */ context.setSession(session);
/* 209 */ context.setService(getService(service));
/* 210 */ context.setProperty("XFireServletController.httpServletRequest", request);
/* 211 */ context.setProperty("XFireServletController.httpServletResponse", response);
/* */
/* 213 */ if (this.servletContext != null) {
/* 214 */ context.setProperty("XFireServletController.httpServletContext", this.servletContext);
/* */ }
/* 216 */ return context;
/* */ }
/* */
/* */ protected Channel createChannel(MessageContext context) throws ServletException
/* */ {
/* 221 */ HttpServletRequest request = (HttpServletRequest)context.getProperty("XFireServletController.httpServletRequest");
/* */ try
/* */ {
/* 224 */ return this.transport.createChannel(request.getRequestURI());
/* */ }
/* */ catch (Exception e)
/* */ {
/* 228 */ logger.debug("Couldn't open channel.", e);
/* 229 */ }throw new ServletException("Couldn't open channel.", e);
/* */ }
/* */
/* */ protected void invoke(HttpServletRequest request, HttpServletResponse response, String service)
/* */ throws ServletException, IOException, UnsupportedEncodingException
/* */ {
/* 246 */ response.setStatus(200);
/* 247 */ response.setBufferSize(8192);
/* */
/* 249 */ MessageContext context = createMessageContext(request, response, service);
/* 250 */ Channel channel = createChannel(context);
/* */
/* 252 */ String soapAction = getSoapAction(request);
/* 253 */ String contentType = request.getContentType();
/* 254 */ if (null == contentType)
/* */ {
/* 256 */ response.setContentType("text/html; charset=UTF-8");
/* */
/* 259 */ response.getWriter().write("<html><body>Invalid SOAP request.</body></html>");
/* 260 */ response.getWriter().close();
/* */ }
/* 262 */ else if (contentType.toLowerCase().indexOf("multipart/related") != -1)
/* */ {
/* 266 */ String ct = request.getContentType().replaceAll("--=_part_", "--=_Part_");
/* */
/* 269 */ Attachments atts = new StreamedAttachments(context, request.getInputStream(), ct);
/* */
/* 271 */ String encoding = getEncoding(atts.getSoapContentType());
/* */
/* 273 */ XMLStreamReader reader = STAXUtils.createXMLStreamReader(atts.getSoapMessage().getDataHandler().getInputStream(), encoding, context);
/* */
/* 277 */ InMessage message = new InMessage(reader, request.getRequestURI());
/* 278 */ message.setProperty("SOAPAction", soapAction);
/* 279 */ message.setAttachments(atts);
/* */
/* 281 */ channel.receive(context, message);
/* */ try
/* */ {
/* 285 */ reader.close();
/* */ }
/* */ catch (XMLStreamException e)
/* */ {
/* 289 */ throw new XFireRuntimeException("Could not close XMLStreamReader.");
/* */ }
/* */
/* */ }
/* */ else
/* */ {
/* 295 */ String charEncoding = request.getCharacterEncoding();
/* 296 */ charEncoding = dequote(charEncoding);
/* 297 */ XMLStreamReader reader = STAXUtils.createXMLStreamReader(request.getInputStream(), charEncoding, context);
/* */
/* 302 */ InMessage message = new InMessage(reader, request.getRequestURI());
/* 303 */ message.setProperty("SOAPAction", soapAction);
/* 304 */ channel.receive(context, message);
/* */ try
/* */ {
/* 308 */ reader.close();
/* */ }
/* */ catch (XMLStreamException e)
/* */ {
/* 312 */ throw new XFireRuntimeException("Could not close XMLStreamReader.");
/* */ }
/* */ }
/* */ }
/* */
/* */ protected String dequote(String charEncoding)
/* */ {
/* 319 */ if ((charEncoding != null) && (charEncoding.length() > 0) && (
/* 320 */ ((charEncoding.charAt(0) == '"') && (charEncoding.charAt(charEncoding.length() - 1) == '"')) || ((charEncoding.charAt(0) == '\'') && (charEncoding.charAt(charEncoding.length() - 1) == '\''))))
/* */ {
/* 322 */ charEncoding = charEncoding.substring(1, charEncoding.length() - 1);
/* */ }
/* */
/* 325 */ return charEncoding;
/* */ }
/* */
/* */ protected String getSoapAction(HttpServletRequest request)
/* */ {
/* 330 */ String action = request.getHeader("SOAPAction");
/* */
/* 332 */ if ((action != null) && (action.startsWith("\"")) && (action.endsWith("\"")) && (action.length() >= 2))
/* */ {
/* 334 */ action = action.substring(1, action.length() - 1);
/* */ }
/* */
/* 337 */ return action;
/* */ }
/* */
/* */ protected String getEncoding(String enc) throws ServletException
/* */ {
/* 342 */ if (enc == null) {
/* 343 */ return "UTF-8";
/* */ }
/* 345 */ int typeI = enc.indexOf("type=");
/* 346 */ if (typeI == -1) return null;
/* */
/* 348 */ int charI = enc.indexOf("charset=", typeI);
/* 349 */ if (charI == -1) return null;
/* */
/* 351 */ int end = enc.indexOf("\"", charI);
/* 352 */ if (end == -1) end = enc.indexOf(";", charI);
/* 353 */ if (end == -1) throw new ServletException("Invalid content type: " + enc);
/* */
/* 355 */ return enc.substring(charI + 8, end);
/* */ }
/* */
/* */ protected void generateWSDL(HttpServletResponse response, String service)
/* */ throws ServletException, IOException
/* */ {
/* 368 */ Service userService = getXFire().getServiceRegistry().getService(service);
/* 369 */ Object value = userService.getProperty("wsdl.generation.disabled");
/* 370 */ boolean isWSDLDisabled = "true".equalsIgnoreCase(value != null ? value.toString() : null);
/* 371 */ if (isWSDLDisabled) {
/* 372 */ logger.warn("WSDL generation disabled for service :" + service);
/* 373 */ response.sendError(404, "No wsdl is avaiable for this service");
/* 374 */ return;
/* */ }
/* */
/* 377 */ response.setStatus(200);
/* 378 */ response.setContentType("text/xml");
/* */
/* 380 */ getXFire().generateWSDL(service, response.getOutputStream());
/* */ }
/* */
/* */ protected String getService(HttpServletRequest request)
/* */ {
/* 388 */ String pathInfo = request.getPathInfo();
/* */
/* 390 */ if (pathInfo == null)
/* 391 */ return null;
/* */ String serviceName;
/* */ String serviceName;
/* 395 */ if (pathInfo.startsWith("/"))
/* */ {
/* 397 */ serviceName = pathInfo.substring(1);
/* */ }
/* */ else
/* */ {
/* 401 */ serviceName = pathInfo;
/* */ }
/* */
/* 404 */ return serviceName;
/* */ }
/* */
/* */ protected Service getService(String name)
/* */ {
/* 409 */ return getXFire().getServiceRegistry().getService(name);
/* */ }
/* */
/* */ public XFire getXFire()
/* */ {
/* 414 */ return this.xfire;
/* */ }
/* */
/* */ public ServiceRegistry getServiceRegistry()
/* */ {
/* 419 */ return this.xfire.getServiceRegistry();
/* */ }
/* */
/* */ public static class FaultResponseCodeHandler extends AbstractHandler
/* */ {
/* */ public FaultResponseCodeHandler()
/* */ {
/* 428 */ setPhase("transport");
/* */ }
/* */
/* */ public void invoke(MessageContext context)
/* */ {
/* 437 */ HttpServletResponse response = XFireServletController.getResponse();
/* 438 */ if (response != null)
/* 439 */ response.setStatus(500);
/* */ }
/* */ }
/* */ }
由源码我们可以知道大概的执行流程,首先通过上下文加载xfire配置文件,在我们调用服务时被spring拦截连所拦截,然后通过配置的entry来获取所需的控制器类xfireexporter类,通过此类结构可知继承了serrvicebean,实现了controller,servletcontextaware接口,通过代理获取实体类及实现类,并执行doservice方法,进行服务的调用及解析,成功后通过反射进行结果处理执行实现业务类。