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

📄 cb4.html

📁 j2eePDF格式的电子书
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<div class="pPreformattedRelative"><pre class="pPreformattedRelative">URL endpoint = new URL(url);SOAPMessage reply = con.call(msg, endpoint);con.close();<a name="wp68087"> </a></pre></div><a name="wp68602"> </a><p class="pBody">Because we map the given endpoint to <code class="cCode">ConfirmationServlet</code>, the J2EE server executes that servlet (discussed in <a  href="CB4.html#wp65933">Returning the Order Confirmation</a>) to create and return the <code class="cCode">SOAPMessage</code> object <code class="cCode">reply</code>.</p><a name="wp68064"> </a><h5 class="pHeading4">Retrieving the Order Confirmation</h5><a name="wp68096"> </a><p class="pBody">The rest of the <code class="cCode">placeOrder</code> method retrieves the information returned in <code class="cCode">reply</code>. The client knows what elements are in it because they are specified in <code class="cCode">confirm.dtd</code>. After accessing the <code class="cCode">SOAPBody</code> object, the code retrieves the <code class="cCode">confirmation</code> element and gets the text of the <code class="cCode">orderID</code> and <code class="cCode">ship-date</code> elements. Finally, it constructs and returns a <code class="cCode">ConfirmationBean</code> with this information.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">SOAPBody sBody = reply.getSOAPPart().getEnvelope().getBody();Iterator bodyIt = sBody.getChildElements();SOAPBodyElement sbEl = (SOAPBodyElement)bodyIt.next();Iterator bodyIt2 = sbEl.getChildElements();SOAPElement ID = (SOAPElement)bodyIt2.next();String id = ID.getValue();SOAPElement sDate = (SOAPElement)bodyIt2.next();String shippingDate = sDate.getValue();SimpleDateFormat df = &nbsp;&nbsp;new SimpleDateFormat(&quot;EEE MMM dd HH:mm:ss z yyyy&quot;);Date date = df.parse(shippingDate);Calendar cal = new GregorianCalendar();cal.setTime(date);cb = new ConfirmationBean(id, cal); <a name="wp72489"> </a></pre></div><a name="wp67322"> </a><h3 class="pHeading2">SAAJ Service</h3><a name="wp65894"> </a><p class="pBody">The SAAJ coffee distributor, the SAAJ server in this scenario, provides the response part of the request-response paradigm. When SAAJ messaging is being used, the server code is a servlet. The core part of each servlet is made up of three <code class="cCode">javax.servlet.HttpServlet</code> methods: <code class="cCode">init</code>, <code class="cCode">doPost</code>, and <code class="cCode">onMessage</code>. The <code class="cCode">init</code> and <code class="cCode">doPost</code> methods set up the response message, and the <code class="cCode">onMessage</code> method gives the message its content.</p><a name="wp65908"> </a><h4 class="pHeading3">Returning the Price List</h4><a name="wp67305"> </a><p class="pBody">This section takes you through the servlet <code class="cCode"><a  href="../examples/cb/saaj/src/com/sun/cb/PriceListServlet.java" target="_blank">PriceListServlet</a></code>. This servlet creates the message with the current price list that is returned to the method <code class="cCode">call</code>, invoked in <code class="cCode">PriceListRequest</code>. </p><a name="wp68357"> </a><p class="pBody">Any servlet extends a <code class="cCode">javax.servlet</code> class. Being part of a Web application, this servlet extends <code class="cCode">HttpServlet</code>. It first creates a static <code class="cCode">MessageFactory</code> object that will be used later to create the <code class="cCode">SOAPMessage</code> object that is returned.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">public class PriceListServlet extends HttpServlet { &nbsp;&nbsp;static MessageFactory fac = null; &nbsp;&nbsp;static { &nbsp;&nbsp;&nbsp;&nbsp;try { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fac = MessageFactory.newInstance();&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception ex) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;};<a name="wp68254"> </a></pre></div><a name="wp68618"> </a><p class="pBody">Every servlet has an <code class="cCode">init</code> method. This <code class="cCode">init</code> method initializes the servlet with the configuration information that the J2EE server passed to it.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">public void init(ServletConfig servletConfig) &nbsp;&nbsp;&nbsp;&nbsp;throws ServletException { &nbsp;&nbsp;super.init(servletConfig);}<a name="wp68377"> </a></pre></div><a name="wp68626"> </a><p class="pBody">The next method defined in <code class="cCode">PriceListServlet</code> is <code class="cCode">doPost</code>, which does the real work of the servlet by calling the <code class="cCode">onMessage</code> method. (The <code class="cCode">onMessage</code> method is discussed later in this section.) The J2EE server passes the <code class="cCode">doPost</code> method two arguments. The first argument, the <code class="cCode">HttpServletRequest</code> object <code class="cCode">req</code>, holds the content of the message sent in <code class="cCode">PriceListRequest</code>. The <code class="cCode">doPost</code> method gets the content from <code class="cCode">req</code> and puts it in the <code class="cCode">SOAPMessage</code> object <code class="cCode">msg</code> so that it can pass it to the <code class="cCode">onMessage</code> method. The second argument, the <code class="cCode">HttpServletResponse</code> object <code class="cCode">resp</code>, will hold the message generated by executing the method <code class="cCode">onMessage</code>. </p><a name="wp68651"> </a><p class="pBody">In the following code fragment, <code class="cCode">doPost</code> calls the methods <code class="cCode">getHeaders</code> and <code class="cCode">putHeaders</code>, defined immediately after <code class="cCode">doPost</code>, to read and write the headers in <code class="cCode">req</code>. It then gets the content of <code class="cCode">req</code> as a stream and passes the headers and the input stream to the method <code class="cCode">MessageFactory.createMessage</code>. The result is that the <code class="cCode">SOAPMessage</code> object <code class="cCode">msg</code> contains the request for a price list. Note that in this case, <code class="cCode">msg</code> does not have any headers because the message sent in <code class="cCode">PriceListRequest</code> did not have any headers.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">public void doPost(HttpServletRequest req, &nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse resp) &nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException { &nbsp;&nbsp;try { &nbsp;&nbsp;&nbsp;&nbsp;// Get all the headers from the HTTP request &nbsp;&nbsp;&nbsp;&nbsp;MimeHeaders headers = getHeaders(req);&nbsp;&nbsp;&nbsp;&nbsp;// Get the body of the HTTP request &nbsp;&nbsp;&nbsp;&nbsp;InputStream is = req.getInputStream();&nbsp;&nbsp;&nbsp;&nbsp;// Now internalize the contents of the HTTP request &nbsp;&nbsp;&nbsp;&nbsp;// and create a SOAPMessage &nbsp;&nbsp;&nbsp;&nbsp;SOAPMessage msg = fac.createMessage(headers, is);<a name="wp68627"> </a></pre></div><a name="wp68647"> </a><p class="pBody">Next, the code declares the <code class="cCode">SOAPMessage</code> object <code class="cCode">reply</code> and populates it by calling the method <code class="cCode">onMessage</code>. </p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;SOAPMessage reply = null;&nbsp;&nbsp;&nbsp;&nbsp;reply = onMessage(msg);<a name="wp68648"> </a></pre></div><a name="wp68871"> </a><p class="pBody">If <code class="cCode">reply</code> has anything in it, its contents are saved, the status of <code class="cCode">resp</code> is set to OK, and the headers and content of <code class="cCode">reply</code> are written to <code class="cCode">resp</code>. If <code class="cCode">reply</code> is empty, the status of <code class="cCode">resp</code> is set to indicate that there is no content.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">&nbsp;&nbsp;&nbsp;&nbsp;if (reply != null) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Need to call saveChanges because we're &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * going to use the MimeHeaders to set HTTP &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * response information. These MimeHeaders&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * are generated as part of the save.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (reply.saveRequired()) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply.saveChanges(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.setStatus(HttpServletResponse.SC_OK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putHeaders(reply.getMimeHeaders(), resp); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Write out the message on the response stream &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream os = resp.getOutputStream(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply.writeTo(os); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.flush(); &nbsp;&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.setStatus(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse.SC_NO_CONTENT);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;} catch (Exception ex) { &nbsp;&nbsp;&nbsp;&nbsp;throw new ServletException( &quot;SAAJ POST failed: &quot; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.getMessage()); &nbsp;&nbsp;} }<a name="wp73403"> </a></pre></div><a name="wp69755"> </a><p class="pBody">The methods <code class="cCode">getHeaders</code> and <code class="cCode">putHeaders</code> are not standard methods in a servlet the way <code class="cCode">init</code>, <code class="cCode">doPost</code>, and <code class="cCode">onMessage</code> are. The method <code class="cCode">doPost</code> calls <code class="cCode">getHeaders</code> and passes it the <code class="cCode">HttpServletRequest</code> object <code class="cCode">req</code> that the J2EE server passed to it. It returns a <code class="cCode">MimeHeaders</code> object populated with the headers from <code class="cCode">req</code>.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">static MimeHeaders getHeaders(HttpServletRequest req) {&nbsp;&nbsp;Enumeration enum = req.getHeaderNames(); &nbsp;&nbsp;MimeHeaders headers = new MimeHeaders();&nbsp;&nbsp;while (enum.hasMoreElements()) { &nbsp;&nbsp;&nbsp;&nbsp;String headerName = (String)enum.nextElement(); &nbsp;&nbsp;&nbsp;&nbsp;String headerValue = req.getHeader(headerName);&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer values = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new StringTokenizer(headerValue, &quot;,&quot;); &nbsp;&nbsp;&nbsp;&nbsp;while (values.hasMoreTokens()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers.addHeader(headerName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values.nextToken().trim());&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}&nbsp;&nbsp;return headers; }<a name="wp68265"> </a></pre></div><a name="wp69760"> </a><p class="pBody">The <code class="cCode">doPost</code> method calls <code class="cCode">putHeaders</code> and passes it the <code class="cCode">MimeHeaders</code> object <code class="cCode">headers</code>, which was returned by the method <code class="cCode">getHeaders</code>. The method <code class="cCode">putHeaders</code> writes the headers in <code class="cCode">headers</code> to <code class="cCode">res</code>, the second argument passed to it. The result is that <code class="cCode">res</code>, the response that the J2EE server will return to the method <code class="cCode">call</code>, now contains the headers that were in the original request.</p><div class="pPreformattedRelative"><pre class="pPreformattedRelative">static void putHeaders(MimeHeaders headers,&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse res) {&nbsp;&nbsp;Iterator it = headers.getAllHeaders(); &nbsp;&nbsp;while (it.hasNext()) { &nbsp;&nbsp;&nbsp;&nbsp;MimeHeader header = (MimeHeader)it.next();&nbsp;&nbsp;&nbsp;&nbsp;String[] values = headers.getHeader(header.getName()); &nbsp;&nbsp;&nbsp;&nbsp;if (values.length == 1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(header.getName(), header.getValue()); &nbsp;&nbsp;&nbsp;&nbsp;else { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer concat = new StringBuffer(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (i &lt; values.length) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i != 0) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;concat.append(&#39;,&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;concat.append(values[i++]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.setHeader(header.getName(), concat.toString()); 

⌨️ 快捷键说明

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