ΕΡΓΑΣΤΗΡΙΟ – No.7 Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν Δρ. Χρήστος Κ. Γεωργιάδης Java APIs για Web Services: ΧΜL και JSP
Δρ. Χρήστος Κ. Γεωργιάδης The Document Object Model (DOM) APIs Μοντέλο Αντικειμένων Εγγράφου Το πρότυπο DOM μετατρέπει ένα έγγραφο XML σε μια συλλογή αντικειμένων στο πρόγραμμά μας. Μπορούμε έπειτα να χειριστούμε το μοντέλο αντικειμένου με κάθε τρόπο που έχει νόημα. Αυτός ο μηχανισμός είναι επίσης γνωστός ως πρωτόκολλο τυχαίας «προσπέλασης», επειδή μπορούμε να επισκεφτούμε οποιοδήποτε μέρος των δεδομένων, σε οποιαδήποτε στιγμή. Μπορούμε έπειτα να τροποποιήσουμε τα δεδομένα, να τα αφαιρέσουμε, ή να παρεμβάλουμε νέα δεδομένα.
Δρ. Χρήστος Κ. Γεωργιάδης DOM APIs Χρησιμοποιούμε τη κλάση javax.xml.parsers.DocumentBuilderFactory για τη δημιουργία ενός DocumentBuilder instance, το οποίο το χρησιμοποιούμε για τη παραγωγή ενός Document (ενός DOM) που ακολουθεί τη προδιαγραφή του DOM. Ο builder που παίρνουμε, προσδιορίζεται από την ιδιότητα System, που επιλέγει τη συγκεκριμένη υλοποίηση του factory που χρησιμοποιήθηκε. Μπορούμε ακόμη να χρησιμοποιήσουμε τη μέθοδο newDocument() του DocumentBuilder, για τη δημιουργία ενός άδειου Εγγράφου που υλοποιεί το interface του org.w3c.dom.Document. Εναλλακτικά, μπορούμε να χρησιμοποιήσουμε μία από τις μεθόδους parse του builder, για τη κατασκευή ενός Εγγράφου από υπάρχοντα δεδομένα XML. Το αποτέλεσμα είναι ένα δένδρο DOM, όπως αυτό του διαγράμματος.
Δρ. Χρήστος Κ. Γεωργιάδης Τα πακέτα DOM org.w3c.dom Προσδιορίζει τα DOM προγραμματιστικά interfaces για XML (και, προαιρετικά για HTML) έγγραφα, όπως προσδιορίστηκε από τον οργανισμό W3C. javax.xml.parsers Ορίζει τη κλάση DocumentBuilderFactory και τη κλάση DocumentBuilder, που επιστρέφουν ένα αντικείμενο που υλοποιεί το W3C Document interface. Επίσης το πακέτο αυτό ορίζει τη κλάση ParserConfigurationException για αναφορά λαθών.
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho01.java Σκελετός εφαρμογής public class DomEcho01 { public static void main(String argv[]) { if (argv.length != 1) { System.err.println( "Usage: java DomEcho filename"); System.exit(1); } }// main }// DomEcho
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho01.java Imports import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import java.io.File; import java.io.IOException; import org.w3c.dom.Document; import org.w3c.dom.DOMException;
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho01.java Δήλωση DOM static Document document; Χειρισμός λαθών (όμοιος με SAX) try { } catch (SAXParseException spe) { // Error generated by the parser System.out.println("\n** Parsing error" + ", line " + spe.getLineNumber() + ", uri " + spe.getSystemId()); System.out.println(" " + spe.getMessage() ); // Use the contained exception, if any Exception x = spe; if (spe.getException() != null) x = spe.getException(); x.printStackTrace(); } catch (SAXException sxe) { // Error generated during parsing Exception x = sxe; if (sxe.getException() != null) x = sxe.getException(); x.printStackTrace(); } catch (ParserConfigurationException pce) { // Parser with specified options can't be built pce.printStackTrace(); } catch (IOException ioe) { // I/O error ioe.printStackTrace(); } }// main
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho01.java Δημιουργία στιγμιότυπου του factory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); Απόκτηση parser και ανάλυση αρχείου try { DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse( new File(argv[0]) ); } catch (SAXParseException spe) {
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho02.java Εμφάνιση μιας ιεραρχίας DOM Πρόσθεση νέων import // GUI components and layouts import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.JSplitPane; import javax.swing.JEditorPane; // GUI support classes import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.WindowEvent; import java.awt.event.WindowAdapter; // For creating borders import javax.swing.border.EmptyBorder; import javax.swing.border.BevelBorder; import javax.swing.border.CompoundBorder;
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho02.java Δημιουργία GUI Framework public class DomEcho02 extends JPanel static final int windowHeight = 460; static final int leftWidth = 300; static final int rightWidth = 340; static final int windowWidth = leftWidth + rightWidth; … document = builder.parse( new File(argv[0]) ); makeFrame(); …
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho02.java makeFrame() public static void makeFrame() { // Set up a GUI framework JFrame frame = new JFrame("DOM Echo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); // Set up the tree, the views, and display it all final DomEcho02 echoPanel = new DomEcho02(); frame.getContentPane().add("Center", echoPanel ); frame.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int w = windowWidth + 10; int h = windowHeight + 10; frame.setLocation(screenSize.width/3 - w/2, screenSize.height/2 - h/2); frame.setSize(w, h); frame.setVisible(true) } // makeFrame
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho02.java constructor, border και JEditPane public DomEcho02() { // Make a nice border EmptyBorder eb = new EmptyBorder(5,5,5,5); BevelBorder bb = new BevelBorder(BevelBorder.LOWERED); CompoundBorder cb = new CompoundBorder(eb,bb); this.setBorder(new CompoundBorder(cb,eb)); } // Constructor // Set up the tree JTree tree = new JTree(); // Build left-side view JScrollPane treeView = new JScrollPane(tree); treeView.setPreferredSize( new Dimension( leftWidth, windowHeight )); // Build right-side view JEditorPane htmlPane = new JEditorPane("text/html",""); htmlPane.setEditable(false); JScrollPane htmlView = new JScrollPane(htmlPane); htmlView.setPreferredSize( new Dimension( rightWidth, windowHeight ));
Δρ. Χρήστος Κ. Γεωργιάδης Παράδειγμα: DomEcho02.java split-pane view // Build split-pane view JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treeView, htmlView ); splitPane.setContinuousLayout( true ); splitPane.setDividerLocation( leftWidth ); splitPane.setPreferredSize( new Dimension( windowWidth + 10, windowHeight+10 )); // Add GUI components this.setLayout(new BorderLayout()); this.add("Center", splitPane );