XML, Uploading, Importing... Joshua Scotton.
-
Upload
malik-hesseltine -
Category
Documents
-
view
224 -
download
5
Transcript of XML, Uploading, Importing... Joshua Scotton.
Data in Web Applications
XML, Uploading, Importing...Joshua Scotton
<% //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); %>
Forcing No-Cache in JSP
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>”;
Generating XML
Have to handle special characters◦ <tag><br/></tag>
No validation so easy to make mistakes
Disadvantages
Java API for XML Processing Provides validation, parsing and generation
functionality for XML
JAXP
DOM - Document Object Model (JDK5+) SAX - Simple API for XML (JDK5+) StAX - Streaming API for XML (JDK6+)
Java Built-In XML Parsers
The DOM Parser models the entire XML document in memory
Uses the org.w3c.dom.Document model Tree Nodes
◦ Element◦ Attr◦ Text
DOM XML Parser
Generate XML with DOM
G e n e r a t e D O M . c l a s s
Parse XML with DOMR e a d D O M . c l a s s
Modify XML with DOMM o d i f y D O M . c l a s s
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.
Disadvantage of DOM
Faster at reading XML content than DOM. Stream implementation instead of
Document Model Callback handler object has to be created
SAX XML Parser
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.
SAX Callback Handler Methods
Parse XML with SAXR e a d S A X . c l a s s
QuizMaster
Upload and import XML test files Store tests, results and users in database User login and registration Users can take tests and view results
Functionality
Test◦ TestQuestion
TestAnswer Result
◦ ResultQuestion
Quiz Representation
<!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 DTD
<?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>
XML Example
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); }
}
TestBean
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); }
}
TestQuestionBean
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;
}}
TestAnswerBean
XML -> JavaBeansI m p o r t T e s t . c l a s s
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”
File Upload
<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>
uploadForm.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>
importUpload.jsp
Catching the UploadU p l o a d B e a n . c l a s s
<jsp:useBean id="test" class="webdev.quizmaster.TestBean" scope="session"/>
<h3><%=test.getTitle() %></h3><p><i><%=test.getDescription() %></i></p>
<% int i=0;for(TestQuestionBean q : test.getQuestions()){
i++;out.println("<hr width=\"95%\"><p>Question " + i + ": " +
q.getText()+"</p><ul>");
for(TestAnswerBean a : q.getAnswers()){out.println("<li><i>" + a.getText() + "</i></li>");
}
out.println("</ul>");}%>
viewTest.jsp
Adding Authentication
connectionName connectionPassword connectionURL driverName roleNameCol userCredCol userNameCol userRoleTable userTable
org.apache.catalina.realm.JDBCRealm
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;
SQL for Tables
Will need to install the MySQL driver 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"/>
JDBCRealm in Context.xml
admin:admin guest:guest
Setup Users
admin User
Setup Roles