2. Using the Tutorial Examples 3. Getting Started with Web Applications 5. JavaServer Pages Technology 7. JavaServer Pages Standard Tag Library 10. JavaServer Faces Technology 11. Using JavaServer Faces Technology in JSP Pages 12. Developing with JavaServer Faces Technology 13. Creating Custom UI Components 14. Configuring JavaServer Faces Applications 15. Internationalizing and Localizing Web Applications 16. Building Web Services with JAX-WS 17. Binding between XML Schema and Java Classes 19. SOAP with Attachments API for Java The Structure of an XML Document Creating and Sending a Simple Message Accessing Elements of a Message Getting aSOAPConnection Object Getting the Content of a Message Adding Content to theSOAPPart Object Adding a Document to the SOAP Body Manipulating Message Content Using SAAJ or DOM APIs Creating anAttachmentPart Object and Adding Content Accessing anAttachmentPart Object Creating and Populating aSOAPFault Object Building and Running the Header Example Examining theDOMSrcExample Class Building and Running the DOM and DOMSource Examples Further Information about SAAJ 21. Getting Started with Enterprise Beans 23. A Message-Driven Bean Example 24. Introduction to the Java Persistence API 25. Persistence in the Web Tier 26. Persistence in the EJB Tier 27. The Java Persistence Query Language 28. Introduction to Security in the Java EE Platform 29. Securing Java EE Applications 31. The Java Message Service API 32. Java EE Examples Using the JMS API 36. The Coffee Break Application | Code ExamplesThe first part of this tutorial uses code fragments to walk youthrough the fundamentals of using the SAAJ API. In this section, you willuse some of those code fragments to create applications. First, you will seethe programRequest.java. Then you will see how to run the programsHeaderExample.java,DOMExample.java,DOMSrcExample.java,Attachments.java, andSOAPFaultTest.java. Note -Before you run any of the examples, follow the preliminary setup instructions inBuilding the Examples. Request ExampleThe classRequest puts together the code fragments used in the sectionSAAJ Tutorialand adds what is needed to make it a complete example of aclient sending a request-response message. In addition to putting all the code together,it addsimport statements, amain method, and atry/catch block with exception handling. import javax.xml.soap.*;import javax.xml.namespace.QName;import java.util.Iterator;import java.net.URL;public class Request { public static void main(String[] args) { try { SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnectionFactory.createConnection(); MessageFactory factory = MessageFactory.newInstance(); SOAPMessage message = factory.createMessage(); SOAPHeader header = message.getSOAPHeader(); SOAPBody body = message.getSOAPBody(); header.detachNode(); QName bodyName = new QName("http://wombat.ztrade.com", "GetLastTradePrice", "m"); SOAPBodyElement bodyElement = body.addBodyElement(bodyName); QName name = new QName("symbol"); SOAPElement symbol = bodyElement.addChildElement(name); symbol.addTextNode("SUNW"); URL endpoint = new URL("http://wombat.ztrade.com/quotes"); SOAPMessage response = connection.call(message, endpoint); connection.close(); SOAPBody soapBody = response.getSOAPBody(); Iterator iterator = soapBody.getChildElements(bodyName); bodyElement = (SOAPBodyElement)iterator.next(); String lastPrice = bodyElement.getValue(); System.out.print("The last price for SUNW is "); System.out.println(lastPrice); } catch (Exception ex) { ex.printStackTrace(); } }}For theRequest class to be runnable, the second argument supplied to thecall method would have to be a valid existing URI, and this isnot true in this case. Header ExampleThe exampleHeaderExample.java, based on the code fragments in the sectionAdding Attributes, creates amessage that has several headers. It then retrieves the contents of the headersand prints them. The example generates either a SOAP 1.1 message or aSOAP 1.2 message, depending on arguments you specify. You will find the codeforHeaderExample in the following directory: tut-install/javaeetutorial5/examples/saaj/headers/src/ Building and Running the Header ExampleTo build the program using NetBeans IDE, follow these steps:
To run the program using NetBeans IDE, follow these steps:
To build and run HeaderExample using Ant, go to the directorytut-install/javaeetutorial5/examples/saaj/headers/.Use one of the following commands: ant run-headers -Dsoap=1.1 ant run-headers -Dsoap=1.2 When you run HeaderExample to generate a SOAP 1.1 message, you will seeoutput similar to the following: ----- Request Message ----<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><ns:orderDesk xmlns:ns="http://gizmos.com/NSURI" SOAP-ENV:actor="http://gizmos.com/orders"/><ns:shippingDesk xmlns:ns="http://gizmos.com/NSURI" SOAP-ENV:actor="http://gizmos.com/shipping"/><ns:confirmationDesk xmlns:ns="http://gizmos.com/NSURI" SOAP-ENV:actor="http://gizmos.com/confirmations" SOAP-ENV:mustUnderstand="1"/><ns:billingDesk xmlns:ns="http://gizmos.com/NSURI" SOAP-ENV:actor="http://gizmos.com/billing"/></SOAP-ENV:Header><SOAP-ENV:Body/></SOAP-ENV:Envelope>Header name is {http://gizmos.com/NSURI}orderDeskActor is http://gizmos.com/ordersmustUnderstand is falseHeader name is {http://gizmos.com/NSURI}shippingDeskActor is http://gizmos.com/shippingmustUnderstand is falseHeader name is {http://gizmos.com/NSURI}confirmationDeskActor is http://gizmos.com/confirmationsmustUnderstand is trueHeader name is {http://gizmos.com/NSURI}billingDeskActor is http://gizmos.com/billingmustUnderstand is falseWhen you run HeaderExample to generate a SOAP 1.2 message, you will seeoutput similar to the following: ----- Request Message ----<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header><ns:orderDesk xmlns:ns="http://gizmos.com/NSURI" env:role="http://gizmos.com/orders"/><ns:shippingDesk xmlns:ns="http://gizmos.com/NSURI" env:role="http://gizmos.com/shipping"/><ns:confirmationDesk xmlns:ns="http://gizmos.com/NSURI" env:mustUnderstand="true" env:role="http://gizmos.com/confirmations"/><ns:billingDesk xmlns:ns="http://gizmos.com/NSURI" env:relay="true" env:role="http://gizmos.com/billing"/></env:Header><env:Body/></env:Envelope>Header name is {http://gizmos.com/NSURI}orderDeskRole is http://gizmos.com/ordersmustUnderstand is falserelay is falseHeader name is {http://gizmos.com/NSURI}shippingDeskRole is http://gizmos.com/shippingmustUnderstand is falserelay is falseHeader name is {http://gizmos.com/NSURI}confirmationDeskRole is http://gizmos.com/confirmationsmustUnderstand is truerelay is falseHeader name is {http://gizmos.com/NSURI}billingDeskRole is http://gizmos.com/billingmustUnderstand is falserelay is trueDOM and DOMSource ExamplesThe examplesDOMExample.java andDOMSrcExample.java show how to add a DOM documentto a message and then traverse its contents. They show two ways todo this:
You will find the code forDOMExample andDOMSrcExample in the followingdirectory: tut-install/javaeetutorial5/examples/saaj/dom/src/ Examining theDOMExample ClassDOMExample first creates a DOM document by parsing an XML document. The fileit parses is one that you specify on the command line. static Document document;... DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); try { DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse( new File(args[0]) ); ...Next, the example creates a SOAP message in the usual way. Thenit adds the document to the message body: SOAPBodyElement docElement = body.addDocument(document); This example does not change the content of the message. Instead, it displaysthe message content and then uses a recursive method,getContents, to traversethe element tree using SAAJ APIs and display the message contents in areadable form. public void getContents(Iterator iterator, String indent) { while (iterator.hasNext()) { Node node = (Node) iterator.next(); SOAPElement element = null; Text text = null; if (node instanceof SOAPElement) { element = (SOAPElement)node; QName name = element.getElementQName(); System.out.println(indent + "Name is " + name.toString()); Iterator attrs = element.getAllAttributesAsQNames(); while (attrs.hasNext()){ QName attrName = (QName)attrs.next(); System.out.println(indent + " Attribute name is " + attrName.toString()); System.out.println(indent + " Attribute value is " + element.getAttributeValue(attrName)); } Iterator iter2 = element.getChildElements(); getContents(iter2, indent + " "); } else { text = (Text) node; String content = text.getValue(); System.out.println(indent + "Content is: " + content); } } }Examining theDOMSrcExample ClassDOMSrcExample differs fromDOMExample in only a few ways. First, after it parsesthe document,DOMSrcExample uses the document to create aDOMSource object. This codeis the same as that ofDOMExample except for the last line: static DOMSource domSource; ... try { DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File(args[0])); domSource = new DOMSource(document); ...Then, afterDOMSrcExample creates the message, it does not get the header andbody and add the document to the body, asDOMExample does. Instead,DOMSrcExample gets the SOAP part and sets theDOMSource object as its content: // Create a messageSOAPMessage message = messageFactory.createMessage();// Get the SOAP part and set its content to domSourceSOAPPart soapPart = message.getSOAPPart();soapPart.setContent(domSource); The example then uses thegetContents method to obtain the contents of boththe header (if it exists) and the body of the message. The most important difference between these two examples is the kind of documentyou can use to create the message. BecauseDOMExample adds the document tothe body of the SOAP message, you can use any valid XMLfile to create the document. But becauseDOMSrcExample makes the document the entire contentof the message, the document must already be in the form of avalid SOAP message, and not just any XML document. Building and Running the DOM and DOMSource ExamplesWhen you runDOMExample andDOMSrcExample, you can specify one of twosample XML files in the directorytut-install/javaeetutorial5/examples/saaj/dom/:
You can use either of these files when you runDOMExample. You canusedomsrc.xml to runDOMSrcExample. To build the programs using NetBeans IDE, follow these steps:
To runDOMExample using NetBeans IDE, follow these steps:
To runDOMSrcExample using NetBeans IDE, follow these steps:
To run the examples using Ant, go to the directorytut-install/javaeetutorial5/examples/saaj/dom/. To runDOMExample using Ant, use the following command: ant run-dom -Dxml-file=slide.xml To runDOMSrcExample using Ant, use the following command: ant run-domsrc -Dxml-file=domsrc.xml When you runDOMExample using the fileslide.xml, you will see outputthat begins like the following: Running DOMExample. Name is slideshow Attribute name is author Attribute value is Yours Truly Attribute name is date Attribute value is Date of publication Attribute name is title Attribute value is Sample Slide Show Content is: ... When you runDOMSrcExample using the filedomsrc.xml, you will see outputthat begins like the following: Running DOMSrcExample. Header contents: Content is: Name is {http://gizmos.com/NSURI}orderDesk Attribute name is SOAP-ENV:actor Attribute value is http://gizmos.com/orders Content is: ...If you runDOMSrcExample with the fileslide.xml, you will see runtimeerrors. Attachments ExampleThe exampleAttachments.java, based on the code fragments in the sectionsCreating anAttachmentPart Object and Adding Content andAccessing anAttachmentPart Object, creates a message that has a text attachment and an image attachment.It then retrieves the contents of the attachments and prints the contents ofthe text attachment. You will find the code for theAttachments class inthe following directory: tut-install/javaeetutorial5/examples/saaj/attachments/src/ Attachments first creates a message in the usual way. It then creates anAttachmentPart for the text attachment: AttachmentPart attachment1 = message.createAttachmentPart(); After it reads input from a file into a string namedstringContent,it sets the content of the attachment to the value of thestring and the type totext/plain and also sets a content ID. attachment1.setContent(stringContent, "text/plain");attachment1.setContentId("attached_text");It then adds the attachment to the message: message.addAttachmentPart(attachment1); The example uses ajavax.activation.DataHandler object to hold a reference to the graphicthat constitutes the second attachment. It creates this attachment using the form ofthecreateAttachmentPart method that takes aDataHandler argument. // Create attachment part for imageURL url = new URL("file:///../xml-pic.jpg");DataHandler dataHandler = new DataHandler(url);AttachmentPart attachment2 = message.createAttachmentPart(dataHandler);attachment2.setContentId("attached_image");message.addAttachmentPart(attachment2);The example then retrieves the attachments from the message. It displays thecontentIdandcontentType attributes of each attachment and the contents of the text attachment. Building and Running the Attachments ExampleTheAttachments class takes a text file as an argument. You can specifyany text file. Theattachments directory contains a file namedaddr.txt that youcan use. To build the program using NetBeans IDE, follow these steps:
To run the program using NetBeans IDE, follow these steps:
To runAttachments using Ant, go to the directorytut-install/javaeetutorial5/examples/saaj/attachments/. Use thefollowing command: ant run-att -Dfile=path-name Specify a text file as thepath-name argument: ant run-att -Dfile=addr.txt When you runAttachments using this file, you will see output like thefollowing: Running Attachments.Attachment attached_text has content type text/plainAttachment contains:Update address for Sunny Skies, Inc., to10 Upbeat StreetPleasant Grove, CA 95439USAAttachment attached_image has content type image/jpeg SOAP Fault ExampleThe exampleSOAPFaultTest.java, based on the code fragments in the sectionsCreating and Populating aSOAPFault Object andRetrieving Fault Information, creates a message that has aSOAPFault object. It then retrieves thecontents of theSOAPFault object and prints them. You will find the codeforSOAPFaultTest in the following directory: tut-install/javaeetutorial5/examples/saaj/fault/src/ LikeHeaderExample, theSOAPFaultTest class contains code that allows you to generate eithera SOAP 1.1 or a SOAP 1.2 message. Building and Running the SOAP Fault ExampleTo build the program using NetBeans IDE, follow these steps:
To run the program using NetBeans IDE, follow these steps:
To build and runSOAPFaultTest using Ant, go to the directorytut-install/javaeetutorial5/examples/saaj/fault/. Use oneof the following commands: ant run-fault -Dsoap=1.1 ant run-fault -Dsoap=1.2 When you runSOAPFaultTest to generate a SOAP 1.1 message, you will seeoutput like the following (line breaks have been inserted in the message forreadability): Here is what the XML message looks like:<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Client</faultcode><faultstring>Message does not have necessary info</faultstring><faultactor>http://gizmos.com/order</faultactor><detail><PO:order xmlns:PO="http://gizmos.com/orders/">Quantity element does not have a value</PO:order><PO:confirmation xmlns:PO="http://gizmos.com/confirm">Incomplete address: no zip code</PO:confirmation></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>SOAP fault contains: Fault code = {http://schemas.xmlsoap.org/soap/envelope/}Client Local name = Client Namespace prefix = SOAP-ENV, bound to http://schemas.xmlsoap.org/soap/envelope/ Fault string = Message does not have necessary info Fault actor = http://gizmos.com/order Detail entry = Quantity element does not have a value Detail entry = Incomplete address: no zip codeWhen you run SOAPFaultTest to generate a SOAP 1.2 message, the output lookslike this: Here is what the XML message looks like:<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header/><env:Body><env:Fault><env:Code><env:Value>env:Sender</env:Value></env:Code><env:Reason><env:Text xml:lang="en-US">Message does not have necessary info</env:Text></env:Reason><env:Role>http://gizmos.com/order</env:Role><env:Detail><PO:order xmlns:PO="http://gizmos.com/orders/">Quantity element does not have a value</PO:order><PO:confirmation xmlns:PO="http://gizmos.com/confirm">Incomplete address: no zip code</PO:confirmation></env:Detail></env:Fault></env:Body></env:Envelope>SOAP fault contains: Fault code = {http://www.w3.org/2003/05/soap-envelope}Sender Local name = Sender Namespace prefix = env, bound to http://www.w3.org/2003/05/soap-envelope Fault reason text = Message does not have necessary info Fault role = http://gizmos.com/order Detail entry = Quantity element does not have a value Detail entry = Incomplete address: no zip codeCopyright © 2010, Oracle and/or its affiliates. All rights reserved.Legal Notices |