WebService CXF学习(进阶篇2-4).docx_第1页
WebService CXF学习(进阶篇2-4).docx_第2页
WebService CXF学习(进阶篇2-4).docx_第3页
WebService CXF学习(进阶篇2-4).docx_第4页
WebService CXF学习(进阶篇2-4).docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WebService CXF学习(进阶篇2):JAX-WS讲解文章分类:Java编程 JAX-WS规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代 码。JAX-WS的运行时实现会将这些API的调用转换成为对于SOAP消息。 在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI (service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。 在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。 通过web service所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作。 JAX-WS工作原理如下图所示: JAX-WS与JAX-RPC之间的关系 Sun最开始的web services的实现是JAX-RPC 1.1 (JSR 101)。这个实现是基于Java的RPC,并不完全支持schema规范,同时没有对Binding和Parsing定义标准的实现。 JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XML Binding (JAXB, JSR 222),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。 WebService CXF学习(进阶篇3):对象传递文章分类:Java编程 前面几节都是讲一些理论知识,现在又用一个例子来说明一下,这一节我们就CXF框架对象传递进行讲解。 第一步:创建传输对象Customer Java 代码 1. XmlRootElement(name=Customer)2. XmlAccessorType(XmlAccessType.FIELD)3. XmlType(propOrder=name,age)4. publicclassCustomer5. 6. privateintage;7. privateStringname;8. 9. publicintgetAge()10. returnage;11. 12. 13. publicvoidsetAge(intage)14. this.age=age;15. 16. 17. publicStringgetName()18. returnname;19. 20. 21. publicvoidsetName(Stringname)22. =name;23. 24. 25. XmlRootElement(name=Customer) XmlAccessorType(XmlAccessType.FIELD) XmlType(propOrder = name,age) public class Customer private int age;private String name;public int getAge() return age;public void setAge(int age) this.age = age;public String getName() return name;public void setName(String name) = name; XmlRootElement-指定XML根元素名称(可选) XmlAccessorType-控制属性或方法序列化 四种方案: FIELD-对每个非静态,非瞬变属性JAXB工具自动绑定成XML,除非注明XmlTransient NONE-不做任何处理 PROPERTY-对具有set/get方法的属性进行绑定,除非注明XmlTransient PUBLIC_MEMBER -对有set/get方法的属性或具有共公访问权限的属性进行绑定,除非注 明XmlTransient XmlType-映射一个类或一个枚举类型成一个XML Schema类型 第二步:创建WebService接口 Java 代码 1. WebService2. publicinterfaceHelloService3. 4. publicvoidsave(Customerc1,Customerc2);5. 6. publicvoidtest(Stringargs);7. 8. publicCustomerget(intid);9. 10. 11. WebService public interface HelloService public void save(Customer c1,Customer c2);public void test(String args);public Customer get(int id); 每三步:创建WebService接口实现类 Java 代码 1. WebService2. publicclassHelloServiceImplimplementsHelloService3. 4. publicvoidsave(Customerc1,Customerc2)5. 6. System.out.println(c1.getAge()+-+c2.getAge();7. System.out.println(c1.getName()+-+c2.getName();8. 9. 10. publicvoidtest(Stringargs)11. System.out.println(args);12. 13. 14. 15. publicCustomerget(intid)16. Customercus=newCustomer();17. cus.setAge(100);18. cus.setName(Josen);19. returncus;20. 21. 22. 23. 24. 25. WebService public class HelloServiceImpl implements HelloService public void save(Customer c1, Customer c2) System.out.println(c1.getAge()+-+c2.getAge();System.out.println(c1.getName()+-+c2.getName();public void test(String args) System.out.println(args);public Customer get(int id) Customer cus = new Customer();cus.setAge(100);cus.setName(Josen);return cus; 第四步:创建服务端 Java 代码 1. publicclassSoapServer2. 3. ublicstaticvoidmain(Stringargs)4. /两种方法,任选一种发布WebService接口5. /Endpoint.publish(http:/localhost:8080/helloService,new6. HelloServiceImpl();7. JaxWsServerFactoryBeanfactory=newJaxWsServerFactoryBean();8. factory.setAddress(http:/localhost:8080/helloService);9. factory.setServiceClass(HelloServiceImpl.class);10. factory.getInInterceptors().add(newLoggingInInterceptor();11. factory.getOutInterceptors().add(newLoggingOutInterceptor();12. factory.create();13. 14. 15. public class SoapServer public static void main(String args)/两种方法,任选一种发布WebService接口 /Endpoint.publish(http:/localhost:8080/helloService, new HelloServiceImpl();JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();factory.setAddress(http:/localhost:8080/helloService);factory.setServiceClass(HelloServiceImpl.class); factory.getInInterceptors().add(new LoggingInInterceptor();factory.getOutInterceptors().add(new LoggingOutInterceptor();factory.create(); 第五步:创建客户端 Java 代码 1. publicclassSoapClient2. 3. publicstaticvoidmain(Stringargs)4. JaxWsProxyFactoryBeanfactory=newJaxWsProxyFactoryBean();5. factory.setAddress(http:/localhost:8080/helloService);6. factory.setServiceClass(HelloService.class);7. factory.setServiceClass(HelloServiceImpl.class);8. factory.getInInterceptors().add(newLoggingInInterceptor();9. HelloServiceservice=(HelloService)factory.create();10. 11. Customerc1=newCustomer();12. c1.setAge(1);13. c1.setName(aaa);14. 15. Customerc2=newCustomer();16. c2.setAge(2);17. c2.setName(bbb);18. 19. service.save(c1,c2);20. service.test(aaaaaaaaaaaaa);21. 22. 23. public class SoapClient public static void main(String args)JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();factory.setAddress(http:/localhost:8080/helloService);factory.setServiceClass(HelloService.class); factory.setServiceClass(HelloServiceImpl.class); factory.getInInterceptors().add(new LoggingInInterceptor();HelloService service = (HelloService)factory.create();Customer c1 = new Customer();c1.setAge(1);c1.setName(aaa);Customer c2 = new Customer();c2.setAge(2);c2.setName(bbb);service.save(c1, c2);service.test(aaaaaaaaaaaaa); 最后,测试程序 运行服务端程序,在浏览器地址栏输入http:/localhost:8080/helloService?wsdl查看接口是否发布成功。成功则运行 一下客户端程序,看看对象传输是否成功。 现在我们来分析一下控制打印的日志信息。 引用信息: Inbound Message - ID: 1 Address: /HelloWorld Encoding: UTF-8 Content-Type: text/xml; charset=UTF-8 Headers: content-type=text/xml; charset=UTF-8, connection=keep-alive, Host=localhost:9000, Content-Length=184, SOAPAction=, User-Agent=Apache CXF 2.2.2, Content-Type=text/xml; charset=UTF-8, Accept=*/*, Pragma=no-cache, Cache-Control=no-cache Payload: Josen - 2010-1-9 20:41:56 erceptor.LoggingOutInterceptor$LoggingCallback onClose 信息: Outbound Message - ID: 1 Encoding: UTF-8 Content-Type: text/xml Headers: Payload: hi Josen - 2010-01-09 20:41:56.578:INFO: seeing JVM BUG(s) - cancelling interestOps=0 当客户端向服器发送请求时,服务端LoggingInInterceptor拉截客户端发送过来的SOAP消息,如下: 引用 Josen 客户端将请求信息封闭在中,当然也可以将其放 到,只要在WebParam中的header设置成true,默认为 false; 服务器接到请求之后,响应客户端。同样以SOAP形式将信息封装好发回客户端,SOAP信息如下: 引用 hi Josen WebService CXF学习(进阶篇4):JAXB剖析文章分类:Java编程 前面几节我们讲解对象传递,但是通常情况下我们不直接传对象,因为直接传递对象安全性差,而且暴露了实体对象。所以我们选择传递XML文件,当然也可以传 递JSON对象。这节我只针对传递XML,那么JAVA绑定成XML,服务端将XML解析成Java对象有什么工具可用吗,其实这样的工具多的是。这里我 选择一个比较简单的JAXB工具来讲解一下。 JAXB(Java Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemas和java,使java程序员能够很方便的在java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法, 以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。 这里有几个重要的定义: 编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。工作原理如下图所示: 解组(Unmarshalling) 是把数据从存储媒介转换到内存中的过程-正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。工作原理如下图所示: 往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储 媒介到内存然后回到存储媒介的完整循 环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。 下载地址:/developer/technicalArticles/WebServices/jaxb/ 我们还以例子来说明它的工作原理,直观点。 第一步,创建一个Customer对象 Java 代码 1. XmlRootElement(name=customer)2. XmlAccessorType(XmlAccessType.FIELD)3. XmlType(name=)4. publicclassCustomer5. 6. XmlAttribute(required=true)7. protectedStringname;8. XmlAttribute(required=true)9. protectedintage;10. 11. /*12. *Getsthevalueofthenameproperty.13. *14. *return15. *possibleobjectis16. *linkString17. *18. */19. publicStringgetName()20. returnname;21. 22. 23. /*24. *Setsthevalueofthenameproperty.25. *26. *paramvalue27. *allowedobjectis28. *linkString29. *30. */31. publicvoidsetName(Stringvalue)32. =value;33. 34. 35. /*36. *Getsthevalueoftheageproperty.37. *38. */39. publicintgetAge()40. returnage;41. 42. 43. /*44. *Setsthevalueoftheageproperty.45. *46. */47. publicvoidsetAge(intvalue)48. this.age=value;49. 50. 51. 52. 53. XmlRootElement(name=customer)XmlAccessorType(XmlAccessType.FIELD)XmlType(name = )public class Customer XmlAttribute(required = true) protected String name; XmlAttribute(required = true) protected int age; /* * Gets the value of the name property. * * return * possible object is * link String * */ public String getName() return name; /* * Sets the value of the name property. * * param value * allowed object is * link String * */ public void setName(String value) = value; /* * Gets the value of the age property. * */ public int getAge() return age; /* * Sets the value of the age property. * */ public void setAge(int value) this.age = value; 第二步,创建一个测试类 Java 代码 1. publicclassSoapClient2. 3. privatefinalstaticStringMODEL=com.itdcl.model;4. publicstaticvoidmain(Stringargs)throwsParserConfigurationException,JAXBException,TransformerException5. 6. 7. ObjectFactoryfactory=newObjectFactory();8. Customercustomer=factory.createCustomer();9. customer.setAge(20);10. customer.setName(Josen);11. 12. DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();13. dbf.setNamespaceAware(true);14. DocumentBuilderdb=dbf.newDocumentBuilder();15. Documentdoc=db.newDocument();16. 17. JAXBContextjaxbContext=JAXBContext.newInstance(MODEL);18. /Java对象转换成XML19. Marshallermarshaller=jaxbContext.createMarshaller();20. marshaller.marshal(customer,doc);21. 22. DOMSourcedomSource=newDOMSource(doc);23. StringWriterwriter=newStringWriter();24. StreamResultresult=newStreamResult(writer);25. TransformerFactorytf=TransformerFactory.newInstance();26. Transformertransformer=tf.newTransformer();27. transformer.transform(domSource,result);28. StringxmlString=writer.toString();29. System.out.println(xmlString);30. /XML转换成Java对象31. Unmarshallerunmarshaller=jaxbContext.createUnmarshaller();32. StringReaderreader=newStringReader(xmlString);33. Customercus=(Customer)unmarshaller.unmarshal(reader);34. System.out.println(Age:+cus.getAge();35. System.out.println(Name:+cus.getName();36. 37. 38. 39. public class SoapClient private final static String MODEL = com.itdcl.model;public static void main(String args) throws ParserConfigurationException, JAXBException, TransformerExceptionObjectFactory factory = new ObjectFactory();Customer customer = factory.createCustomer();customer.setAge(20);customer.setName(Josen);DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.newDocument();JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);/Java对象转换成XML Marshaller marshaller = jaxbContext.createMarshaller();marshaller.marshal(customer, doc);DOMSource domSource = new DOMSource(doc);StringWriter writer = new StringWriter();StreamResult result = new StreamResult(writer);TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer = tf.newTransformer();transformer.transform(domSource, result);String xmlString = writer.toString();System.out.println(xmlString);/XML转换成Java对象Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();StringReader reader = new StringReader(xmlString);Customer cus = (Customer)unmarshaller.unmarshal(reader);System.out.println(Age:+cus.getAge();System.out.println(Name:+cus.getName(); 第三步,运行一个测试类,看看效果如何。Java与XML之间转换如此简单 编组操作:利用上面生成的java文件执行编组操作。 Java 代码 1. JAXBContextjaxbContext=JAXBContext.newInstance(MODEL);2. /Java对象转换成XML3. Marshallermarshaller=jaxbContext.createMarshaller();4. marshaller.marshal(customer,doc);5. 6. DOMSourcedomSource=newDOMSource(doc);7. StringWriterwriter=newStringWriter();8. StreamResultresult=newStreamResult(writer);9. TransformerFactorytf=TransformerFactory.newInstance();10. Transformertransformer=tf.newTransformer();11. transformer.transform(domSource,result);1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论