350 likes | 416 Vues
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
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 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 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="index?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
To Implement on Thursday • Registration • Store Tests and Results in a database