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

Compare with Current View Page History

« Previous Version 30 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

// TODO: tmjee It's in the migration to snippets process. Added in snippets, when submited patches, the tables, code snapshot etc will be removed as it will be pulled from the source.

If, ElseIf, Else Tag

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//
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

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//

Generator Tag

// TODO: this tag will be implemented soon

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//
Generate an iterator based on the val attribute supplied.

Attribute

Required

Description

val

YES

the source (String) to be parsed into the generated iterator

count

NO

the max number (Integer, Float, Double, Long, String) entries to be in the generated iterator

separator

NO

the separator (String) to be used in separating the 'val' attribute into entries of the generator iterator

id

NO

the id (String) to store the resultant iterator into page context, if such id is supplied

converter

NO

the converter (must extends off IteratorGeneratorTag.Converter interface) to convert the String entry parsed from 'val'attribute into an object.

NOTE: The generated iterator will ALWAYS be pushed into the top of the stack, and poped at the end of the tag.

Example One:

 <!-- Generate a simple iterator -->

  <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
 	<ww:iterator>
 		<ww:property /><br/>
 	</ww:iterator>
  </ww:generator>

This generates an iterator and print it out using the iterator tag.

Example Two:

 <!-- Generate an iterator with count attribute -->
 <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">
 	<ww:iterator>
		<ww:property /><br/>
	</ww:iterator>
 </ww:generator>

This generates an iterator, but only 3 entries will be available in the iterator
generated, namely aaa, bbb and ccc respectively because count attribute is set to 3

Example Three

  <!-- Generate an iterator with id attribute -->
   <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" />
  <%
  	Iterator i = (Iterator) pageContext.getAttribute("myAtt");
  	while(i.hasNext()) {
  		String s = (String) i.next(); %>
  		<%=s%> <br/>
  <% 	}
  %>

This generates an iterator and put it in the PageContext under the key as specified
by the id attribute.

Example Four:

 <!-- Generate an iterator with comparator attribute -->
  <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}">
 	<ww:iterator>
  		<ww:property /><br/>
  	</ww:iterator>
  </ww:generator>
  
  
  public class GeneratorTagAction extends ActionSupport {
    
    ....
   
 	 public Converter getMyConverter() {
 		return new Converter() {
 			public Object convert(String value) throws Exception {
 				return "converter-"+value;
 			}
 		};
 	 }
 
    ...
    
  }

This will generate an iterator with each entries decided by the converter supplied. With
this converter, it simply add "converter-" to each entries.

Merge Tag

// TODO: this tag will be implemented soon

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//

Sort Tag

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//
//

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

// TODO: will be implemented soon

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//

Iterator Tag

Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException
Error formatting macro: snippet: java.lang.NullPointerException

//
//

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