Commits

plightbo  committed d06663d
  • Participants
  • Parent commits 65b58e5

Comments (0)

Files changed (8)

File docs/tags/ActionMessage.html

 </p>
 
 <p>
-<!-- START SNIPPET: javadoc --> Render action messages if they exists, specific rendering layout depends on the theme itself. <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example --> &lt;ww:actionmessage /&gt; &lt;ww:form .... &gt;> .... &lt;/ww:form&gt; <!-- END SNIPPET: example --> </pre>
+<!-- START SNIPPET: javadoc --> Render action messages if they exists, specific rendering layout depends on the theme itself. <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example --> &lt;ww:actionmessage /&gt; &lt;ww:form .... &gt; .... &lt;/ww:form&gt; <!-- END SNIPPET: example --> </pre>
 </p>
 
 <h2>Attributes</h2>

File docs/tags/Anchor.html

 </p>
 
 <p>
-<!-- START SNIPPET: javadoc --> A tag that creates a HTML &lt;a href='' /&gt; that when clicked calls a URL remote XMLHttpRequest call via the dojo framework. The result from the URL is executed as JavaScript.<p/> If a "listenTopics" is supplied, it will publish a 'click' message to that topic when the result is returned. If utilizing the topic/event elements, then this tag needs to be contained within a &gt;ww:topicScope /&lt; tag.<p/> <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example1 --> &lt;ww:a id="link1" theme="ajax" href="/DoIt.action" errorText="An error ocurred" showErrorTransportText="true"&gt; &lt;img border="none" src="&lt;%=request.getContextPath()%&gt;/images/delete.gif"/&gt; &lt;ww:param name="id" value="1"/&gt; &lt;/ww:a&gt; <!-- END SNIPPET: example1 --> </pre> </p> <!-- START SNIPPET: exampledescription1 --> Results in <!-- END SNIPPET: exampledescription1 --> </p> <pre> <!-- START SNIPPET: example2 --> &lt;a dojoType="BindAnchor" evalResult="true" id="link1" href="/DoIt.action?id=1" errorHtml="An error ocurred" showTransportError="true"&gt;&lt;/a&gt; <!-- END SNIPPET: example2 --> </pre> </p> <!-- START SNIPPET: exampledescription2 --> Here is an example that uses the postInvokeJS. This example is in altSyntax=true: <!-- END SNIPPET: exampledescription2 --> </p> <pre> <!-- START SNIPPET: example3 --> &lt;ww:a id="test" theme="ajax" href="/simpeResult.action" preInvokeJS="confirm(\'You sure\')"&gt; A &lt;/ww:a&gt; <!-- END SNIPPET: example3 --> </pre>
+<!-- START SNIPPET: javadoc --> A tag that creates a HTML &lt;a href='' /&gt; that when clicked calls a URL remote XMLHttpRequest call via the dojo framework. The result from the URL is executed as JavaScript. If a "listenTopics" is supplied, it will publish a 'click' message to that topic when the result is returned. <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example1 --> &lt;ww:a id="link1" theme="ajax" href="/DoIt.action" errorText="An error ocurred" showErrorTransportText="true"&gt; &lt;img border="none" src="&lt;%=request.getContextPath()%&gt;/images/delete.gif"/&gt; &lt;ww:param name="id" value="1"/&gt; &lt;/ww:a&gt; <!-- END SNIPPET: example1 --> </pre> </p> <!-- START SNIPPET: exampledescription1 --> Results in <!-- END SNIPPET: exampledescription1 --> </p> <pre> <!-- START SNIPPET: example2 --> &lt;a dojoType="BindAnchor" evalResult="true" id="link1" href="/DoIt.action?id=1" errorHtml="An error ocurred" showTransportError="true"&gt;&lt;/a&gt; <!-- END SNIPPET: example2 --> </pre> </p> <!-- START SNIPPET: exampledescription2 --> Here is an example that uses the postInvokeJS. This example is in altSyntax=true: <!-- END SNIPPET: exampledescription2 --> </p> <pre> <!-- START SNIPPET: example3 --> &lt;ww:a id="test" theme="ajax" href="/simpeResult.action" preInvokeJS="confirm(\'You sure\')"&gt; A &lt;/ww:a&gt; <!-- END SNIPPET: example3 --> </pre>
 </p>
 
 <h2>Attributes</h2>

File docs/tags/Head.html

 </p>
 
 <p>
-<!-- START SNIPPET: javadoc --> Renders parts of the HEAD section for an HTML file. This is useful as some themes require certain CSS and JavaScript includes.<p/> If, for example, your page has ajax components integrated, without having the default theme set to ajax, you might want to use the head tag with <pre>theme="ajax"</pre> so that the typical ajax header setup will be included in the page.<p/> The tag also includes the option to set a custom datepicker theme if needed. See calendarcss parameter for description for details.<p/> <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example1 --> &lt;head&gt; &lt;title&gt;My page&lt;/title&gt; &lt;ww:head/&gt; &lt;/head&gt; <!-- END SNIPPET: example1 --> </pre> <pre> <!-- START SNIPPET: example2 --> &lt;head&gt; &lt;title&gt;My page&lt;/title&gt; &lt;ww:head theme="ajax" calendarcss="calendar-green"/&gt; &lt;/head&gt; <!-- END SNIPPET: example2 --> </pre>
+<!-- START SNIPPET: javadoc --> Renders parts of the HEAD section for an HTML file. This is useful as some themes require certain CSS and JavaScript includes.<p/> If, for example, your page has ajax components integrated, without having the default theme set to ajax, you might want to use the head tag with <b>theme="ajax"</b> so that the typical ajax header setup will be included in the page.<p/> The tag also includes the option to set a custom datepicker theme if needed. See calendarcss parameter for description for details.<p/> <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example1 --> &lt;head&gt; &lt;title&gt;My page&lt;/title&gt; &lt;ww:head/&gt; &lt;/head&gt; <!-- END SNIPPET: example1 --> </pre> <pre> <!-- START SNIPPET: example2 --> &lt;head&gt; &lt;title&gt;My page&lt;/title&gt; &lt;ww:head theme="ajax" calendarcss="calendar-green"/&gt; &lt;/head&gt; <!-- END SNIPPET: example2 --> </pre>
 </p>
 
 <h2>Attributes</h2>

File docs/tags/IteratorComponent.html

 </p>
 
 <p>
-<!-- START SNIPPET: javadoc --> <p>Iterator will iterate over a value. An iterable value can be either of: java.util.Collection, java.util.Iterator, java.util.Enumeration, java.util.Map, array.</p> <p/> <!-- END SNIPPET: javadoc --> <!-- START SNIPPET: params --> <ul> <li>status (String) - if specified, an instanceof IteratorStatus will be pushed into stack upon each iteration</li> <li>value (Object) - the source to iterate over, must be iteratable, else an the object itself will be put into a newly created List (see MakeIterator#convert(Object)</li> <li>id (String) - if specified the current iteration object will be place with this id in both request and page scope</li> </ul> <!-- END SNIPPET: params --> <!-- START SNIPPET: example1description --> <p>The following example retrieves the value of the getDays() method of the current object on the value stack and uses it to iterate over. The &lt;ww:property/&gt; tag prints out the current value of the iterator.</p> <!-- END SNIPPET: example1description --> <pre> <!-- START SNIPPET: example1code --> &lt;ww:iterator value="days"&gt; &lt;p&gt;day is: &lt;ww:property/&gt;&lt;/p&gt; &lt;/ww:iterator&gt; <!-- END SNIPPET: example1code --> </pre> <!-- START SNIPPET: example2description --> <p>The following example uses a {@link Bean} tag and places it into the ActionContext. The iterator tag will retrieve that object from the ActionContext and then calls its getDays() method as above. The status attribute is also used to create a {@link IteratorStatus} object, which in this example, its odd() method is used to alternate row colours:</p> <!-- END SNIPPET: example2description --> <pre> <!-- START SNIPPET: example2code --> &lt;ww:bean name="'com.opensymphony.webwork.example.IteratorExample'" id="it"&gt; &lt;ww:param name="'day'" value="'foo'"/&gt; &lt;ww:param name="'day'" value="'bar'"/&gt; &lt;/ww:bean&gt; <p/> &lt;table border="0" cellspacing="0" cellpadding="1"&gt; &lt;tr&gt; &lt;th&gt;Days of the week&lt;/th&gt; &lt;/tr&gt; <p/> &lt;ww:iterator value="#it.days" status="rowstatus"&gt; &lt;tr&gt; &lt;ww:if test="#rowstatus.odd == true"&gt; &lt;td style="background: grey"&gt;&lt;ww:property/&gt;&lt;/td&gt; &lt;/ww:if&gt; &lt;ww:else&gt; &lt;td&gt;&lt;ww:property/&gt;&lt;/td&gt; &lt;/ww:else&gt; &lt;/tr&gt; &lt;/ww:iterator&gt; &lt;/table&gt; <!-- END SNIPPET: example2code --> </pre> <!--START SNIPPET: example3description --> <p> The next example will further demonstrate the use of the status attribute, using a DAO obtained from the action class through OGNL, iterating over groups and their users (in a security context). The last() method indicates if the current object is the last available in the iteration, and if not, we need to seperate the users using a comma: </p> <!-- END SNIPPET: example3description --> <pre> <!-- START SNIPPET: example3code --> &lt;webwork:iterator value="groupDao.groups" status="groupStatus"&gt; &lt;tr class="&lt;webwork:if test="#groupStatus.odd == true "&gt;odd&lt;/webwork:if&gt;&lt;webwork:else&gt;even&lt;/webwork:else&gt;"&gt; &lt;td&gt;&lt;webwork:property value="name" /&gt;&lt;/td&gt; &lt;td&gt;&lt;webwork:property value="description" /&gt;&lt;/td&gt; &lt;td&gt; &lt;webwork:iterator value="users" status="userStatus"&gt; &lt;webwork:property value="fullName" /&gt;&lt;webwork:if test="!#userStatus.last"&gt;,&lt;/webwork:if&gt; &lt;/webwork:iterator&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/webwork:iterator&gt; <!-- END SNIPPET: example3code --> </pre> <p> <!-- START SNIPPET: example4description --> </p> The next example iterates over a an action collection and passes every iterator value to another action. The trick here lies in the use of the '[0]' operator. It takes the current iterator value and passes it on to the edit action. Using the '[0]' operator has the same effect as using &gt;ww:property /&gt;. (The latter, however, does not work from inside the param tag). </p> <!-- END SNIPPET: example4description --> <pre> <!-- START SNIPPET: example4code --> &lt;ww:action name="entries" id="entries"/&gt; &lt;ww:iterator value="#entries.entries" &gt; &lt;ww:property value="name" /&gt; &lt;ww:property /&gt; &lt;ww:push value="..."&gt; &lt;ww:action name="edit" id="edit" &gt; &lt;ww:param name="entry" value="[0]" /&gt; &lt;/ww:action&gt; &lt;/push&gt; &lt;/ww:iterator&gt; <!-- END SNIPPET: example4code --> </pre>
+<!-- START SNIPPET: javadoc --> <p>Iterator will iterate over a value. An iterable value can be either of: java.util.Collection, java.util.Iterator, java.util.Enumeration, java.util.Map, array.</p> <p/> <!-- END SNIPPET: javadoc --> <!-- START SNIPPET: params --> <ul> <li>status (String) - if specified, an instanceof IteratorStatus will be pushed into stack upon each iteration</li> <li>value (Object) - the source to iterate over, must be iteratable, else an the object itself will be put into a newly created List (see MakeIterator#convert(Object)</li> <li>id (String) - if specified the current iteration object will be place with this id in both request and page scope</li> </ul> <!-- END SNIPPET: params --> <!-- START SNIPPET: example1description --> <p>The following example retrieves the value of the getDays() method of the current object on the value stack and uses it to iterate over. The &lt;ww:property/&gt; tag prints out the current value of the iterator.</p> <!-- END SNIPPET: example1description --> <pre> <!-- START SNIPPET: example1code --> &lt;ww:iterator value="days"&gt; &lt;p&gt;day is: &lt;ww:property/&gt;&lt;/p&gt; &lt;/ww:iterator&gt; <!-- END SNIPPET: example1code --> </pre> <!-- START SNIPPET: example2description --> <p>The following example uses a {@link Bean} tag and places it into the ActionContext. The iterator tag will retrieve that object from the ActionContext and then calls its getDays() method as above. The status attribute is also used to create a {@link IteratorStatus} object, which in this example, its odd() method is used to alternate row colours:</p> <!-- END SNIPPET: example2description --> <pre> <!-- START SNIPPET: example2code --> &lt;ww:bean name="com.opensymphony.webwork.example.IteratorExample" id="it"&gt; &lt;ww:param name="day" value="'foo'"/&gt; &lt;ww:param name="day" value="'bar'"/&gt; &lt;/ww:bean&gt; <p/> &lt;table border="0" cellspacing="0" cellpadding="1"&gt; &lt;tr&gt; &lt;th&gt;Days of the week&lt;/th&gt; &lt;/tr&gt; <p/> &lt;ww:iterator value="#it.days" status="rowstatus"&gt; &lt;tr&gt; &lt;ww:if test="#rowstatus.odd == true"&gt; &lt;td style="background: grey"&gt;&lt;ww:property/&gt;&lt;/td&gt; &lt;/ww:if&gt; &lt;ww:else&gt; &lt;td&gt;&lt;ww:property/&gt;&lt;/td&gt; &lt;/ww:else&gt; &lt;/tr&gt; &lt;/ww:iterator&gt; &lt;/table&gt; <!-- END SNIPPET: example2code --> </pre> <!--START SNIPPET: example3description --> <p> The next example will further demonstrate the use of the status attribute, using a DAO obtained from the action class through OGNL, iterating over groups and their users (in a security context). The last() method indicates if the current object is the last available in the iteration, and if not, we need to seperate the users using a comma: </p> <!-- END SNIPPET: example3description --> <pre> <!-- START SNIPPET: example3code --> &lt;webwork:iterator value="groupDao.groups" status="groupStatus"&gt; &lt;tr class="&lt;webwork:if test="#groupStatus.odd == true "&gt;odd&lt;/webwork:if&gt;&lt;webwork:else&gt;even&lt;/webwork:else&gt;"&gt; &lt;td&gt;&lt;webwork:property value="name" /&gt;&lt;/td&gt; &lt;td&gt;&lt;webwork:property value="description" /&gt;&lt;/td&gt; &lt;td&gt; &lt;webwork:iterator value="users" status="userStatus"&gt; &lt;webwork:property value="fullName" /&gt;&lt;webwork:if test="!#userStatus.last"&gt;,&lt;/webwork:if&gt; &lt;/webwork:iterator&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/webwork:iterator&gt; <!-- END SNIPPET: example3code --> </pre> <p> <!-- START SNIPPET: example4description --> </p> The next example iterates over a an action collection and passes every iterator value to another action. The trick here lies in the use of the '[0]' operator. It takes the current iterator value and passes it on to the edit action. Using the '[0]' operator has the same effect as using &gt;ww:property /&gt;. (The latter, however, does not work from inside the param tag). </p> <!-- END SNIPPET: example4description --> <pre> <!-- START SNIPPET: example4code --> &lt;ww:action name="entries" id="entries"/&gt; &lt;ww:iterator value="#entries.entries" &gt; &lt;ww:property value="name" /&gt; &lt;ww:property /&gt; &lt;ww:push value="..."&gt; &lt;ww:action name="edit" id="edit" &gt; &lt;ww:param name="entry" value="[0]" /&gt; &lt;/ww:action&gt; &lt;/push&gt; &lt;/ww:iterator&gt; <!-- END SNIPPET: example4code --> </pre>
 </p>
 
 <h2>Attributes</h2>

File docs/tags/OptionTransferSelect.html

 </p>
 
 <p>
-
+<!-- START SNIPPET: javadoc --> Create a option transfer select component which is basically two &lt;select ...&gt; tag with buttons in the middle of them allowing options in each of the &lt;select ...&gt; to be moved between themselves. <!-- END SNIPPET: javadoc --> <p/> <pre> <!-- START SNIPPET: example --> &lt;-- minimum configuration --&gt; &lt;ww:optiontransferselect label="Favourite Cartoons Characters" name="leftSideCartoonCharacters" list="{'Popeye', 'He-Man', 'Spiderman'}" doubleName="rightSideCartoonCharacters" doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}" /&gt; &lt;-- possible configuration --&gt; &lt;ww:optiontransferselect label="Favourite Cartoons Characters" name="leftSideCartoonCharacters" leftTitle="Left Title" rightTitle="Right Title" list="{'Popeye', 'He-Man', 'Spiderman'}" multiple="true" headerKey="headerKey" headerValue="--- Please Select ---" emptyOption="true" doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}" doubleName="rightSideCartoonCharacters" doubleHeaderKey="doubleHeaderKey" doubleHeaderValue="--- Please Select ---" doubleEmptyOption="true" doubleMultiple="true" /&gt; <!-- END SNIPPET: example --> </pre>
 </p>
 
 <h2>Attributes</h2>

File docs/tags/Submit.html

 </p>
 
 <p>
-<!-- START SNIPPET: javadoc --> Render a submit button. The submit tag is used together with the form tag to provide asynchronous form submissions. <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example --> &lt;ww:submit value="%{'Submit'}" /&gt; <!-- END SNIPPET: example --> </pre> <!-- START SNIPPET: ajaxJavadoc --> <B>THE FOLLOWING IS ONLY VALID WHEN AJAX IS CONFIGURED</B> <ul> <li>resultDivId</li> <li>notifyTopics</li> <li>onLoadJS</li> <li>preInvokeJS</li> </ul> The remote form has three basic modes of use, using the resultDivId, the notifyTopics, or the onLoadJS. You can mix and match any combination of them to get your desired result. All of these examples are contained in the Ajax example webapp. Lets go through some scenarios to see how you might use it: <!-- END SNIPPET: ajaxJavadoc --> <!-- START SNIPPET: ajxExDescription1 --> Show the results in another div. If you want your results to be shown in a div, use the resultDivId where the id is the id of the div you want them shown in. This is an inner HTML approah. Your results get jammed into the div for you. Here is a sample of this approach: <!-- END SNIPPET: ajxExDescription1 --> <pre> <!-- START SNIPPET: ajxExample1 --> Remote form replacing another div: &lt;div id='two' style="border: 1px solid yellow;"&gt;Initial content&lt;/div&gt; &lt;ww:form id='theForm2' cssStyle="border: 1px solid green;" action='/AjaxRemoteForm.action' method='post' theme="ajax"&gt; &lt;input type='text' name='data' value='WebWork User' /&gt; &lt;ww:submit value="GO2" theme="ajax" resultDivId="two" /&gt; &lt;/ww:form &gt; <!-- END SNIPPET: ajxExample1 --> </pre> <!-- START SNIPPET: ajxExDescription2 --> Notify other controls(divs) of a change. Using an pub-sub model you can notify others that your control changed and they can take the appropriate action. Most likely they will execute some action to refresh. The notifyTopics does this for you. You can have many topic names in a comma delimited list. eg: notifyTopics="newPerson, dataChanged" . Here is an example of this approach: <!-- END SNIPPET: ajxExDescription2 --> <pre> <!-- START SNIPPET: ajxExample2 --> &lt;ww:form id="frm1" action="newPersonWithXMLResult" theme="ajax" &gt; &lt;ww:textfield label="Name" name="person.name" value="person.name" size="20" required="true" /&gt; &lt;ww:submit id="submitBtn" value="Save" theme="ajax" cssClass="primary" notifyTopics="personUpdated, systemWorking" /&gt; &lt;/ww:form &gt; &lt;ww:div href="/listPeople.action" theme="ajax" errorText="error opps" loadingText="loading..." id="cart-body" &gt; &lt;ww:action namespace="" name="listPeople" executeResult="true" /&gt; &lt;/ww:div&gt; <!-- END SNIPPET: ajxExample2 --> </pre> <!-- START SNIPPET: ajxExDescription3 --> Massage the results with JavaScript. Say that your result returns some h appy XML and you want to parse it and do lots of cool things with it. The way to do this is with a onLoadJS handler. Here you provide the name of a JavaScript function to be called back with the result and the event type. The only key is that you must use the variable names 'data' and 'type' when defining the callback. For example: onLoadJS="myFancyDancyFunction(data, type)". While I talked about XML in this example, your not limited to XML, the data in the callback will be exactly whats returned as your result. Here is an example of this approach: <!-- END SNIPPET: ajxExDescription3 --> <pre> <!-- START SNIPPET: ajxExample3 --> &lt;script language="JavaScript" type="text/javascript"&gt; function doGreatThings(data, type) { //Do whatever with your returned fragment... //Perhapps.... if xml... var xml = dojo.xml.domUtil.createDocumentFromText(data); var people = xml.getElementsByTagName("person"); for(var i = 0;i < people.length; i ++){ var person = people[i]; var name = person.getAttribute("name") var id = person.getAttribute("id") alert('Thanks dude. Person: ' + name + ' saved great!!!'); } } &lt;/script&gt; &lt;ww:form id="frm1" action="newPersonWithXMLResult" theme="ajax" &gt; &lt;ww:textfield label="'Name'" name="'person.name'" value="person.name" size="20" required="true" /&gt; &lt;ww:submit id="submitBtn" value="Save" theme="ajax" cssClass="primary" onLoadJS="doGreatThings(data, type)" /&gt; &lt;/ww:form&gt; <!-- END SNIPPET: ajxExample3 --> </pre>
+<!-- START SNIPPET: javadoc --> Render a submit button. The submit tag is used together with the form tag to provide asynchronous form submissions. <!-- END SNIPPET: javadoc --> <p/> <b>Examples</b> <pre> <!-- START SNIPPET: example --> &lt;ww:submit value="%{'Submit'}" /&gt; <!-- END SNIPPET: example --> </pre> <!-- START SNIPPET: ajaxJavadoc --> <B>THE FOLLOWING IS ONLY VALID WHEN AJAX IS CONFIGURED</B> <ul> <li>resultDivId</li> <li>notifyTopics</li> <li>onLoadJS</li> <li>preInvokeJS</li> </ul> The remote form has three basic modes of use, using the resultDivId, the notifyTopics, or the onLoadJS. You can mix and match any combination of them to get your desired result. All of these examples are contained in the Ajax example webapp. Lets go through some scenarios to see how you might use it: <!-- END SNIPPET: ajaxJavadoc --> <!-- START SNIPPET: ajxExDescription1 --> Show the results in another div. If you want your results to be shown in a div, use the resultDivId where the id is the id of the div you want them shown in. This is an inner HTML approah. Your results get jammed into the div for you. Here is a sample of this approach: <!-- END SNIPPET: ajxExDescription1 --> <pre> <!-- START SNIPPET: ajxExample1 --> Remote form replacing another div: &lt;div id='two' style="border: 1px solid yellow;"&gt;Initial content&lt;/div&gt; &lt;ww:form id='theForm2' cssStyle="border: 1px solid green;" action='/AjaxRemoteForm.action' method='post' theme="ajax"&gt; &lt;input type='text' name='data' value='WebWork User' /&gt; &lt;ww:submit value="GO2" theme="ajax" resultDivId="two" /&gt; &lt;/ww:form &gt; <!-- END SNIPPET: ajxExample1 --> </pre> <!-- START SNIPPET: ajxExDescription2 --> Notify other controls(divs) of a change. Using an pub-sub model you can notify others that your control changed and they can take the appropriate action. Most likely they will execute some action to refresh. The notifyTopics does this for you. You can have many topic names in a comma delimited list. eg: notifyTopics="newPerson, dataChanged" . Here is an example of this approach: <!-- END SNIPPET: ajxExDescription2 --> <pre> <!-- START SNIPPET: ajxExample2 --> &lt;ww:form id="frm1" action="newPersonWithXMLResult" theme="ajax" &gt; &lt;ww:textfield label="Name" name="person.name" value="person.name" size="20" required="true" /&gt; &lt;ww:submit id="submitBtn" value="Save" theme="ajax" cssClass="primary" notifyTopics="personUpdated, systemWorking" /&gt; &lt;/ww:form &gt; &lt;ww:div href="/listPeople.action" theme="ajax" errorText="error opps" loadingText="loading..." id="cart-body" &gt; &lt;ww:action namespace="" name="listPeople" executeResult="true" /&gt; &lt;/ww:div&gt; <!-- END SNIPPET: ajxExample2 --> </pre> <!-- START SNIPPET: ajxExDescription3 --> Massage the results with JavaScript. Say that your result returns some h appy XML and you want to parse it and do lots of cool things with it. The way to do this is with a onLoadJS handler. Here you provide the name of a JavaScript function to be called back with the result and the event type. The only key is that you must use the variable names 'data' and 'type' when defining the callback. For example: onLoadJS="myFancyDancyFunction(data, type)". While I talked about XML in this example, your not limited to XML, the data in the callback will be exactly whats returned as your result. Here is an example of this approach: <!-- END SNIPPET: ajxExDescription3 --> <pre> <!-- START SNIPPET: ajxExample3 --> &lt;script language="JavaScript" type="text/javascript"&gt; function doGreatThings(data, type) { //Do whatever with your returned fragment... //Perhapps.... if xml... var xml = dojo.xml.domUtil.createDocumentFromText(data); var people = xml.getElementsByTagName("person"); for(var i = 0;i < people.length; i ++){ var person = people[i]; var name = person.getAttribute("name") var id = person.getAttribute("id") alert('Thanks dude. Person: ' + name + ' saved great!!!'); } } &lt;/script&gt; &lt;ww:form id="frm1" action="newPersonWithXMLResult" theme="ajax" &gt; &lt;ww:textfield label="Name" name="person.name" value="person.name" size="20" required="true" /&gt; &lt;ww:submit id="submitBtn" value="Save" theme="ajax" cssClass="primary" onLoadJS="doGreatThings(data, type)" /&gt; &lt;/ww:form&gt; <!-- END SNIPPET: ajxExample3 --> </pre>
 </p>
 
 <h2>Attributes</h2>

File docs/tags/index.html

 <html>
 <head>
-<title>WebWork 2.2-beta-5 Taglib Index</title>
+<title>WebWork 2.2 Taglib Index</title>
 </head>
 
 <body>
 
-<h1>WebWork 2.2-beta-5 Taglib Index</h1>
+<h1>WebWork 2.2 Taglib Index</h1>
 <p>
 <table width="100%">
 

File src/java/META-INF/taglib.tld

 <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
 <taglib>
 
-   <tlib-version>2.2-beta-5</tlib-version>
+   <tlib-version>2.2</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>WebWork Taglib</short-name>
 
    </tag>
    <tag>
 
+      <name>sort</name>
+      <tag-class>com.opensymphony.webwork.views.jsp.iterator.SortIteratorTag</tag-class>
+      <body-content>JSP</body-content>
+      <description><![CDATA[Sort a List using a Comparator both passed in as the tag attribute.]]></description>
+
+      <attribute>
+         <name>comparator</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The comparator to use]]></description>
+
+      </attribute>
+      <attribute>
+         <name>source</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The iterable source to sort]]></description>
+
+      </attribute>
+      <attribute>
+         <name>id</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The id of the tag element.]]></description>
+
+      </attribute>
+
+   </tag>
+   <tag>
+
       <name>hidden</name>
       <tag-class>com.opensymphony.webwork.views.jsp.ui.HiddenTag</tag-class>
       <body-content>JSP</body-content>
    </tag>
    <tag>
 
+      <name>generator</name>
+      <tag-class>com.opensymphony.webwork.views.jsp.iterator.IteratorGeneratorTag</tag-class>
+      <body-content>JSP</body-content>
+      <description><![CDATA[Generate an iterator for a iterable source.]]></description>
+
+      <attribute>
+         <name>count</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[the max number entries to be in the iterator]]></description>
+
+      </attribute>
+      <attribute>
+         <name>separator</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[the separator to be used in separating the <i>val</i> into entries of the iterator]]></description>
+
+      </attribute>
+      <attribute>
+         <name>val</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[the source to be parsed into an iterator]]></description>
+
+      </attribute>
+      <attribute>
+         <name>converter</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[the converter to convert the String entry parsed from <i>val</i> into an object]]></description>
+
+      </attribute>
+      <attribute>
+         <name>id</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[the id to store the resultant iterator into page context, if such id is supplied]]></description>
+
+      </attribute>
+
+   </tag>
+   <tag>
+
       <name>checkbox</name>
       <tag-class>com.opensymphony.webwork.views.jsp.ui.CheckboxTag</tag-class>
       <body-content>JSP</body-content>
    </tag>
    <tag>
 
+      <name>tabbedpane</name>
+      <tag-class>com.opensymphony.webwork.views.jsp.ui.TabbedPaneTag</tag-class>
+      <body-content>JSP</body-content>
+      <description><![CDATA[This tag is deprecated. Use tabbed panel instead.]]></description>
+
+      <attribute>
+         <name>contentName</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[]]></description>
+
+      </attribute>
+      <attribute>
+         <name>id</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The id of the tag element.]]></description>
+
+      </attribute>
+
+   </tag>
+   <tag>
+
       <name>tabbedPanel</name>
       <tag-class>com.opensymphony.webwork.views.jsp.ui.TabbedPanelTag</tag-class>
       <body-content>JSP</body-content>
    </tag>
    <tag>
 
+      <name>subset</name>
+      <tag-class>com.opensymphony.webwork.views.jsp.iterator.SubsetIteratorTag</tag-class>
+      <body-content>JSP</body-content>
+      <description><![CDATA[Takes an iterator and outputs a subset of it]]></description>
+
+      <attribute>
+         <name>count</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Indicate the number of entries to be in the resulting subset iterator]]></description>
+
+      </attribute>
+      <attribute>
+         <name>source</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Indicate the source of which the resulting subset iterator is to be derived base on]]></description>
+
+      </attribute>
+      <attribute>
+         <name>start</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Indicate the starting index (eg. first entry is 0) of entries in the source to be available as the first entry in the resulting subset iterator]]></description>
+
+      </attribute>
+      <attribute>
+         <name>decider</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Extension to plug-in a decider to determine if that particular entry is to be included in the resulting subset iterator]]></description>
+
+      </attribute>
+      <attribute>
+         <name>id</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The id of the tag element.]]></description>
+
+      </attribute>
+
+   </tag>
+   <tag>
+
       <name>elseif</name>
       <tag-class>com.opensymphony.webwork.views.jsp.ElseIfTag</tag-class>
       <body-content>JSP</body-content>