Hack 46. Display the Keys/Values from a Java HashMap on a Web Page
Connect to a Java object running on the server and use JavaScript to display a HashMap's contents on a web page. This hack takes a java.util.HashMap containing the names of bike manufacturers keyed to their product codes and displays this information on a web page. The earlier hacks in this chapter introduced the reader to this web page, which Figure 5-2 shows.
The place on the web page where we want to display these values looks like this in the HTML code: <h3>Product codes</h3> <div ></div> This code represents a subheading and a div element with the id prodCodes. When the web page loads, the code asks the server component for the contents of a Java HashMap. The code displays the Map keys followed by "::" then the Map values, as in "Specialized :: 0006," with a little styling added to boot. The server component and web page are set up and configured just as in "Integrate DWR into Your Java Web Application" [Hack #43]. To refresh your memory, here are the script tags that the web page uses, so that the application can use DWR and hacks5_1.js, which contains our own JavaScript: <script type="text/javascript" src="/books/4/254/1/html/2//parkerriver/ajaxhacks/js/hacks5_1.js"></script> <script type="text/javascript" src="/books/4/254/1/html/2//parkerriver/dwr/interface/JsBikeBean.js"> </script> <script type="text/javascript" src="/books/4/254/1/html/2//parkerriver/dwr/interface/JsDate.js"></script> <script type="text/javascript" src="/books/4/254/1/html/2//parkerriver/dwr/engine.js"></script> <script type="text/javascript" src="/books/4/254/1/html/2//parkerriver/dwr/util.js"></script> The code from hacks5_1.js calls a JsBikeBean method to display the converted HashMap's values inside the div element. Here is the Java code to which the bound JavaScript object JsBikeBean has access: private static Map BIKE_INFO; static { BIKE_INFO = Collections.synchronizedMap(new HashMap( )); BIKE_INFO.put("Trek","0001"); BIKE_INFO.put("Orbea","0002"); BIKE_INFO.put("Guru","0003"); BIKE_INFO.put("Giant","0004"); BIKE_INFO.put("Look","0005"); BIKE_INFO.put("Specialized","0006"); BIKE_INFO.put("Cannondale","0007"); } public static Map getBikeInfo( ) { return BIKE_INFO; } The getBikeInfo( ) method simply returns the Map with all these values.
Traveling at the speed of light from the server to the browser code, here is the web page's underlying JavaScript: //This method is called by the window.onload event handler function setupMap( ){ JsBikeBean.getBikeInfo(setProdCodes); } //"jsHashmap" is the JS object representation of a HashMap function setProdCodes(jsHashmap){ var div = document.getElementById("prodCodes"); //remove old messages div.innerHTML=""; div.style.color="purple"; div.style.fontSize="0.9em"; var tmpText; for(var prop in jsHashmap) { tmpText = prop + " :: "+ jsHashmap[prop]; div.appendChild(document.createTextNode(tmpText)); div.appendChild(document.createElement("br")); } } getBikeInfo( ) returns the HashMap value and passes it as the parameter to the setProdCodes( ) function: JsBean.getBikeInfo(setProdCodes); ... function setProdCodes(jsHashmap){...} setProdCodes( ) represents the callback mechanism that DWR uses to exchange data between the server's return values and the web page's code.
The HashMap values that originated on the server manifest as the callback function's parameter. The jsHashmap parameter in setProdCodes(jsHashmap) contains the bike-maker names as keys and the product codes as values. The code gets a reference to the div within which this information will be displayed, then specifies the font size and color of the text: div.style.color="purple"; div.style.fontSize="0.9em"; The DWR framework does a lot of useful work for a script and an Ajax developer. The framework returns the hash table value in JSON format [Hack #7] as a JavaScript object.
As a result, the code can easily display the keys and values of the object using a for/in loop: for(var prop in jsHashmap) { tmpText = prop + " :: "+ jsHashmap[prop]; div.appendChild(document.createTextNode(tmpText)); div.appendChild(document.createElement("br")); } The code writes the bike-maker names and product codes by displaying the key and value followed by a line break (br) tag: /* i.e., jsHashmap["Trek"]returns "0001" */ tmpText = prop + " :: "+ jsHashmap[prop]; div.appendChild(document.createTextNode(tmpText)); div.appendChild(document.createElement("br")); tmpText contains the line of text that the web page displays, as in "Trek :: 0001." During each iteration of the for/in loop, the code writes out a separate line representing a different bike company and product code. "Use DWR to Populate an Ordered List from a Java Array" [Hack #47] dynamically generates an ordered or unordered list from Java values on the server. |