⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saaj4.html

📁 j2eePDF格式的电子书
💻 HTML
📖 第 1 页 / 共 4 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(s, myprops.getProperty(s));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<a name="wp65236"> </a></pre></div><a name="wp65237"> </a><p class="pBody">The next four lines create a <code class="cCode">SOAPMessage</code> object. First, the code gets an instance of <code class="cCode">SOAPConnectionFactory</code> and uses it to create a connection. Then it gets an instance of <code class="cCode">MessageFactory</code> and uses it to create a message.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPConnectionFactory soapConnectionFactory =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPConnectionFactory.newInstance();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPConnection connection =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapConnectionFactory.createConnection();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFactory messageFactory =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFactory.newInstance();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPMessage message = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageFactory.createMessage();<a name="wp65238"> </a></pre></div><a name="wp65239"> </a><p class="pBody">The next lines of code retrieve the <code class="cCode">SOAPHeader</code> and <code class="cCode">SOAPBody</code> objects from the message and remove the header.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPHeader header = message.getSOAPHeader();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPBody body = message.getSOAPBody();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header.detachNode();<a name="wp65240"> </a></pre></div><a name="wp65241"> </a><p class="pBody">The following lines of code create the UDDI <code class="cCode">find_business</code> message. The first line gets a <code class="cCode">SOAPFactory</code> instance that we will use to create names. The next line adds the <code class="cCode">SOAPBodyElement</code> with a fully qualified name, including the required namespace for a UDDI version 2 message. The next lines add two attributes to the new element: the required attribute <code class="cCode">generic</code>, with the UDDI version number 2.0, and the optional attribute <code class="cCode">maxRows</code>, with the value 100. Then the code adds a child element with the <code class="cCode">Name</code> object <code class="cCode">name</code> and adds text to the element with the method <code class="cCode">addTextNode</code>. The text added is the business name you will supply at the command line when you run the application.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPFactory soapFactory = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPFactory.newInstance();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPBodyElement findBusiness = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body.addBodyElement(soapFactory.createName(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;find_business&quot;, &quot;&quot;, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;urn:uddi-org:api_v2&quot;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;findBusiness.addAttribute(soapFactory.createName(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;generic&quot;), &quot;2.0&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;findBusiness.addAttribute(soapFactory.createName(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;maxRows&quot;), &quot;100&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPElement businessName = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;findBusiness.addChildElement(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapFactory.createName(&quot;name&quot;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessName.addTextNode(args[1]);<a name="wp79111"> </a></pre></div><a name="wp79161"> </a><p class="pBody">The next line of code saves the changes that have been made to the message. This method will be called automatically when the message is sent, but it does not hurt to call it explicitly.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.saveChanges();<a name="wp79162"> </a></pre></div><a name="wp65242"> </a><p class="pBody">The following lines display the message that will be sent:</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;\n--- Request Message ---\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.writeTo(System.out);<a name="wp79186"> </a></pre></div><a name="wp79179"> </a><p class="pBody">The next line of code creates the <code class="cCode">java.net.URL</code> object that represents the destination for this message. It gets the value of the property named <code class="cCode">URL</code> from the system property file.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL endpoint = new URL(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperties().getProperty(&quot;URL&quot;));<a name="wp75134"> </a></pre></div><a name="wp69389"> </a><p class="pBody">Next the message <code class="cCode">message</code> is sent to the destination that <code class="cCode">endpoint</code> represents, which is the UDDI test registry. The <code class="cCode">call</code> method will block until it gets a <code class="cCode">SOAPMessage</code> object back, at which point it returns the reply.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPMessage reply = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.call(message, endpoint);<a name="wp65307"> </a></pre></div><a name="wp65312"> </a><p class="pBody">In the next lines of code, the first line prints out a line giving the URL of the sender (the test registry), and the others display the returned message.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;\n\nReceived reply from: &quot; + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endpoint);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;\n---- Reply Message ----\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply.writeTo(System.out);<a name="wp79197"> </a></pre></div><a name="wp76294"> </a><p class="pBody">The returned message is the complete SOAP message, an XML document, as it looks when it comes over the wire. It is a <code class="cCode">businessList</code> that follows the format specified in <code class="cCode"><a  href="http://uddi.org/pubs/DataStructure-V2.03-Published-20020719.htm#_Toc25130802" target="_blank">http://uddi.org/pubs/DataStructure-V2.03-Published-20020719.htm#_Toc25130802</a></code>.</p><a name="wp79233"> </a><p class="pBody">As interesting as it is to see the XML that is actually transmitted, the XML document format does not make it easy to see the text that is the message's content. To remedy this, the last part of <code class="cCode">MyUddiPing.java</code> contains code that prints out just the text content of the response, making it much easier to see the information you want.</p><a name="wp76292"> </a><p class="pBody">Because the content is in the <code class="cCode">SOAPBody</code> object, the first thing you need to do is access it, as shown in the following line of code.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPBody replyBody = reply.getSOAPBody();<a name="wp65314"> </a></pre></div><a name="wp79254"> </a><p class="pBody">Next the code displays a message describing the content:</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;\n\nContent extracted from &quot; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;the reply message:\n&quot;);<a name="wp79257"> </a></pre></div><a name="wp65437"> </a><p class="pBody">To display the content of the message, the code uses the known format of the reply message. First it gets all the reply body's child elements named <code class="cCode">businessList</code>:</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator businessListIterator =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replyBody.getChildElements(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapFactory.createName(&quot;businessList&quot;, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;, &quot;urn:uddi-org:api_v2&quot;));<a name="wp79284"> </a></pre></div><a name="wp79525"> </a><p class="pBody">The method <code class="cCode">getChildElements</code> returns the elements in the form of a <code class="cCode">java.util.Iterator</code> object. You access the child elements by calling the method <code class="cCode">next</code> on the <code class="cCode">Iterator</code> object.</p><a name="wp79527"> </a><p class="pBody">An immediate child of a <code class="cCode">SOAPBody</code> object is a <code class="cCode">SOAPBodyElement</code> object.</p><a name="wp65853"> </a><p class="pBody">We know that the reply can contain only one <code class="cCode">businessList</code> element, so the code then retrieves this one element by calling the iterator's <code class="cCode">next</code> method. Note that the method <code class="cCode">Iterator.next</code> returns an <code class="cCode">Object</code>, which has to be cast to the specific kind of object you are retrieving. Thus, the result of calling <code class="cCode">businessListIterator.next</code> is cast to a <code class="cCode">SOAPBodyElement</code> object:</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPBodyElement businessList = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SOAPBodyElement)businessListIterator.next();<a name="wp79308"> </a></pre></div><a name="wp66779"> </a><p class="pBody">The next element in the hierarchy is a single <code class="cCode">businessInfos</code> element, so the code retrieves this element the same way it retrieved the <code class="cCode">businessList</code>. Children of <code class="cCode">SOAPBodyElement</code> objects and all child elements from there down are <code class="cCode">SOAPElement</code> objects.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator businessInfosIterator =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessList.getChildElements(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapFactory.createName(&quot;businessInfos&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;, &quot;urn:uddi-org:api_v2&quot;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPElement businessInfos = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SOAPElement)businessInfosIterator.next();<a name="wp79319"> </a></pre></div><a name="wp79388"> </a><p class="pBody">The <code class="cCode">businessInfos</code> element contains zero or more <code class="cCode">businessInfo</code> elements. If the query returned no businesses, the code prints a message saying that none were found. If the query returned businesses, however, the code extracts the name and optional description by retrieving the child elements with those names. The method <code class="cCode">Iterator.hasNext</code> can be used in a <code class="cCode">while</code> loop because it returns <code class="cCode">true</code> as long as the next call to the method <code class="cCode">next</code> will return a child element. Accordingly, the loop ends when there are no more child elements to retrieve.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator businessInfoIterator =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessInfos.getChildElements(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapFactory.createName(&quot;businessInfo&quot;, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;, &quot;urn:uddi-org:api_v2&quot;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (! businessInfoIterator.hasNext()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;No businesses found &quot; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;matching the name &#39;&quot; + args[1] + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&#39;.&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (businessInfoIterator.hasNext()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPElement businessInfo = (SOAPElement)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessInfoIterator.next();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Extract name and description from the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// businessInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator nameIterator = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessInfo.getChildElements(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapFactory.createName(&quot;name&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;, &quot;urn:uddi-org:api_v2&quot;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (nameIterator.hasNext()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessName = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SOAPElement)nameIterator.next();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Company name: &quot; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessName.getValue());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator descriptionIterator = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessInfo.getChildElements(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soapFactory.createName(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;description&quot;, &quot;&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;urn:uddi-org:api_v2&quot;));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (descriptionIterator.hasNext()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPElement businessDescription = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SOAPElement)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;descriptionIterator.next();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Description: &quot; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;businessDescription.getValue());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<a name="wp79394"> </a></pre></div><a name="wp67914"> </a><h4 class="pHeading3">Running MyUddiPing</h4><a name="wp94000"> </a><p class="pBody">Make sure you have edited the <code class="cCode">uddi.properties</code> file and compiled <code class="cCode">MyUddiPing.java</code> as described in <a  href="SAAJ4.html#wp77489">Setting Up</a>.</p><a name="wp68787"> </a><p class="pBody">With the code compiled, you are ready to run <code class="cCode">MyUddiPing</code>. The <code class="cCode">run</code> target takes two arguments, but you need to supply only one of them. The first argument is the file <code class="cCode">uddi.properties</code>, which is supplied by a property set in <code class="cCode">build.xml</code>. The other argument is the name of the business for which you want to get a description, and you need to supply this argument on the command line. Note that any property set on the command line overrides any value set for that property in the <code class="cCode">build.xml</code> file.</p><a name="wp89042"> </a><p class="pBody">Use the following command to run the example:</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">asant run -Dbusiness-name=food<a name="wp72564"> </a></pre></div><a name="wp65777"> </a><p class="pBody">Output similar to the following will appear after the full XML message:</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">Content extracted from the reply message:Company name: FoodDescription: Test FoodCompany name: Food ManufacturingCompany name: foodCompanyADescription: It is a food company sells biscuit<a name="wp79579"> </a>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -