首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

学习WebService札记

2012-10-28 
学习WebService笔记目前开发WebServic主要使用的技术有以下几个,JAX-WS、Axis、XFire、CXF。因为使用Spring的

学习WebService笔记
目前开发WebServic主要使用的技术有以下几个,JAX-WS、Axis、XFire、CXF。因为使用Spring的关系吧,所以偏好于后面两者,XFire和CXF。

WebServic服务端

使用XFire和CXF,和Spring的集成WebServic真的是非常简单。

XFire的使用

XFire发布服务有两种方式,jsr181和直接配置式,个人比较喜欢标注的东西,所以也选择当然选择了jsr181方式发布服务,其实两者都是很快能上手的。

Web.xml

  <servlet>    <servlet-name>XFireServlet</servlet-name>    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>    <load-on-startup>0</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>XFireServlet</servlet-name>    <url-pattern>/services/*</url-pattern>  </servlet-mapping>


接口的类编写

public interface IHello {public String getName( String name);}


实现类编写

package net.company.webservicimport javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;@WebService(name = "Hello", serviceName = "Hello", targetNamespace = "http://company.net")public class Hello implements IHello {@WebMethod@WebResult(name = "resultMsg")public String getName(@WebParam(name = "name") String name) {return "Hello: " + name;}}


service.xml
<service><serviceClass>net.company.webservic.Hello</serviceClass><serviceFactory>jsr181</serviceFactory></service>


然后就可以部署了WSDL文件会自动生成,访问url如
http://localhost:8080/service/Hello?wsdl

CXF与Spring集成服务端

类包
    * cxf-2.0.4-incubator.jar
    * commons-logging-1.1.jar
    * geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
    * geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
    * geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
    * geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
    * geronimo-stax-api_1.0_spec-1.0.jar
    * geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)
    * jaxb-api-2.0.jar
    * jaxb-impl-2.0.5.jar
    * jaxws-api-2.0.jar
    * neethi-2.0.2.jar
    * saaj-api-1.3.jar
    * saaj-impl-1.3.jar
    * wsdl4j-1.6.1.jar
    * wstx-asl-3.2.1.jar
    * XmlSchema-1.3.2.jar
    * xml-resolver-1.2.jar
    * jdom-1.0.jar


接口类编写

package net.company.springCXF;import java.util.List;import javax.jws.WebParam;import javax.jws.WebService;/** * @author KennyLee * */@WebServicepublic interface IContactUsService {    List<Message> getMessages();        void postMessage(@WebParam(name = "message") Message message);        String sayHello(@WebParam(name = "name") String name);}


Message类略过。

实现类编写

package net.company.springCXF;import java.util.ArrayList;import java.util.List;import javax.jws.WebService;/** * @author KennyLee *  */@WebService(endpointInterface = "net.company.springCXF.IContactUsService")public final class ContactUsServiceImpl implements IContactUsService {/* * (non-Javadoc) *  * @see net.company.springCXF.IContactUsService#getMessages() */public List<Message> getMessages() {List<Message> messages = new ArrayList<Message>();messages.add(new Message("LiLei");messages.add(new Message("HanMeimei");return messages;}/* * (non-Javadoc) *  * @see * net.company.springCXF.IContactUsService#postMessage(net.company.springCXF * .Message) */public void postMessage(Message message) {System.out.println(message);}public String sayHello(String name) {return "Hello: " + name;}}


web.xml配置

<?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"><display-name>Spring with CXF</display-name><description>CXF demo</description><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>    <servlet>        <servlet-name>CXFServlet</servlet-name>        <servlet-class>            org.apache.cxf.transport.servlet.CXFServlet        </servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>CXFServlet</servlet-name>        <url-pattern>/*</url-pattern>    </servlet-mapping>    <jsp-config><jsp-property-group><url-pattern>*.jsp</url-pattern><el-ignored>false</el-ignored></jsp-property-group></jsp-config> <welcome-file-list>   <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>


applicationContext.xml配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:cxf="http://cxf.apache.org/core" xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-2.5.xsd        http://cxf.apache.org/core        http://cxf.apache.org/schemas/core.xsd        http://cxf.apache.org/jaxws        http://cxf.apache.org/schemas/jaxws.xsd"default-autowire="byName"><!-- Load CXF modules from cxf.jar --><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><!-- Enable message logging using the CXF logging feature --><cxf:bus><cxf:features><cxf:logging /></cxf:features></cxf:bus><!-- The service bean --><bean id="contactUsServiceImpl" /><!-- Aegis data binding --><bean id="aegisBean" /><bean id="jaxws-and-aegis-service-factory" ref="aegisBean" /><property name="serviceConfigurations"><list><bean /><bean /><bean /></list></property></bean><!-- Service endpoint --><!--See http://incubator.apache.org/cxf/faq.html regarding CXF + SpringAOP--><jaxws:endpoint id="contactUsService"implementoraddress="/contactus"><jaxws:serviceFactory><ref bean="jaxws-and-aegis-service-factory" /></jaxws:serviceFactory></jaxws:endpoint></beans>


Spring+CXF的WebServic服务端就完成了。

关于WebServic的客户端编写。

关于这点,我也纠结了两天,原因是使用CXF+Spring的服务端环境下,通过WSDL生成的客户端代码调试都有问题。问题仅仅出现在XFire和CXF的客户端之下。

WSDL一种规范的语言,不需要理会对方如何制作客户端来发送SOAP请求进行交互,我一直是这么理解的。但事实上并不是这样,如果使用了特定技术的话,还是需要留意的。

例如,我使用XFire的客户端就出现问题了,仅仅是出现在用CXF编写的服务端之上。搞了一天并且在网上搜索了一下资料,郁闷的人原来不止我一个。并且发现XFire性能上不如前辈们说的好,一个SOAP请求当中可能出现一些冗余的XML字符串。甚至还有时候返回NULL的情况发生。

而如果服务端是使用XFrie的话,则一切正常。

还有一点郁闷的是,使用CXF官方的wsdl2java生成的客户端也出现问题,不能正常使用。但这个问题没深究了,报的是There's no ObjectFactory with an @XmlElementDecl for the element也许是生成代码的时候标记有误之类。总之觉得客户端生成后能直接用就最快捷了,如果有问题直接否决掉使用其他的了。

使用Axis和JAX-WS生成的客户端则一切正常....

而且推荐通过wsdl2java或者一些IDE工具根据WSDL生成客户端而不是手写,因为这样才能敏捷开发,效率十分重要。

总结一点经验

如果你编写WebServic服务端的话,推荐使用CXF、AXIS2,因为都是目前主流的技术,各有千秋。再者如果您是使用Spring的话,就推荐CXF了,集成得很好。

而客户端的话,推荐使用JAX-WS和Axis,因为至少据我所测的两天当中能兼容所有的WebServic服务端。XFire也可以,但先测试吧,因为如果对方使用CXF的话,也许会出现问题。不敢保证一定出问题,也许是我的倒霉吧。而且CXF目前还不是怎么普及,遇到问题也比较难找帮助。

XFire的作者有两年没更新了,BUG之类的可想言之,并且不是这样的话CXF也没必要诞生了。虽然开始很喜欢XFire(Eclipse集成得比较不错),但目前还是只能接受现实了。

注明下Spring+CXF 学习参考的地方:
http://wheelersoftware.com/articles/spring-cxf-web-services.html

期待《Spring in Practice》

热点排行