95-733 Internet Technologies Lecture 1: Introduction 95-733 Internet Technologies Master of Information System Management 1 Why study this? Two killer apps • The World Wide Web – Tim Berners-Lee invents the web in 1990 • The Internet of Things – Gartner Says the Internet of Things will grow to 26 billion units by 2020 – We are moving from a consumer internet to an industrial internet 95-733 Internet Technologies Master of Information System Management 2 Course Web Site • http://www.andrew.cmu.edu/~mm6 95-733 Internet Technologies Master of Information System Management 3 Prerequisites • The ability to program in Java • Enthusiasm for programming • Interested in web technologies 95-733 Internet Technologies Master of Information System Management 4 Specific Technologies • • • • • • • • • • • Netbeans and Glassfish JavaScript, Servlets and Java Server Pages XML (various languages) AJAX, JSONP and Websockets Client and server side mashups Google’s Knowledge Graph Ruby Frameworks – Ruby on Rails Grammars - DTD’s, XSDL, JSON Schema XML Transformation - XSLT Semantic Web – OWL, RDF, JSON-LD 95-733 Internet Technologies Master of Information System Management 5 Structure of the Course • Lectures / class participation • Demonstrations • Homework (programming) • Midterm • Final examination 95-733 Internet Technologies Master of Information System Management 6 Readings • Readings from the required text are assigned for each lecture -- read them in advance • Readings from the web also assigned • For this week read “Programming the World Wide Web”, 8th ed. Chapters 1, 2 and 3. • For next week read “Programming the World Wide Web”, 8th ed. chapters 4, 5 and 10. • Chapters 4 and 5 are on JavaScript • Chapter 10 covers AJAX. • Read the article by Philip McCarthy of IBM on AJAX • Watch the video from Oracle on Websockets. Get the code running on Netbeans. 95-733 Internet Technologies Master of Information System Management 7 Grading • Homework/Programming (3-5) 50% • One of the homework problems is designed by the student. A presentation and demonstration is required. See me soon about your topic. • For the student designed homework, small groups are permitted. Each student presents for the same number of minutes. • Midterm 10% • Final Exam 40% 95-733 Internet Technologies Master of Information System Management 8 Some Suggested Topics For Student Selected Homework • Explore one of the many XML languages in more detail than we do in class. • Discuss and demonstrate HTML5 elements (audio, video, time, canvas). • Reading data from a sensor (might be your phone) • HTML5 Local storage. • Flash, PhoneGap, GWT, Jquery, etc… • SOFEA (Angular.js) • Many other options exist. See the schedule for projects from previous terms… 95-733 Internet Technologies Master of Information System Management 9 Plan for this week and next • Study four important styles of client server interaction that we find on the internet. • Explore some details on the last three styles. • You should begin working on Project 1 right away. 95-733 Internet Technologies Master of Information System Management 10 Four Styles of Interaction(1) Client (browser) get request Server http/tcp/ip response may include html, css, javascript html may includes hyperlinks The response or user interaction may cause code to execute within the browser 95-733 Internet Technologies Master of Information System Management The request may cause code to execute on the server 11 Four Styles of Interaction(2) Client (browser) Server API Data provided as needed Asynchronous javascript and xml (AJAX) No need for a full page refresh Same origin policy enforced by browser 95-733 Internet Technologies Master of Information System Management 12 Four Styles of Interaction(3) Client (browser) Server Response includes code to cause additional requests to others Javascript object notation with padding (jsonp) No longer restricted to the the same origin 95-733 Internet Technologies Master of Information System Management 13 Four Styles of Interaction(4) Client (browser) Server Response includes Websocket code in javascript peer Bidirectional Communication over TCP/IP peer Once the socket is established, the server may initiate the interaction. Uses: Web - collaboration apps without polling, & IoT - very fast binary. 95-733 Internet Technologies Master of Information System Management 14 AJAX • The traditional web employed thin clients. • With AJAX, downloaded code interacts with the server asynchronously. The client does not block. • This makes for a more responsive user experience. • Single page applications are possible 95-733 Internet Technologies Master of Information System Management 15 AJAX Asynchronous Java Script and XML • Why bother? - Everyone loves the browser but communication with the server is coarse-grained. A full page reload interrupts the interaction flow. • Example Applications: (Web 2.0) - Google Maps runs in a browser but behaves like an application. - Flikr photo sharing, Google Maps, Blackboard, etc.. use AJAX. 95-733 Internet Technologies Master of Information System Management 16 Since we are developing in Java we need to know… • A servlet is Java code that runs on the server when an HTTP request arrives. • A Java Server Page (JSP) is XHTML+ Java and is compiled to a servlet. • JavaScript is not Java and runs in the browser. 95-733 Internet Technologies Master of Information System Management 17 This is a UML sequence diagram. This shows a typical AJAX round trip. A solid arrowhead represents a synchronous call. A stick arrowhead represents an asynchronous signal. 95-733 Internet Technologies Master of Information System Management 18 Typical Ajax(1) 1. Javascript and HTML is delivered to the browser. 2. The JavaScript code is pointed to by a <script> tag. 3. The HTML defines a button that calls a function. 95-733 Internet Technologies Master of Information System Management 19 Typical Ajax(2) 4. Within the function (which may be passed a URL with GET data) a browser dependent request object is created with a URL (and, perhaps, GET data). 5. A handler is defined. 6. The request object is told about the handler. 7. The request object is told to send a post or get request asynchronously. 95-733 Internet Technologies Master of Information System Management 20 Typical Ajax(3) 8. If POST is used, the send method is called on the request object with the POST data. 9. The handler executes on various state changes in the request object. 10.The handler accesses the server response by asking the request object first for its state (and if it's ready with no errors) its response. 95-733 Internet Technologies Master of Information System Management 21 Typical Ajax(4) 11. The response may be text, or XML or JSON. 12. The handler performs some action on the browser. This action may alter the HTML's DOM and change what the browser displays. 95-733 Internet Technologies Master of Information System Management 22 W3C Example 1 Some simple JavaScript code to do something with data from an XML document fetched over the network: function test(data) { // taking care of data } 95-733 Internet Technologies Master of Information System Management 23 function handler() { if(this.readyState == 4 && this.status == 200) { // so far so good if(this.responseXML != null && this.responseXML.getElementById('test').firstChild.data) // success! test(this.responseXML.getElementById('test').firstChild.data); else test(null); } else if (this.readyState == 4 && this.status != 200) { // fetched the wrong page or network error... test(null); } } var client = new XMLHttpRequest(); client.onreadystatechange = handler; client.open("GET", "test.xml"); 95-733 Internet Technologies client.send();Master of Information System 24 Management W3C Example 2 If you just want to ping the server with a message you could do something like: function ping(message) { var client = new XMLHttpRequest(); client.open("POST", "/ping"); client.send(message); } We are not establishing a callback handler. We are not interested in a response. 95-733 Internet Technologies Master of Information System Management 25 W3C Example 3 Or, if you want to check the status of a document on the server, you can make a head request. function fetchStatus(address) { var client = new XMLHttpRequest(); client.onreadystatechange = function() { if(this.readyState == 4) returnStatus(this.status); } client.open("HEAD", address); client.send(); } 95-733 Internet Technologies Master of Information System Management 26 State and State Change The state of the object. The readyState attribute must be one of the following values: 0 Uninitialized The initial value. 1 Open The open() method has been successfully called. 2 Sent The user agent successfully acknowledged the request. 3 Receiving Immediately before receiving the message body (if any). All HTTP headers have been received. 4 Loaded The data transfer has been completed. When readyState changes value a readystatechange event is to be dispatched on the XMLHttpRequest object. 95-733 Internet Technologies Master of Information System Management 27 Typical Interaction post JavaScript function XML XMLHTTPRequest handler HTML Button 95-733 Internet Technologies Master of Information System Management - Executed on state change. - this.responseXML points to the root of the XML -write HTML to 28 HTML DOM A Complete Example From IBM Demonstrations: See article by Philip McCarthy on Ajax at: http://www.ibm.com/developerworks/library/j-ajax1/ Eclipse workspace mm6/95-733 Visit http://localhost:8080/AjaxProject/index.jsp Netbeans workspace mm6/95-733/AjaxUsingNetbeans ACoolAjaxShoppingCart and ACoolAjaxShoppingCartImproved 95-733 Internet Technologies Master of Information System Management 29 Main Features of Index.jsp (1) This page needs access to these imported Java packages. <%@ page import="java.util.*" %> <%@ page import="developerworks.ajax.store.*"%> The store package contains Item.java, Catalog.java and Cart.java 95-733 Internet Technologies Master of Information System Management 30 Main Features of Index.jsp (2) The header holds pointers to script code to be included in the page and then executed by the browser. <script type="text/javascript" language="javascript" src="ajax1.js"> </script> <script type="text/javascript" language="javascript" src="cart.js"> </script> This is not constrained by the same origin policy! These scripts could be fetched from any URL. 95-733 Internet Technologies Master of Information System Management 31 Main Features of Index.jsp (3) The table body tag encloses table rows that are generated on the server. This is Java (part of JSP) and is not JavaScript. <tbody> <% for (Iterator<Item> I = new Catalog().getAllItems().iterator(); I.hasNext() ; ) { Item item = I.next(); %> 95-733 Internet Technologies Master of Information System Management 32 Main Features of Index.jsp (4) The addToCart call is a call on JavaScript. <!-- For each Item do --> <tr> <td><%= item.getName() %></td> <td><%= item.getDescription() %></td> <td><%= item.getFormattedPrice() %></td> <td> <button onclick="addToCart('<%= item.getCode() %>')"> Add to Cart </button> </td> </tr> <% } %> </tbody> 95-733 Internet Technologies Master of Information System Management 33 Main Features of Index.jsp (5) The <ul> and <span> tags each have a unique identifier. These identifier will be used by the event handler. <div style=”…”> <h2>Cart Contents</h2> <ul id="contents"></ul> Total cost: <span id="total">$0.00</span> </div> 95-733 Internet Technologies Master of Information System Management 34 Main Features of Item.java package developerworks.ajax.store; import java.math.BigDecimal; Getter and setters on code, name,description and price. public class Item { private String code; private String name; private String description; private int price; public Item(String code,String name,String description,int price) { this.code=code; this.name=name; this.description=description; this.price=price; } public String getCode() { return code; } 95-733 Internet Technologies Master of Information System Management 35 Main Features of Catalog.java(1) package developerworks.ajax.store; import java.util.*; public class Catalog { private static Map<String,Item> items; static { items = new HashMap<String,Item>(); items.put("hat001",new Item("hat001", "Hat","Stylish bowler hat (SALE!)", 1999)); : } 95-733 Internet Technologies Master of Information System Management 36 Main Features of Catalog.java(2) public Collection<Item> getAllItems() { return items.values(); } public boolean containsItem(String itemCode) { return items.containsKey(itemCode); } public Item getItem(String itemCode) { return items.get(itemCode); } } 95-733 Internet Technologies Master of Information System Management 37 Main Features of Cart.java(1) package developerworks.ajax.store; public class Cart { private HashMap<Item,Integer> contents; public Cart() { contents = new HashMap<Item,Integer>(); } 95-733 Internet Technologies Master of Information System Management 38 Main Features of Cart.java(2) public void addItem(String itemCode) { Catalog catalog = new Catalog(); if (catalog.containsItem(itemCode)) { Item item = catalog.getItem(itemCode); int newQuantity = 1; if (contents.containsKey(item)) { Integer currentQuantity = contents.get(item); newQuantity += currentQuantity.intValue(); } contents.put(item, new Integer(newQuantity)); } } 95-733 Internet Technologies Master of Information System Management 39 Main Features of Cart.java(3) public String toXml() { StringBuffer xml = new StringBuffer(); xml.append("<?xml version=\"1.0\"?>\n"); xml.append("<cart generated=\""+ System.currentTimeMillis()+ "\" total=\""+getCartTotal()+"\">\n"); for (Iterator<Item> I = contents.keySet().iterator() ; I.hasNext() ; ) { Item item = I.next(); int itemQuantity = contents.get(item).intValue(); xml.append("<item code=\""+item.getCode()+"\">\n"); xml.append("<name>"); : xml.append("</cart>\n"); return xml.toString(); } 95-733 Internet Technologies Master of Information System Management 40 Main Features of CartServlet.java(1) private Cart getCartFromSession(HttpServletRequest req) { HttpSession session = req.getSession(true); Cart cart = (Cart)session.getAttribute("cart"); if (cart == null) { cart = new Cart(); session.setAttribute("cart", cart); } return cart; } 95-733 Internet Technologies Master of Information System Management 41 Main Features of CartServlet.java(2) public void doPost(HttpServletRequest req, HttpServletResponse res) throws java.io.IOException { Enumeration headers = req.getHeaderNames(); while (headers.hasMoreElements()) { String header =(String) headers.nextElement(); System.out.println(header+": "+req.getHeader(header)); } Cart cart = getCartFromSession(req); String action = req.getParameter("action"); String item = req.getParameter("item"); 95-733 Internet Technologies Master of Information System Management 42 Main Features of CartServlet.java(3) if ((action != null)&&(item != null)) { if ("add".equals(action)) { cart.addItem(item); } else if ()….. } String cartXml = cart.toXml(); res.setContentType("text/xml"); res.getWriter().write(cartXml); } 95-733 Internet Technologies Master of Information System Management 43 Main Features Axis1.js (1) /* * Returns an new XMLHttpRequest object, or false if the browser * doesn't support it */ function newXMLHttpRequest() { var xmlreq = false; // Create XMLHttpRequest object in non-Microsoft browsers if (window.XMLHttpRequest) { xmlreq = new XMLHttpRequest(); } 95-733 Internet Technologies Master of Information System Management 44 Main Features Axis1.js (2) else if (window.ActiveXObject) { try { // Try to create XMLHttpRequest in later versions of Internet Explorer xmlreq = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e1) { // Failed to create required ActiveXObject try { // Try version supported by older versions of Internet Explorer xmlreq = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { // Unable to create an XMLHttpRequest by any means xmlreq = false; } } } 95-733 Internet Technologies Master of Information System Management 45 Main Features Axis1.js (3) /* Returns a function that waits for the specified XMLHttpRequest to complete, then passes it XML response to the given handler function. req - The XMLHttpRequest whose state is changing responseXmlHandler - Function to pass the XML response to */ function getReadyStateHandler(req, responseXmlHandler) { 95-733 Internet Technologies Master of Information System Management 46 Main Features Axis1.js (4) // Return an anonymous function that listens to the // XMLHttpRequest instance return function () { // If the request's status is "complete" if (req.readyState == 4) { // Check that we received a successful response from the server if (req.status == 200) { // Pass the XML payload of the response to the handler // function. responseXmlHandler(req.responseXML); } else { // An HTTP problem has occurred alert("HTTP error "+req.status+": "+req.statusText); 95-733 Internet Technologies }}}} 47 Master of Information System Management Main Features Cart.js (1) // Timestamp of cart that page was last updated with var lastCartUpdate = 0; // Adds the specified item to the shopping cart, via Ajax call // itemCode - product code of the item to add Establish handler and pack up and send the request. function addToCart(itemCode) { var req = newXMLHttpRequest(); req.onreadystatechange = getReadyStateHandler(req, updateCart); req.open("POST", "cart.do", true); req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send("action=add&item="+itemCode); } 95-733 Internet Technologies Master of Information System Management 48 Main Features Cart.js (2) /* * Update shopping-cart area of page to reflect contents of cart * described in XML document. */ function updateCart(cartXML) { var cart = cartXML.getElementsByTagName("cart")[0]; var generated = cart.getAttribute("generated"); if (generated > lastCartUpdate) { lastCartUpdate = generated; var contents = document.getElementById("contents"); contents.innerHTML = ""; 95-733 Internet Technologies Master of Information System Management 49 Main Features Cart.js (3) var items = cart.getElementsByTagName("item"); for (var I = 0 ; I < items.length ; I++) { var item = items[I]; var name = item.getElementsByTagName("name")[0].firstChild.nodeValue; var quantity = item.getElementsByTagName("quantity")[0].firstChild.nodeValue; var listItem = document.createElement("li"); listItem.appendChild(document.createTextNode(name+" x "+quantity)); contents.appendChild(listItem); } } document.getElementById("total").innerHTML = cart.getAttribute("total"); } 95-733 Internet Technologies Master of Information System Management 50 Shopping Cart Interaction post addToCart(itemCode) XML XMLHTTPRequest HTML Button UpdateCart reads XML writes HTML 95-733 Internet Technologies Master of Information System Management Anonymous handler - Executed on state change. - req.responseXML points to the root of the XML - calls updateCart 51 Main Features Cart.js (4) The handler is reading data with the following format: <?xml version="1.0"?> <cart generated="1200367057873" total="$19.99"> <item code="str001"> <name>String</name> <quantity>1</quantity> </item> </cart> 95-733 Internet Technologies Master of Information System Management 52 Another Example From Sebesta Chapter 10 A form is required to collect name, address, zip, city, and state. The zip code entry causes an asynchronous call on a servlet to automatically complete the city and state fields. The asynchronous call is made when the user blurs (or moves away from) the zip code field. This demo is in the Netbeans project mm6/www/95-733/AjaxUsingNetbeans/SebestaAjaxExample. 95-733 Internet Technologies Master of Information System Management 53 Index.jsp Main Features <tr> <td> Zip Code: </td> <td> <input type = "text" name="zip" size = "10" Locations onblur = "getPlace(this.value)" /> written to by </td> ajax handler </tr> <tr> <td> City </td> <td> <input type = "text" name="city" id= "city" size = "30" /> </td> </tr> <tr> <td> State </td> <td> <input type = "text" name="state" id="state" size = "30" /></td> </tr> 95-733 Internet Technologies Master of Information System Management 54 Javascript Main Features function getPlace(zip) { var xhr; if(window.XMLHttpRequest) xhr = new XMLHttpRequest(); else xhr = ActiveXObject("Microsoft.XMLHTTP"); xhr.onreadystatechange = function() { if(xhr.readyState == 4) { var result = xhr.responseText; var place = result.split(', '); document.getElementById("city").value = place[0]; document.getElementById("state").value = place[1]; } } xhr.open("GET", "ZipToCityStateServlet?zip="+zip,true); xhr.send(null); } 95-733 Internet Technologies Master of Information System Management 55 Two Servlets - One for AJAX protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { // Return simple text to Ajax request if(request.getParameter("zip").equals("15216")) out.println("Pittsburgh, PA"); else out.println("New York, NY"); } finally { out.close(); } 95-733 Internet Technologies } Master of Information System Management 56 Another For the Form out.println("<h2>Name: " + request.getParameter("name") + "</h2>"); out.println("<h2>Street: " + request.getParameter("street") + "</h2>"); out.println("<h2>Zip: " + request.getParameter("zip") + "</h2>"); out.println("<h2>City: " + request.getParameter("city") + "</h2>"); out.println("<h2>State: " + request.getParameter("state") + "</h2>"); 95-733 Internet Technologies Master of Information System Management 57 XML Or JSON ? (1) <Person firstName="John" lastName="Smith"> <Address> <streetAddress>21 2nd Street</streetAddress> <city>New York</city> <state>NY</state> <postalCode>10021</postalCode> </Address> <phoneNumber type="home"> 212 555-1234 </phoneNumber> <phoneNumber type="fax"> 646 555-4567 </phoneNumber> </Person> 95-733 Internet Technologies Master of Information System Management From Wikipedia.org 58 XML Or JSON ? (2) { } "firstName": "John", "lastName": "Smith", "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] If this text is in the variable coolText, then we can create a JavaScript object with the line of code: var x = eval("(" + coolText + ")"); and access the data with x.phoneNumbers[0]. Better to use JSON.parse(text) and JSON.stringify(obj). 95-733 Internet Technologies Master of Information System Management From Wikipedia.org 59 Which To Use? Both formats are textual and are coarse grained. JSON has some advantages over XML: JSON messages are smaller and therefore faster. No namespaces JSON is simpler and simple is good. JSON has become very popular XML has some advantages over JSON: Namespaces Languages adopted by many industries XSLT can be used to transform a response into an appropriate format. XML Signature and XML Encryption not available for JSON. 95-733 Internet Technologies Master of Information System Management 60 jQuery AJAX Example <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> $(document).ready(function(){ $("button").click(function(){ $("div").load('test1.txt'); }); }); </script> </head> <body> The syntax is: $(selector).action() A $ sign to define/access jQuery A (selector) to "query (or find)" HTML elements A jQuery action() to be performed on the element(s) Document ready before running jQuery. <div><h2>Let AJAX change this text</h2></div> <button>Change Content</button> </body> </html> http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load 95-733 Internet Technologies Master of Information System Management 61 Dojo Ajax Example dojo.io.bind ( { Note the use of url : “getCityState.php?zip=“ + zip, JS object to load: function( type, data, evt ) { describe an AJAX call. var place = data.split(‘, ’); if(dojo.byID(“city”).value = “” dojo.byID(“city”).value = place[0]; if(dojo.byID(“state”).value = “” dojo.byID(“state”).value = place[1]; }, error: function(type, data, evt ) { alert(“Error in request, returned data:”+data); }, method: “GET”, mimetype: “text/plain” } From Pg. 422 ); Of Sebesta 95-733 Internet Technologies Master of Information System Management 62 JSONP Suppose we want to visit a foreign data source from within the browser. We want to make a request and retrieve data. Or, perhaps, we want to transmit information to another site – fire and forget. Why?Perhaps we want to write a client side mashup. Or, suppose we want to simply send data to a foreign server. Why? Consider Google Analytics. How does that system work? Problem: The Same Origin Policy is enforced by the browser. 95-733 Internet Technologies Master of Information System Management 63 JSONP Example 1) Visit https://developer.yahoo.com/yql/console/ 2) Choose JSON with and without a function name in the callback box. 3) Use the Yahoo Query Language (YQL: select * from geo.places where text=”Adelaide, Au” 4) Note the REST query on the bottom of the page. The REST query includes the callback function name 5) Experiment. Visit http://rss.nytimes.com/services/xml/rss/nyt/Technology.xml 6) Use YQL to get the same XML content in JSON and using JSONP. 95-733 Internet Technologies Master of Information System Management 64 Using JSONP Rather than AJAX The <script> and <img> elements are not subject to the same origin policy. Foreign scripts or images may be accessed. The code below dynamically creates a script tag, places it in the HTML head section, fetches the script, and executes it. Then, it deletes the script element. function jsonp(url) { // user defined function var head = document.head; // point to head var script = document.createElement("script"); // create script script.setAttribute("src", url); // set script attribute src to url head.appendChild(script); // add to head and execute the head.removeChild(script); // script that is returned } // remove script element 95-733 Internet Technologies Master of Information System Management 65 JSONP Problem The problem is the client executes the code after it is fetched. The data fetched is treated as a Javascript block statement. This results in a syntax error – if the data is JSON - not something we want to execute. Solution: We send the name of a function along with the request. The function name is included in the response by the server. When the response arrives the function is called. Suppose the request includes the function name foo. A response might look like this: foo({"message" : "Hello" }) We provide the function foo that takes a Javascript object parameter. 95-733 Internet Technologies Master of Information System Management 66 Example: Handle JSONP in Java @WebServlet(urlPatterns = {"/JSONServlet"}) public class JSONServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); System.out.println("JSON Servlet has a visitor"); try (PrintWriter out = response.getWriter()) { // the query parameter is method=callbackName String name = request.getParameter("method"); // name is the callBack // return JSON object as a String {"id" : "mike"} out.println(name + "({\"id\" : \"mike\" })"); } } 95-733 Internet Technologies Master of Information System Management 67 Using JSONP On the client <!DOCTYPE html> <!-Index.html This is a simple demonstration of using JSONP. --> <html> <head> <title>Experiment with JSONP</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Fetch the script from web site --> <script src="jsonpscript.js"></script> 95-733 Internet Technologies Master of Information System Management 68 <!-- provide a callback handler named coolBeans --> <script> function coolBeans(x) { alert("In coolBeans with " + x.id + " from server"); } </script> </head> <body> <div> <!-- On click, get some JSON data from the JSONServlet and pass it to the callBackHandler. --> <button onclick="cooljsonp('JSONServlet','callBackHandler')">Click me for some JSON </button> <!-- On click, get some JSON data from the JSONServlet and pass it to the callBackHandler coolBeans --> <button onclick="cooljsonp('JSONServlet','coolBeans')">Or click me for some JSON </button> </div> </body> </html> 95-733 Internet Technologies Master of Information System Management 69 Using JSONP Javascript <!– jsonpscript.js function cooljsonp(url,myCallback) { alert("Calling " + url + " with " + myCallback + " for callback"); var head = document.head; var script = document.createElement("script"); } script.setAttribute("src", url + '?' + 'method=' + myCallback); head.appendChild(script); head.removeChild(script); 95-733 Internet Technologies Master of Information System Management 70 Using JSONP Javascript <!– jsonpscript.js function callBackHandler(jsonObject) { alert("callBack called"); // display the id property value // treating it as a JSON object alert(jsonObject.id); // covert the jsonObject to a String var response = JSON.stringify(jsonObject); alert(response); } 95-733 Internet Technologies Master of Information System Management 71 Web Sockets Javascript API defined by W3C – Available on many browsers. Java client side API and server side API see JSR 356 part of JEE 7 95-733 Internet Technologies Master of Information System Management From Oracle 72 Web Sockets Lifecycle Events The typical lifecycle event of a WebSocket interaction goes as follows: One peer (a client) initiates the connection by sending an HTTP handshake request. The other peer (the server) replies with a handshake response. The connection is established. From now on, the connection is completely symmetrical. Both peers send and receive messages. One of the peers closes the connection. Most of the WebSocket lifecycle events can be mapped to Java methods, both in the annotation-driven and interface-driven approaches. Note that Web Sockets don’t describe the conversation that will take place. This is left to the layer above the web socket layer. 95-733 Internet Technologies Master of Information System Management From Oracle 73 Client side Web Sockets (1) // Establish the socket in Javascript: // Open a new WebSocket connection (ws), use wss for secure // connections over SSL. var wsUri = "ws://" + document.location.host + document.location.pathname + "whiteboardendpoint"; var websocket = new WebSocket(wsUri); 95-733 Internet Technologies Master of Information System Management 74 Client side Web Sockets (2) // Prepare to send and receive data. // A callback function is invoked for each new message from // the server websocket.onmessage = function(evt) { onMessage(evt) }; function onMessage(evt) { // Called for us when a message drawImageText(evt.data); // arrives. } function sendText(json) { // We call this when we want. websocket.send(json); } 95-733 Internet Technologies Master of Information System Management 75 Server side Web Sockets in Java (1) @ServerEndpoint(value="/whiteboardendpoint", encoders = {FigureEncoder.class}, decoders = {FigureDecoder.class}) public class MyWhiteboard { // create a synchronized (thread safe) set of sessions in a hashset // names this collection peers private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>()); 95-733 Internet Technologies Master of Information System Management 76 Server side Web Sockets in Java (2) // when a message arrives over the socket, call the peers @OnMessage public void broadcastFigure(Figure figure, Session session) throws IOException, EncodeException { System.out.println("broadcastFigure: " + figure); // for each peer in the peers set of sessions for (Session peer : peers) { if (!peer.equals(session)) { // this is not being sent back to the caller peer.getBasicRemote().sendObject(figure); } } } 95-733 Internet Technologies Master of Information System Management 77 Web Sockets and IOT device MQTT Broker subscriber publish device MQ Telemetry Transport (MQTT) telemetry = remote measurements. MQTT runs on top of TCP. MQTT is an established publish subscribe Can be carried by web messaging protocol for intermittent networks. sockets, e.g., real time dashboards. With MQTT over WebSockets, a browser can MQTT-SN for sensor become an MQTT device – subscribing to or networks. No TCP or IP. publishing messages. Can use e.g. ZigBee or 95-733 Internet Technologies BlueTooth. 78 Master of Information System Management