SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
© 2007 Marty Hall




               Ajax: The Basics
          Originals of Slides and Source Code for Examples:
      http://courses.coreservlets.com/Course-Materials/ajax.html

                  Customized J2EE Training: http://courses.coreservlets.com/
  Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
  Developed and taught by well-known author and developer. At public venues or onsite at your location.




                                                                                                             © 2007 Marty Hall




 For live Ajax & GWT training, see training
courses at http://courses.coreservlets.com/.
   Taught by the author of Core Servlets and JSP, More
      Servlets and JSP, and this tutorial. Available at
    public venues, or customized versions can be held
                on-site at your organization.
   • Courses developed and taught by Marty Hall
         – Java 5, Java 6, intermediate/beginning servlets/JSP, advanced servlets/JSP, Struts, JSF, Ajax, GWT, custom mix of topics
                  Customized J2EE Training: http://courses.coreservlets.com/
   • Courses developed and taught by coreservlets.com experts (edited by Marty)
  Servlets,Spring, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
         – JSP, Hibernate, EJB3, Ruby/Rails
  Developed and taught by well-known author and developer. At public venues or onsite at your location.
                                    Contact hall@coreservlets com for details
Topics in This Section
    •   Ajax motivation
    •   The basic Ajax process
    •   Using dynamic content and JSP
    •   Using dynamic content and servlets
    •   Sending GET data
    •   Sending POST data
    •   Displaying HTML results
    •   Parsing and displaying XML results
    •   Toolkits

5                                                                 J2EE training: http://courses.coreservlets.com




                                                                                                © 2007 Marty Hall




                                     Motivation

                         Customized J2EE Training: http://courses.coreservlets.com/
           Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
           Developed and taught by well-known author and developer. At public venues or onsite at your location.
Why Ajax?
    • HTML and HTTP are weak
      – Non-interactive
      – Coarse-grained updates
    • Everyone wants to use a browser
      – Not a custom application
    • "Real" browser-based active content
      – Failed: Java Applets
         • Not universally supported; can't interact with the HTML
      – Serious alternative: Flash (and Flex)
         • Not yet universally supported; limited power
      – New and unproven
         • Microsoft Silverlight
         • JavaFX
         • Adobe Apollo
7                                         J2EE training: http://courses.coreservlets.com




    Google Suggest
    (http://labs.google.com/suggest/)




8                                         J2EE training: http://courses.coreservlets.com
© 2007 Marty Hall




                    The Basic Process

                          Customized J2EE Training: http://courses.coreservlets.com/
            Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
            Developed and taught by well-known author and developer. At public venues or onsite at your location.




     The Basic Ajax Process
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
                 – Supply as onreadystatechange attribute of request
           • Initiate a GET or POST request
           • Send data
       – Handle response
           • Wait for readyState of 4 and HTTP status of 200
           • Extract return text with responseText or responseXML
           • Do something with result
     • HTML
       – Loads JavaScript
       – Designates control that initiates request
10
       – Gives ids to input elements that will be read by script
                                                J2EE training: http://courses.coreservlets.com
Define a Request Object
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);                  Version for Internet Explorer
       }                                5 and 6
     }

                                         Object for Netscape 5+, Firefox, Opera, Safari,
                                         and Internet Explorer 7

        Fails on older and nonstandard browsers
11                                                         J2EE training: http://courses.coreservlets.com




      Initiate Request
     function sendRequest() {           Response handler function name
       request = getRequestObject();
       request.onreadystatechange = handleResponse;
       request.open("GET", "message-data.html", true);
       request.send(null);
     }
                                                  URL of server-side resource


                                                               Don't wait for response
       POST data
                                                               (Send request asynchronously)
       (always null for GET)




12                                                         J2EE training: http://courses.coreservlets.com
Handle Response
     function handleResponse() {
       if (request.readyState == 4) {
         alert(request.responseText);
       }
     }                             Response is returned from server
                                               (handler gets invoked multiple times)


                             Text of server response




               Pop up dialog box




13                                                     J2EE training: http://courses.coreservlets.com




      Complete JavaScript Code
      (show-message.js)
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }

     function sendRequest() {
       request = getRequestObject();
       request.onreadystatechange = handleResponse;
       request.open("GET", "message-data.html", true);
       request.send(null);
     }

     function handleResponse() {
       if (request.readyState == 4) {
         alert(request.responseText);
       }
14   }                                                 J2EE training: http://courses.coreservlets.com
The Firefox JavaScript Console
     • Open via Tools             Error Console




     • Also see Venkman JavaScript debugger
       – http://www.mozilla.org/projects/venkman/
15
       – https://addons.mozilla.org/firefox/216/
                                              J2EE training: http://courses.coreservlets.com




     HTML Code
     • Use xhtml, not HTML 4
       – In order to manipulate it with DOM
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">...</html>

          • Due to IE bug, do not use XML header before the DOCTYPE
     • Load the JavaScript file
          <script src="relative-url-of-JavaScript-file"
                  type="text/javascript"></script>

          • Use separate </script> end tag
     • Designate control to initiate request
          <input type="button" value="button label"
                 onclick="mainFunction()"/>
16                                            J2EE training: http://courses.coreservlets.com
Internet Explorer XHTML Bugs
     • Can't handle XML header
         – XML documents in general are supposed to start with
           XML header:
             • <?xml version="1.0" encoding="UTF-8"?>
               <!DOCTYPE html ...>
               <html xmlns="http://www.w3.org/1999/xhtml">...</html>
         – XHTML specification recommends using it
         – But... Internet Explorer will switch to quirks-mode (from
           standards-mode) if DOCTYPE is not first line.
             • Many recent style sheet formats will be ignored
             • So omit XML header
     • Needs separate end tags in some places
         – Scripts will not load if you use <script .../>
17
           instead of <script...></script> J2EE training: http://courses.coreservlets.com




      HTML Code
      (show-message.html)
     <!DOCTYPE html PUBLIC "..."
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head><title>Ajax: Simple Message</title>
     <script src="show-message.js"
             type="text/javascript"></script>
     </head>
     <body>
     <center>
     <table border="1" bgcolor="gray">
       <tr><th><big>Ajax: Simple Message</big></th></tr>
     </table>
     <p/>
     <form action="#">
      <input type="button" value="Show Message"
             onclick="sendRequest()"/>
     </form>
18   </center></body></html>            J2EE training: http://courses.coreservlets.com
HTML Code (message-data.html)
     Some random message




     • Note: executing this example
        – Since main page uses relative URL and HTML content has no dynamic
          content, you can run this example directly from the disk without using a
          server. But later examples require dynamic content, so all examples will be
19
          shown running on Tomcat.                  J2EE training: http://courses.coreservlets.com




      The Basic Process: Results




20                                                         J2EE training: http://courses.coreservlets.com
© 2007 Marty Hall




                     Dynamic Content
                        from JSP

                        Customized J2EE Training: http://courses.coreservlets.com/
          Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
          Developed and taught by well-known author and developer. At public venues or onsite at your location.




     First Example: Design Deficiencies
     • Content was the same on each request
       – Could have just hardcoded the alert value in JavaScript
       – Instead, invoke a JSP page on the server
     • Resource address hardcoded in JavaScript
       – Prevents functions from applying to multiple situations
       – Instead, make generic function and pass address to it
     • JavaScript file was in same folder as HTML
       – Makes it hard to reuse the JavaScript in different pages
       – Instead, make a special directory for JavaScript
     • No style sheet was used
       – Less for JavaScript to work with when manipulating page
       – Use CSS for normal reasons as well as for JavaScript
22                                                               J2EE training: http://courses.coreservlets.com
Steps
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
                – Supply as onreadystatechange attribute of request
           • Initiate a GET or POST request to a JSP page
           • Send data
       – Handle response
           • Wait for readyState of 4 and HTTP status of 200
           • Extract return text with responseText or responseXML
           • Do something with result
     • HTML
       – Loads JavaScript from centralized directory
       – Designates control that initiates request
23
       – Gives ids to input elements that will be read by script
                                                J2EE training: http://courses.coreservlets.com




     Define a Request Object
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }
                                           No changes from previous example




24                                                     J2EE training: http://courses.coreservlets.com
Initiate Request
     function sendRequest(address) {
       request = getRequestObject();
       request.onreadystatechange = showResponseAlert;
       request.open("GET", address, true);
       request.send(null);
     }

                          Relative URL of server-side resource.
                          (In this example, we will pass in the address
                          of a JSP page.)




25                                       J2EE training: http://courses.coreservlets.com




     Handle Response
     function showResponseAlert() {
       if ((request.readyState == 4) &&
           (request.status == 200)) {
         alert(request.responseText);
       }
     }

                               Server response came back with no errors.
                               (HTTP status code 200.)




26                                       J2EE training: http://courses.coreservlets.com
Complete JavaScript Code
      (Part of ajax-basics.js)
     var request;
     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }

     function sendRequest(address) {
       request = getRequestObject();
       request.onreadystatechange = showResponseAlert;
       request.open("GET", address, true);
       request.send(null);
     }

     function showResponseAlert() {
       if ((request.readyState == 4) &&
           (request.status == 200)) {
         alert(request.responseText);
       }
27   }                                        J2EE training: http://courses.coreservlets.com




      HTML Code
     • Loads JavaScript from central location
            <script src="../scripts/ajax-basics.js"
                    type="text/javascript"></script>
     • Passes JSP address to main function
            <input type="button" value="Show Server Time"
                   onclick='sendRequest("show-time.jsp")'/>
     • Uses style sheet
            <link rel="stylesheet"
                                                           Note single quotes
                  href="../css/styles.css"                 (Because of double
                  type="text/css"/>                        quotes inside parens.)




28                                            J2EE training: http://courses.coreservlets.com
HTML Code
      (show-time-1.html)
     <!DOCTYPE html PUBLIC "..."
       "http://www.w3.org/...">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head><title>Ajax: Time</title>
     <link rel="stylesheet"
            href="../css/styles.css"
            type="text/css"/>
     <script src="../scripts/ajax-basics.js"
              type="text/javascript"></script>
     </head>
     <body>
     ...
     <form action="#">
      <input type="button" value="Show Server Time"
              onclick='sendRequest("show-time.jsp")'/>
     </form>
29   </center></body></html>           J2EE training: http://courses.coreservlets.com




      JSP Code (show-time.jsp)
     <%= new java.util.Date() %>




     • Note: executing this example
        – You must run from Tomcat.
             • Otherwise JSP cannot execute
30           • Otherwise status code is -1, not 200   J2EE training: http://courses.coreservlets.com
Message from JSP: Results




31                                                            J2EE training: http://courses.coreservlets.com




                                                                                            © 2007 Marty Hall




                  Dynamic Content
                    from Servlet

                     Customized J2EE Training: http://courses.coreservlets.com/
       Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
       Developed and taught by well-known author and developer. At public venues or onsite at your location.
JSP Example: Design Deficiencies
     • Caching problems
       – The URL stays the same but the output changes
       – So if browser caches page, you get the wrong time
       – Solution: send Cache-Control and Pragma headers
     • Date was not formatted
       – Just used the toString method of Date
       – Solution: use String.format (sprintf) and %t controls
     • JSP is wrong technology
       – JSP is best for lots of HTML and little or no logic/Java
       – But now we have logic but no HTML
       – Solution: use a servlet

33                                                     J2EE training: http://courses.coreservlets.com




     Steps
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
                – Supply as onreadystatechange attribute of request
           • Initiate a GET or POST request to a servlet
           • Send data
       – Handle response
           • Wait for readyState of 4 and HTTP status of 200
           • Extract return text with responseText or responseXML
           • Do something with result
     • HTML
       – Loads JavaScript from centralized directory
       – Designates control that initiates request
34
       – Gives ids to input elements that will be read by script
                                                J2EE training: http://courses.coreservlets.com
Define a Request Object
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }
                               No changes from previous example




35                                         J2EE training: http://courses.coreservlets.com




     Initiate Request
     function sendRequest(address) {
       request = getRequestObject();
       request.onreadystatechange = showResponseAlert;
       request.open("GET", address, true);
       request.send(null);
     }

                        No changes from previous example




36                                         J2EE training: http://courses.coreservlets.com
Handle Response
     function showResponseAlert() {
       if ((request.readyState == 4) &&
           (request.status == 200)) {
         alert(request.responseText);
       }
     }

                            No changes from previous example




37                                             J2EE training: http://courses.coreservlets.com




      HTML Code
      (show-time-2.html)
     <!DOCTYPE html PUBLIC "..."
       "http://www.w3.org/...">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head><title>Ajax: Time</title>
     <link rel="stylesheet"
           href="../css/styles.css"
           type="text/css"/>
     <script src="../scripts/ajax-basics.js"
             type="text/javascript"></script>
     </head>                                     Address of servlet.
     <body>                                      (From url-pattern of
     ...                                         servlet-mapping.)
     <form action="#">
      <input type="button" value="Show Server Time"
             onclick='sendRequest("../show-time")'/>
     </form>
     </center></body></html>
38                                             J2EE training: http://courses.coreservlets.com
Servlet Code
     package coreservlets;
     import ...

     public class ShowTime extends HttpServlet {
       public void doGet(HttpServletRequest request,
                         HttpServletResponse response)
           throws ServletException, IOException {
         response.setHeader("Cache-Control", "no-cache");
         response.setHeader("Pragma", "no-cache");
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         Date currentTime = new Date();
         String message =
           String.format("It is now %tr on %tD.",
                          currentTime, currentTime);
         out.print(message);
       }
39   }                                  J2EE training: http://courses.coreservlets.com




      web.xml
     ...
       <servlet>
         <servlet-name>ShowTime</servlet-name>
         <servlet-class>coreservlets.ShowTime</servlet-class>
       </servlet>
       <servlet-mapping>
         <servlet-name>ShowTime</servlet-name>
         <url-pattern>/show-time</url-pattern>
       </servlet-mapping>
     ...




40                                                  J2EE training: http://courses.coreservlets.com
Message from Servlet: Results




41                                                            J2EE training: http://courses.coreservlets.com




                                                                                            © 2007 Marty Hall




                Sending GET Data

                     Customized J2EE Training: http://courses.coreservlets.com/
       Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
       Developed and taught by well-known author and developer. At public venues or onsite at your location.
Servlet Example:
     Design Deficiencies
     • No data sent from HTML page to servlet
       – Solution: attach data to end of the URL (GET data)
           • Use normal GET format:
               – mainaddress?var1=val1&var2=val2




43                                                   J2EE training: http://courses.coreservlets.com




     Steps
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
               – Supply as onreadystatechange attribute of request
           • Initiate a GET request to a servlet
               – URL has GET data attached at the end
          • Send data
       – Handle response
          • Wait for readyState of 4 and HTTP status of 200
          • Extract return text with responseText or responseXML
          • Do something with result
     • HTML
       – Loads JavaScript from centralized directory
       – Designates control that initiates request
       – Gives ids to input elements that will be read by script
44                                                   J2EE training: http://courses.coreservlets.com
JavaScript Code
     • No changes from previous example




45                                       J2EE training: http://courses.coreservlets.com




      HTML Code
      (show-time-3.html)
     <!DOCTYPE html PUBLIC "..."
       "http://www.w3.org/...">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head><title>Ajax: Time</title>
     <link rel="stylesheet"
           href="../css/styles.css"
           type="text/css"/>
     <script src="../scripts/ajax-basics.js"
             type="text/javascript"></script>
     </head>
     <body>
     ...
     <form action="#">
      <input type="button" value="Show Time in Chicago"
             onclick=
              'sendRequest("../show-time-in-city?city=Chicago")'/>
     </form>
     </center></body></html>
46                                       J2EE training: http://courses.coreservlets.com
Servlet Code
     public class ShowTimeInCity extends HttpServlet {
       public void doGet(HttpServletRequest request,
                         HttpServletResponse response)
           throws ServletException, IOException {
         response.setHeader("Cache-Control", "no-cache");
         response.setHeader("Pragma", "no-cache");
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         String city = request.getParameter("city");
         ...
         String message = TimeZone.getTimeString(city);
         ...
         out.print(message);
       }

         ...
47   }                                       J2EE training: http://courses.coreservlets.com




         TimeZone Class
     • Maintains a list of cities and associated time
       zones
          – Given the name of a city, it finds the difference in hours
            between that city's time and server time (east coast US)
     • Computes server time
          – Using standard GregorianCalendar class
     • Converts to time in that city
          – By calling the "add" method with the timezone offset
     • Formats the time and day
          – Using String.format with %tr and %tD


48                                           J2EE training: http://courses.coreservlets.com
Sending GET Data: Results




49                                                            J2EE training: http://courses.coreservlets.com




                                                                                            © 2007 Marty Hall




            Sending POST Data

                     Customized J2EE Training: http://courses.coreservlets.com/
       Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
       Developed and taught by well-known author and developer. At public venues or onsite at your location.
GET Example: Design Deficiencies
     • City name was always Chicago
       – Solution: read data from textfield
     • Data sent by GET
       – Sometimes POST is preferred
       – Solution: use POST instead of GET
     • GET vs. POST
       – In normal Web pages, there are compelling reasons for
         choosing POST or GET
           • POST: simpler URL, data hidden from people looking over
             your shoulder, larger amounts of data can be sent
           • GET: can bookmark results page
       – With Ajax, end users don't see URL, so choice is
         relatively arbitrary
51
           • Unless there is a very large amount of data
                                                     J2EE training: http://courses.coreservlets.com




     Steps
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
               – Supply as onreadystatechange attribute of request
           • Initiate a POST request to a servlet
               – Put data to the "send" function
          • Send data
       – Handle response
          • Wait for readyState of 4 and HTTP status of 200
          • Extract return text with responseText or responseXML
          • Do something with result
     • HTML
       – Loads JavaScript from centralized directory
       – Designates control that initiates request
       – Gives ids to input elements that will be read by script
52                                                   J2EE training: http://courses.coreservlets.com
Sending POST Data in JavaScript
     • Collect data from form
       – Give ids to input elements
          <input type="text" id="some-id"/>
       – Read data
          var value1 = document.getElementById("some-id").value;
       – URL-encode data and form into query string
          var data = "var1=" + escape(value1);
     • Specify POST instead of GET in "open"
          request.open("POST", address, true);
     • Specify form encoding type
          request.setRequestHeader("Content-Type",
                           "application/x-www-form-urlencoded");
     • Supply data in "send"
          request.send(data);
53                                          J2EE training: http://courses.coreservlets.com




     Define a Request Object
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }
                                 No changes from previous example




54                                          J2EE training: http://courses.coreservlets.com
Initiate Request
     function sendRequestWithData(address, data,
                                  responseHandler) {
       request = getRequestObject();
       request.onreadystatechange = responseHandler;
       request.open("POST", address, true);
       request.setRequestHeader("Content-Type",
               "application/x-www-form-urlencoded");
       request.send(data);
     }

     function showTimeInCity() {
       var address = "../show-time-in-city";
       var city = document.getElementById("city").value;
       var data = "city=" + escape(city);
       sendRequestWithData(address, data, showResponseAlert);
     }                               No changes from previous example

55                                             J2EE training: http://courses.coreservlets.com




      Handle Response
     function showResponseAlert() {
       if ((request.readyState == 4) &&
           (request.status == 200)) {
         alert(request.responseText);
       }
     }

                            No changes from previous example




56                                             J2EE training: http://courses.coreservlets.com
HTML Code
     <!DOCTYPE html PUBLIC "..."
       "http://www.w3.org/...">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head><title>Ajax: Time</title>
     <link rel="stylesheet"
            href="../css/styles.css"
            type="text/css"/>
     <script src="../scripts/ajax-basics.js"
              type="text/javascript"></script>
     </head>
     <body>
     ...
     <form action="#">
      City: <input type="text" id="city"/><br/>
      <input type="button" value="Show Time in City"
              onclick="showTimeInCity()"/>
     </form>
     </center></body></html>
57                                             J2EE training: http://courses.coreservlets.com




         Servlet Code
     public class ShowTimeInCity extends HttpServlet {
       public void doGet(HttpServletRequest request,
                         HttpServletResponse response)
           throws ServletException, IOException {
         response.setHeader("Cache-Control", "no-cache");
         response.setHeader("Pragma", "no-cache");
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         String city = request.getParameter("city");
         ...
         String message = TimeZone.getTimeString(city);
         ...
         out.print(message);
       }

         public void doPost(HttpServletRequest request,
                            HttpServletResponse response)
             throws ServletException, IOException {
           doGet(request, response);
         }
58   }                                         J2EE training: http://courses.coreservlets.com
Sending POST Data: Results




59                                                            J2EE training: http://courses.coreservlets.com




                                                                                            © 2007 Marty Hall




                  Displaying HTML
                       Output

                     Customized J2EE Training: http://courses.coreservlets.com/
       Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
       Developed and taught by well-known author and developer. At public venues or onsite at your location.
POST Example:
     Design Deficiencies
     • Results always shown in dialog (alert) box
       – Alerts usually reserved for errors or warnings
       – Users prefer normal results inside page
       – Solution: use DOM to update page with result text




61                                                 J2EE training: http://courses.coreservlets.com




     Steps
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
           • Initiate a POST request to a servlet
           • Send data
       – Handle response
           • Wait for readyState of 4 and HTTP status of 200
           • Extract return text with responseText or responseXML
           • Do something with result
                – Use innerHTML to insert result into "div" element
     • HTML
       –   Loads JavaScript from centralized directory
       –   Designates control that initiates request
       –   Gives ids to input elements that will be read by script
62
       –   Defines a blank "div" element with a known id
                                                   J2EE training: http://courses.coreservlets.com
Updating HTML Page
     Asynchronously
     • HTML
       – Defines initially blank div element
          <div id="resultText"></div>
     • JavaScript
       – Finds element (getElementById)
         and inserts text into innerHTML property
          document.getElementById("resultText").innerHTML =
             request.responseText;




63                                          J2EE training: http://courses.coreservlets.com




     Define a Request Object
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }
                                 No changes from previous example




64                                          J2EE training: http://courses.coreservlets.com
Initiate Request
     function sendRequestWithData(address, data,
                                  responseHandler) {
       request = getRequestObject();
       request.onreadystatechange = responseHandler;
       request.open("POST", address, true);
       request.setRequestHeader("Content-Type",
               "application/x-www-form-urlencoded");
       request.send(data);           No changes from previous example
     }


     function displayTimeInCity() {
       var address = "../show-time-in-city";
       var city = document.getElementById("city").value;
       var data = "city=" + escape(city) + "&useHTML=true";
       sendRequestWithData(address, data, showResponseText);
     }
65                                           J2EE training: http://courses.coreservlets.com




      Handle Response
     function showResponseText() {
       if ((request.readyState == 4) &&
           (request.status == 200)) {
         document.getElementById("resultText").innerHTML =
           request.responseText;
       }
     }




66                                           J2EE training: http://courses.coreservlets.com
HTML Code
      (show-time-5.html)
     <!DOCTYPE html PUBLIC "..." "http://www.w3.org/...">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head><title>Ajax: Time</title>
     <link rel="stylesheet".../>
     <script src="../scripts/ajax-basics.js"
             type="text/javascript"></script>
     </head>
     <body>
     ...
     <form action="#">
      City: <input type="text" id="city"/><br/>
      <input type="button" value="Display Time in City"
             onclick="displayTimeInCity()"/>
     </form>
     <div id="resultText"></div>
     </center></body></html>
67                                                    J2EE training: http://courses.coreservlets.com




      Servlet Code
     public class ShowTimeInCity extends HttpServlet {
       public void doGet(HttpServletRequest request,
                         HttpServletResponse response)
           throws ServletException, IOException {
         response.setHeader("Cache-Control", "no-cache");
         response.setHeader("Pragma", "no-cache");
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         String city = request.getParameter("city");
         boolean useHTML = false;
         if (request.getParameter("useHTML") != null) {
           useHTML = true;
         }
         String message = TimeZone.getTimeString(city);
         if (useHTML) {
           message = String.format("<h2>%s</h2>", message);
         }
         out.print(message);
       }
68     public void doPost(...) ... { doGet(request, response); }
                                           J2EE training: http://courses.coreservlets.com
Displaying HTML Output: Results




69                                                             J2EE training: http://courses.coreservlets.com




                                                                                             © 2007 Marty Hall




           Parsing and Displaying
                XML Output

                      Customized J2EE Training: http://courses.coreservlets.com/
        Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
        Developed and taught by well-known author and developer. At public venues or onsite at your location.
HTML Example:
     Design Deficiencies
     • Java code generated HTML
       – Page author has no control over format
       – Cannot use the same data for different tasks
       – Having server-side resource (servlet) generate HTML is often easier
         and better. But not always.
     • Solution
       – Have servlet return XML content
       – JavaScript parses XML and decides what to do with it
     • Secondary problem
       – Generating XML from a servlet is inconvenient
     • Secondary solution
       – Use MVC architecture on server
            • Servlet creates dynamic data
            • JSP formats the data
            • See detailed lecture on using MVC in Java:
              http://courses.coreservlets.com/Course-Materials/csajsp2.html
71                                                 J2EE training: http://courses.coreservlets.com




     Steps
     • JavaScript
       – Define an object for sending HTTP requests
       – Initiate request
           • Get request object
           • Designate a response handler function
           • Initiate a POST request to a servlet (that uses MVC)
           • Send data
       – Handle response
           • Wait for readyState of 4 and HTTP status of 200
           • Extract return text with responseText or responseXML
           • Do something with result
                – Parse data. Use innerHTML to insert result into "div" element
     • HTML
       –   Loads JavaScript from centralized directory
       –   Designates control that initiates request
       –   Gives ids to input elements that will be read by script
72
       –   Defines a blank "div" element with a known id
                                                   J2EE training: http://courses.coreservlets.com
Parsing XML in JavaScript
     • Getting the main XML document
       – Use responseXML instead of responseText
           var xmlDocument = request.responseXML;
       – Get array of elements with getElementsByTagName
           var names = xmlDocument.getElementsByTagName("name");
       – Get body text by getting value of first child node
            for(var i=0; i<names.length; i++) {
              var name = names[i].childNodes[0].nodeValue;
              doSomethingWith(name);
            }
     • See detailed lecture on parsing XML
       with DOM in Java
       – http://courses.coreservlets.com/
         Course-Materials/java5.html
       – Java API and JavaScript API are very similar
73                                              J2EE training: http://courses.coreservlets.com




     Define a Request Object
     var request;

     function getRequestObject() {
       if (window.ActiveXObject) {
         return(new ActiveXObject("Microsoft.XMLHTTP"));
       } else if (window.XMLHttpRequest) {
         return(new XMLHttpRequest());
       } else {
         return(null);
       }
     }
                                     No changes from previous example




74                                              J2EE training: http://courses.coreservlets.com
Initiate Request
     function sendRequest() {
       request = getRequestObject();
       request.onreadystatechange = showCityTable;
       request.open("POST", "../show-times-in-cities", true);
       request.setRequestHeader("Content-Type",
               "application/x-www-form-urlencoded");
       var timezone = document.getElementById("timezone").value;
       request.send("timezone=" + timezone);
     }




75                                                   J2EE training: http://courses.coreservlets.com




      Handle Response
     function showCityTable() {
       if ((request.readyState == 4) &&
           (request.status == 200)) {
         var xmlDocument = request.responseXML;
         var names = xmlDocument.getElementsByTagName("name");
         var times = xmlDocument.getElementsByTagName("time");
         var days = xmlDocument.getElementsByTagName("day");
         var tableData = getTableStart();
         for(var i=0; i<names.length; i++) {
           var name = names[i].childNodes[0].nodeValue;
           var time = times[i].childNodes[0].nodeValue;
           var day = days[i].childNodes[0].nodeValue;
           tableData = tableData + getRowData(name, time, day);
         }
         tableData = tableData + getTableEnd();
         document.getElementById("resultText").innerHTML =
           tableData;
       }
76                                        J2EE training: http://courses.coreservlets.com
     }
Auxiliary Functions
     function getTableStart() {
       return("<table border='1'>n" +
         " <tr><th>City</th><th>Time</th><th>Day</th></tr>n");
     }

     function getRowData(name, time, day) {
       return(" <tr><td>" + name +
              "</td><td>" + time +
              "</td><td>" + day +
              "</td></tr>n");
     }

     function getTableEnd() {
       return("</table>n");
     }



77                                       J2EE training: http://courses.coreservlets.com




      Servlet Code
     response.setHeader("Cache-Control", "no-cache");
     response.setHeader("Pragma", "no-cache");
     response.setContentType("text/xml");
     String timezone = request.getParameter("timezone");
     List legalZones =
       Arrays.asList("eastern", "central", "mountain", "pacific");
     if ((timezone == null) || (!legalZones.contains(timezone))) {
       timezone = "eastern";
     }
     timezone = timezone.toLowerCase();
     String outputPage =
       String.format("/WEB-INF/results/%s.jsp", timezone);
     FormattedTimeAndDay timeAndDay =
       new FormattedTimeAndDay(timezone);
     request.setAttribute("timeAndDay", timeAndDay);
     RequestDispatcher dispatcher =
       request.getRequestDispatcher(outputPage);
     dispatcher.include(request, response);
78                                       J2EE training: http://courses.coreservlets.com
JSP Code (eastern.jsp)
     <?xml version="1.0" encoding="UTF-8"?>
     <cities>
       <city>
         <name>New York</name>
         <time>${timeAndDay.time}</time>
         <day>${timeAndDay.day}</day>
       </city>
       <city>
         <name>Philadelphia</name>
         <time>${timeAndDay.time}</time>
         <day>${timeAndDay.day}</day>
       </city>
       <city>
         <name>Boston</name>
         <time>${timeAndDay.time}</time>
         <day>${timeAndDay.day}</day>
       </city>
79   </cities>                         J2EE training: http://courses.coreservlets.com




      Parsing and Displaying XML
      Output: Results




80                                                 J2EE training: http://courses.coreservlets.com
© 2007 Marty Hall




                                    Ajax Tools

                        Customized J2EE Training: http://courses.coreservlets.com/
          Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
          Developed and taught by well-known author and developer. At public venues or onsite at your location.




     Tools and Toolkits
     • Client-Side Tools
       (JavaScript Libraries with Ajax Support)
       – Dojo
          • http://www.dojotoolkit.org/
       – Google Web Toolkit
          • Write code in Java, translate it to JavaScript
               – http://code.google.com/webtoolkit/
          • Also see https://ajax4jsf.dev.java.net/
               – GWT/JSF Integration Toolkit
       – script.aculo.us
          • http://script.aculo.us/
       – ExtJS
          • http://extjs.com/
       – Yahoo User Interface Library (YUI)
          • http://developer.yahoo.com/yui/
82                                                               J2EE training: http://courses.coreservlets.com
Tools and Toolkits (Continued)
     • Server-Side Tools
       – Direct Web Remoting
           • Lets you call Java methods semi-directly from JavaScript
           • http://getahead.ltd.uk/dwr/
       – JSON/JSON-RPC
           • For sending data to/from JavaScript with less parsing
           • http://www.json.org/
           • http://json-rpc.org/
       – JSP custom tag libraries
           • Create tags that generate into HTML and JavaScript
           • http://courses.coreservlets.com/Course-Materials/msajsp.html




83                                                      J2EE training: http://courses.coreservlets.com




     Tools and Toolkits (Continued)
     • Hybrid Client/Server Tools
       – AjaxTags (built on top of script.aculo.us)
           • JSP custom tags that generate Ajax functionality
               – Supports many powerful Ajax capabilities with very simple syntax
               – http://ajaxtags.sourceforge.net
       – JavaServer Faces (JSF) component libraries
           • Trinidad (formerly Oracle ADF)
               – http://www.oracle.com/technology/products/jdev/htdocs/
                 partners/addins/exchange/jsf/ (also myfaces.apache.org)
           • Tomahawk
               – http://myfaces.apache.org/tomahawk/
           • Ajax4JSF
               – http://labs.jboss.com/jbossajax4jsf/
           • IceFaces
               – http://www.icefaces.org/
           • Build your own
84
               – http://courses.coreservlets.com/Course-Materials/jsf.html
                                                        J2EE training: http://courses.coreservlets.com
Books
     • Foundations of Ajax
       – Asleson and Schutta. APress.
       – Geared around Java on the server-side.
     • Ajax in Action
       – Crane, Pascarello, and James. Manning.
       – Geared around Java on the server-side.
     • Pro JSF and Ajax
       – Jacobi and Fallows. APress.
       – Geared around JavaServer Faces integration.
     • Professional Ajax
       – Zakas, et al. Wrox. Wait for 2nd edition.
       – Geared around Java on the server-side.
85                                                         J2EE training: http://courses.coreservlets.com




     Summary
     • JavaScript
       – Define request object
           • Check for both Microsoft and non-MS objects. Identical in all apps.
       – Initiate request
           •   Get request object
           •   Designate a response handler function
           •   Initiate a GET or POST request
           •   Send data (null for GET)
       – Handle response
           • Wait for readyState of 4 and HTTP status of 200
           • Extract return text with responseText or responseXML
           • Do something with result
                 – Use innerHTML to insert result into "div" element
     • HTML
       – Give ids to input elements and to div. Initiate process.
     • Java
86     – Use JSP, servlet, or combination (MVC) as appropriate.
                                                J2EE training: http://courses.coreservlets.com
© 2007 Marty Hall




                        Questions?

              Customized J2EE Training: http://courses.coreservlets.com/
Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon.
Developed and taught by well-known author and developer. At public venues or onsite at your location.

Contenu connexe

Tendances

Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1PawanMM
 
JMP402 Master Class: Managed beans and XPages: Your Time Is Now
JMP402 Master Class: Managed beans and XPages: Your Time Is NowJMP402 Master Class: Managed beans and XPages: Your Time Is Now
JMP402 Master Class: Managed beans and XPages: Your Time Is NowRussell Maher
 
Spring - Part 3 - AOP
Spring - Part 3 - AOPSpring - Part 3 - AOP
Spring - Part 3 - AOPHitesh-Java
 
XML and Web Services with Groovy
XML and Web Services with GroovyXML and Web Services with Groovy
XML and Web Services with GroovyPaul King
 
A Good PHP Framework For Beginners Like Me!
A Good PHP Framework For Beginners Like Me!A Good PHP Framework For Beginners Like Me!
A Good PHP Framework For Beginners Like Me!Muhammad Ghazali
 
Session 26 - Servlets Part 2
Session 26 - Servlets Part 2Session 26 - Servlets Part 2
Session 26 - Servlets Part 2PawanMM
 
JMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages ScalabilityJMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages ScalabilityTony McGuckin
 
Lecture 6 Web Sockets
Lecture 6   Web SocketsLecture 6   Web Sockets
Lecture 6 Web SocketsFahad Golra
 
Lecture 5 JSTL, custom tags, maven
Lecture 5   JSTL, custom tags, mavenLecture 5   JSTL, custom tags, maven
Lecture 5 JSTL, custom tags, mavenFahad Golra
 
[English version] JavaFX and Web Integration
[English version] JavaFX and Web Integration[English version] JavaFX and Web Integration
[English version] JavaFX and Web IntegrationKazuchika Sekiya
 
Hibernate - Part 2
Hibernate - Part 2 Hibernate - Part 2
Hibernate - Part 2 Hitesh-Java
 
ActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in JavaActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in Javaipolevoy
 
Wicket Deliver Your Webapp On Time
Wicket Deliver Your Webapp On TimeWicket Deliver Your Webapp On Time
Wicket Deliver Your Webapp On TimeWill Hoover
 
Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2PawanMM
 

Tendances (20)

Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1Session 38 - Core Java (New Features) - Part 1
Session 38 - Core Java (New Features) - Part 1
 
JMP402 Master Class: Managed beans and XPages: Your Time Is Now
JMP402 Master Class: Managed beans and XPages: Your Time Is NowJMP402 Master Class: Managed beans and XPages: Your Time Is Now
JMP402 Master Class: Managed beans and XPages: Your Time Is Now
 
JSP Part 1
JSP Part 1JSP Part 1
JSP Part 1
 
14 mvc
14 mvc14 mvc
14 mvc
 
Spring - Part 3 - AOP
Spring - Part 3 - AOPSpring - Part 3 - AOP
Spring - Part 3 - AOP
 
XML and Web Services with Groovy
XML and Web Services with GroovyXML and Web Services with Groovy
XML and Web Services with Groovy
 
A Good PHP Framework For Beginners Like Me!
A Good PHP Framework For Beginners Like Me!A Good PHP Framework For Beginners Like Me!
A Good PHP Framework For Beginners Like Me!
 
XPages Mobile, #dd13
XPages Mobile, #dd13XPages Mobile, #dd13
XPages Mobile, #dd13
 
Jsf2 overview
Jsf2 overviewJsf2 overview
Jsf2 overview
 
Session 26 - Servlets Part 2
Session 26 - Servlets Part 2Session 26 - Servlets Part 2
Session 26 - Servlets Part 2
 
JMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages ScalabilityJMP401: Masterclass: XPages Scalability
JMP401: Masterclass: XPages Scalability
 
Lecture 6 Web Sockets
Lecture 6   Web SocketsLecture 6   Web Sockets
Lecture 6 Web Sockets
 
10 jsp-scripting-elements
10 jsp-scripting-elements10 jsp-scripting-elements
10 jsp-scripting-elements
 
01 java intro
01 java intro01 java intro
01 java intro
 
Lecture 5 JSTL, custom tags, maven
Lecture 5   JSTL, custom tags, mavenLecture 5   JSTL, custom tags, maven
Lecture 5 JSTL, custom tags, maven
 
[English version] JavaFX and Web Integration
[English version] JavaFX and Web Integration[English version] JavaFX and Web Integration
[English version] JavaFX and Web Integration
 
Hibernate - Part 2
Hibernate - Part 2 Hibernate - Part 2
Hibernate - Part 2
 
ActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in JavaActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in Java
 
Wicket Deliver Your Webapp On Time
Wicket Deliver Your Webapp On TimeWicket Deliver Your Webapp On Time
Wicket Deliver Your Webapp On Time
 
Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2Session 40 - Hibernate - Part 2
Session 40 - Hibernate - Part 2
 

Similaire à Ajax basics

02 servlet-basics
02 servlet-basics02 servlet-basics
02 servlet-basicssnopteck
 
15 expression-language
15 expression-language15 expression-language
15 expression-languagesnopteck
 
01 overview-and-setup
01 overview-and-setup01 overview-and-setup
01 overview-and-setupsnopteck
 
03 form-data
03 form-data03 form-data
03 form-datasnopteck
 
Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Ramamohan Chokkam
 
Building Applications Using Ajax
Building Applications Using AjaxBuilding Applications Using Ajax
Building Applications Using Ajaxs_pradeep
 
Advance Java Topics (J2EE)
Advance Java Topics (J2EE)Advance Java Topics (J2EE)
Advance Java Topics (J2EE)slire
 
Jsf2 overview
Jsf2 overviewJsf2 overview
Jsf2 overviewsohan1234
 
05 status-codes
05 status-codes05 status-codes
05 status-codessnopteck
 
Dave Orchard - Offline Web Apps with HTML5
Dave Orchard - Offline Web Apps with HTML5Dave Orchard - Offline Web Apps with HTML5
Dave Orchard - Offline Web Apps with HTML5Web Directions
 
Jsf2 composite-components
Jsf2 composite-componentsJsf2 composite-components
Jsf2 composite-componentsvinaysbk
 
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptxMicrosoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptxtutorialsruby
 

Similaire à Ajax basics (20)

02 servlet-basics
02 servlet-basics02 servlet-basics
02 servlet-basics
 
Prototype-1
Prototype-1Prototype-1
Prototype-1
 
15 expression-language
15 expression-language15 expression-language
15 expression-language
 
JavaScript-Core
JavaScript-CoreJavaScript-Core
JavaScript-Core
 
JavaScript-Core
JavaScript-CoreJavaScript-Core
JavaScript-Core
 
01 overview-and-setup
01 overview-and-setup01 overview-and-setup
01 overview-and-setup
 
03 form-data
03 form-data03 form-data
03 form-data
 
Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268
 
20jsp
20jsp20jsp
20jsp
 
Json generation
Json generationJson generation
Json generation
 
Jsp
JspJsp
Jsp
 
AJppt.pptx
AJppt.pptxAJppt.pptx
AJppt.pptx
 
Building Applications Using Ajax
Building Applications Using AjaxBuilding Applications Using Ajax
Building Applications Using Ajax
 
Advance Java Topics (J2EE)
Advance Java Topics (J2EE)Advance Java Topics (J2EE)
Advance Java Topics (J2EE)
 
Ajax
AjaxAjax
Ajax
 
Jsf2 overview
Jsf2 overviewJsf2 overview
Jsf2 overview
 
05 status-codes
05 status-codes05 status-codes
05 status-codes
 
Dave Orchard - Offline Web Apps with HTML5
Dave Orchard - Offline Web Apps with HTML5Dave Orchard - Offline Web Apps with HTML5
Dave Orchard - Offline Web Apps with HTML5
 
Jsf2 composite-components
Jsf2 composite-componentsJsf2 composite-components
Jsf2 composite-components
 
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptxMicrosoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
Microsoft PowerPoint - &lt;b>jQuery&lt;/b>-1-Ajax.pptx
 

Ajax basics

  • 1. © 2007 Marty Hall Ajax: The Basics Originals of Slides and Source Code for Examples: http://courses.coreservlets.com/Course-Materials/ajax.html Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location. © 2007 Marty Hall For live Ajax & GWT training, see training courses at http://courses.coreservlets.com/. Taught by the author of Core Servlets and JSP, More Servlets and JSP, and this tutorial. Available at public venues, or customized versions can be held on-site at your organization. • Courses developed and taught by Marty Hall – Java 5, Java 6, intermediate/beginning servlets/JSP, advanced servlets/JSP, Struts, JSF, Ajax, GWT, custom mix of topics Customized J2EE Training: http://courses.coreservlets.com/ • Courses developed and taught by coreservlets.com experts (edited by Marty) Servlets,Spring, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. – JSP, Hibernate, EJB3, Ruby/Rails Developed and taught by well-known author and developer. At public venues or onsite at your location. Contact hall@coreservlets com for details
  • 2. Topics in This Section • Ajax motivation • The basic Ajax process • Using dynamic content and JSP • Using dynamic content and servlets • Sending GET data • Sending POST data • Displaying HTML results • Parsing and displaying XML results • Toolkits 5 J2EE training: http://courses.coreservlets.com © 2007 Marty Hall Motivation Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.
  • 3. Why Ajax? • HTML and HTTP are weak – Non-interactive – Coarse-grained updates • Everyone wants to use a browser – Not a custom application • "Real" browser-based active content – Failed: Java Applets • Not universally supported; can't interact with the HTML – Serious alternative: Flash (and Flex) • Not yet universally supported; limited power – New and unproven • Microsoft Silverlight • JavaFX • Adobe Apollo 7 J2EE training: http://courses.coreservlets.com Google Suggest (http://labs.google.com/suggest/) 8 J2EE training: http://courses.coreservlets.com
  • 4. © 2007 Marty Hall The Basic Process Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location. The Basic Ajax Process • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function – Supply as onreadystatechange attribute of request • Initiate a GET or POST request • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result • HTML – Loads JavaScript – Designates control that initiates request 10 – Gives ids to input elements that will be read by script J2EE training: http://courses.coreservlets.com
  • 5. Define a Request Object var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); Version for Internet Explorer } 5 and 6 } Object for Netscape 5+, Firefox, Opera, Safari, and Internet Explorer 7 Fails on older and nonstandard browsers 11 J2EE training: http://courses.coreservlets.com Initiate Request function sendRequest() { Response handler function name request = getRequestObject(); request.onreadystatechange = handleResponse; request.open("GET", "message-data.html", true); request.send(null); } URL of server-side resource Don't wait for response POST data (Send request asynchronously) (always null for GET) 12 J2EE training: http://courses.coreservlets.com
  • 6. Handle Response function handleResponse() { if (request.readyState == 4) { alert(request.responseText); } } Response is returned from server (handler gets invoked multiple times) Text of server response Pop up dialog box 13 J2EE training: http://courses.coreservlets.com Complete JavaScript Code (show-message.js) var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } function sendRequest() { request = getRequestObject(); request.onreadystatechange = handleResponse; request.open("GET", "message-data.html", true); request.send(null); } function handleResponse() { if (request.readyState == 4) { alert(request.responseText); } 14 } J2EE training: http://courses.coreservlets.com
  • 7. The Firefox JavaScript Console • Open via Tools Error Console • Also see Venkman JavaScript debugger – http://www.mozilla.org/projects/venkman/ 15 – https://addons.mozilla.org/firefox/216/ J2EE training: http://courses.coreservlets.com HTML Code • Use xhtml, not HTML 4 – In order to manipulate it with DOM <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">...</html> • Due to IE bug, do not use XML header before the DOCTYPE • Load the JavaScript file <script src="relative-url-of-JavaScript-file" type="text/javascript"></script> • Use separate </script> end tag • Designate control to initiate request <input type="button" value="button label" onclick="mainFunction()"/> 16 J2EE training: http://courses.coreservlets.com
  • 8. Internet Explorer XHTML Bugs • Can't handle XML header – XML documents in general are supposed to start with XML header: • <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html ...> <html xmlns="http://www.w3.org/1999/xhtml">...</html> – XHTML specification recommends using it – But... Internet Explorer will switch to quirks-mode (from standards-mode) if DOCTYPE is not first line. • Many recent style sheet formats will be ignored • So omit XML header • Needs separate end tags in some places – Scripts will not load if you use <script .../> 17 instead of <script...></script> J2EE training: http://courses.coreservlets.com HTML Code (show-message.html) <!DOCTYPE html PUBLIC "..." "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Ajax: Simple Message</title> <script src="show-message.js" type="text/javascript"></script> </head> <body> <center> <table border="1" bgcolor="gray"> <tr><th><big>Ajax: Simple Message</big></th></tr> </table> <p/> <form action="#"> <input type="button" value="Show Message" onclick="sendRequest()"/> </form> 18 </center></body></html> J2EE training: http://courses.coreservlets.com
  • 9. HTML Code (message-data.html) Some random message • Note: executing this example – Since main page uses relative URL and HTML content has no dynamic content, you can run this example directly from the disk without using a server. But later examples require dynamic content, so all examples will be 19 shown running on Tomcat. J2EE training: http://courses.coreservlets.com The Basic Process: Results 20 J2EE training: http://courses.coreservlets.com
  • 10. © 2007 Marty Hall Dynamic Content from JSP Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location. First Example: Design Deficiencies • Content was the same on each request – Could have just hardcoded the alert value in JavaScript – Instead, invoke a JSP page on the server • Resource address hardcoded in JavaScript – Prevents functions from applying to multiple situations – Instead, make generic function and pass address to it • JavaScript file was in same folder as HTML – Makes it hard to reuse the JavaScript in different pages – Instead, make a special directory for JavaScript • No style sheet was used – Less for JavaScript to work with when manipulating page – Use CSS for normal reasons as well as for JavaScript 22 J2EE training: http://courses.coreservlets.com
  • 11. Steps • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function – Supply as onreadystatechange attribute of request • Initiate a GET or POST request to a JSP page • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result • HTML – Loads JavaScript from centralized directory – Designates control that initiates request 23 – Gives ids to input elements that will be read by script J2EE training: http://courses.coreservlets.com Define a Request Object var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } No changes from previous example 24 J2EE training: http://courses.coreservlets.com
  • 12. Initiate Request function sendRequest(address) { request = getRequestObject(); request.onreadystatechange = showResponseAlert; request.open("GET", address, true); request.send(null); } Relative URL of server-side resource. (In this example, we will pass in the address of a JSP page.) 25 J2EE training: http://courses.coreservlets.com Handle Response function showResponseAlert() { if ((request.readyState == 4) && (request.status == 200)) { alert(request.responseText); } } Server response came back with no errors. (HTTP status code 200.) 26 J2EE training: http://courses.coreservlets.com
  • 13. Complete JavaScript Code (Part of ajax-basics.js) var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } function sendRequest(address) { request = getRequestObject(); request.onreadystatechange = showResponseAlert; request.open("GET", address, true); request.send(null); } function showResponseAlert() { if ((request.readyState == 4) && (request.status == 200)) { alert(request.responseText); } 27 } J2EE training: http://courses.coreservlets.com HTML Code • Loads JavaScript from central location <script src="../scripts/ajax-basics.js" type="text/javascript"></script> • Passes JSP address to main function <input type="button" value="Show Server Time" onclick='sendRequest("show-time.jsp")'/> • Uses style sheet <link rel="stylesheet" Note single quotes href="../css/styles.css" (Because of double type="text/css"/> quotes inside parens.) 28 J2EE training: http://courses.coreservlets.com
  • 14. HTML Code (show-time-1.html) <!DOCTYPE html PUBLIC "..." "http://www.w3.org/..."> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Ajax: Time</title> <link rel="stylesheet" href="../css/styles.css" type="text/css"/> <script src="../scripts/ajax-basics.js" type="text/javascript"></script> </head> <body> ... <form action="#"> <input type="button" value="Show Server Time" onclick='sendRequest("show-time.jsp")'/> </form> 29 </center></body></html> J2EE training: http://courses.coreservlets.com JSP Code (show-time.jsp) <%= new java.util.Date() %> • Note: executing this example – You must run from Tomcat. • Otherwise JSP cannot execute 30 • Otherwise status code is -1, not 200 J2EE training: http://courses.coreservlets.com
  • 15. Message from JSP: Results 31 J2EE training: http://courses.coreservlets.com © 2007 Marty Hall Dynamic Content from Servlet Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.
  • 16. JSP Example: Design Deficiencies • Caching problems – The URL stays the same but the output changes – So if browser caches page, you get the wrong time – Solution: send Cache-Control and Pragma headers • Date was not formatted – Just used the toString method of Date – Solution: use String.format (sprintf) and %t controls • JSP is wrong technology – JSP is best for lots of HTML and little or no logic/Java – But now we have logic but no HTML – Solution: use a servlet 33 J2EE training: http://courses.coreservlets.com Steps • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function – Supply as onreadystatechange attribute of request • Initiate a GET or POST request to a servlet • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result • HTML – Loads JavaScript from centralized directory – Designates control that initiates request 34 – Gives ids to input elements that will be read by script J2EE training: http://courses.coreservlets.com
  • 17. Define a Request Object var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } No changes from previous example 35 J2EE training: http://courses.coreservlets.com Initiate Request function sendRequest(address) { request = getRequestObject(); request.onreadystatechange = showResponseAlert; request.open("GET", address, true); request.send(null); } No changes from previous example 36 J2EE training: http://courses.coreservlets.com
  • 18. Handle Response function showResponseAlert() { if ((request.readyState == 4) && (request.status == 200)) { alert(request.responseText); } } No changes from previous example 37 J2EE training: http://courses.coreservlets.com HTML Code (show-time-2.html) <!DOCTYPE html PUBLIC "..." "http://www.w3.org/..."> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Ajax: Time</title> <link rel="stylesheet" href="../css/styles.css" type="text/css"/> <script src="../scripts/ajax-basics.js" type="text/javascript"></script> </head> Address of servlet. <body> (From url-pattern of ... servlet-mapping.) <form action="#"> <input type="button" value="Show Server Time" onclick='sendRequest("../show-time")'/> </form> </center></body></html> 38 J2EE training: http://courses.coreservlets.com
  • 19. Servlet Code package coreservlets; import ... public class ShowTime extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); Date currentTime = new Date(); String message = String.format("It is now %tr on %tD.", currentTime, currentTime); out.print(message); } 39 } J2EE training: http://courses.coreservlets.com web.xml ... <servlet> <servlet-name>ShowTime</servlet-name> <servlet-class>coreservlets.ShowTime</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShowTime</servlet-name> <url-pattern>/show-time</url-pattern> </servlet-mapping> ... 40 J2EE training: http://courses.coreservlets.com
  • 20. Message from Servlet: Results 41 J2EE training: http://courses.coreservlets.com © 2007 Marty Hall Sending GET Data Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.
  • 21. Servlet Example: Design Deficiencies • No data sent from HTML page to servlet – Solution: attach data to end of the URL (GET data) • Use normal GET format: – mainaddress?var1=val1&var2=val2 43 J2EE training: http://courses.coreservlets.com Steps • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function – Supply as onreadystatechange attribute of request • Initiate a GET request to a servlet – URL has GET data attached at the end • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result • HTML – Loads JavaScript from centralized directory – Designates control that initiates request – Gives ids to input elements that will be read by script 44 J2EE training: http://courses.coreservlets.com
  • 22. JavaScript Code • No changes from previous example 45 J2EE training: http://courses.coreservlets.com HTML Code (show-time-3.html) <!DOCTYPE html PUBLIC "..." "http://www.w3.org/..."> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Ajax: Time</title> <link rel="stylesheet" href="../css/styles.css" type="text/css"/> <script src="../scripts/ajax-basics.js" type="text/javascript"></script> </head> <body> ... <form action="#"> <input type="button" value="Show Time in Chicago" onclick= 'sendRequest("../show-time-in-city?city=Chicago")'/> </form> </center></body></html> 46 J2EE training: http://courses.coreservlets.com
  • 23. Servlet Code public class ShowTimeInCity extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String city = request.getParameter("city"); ... String message = TimeZone.getTimeString(city); ... out.print(message); } ... 47 } J2EE training: http://courses.coreservlets.com TimeZone Class • Maintains a list of cities and associated time zones – Given the name of a city, it finds the difference in hours between that city's time and server time (east coast US) • Computes server time – Using standard GregorianCalendar class • Converts to time in that city – By calling the "add" method with the timezone offset • Formats the time and day – Using String.format with %tr and %tD 48 J2EE training: http://courses.coreservlets.com
  • 24. Sending GET Data: Results 49 J2EE training: http://courses.coreservlets.com © 2007 Marty Hall Sending POST Data Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.
  • 25. GET Example: Design Deficiencies • City name was always Chicago – Solution: read data from textfield • Data sent by GET – Sometimes POST is preferred – Solution: use POST instead of GET • GET vs. POST – In normal Web pages, there are compelling reasons for choosing POST or GET • POST: simpler URL, data hidden from people looking over your shoulder, larger amounts of data can be sent • GET: can bookmark results page – With Ajax, end users don't see URL, so choice is relatively arbitrary 51 • Unless there is a very large amount of data J2EE training: http://courses.coreservlets.com Steps • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function – Supply as onreadystatechange attribute of request • Initiate a POST request to a servlet – Put data to the "send" function • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result • HTML – Loads JavaScript from centralized directory – Designates control that initiates request – Gives ids to input elements that will be read by script 52 J2EE training: http://courses.coreservlets.com
  • 26. Sending POST Data in JavaScript • Collect data from form – Give ids to input elements <input type="text" id="some-id"/> – Read data var value1 = document.getElementById("some-id").value; – URL-encode data and form into query string var data = "var1=" + escape(value1); • Specify POST instead of GET in "open" request.open("POST", address, true); • Specify form encoding type request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); • Supply data in "send" request.send(data); 53 J2EE training: http://courses.coreservlets.com Define a Request Object var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } No changes from previous example 54 J2EE training: http://courses.coreservlets.com
  • 27. Initiate Request function sendRequestWithData(address, data, responseHandler) { request = getRequestObject(); request.onreadystatechange = responseHandler; request.open("POST", address, true); request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.send(data); } function showTimeInCity() { var address = "../show-time-in-city"; var city = document.getElementById("city").value; var data = "city=" + escape(city); sendRequestWithData(address, data, showResponseAlert); } No changes from previous example 55 J2EE training: http://courses.coreservlets.com Handle Response function showResponseAlert() { if ((request.readyState == 4) && (request.status == 200)) { alert(request.responseText); } } No changes from previous example 56 J2EE training: http://courses.coreservlets.com
  • 28. HTML Code <!DOCTYPE html PUBLIC "..." "http://www.w3.org/..."> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Ajax: Time</title> <link rel="stylesheet" href="../css/styles.css" type="text/css"/> <script src="../scripts/ajax-basics.js" type="text/javascript"></script> </head> <body> ... <form action="#"> City: <input type="text" id="city"/><br/> <input type="button" value="Show Time in City" onclick="showTimeInCity()"/> </form> </center></body></html> 57 J2EE training: http://courses.coreservlets.com Servlet Code public class ShowTimeInCity extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String city = request.getParameter("city"); ... String message = TimeZone.getTimeString(city); ... out.print(message); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } 58 } J2EE training: http://courses.coreservlets.com
  • 29. Sending POST Data: Results 59 J2EE training: http://courses.coreservlets.com © 2007 Marty Hall Displaying HTML Output Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.
  • 30. POST Example: Design Deficiencies • Results always shown in dialog (alert) box – Alerts usually reserved for errors or warnings – Users prefer normal results inside page – Solution: use DOM to update page with result text 61 J2EE training: http://courses.coreservlets.com Steps • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function • Initiate a POST request to a servlet • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result – Use innerHTML to insert result into "div" element • HTML – Loads JavaScript from centralized directory – Designates control that initiates request – Gives ids to input elements that will be read by script 62 – Defines a blank "div" element with a known id J2EE training: http://courses.coreservlets.com
  • 31. Updating HTML Page Asynchronously • HTML – Defines initially blank div element <div id="resultText"></div> • JavaScript – Finds element (getElementById) and inserts text into innerHTML property document.getElementById("resultText").innerHTML = request.responseText; 63 J2EE training: http://courses.coreservlets.com Define a Request Object var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } No changes from previous example 64 J2EE training: http://courses.coreservlets.com
  • 32. Initiate Request function sendRequestWithData(address, data, responseHandler) { request = getRequestObject(); request.onreadystatechange = responseHandler; request.open("POST", address, true); request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.send(data); No changes from previous example } function displayTimeInCity() { var address = "../show-time-in-city"; var city = document.getElementById("city").value; var data = "city=" + escape(city) + "&useHTML=true"; sendRequestWithData(address, data, showResponseText); } 65 J2EE training: http://courses.coreservlets.com Handle Response function showResponseText() { if ((request.readyState == 4) && (request.status == 200)) { document.getElementById("resultText").innerHTML = request.responseText; } } 66 J2EE training: http://courses.coreservlets.com
  • 33. HTML Code (show-time-5.html) <!DOCTYPE html PUBLIC "..." "http://www.w3.org/..."> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Ajax: Time</title> <link rel="stylesheet".../> <script src="../scripts/ajax-basics.js" type="text/javascript"></script> </head> <body> ... <form action="#"> City: <input type="text" id="city"/><br/> <input type="button" value="Display Time in City" onclick="displayTimeInCity()"/> </form> <div id="resultText"></div> </center></body></html> 67 J2EE training: http://courses.coreservlets.com Servlet Code public class ShowTimeInCity extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String city = request.getParameter("city"); boolean useHTML = false; if (request.getParameter("useHTML") != null) { useHTML = true; } String message = TimeZone.getTimeString(city); if (useHTML) { message = String.format("<h2>%s</h2>", message); } out.print(message); } 68 public void doPost(...) ... { doGet(request, response); } J2EE training: http://courses.coreservlets.com
  • 34. Displaying HTML Output: Results 69 J2EE training: http://courses.coreservlets.com © 2007 Marty Hall Parsing and Displaying XML Output Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.
  • 35. HTML Example: Design Deficiencies • Java code generated HTML – Page author has no control over format – Cannot use the same data for different tasks – Having server-side resource (servlet) generate HTML is often easier and better. But not always. • Solution – Have servlet return XML content – JavaScript parses XML and decides what to do with it • Secondary problem – Generating XML from a servlet is inconvenient • Secondary solution – Use MVC architecture on server • Servlet creates dynamic data • JSP formats the data • See detailed lecture on using MVC in Java: http://courses.coreservlets.com/Course-Materials/csajsp2.html 71 J2EE training: http://courses.coreservlets.com Steps • JavaScript – Define an object for sending HTTP requests – Initiate request • Get request object • Designate a response handler function • Initiate a POST request to a servlet (that uses MVC) • Send data – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result – Parse data. Use innerHTML to insert result into "div" element • HTML – Loads JavaScript from centralized directory – Designates control that initiates request – Gives ids to input elements that will be read by script 72 – Defines a blank "div" element with a known id J2EE training: http://courses.coreservlets.com
  • 36. Parsing XML in JavaScript • Getting the main XML document – Use responseXML instead of responseText var xmlDocument = request.responseXML; – Get array of elements with getElementsByTagName var names = xmlDocument.getElementsByTagName("name"); – Get body text by getting value of first child node for(var i=0; i<names.length; i++) { var name = names[i].childNodes[0].nodeValue; doSomethingWith(name); } • See detailed lecture on parsing XML with DOM in Java – http://courses.coreservlets.com/ Course-Materials/java5.html – Java API and JavaScript API are very similar 73 J2EE training: http://courses.coreservlets.com Define a Request Object var request; function getRequestObject() { if (window.ActiveXObject) { return(new ActiveXObject("Microsoft.XMLHTTP")); } else if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } else { return(null); } } No changes from previous example 74 J2EE training: http://courses.coreservlets.com
  • 37. Initiate Request function sendRequest() { request = getRequestObject(); request.onreadystatechange = showCityTable; request.open("POST", "../show-times-in-cities", true); request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var timezone = document.getElementById("timezone").value; request.send("timezone=" + timezone); } 75 J2EE training: http://courses.coreservlets.com Handle Response function showCityTable() { if ((request.readyState == 4) && (request.status == 200)) { var xmlDocument = request.responseXML; var names = xmlDocument.getElementsByTagName("name"); var times = xmlDocument.getElementsByTagName("time"); var days = xmlDocument.getElementsByTagName("day"); var tableData = getTableStart(); for(var i=0; i<names.length; i++) { var name = names[i].childNodes[0].nodeValue; var time = times[i].childNodes[0].nodeValue; var day = days[i].childNodes[0].nodeValue; tableData = tableData + getRowData(name, time, day); } tableData = tableData + getTableEnd(); document.getElementById("resultText").innerHTML = tableData; } 76 J2EE training: http://courses.coreservlets.com }
  • 38. Auxiliary Functions function getTableStart() { return("<table border='1'>n" + " <tr><th>City</th><th>Time</th><th>Day</th></tr>n"); } function getRowData(name, time, day) { return(" <tr><td>" + name + "</td><td>" + time + "</td><td>" + day + "</td></tr>n"); } function getTableEnd() { return("</table>n"); } 77 J2EE training: http://courses.coreservlets.com Servlet Code response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setContentType("text/xml"); String timezone = request.getParameter("timezone"); List legalZones = Arrays.asList("eastern", "central", "mountain", "pacific"); if ((timezone == null) || (!legalZones.contains(timezone))) { timezone = "eastern"; } timezone = timezone.toLowerCase(); String outputPage = String.format("/WEB-INF/results/%s.jsp", timezone); FormattedTimeAndDay timeAndDay = new FormattedTimeAndDay(timezone); request.setAttribute("timeAndDay", timeAndDay); RequestDispatcher dispatcher = request.getRequestDispatcher(outputPage); dispatcher.include(request, response); 78 J2EE training: http://courses.coreservlets.com
  • 39. JSP Code (eastern.jsp) <?xml version="1.0" encoding="UTF-8"?> <cities> <city> <name>New York</name> <time>${timeAndDay.time}</time> <day>${timeAndDay.day}</day> </city> <city> <name>Philadelphia</name> <time>${timeAndDay.time}</time> <day>${timeAndDay.day}</day> </city> <city> <name>Boston</name> <time>${timeAndDay.time}</time> <day>${timeAndDay.day}</day> </city> 79 </cities> J2EE training: http://courses.coreservlets.com Parsing and Displaying XML Output: Results 80 J2EE training: http://courses.coreservlets.com
  • 40. © 2007 Marty Hall Ajax Tools Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location. Tools and Toolkits • Client-Side Tools (JavaScript Libraries with Ajax Support) – Dojo • http://www.dojotoolkit.org/ – Google Web Toolkit • Write code in Java, translate it to JavaScript – http://code.google.com/webtoolkit/ • Also see https://ajax4jsf.dev.java.net/ – GWT/JSF Integration Toolkit – script.aculo.us • http://script.aculo.us/ – ExtJS • http://extjs.com/ – Yahoo User Interface Library (YUI) • http://developer.yahoo.com/yui/ 82 J2EE training: http://courses.coreservlets.com
  • 41. Tools and Toolkits (Continued) • Server-Side Tools – Direct Web Remoting • Lets you call Java methods semi-directly from JavaScript • http://getahead.ltd.uk/dwr/ – JSON/JSON-RPC • For sending data to/from JavaScript with less parsing • http://www.json.org/ • http://json-rpc.org/ – JSP custom tag libraries • Create tags that generate into HTML and JavaScript • http://courses.coreservlets.com/Course-Materials/msajsp.html 83 J2EE training: http://courses.coreservlets.com Tools and Toolkits (Continued) • Hybrid Client/Server Tools – AjaxTags (built on top of script.aculo.us) • JSP custom tags that generate Ajax functionality – Supports many powerful Ajax capabilities with very simple syntax – http://ajaxtags.sourceforge.net – JavaServer Faces (JSF) component libraries • Trinidad (formerly Oracle ADF) – http://www.oracle.com/technology/products/jdev/htdocs/ partners/addins/exchange/jsf/ (also myfaces.apache.org) • Tomahawk – http://myfaces.apache.org/tomahawk/ • Ajax4JSF – http://labs.jboss.com/jbossajax4jsf/ • IceFaces – http://www.icefaces.org/ • Build your own 84 – http://courses.coreservlets.com/Course-Materials/jsf.html J2EE training: http://courses.coreservlets.com
  • 42. Books • Foundations of Ajax – Asleson and Schutta. APress. – Geared around Java on the server-side. • Ajax in Action – Crane, Pascarello, and James. Manning. – Geared around Java on the server-side. • Pro JSF and Ajax – Jacobi and Fallows. APress. – Geared around JavaServer Faces integration. • Professional Ajax – Zakas, et al. Wrox. Wait for 2nd edition. – Geared around Java on the server-side. 85 J2EE training: http://courses.coreservlets.com Summary • JavaScript – Define request object • Check for both Microsoft and non-MS objects. Identical in all apps. – Initiate request • Get request object • Designate a response handler function • Initiate a GET or POST request • Send data (null for GET) – Handle response • Wait for readyState of 4 and HTTP status of 200 • Extract return text with responseText or responseXML • Do something with result – Use innerHTML to insert result into "div" element • HTML – Give ids to input elements and to div. Initiate process. • Java 86 – Use JSP, servlet, or combination (MVC) as appropriate. J2EE training: http://courses.coreservlets.com
  • 43. © 2007 Marty Hall Questions? Customized J2EE Training: http://courses.coreservlets.com/ Servlets, JSP, Struts, JSF/MyFaces/Facelets, Ajax, GWT, Java 5, Java 6, etc. Ruby/Rails coming soon. Developed and taught by well-known author and developer. At public venues or onsite at your location.