Top Banner
file:///../intern/Standaarden/Logo/groene%20onderbalk.png file:///../intern/Standaarden/Logo/groene%20onderbalk.png November 30th, 2007 Dynamic Markup and on-the-fly Components binding XML content to Wicket Components Wouter Huijnink Func. Internet Integration
41

Wicket Dynamic Components

May 09, 2015

Download

Technology

Func
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Dynamic Markup and on­the­fly Components

binding XML content to Wicket Components

Wouter HuijninkFunc. Internet Integration

Page 2: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Structure of this talk

Introduction The problem by example Our pre­Wicket approach Requirements Approach Todo

Page 3: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Func. Internet Integration

Web Applications on Open Source java component stack:Wicket – Spring – Hibernate – CXF (XFire)

Using Wicket for 2.5 years now component framework ­> OO clean separation of markup and code accessibility (Ajax fallback)

Page 4: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Triggers

Request for proposal: generic editing page for XSD­defined XML blobs

New project: application for online examination

Page 5: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Common Denominators

No POJO representation of domain (XML) dynamic page structure (content dependent) Wicket components picked at runtime Requirement: Wicket application in full control

Page 6: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

The Problem by Example

Dynamic edit/search forms User interactions specified in XML

Page 7: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Dynamic Forms

Content repository: objects + metadata Metadata defined in XSD, stored as XML Requirement: multi profile support Requirement: no refactoring required when new 

profile is added by administrator

Page 8: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Example: CZP metadata form

Page 9: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

XML defined User Interactions

customer: publisher educational content all content is strictly formalized (XML) Educational Standards applied where possible IMS Question Type Interaction (QTI) for 

survey / exam style content

Page 10: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

QTI defines

question correct answer interaction types (Choice, Text, Order, ...) response processing rules scoring

Page 11: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Trivial Test Element

QuestionWhat is your preferred Java Web Development 

framework?

Page 12: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Trivial Test Element

Correct response (needless to say):Wicket

Page 13: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Trivial Test Element

Interaction TypeChoice, with options

StrutsTapestryWicket

Page 14: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Trivial Test Element

Response processingAn exact match is required of the candidate 

response and the correct response

Page 15: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Trivial Test Element

ScoringThe default score is 0, a correct response gives 

you a score of 1

Page 16: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

QTI Representation

<assessmentItem identifier="choice" title="Web Framework">  <responseDeclaration identifier="R">    <correctResponse>      <value>C</value>    </correctResponse>  </responseDeclaration>  <itemBody>    <p>What is your preferred Java web development framework?</p>    <choiceInteraction responseIdentifier="R" maxChoices="1">      <simpleChoice identifier="A">Struts</simpleChoice>      <simpleChoice identifier="B">Tapestry</simpleChoice>      <simpleChoice identifier="C">Wicket</simpleChoice>    </choiceInteraction>  </itemBody></assessmentItem>

Page 17: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

As XHTML

<form id="questionForm" action="/questionHandler" method="POST"> <p>What is your preferred Java web development framework?</p> <p>   <input name="fw" type="radio" value="A">Struts</input> <br />   <input name="fw" type="radio" value="B">Tapestry</input> <br />   <input name="fw" type="radio" value="C">Wicket</input> <br /> </p><p>   <input type="submit" value="Am I right or am I right?" /> </p> </form>

Page 18: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

In the Browser

Page 19: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Multiple Interactions

Page 20: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Drawing Interaction

Page 21: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Graphic Gap Match

Page 22: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Previous Approach

Intermediate format: XForms Mixed frameworks: Wicket + Chiba

Page 23: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Previous Approach

Page 24: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Previous Approach ­ Issues

Chiba hacks required XForms rather complex Control hell: both Chiba and Wicket process 

user actions and data

Page 25: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

What do we want now?

To be able to create on­the­fly, dynamic, interactive components, using generic Wicket 

components

Page 26: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

What do we want now?

often updated, dynamic content  containing standardized XML Object Oriented approach generic components properly integrated in Wicket

Page 27: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Our Approach

generate Wicket markup from content and return this as the Component's markup

parse the dynamically created markup for each markup element add the appropriate 

FormComponent  (CheckBox, TextField, DropDownChoice, ...)

Page 28: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Step 1 AutoComponentPanel

asks for its associated markup loops over tags, if ComponentTag: call internal, 

overrideable method 

getMarkupComponent(ComponentTag tag, MarkupStream stream)

Page 29: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Step 1 AutoComponentPanel

Default implementation: check for the usual suspects, e.g.

if ("input".equals(tag.getName()) &&    "submit".equals(tag.getAttr..("type", ..))) {  return new Button(tag.getId(), ..);}

Page 30: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Step 1 AutoComponentPanel

The wicket:id of the added components are treated as property expressions that are bound to this component's model.

<input type="text" wicket:id="name"/> binds the generated TextField to the model object's name property.

Page 31: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Step 2 AssessmentItemPanel

model: AssessmentItem (generic POJO) supplies its own markup by transforming the 

contents of its itemBody QTI ­> XSLT ­> XHTML with wicket tags

extends AutoComponentPanel ­> generated wicket tags will automatically be bound to FormComponents

Page 32: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Step 2 AssessmentItemPanel

getMarkupResourceStream snippet:Source source = new StreamSource(        new StringReader(assessmentItem.getXml()        ));StringWriter result = new StringWriter();...transformer.transform(source,         new StreamResult(result));

return new StringResourceStream(        result.toString());

Page 33: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

QTI revisited

<assessmentItem identifier="choice" title="Web Framework">  <responseDeclaration identifier="R">    <correctResponse>      <value>C</value>    </correctResponse>  </responseDeclaration>  <itemBody>    <p>What is your preferred Java web development framework?</p>    <choiceInteraction responseIdentifier="R" maxChoices="1">      <simpleChoice identifier="A">Struts</simpleChoice>      <simpleChoice identifier="B">Tapestry</simpleChoice>      <simpleChoice identifier="C">Wicket</simpleChoice>    </choiceInteraction>  </itemBody></assessmentItem>

Page 34: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Generated markup

<wicket:panel>  <div class="qtiItem">    <p>What is your preferred Java web development framework?</p>      <div class="blockInteraction choiceInteraction">        <span class="prompt"/>        <div wicket:id="iSession.responseVars.R.cResponse">          <label><input value="A" type="radio"/>Struts</label>          <label><input value="B" type="radio"/>Tapestry</label>          <label><input value="C" type="radio"/>Wicket</label>        </div>      </div>    <div class="clr"/>  </div></wicket:panel>

Page 35: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Binding

The wicket:id="iSession.responseVars.R.cResponse” markup element is bound to a nested property of the AssessmentItem 

(which has an ItemSession, which has a Map<String, ResponseVariable>, and a ResponseVariable has a cResponse)

Page 36: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Result

All QTI content can be rendered, previously entered responses are displayed

when the user POSTs his response, the response is bound automatically to the AssessmentItem domain object

the Form's onSubmit() doesn't need to do any processing, but just persists the AssessmentItem's response part.

Page 37: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

To Do

add support for complex QTI interactionTypes refactor:

extract code from current project make truly generic document properly

create small demo app release

Page 38: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Want to know more?

Check our sponsor desk for live examples Wouter Huijnink

[email protected]

Page 39: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Shameless plug: Webical

Page 40: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Shameless plug: Webical

Open Source web based iCalendar client Wicket,  Fully accessible Ajax add­ons plugin architecture http://www.webical.org/

Page 41: Wicket Dynamic Components

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

file:///../intern/Standaarden/Logo/groene%20onderbalk.png

November 30th, 2007

Q & A ([email protected])

Why didn't you ... ? Wouldn't it have been much nicer if you ... ? I can't believe you actually ... ! I want to work with you guys! Can I sign up right 

here, right now?