350 likes | 427 Vues
Learn how to handle XML data in web applications using Java, from uploading and importing to parsing and generating XML files. Understand DOM and SAX parsers, along with best practices for XML manipulation.
E N D
Data in Web Applications XML, Uploading, Importing... Joshua Scotton
Forcing No-Cache in JSP <% //HTTP 1.1 response.setHeader("Cache-Control","no-store"); //HTTP 1.0 response.setHeader("Pragma","no-cache"); //Stops any problems from proxy servers response.setDateHeader("Expires", 0); %>
Generating XML • Simplest way is to construct a string: String s = “<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n” + “<exampleDoc>\n” + “ <xml-tag>\n” + “ ...\n” + “ </xml-tag>\n” + “</exampleDoc>”;
Disadvantages • Have to handle special characters • <tag><br/></tag> • No validation so easy to make mistakes
JAXP • Java API for XML Processing • Provides validation, parsing and generation functionality for XML
Java Built-In XML Parsers • DOM - Document Object Model (JDK5+) • SAX - Simple API for XML (JDK5+) • StAX - Streaming API for XML (JDK6+)
DOM XML Parser • The DOM Parser models the entire XML document in memory • Uses the org.w3c.dom.Document model • Tree Nodes • Element • Attr • Text
Generate XML with DOM GenerateDOM.class
Parse XML with DOM ReadDOM.class
Modify XML with DOM ModifyDOM.class
Disadvantage of DOM • DOM should be avoided for large files as the entire XML file is modelled as a Document in memory, including all Nodes, Elements, Attributes etc.
SAX XML Parser • Faster at reading XML content than DOM. • Stream implementation instead of Document Model • Callback handler object has to be created
SAXCallback Handler Methods • Following methods can be overwritten in the Handler class: • startDocument() and endDocument() – methods called at the start and end of an XML document. • startElement() and endElement() – methods called at the start and end of a document element. • characters() – method called with the text contents in between the start and end tags of an XML document element.
Parse XML with SAX ReadSAX.class
Functionality • Upload and import XML test files • Store tests, results and users in database • User login and registration • Users can take tests and view results
Quiz Representation • Test • TestQuestion • TestAnswer • Result • ResultQuestion
XML DTD <!ELEMENT answer ( text ) > <!ATTLIST answer id NMTOKEN #REQUIRED > <!ATTLIST answer score NMTOKEN #REQUIRED > <!ELEMENT description ( #PCDATA ) > <!ELEMENT question ( text, answer+ ) > <!ATTLIST question id NMTOKEN #REQUIRED > <!ELEMENT test ( title, description, question+ ) > <!ELEMENT text ( #PCDATA ) > <!ELEMENT title ( #PCDATA ) >
XML Example <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root_element PUBLIC "Test" "http://localhost:8080/QuizMaster/test.dtd"> <test> <title>Example Quiz</title> <description>Quick Quiz on Java XML Parsers</description> <question id="1"> <text>Which of the following is not a built-in Java parser?</text> <answer score="1" id="1“><text>JDOM</text></answer> <answer score="0" id="2“><text>DOM</text></answer> <answer score="0" id="3“><text>SAX</text></answer> </question> <question id="2"> <text>DOM loads the entire XML into memory. True or false?</text> <answer score="1" id="1“><text>True</text></answer> <answer score="0" id="2“><text>False</text></answer> </question> </test>
TestBean public class TestBean implements Serializable { private String title; private String description; private List<TestQuestionBean> questions; public String getTitle() { return title; } public void setTitle(String title) { this.title= title; } public String getDescription() { return description; } public void setDescription(String description) { this.description= description; } public List<TestQuestionBean> getQuestions() { return questions; } public void setQuestions(List<TestQuestionBean> questions) { this.questions= questions; } public void addQuestion(TestQuestionBean question) { this.questions.add(question); } }
TestQuestionBean public class TestQuestionBean implements Serializable{ private String text; private String id; private List<TestAnswerBean> answers; public String getText() { return text; } public void setText(String text) { this.text= text; } public List<TestAnswerBean> getAnswers() { return answers; } public void setAnswers(List<TestAnswerBean> answers) { this.answers= answers; } public void addAnswer(TestAnswerBean answer) { this.answers.add(answer); } }
TestAnswerBean public class TestAnswerBean implements Serializable { private String text; private String id; private Integer score; public String getText() { return text; } public void setText(String text) { this.text= text; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score= score; } }
XML -> JavaBeans ImportTest.class
File Upload • Select file (uploadForm.jsp) • Load into UploadBean (importUpload.jsp) • UploadBean -> ImportTest • ImportTest creates TestBean • TestBean stored in Session • Success Message (importUpload.jsp) • Display Test (viewTest.jsp) • index?action=“upload|import|view”
uploadForm.jsp <form enctype="multipart/form-data" method="POST" action=“admin?action=import"> File Path:<br /> <input type="file" id="filePath" name="filePath" /><br /><br /> <input type="submit" value="Upload" /> </form>
importUpload.jsp <jsp:useBean id="uploader" class="webdev.quizmaster.UploadBean" scope="session"/> <p> <%= uploader.startUpload(request) %> </p><p> <a href="index?action=view">View Test</a> </p>
Catching the Upload UploadBean.class
viewTest.jsp <jsp:useBean id="test" class="webdev.quizmaster.TestBean" scope="session"/> <h3><%=test.getTitle() %></h3> <p><i><%=test.getDescription() %></i></p> <% inti=0; for(TestQuestionBeanq : test.getQuestions()){ i++; out.println("<hr width=\"95%\"><p>Question " + i + ": " + q.getText()+"</p><ul>"); for(TestAnswerBeana : q.getAnswers()){ out.println("<li><i>" + a.getText() + "</i></li>"); } out.println("</ul>"); } %>
org.apache.catalina.realm.JDBCRealm • connectionName • connectionPassword • connectionURL • driverName • roleNameCol • userCredCol • userNameCol • userRoleTable • userTable
SQL for Tables CREATE TABLE `QuizMaster`.`user` (`username` TEXT NOT NULL ,`password` TEXT NOT NULL ) ENGINE = InnoDB; CREATE TABLE `QuizMaster`.`role` (`username` TEXT NOT NULL ,`role` TEXT NOT NULL ) ENGINE = InnoDB;
JDBCRealm in Context.xml • Will need to install the MySQLdriver from http://dev.mysql.com/downloads/connector/j/3.0.html in the tomcat/lib folder <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/quizmaster" connectionName=“username" connectionPassword=“password" userTable="user" userNameCol="username" userCredCol="password" userRoleTable="role" roleNameCol="role" />
Setup Users • admin:admin • guest:guest
Setup Roles • admin • User