This topic will talk about how to create a dynamic selection in web application using XMLHttpRequest and Servlet. In this demo a car model will be changed correspond to car brand.
Demo (Chrome, FireFox). http://mysecond.phuaccount.cloudbees.net/
Step 1. Create the XML data file "car.xml" under ./data directory.
car.xml: |
<?xml version="1.0"?> <CAR> <BRAND NAME="TOYOTA"> <MODEL>FORTUNER</MODEL> <MODEL>CAMRY</MODEL> <MODEL>ALTIS</MODEL> <MODEL>VIOS</MODEL> </BRAND> <BRAND NAME="HONDA"> <MODEL>CIVIC</MODEL> <MODEL>CITY</MODEL> <MODEL>JAZZ</MODEL> </BRAND> </CAR> |
Step 2. Create a java class to retrieve data.
Car.java: |
package com.java.dynamic.demo; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.servlet.http.HttpServletRequest; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * @author [email protected] * require library: crimson.jar */ public class Car { public static void main(String[] args) { try { Car car = new Car(); car.getCar(); //car.getBrand(); //car.getModel("HONDA"); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } private DocumentBuilderFactory factory; private Document doc; public Car() throws SAXException, IOException, ParserConfigurationException { factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); // Create the builder and parse the file doc = factory.newDocumentBuilder().parse(new File("./data/car.xml")); } public Car(HttpServletRequest request) throws SAXException, IOException, ParserConfigurationException { factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); String pathInfo = request.getRequestURL().toString(); pathInfo = pathInfo.substring(0, pathInfo.lastIndexOf(':')); int port = request.getServerPort(); pathInfo += ":"+String.valueOf(port); pathInfo += request.getContextPath(); pathInfo += "/data/car.xml"; //System.out.println("path: " + pathInfo); URL url = new URL(pathInfo); InputStream inputXML = url.openStream(); // Create the builder and parse the file doc = factory.newDocumentBuilder().parse(inputXML); } public String getCar() { String result = null; NodeList nodes = doc.getElementsByTagName("CAR"); //System.out.println("There are " + nodes.getLength() + " elements."); for (int i=0; i<nodes.getLength(); i++) { if (nodes.item(i).hasChildNodes()) { result = nodes.item(i).getChildNodes().toString(); //System.out.println("Result: " + result); } } return result; } public String getBrand() { String result = null; String data; NodeList nodes = doc.getElementsByTagName("BRAND"); //System.out.println("There are " + nodes.getLength() + " elements."); for (int i=0; i<nodes.getLength(); i++) { if (nodes.item(i).hasAttributes()) { data = nodes.item(i).getAttributes().item(0).getNodeValue(); //System.out.println("NodeValue: " +data); result = data; } } return result; } public String getModel(String brand) { String result = null; NodeList nodes = doc.getElementsByTagName("BRAND"); String attrValue; NodeList childNodes; for (int i=0; i<nodes.getLength(); i++) { if (nodes.item(i).hasAttributes()) { attrValue = nodes.item(i).getAttributes().item(0).getNodeValue(); if (attrValue.equals(brand)) if (nodes.item(i).hasChildNodes()) { childNodes = nodes.item(i).getChildNodes(); //System.out.println("ChildNode: " + childNodes); result = childNodes.toString(); //System.out.println("Data: " + result); //ProcessChildNodes(childNodes); i = nodes.getLength(); } } } return result; } public void ProcessChildNodes(NodeList node) { for (int j=0; j<node.getLength(); j++) { System.out.println("Type: " + node.item(j).getNodeType()); if (node.item(j).getNodeType() == 1) if ("MODEL".equals(node.item(j).getNodeName())) { System.out.println("Name: " + node.item(j).getNodeName()); System.out.println("Value: " + node.item(j).getFirstChild()); } } } } |
Step 3. Create a Servlet class for AJAX call to get car brand.
CarServlet.java: |
package com.java.dynamic.demo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; /** * Return car data and stream out to client. * @author [email protected] */ public class CarServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String CONTENT_TYPE = "text/xml; charset=UTF-8"; //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); try { Car car = new Car(request); String carString = car.getCar(); PrintWriter out = response.getWriter(); out.println(carString); out.flush(); out.close(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } //Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
Step 4. Create a Servlet class for AJAX call to get car model.
ModelServlet.java: |
package com.java.dynamic.demo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; /** * Return car model for a given brand and stream out to client. * @author [email protected] */ public class ModelServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String CONTENT_TYPE = "text/xml; charset=UTF-8"; //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); String brand = request.getParameter("brand"); try { Car car = new Car(request); String carString = car.getModel(brand); PrintWriter out = response.getWriter(); out.println(carString); out.flush(); out.close(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } //Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
Step 5. Create a Sale class to provide sale history.
Sale.java: |
package com.java.dynamic.demo; import java.text.SimpleDateFormat; import java.util.Date; /** * Generate sale history report. * @author [email protected] */ public class Sale { /** * For testing */ public static void main(String[] args) { Sale sale = new Sale(); System.out.println(""+sale.getSaleReport()); } private String brand = null; private String model = null; private String[] region = {"North", "South", "East", "West"}; private String[] monthName = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; private SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MM"); /** * Constructor for testing */ public Sale() { } /** * Constructor for application * @param brand, brand of a car * @param model, model of a car of that brand */ public Sale(String brand, String model) { this.brand = brand; this.model = model; } /** * Get a report 12 months back * @return result as XML string */ public String getSaleReport() { StringBuffer sb = new StringBuffer(); String date = sdf.format(new Date()); String[] dates = date.split(","); int month = new Integer(dates[1]).intValue(); String year = dates[0]; sb.append("<RESULT>"); sb.append("<CAR BRAND=\""+brand+"\" MODEL=\""+model+"\">"); for (int i=0; i<region.length; i++) { sb.append("<REGION REGION=\""+region[i]+"\">"); for (int j=month-1; j<12; j++) { sb.append("<SALE MONTH=\""+monthName[j]+"\" YEAR=\""+(new Integer(year).intValue()-1)+"\">"); sb.append(String.valueOf(Math.floor(Math.random()*100))); sb.append("</SALE>"); } if (month > 0) { for (int j=0; j<month-1; j++) { sb.append("<SALE MONTH=\""+monthName[j]+"\" YEAR=\""+year+"\">"); sb.append(String.valueOf(Math.floor(Math.random()*100))); sb.append("</SALE>"); } } sb.append("</REGION>"); } sb.append("</CAR>"); sb.append("</RESULT>"); return sb.toString(); } } |
Step 6. Create a Servlet class to get sale report.
SaleServlet.java: |
package com.java.dynamic.demo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Return sale history for a given brand and model, then stream out to client. * @author [email protected] */ public class SaleServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String CONTENT_TYPE = "text/xml; charset=UTF-8"; //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); String brand = request.getParameter("brand"); String model = request.getParameter("model"); Sale sale = new Sale(brand, model); PrintWriter out = response.getWriter(); out.println(sale.getSaleReport()); out.flush(); out.close(); } //Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
Step 7. Create web.xml
web.xml: |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>CarServlet</servlet-name> <servlet-class>com.java.dynamic.demo.CarServlet</servlet-class> </servlet> <servlet> <servlet-name>ModelServlet</servlet-name> <servlet-class>com.java.dynamic.demo.ModelServlet</servlet-class> </servlet> <servlet> <servlet-name>SaleServlet</servlet-name> <servlet-class>com.java.dynamic.demo.SaleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SaleServlet</servlet-name> <url-pattern>/sale</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ModelServlet</servlet-name> <url-pattern>/model</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CarServlet</servlet-name> <url-pattern>/car</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> |
Step 8. Create html page.
index.html: |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
Lastly build together a war file and deploy in application server.
Tested with JBoss-4.0.5GA, IE-6.0, FireFox-3.0.
Last update 26-Mar-2009: Modify "index.html" to support browser FireFox-3.0.
What changed:
1. Change from onload="GetCarBrand(),GetCarModel()" to onload="GetCarBrand()".
2. Move GetCarModel() to under GetCarBrand().
You can download source code and example war file: http://www.mediafire.com/file/gyofuday3jk/dynamic_selection_ie_firefox.zip
ไม่มีความเห็น