XML, Uploading, Importing... Joshua Scotton.

Post on 01-Apr-2015

223 views 5 download

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>&lt;br/&gt;</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