java 调用soap的简单例子(转载)
[代码] OrderProcessor.java
view source
print?
001 package javaxml2;
002
003 import java.io.IOException;
004 import java.io.StringWriter;
005 import java.net.MalformedURLException;
006 import java.net.URL;
007 import java.util.Enumeration;
008 import java.util.Hashtable;
009 import java.util.Iterator;
010 import java.util.LinkedList;
011 import java.util.List;
012 import java.util.Vector;
013 import javax.mail.MessagingException;
014
015 // DOM
016 import org.w3c.dom.Do*****ent;
017 import org.w3c.dom.Element;
018 import org.w3c.dom.NodeList;
019 import org.w3c.dom.Text;
020
021 // SOAP imports
022 import org.apache.soap.Constants;
023 import org.apache.soap.Envelope;
024 import org.apache.soap.Fault;
025 import org.apache.soap.SOAPException;
026 import org.apache.soap.encoding.SOAPMappingRegistry;
027 import org.apache.soap.encoding.soapenc.BeanSerializer;
028 import org.apache.soap.rpc.Call;
029 import org.apache.soap.rpc.Parameter;
030 import org.apache.soap.rpc.Response;
031 import org.apache.soap.rpc.SOAPContext;
032 import org.apache.soap.util.xml.QName;
033
034 /**
035 * <p>
036 * <code>OrderProcessor</code> is a web services client, and uses
037 * SOAP-RPC to interact with web services. However, it is also a
038 * web service, and receives SOAP messages and uses them to then
039 * construct SOAP-RPC calls, as well as sending return messages to
040 * its own web service clients.
041 * </p>
042 */
043 public class OrderProcessor {
044
045 /** Mapping for CD class */
046 private SOAPMappingRegistry registry;
047
048 /** The serializer for the CD class */
049 private BeanSerializer serializer;
050
051 /** The RPC Call object */
052 private Call call;
053
054 /** Parameters for call */
055 private Vector params;
056
057 /** Response from RPC call */
058 private Response rpcResponse;
059
060 /** The URL to connect to */
061 private URL rpcServerURL;
062
063 /**
064 * <p>
065 * This will set up initial default values.
066 * </p>
067 */
068 public void initialize() {
069 // Set up internal URL for SOAP-RPC
070 try {
071 rpcServerURL =
072 new URL("http://localhost:8080/soap/servlet/rpcrouter");
073 } catch (MalformedURLException neverHappens) {
074 // ignored
075 }
076
077 // Set up a SOAP mapping to translate CD objects
078 registry = new SOAPMappingRegistry();
079 serializer = new BeanSerializer();
080 registry.mapTypes(Constants.NS_URI_SOAP_ENC,
081 new QName("urn:cd-catalog-demo", "cd"),
082 CD.class, serializer, serializer);
083
084 // Build a Call to the internal SOAP service
085 call = new Call();
086 call.setSOAPMappingRegistry(registry);
087 call.setTargetObjectURI("urn:cd-catalog");
088 call.setMethodName("getCD");
089 call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
090
091 // Set up input
092 params = new Vector();
093 }
094
095 /**
096 * <p>
097 * This method receives SOAP messages addressed to this web service,
098 * decodes those messages, and sends them to another web service
099 * via SOAP-RPC.
100 * </p>
101 *
102 * @param env the SOAP envelope carrying the SOAP message.
103 * @param req the SOAP request variable.
104 * @param res the SOAP response variable.
105 * @throws <code>IOException</code> - when errors result in connecting
106 * to the SOAP-RPC service.
107 * @throws <code>MessagingException</code> - when errors occur
108 * in sending and receiving SOAP messages.
109 */
110 public void purchaseOrder(Envelope env, SOAPContext req, SOAPContext res)
111 throws IOException, MessagingException {
112
113 // Set up SOAP environment
114 initialize();
115
116 // Set up list of CDs successfully ordered
117 List orderedCDs = new LinkedList();
118
119 // Set up hashtable of failed orders
120 Hashtable failedCDs = new Hashtable();
121
122 // Get the purchaseOrder element - always the first body entry
123 Vector bodyEntries = env.getBody().getBodyEntries();
124 Element purchaseOrder = (Element)bodyEntries.iterator().next();
125
126 // In a real application, do something with the buyer information
127
128 // Get the CDs ordered
129 Element order =
130 (Element)purchaseOrder.getElementsByTagName("order").item(0);
131 NodeList cds = order.getElementsByTagName("cd");
132
133 // Loop through each ordered CD from the PO request
134 for (int i=0, len=cds.getLength(); i<len; i++) {
135 Element cdElement = (Element)cds.item(i);
136 String artist = cdElement.getAttribute("artist");
137 String title = cdElement.getAttribute("title");
138
139 // Set up input
140 params.clear();
141 params.addElement(new Parameter("title", String.class, title, null));
142 call.setParams(params);
143
144 try {
145 // Invoke the call
146 rpcResponse = call.invoke(rpcServerURL, "");
147
148 if (!rpcResponse.generatedFault()) {
149 Parameter returnValue = rpcResponse.getReturnValue();
150 CD cd = (CD)returnValue.getValue();
151
152 // See if the CD is available
153 if (cd == null) {
154 failedCDs.put(title, "Requested CD is not available.");
155 continue;
156 }
157
158 // Verify it's by the right artist
159 if (cd.getArtist().equalsIgnoreCase(artist)) {
160 // Add this CD to the successful orders
161 orderedCDs.add(cd);
162 } else {
163 // Add this to the failed orders
164 failedCDs.put(title, "Incorrect artist for specified CD.");
165 }
166 } else {
167 Fault fault = rpcResponse.getFault();
168 failedCDs.put(title, fault.getFaultString());
169 }
170 } catch (SOAPException e) {
171 failedCDs.put(title, "SOAP Exception: " + e.getMessage());
172 }
173 }
174
175 // At the end of the loop, return something useful to the client
176 Do*****ent doc = new org.apache.xerces.dom.Do*****entImpl();
177 Element response = doc.createElement("response");
178 Element orderedCDsElement = doc.createElement("orderedCDs");
179 Element failedCDsElement = doc.createElement("failedCDs");
180 response.appendChild(orderedCDsElement);
181 response.appendChild(failedCDsElement);
182
183 // Add the ordered CDs
184 for (Iterator i = orderedCDs.iterator(); i.hasNext(); ) {
185 CD orderedCD = (CD)i.next();
186 Element cdElement = doc.createElement("orderedCD");
187 cdElement.setAttribute("title", orderedCD.getTitle());
188 cdElement.setAttribute("artist", orderedCD.getArtist());
189 cdElement.setAttribute("label", orderedCD.getLabel());
190 orderedCDsElement.appendChild(cdElement);
191 }
192
193 // Add the failed CDs
194 Enumeration keys = failedCDs.keys();
195 while (keys.hasMoreElements()) {
196 String title = (String)keys.nextElement();
197 String error = (String)failedCDs.get(title);
198 Element failedElement = doc.createElement("failedCD");
199 failedElement.setAttribute("title", title);
200 failedElement.appendChild(doc.createTextNode(error));
201 failedCDsElement.appendChild(failedElement);
202 }
203
204 // Set this as the content of the envelope
205 bodyEntries.clear();
206 bodyEntries.add(response);
207 StringWriter writer = new StringWriter();
208 env.marshall(writer, null);
209
210 // Send the envelope back to the client
211 res.setRootPart(writer.toString(), "text/xml");
212 }
213 }
posted on 2011-11-30 13:23 ggbond1988 阅读(3721) 评论(0) 编辑 收藏 举报