You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 29 Next »

// TODO: tmjee: restructuring this page such that each relevant tag has an example section of its own

Controls tags provide the ability to manipulate collections and conditionally produce content.

  1. if
  2. elseIf / elseif
  3. else
  4. append
  5. generator
  6. iterator
  7. merge
  8. sort
  9. subset

@see META-INF/webworl.tld

Examples

If, ElseIf, Else Tag

Preform basic condition flow. 'If' tag could be used by itself or with 'Else If' Tag and/or single/multiple 'Else' Tag.

Attribute

Type

Required

Description

test

Boolean

Yes

Logic to determined if body of tag is to be displayed

<ww:if test="%{false}">
	<div>Will Not Be Executed</div>
</ww:if>
<ww:elseif test="%{true}">
	<div>Will Be Executed</div>
</ww:elseif>
<ww:else>
	<div>Will Not Be Executed</div>
</ww:else>

Attribute value is treated as Ognl expression and evaluated on the webworks stack (OgnlValueStack) and the result is expected to be a boolean. In this case 'true' has special meaning in Ognl expression which gets evaluated as a boolean true.

Append Tag

// TODO: this tag will be implemented soon

Generator Tag

// TODO: this tag will be implemented soon

Merge Tag

// TODO: this tag will be implemented soon

Sort Tag

Sort a List according to the comparator supplied.

Attribute

Type

Required

Description

source

Object (List)

No

Source of List to be sorted. If none is supplied, will use the 'top' of the stack

comparator

Object (Comparator)

Yes

The comparator to sort the source

id

String

No

If supplied will be used as the pageContext key where the resultant sorted List to be stored in

NOTE: Sort Tag will ALWAYS puch the result into the stack and pop it off at the end of the tag.

sortTag.jsp
 <!-- METHOD A: Use Sort Tag without id -->
 <ww:sort comparator="%{comparator}" source="%{source}">
	<ww:iterator>
		<ww:property /><br/>
	</ww:iterator>
 </ww:sort>

 <!-- METHOD B: Use Sort Tag with id -->
 <ww:sort id="mySortResult" comparator="%{comparator}" source="%{source}" /> 

 <%
   	List l = (List) pageContext.getAttribute("mySortResult");
	for (Iterator i = l.iterator(); i.hasNext(); ) {
		out.println(i.next());
	}
 %>
SortAction.java
public class SortAction extends ActionSupport {

	private static final long serialVersionUID = -556501494127336128L;

	@Override
	public String execute() throws Exception {
		return "done";
	}
	
	public Comparator getComparator() {
		return new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {
				return o1 - o2; // use Tiger's auto-boxing
			}
		};
	}
	
	public List getSource() {
		List<Integer> l = new ArrayList<Integer>();
		l.add(new Integer(5));
		l.add(new Integer(2));
		l.add(new Integer(3));
		l.add(new Integer(1));
		l.add(new Integer(6));
		l.add(new Integer(4));
		l.add(new Integer(7));
		return l;
	}
}
xwork.xml
   ...
   <action name="sortAction" class="tmjee.testing.SortAction">
          <result name="done">sortTag.jsp</result>
   </action>
   ...

The above makes uses of sort tag to sort a List defined in SortAction.java. METHOD A makes use of the sorted list that is pushed into the stack and uses the nested Iterator Tag to iterate over the sorted list and print its elements. In METHOD B the supplied id attribute allows the Sort Tag to store the sorted list into the page context and then retrieve the sorted list and display its content using scriptlet.

Subset Tag

Iterator Tag

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.

 
 <ww:iterator value="days">
   <p>day is: <ww:property/></p>
 </ww:iterator>

The above example retrieves the value of the getDays() method of the current object on the value stack and uses it to iterate over. The <ww:property/> tag prints out the current value of the iterator.

The following example uses a BeanTag 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 IteratorStatus object, which in this example, its odd() method is used to alternate row colours:

 
 <ww:bean name="com.opensymphony.webwork.example.IteratorExample" id="it">
   <ww:param name="day" value="'foo'"/>
   <ww:param name="day" value="'bar'"/>
 </ww:bean>

 <table border="0" cellspacing="0" cellpadding="1">
 <tr>
   <th>Days of the week</th>
 </tr>

 <ww:iterator value="#it.days" status="rowstatus">
   <tr>
     <ww:if test="#rowstatus.odd == true">
       <td style="background: grey"><ww:property/></td>
     </ww:if>
     <ww:else>
       <td><ww:property/></td>
     </ww:else>
   </tr>
 </ww:iterator>
 </table>

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:

<webwork:iterator value="groupDao.groups" status="groupStatus">
    <tr class="<webwork:if test="#groupStatus.odd == true ">odd</webwork:if><webwork:else>even</webwork:else>">
        <td><webwork:property value="name" /></td>
        <td><webwork:property value="description" /></td>
        <td>
            <webwork:iterator value="users" status="userStatus">
                <webwork:property value="fullName" /><webwork:if test="!#userStatus.last">,</webwork:if>                
            </webwork:iterator>
        </td>
    </tr>
</webwork:iterator>

The next example iterates over a an action collection and passes every iterator value to another action.

<ww:action name="entries" id="entries"/>
<ww:iterator value="#entries.entries" >
   <ww:property value="name" />
   <ww:property />
   <ww:push value="..."/>

   <ww:action name="edit" id="edit" >
     <ww:param name="entry" value="[0]" />
   </ww:action>
</ww:iterator>

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 <ww:property />. (The latter, however, does not work from inside the param tag).
See also [OS:WebWork2 EL].

  • No labels