------------------------------------------------------------------------------------- <%@ page info="Sample JSP for Con-way XML Rating" %> <!-- Imports required for page compilation --> <%@ page import="java.text.*,java.math.*,java.net.*,java.io.*" %> <!-- Imports required for XML parsing with JAXP --> <%@ page import="javax.xml.parsers.*,org.w3c.dom.*,org.xml.sax.*" %> <% /* Con-way XML Interface Sample Code for JSP - Rating ----------------- TODO: * replace the USERNAME and PASSWORD String values in variables below with your Con-way username and password ----------------- Send any questions to Con-way XML Support at xmlsupport@Con-way.com */ //Declare variables // Con-way authentication // *** replace the "USERNAME" & "PASSWORD" String values with your Con-way username and password String username = "USERNAME"; String password = "PASSWORD"; //sample variable to demonstrate how to pull values out of XML elements //Set value to name of desired element name from the XML Response. String myElement = "NetCharge"; String myValue = ""; String title = "Rating"; String requestType = "RateRequest"; String conwayXmlUrl = "https://www.Con-way.com/XMLj/X-Rate"; String xmlRequest = new String(); // a string to hold XML Request document StringBuffer xmlResponse = new StringBuffer(10000); String localError = new String(); // a string to store any Error Messages. String today = new SimpleDateFormat("MM/dd/yy").format(new java.util.Date()); /* Build Rate Request XML. * In actual use, you would probably populate the Rating Request * parameters (Weights, Classes, Zip Codes, etc.) from data submitted * via an on-line order form or database. * For this sample we will just hard code some dummy data. */ xmlRequest = "<RateRequest>" + "<OriginZip country=\"us\">97006</OriginZip>" + "<DestinationZip country=\"us\">33179</DestinationZip>" + "<ChargeCode>P</ChargeCode>" + "<DiscountRate>100</DiscountRate>" + "<EffectiveDate>" + today + "</EffectiveDate>" + "<Item>" + "<CmdtyClass>775</CmdtyClass>" + "<Weight unit=\"lbs\">667</Weight>" + "</Item>" + "<Item>" + "<CmdtyClass>100</CmdtyClass>" + "<Weight unit=\"lbs\">555</Weight>" + "</Item>" + "<Accessorial>SSC</Accessorial>" + "<Accessorial>DNC</Accessorial>" + "<Accessorial>GUR</Accessorial>" + "</RateRequest>"; xmlRequest = URLEncoder.encode(xmlRequest); // converts characters to proper format for post /* Call Con-way XML Interface. * All the classes used here are java base classes available with any JDK. * Set up the URL. */ try { // Create a URL connection URL myurl = new URL(conwayXmlUrl); HttpURLConnection myConnection = (HttpURLConnection) myurl.openConnection(); // Setup connection parameters myConnection.setRequestMethod("POST"); myConnection.setDoOutput(true); myConnection.setDoInput(true); myConnection.setUseCaches(false); // Set the headers correctly (URL encoding, authentication) myConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); String authString = username + ":" + password; String auth = "Basic " + new sun.misc.BASE64Encoder().encode(authString.getBytes()); myConnection.setRequestProperty("Authorization", auth); // Send the XML message is sent as a formField/value pair DataOutputStream myOutStream = new DataOutputStream(myConnection.getOutputStream()); myOutStream.writeBytes(requestType + "=" + xmlRequest); myOutStream.flush(); myOutStream.close(); // Now we can read the XML response. First create an InputStream InputStream iStream = myConnection.getInputStream(); // mark the InputStream before reading so it can be reset, and re-read iStream.mark(10000); // Create a reader to get the entire XML response as a String InputStreamReader myInReader = new InputStreamReader(iStream); int chr = myInReader.read(); int responseLength = 0; // Build the response Stringbuffer from the InputStream while (chr != -1) { responseLength++; xmlResponse.append(String.valueOf((char) chr)); chr = myInReader.read(); } /* Parse the XML response to get specific element values * You could use JAXP & DOM, JDOM or other XML parsers from Sun, IBM, etc. * If you need only the final net charge of the quote you might find it easier * in some cases to use a simpler method such as 'indexOf' on the response String. */ // Let's say you use JAXP and DOM Level 2 - here's how you would get the DOM tree // and specific element values. // First, reset the InputStream created above iStream.reset(); // Then create a W3C DOM document using the InputStream DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); org.w3c.dom.Document domDoc = db.parse(iStream); // Now you can get a specific element value using the cumbersome W3C DOM methods myValue = domDoc.getDocumentElement().getElementsByTagName(myElement).item(0) .getFirstChild().getNodeValue(); // Close the stream myInReader.close(); } catch (Exception e) { localError = e.toString(); } %> <HTML> <HEAD> <TITLE>Sample JSP for Con-way XML <%=title%></TITLE> </HEAD> <BODY> <CENTER> <B><FONT face="arial" size=+1><I>Sample JSP Con-way XML <%=title%></I></FONT></B> </CENTER> <BR> <b>Here is the XML Response Data for <%=title%>:</b><br><br> <code> <% if (localError.equals("")) { out.print(xmlResponse); } else { out.print(localError); } %> </code> <!--- Print the element name and its value ---> <br><br> <b>Here is the data we retrieved from the &lt;<%=myElement%>&gt; element in the XML Response: <%="<br><br><B>" + myElement + " = " + myValue %></b> </BODY> </HTML> -------------------------------------------------------------------------------------