Anonymous avatar Anonymous committed 98b68f6

docs exported from wiki

git-svn-id: http://svn.opensymphony.com/svn/webwork/trunk@425 573baa09-0c28-0410-bef9-dab3c582ae83

Comments (0)

Files changed (147)

changes.html

-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<!-- saved from url=(0067)http://jira.opensymphony.com/secure/attachment/10782/changelog.html -->
-<HTML><HEAD><TITLE>WebWork2 Changelog</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=windows-1252">
-<STYLE type=text/css>BODY {
-	FONT-SIZE: 100%
-}
-BODY {
-	FONT-SIZE: 9pt; FONT-FAMILY: verdana, arial, helvetica, sans-serif
-}
-TD {
-	FONT-SIZE: 9pt; FONT-FAMILY: verdana, arial, helvetica, sans-serif
-}
-TH {
-	FONT-SIZE: 9pt; FONT-FAMILY: verdana, arial, helvetica, sans-serif
-}
-DIV {
-	FONT-SIZE: 9pt; FONT-FAMILY: verdana, arial, helvetica, sans-serif
-}
-P {
-	FONT-SIZE: 9pt; FONT-FAMILY: verdana, arial, helvetica, sans-serif
-}
-H1 {
-	FONT-SIZE: 14pt; BORDER-BOTTOM: #ccc 1px solid
-}
-TABLE {
-	BORDER-RIGHT: #ccc 1px solid; BORDER-TOP: #ccc 1px solid; BORDER-LEFT: #ccc 1px solid; BORDER-BOTTOM: #ccc 1px solid
-}
-TH {
-	BACKGROUND-COLOR: #ddd; TEXT-ALIGN: left
-}
-UL {
-	PADDING-BOTTOM: 0.5em
-}
-UL UL {
-	PADDING-TOP: 0.5em
-}
-LI {
-	MARGIN-BOTTOM: 0.5em
-}
-.title {
-	FONT-WEIGHT: bold; FONT-SIZE: 11pt
-}
-.msg {
-	COLOR: #f00
-}
-.info {
-	FONT-SIZE: 0.9em; FONT-STYLE: italic
-}
-.issue {
-	FONT-WEIGHT: bold; FONT-SIZE: 0.9em; COLOR: #00f
-}
-.issue:visited {
-	COLOR: #600
-}
-.issue:hover {
-	COLOR: #f00
-}
-</STYLE>
-
-<META content="MSHTML 6.00.2737.800" name=GENERATOR></HEAD>
-<BODY>
-<H1>WebWork2 Changelog</H1><SPAN class=info>Version: <B>@version@</B> - Build 
-Date: <B>@builddate@</B> - <A 
-href="http://jira.opensymphony.com/secure/attachment/10782/README.html"><B>README</B></A> 
-- <A href="http://jira.opensymphony.com/"><B>Issue Tracker</B></A> </SPAN>
-<P>This is the WebWork2 changelog. This is a high-level list of changes and bug 
-fixes. A more exhaustive list of issues is maintained in the WebWork2 <A 
-href="http://jira.opensymphony.com/">issue tracker</A>. </P><BR>
-<P class=title><A 
-href="http://jira.opensymphony.com/secure/attachment/10782/">2.0.1</A> - Feb XX, 
-2004 </P>
-<UL>Bugfixes: 
-  <UL>
-    <LI><A class=issue 
-    href="http://jira.opensymphony.com/secure/attachment/10782/asdf0">WW-243</A> 
-    - Fixed class loader bug. 
-    <LI><A class=issue 
-    href="http://jira.opensymphony.com/secure/attachment/10782/asdf1">WW-666</A> 
-    - Fixed random System.exit(1) call. </LI></UL>New Features: 
-  <UL>
-    <LI><A class=issue 
-    href="http://jira.opensymphony.com/secure/attachment/10782/asdf2">WW-243</A>, 
-    <A class=issue 
-    href="http://jira.opensymphony.com/secure/attachment/10782/asdf3">WW-243</A> 
-    - Improved documentation 
-    <LI><A class=issue 
-    href="http://jira.opensymphony.com/secure/attachment/10782/asdf4">WW-661</A> 
-    - Added ability to brew cup of coffee. </LI></UL></UL>
-<P class=title><A 
-href="http://jira.opensymphony.com/secure/attachment/10782/">2.0.0</A> - Feb 9, 
-2004 </P>
-<UL>Initial release of WebWork2. </UL><BR><BR></BODY></HTML>

docs/Articles.html

+<html>
+    <head>
+        <title>Articles</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <ul class="star">
+<li> Book: <span class="nobr"><a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471463620/qid=1075480890/ref=sr_8_xs_ap_i2_xgl14/002-9701603-2786440?v=glance&#38;s=books&#38;n=507846"> Java Open Source Programming : with XDoclet, JUnit, WebWork, Hibernate<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> A good summary of what&#039;s new in WebWork 2.0: <span class="nobr"><a href="http://blogs.atlassian.com/rebelutionary/archives/000085.html">&#104;ttp://blogs.atlassian.com/rebelutionary/archives/000085.html<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> <a href="http://wiki.opensymphony.com//display/WW/Writeup%2Bof%2BMike%2527s%2BTalk%2Bat%2BTSS%2Bon%2BWebWork2">Writeup of Mike&#039;s Talk at TSS on WebWork2</a> (7/03)</li>
+<li> Mike&#039;s PPT Presentation from TSS Symposium: <span class="nobr"><a href="http://blogs.atlassian.com/rebelutionary/archives/000200.html">&#104;ttp://blogs.atlassian.com/rebelutionary/archives/000200.html<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> Some Japanese translated information (including the presentation above):   <span class="nobr"><a href="http://www.mobster.jp/webwork/">&#104;ttp://www.mobster.jp/webwork/<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> Another PPT presentation from Rick Salsa, Groove Systems: <span class="nobr"><a href="http://www.groovesystems.com/training/java4/webwork.ppt">&#104;ttp://www.groovesystems.com/training/java4/webwork.ppt<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> Building with WebWork on TheServerSide (11/03): <span class="nobr"><a href="http://www.theserverside.com/resources/article.jsp?l=WebWork2">&#104;ttp://www.theserverside.com/resources/article.jsp?l=WebWork2<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> Jason Carreira&#039;s slides and example code (4/04): <span class="nobr"><a href="http://wiki.opensymphony.com/space/WebWork2/webwork-talk.zip">webwork-talk.zip<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> A brazilian portuguese tutorial teaching the main concepts and features of Webwork (14/04): <span class="nobr"><a href="http://www.guj.com.br/user.article.get.chain?page=1&#38;article.id=135">tutorial<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+</ul>
+
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Bug tracker, wiki.html

+<html>
+    <head>
+        <title>Bug tracker, wiki</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">The bug tracking system for both Webwork and Xwork (as well as all other Opensymphony projects) can be found at <span class="nobr"><a href="http://jira.opensymphony.com">&#104;ttp://jira.opensymphony.com<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>.</p>The Webwork wiki contains a wealth of knowledge about the project including example code, a cookbook, and general discussion about the framework.  The wiki can be found at <span class="nobr"><a href="http://wiki.opensymphony.com/display/WW/WebWork">&#104;ttp://wiki.opensymphony.com/display/WW/WebWork<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>.
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Chaining Interceptor.html

+<html>
+    <head>
+        <title>Chaining Interceptor</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2"> How to use the Chaining Interceptor</h2></p>The following code snippet shows how interceptor stacks work for chaining.  If someone wants to post xwork.xml (and more complex) examples it would be appreciated <img src="./icons/emoticons/smile.gif" height="20" width="20" align="absmiddle" alt="" border="0"/>
+
+<div class="code"><pre>Interceptors&#45;stack A before&#10;  Action A&#10;  Interceptor&#45;stack B before&#10;    Action B&#10;    Action B result&#10;  Interceptor&#45;stack B after&#10;Interceptor&#45;stack A after</pre></div>
+<h2 class="heading2"> Interceptors that wrap Chained Actions</h2><p class="paragraph">Sometimes you may want to have an interceptor that wraps a number of chained actions (and is included in the Interceptor stack for each), but is only invoked at the start and end of the chain.  For example, an Interceptor that manages a Hibernate Session / Transaction.  Here is an example from my &#039;teach-myself-webwork-and-hibernate project named &#039;cash&#039; after Johnny Cash.</p><div class="code"><pre>&lt;interceptor name=&quot;hibernate&quot; class=&quot;cash.interceptor.HibernateInterceptor&quot;/&gt;&#10;      &lt;interceptor name=&quot;login&quot; class=&quot;cash.interceptor.LoginInterceptor&quot;/&gt;&#10;&#10;      &lt;interceptor&#45;stack name=&quot;cashDefaultStack&quot;&gt;&#10;        &lt;interceptor&#45;ref name=&quot;defaultStack&quot;/&gt;&#10;        &lt;interceptor&#45;ref name=&quot;component&quot;/&gt;&#10;        &lt;interceptor&#45;ref name=&quot;hibernate&quot;/&gt;&#10;        &lt;interceptor&#45;ref name=&quot;login&quot;/&gt;&#10;      &lt;/interceptor&#45;stack&gt;&#10;      &lt;interceptor&#45;stack name=&quot;cashValidationWorkflowStack&quot;&gt;&#10;        &lt;interceptor&#45;ref name=&quot;cashDefaultStack&quot;/&gt;&#10;        &lt;interceptor&#45;ref name=&quot;validation&quot;/&gt;&#10;        &lt;interceptor&#45;ref name=&quot;workflow&quot;/&gt;&#10;      &lt;/interceptor&#45;stack&gt;&#10;    &lt;/interceptors&gt;&#10;&#10;    &lt;<span class="java&#45;keyword">default</span>&#45;interceptor&#45;ref name=&quot;cashDefaultStack&quot;/&gt;&#10;&#10;    &lt;action name=&quot;list&quot; class=&quot;cash.action.SelectUserAction&quot;&gt;&#10;      &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;list.vm&lt;/result&gt;&#10;    &lt;/action&gt;&#10;&#10;    &lt;action name=&quot;edit&quot; class=&quot;cash.action.EditAction&quot;&gt;&#10;      &lt;result name=&quot;success&quot; type=&quot;chain&quot;&gt;list&lt;/result&gt;&#10;      &lt;result name=&quot;input&quot; type=&quot;dispatcher&quot;&gt;edit.vm&lt;/result&gt;&#10;      &lt;interceptor&#45;ref name=&quot;cashValidationWorkflowStack&quot;/&gt;&#10;    &lt;/action&gt;</pre></div><br/>
+In this example, after editing a user, the EditAction is chained to the ListAction to display a list of all users to the screen.<p class="paragraph">We want the following
+<div class="code"><pre>EditActionInterceptorStack &#45; before&#10;    EditAction&#10;    ListActionInterceptorStack (except <span class="java&#45;keyword">for</span> Hibernate) &#45; before&#10;      ListAction&#10;    ListActionInterceptorStack (except <span class="java&#45;keyword">for</span> Hibernate) &#45; end&#10;  EditActinInterceptorStack &#45; end</pre></div></p>But instead we get:
+<div class="code"><pre>EditActionInterceptorStack &#45; before&#10;    EditAction&#10;    ListActionInterceptorStack (including Hibernate) &#45; before&#10;      ListAction&#10;    ListActionInterceptorStack (including Hibernate) &#45; end&#10;  EditActinInterceptorStack &#45; end  ERROR&#33;  Hibernate Session / Transaction is already closed&#33;&#33;&#33;</pre></div><br/>
+The way to get the desired behaviour is to either not use a chained action (and incorporate the ListAction logic into EditAction, or to make the HibernateInterceptor smart enough to handle chained actions.<p class="paragraph">The HibernateInterceptor can use a ThreadLocal to hold state and detect if it is inside a chain.  When it detects this, it can do nothing.</p><div class="code"><pre><span class="java&#45;keyword">package</span> cash.interceptor;&#10;&#10;<span class="java&#45;keyword">import</span> net.sf.hibernate.HibernateException;&#10;<span class="java&#45;keyword">import</span> net.sf.hibernate.Transaction;&#10;&#10;<span class="java&#45;keyword">import</span> org.apache.log4j.Logger;&#10;&#10;<span class="java&#45;keyword">import</span> com.opensymphony.xwork.Action;&#10;<span class="java&#45;keyword">import</span> com.opensymphony.xwork.ActionInvocation;&#10;<span class="java&#45;keyword">import</span> com.opensymphony.xwork.interceptor.Interceptor;&#10;&#10;<span class="java&#45;keyword">import</span> cash.action.HibernateAction;&#10;<span class="java&#45;keyword">import</span> cash.util.HibernateUtil;&#10;&#10;/&#42;&#42;&#10; &#42; &#64;author Gavin King&#10; &#42; &#64;author Joel Hockey&#10; &#42; &#64;version $Id&#58; $&#10; &#42;/&#10;<span class="java&#45;keyword">public</span> class HibernateInterceptor <span class="java&#45;keyword">implements</span> Interceptor &#123;&#10;    <span class="java&#45;keyword">private</span> <span class="java&#45;keyword">static</span> <span class="java&#45;keyword">final</span> Logger LOG = Logger.getLogger(HibernateInterceptor.class);&#10;&#10;    <span class="java&#45;keyword">private</span> <span class="java&#45;keyword">static</span> ThreadLocal s&#95;threadLocal = <span class="java&#45;keyword">new</span> ThreadLocal();&#10;&#10;    /&#42;&#42; destroy &#42;/&#10;    <span class="java&#45;keyword">public</span> void destroy() &#123; &#125;&#10;&#10;    /&#42;&#42; init &#42;/&#10;    <span class="java&#45;keyword">public</span> void init() &#123; &#125;&#10;&#10;    /&#42;&#42; implement intercept &#42;/&#10;    <span class="java&#45;keyword">public</span> <span class="java&#45;object">String</span> intercept(ActionInvocation invocation) <span class="java&#45;keyword">throws</span> Exception &#123;&#10;        LOG.debug(&quot;HibernateInterceptor called&quot;);&#10;&#10;        Action action = invocation.getAction();&#10;        <span class="java&#45;keyword">if</span> (&#33;(action <span class="java&#45;keyword">instanceof</span> HibernateAction)) &#123; <span class="java&#45;keyword">return</span> invocation.invoke(); &#125;&#10;&#10;        // <span class="java&#45;keyword">continue</span> with HibernateAction&#10;        HibernateAction ha = (HibernateAction)action;&#10;&#10;        // <span class="java&#45;keyword">if</span> <span class="java&#45;keyword">this</span> interceptor is being chained, then transaction will already exist&#10;        // in that <span class="java&#45;keyword">case</span>, we should let the <span class="java&#45;keyword">outer</span> interceptor dispose of the sesion&#10;        <span class="java&#45;object">boolean</span> inChainedAction = <span class="java&#45;keyword">true</span>;&#10;        Transaction transaction = (Transaction)s&#95;threadLocal.get();&#10;        <span class="java&#45;keyword">if</span> (transaction == <span class="java&#45;keyword">null</span>) &#123;&#10;            inChainedAction = <span class="java&#45;keyword">false</span>;&#10;            transaction = HibernateUtil.currentSession().beginTransaction();&#10;            s&#95;threadLocal.set(transaction);&#10;        &#125;&#10;&#10;        <span class="java&#45;object">boolean</span> rollback = <span class="java&#45;keyword">false</span>;&#10;&#10;        <span class="java&#45;keyword">try</span> &#123;&#10;&#10;            <span class="java&#45;keyword">return</span> invocation.invoke();&#10;        &#125; <span class="java&#45;keyword">catch</span> (Exception e) &#123;&#10;            // Note that all the cleanup is done&#10;            // after the view is rendered, so we&#10;            // have an open session in the view&#10;&#10;            rollback = <span class="java&#45;keyword">true</span>;&#10;            <span class="java&#45;keyword">if</span> (e <span class="java&#45;keyword">instanceof</span> HibernateException) &#123;&#10;                LOG.error(&quot;HibernateException in execute()&quot;, e);&#10;                <span class="java&#45;keyword">return</span> HibernateAction.DBERROR;&#10;            &#125; <span class="java&#45;keyword">else</span> &#123;&#10;                LOG.error(&quot;Exception in execute()&quot;, e);&#10;                <span class="java&#45;keyword">throw</span> e;&#10;            &#125;&#10;        &#125; <span class="java&#45;keyword">finally</span> &#123;&#10;            <span class="java&#45;keyword">try</span> &#123;&#10;                <span class="java&#45;keyword">if</span> (&#33;inChainedAction) &#123;&#10;                    s&#95;threadLocal.set(<span class="java&#45;keyword">null</span>);&#10;                    disposeSession(transaction, ha.getRollback() || rollback);&#10;                &#125;&#10;            &#125; <span class="java&#45;keyword">catch</span> (HibernateException e) &#123;&#10;                LOG.error(&quot;HibernateException in dispose()&quot;, e);&#10;                <span class="java&#45;keyword">return</span> HibernateAction.DBERROR;&#10;            &#125;&#10;        &#125;&#10;    &#125;&#10;&#10;    /&#42;&#42; dispose of session &#42;/&#10;    <span class="java&#45;keyword">public</span> void disposeSession(Transaction transaction, <span class="java&#45;object">boolean</span> rollback) <span class="java&#45;keyword">throws</span> HibernateException &#123;&#10;        LOG.debug(&quot;disposing&quot;);&#10;&#10;        <span class="java&#45;keyword">if</span> (&#33;HibernateUtil.currentSession().isConnected()) &#123;&#10;            LOG.debug(&quot;Session has already been disposed of &#45; <span class="java&#45;keyword">this</span> will happen in a chained action&quot;);&#10;            <span class="java&#45;keyword">return</span>;&#10;        &#125;&#10;&#10;        <span class="java&#45;keyword">try</span> &#123;&#10;            <span class="java&#45;keyword">if</span> (transaction &#33;= <span class="java&#45;keyword">null</span>) &#123;&#10;                <span class="java&#45;keyword">if</span> (rollback) &#123;&#10;                    LOG.debug(&quot;rolling back&quot;);&#10;                    transaction.rollback();&#10;                &#125; <span class="java&#45;keyword">else</span> &#123;&#10;                    LOG.debug(&quot;committing&quot;);&#10;                    transaction.commit();&#10;                &#125;&#10;            &#125;&#10;        &#125; <span class="java&#45;keyword">catch</span> (HibernateException e) &#123;&#10;            LOG.error(&quot;error during commit/rollback&quot;, e);&#10;            <span class="java&#45;keyword">if</span> (&#33;rollback && transaction &#33;= <span class="java&#45;keyword">null</span>) &#123;&#10;                LOG.error(&quot;rolling back affter previous attempt to commit&quot;);&#10;                transaction.rollback();&#10;            &#125;&#10;            <span class="java&#45;keyword">throw</span> e;&#10;        &#125; <span class="java&#45;keyword">finally</span> &#123;&#10;            HibernateUtil.closeSession();&#10;        &#125;&#10;    &#125;&#10;&#125;</pre></div><p class="paragraph">For more information, also see <a href="http://wiki.opensymphony.com//display/OS/Webwork%2B-%2BWhy%2Bwould%2BI%2Buse%2BAction%2BChaining%253F">OS:Webwork - Why would I use Action Chaining?</a></p>
+
+				    					    <br/>
+                        <div class="tabletitle">
+                            <a name="attachments">Attachments:</a>
+                        </div>
+
+                        <div class="greybox" align="left">
+                                                            <img src="icons/bullet_blue.gif" height="8" width="8" alt=""/>
+                                <a href="Chaining Interceptor_attachments/HibernateUtil.java">HibernateUtil.java</a> (application/octet-stream)
+                                <br/>
+                                                            <img src="icons/bullet_blue.gif" height="8" width="8" alt=""/>
+                                <a href="Chaining Interceptor_attachments/HibernateAction.java">HibernateAction.java</a> (application/octet-stream)
+                                <br/>
+                                                    </div>
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Chaining Interceptor_attachments/HibernateAction.java

+package cash.action;
+
+import org.apache.log4j.Logger;
+
+import com.opensymphony.xwork.ActionContext;
+import com.opensymphony.xwork.ActionSupport;
+
+/**
+ * Superclass for Hibernate-aware actions.
+ *
+ * @author Joel Hockey
+ * @version $Id$
+ */
+public abstract class HibernateAction extends ActionSupport {
+    /** xwork action return code */
+    public static final String DBERROR = "dberror";
+
+    private static final Logger LOG = Logger.getLogger(HibernateAction.class);
+
+    private boolean m_rollback = false;
+
+    /** roll back the current session */
+    protected void setRollbackOnly() { m_rollback = true; }
+
+    /** @return whether the current Hibernate Session should be rolled back */
+    public boolean getRollback() { return m_rollback; }
+
+    /**
+     * Sets an object into the web session
+     * @param key Key used to index object
+     * @param object The object to store
+     */
+    public void set(Object key, Object object) {
+        ActionContext.getContext().getSession().put(key, object);
+    }
+
+    /**
+     * Retrieve object from web session
+     * @param key Key used to index object
+     * @return object if it exists, or null
+     */
+    public Object get(Object key) {
+        return ActionContext.getContext().getSession().get(key);
+    }
+}
+
+

docs/Chaining Interceptor_attachments/HibernateUtil.java

+package cash.util;
+
+import net.sf.hibernate.HibernateException;
+import net.sf.hibernate.SessionFactory;
+import net.sf.hibernate.Session;
+import net.sf.hibernate.cfg.Configuration;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Helper Singleton class to manage Hibernate Sessions.
+ *
+ * @author Joel Hockey
+ * @version $Id$
+ */
+public class HibernateUtil {
+
+    /** ThreadLocal Session Map */
+    public static final ThreadLocal MAP = new ThreadLocal();
+
+    private static final Logger LOG = Logger.getLogger(HibernateUtil.class);
+
+    private static final SessionFactory SESSION_FACTORY;
+
+    /** Make default construct private */
+    private HibernateUtil() { }
+
+    /** Loads Hibernate config. */
+    static {
+        try {
+            LOG.debug("HibernateUtil.static - loading config");
+            SESSION_FACTORY = new Configuration().configure().buildSessionFactory();
+            LOG.debug("HibernateUtil.static - end");
+        } catch (HibernateException ex) {
+            throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
+        }
+    }
+
+    /**
+     * Gets Hibernate Session for current thread.  When finished, users
+     * must return session using {@link #closeSession() closeSession()} method.
+     * @return Hibernate Session for current thread.
+     * @throws HibernateException if there is an error opening a new session.
+     */
+    public static Session currentSession() throws HibernateException {
+        Session s = (Session)MAP.get();
+        // Open a new Session, if this Thread has none yet
+        if (s == null) {
+            s = SESSION_FACTORY.openSession();
+            MAP.set(s);
+        }
+        return s;
+    }
+
+    /**
+     * Closes the Hibernate Session.  Users must call this method after calling
+     * {@link #currentSession() currentSession()}.
+     * @throws HibernateException if session has problem closing.
+     */
+    public static void closeSession() throws HibernateException {
+        Session s = (Session)MAP.get();
+        MAP.set(null);
+        if (s != null) {
+            s.close();
+        }
+    }
+}

docs/Client-Side Validation.html

+<html>
+    <head>
+        <title>Client-Side Validation</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">Validators can implement the <b class="strong">com.opensymphony.webwork.validators.ScriptValidationAware</b> interface to provide support for client-side validation:</p><div class="code"><pre><span class="java&#45;keyword">public</span> <span class="java&#45;keyword">interface</span> ScriptValidationAware <span class="java&#45;keyword">extends</span> FieldValidator &#123;&#10;    <span class="java&#45;keyword">public</span> <span class="java&#45;object">String</span> validationScript(Map parameters);&#10;&#125;</pre></div><p class="paragraph">The value returned by <b class="strong">validationScript</b> will be executed on the client-side before the form is submitted if client-side validation is enabled.  For example,  the <b class="strong">requiredstring</b> validator has the following code:</p><div class="code"><pre><span class="java&#45;keyword">public</span> <span class="java&#45;object">String</span> validationScript(Map parameters) &#123;&#10;        <span class="java&#45;object">String</span> field = (<span class="java&#45;object">String</span>) parameters.get(&quot;name&quot;);&#10;        <span class="java&#45;object">StringBuffer</span> js = <span class="java&#45;keyword">new</span> <span class="java&#45;object">StringBuffer</span>();&#10;&#10;        js.append(&quot;value = form.elements&#91;&#039;&quot; &#43; field &#43; &quot;&#039;&#93;.value;&#92;n&quot;);&#10;        js.append(&quot;<span class="java&#45;keyword">if</span> (value == &#92;&quot;&#92;&quot;) &#123;&#92;n&quot;);&#10;        js.append(&quot;&#92;talert(&#039;&quot; &#43; getMessage(<span class="java&#45;keyword">null</span>) &#43; &quot;&#039;);&#92;n&quot;);&#10;        js.append(&quot;&#92;treturn &#039;&quot; &#43; field &#43; &quot;&#039;;&#92;n&quot;);&#10;        js.append(&quot;&#125;&#92;n&quot;);&#10;        js.append(&quot;&#92;n&quot;);&#10;&#10;        <span class="java&#45;keyword">return</span> js.toString();&#10;&#125;</pre></div><p class="paragraph">To enable client-side validation,  use the &lt;<a href="UI Tags.html#UI+Tags-form">ww:form</a>&gt; tag:</p><div class="code"><pre>&lt;ww&#58;form name=&quot;&#039;test&#039;&quot; action=&quot;&#039;javascriptValidation&#039;&quot; validate=&quot;<span class="java&#45;keyword">true</span>&quot; &gt;&#10;&#10;  ...&#10;&lt;/ww&#58;form&gt;</pre></div><p class="paragraph">Currently only JavaScript is supported.</p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Comparison to Struts.html

+<html>
+    <head>
+        <title>Comparison to Struts</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2"> Feature Comparison</h2></p><table class="wiki-table" cellpadding="0" cellspacing="0" border="0"><tr><th>Feature</th><th>Struts</th><th>WebWork 1.x</th><th>WebWork 2.x</th></tr><tr class="table-odd"><td><b class="strong">Action classes</b></td><td>Struts requires Action classes to extend an Abstract base class. This shows a common problem in Struts of programming to abstract classes instead of interfaces.</td><td>Action classes must implement the webwork.Action Interface. There are other Interfaces which can be implemented for other services, such as storing error messages, getting localized texts, etc. The ActionSupport class implements many of these Interfaces and can act as a base class. WebWork is all written to Interfaces, which allows for plugging in your own implementations.</td><td>An Action must implement the com.opensymphony.xwork.Action Interface, with a series of other Interfaces for other services, like in WebWork 1.x. WebWork2 has its own ActionSupport to implement these Interfaces.</td></tr><tr class="table-even"><td><b class="strong">Threading Model</b></td><td>Struts Actions must be thread-safe because there will only be one instance to handle all requests. This places restrictions on what can be done with Struts Actions as any resources held must be thread-safe or access to them must be synchronized.</td><td>WebWork Actions are instantiated for each request, so there are no thread-safety issues. In practice, Servlet containers generate many throw-away objects per request, and one more Object does not prove to be a problem for performance or garbage collection.</td><td>ditto</td></tr><tr class="table-odd"><td><b class="strong">Servlet Dependency</b></td><td>Struts Actions have dependencies on Servlets because they get the ServletRequest and ServletResponse (not HttpServletRequest and HttpServletResponse, I&#039;ve been told) when they are executed. This tie to Servlets (although not Http*) is a defacto tie to a Servlet container, which is an unneeded dependency. Servlets may be used outside a Web context, but it&#039;s not a good fit for JMS, for instance.</td><td>WebWork Actions are not tied to the web or any container. WebWork actions CAN choose to access the request and response from the ActionContext, but it is not required and should be done only when ABSOLUTELY neccessary to avoid tieing code to the Web.</td><td>ditto</td></tr><tr class="table-even"><td><b class="strong">Testability</b></td><td>Many strategies have sprung up around testing Struts applications, but the major hurdle is the fact that Struts Actions are so tightly tied to the web (receiving a Request and Response object). This often leads people to test Struts Actions inside a container, which is both slow and NOT UNIT TESTING. There is a Junit extension : Struts TestCase (<span class="nobr"><a href="http://strutstestcase.sourceforge.net/">&#104;ttp://strutstestcase.sourceforge.net/<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>)</td><td>WebWork actions can be tested by  instantiating your action, setting the properties, and executing them</td><td>ditto, but the emphasis on Inversion of Control makes testing even simpler, as you can just set a Mock implementation of your services into your Action for testing, instead of having to set up service registries or static singletons</td></tr><tr class="table-odd"><td><b class="strong">FormBeans</b></td><td>Struts requires the use of FormBeans for every form, necessitating either a lot of extra classes or the use of DynaBeans, which are really just a workaround for the limitation of requiring FormBeans</td><td>WebWork 1.x allows you to have all of your properties directly accessible on your Action as regular Javabeans properties, including rich Object types which can have their own properties which can be accessed from the web page. WebWork also allows the FormBean pattern, as discussed in &quot;<a href="http://wiki.opensymphony.com//display/WW1/Populate%2BForm%2BBean%2Band%2Baccess%2Bits%2Bvalue">WW1:Populate Form Bean and access its value</a>&quot;</td><td>WebWork 2 allows the same features as WebWork 1, but adds ModelDriven Actions, which allow you to have a rich Object type or domain object as your form bean, with its properties directly accessible to the web page, rather than accessing them as sub-properties of a property of the Action.</td></tr><tr class="table-even"><td><b class="strong">Expression Language</b></td><td>Struts 1.1 integrates with JSTL, so it uses the JSTL EL. This EL has basic object graph traversal, but relatively weak collection and indexed property support.</td><td>WebWork 1.x has its own Expression language which is built for accessing the ValueStack. Collection and indexed property support are basic but good. WebWork can also be made to work directly with JSTL using the Filter described in <a href="http://wiki.opensymphony.com//display/WW1/Using%2BJSTL%2Bseamlessly%2Bwith%2BWebWork">WW1:Using JSTL seamlessly with WebWork</a></td><td>WebWork 2 uses <a href="http://wiki.opensymphony.com//display/XW/Ognl">XW:Ognl</a> which is a VERY powerful expression language, with additions for accessing the value stack. Ognl supports very powerful collection and indexed property support. Ognl also supports powerful features like projections (calling the same method on each member of a collection and building a new collection of the results), selections (filtering a collection with a selector expression to return a subset), list construction, and lambda expressions (simple functions which can be reused). Ognl also allows access to static methods, static fields, and constructors of classes. WebWork2 may also use JSTL as mentioned in <a href="http://wiki.opensymphony.com//display/WW1/Using%2BJSTL%2Bseamlessly%2Bwith%2BWebWork">WW1:Using JSTL seamlessly with WebWork</a></td></tr><tr class="table-odd"><td><b class="strong">Binding values into views</b></td><td>Struts uses the standard JSP mechanism for binding objects into the page context for access, which tightly couples your view to the form beans being rendered</td><td>WebWork sets up a ValueStack which the WebWork taglibs access to dynamically find values very flexibly without tightly coupling your view to the types it is rendering. This allows you to reuse views across a range of types which have the same properties.</td><td>ditto</td></tr><tr class="table-even"><td><b class="strong">Type Conversion</b></td><td>Struts FormBeans properties are usually all Strings. Struts uses Commons-Beanutils for type conversion. Converters are per-class, and not configurable per instance. Getting a meaningful type conversion error out and displaying it to the user can be difficult.</td><td>WebWork 1.x uses PropertyEditors for type conversion. PropertyEditors are per type and not settable per Action, but field error messages are added to the field error map in the Action to be automatically displayed to the user with the field.</td><td>WebWork2 uses Ognl for type conversion with added converters provided for all basic types. Type converters default to these converters, but type conversion can be specified per field per class. Type conversion errors also have a default error message but can be set per field per class using the localization mechanism in WW2 and will be set into the field error messages of the Action.</td></tr><tr class="table-odd"><td><b class="strong">Modular Before &amp; After Processing</b></td><td>Class hierarchies of base Actions must be built up to do processing before and after delegating to the Action classes, which can lead deep class hierarchies and limitations due to the inability to have multiple inheritance <em class="emphasis"><a href="#Comparison+to+Struts-1">1</a></em></td><td>Class hierarchies</td><td>WebWork 2 allows you to modularize before and after processing in Interceptors. Interceptors can be applied dynamically via the configuration without any coupling between the Action classes and the Interceptors.</td></tr><tr class="table-even"><td><b class="strong">Validation</b></td><td>Struts calls validate() on the FormBean. Struts users often use Commons Validation for validation. I don&#039;t know a lot about this, so I&#039;ll put some questions here: <br clear="all" /> <br clear="all" /> Because FormBean properties are usually Strings, some types of validations must either be duplicated (checking type conversion) or cannot be done? <br clear="all" /> <br clear="all" /> Can Commons Validation have different validation contexts for the same class? (I&#039;ve been told yes, so that&#039;s a good thing) <br clear="all" /> <br clear="all" /> Can Commons Validation chain to validations on sub-objects, using the validations defined for that object properties class?</td><td>WebWork1.x calls the validate() method on Actions, which can either do programmatic validations or call an outside validation framework (this is apparently the same as Struts)</td><td>WebWork2 can use the validate() method of WebWork and Struts and / or use the <a href="http://wiki.opensymphony.com//display/XW/Validation%2BFramework">XW:Validation Framework</a>, which is activated using an XWork Interceptor. The Xwork Validation Framework allows you to define validations in an XML format with default validations for a class and custom validations added for different validation contexts. The Xwork Validation Framework is enabled via an Interceptor and is therefore completely decoupled from your Action class. The Xwork Validation Framework also allows you to chain the validation process down into sub-properties using the VisitorFieldValidator which will use the validations defined for the properties class type and the validation context.</td></tr><tr class="table-odd"><td><b class="strong">Control Of Action Execution</b></td><td>As far as I know Struts sets up the Action object for you, and you have very little control over the order of operations. To change them I think (?) you need to write your own Servlet to handle dispatching as you want</td><td>The ActionFactory chain controls the order in which an Action is constructed and initialised, but this requires writing a class</td><td>The interceptor stacks in WebWork 2 are hugely powerful in this regard. All aspects of Action setup have been moved into Interceptor implementations (ie setting paramters from the web, validation etc), so you can control on a per action basis the order in which they are performed. For example you might want your IOC framework to setup the action before the parameters are set from the request or vice versa - you can thusly control this on a per package or per action basis with interceptor stacks.</td></tr></table><p class="paragraph"><h2 class="heading2"> References</h2>
+<ul class="star">
+<li> <span class="nobr"><a href="http://www.mail-archive.com/opensymphony-webwork@lists.sourceforge.net/msg00995.html">&#104;ttp://www.mail-archive.com/opensymphony-webwork@lists.sourceforge.net/msg00995.html<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - compares Struts development to WebWork 1.x development from the point of view of a Stuts developer who switched to WebWork</li>
+<li> <span class="nobr"><a href="http://www.mail-archive.com/opensymphony-webwork@lists.sourceforge.net/msg04700.html">&#104;ttp://www.mail-archive.com/opensymphony-webwork@lists.sourceforge.net/msg04700.html<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - Kind of the first draft of this comparison</li>
+</ul>
+<h2 class="heading2"> Footnotes</h2><ol>
+<li> <a name="Comparison+to+Struts-1" ></a> Some Stuts users have built the beginnings of an Interceptor framework for Struts (<span class="nobr"><a href="http://struts.sourceforge.net/saif/">&#104;ttp://struts.sourceforge.net/saif/<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>). It currently has some serious limitations (no &quot;around&quot; processing, just before and after) and is not part of the main Struts project</li>
+</ol></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Configuration.html

+<html>
+    <head>
+        <title>Configuration</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">WebWork has two main configuration files you need to be aware of: web.xml and xwork.xml. Here you will find out all the information you need for both WebWork&#039;s required and optional configuration files.
+<ol>
+<li> <a href="web.xml.html">web.xml</a></li>
+<li> <a href="xwork.xml.html">xwork.xml</a></li>
+<li> <a href="webwork-default.xml.html">webwork-default.xml</a></li>
+<li> <a href="Results.html">Results</a><ol>
+<li> <a href="Global results.html">Global results</a></li>
+<li> <a href="Default results.html">Default results</a></li>
+</ol></li>
+<li> <a href="Interceptors.html">Interceptors</a></li>
+<li> <a href="Packages.html">Packages</a></li>
+<li> <a href="Namespaces.html">Namespaces</a></li>
+<li> <a href="Reloading configuration.html">Reloading configuration</a></li>
+<li> <a href="webwork.properties.html">webwork.properties</a></li>
+<li> <a href="velocity.properties.html">velocity.properties</a></li>
+</ol><br/>
+Below are all the files that you may need to be aware of.</p><table class="wikitable">
+<tr>
+<th>File</th><th>Optional</th><th>Location (relative to webapp)</th><th>Purpose</th>
+</tr><tr>
+<td><a href="web.xml.html">web.xml</a></td><td>no</td><td>/WEB-INF/</td><td>Web deployment descriptor to include all necessary WebWork components</td>
+</tr><tr>
+<td><a href="xwork.xml.html">xwork.xml</a></td><td>no</td><td>/WEB-INF/classes/</td><td>Main configuration, contains result/view types, action mappings, interceptors, etc</td>
+</tr><tr>
+<td><a href="webwork.properties.html">webwork.properties</a></td><td>yes</td><td>/WEB-INF/classes/</td><td>WebWork properties</td>
+</tr><tr>
+<td><a href="webwork-default.xml.html">webwork-default.xml</a></td><td>yes</td><td>/WEB-INF/lib/webwork-x.x.jar</td><td>Default configuration that should be included in xwork.xml</td>
+</tr><tr>
+<td><a href="velocity.properties.html">velocity.properties</a></td><td>yes</td><td>/WEB-INF/classes/</td><td>Override the default velocity configuration</td>
+</tr><tr>
+<td><a href="Validation.html">validators.xml</a></td><td>yes</td><td>/WEB-INF/classes/</td><td>Define input validators to be used later</td>
+</tr><tr>
+<td><a href="IoC Configuration.html">components.xml</td><td>yes</a></td><td>/WEB-INF/classes/</td><td>Define IOC components</td>
+</tr><tr>
+<td>taglib.tld</td><td>no</td><td>/WEB-INF/lib/webwork-x.x.jar </td><td> Webwork tag library descriptor </td>
+</tr>
+</table>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Default results.html

+<html>
+    <head>
+        <title>Default results</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">Webwork has the ability to define a default result type for your actions.  Thus, you don&#039;t have to specify the result-type for results using the default.  If a package extends another  package and you don&#039;t specify a new default result type for the child package, then the parent package default type will be used when the type attribute is not specified in the result tag.</p><div class="code"><pre>&lt;&#33;&#45;&#45; parts of xwork.xml  &#45;&#45;&gt;&#10;....&#10;&#10;&lt;result&#45;types&gt;&#10; &lt;result&#45;type name=&quot;dispatcher&quot; class=&quot;com.opensymphony.webwork.dispatcher.ServletDispatcherResult&quot; <span class="java&#45;keyword">default</span>=&quot;<span class="java&#45;keyword">true</span>&quot;/&gt;&#10; &lt;result&#45;type name=&quot;redirect&quot; class=&quot;com.opensymphony.webwork.dispatcher.ServletRedirectResult&quot;/&gt;&#10; &lt;result&#45;type name=&quot;velocity&quot; class=&quot;com.opensymphony.webwork.dispatcher.VelocityResult&quot;/&gt;&#10;&lt;/result&#45;types&gt;&#10;&#10;....&#10;&#10;&lt;action name=&quot;bar&quot; class=&quot;myPackage.barAction&quot;&gt;&#10;&#10;&lt;&#33;&#45;&#45; <span class="java&#45;keyword">this</span> result uses dispatcher, so you can omit the type=&quot;dispatcher&quot; <span class="java&#45;keyword">if</span> you want &#45;&#45;&gt;&#10;  &lt;result name=&quot;success&quot;&gt;foo.jsp&lt;/result&gt;&#10;&#10;&lt;&#33;&#45;&#45; <span class="java&#45;keyword">this</span> result uses velocity result, so the type needs to be specified &#45;&#45;&gt;&#10;  &lt;result name=&quot;error&quot; type=&quot;velocity&quot;&gt;error.vm&lt;/result&gt;&#10;&#10;&lt;/action&gt;&#10;&#10;....</pre></div>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Deployment Notes.html

+<html>
+    <head>
+        <title>Deployment Notes</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">WebWork runs on most application servers without any problems. However, you may need to do a few modifications in order to get it running in your environemnt.</p><h3 class="heading3"> WebLogic 6.1</h3>
+A subproject has been added to the WebWork CVS repository that vastly simplifies getting WebWork to work under BEA Weblogic Server 6.1. Documentation is included.<br/>
+Look for the subproject under the main folder &quot;misc&quot;.<p class="paragraph"><h3 class="heading3"> SunONE 7.0</h3></p>You need to grant permissions to WebWork:
+
+<div class="code"><pre>grant &#123;&#10;	permission java.security.AllPermission;&#10;&#125;;</pre></div><p class="paragraph">or more specifically,
+<ul type="square" class="minus">
+<li> Give Write Permissions to java.util.PropertyPermission.</li>
+<li> Add java.lang.reflect.ReflectPermission &quot;suppressAccessChecks&quot;</li>
+<li> OgnlInvoke Permission</li>
+</ul>
+<div class="code"><pre>grant &#123;&#10;	permission java.util.PropertyPermission &quot;&#42;&quot;, &quot;read, write&quot;;&#10;	permission java.lang.reflect.ReflectPermission &quot;suppressAccessChecks&quot;;&#10;	permission ognl.OgnlInvokePermission &quot;&#42;&quot;;&#10;&#125;;</pre></div></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Documentation.html

+<html>
+    <head>
+        <title>Documentation</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h3 class="heading3"> 1. Overview</h3>
+<ol>
+<li> <a href="What is WebWork.html">What is WebWork</a></li>
+<li> <a href="Getting started.html">Getting started</a></li>
+<li> <a href="FAQ.html">FAQ</a></li>
+<li> <a href="Deployment Notes.html">Deployment Notes</a></li>
+<li> <a href="WebWork Community.html">WebWork Community</a><ol>
+<li> <a href="Mailing Lists.html">Mailing lists</a></li>
+<li> <a href="Bug tracker, wiki.html">Bug tracker, wiki</a></li>
+</ol></li>
+<li> <a href="Articles.html">Articles and press about WebWork</a></li>
+<li> <a href="Projects Using WebWork.html">Projects Using WebWork</a></li>
+<li> <a href="Comparison to Struts.html">Comparison to Struts</a></li>
+</ol>
+<h3 class="heading3"> 2. WebWork versions</h3>
+<ol>
+<li> Current Release<ol>
+<li> <a href="Release Notes.html">Release Notes</a></li>
+<li> <a href="Release Notes.html#Release+Notes-Key Changes">New features and bugfixes</a></li>
+<li> <a href="Webwork - version 2.1 Dependencies.html">Dependencies</a></li>
+</ol></li>
+<li> Upgrading from previous versions<ol>
+<li> <a href="Upgrading from 2.0.html">Upgrading from 2.0</a></li>
+<li> <a href="Upgrading from 1.4.html">Upgrading from 1.4</a></li>
+</ol></li>
+</ol>
+<h3 class="heading3"> 3. Tutorial <a name="Documentation-Tutorial" ></a></h3><ol>
+<li> <a href="TutorialLesson01.html">Lesson 1: Downloading and Installing WebWork</a></li>
+<li> <a href="TutorialLesson02.html">Lesson 2: Setting up the Web Application</a></li>
+<li> <a href="TutorialLesson03.html">Lesson 3: Actions and Results</a></li>
+<li> <a href="TutorialLesson04.html">Lesson 4: Views</a> (JSP, Velocity, Freemarker)</li>
+<li> <a href="TutorialLesson05.html">Lesson 5: Interceptors</a></li>
+</ol>
+<h3 class="heading3"> 4. Reference Guide</h3><ol>
+<li> <a href="Configuration.html">Configuration</a> <a name="Documentation-Configuration" ></a></li>
+<li> <a href="Inversion of Control.html">Inversion of Control</a></li>
+<li> <a href="JSP Tags.html">JSP Tags</a></li>
+<li> <a href="Result Types.html">Result Types</a></li>
+<li> <a href="Type Conversion.html">Type Conversion</a></li>
+<li> <a href="Validation.html">Validation</a></li>
+<li> <a href="OGNL.html">OGNL</a></li>
+<li> <a href="Internationalization.html">Internationalization</a></li>
+</ol>
+<h3 class="heading3"> 5. Third-party integration</h3><ol>
+<li> <a href="Sitemesh.html">Sitemesh</a></li>
+<li> <a href="Spring.html">Spring</a></li>
+<li> <a href="Pico.html">Pico</a></li>
+<li> <a href="Hibernate.html">Hibernate</a></li>
+<li> <a href="JUnit.html">JUnit</a></li>
+<li> <a href="Quartz.html">Quartz</a></li>
+</ol></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>
+<html>
+    <head>
+        <title>FAQ</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><b class="strong">How do I get the latest version of Webwork and XWork from CVS?</b><br/>
+cvs -d :pserver:guest@cvs.dev.java.net:/cvs login<br/>
+(Use an empty password, just hit enter..)<br/>
+cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout webwork<br/>
+cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout xwork</p>Note: WebWork from the CVS does not compile with the latest 1.5 J2sdk. Use the stable J2sdk 1.4.2.<p class="paragraph"><b class="strong">How do I build the latest versions XWork and Webwork?</b><br/>
+Just go into the XWork or WebWork directories and run &#039;ant&#039; (you must have ant installed and have the jars of junit and clover inside $ANT_HOME/lib)</p>Once you have built the xwork.jar copy it into the webwork/lib/core folder, and delete the old one.<p class="paragraph"><b class="strong">How do I use messages from within the validator?</b>
+<div class="code"><pre>&lt;validators&gt;&#10;    &lt;field name=&quot;name&quot;&gt;&#10;        &lt;field&#45;validator type=&quot;requiredstring&quot;&gt;&#10;            &lt;message key=&quot;template.name.errors.required&quot;&gt;A default message in case the key is not found&lt;/message&gt;&#10;        &lt;/field&#45;validator&gt;&#10;    &lt;/field&gt;&#10;&lt;/validators&gt;</pre></div></p><b class="strong">How do I set a global resource bundle?</b><p class="paragraph">Java class (thanks Drew McAuliffe):
+<div class="code"><pre><span class="java&#45;keyword">public</span> class WebworkGlobalMessagesListener <span class="java&#45;keyword">implements</span> ServletContextListener &#123;&#10;    <span class="java&#45;keyword">private</span> <span class="java&#45;keyword">static</span> Logger log = Logger.getLogger(WebworkGlobalMessagesListener.class);&#10;    <span class="java&#45;keyword">private</span> <span class="java&#45;keyword">static</span> <span class="java&#45;keyword">final</span> <span class="java&#45;object">String</span> DEFAULT&#95;RESOURCE = &quot;global&#45;messages&quot;;&#10;&#10;    /&#42;&#42;&#10;     &#42; Uses the LocalizedTextUtil to load messages from the global&#10;     message bundle.&#10;     &#42; &#64;see&#10;     javax.servlet.ServletContextListener#contextInitialized(javax.servlet.Servle&#10;     tContextEvent)&#10;     &#42;/&#10;    <span class="java&#45;keyword">public</span> void contextInitialized(ServletContextEvent arg0) &#123;&#10;        log.info(&quot;Loading global messages from &quot; &#43; DEFAULT&#95;RESOURCE);&#10;        LocalizedTextUtil.addDefaultResourceBundle(DEFAULT&#95;RESOURCE);&#10;        log.info(&quot;Global messages loaded.&quot;);&#10;    &#125;&#10;&#10;    /&#42;&#42;&#10;     &#42; &#64;see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)&#10;     &#42;/&#10;    <span class="java&#45;keyword">public</span> void contextDestroyed(ServletContextEvent arg0) &#123;&#10;&#10;        // <span class="java&#45;keyword">do</span> nothing&#10;    &#125;&#10;&#10;&#125;</pre></div><br/>
+web.xml:<br/>
+(under listeners section)
+<div class="code"><pre>&lt;listener&gt;&#10;&lt;listener&#45;class&gt;mypackagename.WebworkGlobalMessagesListener&lt;/listener&#45;class&gt;&#10;&lt;/listener&gt;</pre></div></p><b class="strong">How do I change the error message for invalid inputted fields?</b><br/>
+You need to create a message for that field, for example if you have a user.dob field you would use this in your messages file (see above for example on setting a global messages file):<br/>
+invalid.fieldvalue.user.dob=Please enter Date of Birth in the correct format.<p class="paragraph"><b class="strong">How do I get access to the Session?</b><br/>
+ActionContext.getContext().getSession() (returns Map, works internally using a ThreadLocal)</p><b class="strong">How can I see all parameters passed into the Action?</b><br/>
+ActionContext.getParameters() (returns Map, works internally using a ThreadLocal)<p class="paragraph"><b class="strong">How can I get the HttpServletRequest?</b><br/>
+ServletActionContext.getRequest() (works internally using a ThreadLocal)</p><b class="strong">How can I use the IOC container to initialize a component in another object that isnt an action?</b><br/>
+Obtain the ComponentManager from the request: ComponentManager cm = (ComponentManager) ServletActionContext.getRequest().getAttribute(&quot;DefaultComponentManager&quot;);<br/>
+then you need to initialize it using: cm.initializeObject(Object)<p class="paragraph"><b class="strong">How do I decouple XWork LocalizedTextUtil global resource bundle loading from serlvets (ServletContextListener)?</b><br/>
+If you&#039;re using XWork outside a Web context, then use whatever startup hooks you have in that context (i.e. application start for a desktop app) to add the global resource bundle. This is a startup activity, so use whatever mechanisms are provided in the context you&#039;re running in.</p><b class="strong">What i need to do to put values in a combobox. If I am using webwork2?</b><br/>
+If i have :
+<div class="code"><pre>#tag(Select &quot;label=&#039;xxx &#039;&quot; &quot;name=&#039;xxx&#039;&quot; &quot;list=&#63;&quot;)&#10;or &#10;#tag(combobox &quot;label=&#039;Prioridade&#039;&quot; &quot;name=&#039;inavis.avisTpPrioridade&#039;&quot; &quot;list=&#63;&quot;)</pre></div><br/>
+the values in this combobox, what i need to do?<br/>
+Exemple:
+<div class="code"><pre>html tag i use to <span class="java&#45;keyword">do</span>&#58;&#10;&#10;&lt;select..&gt;&#10;  &lt;otpion value=&quot;&quot; selected&gt;XXX&lt;/option&gt;&#10;&lt;/selct&gt;</pre></div><br/>
+so...i need to do this using Webwork tags from Velocity...how can i do this??<p class="paragraph"><b class="strong">How do I add I18N to a UI tag, like ww:textfield?</b>
+<div class="code"><pre>&lt;ww&#58;textfield label=&quot;&#039;i18n.label&#039;&quot; name=&quot;&#039;label1&#039;&quot; value=&quot;&#039;&#039;&quot;&gt;</pre></div><br/>
+This will get the localized text message for the key &quot;i18n.label&quot; and put it in the label.
+<div class="code"><pre>&lt;ww&#58;textfield label=&quot;getText(&#039;i18n.label&#039;)&quot; name=&quot;&#039;label1&#039;&quot; value=&quot;&#039;&#039;&quot;&gt;</pre></div></p>Alternatively, you could modify controlheader.vm and copy it to /template/xhtml. There you could make it so that it automatically does a call to $stack.findValue(&quot;getText($parameters.label)&quot;), making the first example actually work for i18n.<p class="paragraph"><b class="strong">Can I add I18N outside the Action&#039;s context? i.e. adding i18n to some JSP using the ww taglib?</b><br/>
+Yes, use the &lt;ww:i18n&gt; tag to push a resource bundle on to the stack. Now calls with &lt;ww:text/&gt; or &lt;ww:property value=&quot;getText(...)&quot;/&gt; will read from that resource bundle.</p><b class="strong">Can I break up my large XWork.xml file into smaller pieces?</b><br/>
+Sure, that&#039;s what the &lt;include&gt; element is for. Most xwork.xml files<br/>
+already have one: 
+
+<div class="code"><pre>&lt;xwork&gt;&#10;    &lt;include file=&quot;webwork&#45;<span class="java&#45;keyword">default</span>.xml&quot;/&gt;&#10;    &lt;include file=&quot;config&#45;browser.xml&quot;/&gt;&#10;    &lt;<span class="java&#45;keyword">package</span> name=&quot;<span class="java&#45;keyword">default</span>&quot; <span class="java&#45;keyword">extends</span>=&quot;webwork&#45;<span class="java&#45;keyword">default</span>&quot;&gt;&#10;....&#10;    &lt;/<span class="java&#45;keyword">package</span>&gt;&#10;    &lt;include file=&quot;other.xml&quot;/&gt;&#10;&lt;/xwork&gt;</pre></div><p class="paragraph">This tells it to load the webwork-default.xml from the webwork jar file<br/>
+to get all of those interceptor and result definitions.</p>You can put your own &lt;include&gt; in your xwork.xml interchangeably with<br/>
+&lt;package&gt; elements&#8230; They will be loaded in the same order as it reads<br/>
+from top to bottom and adds things as it reads them.
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Getting Started.html

+<html>
+    <head>
+        <title>Getting Started</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">This site is geared towards developers that have an understanding towards certain technologies.  Before diving into how Webwork works and running demos, it is recommended that you review the concepts below:<ul type="square" class="minus">
+<li> Java</li>
+<li> Servlets, JSP, and Tag Libraries</li>
+<li> JavaBeans</li>
+<li> HTML and HTTP</li>
+<li> Web Containers (ex. Tomcat)</li>
+<li> XML</li>
+</ul>
+<h4 class="heading4"> Website &amp; downloads <a name="Getting+Started-Website&downloads" ></a></h4></p>This site is set up with many features.  Here are links to help you around:
+<ul type="square" class="minus">
+<li> <span class="nobr"><a href="https://webwork.dev.java.net/servlets/ProjectDocumentList">Download Webwork<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - download Webwork Distribution</li>
+<li> <span class="nobr"><a href="http://www.opensymphony.com/contact.jsp">Webwork Mailing List<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - <span class="nobr"><a href="https://webwork.dev.java.net/servlets/SummarizeList?listName=dev">Browse mail archive<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> or <span class="nobr"><a href="mailto:dev@webwork.dev.java.net">post a question<sup><img src="./icons/mail_small.gif" height="12" width="13" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>. The list is full of active developers, contributors, and power users.  This is the best and quickest way to get a question answered.</li>
+<li> <span class="nobr"><a href="https://webwork.dev.java.net/source/browse/webwork">CVS<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - Browse CVS and source at java.net</li>
+<li> <span class="nobr"><a href="http://wiki.opensymphony.com/display/WW/WebWork">Webwork Wiki<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - Powered by <span class="nobr"><a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer">Confluence<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>, the professional J2EE wiki</li>
+<li> <span class="nobr"><a href="http://jira.opensymphony.com/secure/BrowseProject.jspa?id=10030">Webwork Bugs &amp; Issues<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - Powered by <span class="nobr"><a href="http://www.atlassian.com/software/jira">JIRA:Bug &amp; Issue Traking System<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> <span class="nobr"><a href="http://www.opensymphony.com">OpenSymphony Home<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+</ul>
+<h4 class="heading4"> What&#039;s included in the distro <a name="Getting+Started-included in distro" ></a></h4><p class="paragraph">The distribution contains the following directory layout:</p><div class="preformatted"><div class="preformattedContent">
+<pre>docs/&#10;lib/&#10;src/&#10;src/template/&#10;webwork&#45;(VERSION).jar&#10;webwork&#45;example.war&#10;webwork&#45;migration.jar</pre>
+</div></div><p class="paragraph">The docs directory contains the current Javadocs, the document you are reading, as well as JUnit reports for the build.  The lib directory contains the required as well as the optional dependencies for Webwork:</p><div class="preformatted"><div class="preformattedContent">
+<pre>lib/&#10;      core/&#10;      migration/&#10;      optional/</pre>
+</div></div><p class="paragraph">Note that none of the optional packages are required to use Webwork.  If you wish to use certain features such as JasperReports and FreeMarker results, you must include the optional packages.</p>Webwork also comes packaged with all the source files and the templates for the JSP tags.<p class="paragraph"><h4 class="heading4"> Installing <a name="Getting+Started-Installing" ></a></h4></p>The following illustrates how your web application should be set up.  Copy the webwork-(VERSION).jar, all the *.jar files in /lib/core and any necessary optional *.jar files in /lib/optional to your webapp/lib directory.  Also, copy the /src/template directory into your webapp/ directory.  Your webapp should look similar to this:
+
+<div class="code"><pre>/mywebapp/&#10;/mywebapp/template/&#10;/mywebapp/META&#45;INF/&#10;/mywebapp/WEB&#45;INF/&#10;/mywebapp/WEB&#45;INF/classes/&#10;/mywebapp/WEB&#45;INF/lib/&#10;/mywebapp/WEB&#45;INF/lib/CORE&OPTIONAL &#42;.jar&#10;/mywebapp/WEB&#45;INF/web.xml</pre></div><p class="paragraph">Onward to <a href="Documentation.html#Documentation-Configuration">Configuration</a> or the <a href="Documentation.html#Documentation-Tutorial">Webwork Tutorial</a></p><h4 class="heading4"> Running demos <a name="Getting+Started-Running demos" ></a></h4><p class="paragraph">In order to run webwork applications and demos, you need to have a servlet/jsp engine. If you don&#039;t, we suggest you learn about <span class="nobr"><a href="http://jakarta.apache.org/tomcat/">Apache Tomcat<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>, which is a free Servlet container from the Apache Jakarta Project, or Resin, from <span class="nobr"><a href="http://www.caucho.com/">Caucho Technology<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>, which is free for non-comercial use.  Once you a Servlet container setup, you can install the webwork example applications (*.war) and any other demos by placing the .war file inside the containers webapp directory.  Example of location with tomcat:
+<div class="code"><pre>&lt;TOMCAT&#95;HOME&gt;/webapps/webwork&#45;example.war</pre></div><br/>
+After the war file is in the correct location, start your web container and access your application through a web browser with the following url.</p><b class="strong">http://</b><cite class="citation">HOST:PORT</cite><b class="strong">/webwork-example</b>
+
+
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Global results.html

+<html>
+    <head>
+        <title>Global results</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">Global results allows you to define result mappings which will be used as defaults for all action configurations and will be automatically inherited by all action configurations in this package and all packages which extend this package.  In other words, if you have the same result specified within multiple actions, then you can define it as a global result.
+<h5 class="heading5"> global results example</h5>
+<div class="code"><pre>&lt;<span class="java&#45;keyword">package</span> name=&quot;<span class="java&#45;keyword">default</span>&quot;&gt;&#10;....&#10;&lt;global&#45;results&gt; &#10;    &lt;result name=&quot;login&quot; type=&quot;dispatcher&quot;&gt; &#10;        &lt;param name=&quot;location&quot;&gt;login.jsp&lt;/param&gt; &#10;    &lt;/result&gt; &#10;&lt;/global&#45;results&gt; &#10;&lt;action name=&quot;foo&quot;  class=&quot;mypackage.fooAction&quot;&gt;&#10;    &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;bar.jsp&lt;/result&gt; &#10;&lt;/action&gt;&#10;&lt;action name=&quot;submitForm&quot;  class=&quot;mypackage.submitFormAction&quot;&gt;&#10;    &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;submitSuccess.jsp&lt;/result&gt; &#10;&lt;/action&gt;&#10;...&#10;&lt;/<span class="java&#45;keyword">package</span>&gt;</pre></div><br/>
+Same thing
+<div class="code"><pre>&lt;<span class="java&#45;keyword">package</span> name=&quot;<span class="java&#45;keyword">default</span>&quot;&gt;&#10;....&#10;&lt;action name=&quot;foo&quot;  class=&quot;mypackage.fooAction&quot;&gt;&#10;    &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;bar.jsp&lt;/result&gt; &#10;    &lt;result name=&quot;login&quot; type=&quot;dispatcher&quot;&gt;login.jsp&lt;/result&gt; &#10;&lt;/action&gt;&#10;&lt;action name=&quot;submitForm&quot;  class=&quot;mypackage.submitFormAction&quot;&gt;&#10;    &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;submitSuccess.jsp&lt;/result&gt;&#10;    &lt;result name=&quot;login&quot; type=&quot;dispatcher&quot;&gt;login.jsp&lt;/result&gt;  &#10;&lt;/action&gt;&#10;...&#10;&lt;/<span class="java&#45;keyword">package</span>&gt;</pre></div></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Hibernate.html

+<html>
+    <head>
+        <title>Hibernate</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">There&#039;s nothing more that you have to do use Hibernate with WebWork than with other Web framework.  Just setup Hibernate according to the <span class="nobr"><a href="http://www.hibernate.org/5.html">&#104;ttp://www.hibernate.org/5.html<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span>.  However, there&#039;re a number of good patterns that people have used successfully in the following projects:
+<ul class="star">
+<li> AdminApp <span class="nobr"><a href="http://www.hibernate.org/159.html#a5">&#104;ttp://www.hibernate.org/159.html#a5<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+<li> Petsoar <span class="nobr"><a href="http://www.wiley.com/legacy/compbooks/walnes">&#104;ttp://www.wiley.com/legacy/compbooks/walnes<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span></li>
+</ul></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Interceptors.html

+<html>
+    <head>
+        <title>Interceptors</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2"> Overview</h2>
+<br clear="all" />Interceptors are objects that dynamically intercept Action invocations. They provide the developer with the opportunity to define code that can be executed before and/or after the execution of an action. They also have the ability to prevent an action from executing. Interceptors provide developers a way to encapulate common functionality in a re-usable form that can be applied to one or more Actions. See <a href="http://wiki.opensymphony.com//display/XW/Interceptors">XW:Interceptors</a> for further details.  Below describes built in Webwork interceptors.<br/>
+<br clear="all" /><h3 class="heading3"> Webwork &amp; XWork Interceptors</h3>
+<br clear="all" />Interceptor classes are also defined using a key-value pair specified in the xwork configuration file.  The names specified below come specified in <a href="webwork-default.xml.html">webwork-default.xml</a>.  If you extend the webwork-default package, then you can use the names below.  Otherwise they must be defined in your package with a name-class pair specified in the &lt;interceptors&gt; tag.<br/>
+<br clear="all" /></p><table class="wikitable">
+<tr>
+<th>Name</th><th>Description</th>
+</tr><tr>
+<td>timer</td><td>Outputs how long the action (including nested interceptors and view) takes to execute</td>
+</tr><tr>
+<td>logger</td><td>Outputs the name of the action</td>
+</tr><tr>
+<td>chain</td><td>Makes the previous action&#039;s properties available to the current action. Commonly used together with &lt;result type=&quot;chain&quot;&gt; (in the previous action.)</td>
+</tr><tr>
+<td>static-params</td><td>Sets the xwork.xml defined parameters onto the action.  These are the &lt;param&gt; tags that are direct children of the &lt;action&gt; tag.</td>
+</tr><tr>
+<td>params</td><td>Sets the request parameters onto the action.</td>
+</tr><tr>
+<td>model-driven</td><td>If the action implements ModelDriven, pushes the getModel() result onto the valuestack.</td>
+</tr><tr>
+<td>component</td><td>Enables and makes the components available to the Actions. Refer to components.xml</td>
+</tr><tr>
+<td>token</td><td>Checks for valid token presence in action, prevents duplicate form submission </td>
+</tr><tr>
+<td>token-session</td><td>Same as above, but storing the submitted data in session when handed an invalid token</td>
+</tr><tr>
+<td>validation</td><td>Performs validation using the validators defined in &#123;Action&#125;-validation.xml</td>
+</tr><tr>
+<td>workflow</td><td>Calls the validate method in your action class.  If action errors created then it returns the INPUT view.</td>
+</tr><tr>
+<td>servlet-config</td><td>Give access to HttpServletRequest and HttpServletResponse (think twice before using this since this ties you to the Servlet api)</td>
+</tr><tr>
+<td>prepare</td><td>If the action implements Preparable, calls its prepare() method.</td>
+</tr><tr>
+<td>conversionError </td><td> adds conversion errors from the ActionContext to the Action&#039;s field errors </td>
+</tr>
+</table><br/>
+For more information about the chain interceptor, see <a href="Chaining Interceptor.html">WW:Chaining Interceptor</a>.
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Internationalization.html

+<html>
+    <head>
+        <title>Internationalization</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">WebWork supports internationalization (in short, i18n) in two different places: the UI tags and the action/field error messages.
+<ul type="square" class="minus">
+<li> <a href="UI Tags.html">UI Tags</a></li>
+<li> <a href="Validation Examples.html">Validation Examples</a></li>
+</ul><br/>
+Resource bundles are searched in the following order:
+<ul class="star">
+<li> ActionClass.properties</li>
+<li> BaseClass.properties (all the way to Object.properties)</li>
+<li> Interface.properties (every interface and sub-interface)</li>
+<li> package.properties (every of every base class, all the way to java/lang/package.properties)</li>
+</ul><br/>
+To display i18n text, you can use a call to getText() in the property tag, or any other tag such as the UI tags (this is especially useful for labels of UI tags):</p><div class="code"><pre>&lt;ww&#58;property value=&quot;getText(&#039;some.key&#039;)&quot;/&gt;</pre></div><p class="paragraph">You may also use the text tag:</p><div class="code"><pre>&lt;ww&#58;text name=&quot;&#039;some.key&#039;&quot;/&gt;</pre></div><p class="paragraph">Also, note that there is an i18n tag that will push a resource bundle on to the stack, allowing you to display text that would otherwise not be part of the resource bundle search hierarchy mentioned previously.</p><div class="code"><pre>&lt;ww&#58;i18n name=&quot;some/package/bundle&quot;&gt;&#10;    &lt;ww&#58;text name=&quot;&#039;some.key&#039;&quot;/&gt;&#10;&lt;/ww&#58;i18n&gt;</pre></div><p class="paragraph"><h2 class="heading2"> Using a master application catalog</h2></p>Struts users should be familiar with the application.properties resource bundle, where you can put all the messages in the application that are going to be translated. WebWork2, though, splits the resource bundles per action or model class, and you may end up with duplicated messages in those resource bundles. A quick fix for that is to create a file called ActionSupport.properties in com/opensymphony/xwork and put it on your classpath. This will only work well if all your actions subclass ActionSupport.<p class="paragraph">If this is not the case, another solution is to create a ServletContextListener and have it call LocalizedTextUtil.addDefaultResourceBundle(String resourceBundleName). You can also use a Servlet that&#039;s initialized on startup to do that.</p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Inversion of Control.html

+<html>
+    <head>
+        <title>Inversion of Control</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">Inversion of control is a way to handle dependencies of objects. In WebWork, objects that are have their dependencies managed are called &quot;components&quot;. For an overview of of Inversion of Control (also referred to now as Dependency Injection), please read Martin Fowler&#039;s article on IoC at <span class="nobr"><a href="http://www.martinfowler.com/articles/injection.html.">&#104;ttp://www.martinfowler.com/articles/injection.html.<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> Besides WebWork&#039;s IoC container, there are numerous other containers available for you to use, including <a href="Spring.html">Spring</a> and <a href="Pico.html">Pico</a>.
+<ul class="star">
+<li> <a href="IoC Overview.html">IoC Overview</a></li>
+<li> <a href="Xwork's Component Architecture.html">Xwork&#039;s Component Architecture</a></li>
+<li> <a href="Components.html">How Webwork Uses Components</a></li>
+<li> <a href="IoC Configuration.html">Configuration of Components in Webwork and XWork</a></li>
+</ul></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/IoC Configuration.html

+<html>
+    <head>
+        <title>IoC Configuration</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2">Configuration - web.xml</h2></p>To configure WebWork&#039;s component management, the following lines must be added in the appropriate places to web.xml:
+
+<div class="code"><pre>&lt;filter&gt;&#10;    &lt;filter&#45;name&gt;container&lt;/filter&#45;name&gt;&#10;    &lt;filter&#45;class&gt;com.opensymphony.webwork.lifecycle.RequestLifecycleFilter&lt;/filter&#45;class&gt;&#10;&lt;/filter&gt;&#10;&#10;&lt;filter&#45;mapping&gt;&#10;   &lt;filter&#45;name&gt;container&lt;/filter&#45;name&gt;&#10;   &lt;url&#45;pattern&gt;&#42;.action&lt;/url&#45;pattern&gt; &lt;&#33;&#45;&#45; modify appropriately &#45;&#45;&gt;&#10;&lt;/filter&#45;mapping&gt;&#10;&#10;&lt;listener&gt;&#10;    &lt;listener&#45;class&gt;com.opensymphony.webwork.lifecycle.SessionLifecycleListener&lt;/listener&#45;class&gt;&#10;&lt;/listener&gt;&#10;&#10;&lt;listener&gt;&#10;    &lt;listener&#45;class&gt;com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener&lt;/listener&#45;class&gt;&#10;&lt;/listener&gt;</pre></div><p class="paragraph">These settings allow WebWork to manage components across the application, session and request scopes. Note that even if one or more of the scopes are not required by your application, all three scopes need to be specified in web.xml for WebWork&#039;s component management to function correctly.</p><h2 class="heading2">Configuration - xwork.xml</h2><p class="paragraph">The ComponentInterceptor class is used to apply the IoC pattern to XWork actions (ie, to supply components to actions). The ComponentInterceptor should be declared in the &lt;interceptors&gt; block of xwork.xml as follows:</p><div class="code"><pre>&lt;interceptor name=&quot;component&quot;&#10;        class=&quot;com.opensymphony.xwork.interceptor.component.ComponentInterceptor&quot;/&gt;</pre></div><p class="paragraph">You should ensure that any actions that are to be supplied with components have this interceptor applied. (See OS:XWork Interceptors for information on how to apply interceptors to actions.)<br/>
+If you want to apply IoC to objects other than actions or other components, you will need to use the ComponentManager object directly.</p>Note too, that the ComponentInterceptor is applied as part of the webwork defaultStack. Thus, if you are applying the defaultStack to the action, you would include the ComponentInterceptor.<p class="paragraph"><h2 class="heading2">Configuration - components.xml</h2></p>The components.xml file is used to specify the components that are to be available. The components specified here are loaded into XWork&#039;s ComponentManager and are then made available to any actions that are an instance of the specified enabler. The components.xml file must be placed in the root of the classpath (ie, in the WEB-INF/classes directory).<br/>
+Here is an example components.xml file that configures a Counter component. The Counter object will live in session scope, and will be passed to any objects that are enabled due to their implementing the CounterAware interface:
+
+<div class="code"><pre>&lt;components&gt;&#10;    &lt;component&gt;&#10;        &lt;scope&gt;session&lt;/scope&gt;&#10;        &lt;class&gt;com.opensymphony.webwork.example.counter.Counter&lt;/class&gt;&#10;        &lt;enabler&gt;com.opensymphony.webwork.example.counter.CounterAware&lt;/enabler&gt;&#10;    &lt;/component&gt;&#10;&lt;/components&gt;</pre></div><p class="paragraph">Each component must have the following three attributes:
+<ul class="star">
+<li> <em class="emphasis">scope</em>: Valid values are <em class="emphasis">application</em>, <em class="emphasis">session</em> and <em class="emphasis">request</em>. This determines the component&#039;s lifetime. Application scope components will be created when the webapp starts up, and they will survive for the whole lifetime of the webapp. Session scoped components exist for the duration of a user session, while components in request scope only last for the duration of a single client request.</li>
+<li> <em class="emphasis">class</em>: This specifies the component&#039;s class. An instance of this object will live for the duration of the specified scope, and will be made available to any actions (or other code) as required. Note that components are lazy-loaded, so if nothing makes use of the component during its lifetime, the component will never actually be instantiated. At the moment components must have a zero argument constructor.</li>
+<li> <em class="emphasis">enabler</em>: Any actions that are an instanceof the enabler class or interface will be passed an instance of the component.</li>
+</ul></p>Note that while components are allowed to have dependencies on other components they must not depend on another component that is of a narrower scope. So for example, a session component cannot depend on a component that is only of request scope.
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/IoC Overview.html

+<html>
+    <head>
+        <title>IoC Overview</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2"> Overview</h2></p>In many applications you have component objects that are required by a given class to use. In a nutshell, the IoC pattern allows a parent object (in the case of Webwork, XWork&#039;s ComponentManager instance) to give a resource Object to the action Object that needs it (usually an action, but it could be any object that implements the appropriate <em class="emphasis">enabler</em>) rather than said Object&#039;s needing to obtain the resource itself.<p class="paragraph">There are two ways of implementing IoC: Instantiation and using an enabler interface. With instantiation, a given action Object is instantiated with the resource Object as a constructor parameter. With enablers interfaces, the action will have an interface with a method, say &quot;setComponent(ComponentObject r);&quot; that will allow the resource to be passed to said action Object after it is instantiated. The  ComponentObject is passed, because the Object implements the given interface. XWork uses <em class="emphasis">enablers</em> to pass components.</p><h2 class="heading2"> Why IoC?</h2><p class="paragraph">So why is IoC useful? It means that you can develop components (generally services of some sort) in a top-down fashion, without the need to build a registry class that the client must then call to obtain the component instance.</p>Traditionally when implementing services you are probably used to following steps similar to these:<ol>
+<li> Write the component (eg an ExchangeRateService)</li>
+<li> Write the client class (eg an XWork action)</li>
+<li> Write a registry class that holds the component object (eg Registry)</li>
+<li> Write code that gives the component object to the registry (eg Registry.registerService(new MyExchangeRateService()))</li>
+<li> Use the registry to obtain the service from your client class (eg ExchangeRateService ers = Registry.getExchangeRateService())</li>
+<li> Make calls to the component from the client class (eg String baseCurrencyCode = ers.getBaseCurrency())</li>
+</ol><br/>
+Using IoC, the process is reduced to the following:<ol>
+<li> Write the component class (eg an ExchangeRateService)</li>
+<li> Register the component class with XWork (eg componentManager.addEnabler(MyExchangeRateService, ExchangeRateAware))</li>
+<li> Write the client class, making sure it implements the enabling interface (eg an XWork action that implements ExchangeRateAware)</li>
+<li> Access the component instance directly from your client action (eg String baseCurencyCode = ers.getBaseCurrency())</li>
+</ol><br/>
+More advantages of Inversion of Control are the following:<ol>
+<li> Testability - You can more easily test your objects by passing mock objects using the enabler method rather than needing to create full containers that allow your objects to get the components they need.</li>
+<li> A component describes itself. When you instantiate a component, you can easily determine what dependencies it requires without looking at the source or using trial and error.</li>
+<li> Dependencies can be discovered easily using reflection. This has many benefits ranging from diagram generation to runtime optimization (by determining in advance which components will be needed to fufill a request and preparing them asyncronously, for example).</li>
+<li> Avoids the super-uber-mega-factory pattern where all the components of the app are held together by a single class that is directly tied back to other domain specific classes, making it hard to &#039;just use that one class&#039;.</li>
+<li> Adheres to Law of Demeter. Some people think this is silly, but in practise I&#039;ve found it works much better. Each class is coupled to only what it actually uses (and it should never use too much) and no more. This encourages smaller responsibility specific classes which leads to cleaner design.</li>
+<li> Allows context to be isolated and explicitly passed around. ThreadLocals may be ok in a web-app, but they aren&#039;t well suited for high concurrency async applications (such as message driven applications).</li>
+</ol>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/JSP Tags.html

+<html>
+    <head>
+        <title>JSP Tags</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h1 class="heading1">WebWork&#039;s Supported Views - JSP</h1></p>JavaServer Pages (JSP) is an important view technology that WebWork (WW) supports. This section provides you the building blocks you need to use JSP as a view technology.<p class="paragraph"><b class="strong">Reference Pages</b><ol>
+<li> <a href="Non-UI Tags.html">Non-UI Tags</a></li>
+<li> <a href="UI Tags.html">UI Tags</a><ol>
+<li> <a href="Templates.html">Templates</a> (how UI tags render html)</li>
+<li> <a href="Themes.html">Themes</a></li>
+</ol></li>
+</ol>
+<h2 class="heading2">Background</h2></p>So what is JSP? From a technical perspective, JSP is &quot;a page created by the web developer that includes JSP technology-specific tags, declarations, and possibly scriptlets, in combination with other static (HTML or XML) tags. A JSP page has the extension .jsp; this signals to the web server that the JSP engine will process elements on this page.&quot; See JSP for more info.<p class="paragraph">In addition, JSP &quot;provides a simplified, fast way to create web pages that display dynamically-generated content. The JSP specification, developed through an industry-wide initiative led by Sun Microsystems, defines the interaction between the server and the JSP page, and describes the format and syntax of the page.&quot; See JSP for more info.</p>So you create your first JSP and deploy it to your web server. The first time a user requests your page, your servlet runner such as Tomcat will compile the JSP into a servlet class and use this class to render your web page to the user. So, if the end result of this work is a servlet, why not just write a servlet? Because servlets don&#039;t offer you an easy means of abstracting web presentation from web content. In the early days, people developed web sites exclusively with servlets. A developer would use the servlet to dynamically output HTML code. The typical way of doing this was to write out HTML code - out.write(&quot;&lt;HTML&gt;..);. This approach became a nightmare to maintain and costly to develop since it required a Java developer.<p class="paragraph">When JSP technology arrived, developers began using this new technology for their presentation. The early JSP specification had limited support for custom tags so early adopters would write Java scriptlets and JavaScript to create dynamic sites. Mixing Java and HTML was less than ideal because the Java code itself is within tags. This makes the JSP difficult to read and comprehend. This approach does work and may be fine for simple sites but it is less than adequate for complex sites. Complex sites require the ability to abstract the design and its logic to a form that is manageable and maintainable.</p>JSP has since matured and now provides rich support for custom tags. Developers are now writing libraries of custom tags to perform simple and complex tasks. These custom tags abstract functionality in a simple semantic form that is consistent with HTML or XML. With well-written JSP tags, web developers can develop and maintain complex web sites with NO Java code in their JSP.<p class="paragraph"><h2 class="heading2">WebWork&#039;s JSP tags</h2></p>Writing custom tags can at first be a daunting task but no worries, WW provides an extensive JSP tag library to help you develop web sites from simple to complex. This tag library is grouped into <a href="Non-UI Tags.html">Non-UI Tags</a> and <a href="UI Tags.html">UI Tags</a>. The major difference between the two is that UI tags have an implied JSP template associated with them that will render HTML form controls or a set of HTML tags to produce a composite output such as a table. These templates are just defaults and will probably be all you need for your development needs. But if you need more, WW gives you the ability to override the default and insert your own template. In addition, you can group templates together under a directory and logically refer to the directory as a theme.<p class="paragraph">Themes give you the ability to skin your web site. A skin doesn&#039;t just mean different graphics, colors, etc. but it can mean different views for different browsing technologies. For instance, you might have a theme for WAP, HTML, and DHTML.</p>Non-UI tags provide support for control flow, internationalization, WW&#039;s Actions, iterators, text, JavaBeans and more.<p class="paragraph">A more exchaustive description of the tags can be found in the appendix on the WW taglib: <a href="Non-UI Tags.html">Non-UI Tags</a>, <a href="UI Tags.html">UI Tags</a>.</p><h2 class="heading2">An example</h2><p class="paragraph">The best way to introduce how to use JSP as a view technology with WW is to walk through a simple but complete example. The example we will examine in detail is Webshop app which you can find on the index.jsp page if you deployed WW&#039;s examples. WW provides many examples to give you a better understanding of its features and capabilities. Webshop app is a good example to review because it utilizes an array of WW features.</p>Before we jump into the details of the example, lets look at the application&#039;s use case. Listed below is a simple normal flow of a shopper purchasing a CD.
+<ol>
+<li> Webshop app use case flow User selects desired language.</li>
+<li> User is presented with a list of CDs. This list is an aggregate of album, artist, and price for each CD.</li>
+<li> User adds CD to their shopping cart by selecting desired CD and quantity.</li>
+<li> User continues to add or remove CDs from their shopping cart.</li>
+<li> User checks out when they want to make a purchase and the shopping cart contents are displayed to the user.</li>
+<li> Use can shop again if desired.</li>
+</ol>
+<h3 class="heading3">Step 1 - User selects desired language</h3><p class="paragraph">So lets begin walking through this application. When you select this application from the example index page, its link points to webwork/i18n/index.jsp. Upon examining this page, we learn that it forwards the user to an action - i18n.Language.action. By default, WW maps URIs with *.action pattern to servlet ServletDispatcher. This class is responsible to retrieve an appropriate Action class and execute it. If the result of the execution is assigned a view (JSP), then the user will be forwarded to this view.</p>ServletDispatcher&#039;s task of determining an appropriate action begins with the URI of the request. In our case, the dispatcher is passed the URI i18n.Language.action. This URI maps directly to an action class named Language in the webwork.action.test.i18n package. Notice that our URI was not webwork.action.test.i18n.Language.action as it actually is packaged but just i18n.Language.action. The reason is that we redefined webwork.action.packages property in our webwork.properties file with the line shown below. This override allows us to drop webwork.action.test prefix from any action reference.
+
+<div class="code"><pre>webwork.action.packages=webwork.action.test, webwork.action.standard</pre></div><p class="paragraph">Now lets examine action Language. The first thing we discover is that it extends Shop which extends ActionSupport. This class is a base class that you will extend most of the time. This class gives you access to a set of useful functionality that we will see used later. In addition, it provides the default flow of execution. Actions by default will have their execute method called when an URI or alias maps to it. When execute is called on ActionSupport, it determines if the URI was suffixed with a command such as !foo. foo in this example is the command you want executed. This command will be translated into a doFoo() method call that ActionSupport will call on your action. This allows you to call specific methods on your action.</p>Now lets examine action Language. The first thing we discover is that it extends Shop which extends ActionSupport. This class is a base class that you will extend most of the time. This class gives you access to a set of useful functionality that we will see used later. In addition, it provides the default flow of execution. Actions by default will have their execute method called when an URI or alias maps to it. When execute is called on ActionSupport, it determines if the URI was suffixed with a command such as !foo. foo in this example is the command you want executed. This command will be translated into a doFoo() method call that ActionSupport will call on your action. This allows you to call specific methods on your action.<p class="paragraph">Our URL was not a command, so ActionSupport will first call doValidate() method if you provide one. This allows you to perform validation before execution begins. Since we don&#039;t have this method, ActionSupport then calls our doExecute(). For our example, Language checks to see if you have set a desired language. Since we have not, it returns ERROR. The servlet dispatcher will now check the view mappings for i18n.Language.error. Looking at views.properties located in WEB-INF/classes, we find a section of mappings for our application shown below. For our error, we see that the alias maps to langauge.jsp. So the dispatcher will forward the user to that page.</p>Webshop view mapping:
+
+<div class="code"><pre># Webshop (I18N example adaptation)&#10;i18n.Shop.success=shop.jsp&#10;i18n.Add.success=shop.jsp&#10;i18n.Delete.success=shop.jsp&#10;i18n.Checkout.success=checkout.jsp&#10;i18n.Language.success=shop.jsp&#10;i18n.Language.error=language.jsp&#10;i18n.Restart.success=shop.jsp&#10;i18n.Cart.success=cart.jsp&#10;i18n.CDList.success=cdlist.jsp</pre></div><p class="paragraph">So what really happens when my action is fetched? By default, WW is setup with DefaultActionFactory as your ActionFactory. This factory chains together other factories that get called trying to fulfill the request of retrieving the desired action.</p>Take for example our Language action. The servlet dispatcher will call DefaultActionFactory and ask it to return the appropriate action. The factory then places this request on the chain. Once on the chain, each factory will either ignore the request and pass it up the chain, do some processing on the action and pass it up the chain, and/or return the action. Listed below is the chain of factory proxies that comprises DefaultActionFactory.
+<ol>
+<li> ParametersActionFactoryProxy - This proxy will call action setters for matching parameters.</li>
+<li> PrepareActionFactoryProxy - This proxy will call prepare() method on action. This will allow actions to do any preparation work needed before validation or execution.</li>
+<li> ContextActionFactoryProxy - This proxy will set action&#039;s context. Actions can implement *Aware interfaces that will tell this proxy what to set on your action.</li>
+<li> CommandActionFactoryProxy - This proxy will strip the command from the URI and set the command on the action.</li>
+<li> AliasingActionFactoryProxy - This proxy will retrieve the appropriate action name if the URI was an alias.</li>
+<li> JspActionFactoryProxy - This proxy will wrap a JSP and make it an action.</li>
+<li> PrefixActionFactoryProxy - This proxy will use the prefixes setup in the properties file to find the appropriate action class.</li>
+<li> XMLActionFactoryProxy - This proxy will retrieve the an XML action if required.</li>
+<li> ScriptActionFactoryProxy - This proxy will wrap a JavaScript and execute it.</li>
+<li> JavaActionFactory - This proxy will return the appropriate Java action object.</li>
+</ol><br/>
+As you can see, a lot is happening under the hood of DefaultActionFactory. So lets return back to our example beginning on language.jsp where we are to select our desired langauge. On this page, the user is presented with a radio list of languages. Lets take a closer look at the code to render this control.
+
+<div class="code"><pre>&lt;webwork&#58;action name=&quot;&#039;i18n.LanguageList&#039;&quot;&gt;&#10;   &lt;ui&#58;radio label=&quot;&#039;Language&#039;&quot; name=&quot;&#039;language&#039;&quot; list=&quot;languages&quot;/&gt;&#10;&lt;/webwork&#58;action&gt;</pre></div><p class="paragraph">First notice the non-UI action tag. This tag will execute the action LanguageList. On execution, this class will load a locale-to-language mapping and save it to its attribute languages. The tag will then place this action object on the ValueStack so its body can reference it.</p>Now look at the UI tag radio. This tag will create an HTML INPUT control of type radio. The name of the control will be language, the label for the control will be Language. The values to display in the control will come from a method getLanguages() called on LanguageList action. The tag then iterates over the map using the keys for the VALUE parameter of the INPUT tag and the values for the displayed text.<p class="paragraph">The user now selects their desired language and submits the form. The form is submitted to Language again. This time a request parameter language is sent with the request. When the appropriate action is fetched again, the ParametersActionFactoryProxy will call all setter methods on the action for the request parameters passed in. This means action Language will have its setLanguage() method called. Now, when doExecute() is called we discover that the user has selected a language, which we will use to create the appropriate locale and place it in the user&#039;s session.</p><div class="code"><pre>session.put(&quot;locale&quot;, locale);</pre></div><p class="paragraph">Notice how easy it was to put information into the session. But where did this attribute come from? Remember that our action extends Shop and this class implements SessionAware. Because it is SessionAware it will have its setSession() method called providing the action with a map of the user&#039;s session. Now that we placed the locale in the session, we return SUCCESS. The dispatcher will look up the alias i18n.Language.success and see it maps to shop.jsp. The user will now be forwarded to this page to begin shopping.</p><h3 class="heading3">Step 2 - User is presented with a list of CDs</h3><p class="paragraph">In this step the user has already selected their language and their locale is in their session. They are now on shop.jsp. Examining the code on this page we see several uses of a non UI tag text. This tag provides the ability to fetch strings from resource bundles. The tag will recognize our locale and use the appropriate resource bundle to retrieve the correct language text.</p><div class="code"><pre>&lt;webwork&#58;text name=&quot;&#039;main.title&#039;&quot;/&gt;</pre></div><p class="paragraph">We also notice that this page includes another page i18n.CDList.action. The non UI tag include will invoke action CDList and upon success will include view cdlist.jsp in the shop.jsp. Action CDList will load a list of CDs from a text file into a list. After the CDs are loaded we now turn our attention to cdlist.jsp</p><div class="code"><pre>CD&#58;&lt;webwork&#58;include page=&quot;i18n.CDList.action&quot;  /&gt;</pre></div><p class="paragraph">cdlist.jsp will provide a HTML SELECT form control. In this example, we build an HTML control instead of using WW&#039;s UI tag select. We use WW&#039;s non UI tag iterator to build the select control. This tag allows us to iterate over the cd list. So where did the cd list come from? Remember, that we called action CDList beforehand. After the action was called, WW placed this action on the ValueStack for reference by the view. So, WW will look for a method named getCDList() which it will find on action CDList. This method returns a list that the iterator tag will iterate over. Each iteration will output a HTML OPTION tag. Also notice the non UI tag property. For each member in the list, the property tag is retrieving album, artist, and country from the CD. Also notice that the last property is using action ComputePrice to determine the appropriate price for the CD. The semantic @pricer/computePrice(price) means use the object defined by parameter pricer and call its method getComputePrice passing in the CD&#039;s price as a parameter. Pretty cool. <img src="./icons/emoticons/smile.gif" height="20" width="20" align="absmiddle" alt="" border="0"/></p><div class="code"><pre>&lt;webwork&#58;action name=&quot;&#039;webwork.action.test.i18n.ComputePrice&#039;&quot; id=&quot;pricer&quot;/&gt;&#10;&#10;&lt;select name=&quot;album&quot;&gt;&#10;   &lt;webwork&#58;iterator value=&quot;CDList&quot;&gt;&#10;   &lt;option value=&quot;&lt;webwork&#58;property value=&quot;album&quot;/&gt;&quot;&gt;&#10;      &lt;webwork&#58;property value=&quot;album&quot;/&gt;,&#10;      &lt;webwork&#58;property value=&quot;artist&quot;/&gt;, &lt;webwork&#58;property value=&quot;country&quot;/&gt;,&#10;      &lt;webwork&#58;property value=&quot;&#64;pricer/computePrice(price)&quot;/&gt;&#10;   &lt;/option&gt;&#10;   &lt;/webwork&#58;iterator&gt;&#10;&lt;/select&gt;</pre></div><p class="paragraph">Now back to shop.jsp. Examining the code further reveals another interesting aspect. Look at the UI tag textfield&#039;s label attribute shown below. Notice the attribute&#039;s value is a method call text(&#039;main.qtyLabel&#039;). This method will retrieve an appropriate string from our resource bundle. But what action has a getText() method? Remember that action Shop extends ActionSupport. This action provides this method.</p><div class="code"><pre>&lt;ui&#58;textfield label=&quot;text(&#039;main.qtyLabel&#039;)&quot; name=&quot;&#039;quantity&#039;&quot; value=&quot;1&quot; size=&quot;3&quot;/&gt;</pre></div><p class="paragraph">The last thing of interest about JSP shop.jsp is it includes the users shopping cart at the end.</p><div class="code"><pre>&lt;webwork&#58;include value=&quot;&#039;cart.jsp&#039;&quot;  /&gt;</pre></div><p class="paragraph">When cart.jsp (shown below) is included it retrieves user&#039;s cart items shown in the code below. The attribute value of value translates into a couple of method calls getCart()/getItems(). The first method is called on action Shop which returns a Cart and then the next method is called on Cart. If the first method call does not retrieve a cart, Shop will create one with no items and place it in the user&#039;s session.</p><div class="code"><pre>&lt;webwork&#58;property value=&quot;cart/items&quot;&gt;&#10;&lt;webwork&#58;<span class="java&#45;keyword">if</span> test=&quot;.&quot;&gt;&#10;&#10;    &lt;center&gt;&#10;    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100&#37;&quot; bgcolor=&#039;&lt;webwork&#58;text name=&quot;&#039;cart.bgcolor&#039;&quot;/&gt;&#039;&gt;&#10;    &lt;tr&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;text name=&quot;&#039;cd.albumLabel&#039;&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;text name=&quot;&#039;cd.artistLabel&#039;&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;text name=&quot;&#039;cd.countryLabel&#039;&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;text name=&quot;&#039;cd.priceLabel&#039;&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;text name=&quot;&#039;cd.quantityLabel&#039;&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;/td&gt;&#10;   &lt;/tr&gt;&#10;&#10;&lt;webwork&#58;action name=&quot;&#039;i18n.ComputePrice&#039;&quot; id=&quot;pricer&quot;/&gt;&#10;&lt;webwork&#58;iterator&gt;&#10;   &lt;tr&gt;&#10;      &lt;webwork&#58;property value=&quot;cd&quot;&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;property value=&quot;album&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;property value=&quot;artist&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;property value=&quot;country&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;property value=&quot;&#64;pricer/computePrice(price)&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;/webwork&#58;property&gt;&#10;&#10;      &lt;td&gt;&lt;b&gt;&lt;webwork&#58;property value=&quot;quantity&quot;/&gt;&lt;/b&gt;&lt;/td&gt;&#10;      &lt;td&gt;&#10;         &lt;form action=&quot;i18n.Delete.action&quot; method=&quot;post&quot;&gt;&#10;           &lt;input type=submit value=&#039;&lt;webwork&#58;text name=&quot;&#039;cart.delLabel&#039;&quot;/&gt;&#039;&gt;&#10;           &lt;input type=hidden name=&quot;album&quot; value=&#039;&lt;webwork&#58;property value=&quot;cd/album&quot;/&gt;&#039;&gt;&#10;         &lt;/form&gt;&#10;      &lt;/td&gt;&#10;   &lt;/tr&gt;&#10;&lt;/webwork&#58;iterator&gt;&#10;&#10;   &lt;/table&gt;&#10;   &lt;p&gt;&#10;   &lt;p&gt;&#10;   &lt;form action=&quot;i18n.Checkout.action&quot;  method=&quot;post&quot;&gt;&#10;        &lt;input type=&quot;submit&quot; value=&#039;&lt;webwork&#58;text name=&quot;&#039;cart.checkoutLabel&#039;&quot;/&gt;&#039;&gt;&#10;   &lt;/form&gt;&#10;  &lt;/center&gt;&#10;&#10;&lt;/webwork&#58;<span class="java&#45;keyword">if</span>&gt;&#10;&lt;/webwork&#58;property&gt;</pre></div><p class="paragraph"><h3 class="heading3">Step 3 - User adds CD to their shopping cart</h3></p>Now the user sees a list of CDs specific to their locale. The user selects a CD and enters a quantity and submits the form. The form is submitted to i18n.Add.action which maps to action Add. Again, parameters posted will be set on this action. For our scenario, this will be quantity and album. Then the action&#039;s doExecute() method is called and it retrieve&#039;s the user&#039;s shopping cart and adds the cd to it. The action then returns SUCCESS which maps to view shop.jsp again. This time the user&#039;s shopping cart has contents so it will be displayed below the cd list.<p class="paragraph"><h3 class="heading3">Step 4 - User continues to add or remove CDs</h3></p>At this point, the user repeats the procedure of adding to and removing from their shopping cart. When they are done shopping, they then checkout.<p class="paragraph"><h3 class="heading3">Step 5 - User checks out</h3></p>At this stage, the user is done shopping and has decided to checkout. The post of this form is to i18n.Checkout.action. This maps to aciton Checkout. This action will determine the total cost of the contents in the user&#039;s shopping cart and sets its attribute totalPrice. The action returns SUCCESS which maps to to view checkout.jsp. This view will display the user&#039;s shopping cart contents along with its total price.<p class="paragraph"><h3 class="heading3">Step 6 - User can shop again if desired.</h3></p>At this stage, the user has checked out and if they want they can begin shopping again. If they choose to start again, they select the HREF which points to i18n.Restart.action. This action will remove the user&#039;s shopping cart and return SUCCESS which will map to view shop.jsp to start this process all over again.<p class="paragraph"><h2 class="heading2">Summary</h2></p>Hopefully, this example gave you a good start at understanding what a JSP might look like using WW&#039;s features. This example was not meant to be an exhaustive discovery of WW but just an introduction. There are other examples you can walk through on your own to provide additional insight into WW. In addition, you will want to read the sections referenced below for more specific documentation covering WW&#039;s features. 
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>
+<html>
+    <head>
+        <title>JUnit</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">There&#039;s a number of approaches you can take to unit-test your WebWork actions.</p><h2 class="heading2"> The simplest is to instantiate your actions, call setters then execute().  This allows you to bypass all the complicated container setup.</h2><p class="paragraph">Taken from Petsoar:
+<div class="code"><pre><span class="java&#45;keyword">package</span> org.petsoar.actions.inventory;&#10;&#10;<span class="java&#45;keyword">import</span> com.mockobjects.constraint.IsEqual;&#10;<span class="java&#45;keyword">import</span> com.mockobjects.dynamic.C;&#10;<span class="java&#45;keyword">import</span> com.mockobjects.dynamic.Mock;&#10;<span class="java&#45;keyword">import</span> com.opensymphony.xwork.Action;&#10;<span class="java&#45;keyword">import</span> junit.framework.TestCase;&#10;<span class="java&#45;keyword">import</span> org.petsoar.pets.Pet;&#10;<span class="java&#45;keyword">import</span> org.petsoar.pets.PetStore;&#10;&#10;<span class="java&#45;keyword">public</span> class TestViewPet <span class="java&#45;keyword">extends</span> TestCase &#123;&#10;    <span class="java&#45;keyword">private</span> Mock mockPetStore;&#10;    <span class="java&#45;keyword">private</span> ViewPet action;&#10;&#10;    <span class="java&#45;keyword">protected</span> void setUp() <span class="java&#45;keyword">throws</span> Exception &#123;&#10;        mockPetStore = <span class="java&#45;keyword">new</span> Mock(PetStore.class);&#10;        PetStore petStore = (PetStore) mockPetStore.proxy();&#10;&#10;        action = <span class="java&#45;keyword">new</span> ViewPet();&#10;        action.setPetStore(petStore);&#10;    &#125;&#10;&#10;    <span class="java&#45;keyword">public</span> void testViewPet() <span class="java&#45;keyword">throws</span> Exception &#123;&#10;        Pet existingPet = <span class="java&#45;keyword">new</span> Pet();&#10;        existingPet.setName(&quot;harry&quot;);&#10;        existingPet.setId(1);&#10;&#10;        Pet expectedPet = <span class="java&#45;keyword">new</span> Pet();&#10;        expectedPet.setName(&quot;harry&quot;);&#10;        expectedPet.setId(1);&#10;&#10;        mockPetStore.expectAndReturn(&quot;getPet&quot;, C.args(<span class="java&#45;keyword">new</span> IsEqual(<span class="java&#45;keyword">new</span> <span class="java&#45;object">Long</span>(1))), existingPet);&#10;        action.setId(1);&#10;&#10;        <span class="java&#45;object">String</span> result = action.execute();&#10;&#10;        assertEquals(Action.SUCCESS, result);&#10;        assertEquals(expectedPet, existingPet);&#10;        mockPetStore.verify();&#10;    &#125;&#10;&#10;    <span class="java&#45;keyword">public</span> void testViewPetNoId() <span class="java&#45;keyword">throws</span> Exception &#123;&#10;        mockPetStore.expectAndReturn(&quot;getPet&quot;, C.ANY&#95;ARGS, <span class="java&#45;keyword">null</span>);&#10;&#10;        <span class="java&#45;object">String</span> result = action.execute();&#10;&#10;        assertEquals(Action.ERROR, result);&#10;        assertEquals(1, action.getActionErrors().size());&#10;        assertEquals(&quot;Invalid pet selected.&quot;, action.getActionErrors().iterator().next());&#10;        assertNull(action.getPet());&#10;        mockPetStore.verify();&#10;    &#125;&#10;&#10;    <span class="java&#45;keyword">public</span> void testViewPetInvalidId() <span class="java&#45;keyword">throws</span> Exception &#123;&#10;        action.setId(&#45;1);&#10;        testViewPetNoId();&#10;    &#125;&#10;&#125;</pre></div></p><h2 class="heading2"> Test interceptors and/or result types</h2><p class="paragraph">Check out the test suites in XWork/WebWork.  These are pretty comprehensive and provide a good starting point.  For example,  this is how the <b class="strong">ParametersInterceptor</b> is tested:</p><div class="code"><pre><span class="java&#45;keyword">public</span> void testDoesNotAllowMethodInvocations() &#123;&#10;    Map params = <span class="java&#45;keyword">new</span> HashMap();&#10;    params.put(&quot;&#64;java.lang.<span class="java&#45;object">System</span>&#64;exit(1).dummy&quot;, &quot;dumb value&quot;);&#10;&#10;    HashMap extraContext = <span class="java&#45;keyword">new</span> HashMap();&#10;    extraContext.put(ActionContext.PARAMETERS, params);&#10;&#10;    <span class="java&#45;keyword">try</span> &#123;&#10;        ActionProxy proxy = ActionProxyFactory.getFactory().&#10;               createActionProxy(&quot;&quot;, MockConfigurationProvider.MODEL&#95;DRIVEN&#95;PARAM&#95;TEST, extraContext);&#10;        assertEquals(Action.SUCCESS, proxy.execute());&#10;&#10;        ModelDrivenAction action = (ModelDrivenAction) proxy.getAction();&#10;        TestBean model = (TestBean) action.getModel();&#10;&#10;        <span class="java&#45;object">String</span> property = <span class="java&#45;object">System</span>.getProperty(&quot;webwork.security.test&quot;);&#10;        assertNull(property);&#10;    &#125; <span class="java&#45;keyword">catch</span> (Exception e) &#123;&#10;        e.printStackTrace();&#10;        fail();&#10;    &#125;&#10;&#125;</pre></div>
+<p class="paragraph">Note: these are not the ONLY ways so make your own judgement.</p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Mailing Lists.html

+<html>
+    <head>
+        <title>Mailing Lists</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">The Webwork mailing list is open to developers and end users.  The list is hosted at <span class="nobr"><a href="http://webwork.dev.java.net/servlets/ProjectMailingListList">&#104;ttp://webwork.dev.java.net/servlets/ProjectMailingListList<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> in message-by-message and digest format.  The archive of this list is also available from this page, so please search past postings before posting a message.</p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Namespaces.html

+<html>
+    <head>
+        <title>Namespaces</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h3 class="heading3"> Namespaces</h3></p>The namespace attribute allows you to segregate action configurations into namespaces, so that you may use the same action alias in more than one namespace with different classes, parameters, etc. This is in contrast to Webwork 1.x, where all action names and aliases were global and could not be re-used in an application. The default namespace, which is &quot;&quot; (an empty string) is used as a &quot;catch-all&quot; namespace, so if an action configuration is not found in a specified namespace, the default namespace will also be searched. This allows you to have global action configurations outside of the &quot;extends&quot; hierarchy, as well as to allow the previous Webwork 1.x behavior by not specifying namespaces. It is also intended that the namespace functionality can be used for security, for instance by having the path before the action name be used as the namespace by the Webwork 2.0 ServletDispatcher, thus allowing the use of J2EE declarative security on paths to be easily implemented and maintained. <p class="paragraph"><h4 class="heading4"> Namespace example</h4></p><div class="code"><pre>&lt;<span class="java&#45;keyword">package</span> name=&quot;<span class="java&#45;keyword">default</span>&quot;&gt;&#10;&#10;    &lt;action name=&quot;foo&quot; class=&quot;mypackage.simpleAction&gt;&#10;        &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;greeting.jsp&lt;/result&gt;&#10;    &lt;/action&gt;&#10;    &lt;action name=&quot;bar&quot; class=&quot;mypackage.simpleAction&quot;&gt; &#10;        &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;bar1.jsp&lt;/result&gt; &#10;    &lt;/action&gt; &#10;&#10;&lt;/<span class="java&#45;keyword">package</span>&gt;&#10;&#10;&#10;&lt;<span class="java&#45;keyword">package</span> name=&quot;mypackage&quot; namespace=&quot;/barspace&quot;&gt; &#10;&#10;    &lt;action name=&quot;bar&quot; class=&quot;mypackage.simpleAction&quot;&gt; &#10;        &lt;result name=&quot;success&quot; type=&quot;dispatcher&quot;&gt;bar2.jsp&lt;/result&gt; &#10;    &lt;/action&gt; &#10;&#10;&lt;/<span class="java&#45;keyword">package</span>&gt;</pre></div><br/>
+If a request for /barspace/bar.action is made, then the package named mypackage is searched and the bar action is executed.  If success is returned, then bar2.jsp is displayed. <p class="paragraph"><ins class="inserted">Note:</ins> If a request is made to /barspace/foo.action, the action foo will be searched for in a namespace of /barspace.  If the action is not found, the action will then be searched for in the default namespace.  Unless specified, the default namespace will be &quot;&quot;.  In our example above, their is no action foo in the namespace /barspace, therefore the default will be searched and /foo.action will be executed.</p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Non-UI Tags.html

+<html>
+    <head>
+        <title>Non-UI Tags</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><a name="Non-UI+Tags-top" ></a><br/>
+These are tags that interact with the value stack, and control the logic of the page.</p><table class="wikitable">
+<tr>
+<th>	Tag Name					</th><th>	Description	</th>
+</tr><tr>
+<td>	<b class="strong"><a href="#Non-UI+Tags-Common">Common Tags</a></b></td><td> </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-param">&lt;ww:param /&gt;</a>					</td><td>	Add parameters to tags that support it </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-property">&lt;ww:property /&gt;</a>					</td><td>	Fetches a value and prints it </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-push">&lt;ww:push /&gt;</a>					</td><td>	Add an object of your choice to the top of the value stack </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-set">&lt;ww:set /&gt;</a>						</td><td>	Create your own named variables </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-url">&lt;ww:url /&gt;</a>						</td><td>	Builds an encoded URL </td>
+</tr><tr>
+<td>	<b class="strong"><a href="#Non-UI+Tags-Componentisation">Componentisation Tags</a></b>	</td><td> </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-action">&lt;ww:action /&gt;</a>					</td><td>	Provides another method to call Actions </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-bean">&lt;ww:bean /&gt;</a>					</td><td>	Instantiate a bean that can be used to access functionality  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-include">&lt;ww:include /&gt;</a>					</td><td>	Used to include another page or action </td>
+</tr><tr>
+<td>	<b class="strong"><a href="#Non-UI+Tags-Flow-Control">Flow-Control Tags</a></b></td><td> </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-if">&lt;ww:if /&gt;</a>						</td><td>	Used to determine if a statement is true or false  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-elseif">&lt;ww:elseif /&gt;</a>					</td><td>	Used to determine if a statement is true or false after a previous test.  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-else">&lt;ww:else /&gt;</a>					</td><td>	Used to determine if the preceding statement was false  </td>
+</tr><tr>
+<td>	<b class="strong"><a href="#Non-UI+Tags-Iteration">Iteration Tags</a></b>	</td><td> </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-iterator">&lt;ww:iterator /&gt;</a>				</td><td>	Iterate over a value  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-generator">&lt;ww:generator /&gt;</a>				</td><td>	Create Iterator  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-append">&lt;ww:append /&gt;</a>					</td><td>	Append a list of iterators  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-subset">&lt;ww:subset /&gt;</a>					</td><td>	Iterate over a portion of an iterable object </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-merge">&lt;ww:merge /&gt;</a>					</td><td>	Merge several iterators into one  </td>
+</tr><tr>
+<td>	<a href="#Non-UI+Tags-sort">&lt;ww:sort /&gt;</a>					</td><td>	Sort an iterator   </td>
+</tr>
+</table><br/>
+<a name="Non-UI+Tags-Common" ></a>
+<h2 class="heading2"> Common Tags</h2><p class="paragraph"><a name="Non-UI+Tags-param" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:param /&gt;</b></font></h3></p>Allows you to add parameters to tags that support adding parametric tags. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>value</td><td>no</td><td>This attribute is used to pass data to the tag.</td>
+</tr><tr>
+<td>name</td><td>no</td><td>The name of the action to invoke. </td>
+</tr>
+</table><br/>
+You can place param tags within the body of parametric supporting tags and param will add its parameter to its parent. It evaluates the body as the value if no value is given.<p class="paragraph">In this example, each param will add its parameter to Counter. This means param will call Counter&#039;s appropriate setter method.</p><div class="code"><pre>&lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot; id=&quot;year&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;first&#039;&quot; value=&quot;text(&#039;firstBirthYear&#039;)&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;2000&quot;/&gt;&#10;&#10;  &lt;ui&#58;combobox label=&quot;&#039;Birth year&#039;&quot; size=&quot;6&quot; maxlength=&quot;4&quot; name=&quot;&#039;birthYear&#039;&quot; list=&quot;#year&quot;/&gt;&#10;&lt;/ww&#58;bean&gt;</pre></div>
+<p class="paragraph"><a name="Non-UI+Tags-property" ></a><br/>
+<a href="#Non-UI+Tags-top">return to top</a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:property /&gt;</b></font></h3></p>The property tag fetches a value and prints it
+
+<table class="wikitable">
+<tr>
+<th>attribute</th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>value</td><td>no</td><td>This attribute is used to pass data to the tag.</td>
+</tr><tr>
+<td>escape</td><td>no</td><td>Determines if the contents should be escaped appropriately for valid HTML characters </td>
+</tr>
+</table><br/>
+Some examples will illustrate these different uses:
+
+<div class="code"><pre>Print getX().getY() &#10;&lt;ww&#58;property value=&quot;x.y&quot;/&gt;</pre></div><p class="paragraph">HTML characters will be escaped by default, whereas the contents of property tags with bodies will not be escaped.  This behavior can be overridden by explicitly setting the escape attribute. Quoted text that is escaped will have its outer quotes stripped.</p>Note also that if the property tag has an empty body, it behaves the same as having no body and prints the value, though both spaces and carriage returns constitute nonempty content.
+<p class="paragraph"><a name="Non-UI+Tags-push" ></a><br/>
+<a href="#Non-UI+Tags-top">return to top</a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:push /&gt;</b></font></h3></p>Using ww:push, you can add an object of your choice to the top of the value stack. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>value</td><td><b class="strong">yes</b></td><td>This attribute is used to pass data to the tag.</td>
+</tr>
+</table><p class="paragraph">This is similar to what you can do with ww:set (see below), so read both before deciding which to use.</p><div class="code"><pre>&lt;ww&#58;push value=&quot;counter&quot;&gt;&#10;  &lt;ww&#58;property value=&quot;count&quot;/&gt;&#10;&lt;/ww&#58;push&gt;</pre></div><p class="paragraph">To make an action available on the stack:</p><div class="code"><pre>&lt;ww&#58;action name=&quot;&#039;SomeAction&#039;&quot; id=&quot;sa&quot;/&gt;&#10;&lt;ww&#58;push value=&quot;#sa&quot;&gt;&#10; foo = &lt;ww&#58;property value=&quot;foo&quot;/&gt;&#10;&lt;/ww&#58;push&gt;</pre></div>
+
+<p class="paragraph"><a name="Non-UI+Tags-set" ></a><br/>
+<a href="#Non-UI+Tags-top">return to top</a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:set /&gt;</b></font></h3></p>You can create your own named variables from within a JSP using the ww:set tag. Reference your variable later using the # variableName notation. 
+   
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>name </td><td><b class="strong">yes</b></td><td>Unique name for the variable, accessed as &quot;#name&quot;.</td>
+</tr><tr>
+<td>value</td><td>no</td><td>This attribute is used to pass data to the tag.</td>
+</tr><tr>
+<td>scope</td><td>no</td><td>Scope of the variable: page, stack, application, session</td>
+</tr>
+</table><br/>
+Sets the value of an object in the VS to a scope (page, stack, application, session). If the value is not given, the top of the stack is used. If the scope is not given, the default scope of &quot;webwork&quot; is used. <p class="paragraph"><a name="Non-UI+Tags-url" ></a><br/>
+<a href="#Non-UI+Tags-top">return to top</a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:url /&gt;</b></font></h3></p>Url builds an encoded URL. If you do not include a value, then the tag will point to the current page.
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>value</td><td>no</td><td>This attribute is used to pass data to the tag.</td>
+</tr><tr>
+<td> includeContext </td><td>no</td><td>Determines whether the context path should be prepended to absolute urls or not. Default is true </td>
+</tr><tr>
+<td> encode </td><td>no</td><td>Determines if the contents should be escaped appropriately for valid HTML characters </td>
+</tr><tr>
+<td> includeParams </td><td>no</td><td>The includeParams attribute may have the value &#039;none&#039; (no params), &#039;get&#039;(only GET params) or &#039;all&#039;(GET and POST params). It is used when the url tag is used without a value or page attribute. Its value is looked up on the ValueStack. If no includeParams is specified then &#039;get&#039; is used.</td>
+</tr>
+</table><br/>
+In this example, the form action value will be an url hiturl.action that is encoded. 
+
+<div class="code"><pre>&lt;form action=&quot;&lt;ww&#58;url value=&quot;&#039;hiturl.action&#039;&quot;/&gt;&quot; method=&quot;POST&quot;&gt;&#10;    ...&#10;  &lt;/form&gt;</pre></div><p class="paragraph">In this example, we are adding name/value pairs to the URL. The URL tag will build up the URL appropriately. You can also place them in the normal way with &quot;?&quot;; i.e., - &#039;hiturl.action?user=john&#039;.</p><div class="code"><pre>&lt;form action=&quot;&lt;ww&#58;url value=&quot;&#039;hiturl.action&#039;&quot;&gt;&#10;      &lt;ww&#58;param name=&quot;&#039;user&#039;&quot; value=&quot;&#039;john&#039;&quot;/&gt;&#10;   &lt;/ww&#58;url&gt;&quot; method=&quot;POST&quot;&gt;&#10;...&#10;&lt;/form&gt;</pre></div><p class="paragraph"><a name="Non-UI+Tags-Componentisation" ></a>
+<h2 class="heading2"> Componentisation Tags</h2></p><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-action" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:action /&gt;</b></font></h3><p class="paragraph">Action tag provides another method to call Actions. This is an alternative way to invoke an action besides calling an url; i.e. - *.action that would be sent to the ServletDispatcher.</p><table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>name</td><td><b class="strong">yes</b></td><td>The name of the action to invoke. </td>
+</tr><tr>
+<td>namespace		</td><td>		no		</td><td>	Namespace of this action</td>
+</tr><tr>
+<td>executeResult	</td><td>		no		</td><td>	Whether to execute result </td>
+</tr>
+</table><p class="paragraph">If the <b class="strong">id</b> attribute is given, the executed action is assigned a name reference that can be later retrieved from the context &quot;<b class="strong">#id</b>&quot;.</p>In this example, the ClientInfo action will be executed and its methods will be used to retrieve information and perform a conditional test.
+
+<div class="code"><pre>&lt;ww&#58;action name=&quot;&#039;ClientInfo&#039;&quot; id=&quot;cinfo&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;detailedMode&quot; value=&quot;false&quot;/&gt;&#10;&lt;/ww&#58;action&gt;&#10;Browser&#58;&lt;ww&#58;property value=&quot;#cinfo.browser&quot;/&gt;&lt;br&gt;&#10;Version&#58;&lt;ww&#58;property value=&quot;#cinfo.version&quot;/&gt;&lt;br&gt;&#10;Supports GIF&#58;&lt;ww&#58;if test=&quot;#cinfo.supportsType(&#039;image/gif&#039;) == true&quot;&gt;Yes&lt;/ww&#58;if&gt;&#10;&lt;ww&#58;else&gt;No&lt;/ww&#58;else&gt;&lt;br&gt;</pre></div> <p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-bean" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:bean /&gt;</b></font></h3></p>Create a JavaBean and instantiate its properties. It is then placed in the ActionContext for later use.
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>name</td><td><b class="strong">yes</b></td><td>The name of the action to invoke. </td>
+</tr>
+</table><br/>
+In this example, Counter is used as a bean. We can now call the methods we desire. In this case, we setFirst() to first birth year which is 1975 and we setLast() to 2000. We then display a combo box using Counter as an Iterator. 
+
+<div class="code"><pre>&lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot; id=&quot;year&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;first&#039;&quot; value=&quot;text(&#039;firstBirthYear&#039;)&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;2000&quot;/&gt;&#10;&#10;  &lt;ui&#58;combobox label=&quot;&#039;Birth year&#039;&quot; size=&quot;6&quot; maxlength=&quot;4&quot; name=&quot;&#039;birthYear&#039;&quot; list=&quot;#year&quot;/&gt;&#10;&lt;/ww&#58;bean&gt;</pre></div>
+<p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-include" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:include /&gt;</b></font></h3></p>Used to include another page or action. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>page </td><td>no</td><td>Name of page or action.</td>
+</tr><tr>
+<td>value</td><td>no</td><td>This attribute is used to pass data to the tag.</td>
+</tr>
+</table><p class="paragraph">In this example, beaninfo.jsp will introspec on people[0] which is a Person. Take a look at beaninfo.jsp example and notice how it retrieves the parent value off the ValueStack with &quot;..&quot;.
+<div class="code"><pre>&lt;ww&#58;property value=&quot;people&#91;0&#93;&quot;&gt;&#10;  &lt;ww&#58;include value=&quot;&#039;beaninfo.jsp&#039;&quot;/&gt;&#10;&lt;/ww&#58;property&gt;</pre></div></p>In this example, an Action is invoked.
+<div class="code"><pre>&lt;h1&gt;RSS viewer&lt;/h1&gt;&#10;&lt;ww&#58;include value=&quot;&#039;rss.viewer.action&#039;&quot;/&gt;</pre></div>
+<p class="paragraph"><a name="Non-UI+Tags-Flow-Control" ></a>
+<h2 class="heading2"> Flow Control Tags</h2></p>   <a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-if" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:if /&gt;</b></font></h3>
+Used to determine if a statement is true or false. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>test</td><td><b class="strong">yes</b></td><td>This attribute is the conditional expression evaluated by WW&#039;s parser. It returns boolean true or false. </td>
+</tr>
+</table><br/>
+In this example, if will evaluate its body since the test condition is true. elseIf and else will not evaluate. 
+
+<div class="code"><pre>&lt;ww&#58;<span class="java&#45;keyword">if</span> test=&quot;<span class="java&#45;keyword">true</span> == <span class="java&#45;keyword">true</span>&quot;&gt;&#10;   &lt;b&gt;<span class="java&#45;keyword">if</span>&#58; Success&lt;/b&gt;&#10;&lt;/ww&#58;<span class="java&#45;keyword">if</span>&gt;&#10;&#10;&lt;ww&#58;elseIf test=&quot;<span class="java&#45;keyword">true</span> == <span class="java&#45;keyword">true</span>&quot;&gt;&#10;   &lt;b&gt;elseIf&#58; Failure&lt;/b&gt;&#10;&lt;/ww&#58;elseIf&gt;&#10;&#10;&lt;ww&#58;<span class="java&#45;keyword">else</span>&gt;&#10;   &lt;b&gt;<span class="java&#45;keyword">else</span>&#58; Failure&lt;/b&gt;&#10;&lt;/ww&#58;<span class="java&#45;keyword">else</span>&gt;</pre></div><p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-elseif" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:elseif /&gt;</b></font></h3></p>Used to determine if a statement is true or false after a previous test. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>test</td><td><b class="strong">yes</b></td><td>This attribute is the conditional expression evaluated by WW&#039;s parser. It returns boolean true or false. </td>
+</tr>
+</table><p class="paragraph">In this example, elseIf will evaluate its body since its test condition is true and if is false.</p><div class="code"><pre>&lt;ww&#58;<span class="java&#45;keyword">if</span> test=&quot;<span class="java&#45;keyword">true</span> == <span class="java&#45;keyword">false</span>&quot;&gt;&#10;   &lt;b&gt;<span class="java&#45;keyword">if</span>&#58; Failures&lt;/b&gt;&#10;&lt;/ww&#58;<span class="java&#45;keyword">if</span>&gt;&#10;&#10;&lt;ww&#58;elseIf test=&quot;<span class="java&#45;keyword">true</span> == <span class="java&#45;keyword">true</span>&quot;&gt;&#10;   &lt;b&gt;elseIf&#58; Success&lt;/b&gt;&#10;&lt;/ww&#58;elseIf&gt;&#10;&#10;&lt;ww&#58;<span class="java&#45;keyword">else</span>&gt;&#10;   &lt;b&gt;<span class="java&#45;keyword">else</span>&#58; Failure&lt;/b&gt;&#10;&lt;/ww&#58;<span class="java&#45;keyword">else</span>&gt;</pre></div><p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-else" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:else /&gt;</b></font></h3></p>Used to determine if the preceding statement was false. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr>
+</table><br/>
+In this exmaple, else will evaluate its body since both if and elseIf conditions are false. 
+
+<div class="code"><pre>&lt;ww&#58;<span class="java&#45;keyword">if</span> test=&quot;<span class="java&#45;keyword">true</span> == <span class="java&#45;keyword">false</span>&quot;&gt;&#10;   &lt;b&gt;<span class="java&#45;keyword">if</span>&#58; Failures&lt;/b&gt;&#10;&lt;/ww&#58;<span class="java&#45;keyword">if</span>&gt;&#10;&#10;&lt;ww&#58;elseIf test=&quot;<span class="java&#45;keyword">true</span> == <span class="java&#45;keyword">false</span>&quot;&gt;&#10;   &lt;b&gt;elseIf&#58; Failure&lt;/b&gt;&#10;&lt;/ww&#58;elseIf&gt;&#10;&#10;&lt;ww&#58;<span class="java&#45;keyword">else</span>&gt;&#10;   &lt;b&gt;<span class="java&#45;keyword">else</span>&#58; Success&lt;/b&gt;&#10;&lt;/ww&#58;<span class="java&#45;keyword">else</span>&gt;</pre></div><p class="paragraph"><a name="Non-UI+Tags-Iteration" ></a>
+<h2 class="heading2">Iteration Tags</h2></p>   <a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-iterator" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:iterator /&gt;</b></font></h3>
+<p class="paragraph">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, XML Node, or XML NodeList.</p><table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>status</td><td>no</td><td>This attribute indicates the name of the IteratorStatus object         to be exposed. An IteratorStatus allows one to get information about the status of the iteration, such         as the size, current index, and whether any more items are available. </td>
+</tr><tr>
+<td>value</td><td>no</td><td>This attribute is used to pass data to the tag.</td>
+</tr>
+</table><br/>
+In this example, iterator will iterate over Counter. property will output the current value which is 1 through 10. 
+
+<div class="code"><pre>&lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;10&quot;/&gt;&#10;&#10;  &lt;ww&#58;iterator&gt;&#10;    &lt;ww&#58;property/&gt;&lt;br /&gt;&#10;  &lt;/ww&#58;iterator&gt;&#10;&lt;/ww&#58;bean&gt;</pre></div><p class="paragraph">In this example, we use a couple of IteratorStatus to see where we are within iterations.</p><div class="code"><pre>&lt;h1&gt;Testing iterator status&lt;/h1&gt;&#10;&#10;&lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot; id=&quot;rowcounter&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;first&#039;&quot; value=&quot;0&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;&lt;/ww&#58;bean&gt;&#10;&#10;&lt;table border=&quot;1&quot;&gt;&#10;  &lt;ww&#58;iterator value=&quot;#rowcounter&quot; status=&quot;rowstatus&quot;&gt;&#10;  &lt;tr&gt;&#10;    &lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot; id=&quot;colcounter&quot;&gt;&#10;    	&lt;ww&#58;param name=&quot;&#039;first&#039;&quot; value=&quot;0&quot;/&gt;&#10;    	&lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;    &lt;/ww&#58;bean&gt;&#10;    &#10;    &lt;ww&#58;iterator value=&quot;#colcounter&quot; status=&quot;colstatus&quot;&gt;&#10;     &lt;&#33;&#45;&#45;&#10;        <span class="java&#45;keyword">if</span> it is (first row) or (first column) or (last row) then&#10;        output the column number.&#10;      &#45;&#45;&gt;&#10;      &lt;ww&#58;<span class="java&#45;keyword">if</span> test=&quot;#rowstatus.first==<span class="java&#45;keyword">true</span> || #colstatus.first==<span class="java&#45;keyword">true</span> || #rowstatus.last==<span class="java&#45;keyword">true</span>&quot;&gt;&#10;        &lt;th&gt;&lt;ww&#58;property value=&quot;#colstatus.count&quot;/&gt;&lt;/th&gt;&#10;      &lt;/ww&#58;<span class="java&#45;keyword">if</span>&gt;&#10;      &#10;      &lt;ww&#58;<span class="java&#45;keyword">else</span>&gt;&#10;        &lt;td&gt;&lt;ww&#58;property/&gt;&lt;/td&gt;&#10;      &lt;/ww&#58;<span class="java&#45;keyword">else</span>&gt;&#10;      &#10;    &lt;/ww&#58;iterator&gt;&#10;&#10;  &lt;/tr&gt;&#10;  &lt;/ww&#58;iterator&gt;&#10;&lt;/table&gt;</pre></div><p class="paragraph">Here we use the IteratorStatus determine every other row to insert an extra line break. This is very useful for shading alternate rows in an HTML table. Both even and odd attributes are available.</p><div class="code"><pre>&lt;ww&#58;iterator status=&quot;&#039;status&#039;&quot;&gt;&#10;   &lt;ww&#58;<span class="java&#45;keyword">if</span> test=&quot;#status.odd == <span class="java&#45;keyword">true</span>&quot;&gt; &lt;br /&gt; &lt;/ww&#58;<span class="java&#45;keyword">if</span>&gt;&#10;   &lt;br /&gt;&#10;&lt;/ww&#58;iterator&gt; &#10;&#10;Here we use the IteratorStatus determine every fourth row to insert an extra line <span class="java&#45;keyword">break</span>. &#10;&lt;ww&#58;iterator status=&quot;&#039;status&#039;&quot;&gt;&#10;  &lt;ww&#58;<span class="java&#45;keyword">if</span> test=&quot;#status.modulus(4) == 0&quot;&gt; &lt;br /&gt; &lt;/ww&#58;<span class="java&#45;keyword">if</span>&gt;&#10;  &lt;br /&gt;&#10;&lt;/ww&#58;iterator&gt;</pre></div><p class="paragraph">Following are the list of operations available on the status object:<ul class="star">
+<li> even : boolean - returns true if the current iteration is even</li>
+<li> odd : boolean - returns true if the current iteration is odd</li>
+<li> count : int - returns the count (1 based) of the current iteration</li>
+<li> index : int - returns the index (0 based) of the current iteration</li>
+<li> first : boolean - returns true if the iterator is on the first iteration</li>
+<li> last : boolean - returns true if the iteration is on the last iteration</li>
+<li> modulus(operand : int) : int - returns the current count (1 based) modulo the given operand</li>
+</ul></p>   <a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-generator" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:generator /&gt;</b></font></h3><p class="paragraph">Generate will create Iterators from val.</p><table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>count</td><td>no</td><td>This attribute indicates how many items there are.</td>
+</tr><tr>
+<td>separator</td><td>no</td><td>This attribute is the character the StringTokenizer will use to create tokens.</td>
+</tr><tr>
+<td>val</td><td><b class="strong">yes</b></td><td>This attribute is the list of values the generator should use to create tokens.</td>
+</tr>
+</table><p class="paragraph">In this example, two Iterators are created. One for val=&quot;&#039;foo,bar,xyzzy&#039;&quot; and the other for val=&quot;&#039; &#039;&quot;.</p><div class="code"><pre>&lt;h1&gt;Testing append, subset, and value generators&lt;/h1&gt;&#10;&#10;&lt;table border=&quot;1&quot;&gt;&#10;  &lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot;&gt;&#10;    &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;    &lt;ww&#58;iterator id=&quot;colcount&quot;&gt;&#10;      &lt;tr&gt;&#10;&#10;        &lt;&#33;&#45;&#45;&#10;           Generator will create an Iterator that has 5 items.&#10;           The first 3 are &quot;foo,bar,xyzzy&quot;. Item 4 and 5 will be&#10;           foo and bar respectively. If the count is more than&#10;           the items, you start over.&#10;        &#45;&#45;&gt;&#10;        &#10;        &lt;ww&#58;generator val=&quot;&#039;foo,bar,xyzzy&#039;&quot; separator=&quot;&#039;,&#039;&quot; count=&quot;#colcount&quot; id=&quot;values&quot;/&gt;&#10;&#10;       &lt;&#33;&#45;&#45;&#10;           Generator will create an Iterator that has infinite&#10;            . Count=&#45;1 means indefinite.&#10;        &#45;&#45;&gt;&#10;        &lt;ww&#58;generator val=&quot;&#039; &#039;&quot; count=&quot;&#45;1&quot; id=&quot;space&quot;/&gt;&#10;        &lt;ww&#58;append&gt;&#10;          &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#values&quot;/&gt;&#10;          &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#space&quot;/&gt;&#10;&#10;          &lt;ww&#58;subset count=&quot;6&quot;&gt;&#10;            &lt;ww&#58;iterator&gt;&#10;              &lt;td width=&quot;40&quot;&gt;&lt;ww&#58;property/&gt;&lt;/td&gt;&#10;            &lt;/ww&#58;iterator&gt;&#10;          &lt;/iterator&#58;subset&gt;&#10;        &lt;/iterator&#58;append&gt;&#10;      &lt;/tr&gt;&#10;    &lt;/ww&#58;iterator&gt;&#10;  &lt;/ww&#58;bean&gt;&#10;&lt;/table&gt;</pre></div><p class="paragraph"><img src="./icons/emoticons/warning.png" height="16" width="16" align="absmiddle" alt="" border="0"/> This tag is mostly superfluous, now that we can do this in OGNL:
+<div class="code"><pre>&lt;ww&#58;iterator value=&quot;&#123;1, 2, 3, 4&#125;&quot;&gt;&#10;&lt;/ww&#58;iterator&gt;</pre></div></p>   <a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-append" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:append /&gt;</b></font></h3><p class="paragraph">Append will append a list of iterators. The values of the iterators will be appended and treated as one iterator. The outputs from the iterator will be in the sequence the sources were added.</p><table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr>
+</table><p class="paragraph">In this example, the two iterators #values and #spaces are appended. This means #spaces values are after #values.</p><div class="code"><pre>&lt;h1&gt;Testing append, subset, and value generators&lt;/h1&gt;&#10;&#10;&lt;table border=&quot;1&quot;&gt;&#10;  &lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot;&gt;&#10;    &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;    &lt;ww&#58;iterator id=&quot;colcount&quot;&gt;&#10;      &lt;tr&gt;&#10;        &lt;ww&#58;generator val=&quot;&#039;foo,bar,xyzzy&#039;&quot; separator=&quot;&#039;,&#039;&quot; count=&quot;#colcount&quot; id=&quot;values&quot;/&gt;&#10;        &lt;ww&#58;generator val=&quot;&#039; &#039;&quot; count=&quot;&#45;1&quot; id=&quot;space&quot;/&gt;&#10;        &lt;ww&#58;append&gt;&#10;          &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#values&quot;/&gt;&#10;          &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#space&quot;/&gt;&#10;&#10;          &lt;ww&#58;subset count=&quot;6&quot;&gt;&#10;            &lt;ww&#58;iterator&gt;&#10;              &lt;td width=&quot;40&quot;&gt;&lt;ww&#58;property/&gt;&lt;/td&gt;&#10;            &lt;/ww&#58;iterator&gt;&#10;          &lt;/iterator&#58;subset&gt;&#10;        &lt;/iterator&#58;append&gt;&#10;      &lt;/tr&gt;&#10;    &lt;/ww&#58;iterator&gt;&#10;  &lt;/ww&#58;bean&gt;&#10;&lt;/table&gt;</pre></div><p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-subset" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:subset /&gt;</b></font></h3></p>Subset will iterate over a portion of its source. It will start at start and continue for count. You can set count to &#45;1 if you want to iterate until the end of source. If you do not supply a source, the current object on the ValueStack- &quot;.&quot; will be used. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>count</td><td>no</td><td>This attribute indicates how many items there are.</td>
+</tr><tr>
+<td>source</td><td>no</td><td>This attribute is the source the tag will use to perform work on.         It may be Enumeration, Iterator, or a Collection. </td>
+</tr><tr>
+<td>start</td><td>no</td><td>This attribute indicates the index to start reading. </td>
+</tr>
+</table><p class="paragraph">In this example, subset will iterate over 6 items for the current object in the ValueStack.</p><div class="code"><pre>&lt;h1&gt;Testing append, subset, and value generators&lt;/h1&gt;&#10;&#10;&lt;table border=&quot;1&quot;&gt;&#10;  &lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot;&gt;&#10;    &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;    &lt;ww&#58;iterator id=&quot;colcount&quot;&gt;&#10;    &lt;tr&gt;&#10;      &lt;ww&#58;generator val=&quot;&#039;foo,bar,xyzzy&#039;&quot; separator=&quot;&#039;,&#039;&quot; count=&quot;#colcount&quot; id=&quot;values&quot;/&gt;&#10;      &lt;ww&#58;generator val=&quot;&#039; &#039;&quot; count=&quot;&#45;1&quot; id=&quot;space&quot;/&gt;&#10;      &lt;ww&#58;append&gt;&#10;        &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#values&quot;/&gt;&#10;        &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#space&quot;/&gt;&#10;&#10;        &lt;ww&#58;subset count=&quot;6&quot;&gt;&#10;          &lt;ww&#58;iterator&gt;&#10;            &lt;td width=&quot;40&quot;&gt;&lt;ww&#58;property/&gt;&lt;/td&gt;&#10;          &lt;/ww&#58;iterator&gt;&#10;        &lt;/iterator&#58;subset&gt;&#10;      &lt;/iterator&#58;append&gt;&#10;      &lt;/tr&gt;&#10;    &lt;/ww&#58;iterator&gt;&#10;  &lt;/ww&#58;bean&gt;&#10;&lt;/table&gt;</pre></div><p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-merge" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:merge /&gt;</b></font></h3></p>Merge several iterators into one. It weaves them together. If one iterator runs out, it will drop off and the others will continue weaving until there are no more values. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr>
+</table><p class="paragraph">In this example, #foo, #bar, and #xyzzy iterators are merged together. So, the output will be foo, bar, xyzzy until #foo and #xyzzy iterators run out in which case #bar will finish.</p><div class="code"><pre>Three value generators with merge and subset limits&#58;&lt;br&gt;&#10;&lt;ww&#58;generator val=&quot;&#039;foo&#039;&quot; count=&quot;5&quot; id=&quot;foo&quot;/&gt;&#10;&lt;ww&#58;generator val=&quot;&#039;bar&#039;&quot; count=&quot;10&quot; id=&quot;bar&quot;/&gt;&#10;&lt;ww&#58;generator val=&quot;&#039;xyzzy&#039;&quot; count=&quot;5&quot; id=&quot;xyzzy&quot;/&gt;&#10;&lt;ww&#58;merge&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#foo&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#bar&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;source&#039;&quot; value=&quot;#xyzzy&quot;/&gt;&#10;&#10;  &lt;ww&#58;subset count=&quot;30&quot;&gt;&#10;    &lt;ww&#58;iterator status=&quot;&#039;status&#039;&quot;&gt;&#10;      &lt;ww&#58;property value=&quot;#status.count&quot;/&gt;&#58;&lt;ww&#58;property/&gt;&lt;br&gt;&#10;    &lt;/ww&#58;iterator&gt;&#10;  &lt;/iterator&#58;subset&gt;&#10;&lt;/iterator&#58;merge&gt;</pre></div><p class="paragraph"><a href="#Non-UI+Tags-top">return to top</a><br/>
+<a name="Non-UI+Tags-sort" ></a>
+<h3 class="heading3"><font color="blue"><b class="strong">&lt;ww:sort /&gt;</b></font></h3></p>Sort allows you to sort an iterator. It uses Collections.sort() given the comparator you supply. 
+
+<table class="wikitable">
+<tr>
+<th>attribute </th><th>required</th><th>description</th>
+</tr><tr>
+<td>id</td><td>no</td><td>This attribute assigns a unique name to an element (<a href="#Non-UI+Tags-Notes-Id">note</a>).</td>
+</tr><tr>
+<td>comparator</td><td><b class="strong">yes</b></td><td>This attribute will be the Comparator used to sort the Collection. </td>
+</tr><tr>
+<td>source</td><td>no</td><td>This attribute is the source the tag will use to perform work on.         It may be Enumeration, Iterator, or a Collection. </td>
+</tr>
+</table><p class="paragraph">In this example, we sort ascending.</p><div class="code"><pre>&lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot; id=&quot;counter&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;first&#039;&quot; value=&quot;0&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;&lt;/ww&#58;bean&gt;&#10;&#10;&lt;ww&#58;bean name=&quot;&#039;webwork.util.Sorter&#039;&quot; id=&quot;sorter&quot;/&gt;&#10;&#10;Ascending&#58;&lt;br /&gt;&#10;&lt;ww&#58;sort source=&quot;#counter&quot; comparator=&quot;#sorter.ascending&quot;&gt;&#10;  &lt;ww&#58;iterator&gt;&#10;    &lt;ww&#58;property/&gt;&lt;br /&gt;&#10;  &lt;/ww&#58;iterator&gt;&#10;&lt;/iterator&#58;sort&gt;</pre></div><p class="paragraph">In this example, we sort descending.</p><div class="code"><pre>&lt;ww&#58;bean name=&quot;&#039;webwork.util.Sorter&#039;&quot; id=&quot;sorter&quot;/&gt;&#10;&#10;&lt;ww&#58;bean name=&quot;&#039;webwork.util.Counter&#039;&quot; id=&quot;counter&quot;&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;first&#039;&quot; value=&quot;0&quot;/&gt;&#10;  &lt;ww&#58;param name=&quot;&#039;last&#039;&quot; value=&quot;5&quot;/&gt;&#10;&lt;/ww&#58;bean&gt;&#10;&#10;Descending&#58;&lt;br&gt;&#10;&lt;ww&#58;sort source=&quot;#counter&quot; comparator=&quot;#sorter.descending&quot;&gt;&#10;  &lt;ww&#58;iterator&gt;&#10;    &lt;ww&#58;property/&gt;&lt;br&gt;&#10;  &lt;/ww&#58;iterator&gt;&#10;&lt;/iterator&#58;sort&gt;</pre></div><p class="paragraph">In this example, we sort ascending over strings.</p><div class="code"><pre>&lt;ww&#58;bean name=&quot;&#039;webwork.util.Sorter&#039;&quot; id=&quot;sorter&quot;/&gt;&#10;&#10;Sorting strings&#58;&lt;br&gt;&#10;&lt;ww&#58;generator val=&quot;&#039;Rickard,Maurice,Hristo&#039;&quot; separator=&quot;&#039;,&#039;&quot; id=&quot;names&quot;/&gt;&#10;&lt;ww&#58;sort source=&quot;#names&quot; comparator=&quot;#sorter.ascending&quot;&gt;&#10;  &lt;ww&#58;iterator&gt;&#10;    &lt;ww&#58;property/&gt;&lt;br&gt;&#10;  &lt;/ww&#58;iterator&gt;&#10;&lt;/iterator&#58;sort&gt;</pre></div><p class="paragraph"><h2 class="heading2">Notes</h2>
+<a name="Non-UI+Tags-Notes-Id" ></a><br/>
+<img src="./icons/emoticons/information.png" height="16" width="16" align="absmiddle" alt="" border="0"/> <b class="strong">Id</b> The &quot;id&quot; attribute assigns a name to an element. This name must be unique in a document. This attribute is the standard id supported by JSP TagSupport and is therefore always a string.         You do not need to indicate a string literal as you would for the rest of WW attributes; i.e. - id=&quot;&#039;age&#039;&quot;.         Instead you should use id=&quot;age&quot;.</p><a name="Non-UI+Tags-Notes-Scope" ></a><br/>
+<img src="./icons/emoticons/information.png" height="16" width="16" align="absmiddle" alt="" border="0"/> It&#039;s very important to note that all tags that insert something into the valuestack (like i18n or bean tags) will remove those objects from the stack on its end tag.<br/>
+So, if you instantiate a bean with the bean tag (&lt;ww:bean name=&quot;&#039;br.univap.fcc.sgpw.util.FormattersHelper&#039;&quot;&gt;) that bean will be avaliable on the valuestack only until the &lt;/ww:bean&gt; tag.
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Null Property Access.html

+<html>
+    <head>
+        <title>Null Property Access</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">Null property access is a unique feature to WebWork that allows object graphs to be created at runtime, saving you the headache of having to pre-initialize them.</p><h3 class="heading3"> Simple object graphs</h3><p class="paragraph">The feature is quite simple: <b class="strong">only</b> during the ParametersInterceptor (when http parameters are applied to an action), if an expression being set, such as &quot;document.title&quot;, results in a NullPointerException, WebWork will attempt to create the null object and then try again. So in this case, if &quot;document&quot; is null, WebWork will construct a new Document object so that setting the title will succeed.</p>This is very useful because it reduces the amount of flattening (and unflattening) you are required to do in your action classes when displaying and setting data from web pages. Rahter, you can usually represent the complete object graph by just naming your input fields with well thought-out names (like &quot;document.title&quot;). <p class="paragraph"><h3 class="heading3"> Lists and Maps</h3></p>WebWork extends this feature even further by offering special support for Lists and Maps. If you are providing inpurt for one of these two interfaces, WebWork can be told what type of objects they will hold and automatically populate them accordingly. What this means is that if you refer to &quot;children[0].name&quot;, WebWork will automatically create a children List and also add an empty Child object to that list, so that setting a name on the expression &quot;children[0].name&quot; will correctly work. The same goes for maps.<p class="paragraph">For this to work you must tell the converters what the objects in the List or Map will be. You do this by specifying &quot;Collection_<a href="http://wiki.opensymphony.com//display/WW/property">property</a> = com.acme.CollectionItem&quot; in the conversion properties file. So if you have an action that has a children property that should be filled with Child objects, YourAction-conversion.properties should contain:</p><div class="code"><pre>Collection&#95;children = come.acme.Child</pre></div>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/OGNL Basics.html

+<html>
+    <head>
+        <title>OGNL Basics</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2"> XWork-specific language features</h2>
+The biggest addition that XWork provides on top of OGNL is the support for the ValueStack. While OGNL operates under the assumption there is only one &quot;root&quot;, XWork&#039;s ValueStack concept requires there be many &quot;roots&quot;.</p>For example, suppose we are using standard OGNL (not using XWork) and there are two objects in the OgnlContext map: &quot;foo&quot; -&gt; foo and &quot;bar&quot; -&gt; bar and that the foo object is also configured to be the single <b class="strong">root</b> object. The following code illustrates how OGNL deals with these three situations:
+
+<div class="code"><pre>#foo.blah // returns foo.getBlah()&#10;#bar.blah // returns bar.getBlah()&#10;blah      // returns foo.getBlah() because foo is the root</pre></div><p class="paragraph">What this means is that OGNL allows many objects in the context, but unless the object you are trying to access is the root, it must be prepended with a namespaces such as @bar. Now let&#039;s talk about how XWork is a little different&#8230;</p>In XWork, the entire ValueStack is the root object in the context. But rather than having your expressions get the object you want from the stack and then get properties from that (ie: peek().blah), XWork has a special OGNL PropertyAccessor that will automatically look at the all entries in the stack (from the top down) until it finds an object with the property you are looking for.<p class="paragraph">For example, suppose the stack contains two objects: Animal and Person. Both objects have a &quot;name&quot; property, Animal has a &quot;species&quot; property, and Person has a &quot;salary&quot; property. Animal is on the top of the stack, and Person is below it. The follow code fragments help you get an idea of what is going on here:</p><div class="code"><pre>species    // call to animal.getSpecies()&#10;salary     // call to person.getSalary()&#10;name       // call to animal.getName() because animal is on the top</pre></div><p class="paragraph">In the last example, there was a tie and so the animal&#039;s name was returned. Usually this is the desired effect, but sometimes you want the property of a lower-level object. To do this, XWork has added support for indexes on the ValueStack. All you have to do is:</p><div class="code"><pre>&#91;0&#93;.name   // call to animal.getName()&#10;&#91;1&#93;.name   // call to person.getName()</pre></div><p class="paragraph"><h2 class="heading2"> Accessing static properties</h2></p>OGNL supports accessing static properties as well as static methods. As the OGNL docs point out, you can explicetly call statics by doing the following:
+
+<div class="code"><pre>&#64;some.package.ClassName&#64;FOO&#95;PROPERTY&#10;&#64;some.package.ClassName&#64;someMethod()</pre></div><p class="paragraph">However, XWork allows you to avoid having to specify the full package name and call static properties and methods of your action classes using the &quot;vs&quot; prefix:</p><div class="code"><pre>&#64;vs&#64;FOO&#95;PROPERTY&#10;&#64;vs&#64;someMethod()&#10;&#10;&#64;vs1&#64;FOO&#95;PROPERTY&#10;&#64;vs1&#64;someMethod()&#10;&#10;&#64;vs2&#64;BAR&#95;PROPERTY&#10;&#64;vs2&#64;someOtherMethod()</pre></div><p class="paragraph">The important thing to note here is that if the class name you specify is just &quot;vs&quot;, the class for the object on the top of the stack is used. If you specify a number after the &quot;vs&quot; string, an object&#039;s class deeper in the stack is used instead.</p><h2 class="heading2"> Differences from the WebWork 1.x EL</h2>
+Besides the examples and descriptions given above, there are a few major changes in the EL since WebWork 1.x. The biggest one is that properties are no longer accessed with a forward slash &#40;/&#41; but with a dot (.). Also, rather than using &quot;..&quot; to traverse down the stack, we now use &quot;&#91;n&#93;&quot; where n is some positive number. Lastly, in WebWork 1.x one could access special named objects (the request scope attributes to be exact) by using &quot;@foo&quot;, but now special variables are accessed using &quot;#foo&quot;. However, it is important to note that &quot;#foo&quot; does NOT access the request attributes. Because XWork is not built only for the web, there is no concept of &quot;request attributes&quot;, and thus &quot;#foo&quot; is merely a request to another object in the OgnlContext other than the root.
+
+<table class="wiki-table" cellpadding="0" cellspacing="0" border="0"><tr><th>Old Expression</th><th>New Expression</th></tr><tr class="table-odd"><td>foo/blah</td><td>foo.blah</td></tr><tr class="table-even"><td>foo/someMethod()</td><td>foo.someMethod()</td></tr><tr class="table-odd"><td>../bar/blah</td><td>&#91;1&#93;.bar.blah</td></tr><tr class="table-even"><td>@baz</td><td>not directly supported, but #baz is similar</td></tr><tr class="table-odd"><td>.</td><td>top or &#91;0&#93;</td></tr></table>
+<h2 class="heading2"> WebWork-specific named objects</h2>
+<table class="wiki-table" cellpadding="0" cellspacing="0" border="0"><tr><th>name</th><th>value</th></tr><tr class="table-odd"><td>parameters&#91;&#039;foo&#039;]</td><td>request parameter &#91;&#039;foo&#039;] (request.getParameter())</td></tr><tr class="table-even"><td>request&#91;&#039;foo&#039;]</td><td>request attribute &#91;&#039;foo&#039;]  (request.getAttribute())</td></tr><tr class="table-odd"><td>session&#91;&#039;foo&#039;]</td><td>session attribute &#039;foo&#039;</td></tr><tr class="table-even"><td>application&#91;&#039;foo&#039;]</td><td>ServletContext attributes &#039;foo&#039;</td></tr></table>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Packages.html

+<html>
+    <head>
+        <title>Packages</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h3 class="heading3"> Overview</h3></p>Packages are a way to group Actions, Results, Result Types, Interceptors and Stacks into a logical unit that shares a common configuration. Packages are similiar to objects in that they can be extended and have individual parts overridden by &quot;sub&quot; packages.<p class="paragraph"><h4 class="heading4"> Packages</h4></p>The package element has one required attribute, &quot;name&quot;, which acts as the key for later reference to this package. The &quot;extends&quot; attribute is optional and allows one package to inherit the configuration of one or more previous packages including all interceptor, interceptor-stack, and action configurations. Note that the configuration file is processed sequentially down the document, so the package referenced by an &quot;extends&quot; should be defined above the package which extends it. The &quot;abstract&quot; optional attribute allows you to make a package abstract, which will allow you to extend from it without the action configurations defined in the abstract package actually being available at runtime.
+
+<table class="wikitable">
+<tr>
+<th> Attribute </th><th> Required </th><th> Description </th>
+</tr><tr>
+<td> name </td><td> <b class="strong">yes</b> </td><td> key to for other packages to reference </td>
+</tr><tr>
+<td> extends </td><td> no </td><td> inherits package behavior of the package it extends </td>
+</tr><tr>
+<td> namespace </td><td> no </td><td> see <a href="Namespaces.html">Namespaces</a> </td>
+</tr><tr>
+<td> abstract </td><td> no </td><td> declares package to be abstract (no action configurations required in package) </td>
+</tr>
+</table>
+<h5 class="heading5"> Sample usage of packages in xwork.xml</h5>
+<div class="code"><pre>&lt;<span class="java&#45;keyword">package</span> name=&quot;bar&quot; <span class="java&#45;keyword">extends</span>=&quot;webwork&#45;<span class="java&#45;keyword">default</span>&quot; namespace=&quot;/foo/bar&quot;&gt;&#10;        &lt;interceptors&gt;&#10;            &lt;interceptor&#45;stack name=&quot;barDefaultStack&quot;&gt;&#10;                &lt;interceptor&#45;ref name=&quot;debugStack&quot;/&gt;&#10;                &lt;interceptor&#45;ref name=&quot;defaultStack&quot;/&gt;&#10;            &lt;/interceptor&#45;stack&gt;&#10;        &lt;/interceptors&gt;&#10;&#10;        &lt;action name=&quot;Bar&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot;&gt;&#10;            &lt;interceptor&#45;ref name=&quot;barDefaultStack&quot;/&gt;&#10;        &lt;/action&gt;&#10;&#10;        &lt;action name=&quot;TestInterceptorParamInheritance&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot;&gt;&#10;            &lt;interceptor&#45;ref name=&quot;test&quot;&gt;&#10;                &lt;param name=&quot;expectedFoo&quot;&gt;expectedFoo&lt;/param&gt;&#10;            &lt;/interceptor&#45;ref&gt;&#10;        &lt;/action&gt;&#10;&#10;        &lt;action name=&quot;TestInterceptorParamInehritanceOverride&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot;&gt;&#10;            &lt;interceptor&#45;ref name=&quot;test&quot;&gt;&#10;                &lt;param name=&quot;foo&quot;&gt;foo123&lt;/param&gt;&#10;                &lt;param name=&quot;expectedFoo&quot;&gt;foo123&lt;/param&gt;&#10;            &lt;/interceptor&#45;ref&gt;&#10;        &lt;/action&gt;&#10;    &lt;/<span class="java&#45;keyword">package</span>&gt;&#10;&#10;    &lt;<span class="java&#45;keyword">package</span> name=&quot;abstractPackage&quot; namespace=&quot;/<span class="java&#45;keyword">abstract</span>&quot; <span class="java&#45;keyword">abstract</span>=&quot;<span class="java&#45;keyword">true</span>&quot;&gt;&#10;        &lt;action name=&quot;test&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot;/&gt;&#10;    &lt;/<span class="java&#45;keyword">package</span>&gt;&#10;&#10;    &lt;<span class="java&#45;keyword">package</span> name=&quot;nonAbstractPackage&quot; <span class="java&#45;keyword">extends</span>=&quot;abstractPackage&quot; namespace=&quot;/nonAbstract&quot;/&gt;&#10;&#10;    &lt;<span class="java&#45;keyword">package</span> name=&quot;baz&quot; <span class="java&#45;keyword">extends</span>=&quot;<span class="java&#45;keyword">default</span>&quot; namespace=&quot;baz&quot;&gt;&#10;        &lt;action name=&quot;commandTest&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot;&gt;&#10;            &lt;param name=&quot;foo&quot;&gt;123&lt;/param&gt;&#10;            &lt;result name=&quot;error&quot; type=&quot;chain&quot;&gt;&#10;                &lt;param name=&quot;actionName&quot;&gt;bar&lt;/param&gt;&#10;            &lt;/result&gt;&#10;            &lt;interceptor&#45;ref name=&quot;<span class="java&#45;keyword">static</span>&#45;params&quot;/&gt;&#10;        &lt;/action&gt;&#10;        &lt;action name=&quot;myCommand&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot; method=&quot;commandMethod&quot;&gt;&#10;            &lt;param name=&quot;bar&quot;&gt;456&lt;/param&gt;&#10;            &lt;result name=&quot;success&quot; type=&quot;chain&quot;&gt;&#10;                &lt;param name=&quot;actionName&quot;&gt;foo&lt;/param&gt;&#10;            &lt;/result&gt;&#10;            &lt;interceptor&#45;ref name=&quot;logger&quot;/&gt;&#10;        &lt;/action&gt;&#10;    &lt;/<span class="java&#45;keyword">package</span>&gt;&#10;&#10;    &lt;<span class="java&#45;keyword">package</span> name=&quot;multipleInheritance&quot; <span class="java&#45;keyword">extends</span>=&quot;<span class="java&#45;keyword">default</span>,abstractPackage,bar&quot; namespace=&quot;multipleInheritance&quot;&gt;&#10;        &lt;action name=&quot;testMultipleInheritance&quot; class=&quot;com.opensymphony.xwork.SimpleAction&quot;&gt;&#10;            &lt;result name=&quot;success&quot; type=&quot;chain&quot;&gt;&#10;                &lt;param name=&quot;actionName&quot;&gt;foo&lt;/param&gt;&#10;            &lt;/result&gt;&#10;            &lt;interceptor&#45;ref name=&quot;barDefaultStack&quot;/&gt;&#10;        &lt;/action&gt;&#10;    &lt;/<span class="java&#45;keyword">package</span>&gt;</pre></div>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>
+<html>
+    <head>
+        <title>Pico</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">Pico is an Inversion of Control container available at <span class="nobr"><a href="http://picocontainer.codehaus.org.">&#104;ttp://picocontainer.codehaus.org.<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> There have been several reports of integration between WebWork and Pico. We recommend that you build your own ObjectFactory to do this integration.</p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Projects Using WebWork.html

+<html>
+    <head>
+        <title>Projects Using WebWork</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <ul class="star">
+<li> <span class="nobr"><a href="http://www.atlassian.com/software/confluence/default.jsp"> Atlassian Confluence<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> - Commercial Wiki and knowledge management system using WebWork 2.0, Hibernate, Spring, and Velocity</li>
+<li> <span class="nobr"><a href="http://www.chemistaustralia.com.au"> Chemist Australia<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> -  Online Pharmacy</li>
+<li> <span class="nobr"><a href="http://www.drivenow.com.au"> DriveNow<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> -  last minute Autralian car rentals</li>
+<li> <span class="nobr"><a href="http://www.opensourcesoft.net"> OpenReports<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> -  an open source web based reporting application that uses WebWork 2.0, Velocity, and Hibernate</li>
+<li> <span class="nobr"><a href="http://www.esagegroup.com">eSage Group<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> is a consulting company that uses it for all their client engagements. Additionally, its used for their internal systems</li>
+<li> <span class="nobr"><a href="http://filmweb.pl"> Filmweb<sup><img src="./icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="&gt;&gt;" border="0"/></sup></a></span> -  Polish Film Portal</li>
+</ul>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>
+<html>
+    <head>
+        <title>Quartz</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph">The following class performs the glue between Quartz and Webwork:</p><div class="code"><pre><span class="java&#45;keyword">package</span> com.trantek.sit.action;&#10;&#10;<span class="java&#45;keyword">import</span> com.opensymphony.xwork.ActionProxy;&#10;<span class="java&#45;keyword">import</span> com.opensymphony.xwork.ActionProxyFactory;&#10;<span class="java&#45;keyword">import</span> org.quartz.Job;&#10;<span class="java&#45;keyword">import</span> org.quartz.JobExecutionContext;&#10;<span class="java&#45;keyword">import</span> org.quartz.JobExecutionException;&#10;&#10;<span class="java&#45;keyword">public</span> class WebWorkJob <span class="java&#45;keyword">implements</span> Job&#10;&#123;&#10;    <span class="java&#45;keyword">public</span> void execute(JobExecutionContext context) <span class="java&#45;keyword">throws</span> JobExecutionException&#10;    &#123;&#10;        <span class="java&#45;keyword">try</span>&#10;        &#123;&#10;            ActionProxy proxy = ActionProxyFactory.getFactory().&#10;                    createActionProxy(&quot;&quot;, context.getJobDetail().getName(), context.getJobDetail().getJobDataMap());&#10;&#10;            proxy.execute();&#10;        &#125;&#10;        <span class="java&#45;keyword">catch</span> (Exception e)&#10;        &#123;&#10;            <span class="java&#45;keyword">throw</span> <span class="java&#45;keyword">new</span> JobExecutionException(e);&#10;        &#125;&#10;    &#125;&#10;&#125;</pre></div><p class="paragraph">To schedule webwork actions you simply create a job where
+<ul class="star">
+<li> the name of your job is the name of the WW action to execute (no &quot;.action&quot; suffix).</li>
+<li> all the parameters you want to send to the WW action is contained in the JobDataMap of the JobDetail</li>
+</ul></p>(the Quartz scheduler is setup as a servlet according to the javadocs of org.quartz.ee.servlet.QuartzInitializerServlet.)<p class="paragraph">The following code schedules an e-mail action:</p><div class="code"><pre>Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();&#10;&#10;JobDetail jobDetail = <span class="java&#45;keyword">new</span> JobDetail(&quot;email.send&quot;, &#10;                                     scheduler.DEFAULT&#95;GROUP, WebworkJob.class);&#10;&#10;Map m = jobDetail.getJobDataMap();&#10;m.put(&quot;to&quot;, &quot;me&#64;bogusdomain.com&quot;);&#10;m.put(&quot;subject&quot;, &quot;quartz test&quot;);&#10;m.put(&quot;body&quot;, &quot;This is a quartz test, Hey ho&quot;);&#10;m.put(&quot;smtpServer&quot;, &quot;smtp.bogusdomain.com&quot;);&#10;m.put(&quot;from&quot;, &quot;quartz&#64;bogusdomain.com&quot;);&#10;&#10;SimpleTrigger trigger = <span class="java&#45;keyword">new</span> SimpleTrigger(&quot;myTrigger&quot;, &#10;                                          scheduler.DEFAULT&#95;GROUP, &#10;                                          <span class="java&#45;keyword">new</span> Date(), <span class="java&#45;keyword">null</span>, 0, 0L);&#10;&#10;scheduler.deleteJob(&quot;email.send&quot;, scheduler.DEFAULT&#95;GROUP);&#10;scheduler.scheduleJob(jobDetail, trigger);</pre></div><p class="paragraph">This example is based on <a href="http://wiki.opensymphony.com//display/WW1/Integrating%2BWebwork%2Band%2BQuartz">WW1:Integrating Webwork and Quartz</a></p>
+
+				    
+			    </td>
+		    </tr>
+	    </table>
+    </body>
+</html>

docs/Release Notes.html

+<html>
+    <head>
+        <title>Release Notes</title>
+	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
+    </head>
+
+    <body>
+	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
+		    <tr>
+			    <td valign="top" class="pagebody">
+
+				    <p class="paragraph"><h2 class="heading2"> WebWork 2.1</h2></p><h3 class="heading3"> Key Changes</h3>
+<ul class="star">
+<li> JavaScript client validation support - not totally complete, but basic validators work well. Look at the validators.xml file include in src/example to see how you can configure your validators to do client side validation on top of their normal duties</li>
+<li> The label attribute in UI tags are no longer required</li>
+<li> The themes and templates in UI tags behave like they did in 1.x</li>
+<li> A new theme, in addition to the existing &quot;xhtml&quot; one, called &quot;simple&quot; is included that doesn&#039;t have any of the labels, error reporting, or table rows that the &quot;xhtml&quot; template has. This is more in line with the tags included with Struts.</li>
+<li> New UI tags for CSS styles and classes added: cssStyle and cssClass</li>
+<li> Old action!command URL support works again. This means you can invoke a doCommand() method like in 1.x</li>
+<li> ww:param tag no longer requires the name attribute (for ordered params, like with ww:text). It also evaluates the the body as the value if no value is given.</li>
+<li> UI tags now have access to the FormTag parameter map using the &quot;form&quot; key. This means $parameters.form.name would return the form name, for example. The result is that complex JavaScript-based components can be built.</li>
+</ul>
+<h3 class="heading3"> Migration Notes</h3>
+
+<table class="wikitable">
+<tr>
+<th> Version </th><th> Description </th><th> Old Code </th><th> New Code </th>
+</tr><tr>
+<td> 2.0 </td><td> WebWorkUtil has been refactored into a number of classes, and the constructor has changed. If you were using it for Velocity support before, look at VelocityWebWorkUtil now </td><td> </td><td> </td>
+</tr><tr>
+<td> 2.0 </td><td> The <em class="emphasis">webwork.ui.templateDir</em> configuration property has been broken into <em class="emphasis">webwork.ui.templateDir</em> and <em class="emphasis">webwork.ui.theme</em> </td><td> <div class="code"><pre>webwork.ui.templateDir= /webwork/mytheme</pre></div> </td><td> <div class="code"><pre>webwork.ui.templateDir = /webwork &#10;webwork.ui.theme = mytheme</pre></div> </td>
+</tr><tr>
+<td> 2.0 </td><td> &quot;namespace&quot; attribute of  the ww:action tag is now evaluated; those upgrading from 2.0 will need to place single quotes around the attribute value</td><td> &lt;ww:action namespace=&quot;/foo&quot; .../&gt; </td><td> &lt;ww:action namespace=&quot;&#039;/foo&#039;&quot; .../&gt; </td>
+</tr><tr>
+<td> 2.0, but not 1.x </td><td> theme and template attributes in UI tags have changed are now evaluated; those upgrading from 2.0 will need to place single quotes around the attribute value</td><td> &lt;ww:xxxx theme=&quot;/template/foo&quot; template=&quot;bar.vm&quot;/&gt; </td><td> &lt;ww:xxxx theme=&quot;&#039;foo&#039;&quot; template=&quot;&#039;bar.vm&#039;&quot;/&gt; </td>
+</tr><tr>
+<td> 1.x, 2.0 </td><td> label UI tag evaluates the value attribute now instead of the name attribute </td><td> &lt;ww:label name=&quot;&#039;Foo&#039;&quot;/&gt; </td><td> &lt;ww:label value=&quot;&#039;Foo&#039;&quot;/&gt; </td>
+</tr>
+</table>
+<h3 class="heading3"> Changelog <a name="Release+Notes-Changelog" ></a></h3><p class="paragraph"><p>
+    <table  width="100%" cellspacing="0" class="grid">
+        <tr>
+            <th colspan="3" style="text-align: left;">
+                <a href="http://jira.opensymphony.com">OpenSymphony JIRA</a>
+                <span class="smalltext">(25 issues)</span>
+            </th>
+        </tr>
+        <tr>
+                        <th style="text-align: left;">
+                T                                                                                                                                                                            </th>
+                        <th style="text-align: left;">
+                                Key                                                                                                                                                            </th>
+                        <th style="text-align: left;">
+                                                Summary                                                                                                                                            </th>
+                    </tr>
+                                            <tr class="rowNormal">
+                                                            <td nowrap="true">
+                                            <a href="http://jira.opensymphony.com/browse/WW-560"><img src="http://jira.opensymphony.com/images/icons/bug.gif" alt="Bug" border="0" /></a>
+                                                                                                                                                                                                                                            </td>
+                                <td nowrap="true">
+