480 likes | 558 Views
46-929 Web Technologies. Lecture 1 Introduction. Course Web Site. http://www.andrew.cmu.edu/~mm6. Course TA’s. Yunning Wang Yunning@andrew.cmu.edu. Structure of the Course. Lectures / class participation Homeworks (programming) Final exam. Readings.
E N D
46-929 Web Technologies Lecture 1 Introduction
Course Web Site http://www.andrew.cmu.edu/~mm6
Course TA’s Yunning Wang Yunning@andrew.cmu.edu
Structure of the Course • Lectures / class participation • Homeworks (programming) • Final exam
Readings The required text is “XML and Java” Second edition Addison-Wesley Readings will be assigned each week. Readings from the web will also be assigned.
Grading • Homework (2-3) 50% • Final Exam 50%
Selected Course Topics • Web Applications, XML and Java • Parsing XML Documents • Generating and Serializing XML Documents • Working with DOM • Working with SAX • Xpath and XSLT
Selected Course Topics • Servlets and Java Server Pages • XML, JDBC and Databases • The Financial Product Markup Language • XML Messaging using JAXM and SOAP • Web Services (WSDL, UDDI) • XML Digital Signature, XML Encryption • Data Binding using JAXB
Introduction XML and Java Chapter 1 Web Applications, XML, and Java
Introduction In this course we will be concerned with B2B applications. We will study how applications can send, receive, verify and manipulate XML documents. Definition: By Web Application we mean a distributed application based on Web technologies: HTTP, HTML, and the family of XML technologies.
Introduction Definition: By traditional three-tier application we mean applications consisting of: First tier – Browsers that act as a human interface Second tier – a program running in a web server Third tier – backend systems that provide databases and transaction services Let’s replace the browser with a program…
From web for eyeballs to web for programs Consider a PowerWarning application allows users To register their geographical position and their temperature concerns. Users will receive e-mail when the temperature exceeds the user specified parameters.
Suppose that we know that the weather information is available from the web at http://www.xweather.com/White_Plains_NY_US.html. [1] <html> [2] <head> [3] <title>Weather Report</title> [4] </head> [5] <body> [6] <h2>Weather Report -- White Plains, NY </h2> [7] <table border=1> [8] <tr><td>Date/Time</td><td align=center>11 AM EDT Sat Jul 25 1998</td></tr> [9] <tr><td>Current Tem.</td><td align=center>70°</td></tr> [10] <tr><td>Today’s High</td><td align=center>82°</td></tr> [11] <tr><td>Today’s Low</td><td align=center>62°</td><tr> [12] </table> [13] </body> [14] </html>
Strategy 1: • For the current temperature of White Plains, go to line 9, • column 46 of the page and continue until reaching the next • ampersand. • Strategy 2: • For the current temperature of the White Plains, go to the • first <table> tag, then go to the second <tr> tag within the • table, and then go to the second <tg> tag within the row. Neither of these seems very appealing…
<?xml version=“1.0”?> <!DOCTYPE WeatherReport SYSTEM “http>//www.xweather.com/WeatherReport.dtd”> <WeatherReport> <City>White Plains</City> <State>NY</State> <Date>Sat Jul 25 1998</Date> <Time>11 AM EDT</Time> <CurrTemp unit=“Farenheit”>70</CurrTemp> <High unit=“Farenheit”>82</High> <Low unit=“Farenheit”>62</Low> </Weather Report> XML would help
Strategy 3: • For the current temperature of White Plains, N.Y., go • to the <CurrTemp> tag.
WeatherReport application Mobile users XSLT WML HTML XML PC users Http://www.xweather.com PowerWarning application XML Email notifications Registrations Application programs XML
XML • Extensible Markup Language (really a meta- • language) • Generic syntax (not like HTML) • Simple, human-readable tags • From Web for eyeballs to Web for programs • Tools exist that allows us to easily process • any type of XML document
Introduction XML and Java Chapter 2 Basics of Parsing Documents
Department.xml <?xml version="1.0" encoding="utf-8"?> <department> <employee id="J.D"> <name>John Doe</name> <email>John.Doe@foo.com</email> </employee> <employee id="B.S"> <name>Bob Smith</name> <email>Bob.Smith@foo.com</email> </employee>
<employee id="A.M"> <name>Alice Miller</name> <url href="http://www.foo.com/~amiller/"/> </employee> </department>
SimpleParse.java // Download Xerces from http://xml.apache.org/xerces2-j/index.html // Two Jar files are needed- xercesImpl.jar and xmlParserAPIs.jar // add these to the classpath /** * From XML and Java Chapter 2 SimpleParse.java **/ import org.w3c.dom.Document; import org.apache.xerces.parsers.DOMParser; import org.xml.sax.SAXException; import java.io.IOException;
public class SimpleParse { public static void main(String[] argv) { if (argv.length != 1) { System.err.println( "Usage: java SimpleParse <filename>"); System.exit(1); } try { // Creates a parser object DOMParser parser = new DOMParser(); // Parses an XML Document parser.parse(argv[0]); // Gets a Document object Document doc = parser.getDocument();
} catch (SAXException se) { System.out.println("Parser error found: " +se.getMessage()); System.exit(1); } catch (IOException ioe) { System.out.println("IO error found: " + ioe.getMessage()); System.exit(1); } } } D:\McCarthy\www\95-733\examples\chap02>java SimpleParse department.xml D:\McCarthy\www\95-733\examples\chap02>
Let’s Introduce an Error <?xml version="1.0" encoding="utf-8"?> <department> <employee id="J.D"> <name>John Doe</name> <email>John.Doe@foo.com</email> </employee> <employee id="B.S"> <name>Bob Smith</name> <email>Bob.Smith@foo.com</email> </employee> This code is OK.
<employee id="A.M"> <name>Alice Miller <url href="http://www.foo.com/~amiller/"/> </employee> </department> Missing closing tag on name. The document is not well-formed.
D:\McCarthy\www\95-733\examples\chap02>java SimpleParse department.xml [Fatal Error] department.xml:16:5: The element type "name" must be terminated by the matching end-tag "</name>". Parser error found: The element type "name" must be terminated by the matching e nd-tag "</name>". After displaying the error status an exception was throw to the application
department-dtd.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE department SYSTEM "department.dtd"> <department> <employee id="J.D"> <name>John Doe</name> <email>John.Doe@foo.com</email> </employee> <employee id="B.S"> <name>Bob Smith</name> <email>Bob.Smith@foo.com</email> </employee>
<employee id="A.M"> <name>Alice Miller</name> <url href="http://www.foo.com/~amiller/"/> </employee> </department>
department.dtd <!ELEMENT department (employee)*> <!ELEMENT employee (name, (email | url))> <!ATTLIST employee id CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT url EMPTY> <!ATTLIST url href CDATA #REQUIRED>
SimpleParseWithValidation.java /** * SimpleParseWithValidation.java **/ import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.ErrorHandler; import org.apache.xerces.parsers.DOMParser; import java.io.IOException;
public class SimpleParseWithValidation { public static void main(String[] argv) { if (argv.length != 1) { System.err.println("Usage: java "+ "SimpleParseWigthValidation <filename>"); System.exit(1); } try { // Creates parser object DOMParser parser = new DOMParser(); // Sets an ErrorHandler parser.setErrorHandler(new MyErrorHandler());
// Tells the parser to validate documents parser.setFeature( "http://xml.org/sax/features/validation", true); // Parses an XML Document parser.parse(argv[0]); // Gets a Document object Document doc = parser.getDocument(); // Does something } catch (Exception e) { e.printStackTrace(); } } }
MyHandler.java import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class MyErrorHandler implements ErrorHandler { /** Constructor. */ public MyErrorHandler(){ }
/** Warning. */ public void warning(SAXParseException ex) { System.err.println("[Warning] "+ getLocationString(ex)+": "+ ex.getMessage()); } /** Error. */ public void error(SAXParseException ex) { System.err.println("[Error] "+ getLocationString(ex)+": "+ ex.getMessage()); } /** Fatal error. */ public void fatalError(SAXParseException ex) { System.err.println("[Fatal Error] "+ getLocationString(ex)+": "+ ex.getMessage()); }
/** Returns a string of the location. */ private String getLocationString(SAXParseException ex) { StringBuffer str = new StringBuffer(); String systemId = ex.getSystemId(); if (systemId != null) { int index = systemId.lastIndexOf('/'); if (index != -1) systemId = systemId.substring(index + 1); str.append(systemId); } str.append(':'); str.append(ex.getLineNumber()); str.append(':'); str.append(ex.getColumnNumber()); return str.toString(); } } Get the file name after the /’s.
Runs without error D:\McCarthy\www\95-733\examples\chap02>java SimpleParseWithValidation department-dtd.xml D:\McCarthy\www\95-733\examples\chap02>
Using the same dtd… <!ELEMENT department (employee)*> <!ELEMENT employee (name, (email | url))> <!ATTLIST employee id CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT url EMPTY> <!ATTLIST url href CDATA #REQUIRED>
Introduce an error <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE department SYSTEM "department.dtd"> <department> <employee> <name>John Doe</name> <email>John.Doe@foo.com</email> </employee> <employee id="B.S"> <name>Bob Smith</name> <email>Bob.Smith@foo.com</email> </employee>
<employee id="A.M"> <name>Alice Miller</name> <url href="http://www.foo.com/~amiller/"/> </employee> </department> D:\McCarthy\www\95-733\examples\chap02>java SimpleParseWithValidation department-dtd2.xml [Error] department-dtd2.xml:4:13: Attribute "id" is required and must be specifi ed for element type "employee". The parser does not throw an exception.
Make a fatal error (not well-formed) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE department SYSTEM "department.dtd"> <department> <employee id="J.D."> <name>John Doe</name> <email>John.Doe@foo.com</email> </employee> <employee id="B.S"> <name>Bob Smith</name> <someTag> id="A.M"> <email>Bob.Smith@foo.com</email> </employee> </department>
D:\McCarthy\www\95-733\examples\chap02>java SimpleParseWithValidation department-dtd2.xml [Error] department-dtd2.xml:10:39: Element type "someTag" must be declared. [Fatal Error] department-dtd2.xml:12:5: The element type "someTag" must be termi nated by the matching end-tag "</someTag>". org.xml.sax.SAXParseException: The element type "someTag" must be terminated by the matching end-tag "</someTag>". at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at SimpleParseWithValidation.main(SimpleParseWithValidation.java:31) An exception is thrown to the caller for this Fatal Error.
JAXP • An API but really an abstraction layer • Does not provide a new means of parsing XML • Does not add to DOM, SAX or XSLT • Does not provide new functionality in handling XML • JAXP enables applications to parse and transform • XML documents independent of a particular XML • processing implementation. Just change a system • variable or classpath setting and you change parsers. • Six classes included in JDK1.4 in • javax.xml.parsers package
SimpleParseJAXP.java /** * SimpleParseJAXP.java **/ import java.io.IOException; import org.w3c.dom.Document; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; Note: no mention of xerces.
public class SimpleParseJAXP { public static void main(String[] argv) { if (argv.length != 1) { System.err.println( "Usage: java SimpleParseJAXP <filename>"); System.exit(1); } try { // Creates document builder factory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // Tells the parser to validate documents factory.setValidating(true);
// Tells the parser to be aware namespaces factory.setNamespaceAware(true); // Creates builder object DocumentBuilder builder = factory.newDocumentBuilder(); // Sets an ErrorHandler builder.setErrorHandler(new MyErrorHandler()); // Parses the document Document doc = builder.parse(argv[0]); } catch (ParserConfigurationException pe) { pe.printStackTrace(); } catch (SAXException se) { se.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } } }
Suppose we want Xerces to be our parser D:\McCarthy\www\95-733\examples\chap02>java -Djavax.xml.parsers.DocumentBuilderFactory= org.apache.xerces.jaxp.DocumentBuilderFactoryImpl SimpleParseJAXP department-dtd.xml