diff --git a/docs/chinese/index.html b/docs/chinese/index.html deleted file mode 100644 index f1747a38c..000000000 --- a/docs/chinese/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - - - -
- -×¢: Èç¹ûÄúÐèÒª²é¿´WebWork 1.0µÄÓйØÐÅÏ¢£¬Çë·ÃÎÊhttp://www.opensymphony.com/webwork_old - -

- -WebWorkÊÇÒ»¸öJava web-application¿ª·¢¿ò¼Ü(development framework). ËüרעÓÚÌá¸ß¿ª·¢ÕßµÄÉú²úЧÂʲ¢¼ò»¯´úÂë. WebWork¹¹½¨ÔÚXWorkÖ®ÉÏ, XWorkÌṩÁËÆÕͨµÄ(generic)ÃüÁîģʽ(command pattern)¿ò¼Ü, ͬʱҲÊÇÒ»¸ö·´×ª¿ØÖÆ(Inversion of Control, IoC)ÈÝÆ÷. ³ýÁËÉÏÊöÌØÐÔÍâ, WebWork»¹ÎªÆäËü¹¦ÄÜÈç´´½¨¿É¸´ÓõÄÓû§½çÃæÄ£°æ(UI template), ±íµ¥(form)¿ØÖÆ, Óû§½çÃæÖ÷Ìâ(UI theme), ¹ú¼Ê»¯, ±íµ¥²ÎÊýÓëJavaBeanµÄ¶¯Ì¬Ó³Éä, ½¡×³µÄ¿Í»§¶Ë¼°·þÎñÆ÷¶ËУÑé(validation)ÌṩÁËÇ¿ÓÐÁ¦µÄÖ§³Ö. - -

- -Äú¿ÉÒÔ´ÓÏÂÃæµÄµØÖ·ÖÐÕÒµ½²¢ÏÂÔØWebWork×îа汾µÄÎĵµ. µ±Ç°¿ª·¢°æ±¾µÄÎĵµ×Ü¿ÉÒÔÔÚWebWork wikiÉÏÕÒµ½. Èç¹ûÄú¶Ô±¾ÎĵµÓÐÐ޸ĻòÐÞÕýÒâ¼ûµÄ»°, ¿ÉÒÔÖ±½ÓÔÚwikiÉϽøÐÐÐÞ¸Ä. - -

- -

- - - \ No newline at end of file diff --git a/docs/chinese/logo-small.png b/docs/chinese/logo-small.png deleted file mode 100644 index 7437edd3a..000000000 Binary files a/docs/chinese/logo-small.png and /dev/null differ diff --git a/docs/chinese/logo.png b/docs/chinese/logo.png deleted file mode 100644 index d77172a56..000000000 Binary files a/docs/chinese/logo.png and /dev/null differ diff --git a/docs/chinese/navpanel-source.jsp b/docs/chinese/navpanel-source.jsp deleted file mode 100644 index fb5084817..000000000 --- a/docs/chinese/navpanel-source.jsp +++ /dev/null @@ -1,14 +0,0 @@ -

-

WebWork

-Home
-Download (JAR)
-Documentation (PDF)
-API Documentation
-

-

Services

-JIRA
-- Issue Overview
-- Roadmap
-- Changelog
-Wiki
-- WebWork page diff --git a/docs/chinese/navpanel.jsp b/docs/chinese/navpanel.jsp deleted file mode 100644 index 210478e04..000000000 --- a/docs/chinese/navpanel.jsp +++ /dev/null @@ -1,14 +0,0 @@ -

-

WebWork

-Home
-Download (JAR)
-Documentation (PDF)
-API Documentation
-

-

Services

-JIRA
-- Issue Overview
-- Roadmap
-- Changelog
-Wiki
-- WebWork page diff --git a/docs/chinese/overview.png b/docs/chinese/overview.png deleted file mode 100644 index a116c7b2b..000000000 Binary files a/docs/chinese/overview.png and /dev/null differ diff --git a/docs/chinese/wikidocs/Accessing application, session, request objects.html b/docs/chinese/wikidocs/Accessing application, session, request objects.html deleted file mode 100644 index 7cb013495..000000000 --- a/docs/chinese/wikidocs/Accessing application, session, request objects.html +++ /dev/null @@ -1,53 +0,0 @@ - - - WebWork 2 : Accessing application, session, request objects - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Webwork provides several access helpers to access Session, Application, Request scopes.
-Web agnostic (independent of the servlet API) with calls: -

-
Map session = (Map) ActionContext.getContext().get("session");
session.put("myId",myProp);
-

The following gives you the same thing as above: -
-
ServletActionContext.getRequest().getSession()
-

Note: Be sure not to use ActionContext.getContext() in the constructor of your action since the values may not be set up already (returning null for getSession()).
-Note also: ActionContext.getContext().get("session") is the same as
-ActionContext.getContext().getSession() with a cast to Map.

If you really need to get access to the HttpSession, use the ServletConfigInterceptor (see Interceptors).

In your views, you can access with your jsps as such -

-
<ww: property value="#session.myId" />

<ww: property value="#request.myId" />
-

All the servlet scopes can be accessed like above. -
-
Map request = (Map) ActionContext.getContext().get("request");
request.put("myId",myProp);
Map application = (Map) ActionContext.getContext().get("application");
application.put("myId",myProp);
Map session = (Map) ActionContext.getContext().get("attr");
attr.put("myId",myProp);
-

-The 'attr' map will search the javax.servlet.jsp.PageContext for the specified key. If the PageContext dosen't exist, it will search request,session,application maps respectively. - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Action Chaining Result.html b/docs/chinese/wikidocs/Action Chaining Result.html deleted file mode 100644 index 127883c0b..000000000 --- a/docs/chinese/wikidocs/Action Chaining Result.html +++ /dev/null @@ -1,53 +0,0 @@ - - - WebWork 2 : Action Chaining Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

»î¶¯Á´

-ÊÓͼµÄÒ»ÖÖ, Ëüµ÷ÓÃGenericDispatch(ʹÓÃÇ°ÃæÒÑ´æÔÚµÄActionContext)Ö´ÐÐÆäËû»î¶¯. Èç¹ûÄãÐèÒªÔÚÒ»¸ö»î¶¯ºóÖ´ÐÐÁíÒ»¸ö»î¶¯, ÕâÒ»ÀàÐÍÊ®·ÖÓÐÓÃ.

- - - - - - - -
²ÎÊý ±ØÐè ÃèÊö
actionName ÊÇ ÒªÁ´½ÓµÄ»î¶¯Ãû
namespace ·ñ ÉèÖÃÁ´½Ó»î¶¯µÄÃû¿Õ¼ä. Èç¹ûÃû¿Õ¼äΪ¿Õ, ʹÓõ±Ç°Ãû¿Õ¼ä[»òȱʡÃû¿Õ¼ä""].
-
-
<result name="success" type="chain">
    <param name="actionName">bar</param>
    <param name="namespace">/foo</param>
</result>
-

-µ÷Óû -
-
<action name="bar" class="myPackage.barAction">
    ...
</action>
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Action Chaining.html b/docs/chinese/wikidocs/Action Chaining.html deleted file mode 100644 index a2e0cdfd2..000000000 --- a/docs/chinese/wikidocs/Action Chaining.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork 2 : »î¶¯Á´ - - - - - - - - - -
- -
- This page last changed on Nov 29, 2004 by jcarreira. -
- -

WebWork2ÖеÄActionChainResult¿ÉÒÔ½«¶à¸ö»î¶¯×éºÏÆðÀ´°´ÕÕ¶¨ÒåºÅµÄ˳Ðò»ò¹¤×÷Á÷³ÌÖ´ÐÐ. ʹÓÃActionChainResult×÷Ϊ»î¶¯µÄ½á¹ûÀàÐÍ, ÈçÏÂ:

-
<!-- simple chain example to an action in same namespace ->
<result name="success" type="chain">
    <param name="actionName">Bar</param>
</result>
-
-
-
<!- example of chaining to an action in a different namespace/package -->
<result name="success" type="chain">
	<param name="actionName">viewFoo</param>
	<param name="namespace">/foo</param>
</result>
-

ͬһ¸öÃû¿Õ¼ä(»òȱʡÃû¿Õ¼ä"")ÖеÄÁíÒ»¸ö»î¶¯½«ÔڸûºóÖ´ÐÐ(²Î¼ûXW:Configuration). Ò³¿ÉÒÔʹÓÿÉÑ¡µÄ"namespace"²ÎÊýÖ¸¶¨²»Í¬Ãû¿Õ¼äÖеĻ. RequestÖеÄԭʼ(original)²ÎÊýºÍValueStack±»´«µÝµ½Á´ÉÏ, ͬʱ±»Á´½ÓµÄ»î¶¯Ò²±»´«µÝµ½ÖµÕ»ÖÐ. Õâ¾ÍÔÊÐíÁ´½ÓµÄ»î¶¯¿ÉÒÔÔÚÖµÕ»ÖзÃÎÊ֮ǰ»î¶¯µÄÊôÐÔ, ÕâЩÊôÐÔÒ³¿ÉÒÔÔÚÁ´µÄ×îºó½á¹û(ÈçJSP»òVelocityÒ³Ãæ)ÖÐʹÓÃ.

Èç¹ûÐèÒª½«Ç°Ò»¸ö»î¶¯µÄÊôÐÔ¸´ÖƵ½µ±Ç°»î¶¯ÖÐ, ¿ÉÒÔʹÓÃChainingInterceptor(²Î¼ûXW:Interceptors), Ëü»á½«ÖµÕ»ÖÐËùÓжÔÏóµÄÊôÐÔÈ«²¿¸´ÖƵ½µ±Ç°Ä¿±ê¶ÔÏóÖÐ.

»î¶¯Á´µÄÒ»°ãÓÃ;ÊÇÌṩ²éÕÒ±í(ÀýÈç¹ØÓÚ״̬µÄÏÂÀ­Áбí). ÓÉÓڻ±»·ÅÖÃÔÚÖµÕ»ÖÐ, Òò´ËËüÃǵÄÊôÐÔÒ³¿ÉÒÔÔÚÊÓͼÖÐʹÓÃ. Ò²¿ÉÒÔͨ¹ýÔÚÏÈÊÇÒ³ÃæÖÐʹÓÃaction±êǩִÐÐÒ»¸ö»î¶¯À´Íê³ÉÕâһĿµÄ. ÔÚWebWork 1.xÖлÁ´Í¨³£Á´½Óµ½RedirectActionÒÔ±ãÔÚ´¦ÀíºóÖØ¶¨Ïòµ½ÁíÒ»¸öÒ³Ãæ(WebWork2 ÌṩÁËredirect½á¹ûÀàÐÍ).

µ±ÄãÏòÒª·âװһЩ¸´ÓôúÂëʱ, ÕâÒ»·½·¨ºÜÓÐÓÃ… ÔÚWebWork 2ÖÐ, Èç¹ûij¸ö¸´ÓôúÂë±»´óÁ¿Ê¹ÓÃ, ¿ÉÒÔ°ÑËü±àдΪ½ØÈ¡Æ÷, »òÕßʹÓûÁ´. Èç¹ûÄãÐèÒªÉèÖò¢Ê¹ÓÃijЩÊôÐÔ, Ó¦¸ÃʹÓû. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/App Servers.html b/docs/chinese/wikidocs/App Servers.html deleted file mode 100644 index 31cb2efb1..000000000 --- a/docs/chinese/wikidocs/App Servers.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork 2 : Ó¦Ó÷þÎñÆ÷ - - - - - - - - - -
- -
- This page last changed on Nov 20, 2004 by plightbo. -
- -
    -
  • WebLogic[ÕâÀï½éÉܵÄÊÇWebLogic5.1°æ±¾]
  • -
  • WebSphere
  • -
  • JRun
  • -
  • Jetty
  • -
  • Tomcat/JBoss
  • -
  • Resin
  • -
  • Orion
  • -
  • OC4J
  • -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Application, Session, Request objects in jsp.html b/docs/chinese/wikidocs/Application, Session, Request objects in jsp.html deleted file mode 100644 index db04d6447..000000000 --- a/docs/chinese/wikidocs/Application, Session, Request objects in jsp.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork 2 : Application, Session, Request objects in jsp - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

The application, session and request objects are available from within ww tags in jsp wherever ognl can be evaluated. Use the #session syntax to get the object and access values by their keys using ['key'].

-
<ww:property value="#application['foo']"/>

<ww:property value="#session['baz']"/>
-

-Conversely, if you would like to make webwork objects availible to say the jsp/jstl request scope. The property tag can be used like this.

-
<ww:set name="jobz" value="jobs" scope="request" />
-

A full example below shows a webwork variable "jobs" being exposed as "jobz" and being used with jstl and the display tag.

WW:Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Application, Session, Request objects in vm.html b/docs/chinese/wikidocs/Application, Session, Request objects in vm.html deleted file mode 100644 index 9cc32ab3a..000000000 --- a/docs/chinese/wikidocs/Application, Session, Request objects in vm.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork 2 : Application, Session, Request objects in vm - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -
-
$req.session.servletContext.getAttribute(...)
$req.session.getAttribute(...)
$req.getAttribute(...)
-
-

To get parameters from the QueryString or from a POSTed form, do not use getAttribute, use:

-
$req.getParameter(...)
-

But that's quite obvious, since $req is the request object and we all know how it works.

Example:

_test.jsp_:

-
<html><head></head><body>
<%
session.setAttribute("sessionFoo", "sessionBar");
session.getServletContext().setAttribute("applicationFoo", "applicationBar");
%>

<p>The following information should be available when sending the form below:

<ul>
	<li>Request parameter 'querystringFoo' with value 'querystringBar';</li>
	<li>Request parameter 'formFoo' with value 'formBar';</li>
	<li>Session attribute 'sessionFoo' with value 'sessionBar';</li>
	<li>Application attribute 'applicationFoo' with value 'applicationBar'.</li>
</ul>
</p>

<form action="test.vm?querystringFoo=querystringBar" method="post">
<input type="hidden" name="formFoo" value="formBar">
<p><input type="submit" value="Test!"></p>
</form>
</body></html>
-

_test.vm_:

-
<html><head></head><body>

#set ($ses = $req.getSession())
#set ($app = $ses.getServletContext())

<p>applicationFoo = $!app.getAttribute("applicationFoo") <code>(app.getAttribute("applicationFoo"))</code></p>
<p>sessionFoo = $!ses.getAttribute("sessionFoo") <code>(ses.getAttribute("sessionFoo"))</code></p>
<p>formFoo = $!req.getParameter("formFoo") <code>(req.getParameter("formFoo"))</code></p>
<p>querystringFoo = $!req.getParameter("querystringFoo") <code>(req.getParameter("queryStringFoo"))</code></p>

</body></html>
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Articles.html b/docs/chinese/wikidocs/Articles.html deleted file mode 100644 index 7145c3a0e..000000000 --- a/docs/chinese/wikidocs/Articles.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork 2 : Articles - - - - - - - - - -
- -
- This page last changed on May 20, 2004 by plightbo. -
- - - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Bug tracker and wiki.html b/docs/chinese/wikidocs/Bug tracker and wiki.html deleted file mode 100644 index 62ceff549..000000000 --- a/docs/chinese/wikidocs/Bug tracker and wiki.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Bug¸ú×ÙºÍwiki - - - - - - - - - -
- -
- This page last changed on Oct 15, 2004 by plightbo. -
- -

WebworkºÍXworkµÄBUG¸ú×Ùϵͳ(ÓëËùÓÐOpensymphonyÏîĿһÑù)¿ÉÒÔÔÚhttp://jira.opensymphony.comÕÒµ½.

Webwork wiki´óÁ¿±¾ÏîÄ¿µÄ֪ʶ°üÀ¨·¶Àý´úÂë, ʳÆ×, ÒÔ¼°¶Ô¿ò¼ÜÒ»°ãÐÔÌÖÂÛµÄ. Wiki¿ÉÒÔÔÚhttp://wiki.opensymphony.com/display/WW/WebWorkÕÒµ½. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Chaining Interceptor.html b/docs/chinese/wikidocs/Chaining Interceptor.html deleted file mode 100644 index a59a7e637..000000000 --- a/docs/chinese/wikidocs/Chaining Interceptor.html +++ /dev/null @@ -1,66 +0,0 @@ - - - WebWork 2 : Chaining Interceptor - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

How to use the Chaining Interceptor

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
- -
-
Interceptors-stack A before
  Action A
  Interceptor-stack B before
    Action B
    Action B result
  Interceptor-stack B after
Interceptor-stack A after
-
-

Interceptors that wrap Chained Actions

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 'teach-myself-webwork-and-hibernate project named 'cash' after Johnny Cash.

-
<interceptor name="hibernate" class="cash.interceptor.HibernateInterceptor"/>
      <interceptor name="login" class="cash.interceptor.LoginInterceptor"/>

      <interceptor-stack name="cashDefaultStack">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="component"/>
        <interceptor-ref name="hibernate"/>
        <interceptor-ref name="login"/>
      </interceptor-stack>
      <interceptor-stack name="cashValidationWorkflowStack">
        <interceptor-ref name="cashDefaultStack"/>
        <interceptor-ref name="validation"/>
        <interceptor-ref name="workflow"/>
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="cashDefaultStack"/>

    <action name="list" class="cash.action.SelectUserAction">
      <result name="success" type="dispatcher">list.vm</result>
    </action>

    <action name="edit" class="cash.action.EditAction">
      <result name="success" type="chain">list</result>
      <result name="input" type="dispatcher">edit.vm</result>
      <interceptor-ref name="cashValidationWorkflowStack"/>
    </action>
-

-In this example, after editing a user, the EditAction is chained to the ListAction to display a list of all users to the screen.

We want the following -

-
EditActionInterceptorStack - before
    EditAction
    ListActionInterceptorStack (except for Hibernate) - before
      ListAction
    ListActionInterceptorStack (except for Hibernate) - end
  EditActinInterceptorStack - end
-

But instead we get: -
-
EditActionInterceptorStack - before
    EditAction
    ListActionInterceptorStack (including Hibernate) - before
      ListAction
    ListActionInterceptorStack (including Hibernate) - end
  EditActinInterceptorStack - end  ERROR!  Hibernate Session / Transaction is already closed!!!
-

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

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.

-
package cash.interceptor;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Transaction;

import org.apache.log4j.Logger;

import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;

import cash.action.HibernateAction;
import cash.util.HibernateUtil;

/**
 * @author Gavin King
 * @author Joel Hockey
 * @version $Id: Chaining\040Interceptor.html,v 1.1 2005/03/21 04:15:38 plightbo Exp $
 */
public class HibernateInterceptor implements Interceptor {
    private static final Logger LOG = Logger.getLogger(HibernateInterceptor.class);

    private static ThreadLocal s_threadLocal = new ThreadLocal();

    /** destroy */
    public void destroy() { }

    /** init */
    public void init() { }

    /** implement intercept */
    public String intercept(ActionInvocation invocation) throws Exception {
        LOG.debug("HibernateInterceptor called");

        Action action = invocation.getAction();
        if (!(action instanceof HibernateAction)) { return invocation.invoke(); }

        // continue with HibernateAction
        HibernateAction ha = (HibernateAction)action;

        // if this interceptor is being chained, then transaction will already exist
        // in that case, we should let the outer interceptor dispose of the sesion
        boolean inChainedAction = true;
        Transaction transaction = (Transaction)s_threadLocal.get();
        if (transaction == null) {
            inChainedAction = false;
            transaction = HibernateUtil.currentSession().beginTransaction();
            s_threadLocal.set(transaction);
        }

        boolean rollback = false;

        try {

            return invocation.invoke();
        } catch (Exception e) {
            // Note that all the cleanup is done
            // after the view is rendered, so we
            // have an open session in the view

            rollback = true;
            if (e instanceof HibernateException) {
                LOG.error("HibernateException in execute()", e);
                return HibernateAction.DBERROR;
            } else {
                LOG.error("Exception in execute()", e);
                throw e;
            }
        } finally {
            try {
                if (!inChainedAction) {
                    s_threadLocal.set(null);
                    disposeSession(transaction, ha.getRollback() || rollback);
                }
            } catch (HibernateException e) {
                LOG.error("HibernateException in dispose()", e);
                return HibernateAction.DBERROR;
            }
        }
    }

    /** dispose of session */
    public void disposeSession(Transaction transaction, boolean rollback) throws HibernateException {
        LOG.debug("disposing");

        if (!HibernateUtil.currentSession().isConnected()) {
            LOG.debug("Session has already been disposed of - this will happen in a chained action");
            return;
        }

        try {
            if (transaction != null) {
                if (rollback) {
                    LOG.debug("rolling back");
                    transaction.rollback();
                } else {
                    LOG.debug("committing");
                    transaction.commit();
                }
            }
        } catch (HibernateException e) {
            LOG.error("error during commit/rollback", e);
            if (!rollback && transaction != null) {
                LOG.error("rolling back affter previous attempt to commit");
                transaction.rollback();
            }
            throw e;
        } finally {
            HibernateUtil.closeSession();
        }
    }
}
-

For more information, also see OS:Webwork - Why would I use Action Chaining?

- -
- - -
- - HibernateUtil.java (application/octet-stream) -
- - HibernateAction.java (application/octet-stream) -
-
- -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Chaining Interceptor_attachments/HibernateAction.java b/docs/chinese/wikidocs/Chaining Interceptor_attachments/HibernateAction.java deleted file mode 100644 index 6ee66c849..000000000 --- a/docs/chinese/wikidocs/Chaining Interceptor_attachments/HibernateAction.java +++ /dev/null @@ -1,47 +0,0 @@ -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); - } -} - - diff --git a/docs/chinese/wikidocs/Chaining Interceptor_attachments/HibernateUtil.java b/docs/chinese/wikidocs/Chaining Interceptor_attachments/HibernateUtil.java deleted file mode 100644 index 02eaeae4e..000000000 --- a/docs/chinese/wikidocs/Chaining Interceptor_attachments/HibernateUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -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(); - } - } -} \ No newline at end of file diff --git a/docs/chinese/wikidocs/Checkbox tag.html b/docs/chinese/wikidocs/Checkbox tag.html deleted file mode 100644 index dca356a82..000000000 --- a/docs/chinese/wikidocs/Checkbox tag.html +++ /dev/null @@ -1,72 +0,0 @@ - - - WebWork 2 : Checkbox±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:checkbox />

»æÖÆÒ»¸öÀàÐÍΪcheckboxµÄHTMLÊäÈë(input)ÔªËØ, ²¢Ê¹ÓÃOgnlValueStackÖеÄÖ¸¶¨ÊôÐÔÅäÖøÃÔªËØ.

ʾÀý -

-
JSP
    <ww:checkbox label="'checkbox test'" name="'checkboxField1'" value="aBoolean" fieldValue="'true'"/>

Velocity
    #tag( Checkbox "label='checkbox test'" "name='checkboxField1'" value="aBoolean" fieldValue="'true'" )

HTML (simple template, aBoolean == true)
	<input type="checkbox" name="checkboxField1" value="true" checked="checked" />
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
value ·ñ BooleanÀàÐÍ, Èç¹ûΪtrueÔòÌí¼Ó'checked="checked"'
fieldValue ÊÇ HTMLÖи´Ñ¡¿òµÄÖµ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Checkboxlist tag.html b/docs/chinese/wikidocs/Checkboxlist tag.html deleted file mode 100644 index 96316a864..000000000 --- a/docs/chinese/wikidocs/Checkboxlist tag.html +++ /dev/null @@ -1,69 +0,0 @@ - - - WebWork 2 : Checkboxlist±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:checkboxlist />

ʹÓÃÒ»¸öÁÐ±í´´½¨Ò»ÏµÁи´Ñ¡¿ò. ÊôÐÔÅäÖúÍ<ww:select />»ò<ww:radio />ÏàËÆ.

ÊôÐÔ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµµÄÊý¾Ý
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
list ·ñ ¿Éµü´úµÄÊý¾ÝÔ´
listKey ·ñ Property of list objects to get field value from
listValue ·ñ Property of list objects to get field content from
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Client-Side Validation.html b/docs/chinese/wikidocs/Client-Side Validation.html deleted file mode 100644 index 4f953ebf5..000000000 --- a/docs/chinese/wikidocs/Client-Side Validation.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork 2 : ¿Í»§¶ËУÑé - - - - - - - - - -
- -
- This page last changed on Jul 22, 2004 by unkyaku. -
- -

WebWorkÔÚXWork±ê׼УÑé¿ò¼Ü»ù´¡ÉÏÔö¼ÓÁ˿ͻ§¶ËУÑéÖ§³Ö. Äã¿ÉÒÔÔÚ±íµ¥ÖеÄÔÚ<ww:form>±êÇ©ÖÐÖ¸¶¨validate="true"À´¼¤»î¿Í»§¶ËУÑé:

-
<ww:form name="'test'" action="'javascriptValidation'" validate="true">
  ...
</ww:form>
-

Ϊ´ËÄã±ØÐëΪ±íµ¥Ö¸¶¨name.

»¹Ó¦µ±È·ÈÏ<ww:form>±êÇ©ÖÐÉèÖÃÁËÕýÈ·µÄactionºÍnamespaceÊôÐÔ. ÀýÈç, Èç¹ûÓÐÒ»¸öÃûΪ"submitProfile"µÄ»î¶¯ÔÚÃû¿Õ¼ä"/user"ÖÐ, ±ØÐëʹÓÃÏÂÁдúÂë -
-
<ww:form namespace="'/user'" action="'submitProfile'" validate="true">
  ...
</ww:form>
-

¶øÏÂÃæµÄ´úÂëÖÐ, ±íµ¥¿ÉÒÔÕý³£¹¤×÷, ¿Í»§¶ËУÑéÔò²»ÄÜ: -

-
<ww:form action="'/user/submitProfile.action'" validate="true">
  ...
</ww:form>
-

µ±È», ÕâÐèÒªÄãÒѾ­Íê³ÉÁËËùÓбê×¼µÄУÑéÅäÖù¤×÷. ¿Í»§¶Ë½ÌÑÐÊÒÓÃÓÚ·þÎñÆ÷¶ËУÑéÏàͬµÄУÑ鹿Ôò. Èç¹û·þÎñÆ÷¶ËУÑé²»¹¤×÷, ¿Í»§¶ËУÑéÒ²²»¹¤×÷.
- -
-

²¢·ÇÈ«²¿Ð£ÑéÆ÷¶¼Ö§³Ö¿Í»§¶ËУÑé. ½öÓÐʵÏÖScriptValidationAware½Ó¿ÚµÄУÑéÆ÷Ö§³ÖÕâ¸öÌØÐÔ. ¾ßÌåÇé¿ö²Î¼ûWebWorkУÑéÆ÷Áбí

×¢Òâ: ÔÚUI±êÇ©ÖеÄrequiredÊôÐÔ²¢²»½øÐÐÈκοͻ§¶ËУÑé. -


- Éý¼¶¾¯¸æ: ¸ÃÌØÐÔÔÚWebWork 2.1ÒýÈë. Èç¹û´ÓÉϸö°æ±¾Éý¼¶, È·ÈÏvalidators.xmlÖÐʹÓÃÁËÕýÈ·µÄУÑéÆ÷. Äã±ØÐëʹÓñê×¼XWorkУÑéÆ÷µÄcom.opensymphony.webwork.validators.JavaScriptRequired*Validator°æ±¾. -

¹¹½¨Ö§³Ö¿Í»§¶ËУÑéµÄУÑéÆ÷

ÈκÎʵÏÖcom.opensymphony.webwork.validators.ScriptValidationAware½Ó¿ÚµÄУÑéÆ÷¶¼Ö§³Ö¿Í»§¶ËУÑé:

-
public interface ScriptValidationAware extends FieldValidator {
    public String validationScript(Map parameters);
}
-

Èç¹û¼¤»îÁ˿ͻ§¶ËУÑé, validationScript·µ»ØµÄ×Ö·û´®½«ÔÚ¿Í»§¶Ë±í¶ËÌύǰִÐÐ. ÀýÈç, requiredstringУÑéÆ÷°üº¬ÏÂÁдúÂë:

-
public String validationScript(Map parameters) {
        String field = (String) parameters.get("name");
        StringBuffer js = new StringBuffer();

        js.append("value = form.elements['" + field + "'].value;\n");
        js.append("if (value == \"\") {\n");
        js.append("\talert('" + getMessage(null) + "');\n");
        js.append("\treturn '" + field + "';\n");
        js.append("}\n");
        js.append("\n");

        return js.toString();
}
-

Ŀǰֻ֧³ÖJavaScript.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Combobox tag.html b/docs/chinese/wikidocs/Combobox tag.html deleted file mode 100644 index 4b63450bf..000000000 --- a/docs/chinese/wikidocs/Combobox tag.html +++ /dev/null @@ -1,77 +0,0 @@ - - - WebWork 2 : Combobox±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:combobox />

×éºÏ¿òÊÇÓÉHTMLµÄtextºÍSELECTÊäÈë¿Ø¼þ×éºÏ¶ø³É, ÌṩÁË×éºÏ¿òµÄ¹¦ÄÜ. Ëü¿ÉÒÔͨ¹ýSelect¿Ø¼þ½«Îı¾·ÅÈëTextÖÐ, Ò²¿ÉÒÔÖ±½ÓÔÚText×Ö¶ÎÖÐÊäÈë.

±¾ÀýÖÐ, SELECT¿Ø¼þʹÓÃid=yearÊôÐÔÉú³É. CounterÊÇÒ»¸öµü´úÆ÷(Iterator).

-
<ww:bean name="'webwork.util.Counter'" id="year">
  <ww:param name="'first'" value="text('firstBirthYear')"/>
  <ww:param name="'last'" value="2000"/>

  <ww:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/>
</ww:bean>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµ
list ·ñ ÁбíʹÓõĿɵü´úÊý¾ÝÔ´
size ·ñ HTMLµÄsizeÊôÐÔ
maxlength ·ñ HTMLµÄmaxlengthÊôÐÔ
disabled ·ñ HTMLµÄdisabledÊôÐÔ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onkeyup ·ñ HTMLµÄonkeyupÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Common Tags.html b/docs/chinese/wikidocs/Common Tags.html deleted file mode 100644 index 30f244676..000000000 --- a/docs/chinese/wikidocs/Common Tags.html +++ /dev/null @@ -1,83 +0,0 @@ - - - WebWork 2 : ͨÓñêÇ© - - - - - - - - - -
- -
- This page last changed on Nov 29, 2004 by jcarreira. -
- -

Param

-ÉèÖø¸±êÇ©µÄ²ÎÊý. Èç°üº¬ÔÚww:urlºÍww:actionÖÐ. -
-
<ww:action name="VelocityCounter" id="vc">
 <ww:param name="foo" value="'BAR'"/>
</ww:action>
javascript:popUp('<ww:url value="wiki.opensymphony.com/exec/edit"><ww:param name="name" value="Common Tags"/></ww:url>')
-

-Õª×Ôwebwork.tld: -
-
<attribute>
   <name>name</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
   <name>value</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
</attribute>
-
-

Property

ÓÃÓÚ»ñÈ¡½á¹ûÊôÐÔµÄÖµ. Èç¹ûvalueδ¸ø¶¨, ½«Ê¹ÓÃÕ»¶¥Öµ.
- -
-
<ww:property value="id" default="#session[OS:'customer'].id"/>
-

-Õª×Ôwebwork.tld: -
-
<attribute>
   <name>value</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
 </attribute>
 <attribute>
    <name>default</name>
    <required>false</required>
    <rtexprvalue>true</rtexprvalue>
 </attribute>
-
-

Push

-ʹÓÃww:push¿ÉÒÔ½«Ò»¸öֵѹÈëÖµÕ». ÕâÓëww:set(¼ûÏÂÎÄ)ÀàËÆ, Òò´ËÔÚ¾ö¶¨Ê¹ÓÃǰӦµ±¶¼¿´Ò»ÏÂ. -
-
<ww:push value="counter">
  <ww:property value="count"/>
</ww:push>


To make an action available on the stack:

<ww:action name="'SomeAction'" id="sa"/>
<ww:push value="#sa">
 foo = <ww:property value="foo"/>
</ww:push>
-

-Õª×Ôwebwork.tld: -
-
<attribute>
   <name>value</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
</attribute>
-
-

Set

-ʹÓÃww:set±êÇ©, Äã¿ÉÒÔÔÚJSPÖд´½¨Ò»¸ö×Ô¼ºÃüÃû±äÁ¿. ¿ÉÒÔʹÓÃ#variableNameµÄÐÎʽÒýÓøñäÁ¿. -
-
<ww:set name="huba" value="foo.bar" scope="webwork" />

<ww:property value="#huba.otherExpression().baz"/>)
-

-Õª×Ôwebwork.tld: -
-
<info>
   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 "webwork"
   is used.
</info>
<attribute>
   <name>name</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
   <name>value</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
   <name>scope</name>
   <required>false</required>
   <rtexprvalue>true</rtexprvalue>
</attribute>
-
-

Url

-¸Ã±êÇ©¹¹ÔìÒ»¸ö±àÂëµÄURL. ¸Ã±êÇ©µÄ×î¼ò°æ±¾, <ww:url/>, Êä³ö±¾Ò³ÃæµÄÏà¶ÔURL. ÏÂÃæÊÇÀý×Ó:
- /jsp/cart.jsp?template=%5BLjava.lang.String%3B%40e29f36&id=%5BLjava.lang.String%3B%40429be9
-ÏÂÃæÊǸü³¤µÄÀý×Ó: -
-
<ww:url value="www.google.com/search">
  <ww:param name="sourceid" value="'navclient'"/>
  <ww:param name="ie" value="'UTF-8'"/>
  <ww:param name="oe" value="'UTF-8'"/>
  <ww:param name="q" value="'webwork'"/>
</ww:url>
-

-Êä³ö½á¹ûΪ:
-http://www.google.com/search?sourceid=navclient&ie=UTF-8&oe=UTF-8&q=webwork

Õª×Ôwebwork.tld: -

-
<attribute>
   <name>value</name>
   <required>false</required>
   <rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
    <name>id</name>
    <required>false</required>
    <rtexprvalue>false</rtexprvalue>
</attribute>
-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Comparison to Struts.html b/docs/chinese/wikidocs/Comparison to Struts.html deleted file mode 100644 index 2ffb52db9..000000000 --- a/docs/chinese/wikidocs/Comparison to Struts.html +++ /dev/null @@ -1,43 +0,0 @@ - - - WebWork 2 : ÓëStrutsµÄ±È½Ï - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

ÌØÐԱȽÏ

ÌØÐÔStrutsWebWork 1.xWebWork 2.x
Action classesStrutsÒªÇóActionÀà¼Ì³ÐÒ»¸ö³éÏóÀà. ÕâҲ˵Ã÷ÁËStrutsµÄÒ»¸ö³£¼ûÎÊÌâ: Õë¶Ô³éÏóÀà±à³Ì¶ø²»ÊǽӿÚ.Action±ØÐèʵÏÖwebwork.Action½Ó¿Ú. »¹ÓÐÆäËû½Ó¿Ú¿ÉÒÔʵÏÖÆäËû·þÎñ, Èç±£´æ´íÎóÐÅÏ¢, »ñÈ¡±¾µØ»¯Îı¾µÈ. ActionSupportÀàʵÏÖÁËÆäÖеÄһЩ½Ó¿Ú, Ò²¿ÉÒÔÓÃ×÷»ùÀà. WebWorkÈ«²¿Õë¶Ô½Ó¿Ú±à³Ì, ÕâÑùºÜÈÝÒײåÈëÄã×Ô¼ºµÄʵÏÖ.ÓëWebWork 1.xÏàͬ, Action±ØÐèʵÏÖcom.opensymphony.xwork.Action½Ó¿Ú, »¹ÓÐһϵÁнӿÚÓÃÓÚÆäËû·þÎñ. WebWork2ÌṩActionSupport ʵÏÖÕâЩ½Ó¿Ú.
Ïß³ÌÄ£ÐÍStrutsµÄAction±ØÐëÊÇḬ̈߳²È«µÄ, ÒòΪËü½öʹÓÃÒ»¸öʾÀý´¦ÀíÈ«²¿ÇëÇó. ÕâÒ»ÏÞÖÆµ¼ÖÂStrutsµÄActionÖ´Ðйý³ÌÖÐʹÓõÄÈκÎ×ÊÔ´±ØÐëÊÇḬ̈߳²È«µÄ»òͬ²½·ÃÎÊ.WebWorkµÄActionÿһ¸öÇëÇóʹÓÃÒ»¸öʵÀý, Ò»´Î¾Í²»´æÔÚḬ̈߳²È«ÎÊÌâ. ʵ¼ùÖÐ, ÿһ´ÎÇëÇóServletÈÝÆ÷¶¼»áÉú³ÉÐí¶à½«±»¶ªÆúµÄ¶ÔÏó, ¶àÒ»¸ö»ò¼¸¸ö¶ÔÏó²¢Ã»ÓÐÖ¤Ã÷»á´øÀ´ÐÔÄÜÎÊÌâ»òÀ¬»øÊÕ¼¯ÎÊÌâ.ͬÉÏ
¶ÔServletµÄÒÀÀµÐÔStrutsµÄActionsÒÀÀµÓÚServlets, ÒòΪִÐÐʱʹÓÃ(»ñÈ¡)ÁËServletRequestºÍServletResponse(¶ø²»ÊÇHttpServletRequestºÍHttpServletResponse). °ó¶¨Servlets(ËäÈ»²»ÊÇHttpServlet)ʵ¼ÊÉϾÍÓëServletÈÝÆ÷°ó¶¨ÁË, ¶øÕâÖÖÒÀÀµ¹ØÏµ²¢²»ÐèÒª. ÀýÈç, Servlet¿ÉÒÔÔÚWeb»·¾³Ö®ÍâÔËÐÐ, µ«JMS¾Í²»ÄÜ.WebWorkµÄActionûÓаó¶¨Web»òÆäËûÈκÎÈÝÆ÷. WebWorkµÄaction¿ÉÒÔÑ¡Ôñ´ÓActionContextÖлñÈ¡requestºÍresponse, µ«Õâ²»ÊDZØÐëµÄ²¢ÇÒ½öµ±¾ø¶Ô±ØÒªÊ±²ÅÊÇÓÃ, Õâ²¢²»»áÓëWebÈÝÆ÷°ó¶¨.ͬÉÏ
¿É²âÊÔÐÔÒѾ­ÓÐÐí¶à²âÊÔStrutsÓ¦ÓõIJßÂÔ, µ«Ö÷ÒªÕϰ­Êµ¼ÊÊÇStrutsµÄActionÓëWeb½ôÃܵİó¶¨ÔÚÒ»Æð(»ñÈ¡RequestºÍResponse¶ÔÏó). ×ŵ¼ÖÂÈËÃǾ­³£ÔÚÒ»¸öÈÝÆ÷ÖвâÊÔSstrutsµÄAction, ÕâÑù×ö¼È»ºÂý¶øÓÖÎÞ·¨½øÐе¥Ôª²âÊÔ. ÓÐÒ»¸öJunitµÄÀ©Õ¹°ü : Struts TestCase (http://strutstestcase.sourceforge.net/)WebWorkµÄaction¿ÉÒÔͨ¹ýʵÀý»¯action, ÉèÖÃÊôÐÔ²¢Ö´Ðеķ½Ê½½øÐвâÊÔͬÉÏ, µ«ÖصãÔÚÓÚ·´×ª¿ØÖÆ(Inversion of Control)ÈòâÊÔ±äµÃ¸ü¼òµ¥, Äã¿ÉÒÔÔÚ²âÊÔÖÐÉèÖÃÒ»¸öʵÏÖ·þÎñ½Ó¿ÚµÄMock¶ÔÏó½øÐвâÊÔ, ¶ø²»ÐèÒªÉèÖ÷þÎñ×¢²á±í»òʹÓõ¥¼þ(static singleton)
FormBeansStrutsÐèҪΪÿ¸ö±íµ¥Ê¹ÓÃFormBean, Õâ²úÉúÁË´óÁ¿µÄ¶àÓàµÄÀà»òÕß²»µÃ²»Ê¹ÓÃDynaBean, ¶øÕâǡǡÊÇÕâÒ»ÏÞÖÆµÄ²úÎïWebWork 1.xÔÊÐíÖ±½ÓʹÓÃActionµÄÊôÐÔ(Ò²¾ÍÊDZê×¼µÄJavabeanÊôÐÔ), ÊôÐÔ¿ÉÒÔ°üº¬·á¸»µÄ¶ÔÏóÀàÐÍÉõÖÁ¿ÉÒÔÓÐ×Ô¼ºµÄÊôÐÔ, ¶øÕâЩÊôÐÔ¶¼¿ÉÒÔ´ÓWebÒ³ÃæÖзÃÎÊ. WebWorkÒ²Ö§³ÖFormBeanģʽ, ÔÚ"WW1:Populate Form Bean and access its value"ÖÐÓйØÒ»Õⲿ·ÖµÄ½éÉÜWebWork 2Ö§³ÖWebWork 1ÖеÄÌØÐÔ, »¹¼ÓÈëÁËModelDrivenµÄActions, ËüÔÊÐíʹÓ÷ḻµÄ¶ÔÏóÀàÐÍ»òÓò¶ÔÏó×÷Ϊform bean, ¿ÉÒÔÔÚWebÒ³ÃæÖÐÖ±½Ó·ÃÎÊËüµÄÊôÐÔ, ÕâÒªºÃÓÚ×÷Ϊ»î¶¯ÊôÐÔµÄ×ÓÊôÐÔ½øÐзÃÎÊ.
±í´ïʽÓïÑÔStruts 1.1¼¯³ÉÁËJSTL, Òò´ËËüʹÓÃJSTL EL. ¸ÃÓïÑÔÖ§³Ö»ù±¾µÄ¶ÔÏóͼ±éÀú, µ«¶Ô¼¯ºÏºÍË÷ÒýµÄÊôÐÔµÄÖ§³ÖÒªÈõһЩ.WebWork 1.xÓµÓÐ×Ô¼ºµÄ±í´ïʽÓïÑÔÓÃÒÔ·ÃÎÊÖµÕ». ¶Ô¼¯ºÏÒÔ¼°Ë÷ÒýÊôÐÔµÄÖ§³ÖºÜ»ù±¾µ«ºÜºÃ. WebWorkÒ²¿ÉÒÔÖ±½ÓÓëJSTL¹²Í¬Ê¹ÓÃ, ²Î¼ûWW1:Using JSTL seamlessly with WebWorkWebWork 2ʹÓÃXW:Ognl, ÕâÊÇÒ»¸ö·Ç³£Ç¿´óµÄ±í´ïʽÓïÑÔ, Ò²¿ÉÒÔ·ÃÎÊÖµÕ». Ognl¶Ô¼¯ºÏºÍË÷ÒýÊôÐÔµÄÖ§³Ö·Ç³£Ç¿´ó. Ognl»¹Ö§³ÖһЩǿ´óµÄÌØÐÔÈçͶÉä(projections, ¶Ô¼¯ºÏµÄÿһ¸öÔªËØµ÷ÓÃͬһ¸ö·½·¨²¢Ê¹Óýá¹û´´½¨Ò»¸öÐµļ¯ºÏ), ÌôÑ¡(selections, ʹÓÃÒ»¸öÑ¡Ôñ±í´ïʽ¹ýÂ˼¯ºÏ²¢·µ»ØÒ»¸ö×Ó¼¯), ÁÐ±í¹¹ÔìºÍlambda±í´ïʽ (¼ò»¯¹¦ÄÜ). Ognl»¹ÄÜ·ÃÎʾ²Ì¬·½·¨, ¾²Ì¬×ֶκ͹¹Ôì·½·¨. WebWork2Ò²ÄÜʹÓÃJSTL, ²Î¼ûWW1:Using JSTL seamlessly with WebWork
½«Öµ°ó¶¨µ½ÊÓͼStrutsʹÓñê×¼µÄJSP½«¶ÔÏó°ó¶¨µ½pageContext, ÕâʹµÃÊÓͼÓëformBean½ôÃÜñîºÏWebWorkÉèÖÃÁËÖµÕ», WebWork±êÇ©¿â¿ÉÒÔ´ÓÖÐÊ®·ÖÁé»îµÄ¶¯Ì¬²éÕÒËùÐèµÄÖµ, ¶ø²»ÐèÒª½«ÊÓͼÓëÊý¾ÝÀàÐͽôÃÜñîºÏ. ÕâÑù¾Í¿ÉÒÔÔںܴóµÄ·¶Î§ÄÚ¸´ÓÃÊÓͼ.ͬÉÏ
ÀàÐÍת»»StrutsµÄFormBeansÊôÐÔͨ³£¶¼ÊÇ×Ö·û´®. StrutsʹÓÃCommons-Beanutils½øÐÐÀàÐÍת»». ÿ¸öÀàʹÓÃÒ»¸öת»»Æ÷, µ«²»ÔÊÐíΪÿ¸öʵÀýÅäÖò»Í¬µÄת»»Æ÷. »ñȡһ¸öÓÐÒâÒåµÄÀàÐÍת»»´íÎó²¢ÏÔʾ¸øÓû§Ò²ÊǺÜÄÑ×öµ½µÄ.WebWork 1.xʹÓÃPropertyEditors½øÐÐÀàÐÍת»». PropertyEditorsÕë¶ÔÀàÐͶø²»ÊÇAction, µ«×ֶδíÎóÐÅÏ¢¿ÉÒÔ¼Óµ½»î¶¯µÄ×Ö¶ÎÐÅÏ¢±íÖв¢×Ô¶¯ÏÔʾ¸øÓû§.WebWork2ʹÓÃOgnl½øÐÐÀàÐÍת»», ²¢Îª»ù±¾ÀàÐÍÌṩÁËת»»Æ÷. ÀàÐÍת»»È±Ê¡Çé¿öÏÂʹÓÃÉÏÊöת»»Æ÷, µ«Ò²¿ÉÒÔΪÿ¸öÀàµÄÿ¸ö×Ö¶ÎÖ¸¶¨×ª»»Æ÷. ÀàÐÍת»»´íÎóÒ²ÓÐȱʡ´íÎóÐÅÏ¢µ«¿ÉÒÔʹÓñ¾µØ»¯»úÖÆÉèÖÃÿ¸ö×ֶεÄÐÅÏ¢, ×ֶδíÎóÐÅÏ¢¿ÉÒÔ¼Óµ½»î¶¯µÄ×Ö¶ÎÐÅÏ¢±íÖв¢ÏÔʾ¸øÓû§.
ǰ/ºó´¦Àíģʽ±ØÐë´´½¨Ò»¸ö¼Ì³Ð»ùÀàActionµÄÀàÀ´×÷ΪActionǰ/ºó´¦ÀíµÄ´úÀí, Õ⽫µ¼ÖÂÀà¼Ì³Ð²ã´Î¹ýÉî, Ò²¿ÉÄÜÒòΪµ¥¼Ì³ÐµÄÏÞÖÆ¶øÎÞÄÜΪÁ¦WW:Comparison to Struts#1Àà¼Ì³ÐWebWork 2ÔÊÐíʹÓýØÈ¡Æ÷Ä£¿é»¯Ç°/ºó´¦Àí. À¹½ØÆ÷¿ÉÒÔͨ¹ýÅäÖö¯Ì¬Ìí¼Ó, Á½ÕßÖ®¼äûÓÐÈκÎñîºÏ.
УÑéStrutsµ÷ÓÃFormBeanµÄvalidate()·½·¨. StrutsÓû§Í¨³£Ê¹ÓÃCommons Validation½øÐÐУÑé. ÎҶԴ˲»Ì«Á˽â, Òò´Ë½öÌá³ö¼¸¸öÎÊÌâ:
 
ÓÉÓÚFormBeanÊôÐÔÒ»°ã¶¼ÊÇ×Ö·û´®, ijЩУÑé·½·¨ÊÇ·ñ»áÖØ¸´»òÎÞ·¨×öµ½?
 
Commons ValidationÊÇ·ñÄÜΪͬһ¸öÀàÉèÖò»Í¬µÄУÑé»·¾³? (ÎÒÒѱ»¸æÖª¿ÉÒÔ×öµ½, ÕâÊǺÃÊÂ)
 
Commons ValidationÄÜ·ñʹÓÃΪ¶ÔÏóÊôÐÔÀඨÒåµÄУÑ鷽ʽ¶Ô×Ó¶ÔÏó(sub-objects)½øÐÐУÑé?
WebWork1.xµ÷ÓÃActionµÄ validate()·½·¨, Äã¿ÉÒÔ±àд´úÂëУÑé, Ò²¿ÉÒÔµ÷ÓÃÍⲿУÑé¿ò¼Ü(ÕâÏÔÈ»ÓëSstrutsÏàͬ)WebWork2¿ÉÒÔʹÓÃWebWork1.xºÍStrutsµÄvalidate()·½·¨, »¹¿ÉÒÔʹÓÃXW:УÑé¿ò¼Ü, ËüÓÉÒ»¸öXWork½ØÈ¡Æ÷¼¤»î. XworkУÑé¿ò¼ÜÔÊÐíÓÃXML¸ñʽ±àдУÑéÆ÷, ¿ÉÒÔΪÿ¸öÀàÌṩһ¸öȱʡУÑéÆ÷²¢ÔÚ²»Í¬µÄУÑé»·¾³ÖÐʹÓö¨ÖÆÐ£ÑéÆ÷.XworkУÑé¿ò¼ÜÓÉÒ»¸ö½ØÈ¡Æ÷¼¤»îÒò´ËÓëActionÀàÍêÈ«½âź. »¹¿ÉÒÔʹÓÃVisitorFieldValidator½«Ð£Ñé´¦ÀíÁ¬½Óµ½×ÓÊôÐÔ(sub-properties, [ÓëÉÏÎÄÌáµ½µÄ×Ó¶ÔÏóÏàͬ).
¶ÔActionÖ´Ðйý³ÌµÄ¿ØÖÆÒÔÎÒµÄÁ˽â, StrutsÉèÖÃÒ»¸öAction¶ÔÏó, ¶øÄã¶ÔÖ´ÐеÄ˳Ðò¼¸ºõÎÞ·¨¿ØÖÆ. Òª¸Ä±äÕâÒ»µã, ÎÒÈÏΪÐèÒª±àд×Ô¼ºµÄServletÀ´×ÔÐд¦Àí·Ö·¢(dispatching)ÓÉActionFactoryÁ´¿ØÖÆAction´´½¨ºÍ³õʼ»¯µÄ¹ý³Ì, µ«ÐèÒª±àдһ¸öÀàÔÚÕâÒÔÎÊÌâÉÏWebWork 2µÄ½ØÈ¡Æ÷ջʮ·ÖÓÐÓÃ. ÉèÖÃActionµÄ¸÷·½Ã湦Äܶ¼±»×ªÒƵ½½ØÈ¡Æ÷ÖÐʵÏÖ(ÈçÉèÖòÎÊý, УÑéµÈ), Òò´ËÄã¿ÉÒÔÒÀ¾Ý½ØÈ¡Æ÷µÄ¹¦ÄÜ¿ØÖÆÃ¿Ò»¸öActionµÄÖ´ÐÐ˳Ðò. ÀýÈçÄã¿ÉÄÜÏ£ÍûÄãµÄIOC¿ò¼ÜÔÚrequest²ÎÊýÉèÖÃ֮ǰÍê³ÉActionÅäÖÃ, ·´Ö®ÒàÈ» - Ò²¿ÉÒÔʹÓýØÈ¡Æ÷Õ»¶Ôÿ¸ö°ü»òÿ¸öÀà½øÐпØÖÆ.

²Î¿¼×ÊÁÏ

-

½Å×¢

-
    -
  1. StrutsÓû§ÒѾ­ÎªStruts´´½¨ÁËÒ»¸ö½ØÈ¡Æ÷¿ò¼ÜµÄ³ûÐÎ(http://struts.sourceforge.net/saif/). ËüĿǰÓÐһЩÑϸñµÄÏÞÖÆ(²»ÄܽøÐÐ"°üΧ(around)"´¦Àí, ×ÓÔÊÐíǰ/ºó´¦Àí), ¶øÇÒÒ²²»ÊÇStrutsÏîÄ¿µÄÒ»²¿·Ö
  2. -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Component tag.html b/docs/chinese/wikidocs/Component tag.html deleted file mode 100644 index 7a49bdd85..000000000 --- a/docs/chinese/wikidocs/Component tag.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork 2 : Component±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:component />

ÓÃÖ¸¶¨Ä£°æ»æÖƵ͍ÖƵÄUI×é¼þ. ¿ÉÒÔʹÓÃparam±êÇ©½«ÆäËû¶ÔÏó´«µ½Ä£°æÖÐ. ÔÚÄ£°æÖпÉÒÔʹÓà $parameters._paramname_È¡µÃÕâЩ¶ÔÏó.

ÔÚÏÂÃæµÄJSPºÍVelocityµÄÀý×ÓÖÐ, Ïò×é¼þ´«µÝÁËÁ½¸ö²ÎÊý. ÔÚ×é¼þÄÚ²¿, ¿ÉÒÔʹÓÃ$parameters.get('key1')ºÍ$parameters.get('key2')À´·ÃÎʲÎÊý. VelocityÒ²ÔÊÐíʹÓÃ$parameters.key1ºÍ$parameters.key2À´ÒýÓòÎÊý.

Ŀǰ, ¶¨ÖÆUI×é¼þ±ØÐë±àдÔÚVelocityÖÐ.

¼Çס: ²ÎÊýÖµ×ÜÊÇͨ¹ýOgnlValueStackµÃµ½, Òò´ËÈç¹ûÏëÒªÏò×é¼þ´«µÝ×Ö·û´®Îı¾, Ò»¶¨ÒªÓÃÒýºÅ½«ËüÀ¨ÆðÀ´, ÀýÈç: value="'value1'". ·ñÔò½«´ÓÖµÕ»ÖÐËÑË÷¾ßÓз½·¨getValue1()µÄ¶ÔÏó. (ÔÚÎÒ±àдÕⲿ·ÖµÄʱºò, »¹²»ÄÜÍêȫȷÐÅ»áÊÇÕâÑù. ÎÒ»áÑéÖ¤ÕâÒ»Çé¿ö)

Ó÷¨Ê¾Àý -
-
JSP
    <ww:component template="/my/custom/component.vm"/>
      or

    <ww:component template="/my/custom/component.vm">
      <ww:param name="key1" value="value1"/>
      <ww:param name="key2" value="value2"/>
    </ww:component>

Velocity
    #tag( Component "template=/my/custom/component.vm" )

      or

    #bodytag( Component "template=/my/custom/component.vm" )
      #param( "key1" "value1" )
      #param( "key2" "value2" )
    #end
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Components.html b/docs/chinese/wikidocs/Components.html deleted file mode 100644 index 88a438046..000000000 --- a/docs/chinese/wikidocs/Components.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork 2 : ×é¼þ - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

×ÛÊö

WebWork½¨Á¢ÔÚXWorkµÄ×é¼þʵÏÖÖ®ÉÏ, Ìṩ×é¼þ¶ÔÏóµÄÉúÃüÖÜÆÚ¹ÜÀí²¢Ê¹×é¼þÔÚÐèҪʱ¿ÉÒÔÓÃÓڻÀà(»òÆäËûÈκÎÓû§´úÂëÖÐ).

WebWorkÖÐÓÐÁ½ÖÖÀàÐ͵ÄÀà¿ÉÒÔʹÓÃenabler½Ó¿ÚʵÏÖ·´×ª¿ØÖÆ: »î¶¯ºÍ×é¼þ. ΪÁËÈûÀàÓµÓÐËü×Ô¼ºµÄ×é¼þ¼¯ºÏ, ±ØÐëʹÓÃComponentInterceptorΪ»î¶¯ÉèÖÃ×ÊÔ´. ͬÑùµÄ, Èç¹ûÕâЩ×é¼þÐèÒª³õʼ»¯²¢Ê¹ÓÃÆäËû×é¼þ, ÕâЩ³õʼ»¯»î¶¯½«ÔÚComponentInterceptor½ØÈ¡»î¶¯µÄʱºò½øÐÐ.

·¶Î§(Scope)ºÍÉúÃüÖÜÆÚ

ÔÚWebWorkÖÐ×é¼þ¿ÉÒÔ±»ÅäÖóɴæÔÚÓÚÈý¸ö·¶Î§ÖÐ: -

    -
  1. Ò»¸öÇëÇóÆÚ¼ä,
  2. -
  3. ¿çÔ½Ò»¸öÓû§»á»°, »ò
  4. -
  5. WebÓ¦ÓõÄÕû¸öÔËÐÐÖÜÆÚ.
  6. -

-WebWork ÑÓ³Ù¼ÓÔØ(lazy load)×é¼þ, ÕâÒâζ×ÅÎÞÂÛÄÄÒ»·¶Î§µÄ×é¼þ, ¶¼ÔÚʹÓÃÊÇ¿ªÊ¼³õʼ»¯²¢ÔÚ·¶Î§µÄÉúÃüÖÜÆÚ½áÊøÊ±Ïú»Ù. Ò²¾ÍÊÇ˵, Ò»¸öapplication·¶Î§µÄ×é¼þ, for example, ½«ÔÚµÚÒ»¸öʵÏÖ×é¼þµÄEnabler½Ó¿ÚµÄ»î¶¯µÄÓû§ÇëÇóʱ³õʼ»¯, ²¢ÔÚÓ¦ÓýáÊøÊ±±»Ïú»Ù.

×é¼þ¿ÉÒÔÒÀÀµÓÚÆäËû×é¼þ, µ«²»ÄÜÒÀÀµÓÚ¸üС·¶Î§µÄ×é¼þ. Òò´Ë, Ò»¸ösession·¶Î§µÄ×é¼þ²»ÄÜÒÀÀµÓÚÒ»¸öÇëÇó·¶Î§µÄ×é¼þ.

ËùÓÐ×é¼þ±ØÐè×¢²áÔÚcomponents.xmlÖÐ, ¶Ô¸ÃÎļþµÄÃèÊöÔÚ"ÅäÖÃ"Ò»½ÚÖÐ.

»ñÈ¡ComponentManager

ÿһ´ÎÇëÇóʱ¶¼´æÔÚÈý¸ö×é¼þ¹ÜÀíÆ÷, ÿ¸ö·¶Î§Ò»¸ö. ËûÃÇ×÷Ϊһ¸öÊôÐÔ"DefaultComponentManager"´æÔÚÓÚËûÃÇ´ú±íµÄ·¶Î§¶ÔÏóÖÐ. Òò´Ë, Èç¹ûÄãÐèÒªÒ»¸örequest·¶Î§µÄComponentManager¶ÔÏó, ʹÓÃÏÂÃæµÄ´úÂë:

-
ComponentManager cm = (ComponentManager) request.getAttribute("DefaultComponentManager");
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Configuration.html b/docs/chinese/wikidocs/Configuration.html deleted file mode 100644 index c20bf0d51..000000000 --- a/docs/chinese/wikidocs/Configuration.html +++ /dev/null @@ -1,73 +0,0 @@ - - - WebWork 2 : ÅäÖÃ - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

WebWorkÓÐÁ½¸öÅäÖÃÎļþÐèÒªÁ˽â: web.xmlºÍxwork.xml. ±¾ÎÄÃèÊöÁËWebWork±ØÐèµÄºÍ¿ÉÑ¡µÄÅäÖÃÎļþµÄÈ«²¿ÐÅÏ¢.

    -
  1. web.xml
  2. -
  3. xwork.xml
  4. -
  5. webwork-default.xml
  6. -
  7. ½á¹û
      -
    1. È«¾Ö½á¹û
    2. -
    3. ȱʡ½á¹û
    4. -
  8. -
  9. ½ØÈ¡Æ÷
  10. -
  11. °ü
  12. -
  13. Ãû¿Õ¼ä(Namespace)
  14. -
  15. ÖØ¼ÓÔØÅäÖÃÎļþ
  16. -
  17. webwork.properties
  18. -
  19. velocity.properties
  20. -

-ÏÂÎÄÁгöÄãÐèÒªÁ˽âµÄÈ«²¿Îļþ.
- - - - - - - - - - - - - - - - - - - - - -
Îļþ¿ÉѡλÖÃ(ÓëwebappÏà¶Ô·¾¶)ÓÃ;
web.xml·ñ/WEB-INF/Web²¿ÊðÃèÊöÎļþ, °üº¬È«²¿±ØÐèµÄWebWork×é¼þ
xwork.xml·ñ/WEB-INF/classes/Ö÷ÅäÖÃÎļþ, °üÀ¨result/viewÀàÐÍ, »î¶¯Ó³Éä, ½ØÈ¡Æ÷µÈ
webwork.propertiesÊÇ/WEB-INF/classes/WebWorkµÄÊôÐÔÎļþ
webwork-default.xmlÊÇ/WEB-INF/lib/webwork-x.x.jarÓ¦µ±°üº¬ÔÚxwork.xmlÖеÄȱʡÅäÖÃ
velocity.propertiesÊÇ/WEB-INF/classes/¸²¸ÇvelocityµÄȱʡÅäÖÃ
validators.xmlyes/WEB-INF/classes/¶¨ÒåÊäÈëУÑéÆ÷
components.xml/WEB-INF/classes/¶¨ÒåIOC×é¼þ
taglib.tld·ñ/WEB-INF/lib/webwork-x.x.jar Webwork±êÇ©¿âÃèÊöÎļþ
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Cookbook.html b/docs/chinese/wikidocs/Cookbook.html deleted file mode 100644 index 803294bb7..000000000 --- a/docs/chinese/wikidocs/Cookbook.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork 2 : ¾­Ñé̸(cookbook) - - - - - - - - - -
- -
- ±¾Ò³ÓÉcasey×îºóÐÞ¸ÄÓÚ2004Äê12ÔÂ14ÈÕ. -
- -

¾­Ñé̸(cookbook)

-»¶Ó­ä¯ÀÀWebwork¾­Ñé̸. ±¾Ò³Îª¿ª·¢ÕßÖ®¼äÌṩÐÅÏ¢½»»». »¶Ó­ÄúÔڴ˹²Ïí֪ʶºÍÓмÛÖµµÄÌáʾ.

Accessing application, session, request objects
-Iterator tag examples
-Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example
-Value Stack Internals
-Using WebWork Components
-Webwork 2 file upload handling
-How do I populate a form bean and get the value using the taglib
-Interceptor Order
-Tabular inputs with XWorkList
-Using WebWork2 and XWork1 with JSP 2.0 and JSTL 1.1
-Webwork 2 skinning
-Transparent web-app I18N
-Webwork 2 HTML form buttons Howto
-Using Checkboxes
-JFreeChartResult
-Webwork reference to OGNL access
-Application, Session, Request objects in jsp
-Application, Session, Request objects in vm
-Describing a bean in velocity
-File Upload Interceptor
-Resources Available to Velocity Views - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Default results.html b/docs/chinese/wikidocs/Default results.html deleted file mode 100644 index 7ea4f49ab..000000000 --- a/docs/chinese/wikidocs/Default results.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork 2 : ȱʡ½á¹û - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

WebworkÄÜΪ»î¶¯¶¨ÒåÒ»¸öȱʡ½á¹ûÀàÐÍ. Òò´Ë, Äã²»±ØÖ¸¶¨½á¹ûÀàÐÍ. Èç¹ûÒ»¸ö°üÀ©Õ¹ÁËÁíÒ»¸ö°ü¶øÃ»ÓÐΪ×Ó°üÖ¸¶¨ÐµÄȱʡ½á¹ûÀàÐÍ, µ±resultÔªËØµÄtypeÊôÐÔδָ¶¨Ê±Ò²½«Ê¹Óø¸°üµÄȱʡ½á¹ûÀàÐÍ.

-
<!-- parts of xwork.xml  -->
....

<result-types>
 <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
 <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
 <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
</result-types>

....

<action name="bar" class="myPackage.barAction">

<!-- this result uses dispatcher, so you can omit the type="dispatcher" if you want -->
  <result name="success">foo.jsp</result>

<!-- this result uses velocity result, so the type needs to be specified -->
  <result name="error" type="velocity">error.vm</result>

</action>

....
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Dependencies.html b/docs/chinese/wikidocs/Dependencies.html deleted file mode 100644 index 802901020..000000000 --- a/docs/chinese/wikidocs/Dependencies.html +++ /dev/null @@ -1,40 +0,0 @@ - - - WebWork 2 : ÒÀÀµÀà¿â - - - - - - - - - -
- -
- This page last changed on Aug 26, 2004 by plightbo. -
- -

ÒÀÀµÀà¿â·ÖΪÔËÐÐʱºÍ±àÒëʱÁ½²¿·Ö.

    -
  • ÔËÐÐʱÒÀÀµÀà¿â´æ·ÅÔÚCVSµÄlib/coreĿ¼ÏÂ.
  • -
  • ±àÒëʱÒÀÀµÀà¿â´æ·ÅÔÚCVSµÄlib/buildĿ¼ÏÂ.
  • -

-Äã¿ÉÒÔÔÚÉÏÊöĿ¼µÄlibraries.txtÎļþÖвéÕÒµ½ËüÃǵİ汾ºÅ. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Deployment Notes.html b/docs/chinese/wikidocs/Deployment Notes.html deleted file mode 100644 index 2c8e8ea1a..000000000 --- a/docs/chinese/wikidocs/Deployment Notes.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork 2 : ²¿ÊðWebWork×¢ÒâÊÂÏî - - - - - - - - - -
- -
- ±¾Ò³ÓÉplightbo×îºóÐÞ¸ÄÓÚ2004Äê5ÔÂ24ÈÕ. -
- -

WebWork¿ÉÒÔÔڴ󲿷ÖÓ¦Ó÷þÎñÆ÷ÉÏÔËÐжøÃ»ÓÐÈκÎÎÊÌâ. ¾¡¹ÜÈç´Ë, Äã¿ÉÄÜ»¹ÊÇÐèÒª×ö²»¶àµÄ¸Ä¶¯ÒÔ±ãÔÚÄãµÄ»·¾³ÏÂÔËÐÐ.

WebLogic 6.1

-Ò»¸ö×ÓÏîÄ¿Òѱ»¼ÓÈëWebWorkµÄCVS²Ö¿âÖÐ, Ëü¼«´óµÄ¼ò»¯ÁËʹWebWorkÔÚBEA Weblogic Server 6.1ÏÂÔËÐÐËùÐèµÄµÄÐ޸Ť×÷. Ïà¹ØÎĵµÒ²°üº¬ÔÚÆäÖÐ.
-¸Ã×ÓÏîĿλÓÚĿ¼"misc"ÖÐ.

SunONE 7.0

ÐèҪΪWebWork·ÖÅäÐí¿É:
- -
-
grant {
	permission java.security.AllPermission;
};
-

»ò¸üÃ÷È·µØ,

    -
  • ·ÖÅä¶Ôjava.util.PropertyPermissionµÄдÐí¿É.
  • -
  • Ôö¼Ójava.lang.reflect.ReflectPermission "suppressAccessChecks"
  • -
  • OgnlInvokeÐí¿É
  • -
-
-
grant {
	permission java.util.PropertyPermission "*", "read, write";
	permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
	permission ognl.OgnlInvokePermission "*";
};
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Describing a bean in velocity.html b/docs/chinese/wikidocs/Describing a bean in velocity.html deleted file mode 100644 index abc6a101b..000000000 --- a/docs/chinese/wikidocs/Describing a bean in velocity.html +++ /dev/null @@ -1,53 +0,0 @@ - - - WebWork 2 : Describing a bean in velocity - - - - - - - - - -
- -
- This page last changed on Dec 10, 2004 by sutter2k. -
- -

The follow snippet might be useful during debugging to list the properties inside an
-arbitary bean. Or for handing to a UI developer that use unaware of the getters/setters inside an object.

-
## prints out the property names for a bean
#macro (describeBean $name) 
#set($bu = $webwork.bean("com.opensymphony.util.BeanUtils"))
	#foreach($propName in $bu.getPropertyNames($name))
		<li>$propName</li>
	#end
#end
-

i.e. assuming $obj is a PersonObject that has properties(firstName, lastName, and zip). -

-
#describeBean($obj)
-

-would print
-<li>firstName</li>
-<li>lastName</li>
-<li>zip</li>

One might also expand upon this to build a dynamic interface with via reflection. e.g. -
-
$webwork.evalute("$obj.${propName}")
-

- - - - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Dispatcher Result.html b/docs/chinese/wikidocs/Dispatcher Result.html deleted file mode 100644 index d18bd3e5b..000000000 --- a/docs/chinese/wikidocs/Dispatcher Result.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork 2 : Dispatcher Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

·Ö·¢Æ÷

-°üº¬»òǰ½øµ½Ò»¸öÊÓͼ(ͨ³£ÊÇJSP). WebWorkʹÓÃRequestDispatcher, ¶øÄ¿±êservlet/JSP»áÊÕµ½ÓëԭʼServlet/JSPÏàͬµÄrequest/response¶ÔÏó. Òò´Ë, Äã¿ÉÒÔʹÓÃrequest.setAttribute()ÔÚËüÃÇÖ®¼ä´«µÝ²ÎÊý – WebWorkµÄ»î¶¯Ò²¿ÉÒÔʹÓÃ.

- - - - - - - -
²ÎÊý ±ØÐè ÃèÊö
location ÊÇ Ö´ÐкóÌø×ªµÄλÖÃ(ÀýÈç: jsp)
parse ·ñ ȱʡΪtrue. Èç¹ûÉèΪfalse, location²ÎÊý½«²»×÷ΪOgnl±í´ïʽ½øÐнâÎö
-
-
<result name="success" type="dispatcher">
    <param name="location">foo.jsp</param>
</result>
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Documentation.html b/docs/chinese/wikidocs/Documentation.html deleted file mode 100644 index 1d8ea7422..000000000 --- a/docs/chinese/wikidocs/Documentation.html +++ /dev/null @@ -1,91 +0,0 @@ - - - WebWork 2 : Documentation - - - - - - - - - -
- -
- ±¾Ò³ÓÉcasey×îºóÐÞ¸ÄÓÚ2004Äê12ÔÂ24ÈÕ. -
- -

1. ×ÛÊö

    -
  1. ʲôÊÇWebWork
  2. -
  3. Ðí¿É(License)
  4. -
  5. ¿ªÊ¼WebWorkÖ®ÂÃ
  6. -
  7. ³£¼ûÎÊÌâ½â´ð
  8. -
  9. ¾­Ñé̸(cookbook)
  10. -
  11. ²¿ÊðWebWork×¢ÒâÊÂÏî
  12. -
  13. WebWorkÍÅÌå
      -
    1. ÓʼþÁбí
    2. -
    3. Bug¸ú×ÙºÍwiki
    4. -
  14. -
  15. ¹ØÓÚWebWorkµÄÎÄÕºͳö°æÎï
  16. -
  17. ʹÓÃWebWorkµÄÏîÄ¿
  18. -
  19. ÓëStrutsµÄ±È½Ï
  20. -
  21. WebFlow - WebWorkÇúÏßͼ¹¤¾ß
  22. -
  23. Ó¦Ó÷þÎñÆ÷ - Õë¶Ô²»Í¬Ó¦Ó÷þÎñÆ÷µÄÌáʾÓëÇÏÃÅ
  24. -
-

2. WebWork°æ±¾

- - -

3. Ö¸ÄÏ

-
    -
  1. µÚÒ»¿Î: ÏÂÔØ²¢°²×°WebWork
  2. -
  3. µÚ¶þ¿Î: ÉèÖÃWebÓ¦ÓÃ
  4. -
  5. µÚÈý¿Î: »î¶¯ºÍ½á¹û
  6. -
  7. µÚËÄ¿Î: ÊÓͼ (JSP, Velocity, Freemarker)
  8. -
  9. µÚÎå¿Î: ½ØÈ¡Æ÷(Interceptors)
  10. -
-

4. ²Î¿¼Ö¸ÄÏ

-
    -
  1. ÅäÖÃ
  2. -
  3. ½ØÈ¡Æ÷
  4. -
  5. »î¶¯Á´
  6. -
  7. ·´×ª¿ØÖÆ(IoC)
  8. -
  9. JSP±êÇ©
  10. -
  11. JSP Expression Language Comparison with WebWork 1.x
  12. -
  13. WebWork¶ÔFreemarkerµÄÖ§³Ö
  14. -
  15. ½á¹ûÀàÐÍ
  16. -
  17. ÀàÐÍת»»
  18. -
  19. УÑé
  20. -
  21. OGNL
  22. -
  23. ¹ú¼Ê»¯
  24. -
-

5. ÓëµÚÈý·½¼¯³É

-
    -
  1. SiteMesh
  2. -
  3. Spring
  4. -
  5. Pico
  6. -
  7. Hibernate
  8. -
  9. JUnit
  10. -
  11. Quartz
  12. -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/ExecuteAndWaitInterceptor.html b/docs/chinese/wikidocs/ExecuteAndWaitInterceptor.html deleted file mode 100644 index a8da963a6..000000000 --- a/docs/chinese/wikidocs/ExecuteAndWaitInterceptor.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork 2 : ExecuteAndWaitInterceptor - - - - - - - - - -
- -
- This page last changed on Nov 01, 2004 by mbogaert. -
- -

The ExecuteAndWaitInterceptor is great for running long-lived actions in the background while showing the user a nice progress meter. This also prevents the HTTP request from timing out when the action takes more than 5 or 10 minutes.

Using this interceptor is pretty straight forward. Assuming that you are including webwork-default.xml, this interceptor is already configured but is not part of any of the default stacks. Because of the nature of this interceptor, it must be the last interceptor in the stack. A typical configuration looks like:
- -
xwork.xml
-
...
<action name="myLongRunningAction" class="...">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="execAndWait"/>
    <result name="wait">longRunningAction-wait.jsp</result>
    <result name="success">longRunningAction-success.jsp</result>
</action>
...
-

This interceptor works on a per-session basis. That means that the same action name (myLongRunningAction, in the above example) cannot be run more than once at a time in a given session. On the initial request or any subsequent requests (before the action has completed), the wait result will be returned. The wait result is responsible for issuing a subsequent request back to the action, giving the effect of a self-updating progress meter.

An example of a simple wait JSP is:
- -
longRunningAction-wait.jsp
-
<html>
    <head>
        <title>Please wait</title>
        <meta http-equiv="refresh" content="5;url=<ww:url includeParams="'all'" />"/>
    </head>
    <body>
        Please wait while we process your request. 
        Click <a href="<ww:url includeParams="'all'" />"></a> if this page does not reload automatically.
    </body>
-

Whenever the wait result is returned, the action that is currently running in the background will be placed on top of the stack. This allow you to display progress data, such as a count, in the wait page. By making the wait page automatically reload the request to the action (which will be short-circuited by the interceptor), you can give the appearance of an automatic progress meter.

To set the Thread priority, add the parameter threadPriority (defaults to Thread.NORM_PRIORITY):
- -
xwork.xml
-
<interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>

<interceptor-stack name="defaultStack">
    ...
    <interceptor-ref name="execAndWait">
        <param name="threadPriority">10</param>
    </interceptor-ref>
</interceptor-stack>
-

The thread will receive the name of the action with 'BackgroundThread' appended.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example.html b/docs/chinese/wikidocs/Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example.html deleted file mode 100644 index 27bf7cca5..000000000 --- a/docs/chinese/wikidocs/Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example.html +++ /dev/null @@ -1,43 +0,0 @@ - - - WebWork 2 : Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -
-
<ww:set name="jobz" value="jobs" scope="request" />
-

-The full example below shows a webwork variable "jobs" being exposed as "jobz" to the request scope and being used with jstl and the display tag. -
-
<%@ taglib uri="/WEB-INF/tlds/c.tld" prefix="c" %>
<%@ taglib uri="/WEB-INF/tlds/fmt.tld" prefix="fmt" %>
<%@ taglib uri="/WEB-INF/tlds/displaytag-el-12.tld" prefix="display" %>
<%@ taglib uri="/WEB-INF/tlds/webwork.tld" prefix="ww" %>

<ww:set name="jobz" value="jobs" scope="request" />

<h1><fmt:message key="title.listAllJobs"/></h1>
<display:table name="jobz" class="simple" id="row" >
  <display:column  titleKey="label.global.actions" >
  		<c:url var="viewurl" value="/viewJobDetail.action">
			<c:param name="name" value="${row.name}"/>
  			<c:param name="groupName" value="${row.group}"/>
		</c:url>
  		<c:url var="exeurl" value="/viewJobDetail.action">
			<c:param name="name" value="${row.name}"/>
  			<c:param name="groupName" value="${row.group}"/>
  			<c:param name="executeJobAction" value="execute"/>
		</c:url>
  		<c:url var="editurl" value="/viewJobDetail.action">
			<c:param name="name" value="${row.name}"/>
  			<c:param name="groupName" value="${row.group}"/>
  			<c:param name="editAction" value="edit"/>
		</c:url>
	<a href='<c:out value="${viewurl}"/>'><fmt:message key="label.global.view"/></a> |
	<a href='<c:out value="${editurl}"/>'><fmt:message key="label.global.edit"/></a> |
	<a href='<c:out value="${exeurl}"/>'><fmt:message key="label.global.execute"/></a>  
  </display:column> 

  <display:column property="group" titleKey="label.job.group" sortable="true"   />
  <display:column property="name" titleKey="label.job.name" sortable="true"  />
  <display:column property="description" titleKey="label.job.description" />
  <display:column property="jobClass" titleKey="label.job.jobClass" sortable="true"  />

</display:table>
-

-Please note, at the time of this writing the "titleKey" attribute of the display tag's column tag is not yet released into a final version. It is a feature that is currently, only available through cvs. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/FAQ.html b/docs/chinese/wikidocs/FAQ.html deleted file mode 100644 index 88a984e22..000000000 --- a/docs/chinese/wikidocs/FAQ.html +++ /dev/null @@ -1,125 +0,0 @@ - - - WebWork 2 : ³£¼ûÎÊÌâ½â´ð - - - - - - - - - -
- -
- ±¾Ò³ÓÉlagcisco×îºóÐÞ¸Ä2005-3-2ÓÚ2004Äê10ÔÂ18ÈÕ. -
- -

ÖµÕ»ÖеÄȱʡֵÊÇʲô? (ʹÓÃ#foo·ÃÎÊ)
-attr (°´ÕÕ˳ÐòɨÃèrequest, sessionºÍapplicationÊôÐÔ)
-request (request attributes)
-session (session attributes)
-application (application attributes)
-parameters (request params)

How do I get the latest version of Webwork and XWork from CVS?
-cvs -d :pserver:guest@cvs.dev.java.net:/cvs login
-(Use an empty password, just hit enter..)
-cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout webwork
-cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout xwork

Note: WebWork from the CVS does not compile with the latest 1.5 J2sdk. Use the stable J2sdk 1.4.2.

How do I build the latest versions XWork and Webwork?
-Just go into the XWork or WebWork directories and run 'ant' (you must have ant installed and have the jars of junit and clover inside $ANT_HOME/lib)

Once you have built the xwork.jar copy it into the webwork/lib/core folder, and delete the old one.

How do I use messages from within the validator? -
-
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message key="template.name.errors.required">A default message in case the key is not found</message>
        </field-validator>
    </field>
</validators>
-

How do I set a global resource bundle?

In webwork.properties(as of Webwork 2.1.1),
-you can now use: -
-
webwork.custom.i18n.resources=global-messages
-

-Serveral resource bundles can be specified by comma separating them.
-for example see webwork.properties :
-http://wiki.opensymphony.com/display/WW/webwork.properties

Java class (thanks Drew McAuliffe): -

-
public class WebworkGlobalMessagesListener implements ServletContextListener {
    private static Logger log = Logger.getLogger(WebworkGlobalMessagesListener.class);
    private static final String DEFAULT_RESOURCE = "global-messages";

    /**
     * Uses the LocalizedTextUtil to load messages from the global
     message bundle.
     * @see
     javax.servlet.ServletContextListener#contextInitialized(javax.servlet.Servle
     tContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0) {
        log.info("Loading global messages from " + DEFAULT_RESOURCE);
        LocalizedTextUtil.addDefaultResourceBundle(DEFAULT_RESOURCE);
        log.info("Global messages loaded.");
    }

    /**
     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0) {

        // do nothing
    }

}
-

-web.xml:
-(under listeners section) -
-
<listener>
<listener-class>mypackagename.WebworkGlobalMessagesListener</listener-class>
</listener>
-

How do I change the error message for invalid inputted fields?
-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):
-invalid.fieldvalue.user.dob=Please enter Date of Birth in the correct format.

How do I get access to the Session?
-ActionContext.getContext().getSession() (returns Map, works internally using a ThreadLocal)

How can I see all parameters passed into the Action?
-ActionContext.getParameters() (returns Map, works internally using a ThreadLocal)

How can I get the HttpServletRequest?
-ServletActionContext.getRequest() (works internally using a ThreadLocal)

How can I use the IOC container to initialize a component in another object that isnt an action?
-Obtain the ComponentManager from the request: ComponentManager cm = (ComponentManager) ServletActionContext.getRequest().getAttribute("DefaultComponentManager");
-then you need to initialize it using: cm.initializeObject(Object)

How do I decouple XWork LocalizedTextUtil global resource bundle loading from serlvets (ServletContextListener)?
-If you'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're running in.

What i need to do to put values in a combobox. If I am using webwork2?
-If i have : -
-
#tag(Select "label='xxx '" "name='xxx'" "list=?")
or 
#tag(combobox "label='Prioridade'" "name='inavis.avisTpPrioridade'" "list=?")
-

-the values in this combobox, what i need to do?
-Exemple: -
-
html tag i use to do:

<select..>
  <otpion value="" selected>XXX</option>
</selct>
-

-so...i need to do this using Webwork tags from Velocity...how can i do this??

How do I add I18N to a UI tag, like ww:textfield? -

-
<ww:textfield label="'i18n.label'" name="'label1'" value="''">
-

-This will get the localized text message for the key "i18n.label" and put it in the label. -
-
<ww:textfield label="getText('i18n.label')" name="'label1'" value="''">
-

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("getText($parameters.label)"), making the first example actually work for i18n.

Can I add I18N outside the Action's context? i.e. adding i18n to some JSP using the ww taglib?
-Yes, use the <ww:i18n> tag to push a resource bundle on to the stack. Now calls with <ww:text/> or <ww:property value="getText(...)"/> will read from that resource bundle.

Can I break up my large XWork.xml file into smaller pieces?
-Sure, that's what the <include> element is for. Most xwork.xml files
-already have one:
- -
-
<xwork>
    <include file="webwork-default.xml"/>
    <include file="config-browser.xml"/>
    <package name="default" extends="webwork-default">
....
    </package>
    <include file="other.xml"/>
</xwork>
-

This tells it to load the webwork-default.xml from the webwork jar file
-to get all of those interceptor and result definitions.

You can put your own <include> in your xwork.xml interchangeably with
-<package> elements… They will be loaded in the same order as it reads
-from top to bottom and adds things as it reads them.

How can I put a String literal in a Javascript call, for instance in an onChange attribute?

The problem is in escaping quotes and getting the double quotes around the final value, like we expect in HTML attributes. Here's an example of the right way to do this (thanks to John Brad):
- -
-
onchange='"someFunc(this.form, \'abc\')"'
-

Notice here that there are single quotes surrounding the double quotes, and then the single quotes inline in the Javascript are escaped. This produces this result:

-
onchange="someFunc(this.form, 'abc')"
-

Why won't the 'if' tag evaluate a one char string? -

-
<ww:if test="#myObj.myString == 'A'">
Why doesn't this work when myString is equal to A?
</ww:if>
-

OGNL will interpret 'A' as a char type and not a string. Simple solution - flip the double and single quotes. -
-
<ww:if test='#myObj.myString == "A"'>
This works!
</ww:if>
-

Alternatively, you can escape the double quotes in the String:

-
<ww:if test="#myObj.myString == \"A\"">
This works!
</ww:if>
-

I'm trying to run the webwork example in the tutorial on Tomcat, and it can't instantiate the VelocityEngine

Tomcat says:

javax.servlet.ServletException: Servlet.init() for servlet webwork threw exception at
-org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:963)
-…
-root cause

java.lang.RuntimeException: Unable to instantiate VelocityEngine!
- at
-com.opensymphony.webwork.views.velocity.VelocityManager.newVelocityEngine(VelocityManager.java:333)
- at
-com.opensymphony.webwork.views.velocity.VelocityManager.init(VelocityManager.java:146)
- at
-com.opensymphony.webwork.dispatcher.ServletDispatcher.init(ServletDispatcher.java:177)
- at
-org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:935) -

Solution: (thanks to Keith Lea)

It turns out Velocity's Avalon logging system was trying to write to my tomcat folder.

So that it's on file somewhere for other people, I will describe the solution:

I created a file "velocity.properties" and placed it in my WEB-INF/classes folder. Inside the file I wrote:

runtime.log.logsystem.class=org.apache.velocity.runtime.log.NullLogSystem

This stops velocity from logging, and makes webwork work again. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/File Upload Interceptor.html b/docs/chinese/wikidocs/File Upload Interceptor.html deleted file mode 100644 index 28d964a2c..000000000 --- a/docs/chinese/wikidocs/File Upload Interceptor.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork 2 : File Upload Interceptor - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

We can create a nice reusable Interceptor which can hadle file uploads absolutely transparently and Action will not know anything about web-app and just gets its files: -

    -
  1. Before further invocation it scans multipart request for files, and if content-type and size is acceptable it puts collected java.io.File instance to invocationContext.parameters Map named according to their <input> names.
  2. -
  3. In Action we can just declare properties of type File which will be set by parameters Inteceptor, in execute() we can move file with aFile.renameTo(...) to the right place, or just read the it and leave alone.
  4. -
  5. After invocation it removes all uploaded files via aFile.delete(). (Action should not care for iles uploaded waste disk space)
  6. -

-This Interceptor may be configured to filter files with certain mime type or size, and of course to be applied to any action(s) or even included into stack.

-
<interceptor name="fileUpload" class="neuro.util.xwork.FileUploadInterceptor">
    <param name="allowedTypes">image/jpeg</param>
    <param name="maximumSize">8192</param>
</interceptor>
-

This removes (duplicate) web-app specific code from Action and gives ua a nice reusable component that handles 90% of all typical file upload tasks. Neat. Also illustrates power of Interceptor concept of XW:XWork/WW:WebWork. Try to do this in Struts. 8)

Things to improve: error handling, reporting & i18n.
- -
-
//FileUploadInterceptor.java

package neuro.util.xwork;

import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.webwork.dispatcher.multipart.MultiPartRequestWrapper;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.File;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;

/**
 *
 */
public class FileUploadInterceptor implements Interceptor {
    protected static final Log log = LogFactory.getLog(FileUploadInterceptor.class);

    protected String allowedTypes;
    protected String disallowedTypes;
    protected Long maximumSize;

    /**
     */
    public FileUploadInterceptor() {
        if (log.isDebugEnabled()) log.debug("new FileUploadInterceptor()");
    }

    /**
     */
    public void init() {
        if (log.isDebugEnabled()) log.debug("init()");
    }

    /**
     */
    public void destroy() {
        if (log.isDebugEnabled()) log.debug("destroy()");
    }

    /**
     * list of allowed mime-types, optional
     */
    public void setAllowedTypes(String allowedTypes) {
        this.allowedTypes = allowedTypes;
    }

    /**
     * list of diallowed mime-types, optional
     */
    public void setDisallowedTypes(String disallowedTypes) {
        this.disallowedTypes = disallowedTypes;
    }

    /**
     * maximum file Size, optional
     */
    public void setMaximumSize(Long maximumSize) {
        this.maximumSize = maximumSize;
    }

    /**
     *
     * TODO: i18n!
     */
    public String intercept(ActionInvocation invocation) throws Exception {
        if (!(ServletActionContext.getRequest() instanceof MultiPartRequestWrapper)) {
            if (log.isDebugEnabled()) log.debug("bypass " + invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName());
            return invocation.invoke();
        }
        MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) ServletActionContext.getRequest();
        if (multiWrapper.hasErrors()) {
            Collection errors = multiWrapper.getErrors();
            Iterator i = errors.iterator();
            while (i.hasNext()) {
                //how to get to addError() from here?
                log.error((String) i.next());
            }
        }

        Enumeration e = multiWrapper.getFileNames();

        //Bind allowed Files
        while (e.hasMoreElements()) {
            // get the value of this input tag
            String inputName = (String) e.nextElement();
            // get the content type
            String contentType = multiWrapper.getContentType(inputName);
            // get the name of the file from the input tag
            String fileName = multiWrapper.getFilesystemName(inputName);
            // Get a File object for the uploaded File
            File file = multiWrapper.getFile(inputName);

            log.info("file " + inputName + " " + contentType + " " + fileName + " " + file);

            // If it's null the upload failed
            if (file == null) {
                log.error("Error uploading: " + fileName);
            } else {
                if (acceptFile(file, contentType, inputName))
                    invocation.getInvocationContext().getParameters().put(inputName, file);
                // Do additional processing/logging...
            }
        }

        //Invoke Action
        String result = invocation.invoke();

        //Cleanup
        e = multiWrapper.getFileNames();
        while (e.hasMoreElements()) {
            String inputValue = (String) e.nextElement();
            File file = multiWrapper.getFile(inputValue);
            log.info("removing file " + inputValue + " " + file);
            if (file != null && file.isFile()) file.delete();
        }

        return result;
    }

    //overload this method to modify accept behaviour
    //TODO: addErrors?
    //TODO: i18n!
    protected boolean acceptFile(File file, String contentType, String inputName) {
        if (log.isDebugEnabled()) log.debug("checking" + inputName + " " + file.getName() + " " + file.length() + " " + contentType);
        if (maximumSize != null && maximumSize.longValue() < file.length())
            log.error("file is too long:" + inputName + " " + file.getName() + " " + file.length());
        else if (allowedTypes != null && allowedTypes.indexOf(contentType) < 0)
            log.error("Content-Type not allowed:" + inputName + " " + file.getName() + " " + contentType);
        else if (disallowedTypes != null && disallowedTypes.indexOf(contentType) >= 0)
            log.error("Content-Type disallowed:" + inputName + " " + file.getName() + " " + contentType);
        //somehow we need to set error messages here...
        else {
            if (log.isDebugEnabled()) log.debug("accepted");
            return true;
        }
        if (log.isDebugEnabled()) log.debug("not accepted");
        return false;
    }

}
-

-Example Page code: -
-
<form .... enctype="multipart/form-data">
    ....
    select user icon:
    <input type="file" name="picture">
<form>
-

-Example Action code: -
-
/**
     */
    protected File picture;

    public void setPicture(File picture) {
        this.picture = picture;
    }

    /**
     */
    public String execute() {
        if (picture != null && picture.isFile()) {
            final File target = new File("...");
            if (target.exists()) {
                if (log.isDebugEnabled()) log.debug("Removed previous picture version");
                target.delete();
            }
            picture.renameTo(target);
        }
    }
-

If this Interceptor considered generally useful - may be it will be incorporated into WW2 codebase?

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/File tag.html b/docs/chinese/wikidocs/File tag.html deleted file mode 100644 index 2c4fde1fb..000000000 --- a/docs/chinese/wikidocs/File tag.html +++ /dev/null @@ -1,71 +0,0 @@ - - - WebWork 2 : File±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:file />

ÉÏÔØÎļþ±íµ¥±êÇ©.

Ó÷¨Ê¾Àý -

-
<ww:file name="'uploadedFile'" />
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
accept ·ñ HTMLµÄacceptÊôÐÔ: Áгö½ÓÊܵÄÎļþÀàÐÍ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Form tag.html b/docs/chinese/wikidocs/Form tag.html deleted file mode 100644 index 7980d51e5..000000000 --- a/docs/chinese/wikidocs/Form tag.html +++ /dev/null @@ -1,76 +0,0 @@ - - - WebWork 2 : Form±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:form />

Ò»¸öHTML±íµ¥.

Ó÷¨Ê¾Àý -

-
<ww:form name="'myForm'" action="'submit.action'">
...
</ww:form>
-

-
<ww:form name="'myForm'" action="'submit'" namespace="'/foo'">
...
</ww:form>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµ
openTemplate ·ñ ÓÃÓÚ±êÇ©¿ªÊ¼µÄÄ£°æ
action ÊÇ HTMLµÄactionÊôÐÔ
namespace ·ñ »î¶¯µÄÃû¿Õ¼ä
target ·ñ HTMLµÄtargetÊôÐÔ
method ·ñ 'GET'»ò'POST'
enctype ·ñ HTMLµÄenctypeÊôÐÔ
validate ·ñ ÊÇ·ñʹÓÿͻ§¶ÎУÑé
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ÓÃÓÚ±êÇ©½áÊøµÄÄ£°æÃû

-
-×¢Òâ: actionÊôÐÔÓÐÁ½ÖÖ¹¤×÷·½Ê½. µÚÒ»¸öÀý×ÓÖÐչʾµÄÊÇ×î³õµÄ(Ò²ÊDZ»·ÏÆúµÄ)¸ñʽ. иñʽÔÊÐí½öʹÓö¨ÒåÔÚxwork.xmlÖеĻÃû³Æ(Èç¹ûÓÐÃû¿Õ¼ä, »¹Òª¼ÓÉÏÃû¿Õ¼ä). Èç¹ûÐèÒª¿Í»§¶ÎУÑéµÄ»°, ÕâÊDZØÐèµÄ
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/FreeMarker Result.html b/docs/chinese/wikidocs/FreeMarker Result.html deleted file mode 100644 index e54c674a1..000000000 --- a/docs/chinese/wikidocs/FreeMarker Result.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork 2 : FreeMarker Result - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by cameronbraid. -
- -

FreeMarker

- - - - - - - - - - -
Parameters Required Description
location yes the location of the template to process
parse no true by default. If set to false, the location param will not be parsed for Ognl expressions
contentType no defaults to "text/html" unless specified
-
-
<result name="success" type="freemarker">foo.ftl</result>
-

-

Location of the Template

-The FreemarkarManager class configures the template loaders so that the template location can be either -
    -
  • relative to the web root folder. eg /WEB-INF/views/home.ftl
  • -
  • a classpath resuorce. eg com/company/web/views/home.ftl
  • -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Getting Started.html b/docs/chinese/wikidocs/Getting Started.html deleted file mode 100644 index 1f8090b90..000000000 --- a/docs/chinese/wikidocs/Getting Started.html +++ /dev/null @@ -1,69 +0,0 @@ - - - WebWork 2 : ¿ªÊ¼WebWorkÖ®Âà - - - - - - - - - -
- -
- ±¾Ò³ÓÉcasey×îºóÐÞ¸ÄÓÚ2004Äê9ÔÂ10ÈÕ. -
- -

±¾Õ¾µãÄÚÈÝÊʺÏÓÚÒѾ­Àí½âÁËÏà¹Ø¼¼ÊõµÄÓо­ÑéµÄ¿ª·¢Õß. ÔÚ¿ªÊ¼ÉîÈëÁ˽âWebworkÈçºÎ¹¤×÷²¢ÔËÐÐÑÝʾ³ÌÐò֮ǰ, ÍÆ¼öÄúÖØÐÂÉóÊÓÏÂÁиÅÄî: -

    -
  • Java
  • -
  • Servlets, JSP, and Tag Libraries
  • -
  • JavaBeans
  • -
  • HTML and HTTP
  • -
  • Web Containers (ex. Tomcat)
  • -
  • XML
  • -
-

Õ¾µã¼°ÏÂÔØ

±¾Õ¾µãÌṩ¶àÖÐÏÂÔØÄÚÈÝ. ²Î¼ûÏÂÁÐÁ´½Ó:
- - -

·¢Ðаü°üº¬µÄÄÚÈÝ

·¢Ðаü°üº¬ÏÂÁÐĿ¼½á¹¹:

-
docs/
lib/
src/
src/java/template/
webwork-(VERSION).jar
webwork-example.war
webwork-migration.jar
-

docsĿ¼°üº¬µ±Ç°°æ±¾µÄJavadoc, ÄúÕýÔÚÔĶÁµÄÎĵµ, ÒÔ¼°JunitµÄ¹¹½¨±¨¸æ. libĿ¼°üº¬WebWork±ØÐèµÄÒÔ¼°¿ÉÑ¡ÓõÄÖ§³Ö°ü:

-
lib/
      core/
      migration/
      optional/
-

×¢Òâ: ûÓÐÒ»¸ö¿ÉÑ¡°üÊÇWebWorkÔËÐÐʱ±ØÐëʹÓõÄ. Èç¹ûÄãÏ£ÍûʹÓÃÄ³Ð©ÌØÐÔÈçJasperReport»òFreeMarker½á¹ûÀàÐÍ, ¾Í±ØÐë°üº¬¿ÉÑ¡°ü.

WebworkÒ²½«È«²¿µÄÔ´ÎļþºÍJSP±êǩģ°æ´ò°üÔÚÆäÖÐ.

°²×°

ÏÂÎĽéÉÜÈçºÎÉèÖÃÄãµÄWebÓ¦ÓÃ. ¸´ÖÆwebwork-(VERSION).jar, /lib/coreĿ¼ÖÐÈ«²¿µÄ*.jar ÎļþÒÔ¼°/lib/optionalĿ¼ÖÐÐèÒªµÄ*.jarÎļþµ½ÄãµÄwebapp/libĿ¼ÖÐ. Èç¹ûÄãÐèÒª¶¨ÖÆÄã×Ô¼ºµÄÄ£°æ(ÓÃÓÚÃèÊöÈçºÎʹÓÃwebwork UI±êÇ©»æÖÆHTML), ½«/src/java/templateĿ¼¸´ÖƵ½ÄãµÄwebapp/Ŀ¼ÖÐ. ÄãµÄWebÓ¦Óÿ´ÆðÀ´¿ÉÄÜÏñÕâÑù:
- -
-
/mywebapp/
/mywebapp/template/
/mywebapp/META-INF/
/mywebapp/WEB-INF/
/mywebapp/WEB-INF/classes/
/mywebapp/WEB-INF/lib/
/mywebapp/WEB-INF/lib/CORE&OPTIONAL *.jar
/mywebapp/WEB-INF/web.xml
-

Äã¿ÉÒÔÖ±½Óǰ½øµ½ÅäÖûòWebworkÖ¸ÄÏ

ÔËÐÐÑÝʾ³ÌÐò

ΪÁËÔËÐÐwebworkÓ¦ÓúÍÑÝʾ³ÌÐò, ÄãÐèÒªÒ»¸öservlet/jspÒýÇæ. Èç¹ûûÓÐ, ½¨ÒéÄãÁ˽âÒ»ÏÂApache Tomcat, ÕâÊÇÒ»¸öÓÉApache JakartaÏîÄ¿¿ª·¢µÄÃâ·ÑµÄServletÈÝÆ÷, Ò²¿ÉÒÔʹÓÃCaucho TechnologyµÄResin, Ëü¿ÉÒÔÃâ·ÑÓÃÓÚ·ÇÉÌÒµÓÃ;. µ±ÄãµÄServletÈÝÆ÷ÉèÖÃÍê±Ïºó, ¾Í¿ÉÒÔ°²×°webworkʾÀýÓ¦ÓÃ(*.war)ºÍÆäËûÈκÎÑÝʾ³ÌÐòÁË, Ö»Ð轫.warÎļþ·ÅÖÃÔÚÈÝÆ÷µÄwebappĿ¼Ï¼´¿É. TomcatµÄĿ¼λÖÃÈçÏÂ: -

-
<TOMCAT_HOME>/webapps/webwork-example.war
-

-µ±warÎļþ·ÅÖÃÔÚÕýÈ·µÄλÖúó, Æô¶¯webÈÝÆ÷²¢Í¨¹ýWebä¯ÀÀÆ÷·ÃÎÊÏÂÃæµÄURL.

http://HOST:PORT/webwork-example
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Global results.html b/docs/chinese/wikidocs/Global results.html deleted file mode 100644 index 8ba6a7dd6..000000000 --- a/docs/chinese/wikidocs/Global results.html +++ /dev/null @@ -1,44 +0,0 @@ - - - WebWork 2 : È«¾Ö½á¹û - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

È«¾Ö½á¹ûÔÊÐí¶¨ÒåÒ»¸ö½á¹ûÓ³Éä, Ëü¿ÉÒÔ×÷Ϊȫ²¿»î¶¯µÄȱʡ½á¹û, ²¢×Ô¶¯±»±¾°ü¼°ËùÓÐÀ©Õ¹°üÖеĻ¼Ì³Ð. »»ÑÔÖ®, Èç¹ûÄãÏëΪ¶à¸ö»î¶¯Ö¸¶¨Í¬Ò»¸ö½á¹û, ¾Í¿ÉÒÔ°ÑËü¶¨ÒåΪȫ¾Ö½á¹û. -

ʾÀý
-
-
<package name="default">
....
<global-results> 
    <result name="login" type="dispatcher"> 
        <param name="location">login.jsp</param> 
    </result> 
</global-results> 
<action name="foo"  class="mypackage.fooAction">
    <result name="success" type="dispatcher">bar.jsp</result> 
</action>
<action name="submitForm"  class="mypackage.submitFormAction">
    <result name="success" type="dispatcher">submitSuccess.jsp</result> 
</action>
...
</package>
-

-µÈͬÓÚ -
-
<package name="default">
....
<action name="foo"  class="mypackage.fooAction">
    <result name="success" type="dispatcher">bar.jsp</result> 
    <result name="login" type="dispatcher">login.jsp</result> 
</action>
<action name="submitForm"  class="mypackage.submitFormAction">
    <result name="success" type="dispatcher">submitSuccess.jsp</result>
    <result name="login" type="dispatcher">login.jsp</result>  
</action>
...
</package>
-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Hibernate.html b/docs/chinese/wikidocs/Hibernate.html deleted file mode 100644 index 7325b090a..000000000 --- a/docs/chinese/wikidocs/Hibernate.html +++ /dev/null @@ -1,39 +0,0 @@ - - - WebWork 2 : Hibernate - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

ÔÚWebWorkÖÐʹÓÃHibernateºÎÔÚÆäËûWeb¿ò¼ÜÖÐûʲô²»Í¬. Ö»ÐèÒª°´ÕÕhttp://www.hibernate.org/5.htmlµÄÃèÊöÅäÖÃHibernate. µ«ÊÇ, Óм¸¸öÒѾ­ÔÚÏÂÁÐÏîÄ¿Öгɹ¦Ó¦ÓõÄÓÅÐãģʽ:

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Hidden tag.html b/docs/chinese/wikidocs/Hidden tag.html deleted file mode 100644 index 23b94c0bf..000000000 --- a/docs/chinese/wikidocs/Hidden tag.html +++ /dev/null @@ -1,59 +0,0 @@ - - - WebWork 2 : Hidden±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:hidden />

Ò»¸öÀàÐÍΪ"hidden"µÄINPUT±êÇ©.

Ó÷¨Ê¾Àý -

-
<ww:hidden name="'someName'" value="value"/>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµ
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/How do I populate a form bean and get the value using the taglib.html b/docs/chinese/wikidocs/How do I populate a form bean and get the value using the taglib.html deleted file mode 100644 index 7468adfc9..000000000 --- a/docs/chinese/wikidocs/How do I populate a form bean and get the value using the taglib.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork 2 : How do I populate a form bean and get the value using the taglib - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

First off, if you're coming from Struts, you may feel more comfortable using FormBeans instead of using the Action as your form bean. Be aware, though, that in Webwork you DO have the option of having the properties directly in the Action class. If you want to use a FormBean, here's an example: -

-
public class TestAction extends ActionSupport {
    private TestBean myBean;

    public TestBean getMyBean() {
        return myBean;
    }

    public void setMyBean(TestBean myBean) {
        this.myBean = myBean;
    }

    protected String doExecute() throws Exception {
        myBean = new TestBean();
        BeanUtil.setProperties(ActionContext.getContext().getParameters(), myBean);
        return SUCCESS;
    }
}
-

Then, in your success.jsp, which is mapped as the success result of TestAction in the views.properties or actions.xml (see the docs for how to configure actions and view mappings), you can do this: -
-
<!-- This will call getMyBean() on your action and put it on the top of the value stack ->
<webwork:property value="myBean"> 
<!- This will call getName() on your TestBean and print it to the page -->
The name is: <webwork:property value="name"/>
</webwork:property>
-

-This is a good way to do it if you have several parameters from the TestBean that you want to display, but, if you have just one, like in this case, it's probably better to do this: -
-
<webwork:property value="myBean/name"/>
-

-Which will call getMyBean.getName() and print that out to the page. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/HttpHeader Result.html b/docs/chinese/wikidocs/HttpHeader Result.html deleted file mode 100644 index a71ef8baf..000000000 --- a/docs/chinese/wikidocs/HttpHeader Result.html +++ /dev/null @@ -1,51 +0,0 @@ - - - WebWork 2 : HttpHeader Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

HttpHeader

-ʹÓÃÖµÕ»¶¨ÒåHTTPÍ·ÐÅÏ¢.

- - - - - - - - - -
²ÎÊý ±ØÐè ÃèÊö
status ·ñ HTTPÏìÓ¦µÄ״̬Âë
parse ·ñ ȱʡΪtrue. Èç¹ûÉèΪfalse, location²ÎÊý½«²»×÷ΪOgnl±í´ïʽ½øÐнâÎö
headers ·ñ Í·ÐÅÏ¢µÄÖµ

-Example: -
-
<result name="success" type="header">
    <param name="status">204</param>
    <param name="headers.a">a custom header value</param>
    <param name="headers.b">another custom header value</param>
</result>
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/I18n tag.html b/docs/chinese/wikidocs/I18n tag.html deleted file mode 100644 index 5c22a12e9..000000000 --- a/docs/chinese/wikidocs/I18n tag.html +++ /dev/null @@ -1,46 +0,0 @@ - - - WebWork 2 : I18n±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:i18n />

½«×ÊÔ´°ü·ÅÈëÖµÕ», ÒÔ±ãtext±êǩʹÓÃ.

ÊôÐÔ - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
name ÊÇ ×ÊÔ´°üµÄÃû×Ö
-
-Ó÷¨Ê¾Àý
--²Î¼û Text±êÇ©

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Interceptor Order.html b/docs/chinese/wikidocs/Interceptor Order.html deleted file mode 100644 index 61d55de57..000000000 --- a/docs/chinese/wikidocs/Interceptor Order.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork 2 : Interceptor Order - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Interceptors provide an excellent means to wrap before/after processing. The concept reduces code duplication (think AOP).

Order of interceptors…
- -
-
<interceptor-stack name="xaStack"> 
  <interceptor-ref name="thisWillRunFirstInterceptor"/>
  <interceptor-ref name="thisWillRunNextInterceptor"/>
  <interceptor-ref name="followedByThisInterceptor"/>
  <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>
-
-

Note that some interceptors will interrupt the stack/chain/flow… so the order is very important.

Iterceptors implementing com.opensymphony.xwork.interceptor.PreResultListener will run after the Action executes its action method but before the Result executes
- -
-
thisWillRunFirstInterceptor
  thisWillRunNextInterceptor
    followedByThisInterceptor
      thisWillRunLastInterceptor
        MyAction1
        MyAction2 (chain)
        MyPreResultListener  
        MyResult (result)
      thisWillRunLastInterceptor
    followedByThisInterceptor
  thisWillRunNextInterceptor
thisWillRunFirstInterceptor
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Interceptors.html b/docs/chinese/wikidocs/Interceptors.html deleted file mode 100644 index 9e5f2a039..000000000 --- a/docs/chinese/wikidocs/Interceptors.html +++ /dev/null @@ -1,84 +0,0 @@ - - - WebWork 2 : ½ØÈ¡Æ÷ - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

×ÛÊö

½ØÈ¡Æ÷¿ÉÒÔ¶¯Ì¬½ØÈ¡»î¶¯µ÷ÓÃ. ËüΪ¿ª·¢ÕßÌṩÁËÔڻִÐÐǰºóÖ´ÐÐÆäËû´úÂëµÄ»ú»á. ËüÒ²ÄÜ×èÖ¹»î¶¯Ö´ÐÐ. ½ØÈ¡Æ÷»¹Îª¿ª·¢ÕßÌṩÁË¿ÉÖØÓõķ½Ê½À´·â×°¹«¹²¹¦Äܲ¢½«ËüÓ¦Óõ½Ò»¸ö»ò¶à¸ö»î¶¯ÖÐ. ¸ü¶àÐÅÏ¢²Î¼ûXWork: ½ØÈ¡Æ÷. Below describes built in Webwork interceptors.

WebworkÓëXWorkµÄ½ØÈ¡Æ÷

½ØÈ¡Æ÷ÀàÒ²ÄÜÓÃxworkÅäÖÃÎļþÖ¸¶¨µÄÃûÖµ¶Ô(key-value pair)½øÐж¨Òå. ÏÂÁÐÃû×Ö¶¨ÒåÔÚwebwork-default.xmlÎļþÖÐ. Èç¹ûÄãÀ©Õ¹ÁËwebwork-default°ü, Äã¾Í¿ÉÒÔʹÓÃÏÂÁÐÃû×Ö. ·ñÔò±ØÐëÔÚ<interceptors>ÔªËØÖÐʹÓÃÃû×ÖºÍÀàÃû¶¨Òå.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×ÖÃèÊö
timerÊä³ö»î¶¯(°üº¬Ç¶Ì׵ĽØÈ¡Æ÷ºÍÊÓͼ)Ö´ÐÐʱ¼ä
loggerÊä³ö»î¶¯µÄÃû×Ö
chainʹµÃǰһ¸ö»î¶¯µÄÊôÐÔÔÚµ±Ç°»î¶¯ÖпÉÓÃ. ͨ³£Óë<result type="chain">ÔªËØ(ÔÚǰһ¸ö»î¶¯¶¨ÒåÖÐ)Ò»ÆðʹÓÃ. ¸ü¶àÄÚÈݲÎÔÄÁ´½Ó½ØÈ¡Æ÷
static-params°Ñxwork.xmlÖж¨ÒåµÄ²ÎÊýÉèÖõ½»î¶¯ÖÐ. Ï൱ÓÚ°üº¬ÔÚ<action />±êÇ©ÖеÄ<param />±êÇ©.
params½«ÇëÇóµÄ²ÎÊýÉèÖõ½»î¶¯ÀàÖÐ.
model-drivenÈç¹û»î¶¯ÊµÏÖModelDriven, ½«getModel()µÄ½á¹ûѹÈëÖµÕ».
component¼¤»î×¢²áµÄ×é¼þ²¢ÔÊÐí»î¶¯Ê¹ÓÃ. Çë²Î¿¼components.xml
tokenÔڻÖмì²éºÏ·¨ÁîÅÆ(token), ·ÀÖ¹±íµ¥µÄÖØ¸´Ìá½»
token-sessionͬÉÏ, µ«ÊÇÔÚ½Óµ½·Ç·¨ÁîÅÆÊ±½«Ìá½»µÄÊý¾Ý±£´æÔÚsessionÖÐ
validationʹÓö¨ÒåÔÚ{Action}-validation.xmlÖеÄУÑéÆ÷½øÐÐУÑé
workflowµ÷ÓûÀàÖеÄvalidate·½·¨. Èç¹û»î¶¯²úÉúÁË´íÎ󽫷µ»Øµ½ÊäÈëÊÓͼ.
servlet-configÌṩ·ÃÎÊHttpServletRequestºÍHttpServletResponseµÄ;¾¶(ʹÓÃǰÇëÈý˼, ÒòΪËüʹÄãµÄ´úÂëÓëServlet½Ó¿Ú°ó¶¨ÔÚÒ»Æð)
prepareÈç¹û»î¶¯ÊµÏÖPreparable½Ó¿Ú, µ÷ÓÃËüµÄprepare ()·½·¨.
conversionError ½«ActionContextÖеÄÊý¾Ýת»»´íÎóÌí¼Óµ½»î¶¯µÄ×ֶδíÎóÖÐ
fileUpload¼ò»¯·ÃÎÊÉÏ´«ÎļþµÄ½ØÈ¡Æ÷. ¸ü¶àÐÅÏ¢Çë²é¿´javadoc
execAndWaitÔÚºǫִ́ÐзþÎñ²¢ÏòÓû§·¢ËÍÒ»¸öÖмäµÈ´ýÒ³Ãæ. ²Î¼û: ExecuteAndWaitInterceptor

½ØÈ¡Æ÷Ö´ÐÐ˳Ðò

½ØÈ¡Æ÷ÌṩÁËÓÅÒìµÄ·½Ê½°üװǰ/ºó´¦Àí. ÕâÒ»¸ÅÄî¼õÉÙÁË´úÂëÖØ¸´ (¿¼ÂÇAOP[ÃæÏò·½Ãæ±à³Ì]µÄ¸ÅÄî).
- -
-
<interceptor-stack name="xaStack"> 
  <interceptor-ref name="thisWillRunFirstInterceptor"/>
  <interceptor-ref name="thisWillRunNextInterceptor"/>
  <interceptor-ref name="followedByThisInterceptor"/>
  <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>
-
-

×¢Òâ: ijЩ½ØÈ¡Æ÷»áÖжÏÕ»/Á´/Á÷³Ì, Òò´Ë˳ÐòÊ®·ÖÖØÒª.

ʵÏÖcom.opensymphony.xwork.interceptor.PreResultListener½Ó¿ÚµÄ½ØÈ¡Æ÷½«ÔڻִÐÐÖ®ºó, ½á¹ûÖ´ÐÐ֮ǰִÐÐ.
- -
-
thisWillRunFirstInterceptor
  thisWillRunNextInterceptor
    followedByThisInterceptor
      thisWillRunLastInterceptor
        MyAction1
        MyAction2 (chain)
        MyPreResultListener  
        MyResult (result)
      thisWillRunLastInterceptor
    followedByThisInterceptor
  thisWillRunNextInterceptor
thisWillRunFirstInterceptor
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Internationalization.html b/docs/chinese/wikidocs/Internationalization.html deleted file mode 100644 index 6f839a636..000000000 --- a/docs/chinese/wikidocs/Internationalization.html +++ /dev/null @@ -1,60 +0,0 @@ - - - WebWork 2 : ¹ú¼Ê»¯ - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWorkÔÚÁ½Öֵط½Ö§³Ö¹ú¼Ê»¯(¼òдΪi18n): UI±êÇ©ºÍ»î¶¯/×ֶδíÎóÐÅÏ¢.


-°´ÕÕÏÂÁÐ˳ÐòËÑË÷×ÊÔ´°ü:
- -
    -
  • ActionClass.properties
  • -
  • BaseClass.properties (Ö±µ½Object.properties)
  • -
  • Interface.properties (ÿ¸ö½Ó¿ÚºÍ¸¸½Ó¿Ú)
  • -
  • package.properties (ÿһ¸ö»ùÀàµÄ°ü, Ö±µ½java/lang/package.properties)
  • -

-ÒªÏÔʾi18nÎı¾, ¿ÉÒÔÔÚproperty±êÇ©»òÆäËûÈκÎUI±êÇ©(ÓÃ×÷UI±êÇ©µÄlabelÊ±ÌØ±ðÓÐÓÃ)Öе÷ÓÃgetText():
- -
-
<ww:property value="getText('some.key')"/>
-

Ò²¿ÉÒÔʹÓÃtext±êÇ©:

-
<ww:text name="'some.key'"/>
-

×¢Ò⻹ÓÐÒ»¸öi18n±êÇ©, Ëü½«×ÊÔ´°üѹÈëÕ»ÖÐ, ÔÊÐíʹÓóýÇ°ÃæÌáµ½µÄ¼Ì³ÐÁ´ÒÔÍâµÄ×ÊÔ´°üÏÔʾÎı¾.

-
<ww:i18n name="some/package/bundle">
    <ww:text name="'some.key'"/>
</ww:i18n>
-

- -
-ÔÚSiteMeshÐÞÊÎÆ÷ÖÐÒ²¿ÉÒÔʹÓùú¼Ê»¯, µ«Óм¸¸öСÎÊÌâ. ²ÎÔÄSiteMeshÒ³ÃæÁ˽âWebWorkÈçºÎÓëSiteMesh¼¯³É, °üÀ¨¼¯³ÉÌáʾ. -

ʹÓÃÖ÷Ó¦ÓÃĿ¼

StrutsÓû§Ó¦¸Ã±È½ÏÊìϤapplication.properties×ÊÔ´°ü, Äã¿ÉÒÔ°ÑÓ¦ÓÃÖÐÐèÒª·­ÒëµÄÈ«²¿ÏûÏ¢¶¼·ÅÔÚÀïÃæ. È»¶øWebWork2½«×ÊÔ´°ü·ÖÉ¢ÔÚÿ¸ö»î¶¯»òÄ£ÐÍÀàÖÐ, ÕâЩ×ÊÔ´°ü¿ÉÄܰüº¬Öظ´ÏûÏ¢. ¶Ô´Ë¼òµ¥µÄÐÞÕý·½·¨ÊÇÔÚÀà·¾¶µÄĿ¼com/opensymphony/xworkÖд´½¨ÎļþActionSupport.properties. Õâ½öÔÚÈ«²¿»î¶¯Àà¼Ì³ÐActionSupportµÄÇé¿öϹ¤×÷.

Ò²¿ÉÒÔͨ¹ýÉèÖÃwebwork.propertiesÖеÄwebwork.custom.i18n.resourcesÀ´Ê¹ÓÃÈ«¾Ö×ÊÔ´°ü.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Inversion of Control.html b/docs/chinese/wikidocs/Inversion of Control.html deleted file mode 100644 index 9de012cf9..000000000 --- a/docs/chinese/wikidocs/Inversion of Control.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork 2 : ·´×ª¿ØÖÆ - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

·´×ª¿ØÖÆÊÇÒ»ÖÖ´¦Àí¶ÔÏóÒÀÀµµÄ·½·¨. ÔÚWebWorkÖÐ, ¶ÔÏóʹÓÃ"×é¼þ(component)"¹ÜÀíÒÀÀµ¹ØÏµ. ¹ØÓÚ·´×ª¿ØÖƵÄ×ÛÊö(ÏÖÔÚÒ²³Æ×÷Dependency Injection), ÇëÔĶÁMartin Fowler¹ØÓÚIoCµÄÎĵµhttp://www.martinfowler.com/articles/injection.html. ³ýÁËWebWorkµÄIoCÈÝÆ÷, »¹ÓÐÐí¶àÆäËûÈÝÆ÷¿ÉÒÔʹÓÃ, °üÀ¨SpringºÍPico.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/IoC Configuration.html b/docs/chinese/wikidocs/IoC Configuration.html deleted file mode 100644 index 7beea697c..000000000 --- a/docs/chinese/wikidocs/IoC Configuration.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork 2 : IoCÅäÖÃ - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by mcampbell. -
- -

ÅäÖÃ - web.xml

ΪÅäÖÃWebWorkµÄ×é¼þ¹ÜÀí, ±ØÐëÔÚweb.xmlµÄÊʵ±Î»ÖüÓÈëÏÂÁÐÄÚÈÝ:
- -
-
<filter>
    <filter-name>container</filter-name>
    <filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
</filter>

<filter-mapping>
   <filter-name>container</filter-name>
   <url-pattern>*.action</url-pattern> <!-- modify appropriately -->
</filter-mapping>

<!-- ÄãÒ²¿ÉÒÔÑ¡Ôñ½«filter¶ÔÓ¦µ½ÈÎÒ»URI¶ø²»½öÊÇ*.action.  --> 
<!--ÏÂÃæÕâÖÖÇé¿ö¾ÍÐèÒªÕâô×ö:  -->
<!-- * ÔÚ½Óµ½ÇëÇóºóÖ±½Óµ÷ÓÃJSP(ÒòΪ½öʹÓÃÁË*.action) -->
<!-- * JSPÖаüº¬Ò»¸ö»î¶¯²¢Í¨¹ýww:action±êÇ©ÔËÐÐ-->
<!-- * »î¶¯ÊµÏÖÁËһЩenabler½Ó¿ÚÒ»»ñÈ¡×é¼þΪÆä·þÎñ -->
<!-- ÕâÑù×öµÄÀíÓÉ: (Per Patrick Lightbody) -->
<!-- "×é¼þͨ¹ýÔÚrequestµÄÊôÐÔÖвéÕÒComponentManager½øÐй¤×÷. -->
<!-- Ëüͨ¹ýfilter·¢Éú×÷ÓÃ. Èç¹ûÔÚÕû¸ö¹ý³ÌÖÐûÓÐÒ»¸ö#42;.action, -->
<!-- filter²»»áÆð×÷ÓÃ, ×é¼þÒ²¾ø²»»á¹¤×÷." -->
<!-- Õâô×öµÄ´ú¼ÛºÜС, Òò´Ë²»Òª¹ý¶Èµ£ÐÄ  -->
<!-- ÕâÑù×öµÄÐÔÄÜ. -->
<!-- <filter-mapping> -->
<!--    <filter-name>container</filter-name> -->
<!--    <url-pattern>*</url-pattern>  -->
<!-- </filter-mapping> -->

<listener>
    <listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
</listener>

<listener>
    <listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
</listener>
-

ÕâЩÉèÖÃÔÊÐíWebWorkÔÚapplication, sessionºÍrequest·¶Î§ÖйÜÀí×é¼þ. ×¢Ò⼴ʹÄãµÄÓ¦ÓÃÖв»Ê¹ÓÃÈ«²¿scope, ÉÏÊöÈý¸öscopeÒ²±ØÐëÔÚweb.xmlÖÐÖ¸¶¨, ÕâÑùWebWorkµÄ×é¼þ¹ÜÀí²ÅÄÜÕýÈ·¹¤×÷.

ÅäÖÃ - xwork.xml

ComponentInterceptorÓÃÓÚ¶ÔXWorkµÄ»î¶¯½øÐз´×ª¿ØÖÆ(Ò²¾ÍÊÇ˵, Ϊ»î¶¯Ìṩ×é¼þ). ComponentInterceptorÓ¦µ±ÉùÃ÷ÔÚxwork.xmlµÄ<interceptors>²¿·Ö:

-
<interceptor name="component"
        class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
-

Ó¦µ±È·±£ËùÓÐÐèÒª×é¼þµÄ»î¶¯¶¼Ó¦ÓÃÁËÕâ¸ö½ØÈ¡Æ÷. (¹ØÓÚÈçºÎ½«½ØÈ¡Æ÷Ó¦Óõ½»î¶¯ÉÏ, ²Î¼ûOS:XWork Interceptors.)
-Èç¹ûÄãÏò¶Ô»î¶¯ºÍ×é¼þÖ®ÍâµÄ¶ÔÏóʹÓ÷´×ª¿ØÖÆ, ÄãÐèÒªÖ±½ÓʹÓÃComponentManager.

»¹ÐèҪעÒâ, ComponentInterceptorÊÇWebWorkµÄȱʡ½ØÈ¡Æ÷Õ»µÄÒ»²¿·Ö. Òò´Ë, Èç¹û»î¶¯Ê¹ÓÃÁËdefaultStack, ¾ÍÒѾ­°üÀ¨ÁËComponentInterceptor.

ÅäÖÃ - components.xml

Îļþcomponents.xmlÓÃÓÚ¶¨Òå¿ÉÓÃ×é¼þ. ÕâÀïÖ¸¶¨µÄ×é¼þ½«±»¼ÓÔØµ½XWorkµÄComponentManager¿ÉÒÔ±»ÈκλʹÓÃ. components.xml±ØÐë·ÅÔÚ¸ùÀà·¾¶ÖÐ(Ò²¾ÍÊÇWEB-INF/classesĿ¼).
-ÕâÀïÓÐÒ»¸öcomponents.xmlÑùÀý, ËüÅäÖÃÁËÒ»¸öCounter×é¼þ. Counter½«Éú´æÔÚsession¶ÔÏóÖÐ, ½«±»´«µÝµ½ÈκÎʵÏÖCounterAware½Ó¿ÚµÄ»î¶¯ÖÐ:
- -
-
<components>
    <component>
        <scope>session</scope>
        <class>com.opensymphony.webwork.example.counter.Counter</class>
        <enabler>com.opensymphony.webwork.example.counter.CounterAware</enabler>
    </component>
</components>
-

ÿһ¸ö×é¼þÔªËØ±ØÐè°üº¬ÏÂÁÐÊôÐÔ:

    -
  • scope: ÓÐЧֵΪapplication, sessionºÍrequest. Ëü¾ö¶¨×é¼þµÄÉú´æÊ±¼ä. Application×é¼þÔÚÓ¦ÓÃÆô¶¯Ê±´´½¨, ½«ÔÚÕû¸öÓ¦ÓõÄÉú´æÆÚ¼äÒ»Ö±´æÔÚ. Session×é¼þ´æÔÚÓÚÒ»¸öÓû§»á»°¹ý³ÌÖÐ, request×é¼þ½ö´æÔÚÓÚÒ»¸ö¿Í»§ÇëÇóÆÚ¼ä.
  • -
  • class: ×é¼þµÄÀàÃû. ¸Ã¶ÔÏóµÄÒ»¸öʵÀý½«´æÔÚÓÚscopeÖ¸¶¨µÄÖÜÆÚÖÐ, ¿ÉÒÔÓÃÓÚÈκλ(»òÆäËû´úÂë). ×¢Òâ×é¼þʱÑÓ³Ù¼ÓÔØ(lazy-loaded)µÄ, Òò´ËÈç¹ûûÓжÔÏóʹÓøÃ×é¼þ, Ëü½«²»»áÕæÕý±»ÊµÀý»¯. ¸Ã×é¼þ±ØÐëÓÐÒ»¸öÎ޲ι¹Ô캯Êý.
  • -
  • enabler: ÈκÎʵÏÖ»ò¼¯³É¸ÃÀà(»ò½Ó¿Ú)µÄ»î¶¯¶¼½«±»ÉèÖøÃ×é¼þ.
  • -

×¢ÒâËäÈ»×é¼þ¿ÉÒÔÒÀÀµÓÚÆäËû×é¼þ, µ«²»ÄÜÒÀÀµÓÚ¸üС·¶Î§µÄ×é¼þ. Òò´Ë, Ò»¸ösession·¶Î§µÄ×é¼þ²»ÄÜÒÀÀµÓÚÒ»¸öÇëÇó·¶Î§µÄ×é¼þ. Òò´Ë, Ò»¸ösession·¶Î§µÄ×é¼þ²»ÄÜÒÀÀµÓÚÒ»¸öÇëÇó·¶Î§µÄ×é¼þ.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/IoC Overview.html b/docs/chinese/wikidocs/IoC Overview.html deleted file mode 100644 index c2b77ffbb..000000000 --- a/docs/chinese/wikidocs/IoC Overview.html +++ /dev/null @@ -1,60 +0,0 @@ - - - WebWork 2 : IoC×ÛÊö - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

×ÛÊö

ÔÚÐí¶àÓ¦ÓÃÖÐ, ¶¼ÓÐһЩ¶ÔÏó±ØÐèʹÓÃ×é¼þ¶ÔÏó. ¼òµ¥À´Ëµ, IoCģʽÔÊÐí¸¸¶ÔÏó(ÔÚWebworkºÍXWorkÖÐÊÇComponentManagerʵÀý)ÏòÐèÒªµÄ»î¶¯¶ÔÏóÌṩ×ÊÔ´¶ÔÏó(ͨ³£ÊÇÒ»¸ö»î¶¯, µ«Ò²¿ÉÒÔÊÇÈκÎʵÏÖÊʵ±µÄenabler½Ó¿ÚµÄ¶ÔÏó), ¶ø²»ÊÇÐèÒª¶ÔÏó×Ô¼º»ñÈ¡×ÊÔ´.

ÓÐÁ½ÖÖ·½Ê½ÊµÏÖIoC: ³õʼ»¯»òʹÓÃenabler½Ó¿Ú. ʹÓóõʼ»¯·½Ê½, ¸ø¶¨»î¶¯¶ÔÏóʹÓÃ×ÊÔ´¶ÔÏó×÷Ϊ¹¹Ô캯ÊýµÄ²ÎÊýÍê³É³õʼ»¯. ʹÓÃenabler½Ó¿Ú, »î¶¯½«¾ßÓнӿڵķ½·¨"setComponent(ComponentObject r);", ¸Ã·½·¨ÔÊÐíÔڻ¶ÔÏó³õʼ»¯ºó½«×ÊÔ´¶ÔÏ󴫵ݵ½¸Ã¶ÔÏó. ¸ù¾Ý¶ÔÏóʵÏֵĽӿڴ«µÝ¶ÔÓ¦µÄ×é¼þ¶ÔÏó. XWorkʹÓÃenablers´«µÝ×é¼þ.

ΪʲôʹÓÃIoC?

ÄÇôIoCΪʲôÓÐÓÃÄØ? ÕâÒâζ×ÅÎÒÃÇ¿ÉÒÔ²ÉÓÃ×Ô¶¥ÏòÏ·½Ê½¿ª·¢×é¼þ(ͨ³£ÊÇijÀà·þÎñ[, ÈçJDBCÁ¬½Ó, ÔÚ¿Í»§³ÌÐòÖв»ÐèÒªÖªµÀÁ¬½ÓÊÇOracleµÄ»¹ÊÇSybaseµÄ, Ò²²»ÐèÒªÖªµÀÁ¬½ÓÊÇ´ÓÁ¬½Ó³Ø»ñÈ¡»¹ÊÇÆäËû·½Ê½]), ¶ø²»ÐèÒª¹¹½¨Ò»¸ö×¢²áÀàÈÿͻ§µ÷ÓÃËüÒÔ»ñÈ¡×é¼þʵÀý.

ʵÏÖ·þÎñµÄ´«Í³·½Ê½¿ÉÄܲÉÓÃÏÂÃæÀàËÆµÄ²½Öè: -
    -
  1. ±àд×é¼þ(ÈçExchangeRateService)
  2. -
  3. ±àд¿Í»§Àà(ÈçXWork»î¶¯)
  4. -
  5. ±àд±£´æ¸Ã×é¼þµÄ×¢²áÀà(ÈçRegistry)
  6. -
  7. ±àдÔÚ×¢²áÀàÖÐ×¢²áÖ¸¶¨×é¼þ¶ÔÏóµÄ´úÂë (ÈçRegistry.registerService(new MyExchangeRateService()))
  8. -
  9. ÔÚ¿Í»§ÀàÖÐʹÓÃ×¢²áÀà»ñÈ¡·þÎñ(Èç, ExchangeRateService ers = Registry.getExchangeRateService())
  10. -
  11. ÔÚ¿Í»§ÀàÖе÷ÓÃ×é¼þ¶ÔÏó(Èç, String baseCurrencyCode = ers.getBaseCurrency())
  12. -

-ʹÓÃIoC, ¸Ã¹ý³Ì¼ò»¯Îª: -
    -
  1. ±àд×é¼þÀà(ÈçExchangeRateService)
  2. -
  3. ÔÚXWorkÖÐ×¢²á×é¼þÀà(Èç, componentManager.addEnabler(MyExchangeRateService, ExchangeRateAware))
  4. -
  5. ±àд¿Í»§Àà, ²¢È·±£ÊµÏÖÁËenabler½Ó¿Ú(ÈçÒ»¸öʵÏÖÁËExchangeRateAware½Ó¿ÚµÄXWork»î¶¯)
  6. -
  7. ÔÚ¿Í»§ÀàÖÐÖ±½Ó·ÃÎÊ×é¼þʵÀý(Èç, String baseCurencyCode = ers.getBaseCurrency())
  8. -

-·´×ª¿ØÖƵĸü¶àÓŵãÈçÏÂ: -
    -
  1. ¿É²âÊÔÄÜÁ¦ - ¸üÈÝÒ×½øÐвâÊÔ: ʹÓÃenabler·½·¨Ïò¶ÔÏó´«µÝmock¶ÔÏó, ¶ø²»ÐèÒª´´½¨¶ÔÏóÓÃÓÚ»ñÈ¡×é¼þµÄÈÝÆ÷.
  2. -
  3. ×é¼þ×ÔÃèÊö. µ±ÐèÒª³õʼ»¯Ò»¸ö×é¼þʱ, ¿ÉÒÔºÜÈÝÒ׵õÃÖª¸Ã×é¼þÐèÒªÄÇЩÒÀÀµ¶ÔÏó(×é¼þ)¶ø²»ÐèÒª²é¿´Ô´´úÂë, Îĵµ»òʾÀý.
  4. -
  5. ʹÓ÷´Éä(reflection)ºÜÈÝÒ×·¢ÏÖÒÀÀµ¹ØÏµ. ´Óͼ±íÉú³Éµ½ÔËÐÐʱÓÅ»¯¶¼»á´øÀ´ºÃ´¦(ÀýÈç, ¿ÉÒÔÌáǰÅжÏÂú×ãÇëÇóËùÐèµÄ×é¼þ²¢¿ÉÒÔÒì²½½øÐÐ×é¼þ×¼±¸).
  6. -
  7. ±ÜÃâʹÓó¬´ó¹¤³§(super-uber-mega-factory)Éè¼ÆÄ£Ê½(Ó¦ÓõÄÈ«²¿×é¼þ¶¼±£´æÔÚÒ»¸öÀàÖÐ, ÕâÖ±½Óµ¼ÖÂÓëijЩÀàµÄ½ôÃܰ󶨶øÄÑÓÚ'just use that one class').
  8. -
  9. ·ûºÏDemeter¶¨ÂÉ(Law of Demeter). ÓÐÈËÈÏΪÕâºÜÓÞ´À, µ«ÔÚʵ¼ùÖÐÎÒ·¢ÏÖÕâÑù¹¤×÷µÄ¸üºÃ. ÿ¸öÀà½öºÍÕæÕýʹÓÃËüµÄÀàñîºÏ(and it should never use too much). ÕâÖÖ·½·¨¹ÄÀøÃ¿¸öÀà³Ðµ£¸üÉÙµÄÔðÈÎ, ´Ó¶ø²úÉú¸üÇåÎúµÄÉè¼Æ.
  10. -
  11. ÔÊÐíÓë»·¾³(context)¸ôÀë²¢¿ÉÒÔÈÆ¹ý. ThreadLocalÔÚwebÓ¦ÓÃÖпÉÄܺܺÏÊÊ[hibernateÑùÀý´úÂëÖÐʹÓÃTnreafLocal¹ÜÀísession¶ÔÏó, ±¾ÎÄ¿ÉÄÜÊÇÕë¶ÔÕâÒ»Çé¿ö], µ«²¢²»Ò»¶¨Êʺϸ߲¢·¢µÄͬ²½Ó¦ÓÃ(ÈçÏûÏ¢Çý¶¯µÄÓ¦ÓÃ).
  12. -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Iteration Tags.html b/docs/chinese/wikidocs/Iteration Tags.html deleted file mode 100644 index 443bb5de1..000000000 --- a/docs/chinese/wikidocs/Iteration Tags.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork 2 : µü´ú±êÇ© - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -
    -
  • iterator
  • -
  • generator
  • -
  • append
  • -
  • subset
  • -
  • merge
  • -
  • sort
  • -

Iterator ½«ÔÚÒ»¸öÖµÉϽøÐеü´ú. µü´úÖµ¿ÉÒÔÊÇÏÂÁÐÀàÐÍÖ®Ò»: java.util.Collection, java.util.Iterator, java.util.Enumeration, java.util.Map, Êý×é.

ʾÀý:
- -
-
<ww:iterator value="days">
   <p>day is: <ww:property/></p>
 </ww:iterator>
-
 

ÉÏÃæµÄÀý×ÓÖе÷ÓÃÖµÕ»Öе±Ç°¶ÔÏóµÄgetDays()·½·¨È¥µÄµü´úÖµ²¢½øÐеü´ú. <ww:property/>±êÇ©Êä³öÁ˵ü´úµ±Ç°Öµ.

ÏÂÃæµÄÀý×ÓÖÐʹÓÃBeanTag²¢½«Ëü·ÅÈëActionContext. Iterator±êÇ©´ÓActionContextÖлñÈ¡¶ÔÏó²¢µ÷ÓÃgetDays(). ÊôÐÔstatusÓÃÀ´´´½¨Ò»¸öIteratorStatus¶ÔÏó, ±¾ÀýÖÐʹÓÃËüµÄodd()·½·¨À´Êµ¸Ä±äÐÐÑÕÉ«:
- -
-
<ww:bean name="com.opensymphony.webwork.example.IteratorExample" id="it">
   <ww:param name="day" value="'foo'"/>
   <ww:param name="day" value="'bar'"/>
 </ww:bean>

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

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

ÏÂÒ»¸öÀý×Ó½øÒ»²½ÑÝʾÁËstatusÊôÐÔµÄ×÷ÓÃ, ͨ¹ýOGNL´Ó»î¶¯ÖÐÈ¡³ö¶ÔÏóDAO, ʹÓÃDAOµü´ú×éºÍ×é°üº¬µÄÓû§(ÔÚÒ»¸ö°²È«»·¾³ÖÐ). ·½·¨last()±íʾµ±Ç°¶ÔÏóÊÇ·ñÊǵü´úÖÐ×îºóÒ»¸ö¶ÔÏó, Èç¹û²»ÊÇ, ÐèҪʹÓöººÅ°ÑÓû§·Ö¿ª:

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

ÏÂÒ»¸öÀý×Óµü´úÒ»¸ö»î¶¯µÄ¼¯ºÏ, ²¢½«Ã¿¸öµü´úÖµ´«µÝ¸øÁíÒ»¸ö»î¶¯.

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

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

ÕâÀïµÄÇÏÃÅÊÇʹÓÃÁ˲Ù×÷·û'[:0]'. Ëü»ñÈ¡µ±Ç°Öµ²¢´«µÝ¸ø»î¶¯edit. -'[:0]'²Ù×÷·ûÓë<ww:property />µÄЧ¹ûÒ»Ñù. (µ±È», Õâ¸ö±êÇ©²»ÄÜÓÃÔÚparam±êÇ©ÖÐ).
-²Î¼ûOS:WebWork2 EL.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Iterator tag examples.html b/docs/chinese/wikidocs/Iterator tag examples.html deleted file mode 100644 index c55b84b21..000000000 --- a/docs/chinese/wikidocs/Iterator tag examples.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork 2 : Iterator tag examples - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

This follows on from WW:Iteration Tags which you should read first, but beware of references to '[0]' and 'that'; what you really want in WW2 is 'top', as illustrated below. (I finally worked this out from the source code - hopefully this page means you won't have to.)

Referencing the current value

The simple examples print out values from the list using the property tag, which uses the value at the top of the stack by default:

-
Days:
<ul>
<ww:iterator value="days">
    <li><ww:property/>
</ww:iterator>
</ul>
-

But if you're doing anything other than print the value, you probably need to refer to it specifically. Do this:

-
Most days:
<ul>
<ww:iterator value="days">
    <ww:if test="top != 'Monday'">
        <li><ww:property/>
    </ww:if>
</ww:iterator>
</ul>
-

Iterating over a list of objects

-
<ww:iterator value="employees">
    <ww:property value="name"/> is the <ww:property value="jobTitle"/><br>
</ww:iterator>
-

For 'name' and 'jobTitle' you could be more explicit and write 'top.name' and 'top.jobTitle', as 'top' refers to the object on the top of the stack. It's not necessary here, but it is in the next example.

Iterating over a list of lists

- -
-
<table>
    <ww:iterator value="grid">
        <tr>
        <ww:iterator value="top">
            <td><ww:property/></td>
        </ww:iterator>
        </tr>
    </ww:iterator>
</table>
-

The trick here is to use 'top' as the value for the inner iterator. This example probably uses a two-dimensional array, but you can use the pattern for any list of lists.

A more complex example

In this example, 'countries' is a list of country objects, each of which has a name and a list of cities. Each city has a name.

-
<ww:iterator value="countries">
    <ww:iterator value="cities">
        <ww:property value="name"/>, <ww:property value="[1].name"/><br>
    </ww:iterator>
</ww:iterator>
-

The output looks like

-
Wellington, New Zealand
Auckland, New Zealand
Moscow, Russia
Glasgow, Scotland
Edinburgh, Scotland
Stockholm, Sweden
-

Both the country and city objects have a 'name' property. As you'd expect, the reference to 'name' on its own gives you the city name. To access the country name - effectively "hidden" by the city name - we refer to a specific position on the stack: '[1]'. The top of the stack, position 0, contains the current city, pushed on by the inner iterator; position 1 contains the current country, pushed there by the outer iterator.

Actually, as Patrick points out in his comment on WW:Iteration Tags, the '[n]' notation refers to a sub-stack beginning at position n, not just the object at position n. Thus '[0]' is the whole stack and '[1]' is everything except the top object. In our example, we could have been more specific about getting the country name and said '[1].top.name'. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/JFreeChartResult.html b/docs/chinese/wikidocs/JFreeChartResult.html deleted file mode 100644 index abc798df0..000000000 --- a/docs/chinese/wikidocs/JFreeChartResult.html +++ /dev/null @@ -1,70 +0,0 @@ - - - WebWork 2 : JFreeChartResult - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Intro

-I am rendering a chart to the output stream. Instead of streaming it directly to the response.out, I create a ChartResult, and let webwork do the chaining for me.

I generate the chart in one class, and I render it out in another class, effectively decoupling the view from the actions. You can easily render it out to a file or some view other than a web response.out if you wish. -

Configuration

-xwork.xml - result-types definitions -
-
<result-types>
   <result-type name="chart" class="myapp.webwork.extensions.ChartResult"/>
</result-types>
-

-xwork.xml - action definitions -
-
<action name="viewModerationChart" class="myapp.webwork.actions.ViewModerationChartAction"> 
  <result name="success" type="chart"> 
    <param name="width">400</param>
    <param name="height">300</param> </result>
</action>
-
-

Source Codes

-My result class searches for a "chart" in the ValueStack and renders it out… -
-
public class ChartResult implements Result {

	private int width;
	private int height;

	public void execute(ActionInvocation invocation) throws Exception {
		JFreeChart chart =
			(JFreeChart) invocation.getStack().findValue("chart");
		HttpServletResponse response = ServletActionContext.getResponse();
		OutputStream os = response.getOutputStream();
		ChartUtilities.writeChartAsPNG(os, chart, width, height);
		os.flush();
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public void setWidth(int width) {
		this.width = width;
	}

}
-

My action class creates the JFreeChart to render… -

-
public class ViewModerationChartAction extends ActionSupport {

	private JFreeChart chart;

	public String execute() throws Exception {
		// chart creation logic...
		XYSeries dataSeries = new XYSeries(null);
		for (int i = 0; i <= 100; i++) {
			dataSeries.add(i, RandomUtils.nextInt());
		}
		XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries);

		ValueAxis xAxis = new NumberAxis("Raw Marks");
		ValueAxis yAxis = new NumberAxis("Moderated Marks");

		// set my chart variable
		chart =
			new JFreeChart(
				"Moderation Function",
				JFreeChart.DEFAULT_TITLE_FONT,
				new XYPlot(
					xyDataset,
					xAxis,
					yAxis,
					new StandardXYItemRenderer(StandardXYItemRenderer.LINES)),
				false);
		chart.setBackgroundPaint(java.awt.Color.white);

		return super.SUCCESS;
	}

	public JFreeChart getChart() {
		return chart;
	}

}
-
-

Explaination

-
-
public JFreeChart getChart() {
	return chart;
}
-

-makes the chart available on the ValueStack, which the result gets via -
-
JFreeChart chart = (JFreeChart) invocation.getStack().findValue("chart");
-

From what I can deduce, the webwork pulls in the height and width variables from the xwork.xml definitions for that particular action… -
-
<param name="width">400</param>
<param name="height">300</param>
-
-

Suggestions for the next developer...

-Currently the "chart" property is hardcoded. There should be a better way of transferring data from the Action to the Result, via some externally defined variable or something.

As mentioned by John Patterson (mailing list), the Action is still dependant on a JFreeChart Chart class. This can be improved. The seperation between Action and View can be made cleaner. A chart-agonistic List or Array can be used as the data, and the configuration of the chart details (font, axis, etc...) be done via the result properties in the xwork.xml.

But hey, the above works for now. Any suggestions are welcome. -

Creating charts via CeWolf directly in Velocity templates

-See WW:CeWolf charts using Velocity templates. - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/JSP Expression Language Comparison with WebWork 1.x.html b/docs/chinese/wikidocs/JSP Expression Language Comparison with WebWork 1.x.html deleted file mode 100644 index 29336057f..000000000 --- a/docs/chinese/wikidocs/JSP Expression Language Comparison with WebWork 1.x.html +++ /dev/null @@ -1,59 +0,0 @@ - - - WebWork 2 : JSP Expression Language Comparison with WebWork 1.x - - - - - - - - - -
- -
- This page last changed on Nov 17, 2004 by casey. -
- - - - - - - - - - - - - - - - - - - - - - - -
SituationPrevious (WW-1.4)Current (WW-2.1)
Referring to an object in the PageContext scope@itemIdOrName#attr['itemIdOrName']
Referring to an object in the Request scopeitemIdOrNameSame, but use #request['itemIdOrName'] if nested in an iteration.
Referring to an object in the Session scope@itemIdOrName#session['itemIdOrName']
Referring to an object in the Application scope@itemIdOrName#application['itemIdOrName']
Property Settersfoo/bar translates to getFoo().setBar()foo.bar translates to getFoo().setBar()
Property Gettersfoo/bar translates to getFoo().getBar()foo.bar translates to getFoo().getBar()
Boolean/boolean Property Gettersfoo/bar translates to getFoo().getBar() if bar is java.lang.Boolean, if primitive bar translates to getFoo().isBar() Same, except uses dot notation instead of a slash (i.e. foo.bar)
Collections as PropertiesN/ACollections (including arrays) are similar to other objects, except they allow indexing: foo.bar[indexOrKeyName] translates to getFoo().getBar().get(indexOrKeyName)
curly braces - {}, evaluates contents of braces first, and use the result as the property to then evaluate. <webwork:property value="{'name'}"/> translates to getName() on the curent object.No longer used.

-Originally written by Jay Bose and sent to the mailing list - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/JSP Tags.html b/docs/chinese/wikidocs/JSP Tags.html deleted file mode 100644 index e8d74073a..000000000 --- a/docs/chinese/wikidocs/JSP Tags.html +++ /dev/null @@ -1,95 +0,0 @@ - - - WebWork 2 : JSP±êÇ© - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

WebWorkÖ§³ÖµÄÊÓͼ - JSP

JavaServer Pages (JSP)ÊÇWebWork(WW)Ö§³ÖµÄÖØÒªÊÓͼ¼¼Êõ. ±¾½ÚÌṩ½«JSP×÷ΪWebWorkµÄÒ»ÏîÊÓͼ¼¼ÊõµÄÏà¹ØÖªÊ¶.

²Î¿¼ÄÚÈÝ -

    -
  1. ·ÇUI±êÇ©
  2. -
  3. UI±êÇ©
      -
    1. Ä£°æ (UI±êÇ©ÈçºÎ»æÖÆHTML)
    2. -
    3. Ö÷Ìâ
    4. -
  4. -
  5. µü´ú±êÇ©
  6. -
  7. ͨÓñêÇ©
  8. -

-Ò²¿ÉÒԲ鿴WebWork 2 UI±êǩָÄÏ.

±³¾°

ÄÇôʲôÊÇJSPÄØ? ´Ó¼¼Êõ½Ç¶ÈÀ´¿´, JSPÊÇ"Ò»¸öÓÐWeb¿ª·¢ÈËÔ±´´½¨µÄ°üº¬JSP¼¼ÊõÌØ¶¨µÄ±êÇ©, ÉùÃ÷ºÍ½Å±¾, ²¢ÓëÆäËü¾²Ì¬±êÇ©(HTML or XML)×éºÏ¶ø³ÉµÄÒ³Ãæ. JSPÒ³ÃæÊ¹ÓÃÀ©Õ¹Ãû.jsp; Õâ֪ͨweb·þÎñÆ÷ʹÓÃJSPÒýÇæ´¦ÀíÒ³ÃæÉϵÄÔªËØ." ¸ü¶àÐÅÏ¢²Î¼ûJSPÎĵµ.

ÁíÍâ, JSP"Ìṩ¼òµ¥, ¿ìËٵĴ´½¨ÏÔʾ¶¯Ì¬Éú³ÉÄÚÈݵÄwebÒ³ÃæµÄ·½·¨. JSP¹æ·¶, ÓÉSunÁìµ¼ÔÚÒ»¸öÐÐÒµÁìÓòÖÆ¶¨, ¶¨ÒåÁË·þÎñÆ÷ºÍJSPÒ³ÃæµÄ½»»¥Çé¿ö, ÃèÊöÁËÒ³ÃæµÄ¸ñʽºÍÓï·¨." ¸ü¶àÐÅÏ¢²Î¼ûJSPÎĵµ.

Òò´ËÄã¿ÉÒÔ´´½¨µÚÒ»¸öJSP²¢²¿Êðµ½Web·þÎñÆ÷ÖÐ. µ±Óû§µÚÒ»´Î·ÃÎÊÒ³ÃæÊ±, servletÈÝÆ÷ÈçTomcat½«°ÑJSP±àÒë³ÉServlet, ²¢ÓÃËü»æÖÆWebÒ³Ãæ. ÄÇô, Èç¹û×îÖÕ½á¹ûÊÇservlet, Ϊʲô²»Ö±½Ó±àдservlet? ÒòΪServlet²»ÊÇ´ÓWebÄÚÈÝÖгéÏóWeb±íʾµÄÓÐЧ·½Ê½. ÔÚÔçÆÚ, ÈËÃÇֻʹÓÃServlet±àдWebÒ³Ãæ. ¿ª·¢Õß¿ÉÒÔʹÓÃSerlet¶¯Ì¬Êä³öHTML´úÂë. µäÐͰ취ÊÇÊä³öHTML´úÂë - out.write("<HTML>..);. ¶ÔÓÚά»¤¶øÑÔÕâÖÖ·½·¨¼òÖ±ÊÇØ¬ÃÎ, ÇÒ¿ª·¢³É±¾ºÜ´ó, ÒòΪËüÐèÒªÒ»¸öJava¿ª·¢ÈËÔ±.

JSP¼¼Êõ³öÏÖºó, ¿ª·¢Õß¿ÉÒÔʹÓÃÕßһм¼Êõ×÷Ϊ±íʾ²ã. ÔçÆÚµÄJSP¹æ·¶ÓÐÏÞµØÖ§³Ö¶¨ÖƱêÇ©, Òò´ËÔçÆÚ¿ª·¢ÕâʹÓýű¾ºÍJavaScript´´½¨¶¯Ì¬Õ¾µã. »ìºÏʹÓÃJavaºÍHTML²¢²»ÄÇôÀíÏë, ÒòΪJava´úÂë°üº¬ÔÚ±êÇ©ÖÐ. ÕâʹJSP´úÂëÄÑÒÔÔĶÁÀí½â. ¶ÔÓÚ¼òµ¥µÄÕ¾µãÕâÖÖ·½·¨¿ÉÒÔ¹¤×÷µÄºÜºÃ, µ«²»ÊÊÓÚ¸´ÔÓÕ¾µã. ¸´ÔÓÕ¾µãÐèÒªÒ»ÖֿɹÜÀí, ¿Éά»¤µÄ·½Ê½³éÏóÉè¼ÆºÍÂß¼­.

ĿǰJSPÒѾ­³ÉÊìÁË, ¶Ô¶¨ÖƱêÇ©Ìṩǿ´óµÄÖ§³Ö. ¿ª·¢Õß¿ÉÒÔ±àд¶¨ÖƱêÇ©¿âÀ´ÊµÏÖ¼òµ¥»ò¸´ÔÓµÄÈÎÎñ. ¶¨ÖƱêǩʹÓÃÓëHTMLºÍXMLÒ»Öµļòµ¥ÓïÒå¸ñʽ³éÏó¹¦ÄÜ. ʹÓñàдÁ¼ºÃµÄJSP±êÇ©, ¿ª·¢Õß¿ÉÒÔ²»Ê¹ÓÃJava´úÂëÀ´¿ª·¢ºÍά»¤¸´ÔÓÕ¾µã.

WebWorkµÄJSP±êÇ©

×î³õ±àдһ¸öJSP±êÇ©ÊÇÁîÈËηËõµÄÈÎÎñ, µ«²»Óõ£ÐÄ, WebWorkÌṩÁËÀ©Õ¹±êÇ©¿âÀ´¼ò»¯WebÕ¾µã¿ª·¢. ±êÇ©¿â·Ö³É·ÇUI±êÇ© and UI±êÇ©Á½²¿·Ö. Á½ÕßÖ®¼äÖ÷񻂿±ðÊÇ, UI±êÇ©°üº¬Ò»¸öÒþº¬JSPÄ£°æÀ´»æÖÆHTML±íµ¥¿Õ¼ä»òÒ»×éHTML±êÇ©²úÉú×éºÏÊä³ö½á¹ûÈçtable. ÕâЩģ°æÊ±È±Ê¡µÄ²¢¿ÉÒÔÂú×㿪·¢ÒªÇó. µ«ÊÇÈç¹ûÄãÓÐÆäËûÐèÇó, WebWorkÒ²ÌṩÁËʹÓÃÄã×Ô¼ºµÄÄ£°æÌæ´úȱʡģ°æµÄÄÜÁ¦. ÁíÍâ, ÄãÒ²¿ÉÒÔ½«ÕâЩģ°æ×éÖ¯ÔÚÒ»¸öĿ¼ÏÂ×÷Ϊһ¸öÖ÷ÌâÒýÓÃ.

Ö÷ÌâÌṩÁËΪվµã¸ü»»Íâ¹Û(skin)µÄÄÜÁ¦. Ò»Ì×Íâ¹Û²»½ö½öÒâζ×Ų»Í¬µÄͼÐÎ, ÑÕÉ«µÈ. »¹Òâζ×Ų»Í¬ÊÓͼ¼¼Êõ¶ÔÓ¦µÄ²»Í¬ÊÓ¾õЧ¹û. ÀýÈç, Äã¿ÉÒÔΪWAP, HTMLºÍDHTML·Ö±ð¶¨ÒåÖ÷Ìâ.

·ÇUIÌṩ¶ÔÁ÷³Ì¿ØÖÆ, ¹ú¼Ê»¯, WebWork»î¶¯, µü´ú, Îı¾, JavaBeanµÈ¹¦ÄܵÄÖ§³Ö.

¹ØÓÚÕâЩ±êÇ©¸üÏêϸµÄÃèÊöÔÚWebWork±êÇ©¿â¸½Â¼ÖÐ: ·ÇUI±êÇ©, UI±êÇ©.

ʾÀý

½éÉÜÈçºÎÔÚWebWorkʹÓÃJSPÊÓͼ¼¼ÊõµÄ×î¼Ñ·½Ê½ÊÇѧϰһ¸ö¼òµ¥µ«ÍêÕûµÄÀý×Ó. ÎÒÃÇ¿¼²ìµÄÀý×Óʵ¼ÊÉÏÊÇÒ»¸öÍøÉÏÉ̵êÓ¦ÓÃ, Èç¹ûÄãÒѾ­²¿ÊðÁËWebWorkµÄÀý×Ó, ¾Í¿ÉÒÔÔÚindex.jspÖÐÕÒµ½Ëü. WebWorkÌṩÁËÐí¶àÀý×ÓÒÔ±ãÈËÃǸüºÃµÄÀí½âËüµÄÌØÐÔºÍÄÜÁ¦. ÍøÉÏÉ̵êÓ¦ÓÃÊÇÒ»¸ö¾øºÃµÄÀý×Ó, ÒòΪËüʹÓÃÁË´óÁ¿WebWorkÌØÐÔ.

ÔÚ½øÈëʾÀýϸ½Ú֮ǰ, ÏÈ¿´Ò»ÏÂÓ¦ÓõÄÓÃÀý(use case). ÏÂÃæµÄÁбíչʾÁ˶©¹ºCDµÄÁ÷³Ì.

    -
  1. Ó¦ÓÃÒýµ¼Óû§Ñ¡ÔñÓïÑÔ.
  2. -
  3. ΪÓû§ÌṩCDÁбí. ÁбíÖаüº¬ÁËÿ¸öCDµÄ³ªÆ¬Ãû, ÒÕÊõ¼Ò, ºÍ¼Û¸ñ.
  4. -
  5. Óû§Ñ¡ÔñÏëÒªµÄCD¼°ÊýÁ¿½«ËüÃÇ·ÅÈ빺Îï³µ.
  6. -
  7. Óû§¼ÌÐøÏò¹ºÎï³µÖÐÌí¼Ó»òɾ³ýCD.
  8. -
  9. Óû§ÏëÒª¶©»õʱ½«½øÐк˶Ô, ÕâʱÐèÒªÏÔʾ¹ºÎï³µÖеÄÄÚÈÝ.
  10. -
  11. Èç¹ûÔ¸ÒâµÄ»°Óû§¿ÉÒÔÔٴιºÎï.
  12. -
-

µÚÒ»²½ - Óû§Ñ¡ÔñÓïÑÔ

ÈÃÎÒÃÇ¿ªÊ¼ä¯ÀÀÓ¦ÓÃ. µ±ÄãÔÚʾÀýË÷ÒýÒ³ÃæÖÖÑ¡Ôñ¸ÃÓ¦ÓÃʱ, Ëü½«Á¬½Óµ½webwork/i18n/index.jsp. ͨ¹ý²é¿´¸ÃÒ³Ãæ, ÎÒÃÇÖªµÀËü½«×ªÏò»î¶¯ - i18n.Language.action. ȱʡÇé¿öÏÂ, WebWork½«*.actionÓ³Éäµ½ServletDispatcher. ¸ÃÀฺÔð»ñÈ¡Êʵ±µÄ»î¶¯ÀಢִÐÐËü. Èç¹ûÖ´Ðнá¹û±»Ö¸¶¨µ½Ò»¸öÊÓͼ(JSP), ½«×ªÏò¸ÃÊÓͼ.

ServletDispatcherͨ¹ý½âÎöÇëÇóURIÀ´¾ö¶¨Ê¹ÓÃÄÄÒ»¸ö»î¶¯Àà. ±¾ÀýÖÐ, URIÊÇi18n.Language.action. ¸ÃURIÖ±½ÓÓ³Éäµ½webwork.action.test.i18n°üÖеÄÀàLanguage. ×¢ÒâURI²¢²»ÊÇ webwork.action.test.i18n.Language.action¶ø½ö½öÊÇi18n.Language.action. ÕâʱÒòΪÎÒÃÇÔÚwebwork.propertiesÎļþÖÐÖØÐ¶¨ÒåÁË webwork.action.packagesÊôÐÔ. ÕâÔÊÐíÔÚÈκλǰʹÓÃǰ׺webwork.action.test.
- -
-
webwork.action.packages=webwork.action.test, webwork.action.standard
-

ÏÖÔڲ鿴»î¶¯Language. µÚÒ»¸ö·¢ÏÖÊÇËüÀ©Õ¹ÁËShop(ShopÀ©Õ¹ÁËActionSupport). ¸ÃÀàÊÇÒ»¸öÄ㽫¶à´ÎʹÓõĻùÀà. ÎÒÃǽ«ÔÚºóÃæ¿´µ½, ¸ÃÀàÌṩÁËÒ»×éÓÐÓõŦÄÜ. ÁíÍâ, ËüÌṩÁËÖ´ÐеÄȱʡÁ÷³Ì. ȱʡÇé¿öÏ»½«Ö´ÐÐexecute·½·¨. µ±ÔÚActionSupportÀàÖ´ÐÐexecuteʱ, Ëü½«ÅжÏURIÊÇ·ñÓÐÒ»¸öÃüÁîºó׺Èç!foo. ±¾ÀýÖÐfooÊÇÐèÒªÖ´ÐеÄÃüÁî. ¸ÃÃüÁ±»×ª»»³ÉdoFoo()·½·¨µ÷ÓÃ, ÓÉActionSupportÔڻÖе÷ÓÃ. ÕâÔÊÐíÄãµ÷ÓûÖеķ½·¨.

ÎÒÃǵÄURI²»ÊÇÒ»¸öÃüÁî, Òò´ËActionSupport½«Ê×Ïȵ÷ÓÃdoValidate()·½·¨. ÕâÔÊÐíÄãÔÚÖ´ÐÐǰÍê³ÉУÑé. ÓÉÓÚÎÒÃÇûÓи÷½·¨, ActionSupport½«µ÷ÓÃdoExecute(). ±¾ÀýÖÐ, Language¼à²ìÊÇ·ñÒѾ­ÉèÖÃÁËÓïÑÔ. Èç¹ûûÓÐ, ½«·µ»ØERROR. ServletDispatcher²éÕÒÓëi18n.Language.error¶ÔÓ¦µÄÊÓͼ. ²é¿´WEB-INF/classesĿ¼ÏµÄviews.propertiesÎļþ, ¿ÉÒÔÕÒµ½Ó¦ÓõÄÉèÖÃÐÅÏ¢ÈçÏÂ. ¶ÔÓڸôíÎó, ¿ÉÒԲ鵽Ëü¶ÔÓ¦ÓÚlangauge.jsp.Òò´Ëdispatcher½«×ªÏò¸ÃÒ³Ãæ.

Webshop view mapping:
- -
-
# Webshop (I18N example adaptation)
i18n.Shop.success=shop.jsp
i18n.Add.success=shop.jsp
i18n.Delete.success=shop.jsp
i18n.Checkout.success=checkout.jsp
i18n.Language.success=shop.jsp
i18n.Language.error=language.jsp
i18n.Restart.success=shop.jsp
i18n.Cart.success=cart.jsp
i18n.CDList.success=cdlist.jsp
-

ÄÇôµ±»î¶¯±»ÌáÈ¡³öÀ´Ê±ÕæÕý·¢ÉúÁËʲô? ȱʡÇé¿öÏÂ, WebWorkʹÓÃDefaultActionFactory×÷ΪActionFactory. ¸Ã¹¤³§ºÍÆäËûÁ´½ÓÒ»ÆðµÄ¹¤³§½«±»µ÷Óò¢ÊÓͼÍê³É»î¶¯»ñÈ¡.

ÒÔLanguageΪÀý. Dispatcher½«µ÷ÓÃDefaultActionFactory²¢ÒªÇóËü·µ»Ø¶ÔÓ¦µÄ»î¶¯. ¸Ã¹¤³§°ÑÇëÇó·ÅÔÚÁ´ÉÏ. Ò»µ©·ÅÔÚÁ´ÉÏ, ÿһ¸ö¹¤³§ÒªÃ´ºöÂÔÇëÇó, Ҫô¶Ô»î¶¯½øÐÐijЩ´¦Àí, Ò²¿ÉÒÔ·µ»Ø»î¶¯. ÏÂÃæµÄÁбíÊÇDefaultActionFactory°üº¬µÄ¹¤³§´úÀí.
- -
    -
  1. ParametersActionFactoryProxy - ΪƥÅäµÄ²ÎÊýµ÷ÓûµÄSetter·½·¨.
  2. -
  3. PrepareActionFactoryProxy - µ÷ÓûµÄprepare()·½·¨. ÔÊÐí»î¶¯ÔÚУÑé»òÖ´ÐÐǰÍê³ÉÈκÎÐèÒªµÄ×¼±¸»î¶¯.
  4. -
  5. ContextActionFactoryProxy - ÉèÖûÉÏÏÂÎÄ(context). »î¶¯¿ÉÒÔʵÏÖ*Aware½Ó¿Ú֪ͨ´úÀíÐèÒªÉèÖÃÄÄЩÄÚÈÝ.
  6. -
  7. CommandActionFactoryProxy - °þÈ¥URIÖеÄÃüÁî²¢½«ÃüÁîÉèÖõ½»î¶¯ÖÐ.
  8. -
  9. AliasingActionFactoryProxy - Èç¹ûURIÊÇÒ»¸ö±ðÃû, ½«»ñÈ¡»î¶¯Ãû³Æ.
  10. -
  11. JspActionFactoryProxy - ½«JSP°ü×°³É»î¶¯.
  12. -
  13. PrefixActionFactoryProxy - ʹÓÃÅäÖÃÎļþÖеÄǰ׺²éÕһÀà.
  14. -
  15. XMLActionFactoryProxy - »ñȡһ¸öXML»î¶¯.
  16. -
  17. ScriptActionFactoryProxy - °ü×°²¢Ö´ÐÐJavaScript.
  18. -
  19. JavaActionFactory - ·µ»ØÊʵ±µÄJava»î¶¯¶ÔÏó.
  20. -

-ÈçÄãËù¼û, ÔÚDefaultActionFactoryµÄ¸ÇÍ·Ï·¢ÉúÁËÐí¶àÊÂÇé. ÈÃÎÒÃǻص½Àý×ÓÖпªÊ¼²é¿´Ñ¡ÔñÓïÑÔµÄÒ³Ãælanguage.jsp. ÔÚÕâ¸öÒ³ÃæÖÐ, ʹÓõ¥Ñ¡°´Å¥(radio button)ÏÔʾÁËÒ»×éÓïÑÔÁбí. ÈÃÎÒÃǽøÒ»²½²ú¿´»æÖƿؼþµÄ´úÂë.
- -
-
<webwork:action name="'i18n.LanguageList'">
   <ui:radio label="'Language'" name="'language'" list="languages"/>
</webwork:action>
-

Ê×ÏÈ×¢Òâ·ÇUI±êÇ©action. ¸Ã±êǩִÐлLanguageList. Ö´ÐÐʱ, ¸ÃÀཫ¼ÓÔØlocale-to-languageÓ³Éä±í²¢±£´æµ½ÊôÐÔlanguagesÖÐ. ¸Ã±êÇ©Ëæºó½«»î¶¯¶ÔÏó·ÅÈëÖµÕ»ÒÔ±ãÒýÓÃ.

ÏÖÔÚ¿´¿´UI±êÇ©radio. ¸Ã±êÇ©´´½¨Ò»¸öHTMLµÄINPUT¿Ø¼þ, ÀàÐÍΪradio. ¿Ø¼üµÄÃû×ÖÊÇlanguage, ¿Ø¼þµÄÎı¾ÊÇLanguage. ¿Ø¼þµÄÖµÀ´×ÔÓڻLanguageListµÄgetLanguages()·½·¨µ÷ÓÃ. ¸Ã±êÇ©Ëæºó±éÀúÓ³Éä±í½«¼üÖµ×÷ΪVALUEÊôÐÔ, Ó³ÉäÖµ×÷ΪÏÔʾµÄÎı¾.

ÏÖÔÚÓû§¿ÉÒÔÑ¡ÔñÓïÑÔ²¢Ìá½»±íµ¥. ±íµ¥±»ÔÙ´ÎÌá½»µ½»î¶¯Language. ÕâÒ»´ÎÇëÇó²ÎÊýlanguage°üº¬ÔÚÇëÇóÖÐ. µ±»î¶¯Ôٴδ´½¨Ê±, ParametersActionFactoryProxy½«µ÷ÓûµÄsetter·½·¨. ÕâÒâζ×ŵ÷Ó÷½·¨setLanguage(). ÏÖÔÚ, µ±doExecute()Ö´ÐÐʱ»á·¢ÏÖÓû§ÒѾ­Ñ¡ÔñÁËÓïÑÔ, Õâʱ½«´´½¨¶ÔÓ¦µÄLocale¶ÔÏó²¢½«Ëü·ÅÈëÓû§µÄsessionÖÐ.

-
session.put("locale", locale);
-

×¢Ò⽫ÐÅÏ¢·ÅÈësessionÊǶàôµÄ¼òµ¥. µ«sessionÊôÐÔÊÇ´ÓÄÄÀ´µÄÄØ? ¼Çס»î¶¯¼Ì³ÐÁËShop¶ø¸ÃÀàʵÏÖÁËSessionAware½Ó¿Ú. ÒòΪSessionAware°üº¬µÄsetSession()·½·¨½«±»µ÷ÓÃÀ´ÉèÖÃÓû§µÄsession. ÏÖÔÚÎÒÃǽ«locale·ÅÈësession²¢·µ»ØSUCCESS. Dispatcher½«²éÕÒ±ðÃûΪi18n.Language.success²¢·¢ÏÖËüÓ³ÉäΪshop.jsp. Óû§½«±»×ªµ½¸ÃÒ³Ãæ¿ªÊ¼¹ºÎï.

µÚ¶þ²½ - ÏÔʾCDÁбí

ÔÚÕâÒ»²½ÖÐ, Óû§ÒѾ­Ñ¡ÔñÁËÓïÑÔ²¢½«locale¶ÔÏó·ÅÈësession. Óû§ÏÖÔÚÔÚshop.jspÖÐ. ²é¿´¸ÃÒ³ÃæµÄ´úÂëÎÒÃÇ·¢ÏÖ¼¸´¦Ê¹ÓÃÁË·ÇUI±êÇ©text. ¸Ã±êÇ©´Ó×ÊÔ´°üÖÐÌáÈ¡Îı¾. ¸Ã±êÇ©ÄÜʶ±ðlocale²¢Ê¹ÓÃÊʵ±µÄ×ÊÔ´°ü»ñÈ¡ÕýÈ·µÄÎı¾.

-
<webwork:text name="'main.title'"/>
-

ÎÒÃÇÒ²×¢Òâµ½¸ÃÒ³Ãæ°üº¬ÁíÒ»¸öÒ³Ãæi18n.CDList.action. ·ÇUI±êÇ©include½«µ÷ÓûCDListÈç¹û³É¹¦µÄ»°½«ÔÚÒ³ÃæÖаüº¬cdlist.jsp. »î¶¯CDList½«´ÓÎı¾ÎļþÖмÓÔØCDÁÐ±í²¢·ÅÈëlist. CDÁбí¼ÓÔØÍê±ÏºóÎÒÃǽ«×¢ÒâÁ¦×ªÒƵ½Ò³Ãæcdlist.jsp

-
CD:<webwork:include page="i18n.CDList.action"  />
-

cdlist.jspÌṩһ¸öSELECT±íµ¥¿Ø¼þ. - ±¾ÀýÖÐ, ÎÒÃDz»Ê¹ÓÃWebWorkµÄUI±êÇ©select. ÎÒÃÇʹÓÃWebWorkµÄ·ÇUI±êÇ©iteratorÀ´´´½¨SELECT¿Ø¼þ. ¸Ã±êÇ©¿ÉÒÔ±éÀúCDÁбí. ÄÇôCDÁбí´ÓÄÄÀïÀ´ÄØ? ¼Çס, ÔÚ´Ë֮ǰÎÒÃǵ÷ÓÃÁËCDList. »î¶¯µ÷Óúó, WebWork½«»î¶¯·ÅÈëÖµÕ»ÒÔ±ãÊÓͼÒýÓÃ. Òò´Ë, ÎÒÃǽ«Ê¹ÓûCDListµÄ·½·¨getCDList(). ¸Ã·½·¨·µ»Ølist¶øiterator±êÇ©½«±éÀúËü. ÿһ´Îµü´ú¶¼½«Êä³öÒ»¸öOPTIONÔªËØ. »¹ÐèҪעÒâ·ÇUI±êÇ©property. ¶ÔÓÚÁбíÖеÄÿһ¸ö³ÉÔ±, property±êÇ©´ÓCDÖÐÈ¡³ö³ªÆ¬Ãû, ÒÕÊõ¼Ò, ºÍ¹ú¼Ò. »¹ÐèҪעÒâ×îºóÒ»¸öpropertyʹÓûComputePriceÀ´¾ö¶¨CDµÄ¼Û¸ñ. ÓïÒå@pricer/computePrice(price)Òâζ×ŵ÷ÓöÔÏópricerµÄgetComputePrice·½·¨²¢½«CDµÄ¼Û¸ñ×÷Ϊ²ÎÊý. ·Ç³£¿á.

-
<webwork:action name="'webwork.action.test.i18n.ComputePrice'" id="pricer"/>

<select name="album">
   <webwork:iterator value="CDList">
   <option value="<webwork:property value="album"/>">
      <webwork:property value="album"/>,
      <webwork:property value="artist"/>, <webwork:property value="country"/>,
      <webwork:property value="@pricer/computePrice(price)"/>
   </option>
   </webwork:iterator>
</select>
-

ÏÖÔڻص½shop.jsp. ²é¿´´úÂë½øÒ»²½Õ¹Ê¾µÄÆäËûÓÐȤµÄ·½Ãæ. ¿´¿´UI±êÇ©textfieldµÄlabelÊôÐÔ. ×¢ÒâÊôÐÔµÄÖµÊÇ·½·¨µ÷ÓÃtext('main.qtyLabel'). ¸Ã·½·¨´Ó×ÊÔ´ÎļþÖлñÈ¡¶ÔÓ¦µÄ×Ö·û´®. µ«ÊǻÓÐgetText()·½·¨Âð? ¼ÇסShopÀ©Õ¹ÁËActionSupport. ¸Ã»î¶¯Ìṩ¸Ã·½·¨.

-
<ui:textfield label="text('main.qtyLabel')" name="'quantity'" value="1" size="3"/>
-

shop.jspÖÐ×îºóÒ»¸öÖµµÄ¹Ø×¢µÄÄÚÈÝÊÇËü°üº¬ÁËÓû§¹ºÎï³µ.

-
<webwork:include value="'cart.jsp'"  />
-

µ±cart.jsp(¼ûÏÂÎÄ)±»°üº¬Ê±, ʹÓÃÏÂÃæµÄ´úÂëÈ¡µÃÓû§¹ºÎïÄÚÈÝ. ÊôÐÔvalueµÄÖµ±»×ª»»³ÉÒ»×é·½·¨µ÷ÓÃgetCart()/getItems(). Shopµ÷ÓõĵÚÒ»¸ö·½·¨½«·µ»ØCart, È»ºóÔÚCartÉϵ÷ÓÃÏÂÒ»¸ö·½·¨. Èç¹ûµÚÒ»¸ö·½·¨Ã»ÓÐÈ¡µÃcart, Shop½«´´½¨Ò»¸ö¿ÕµÄcart²¢·ÅÈëÓû§session.

-
<webwork:property value="cart/items">
<webwork:if test=".">

    <center>
    <table border="0" cellpadding="0" width="100%" bgcolor='<webwork:text name="'cart.bgcolor'"/>'>
    <tr>
      <td><b><webwork:text name="'cd.albumLabel'"/></b></td>
      <td><b><webwork:text name="'cd.artistLabel'"/></b></td>
      <td><b><webwork:text name="'cd.countryLabel'"/></b></td>
      <td><b><webwork:text name="'cd.priceLabel'"/></b></td>
      <td><b><webwork:text name="'cd.quantityLabel'"/></b></td>
      <td></td>
   </tr>

<webwork:action name="'i18n.ComputePrice'" id="pricer"/>
<webwork:iterator>
   <tr>
      <webwork:property value="cd">
      <td><b><webwork:property value="album"/></b></td>
      <td><b><webwork:property value="artist"/></b></td>
      <td><b><webwork:property value="country"/></b></td>
      <td><b><webwork:property value="@pricer/computePrice(price)"/></b></td>
      </webwork:property>

      <td><b><webwork:property value="quantity"/></b></td>
      <td>
         <form action="i18n.Delete.action" method="post">
           <input type=submit value='<webwork:text name="'cart.delLabel'"/>'>
           <input type=hidden name="album" value='<webwork:property value="cd/album"/>'>
         </form>
      </td>
   </tr>
</webwork:iterator>

   </table>
   <p>
   <p>
   <form action="i18n.Checkout.action"  method="post">
        <input type="submit" value='<webwork:text name="'cart.checkoutLabel'"/>'>
   </form>
  </center>

</webwork:if>
</webwork:property>
-

µÚÈý²½ - Óû§Ïò¹ºÎï³µÖÐÔö¼ÓCD

ÏÖÔÚÓû§¿´µ½CDÁбí. Óû§Ñ¡ÔñÒ»¸öCD, ÊäÈëÊýÁ¿²¢Ìá½»±íµ¥. ±íµ¥Ìá½»µ½i18n.Add.action, Ëü¶ÔÓ¦ÓڻAdd. Ìá½»µÄ²ÎÊý±»ÉèÖõ½»î¶¯ÖÐ. ÔÚÎÒÃǵij¡¾°ÖÐ, Ëü°üÀ¨ÊýÁ¿ºÍ³ªÆ¬Ãû. Ëæºó»î¶¯µÄdoExecute()·½·¨±»µ÷ÓÃ, »ñÈ¡Óû§µÄ¹ºÎï³µ²¢½«CD¼ÓÈë½øÈ¥. »î¶¯·µ»ØSUCCESS, ËüÓ³Éäµ½shop.jsp. Õâ´ÎÓû§µÄ¹ºÎï³µÖÐÓÐÄÚÈݲ¢ÏÔʾÔÚCDÁбíÏÂÃæ.

µÚËIJ½ - Óû§¼ÌÐøÔö¼Ó»òɾ³ýCD

ÕâÀïÓû§Öظ´Ôö¼Ó»òɾ³ýCDµÄ¹ý³Ì. µ±Ëû½áÊø¹ºÎïʱ, ½«½øÐк˶Ô.

µÚÎå²½ - Óû§ºË¶Ô

±¾²½ÖèÖÐ, Óû§½áÊø¹ºÎï²¢¾ö¶¨½øÐк˶Ô. ±íµ¥Ìá½»µ½i18n.Checkout.action. Ëü¶ÔÓ¦ÓڻCheckout. ¸Ã»î¶¯¼ÆËãÓû§¹ºÎï³µÖÐÎïÆ·µÄ×ܶ½«ËüÉèÖõ½ÊôÐÔtotalPrice. »î¶¯·µ»ØSUCCESS, Ëü¶ÔÓ¦ÊÓͼcheckout.jsp. ¸ÃÊÓͼÏÔʾÓû§¹ºÎï³µÖеÄÎïÆ·ÒÔ¼°×ܼÛ.

µÚÁù²½ - Èç¹ûÔ¸ÒâÓû§¿ÉÒÔÔٴιºÎï

±¾²½ÖèÖÐ, Óû§¿ÉÒÔÔٴιºÎï. Èç¹ûËûÃÇÑ¡ÔñÖØÐ¿ªÊ¼, ¿ÉÒÔÑ¡ÔñÁ´½Ói18n.Restart.action. ¸Ã»î¶¯É¾³ýÓû§¹ºÎï³µ²¢·µ»ØSUCCESS, Ëü¶ÔÓ¦ÊÓͼshop.jsp, ÖØÐ¿ªÊ¼Õû¸ö¹ý³Ì.

×ܽá

Ï£Íû±¾Ê¾ÀýÄܳÉΪÄúÀí½âʹÓÃWebWorkÌØÐÔµÄJSPµÄÆðµã. ±¾Àý²¢Ã»ÓÐÍêȫչʾWebWork, Ëü½ö½öÊÇÒ»¸ö¼ò½é. »¹ÓÐÆäËûµÄÀý×Ó¿ÉÒÔ°ïÖúÄã½øÒ»²½Á˽âWebWork. ÁíÍâ, Ä㻹¿ÉÒÔÔĶÁreferecnceÕ½ÚÒÔÁ˽âWebWork¸ü¶àÐÅÏ¢. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/JUnit.html b/docs/chinese/wikidocs/JUnit.html deleted file mode 100644 index 71cf93f95..000000000 --- a/docs/chinese/wikidocs/JUnit.html +++ /dev/null @@ -1,42 +0,0 @@ - - - WebWork 2 : JUnit - - - - - - - - - -
- -
- This page last changed on Jun 09, 2004 by ctran. -
- -

Äã¿ÉÒÔ²ÉÓü¸ÖÖ·½·¨¶Ô»î¶¯Àà½øÐе¥Ôª²âÊÔ.

×î¼òµ¥µÄ°ì·¨Êdzõʼ»¯»î¶¯Àà, µ÷ÓÃsetters, È»ºóµ÷ÓÃexecute(). ÕâÑù¿ÉÒÔÌø¹ýËùÓи´ÔÓµÄÈÝÆ÷ÉèÖù¤×÷.

´ÓPetsoarÖÐժ¼µÄÀý×Ó: -

-
package org.petsoar.actions.inventory;

import com.mockobjects.constraint.IsEqual;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork.Action;
import junit.framework.TestCase;
import org.petsoar.pets.Pet;
import org.petsoar.pets.PetStore;

public class TestViewPet extends TestCase {
    private Mock mockPetStore;
    private ViewPet action;

    protected void setUp() throws Exception {
        mockPetStore = new Mock(PetStore.class);
        PetStore petStore = (PetStore) mockPetStore.proxy();

        action = new ViewPet();
        action.setPetStore(petStore);
    }

    public void testViewPet() throws Exception {
        Pet existingPet = new Pet();
        existingPet.setName("harry");
        existingPet.setId(1);

        Pet expectedPet = new Pet();
        expectedPet.setName("harry");
        expectedPet.setId(1);

        mockPetStore.expectAndReturn("getPet", C.args(new IsEqual(new Long(1))), existingPet);
        action.setId(1);

        String result = action.execute();

        assertEquals(Action.SUCCESS, result);
        assertEquals(expectedPet, existingPet);
        mockPetStore.verify();
    }

    public void testViewPetNoId() throws Exception {
        mockPetStore.expectAndReturn("getPet", C.ANY_ARGS, null);

        String result = action.execute();

        assertEquals(Action.ERROR, result);
        assertEquals(1, action.getActionErrors().size());
        assertEquals("Invalid pet selected.", action.getActionErrors().iterator().next());
        assertNull(action.getPet());
        mockPetStore.verify();
    }

    public void testViewPetInvalidId() throws Exception {
        action.setId(-1);
        testViewPetNoId();
    }
}
-

²âÊÔ½ØÈ¡Æ÷ºÍ½á¹ûÀàÐÍ

²é¿´XWork/WebWorkÖеIJâÊÔÓÃÀý. ËüºÜÈ«Ãæ²¢ÌṩÁËºÜºÃµÄÆðµã. ÀýÈç, ÏÂÃæÊÇÈçºÎ²âÊÔParametersInterceptor:

-
public void testDoesNotAllowMethodInvocations() {
    Map params = new HashMap();
    params.put("@java.lang.System@exit(1).dummy", "dumb value");

    HashMap extraContext = new HashMap();
    extraContext.put(ActionContext.PARAMETERS, params);

    try {
        ActionProxy proxy = ActionProxyFactory.getFactory().
               createActionProxy("", MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, extraContext);
        assertEquals(Action.SUCCESS, proxy.execute());

        ModelDrivenAction action = (ModelDrivenAction) proxy.getAction();
        TestBean model = (TestBean) action.getModel();

        String property = System.getProperty("webwork.security.test");
        assertNull(property);
    } catch (Exception e) {
        e.printStackTrace();
        fail();
    }
}
-
-

×¢Òâ: Õâ²»ÊÇΨһµÄ°ì·¨, Òò´ËÇë×Ô¼º¾ö¶¨.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/JasperReports Result.html b/docs/chinese/wikidocs/JasperReports Result.html deleted file mode 100644 index d8c1347e7..000000000 --- a/docs/chinese/wikidocs/JasperReports Result.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork 2 : JasperReports Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

JasperReports

-Generates a JasperReports report using the specified format or PDF if no format is specified.

- - - - - - - - - - - - - - - -
Parameters Required Description
location yes the location to go to after execution
parse no true by default. If set to false, the location param will not be parsed for Ognl expressions
dataSource yes the Ognl expression used to retrieve the datasource from the value stack (usually a List)
format no the format in which the report should be generated, defaults to pdf
contentDisposition no defaults to "inline" when using documentName unless specified
documentName no generates the http header "Content-disposition = <contentDisposition>; filename=<documentName>.<format>"
-
-
<result name="success" type="jasper">
    <param name="location">foo.jasper</param>
    <param name="dataSource">mySource</param>
    <param name="format">CSV</param>
</result>
-

-or for pdf -
-
<result name="success" type="jasper">
    <param name="location">foo.jasper</param>
    <param name="dataSource">mySource</param>
</result>
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Label tag.html b/docs/chinese/wikidocs/Label tag.html deleted file mode 100644 index 732d9cbc1..000000000 --- a/docs/chinese/wikidocs/Label tag.html +++ /dev/null @@ -1,67 +0,0 @@ - - - WebWork 2 : Label±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:label />

HTMLµÄLABEL±êÇ©: ºÍÆäËûUI¿Ø¼þÓÐÏàͬµÄ¸ñʽ.

- ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×÷Ϊ×Ö¶ÎÖµ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- -±¾ÀýÖлæÖÆÁËÒ»¸öÎı¾±êÇ©. Ëüͨ¹ýµ÷ÓÃActionSupportµÄgetText()·½·¨´ÓResourceBundleÖÐÌáÈ¡Îı¾"user_name". -

-
<ww:label label="text('user_name')" name="'a label'"/>
-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/License.html b/docs/chinese/wikidocs/License.html deleted file mode 100644 index 3e157ffc8..000000000 --- a/docs/chinese/wikidocs/License.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Ðí¿É(License) - - - - - - - - - -
- -
- ±¾Ò³ÓÉplightbo×îºóÐÞ¸ÄÓÚ2004Äê11ÔÂ12ÈÕ. -
- -

[All OpenSymphony projects use the OpenSymphony License, which is a modified Apache License. You can find the license at http://www.opensymphony.com/license.html]

-

OpenSymphonyµÄÈ«²¿ÏîÄ¿¾ùÊÊÓÃOpenSymphonyÐí¿ÉЭÒé, ËüÊÇApacheÐí¿ÉЭÒéµÄÒ»¸öÐ޸İ汾. Äú¿ÉÒÔÔÚhttp://www.opensymphony.com/license.htmlÖв鿴Ðí¿ÉЭÒé.

- -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Mailing Lists.html b/docs/chinese/wikidocs/Mailing Lists.html deleted file mode 100644 index 4196db3d4..000000000 --- a/docs/chinese/wikidocs/Mailing Lists.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : ÓʼþÁбí - - - - - - - - - -
- -
- This page last changed on May 19, 2004 by ehauser. -
- -

WebworkÓʼþÁбí¶ÔÈ«²¿¿ª·¢ÈËÔ±ºÍ×îÖÕÓû§¿ª·Å. ÁбíλÓÚhttp://webwork.dev.java.net/servlets/ProjectMailingListList, ʹÓÃÏûÏ¢ÍùÀ´(message-by-message)ºÍ·ÖÀà¸ñʽ±£´æ. ÁбíµÄ´æµµÎļþÌØ¿ÉÒÔ´Ó¸ÃÒ³»ñÈ¡, Òò´ËÔÚ·¢²¼ÐÂÏûϢǰÇëÏÈËÑË÷¹ýÈ¥µÄÏûÏ¢.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Namespaces.html b/docs/chinese/wikidocs/Namespaces.html deleted file mode 100644 index 6377c15c7..000000000 --- a/docs/chinese/wikidocs/Namespaces.html +++ /dev/null @@ -1,39 +0,0 @@ - - - WebWork 2 : Ãû¿Õ¼ä(Namespaces) - - - - - - - - - -
- -
- This page last changed on Jun 17, 2004 by casey. -
- -

Ãû¿Õ¼ä

namespacesÊôÐÔÔÊÐí½«»î¶¯ÅäÖøôÀëÔÚ²»Í¬Ãû¿Õ¼äÖÐ, ÕâÑùÄã¿ÉÒÔÔÚ¶à¸öÃû¿Õ¼äÖÐʹÓÃͬһ¸öµÄ»î¶¯±ðÃûÅäÖò»Í¬µÄ»î¶¯Àà(class), ²ÎÊýµÈµÈ. ÕâÓëWebwork 1.x²»Í¬, 1.xÖÐÈ«²¿»î¶¯Ãû¶¼ÊÇÈ«¾ÖµÄ²»ÄÜÔÚÒ»¸öÓ¦ÓÃÖÐÖØ¸´Ê¹ÓÃ. ȱʡµÄÃû¿Õ¼ä""(¿Õ×Ö·û´®)ÓÃÓÚ"²¶»ñ(catch-all)"ÆäËûÃû¿Õ¼ä, Èç¹ûÒ»¸ö»î¶¯Ã»Óаüº¬ÔÚÖ¸¶¨µÄÃû¿Õ¼äÖÐ, ½«ËÑË÷ȱʡÃû¿Õ¼ä. Ëü¿ÉÒÔÔÚÀ©Õ¹¼Ì³ÐÁ´Ö®ÍⶨÒåÒ»¸öÈ«¾Ö»î¶¯ÅäÖÃ, ͬʱҲ¼æÈÝWebwork 1.x°æ±¾²»Ö¸¶¨Ãû¿Õ¼äµÄ×ö·¨. Ãû¿Õ¼äµÄ¹¦ÄÜ»¹¿ÉÒÔÓÃÓÚ°²È«, ÀýÈç, Webwork 2.0µÄ ServletDispatcher°Ñ»î¶¯Ãû³ÆÖ®Ç°µÄ²¿·Ö×÷ΪÃû¿Õ¼ä, Õâ¾ÍʹJ2EE»ùÓÚ·¾¶µÄ°²È«»úÖÆÒ×ÓÚʵÏֺ͹ÜÀí.

Ãû¿Õ¼äʾÀý

-
<package name="default">

    <action name="foo" class="mypackage.simpleAction>
        <result name="success" type="dispatcher">greeting.jsp</result>
    </action>
    <action name="bar" class="mypackage.simpleAction"> 
        <result name="success" type="dispatcher">bar1.jsp</result> 
    </action> 

</package>


<package name="mypackage" namespace="/barspace"> 

    <action name="bar" class="mypackage.simpleAction"> 
        <result name="success" type="dispatcher">bar2.jsp</result> 
    </action> 

</package>
-

-Èç¹ûÇëÇó/barspace/bar.action, ÄÇô½«ËÑË÷mypackage°ü²¢Ö´Ðлbar. Èç¹û»î¶¯·µ»Øsuccess, ¾ÍÏÔʾbar2.jsp.

×¢Òâ: Èç¹ûÇëÇó/barspace/foo.action, ÓÉÓڻfooÔÚÃû¿Õ¼ä/barspaceÖÐÒò´Ë±»ÕÒµ½. Èç¹û»î¶¯²»´æÔÚ, ½«²éÕÒȱÉùÃ÷¿Õ¼ä. δָ¶¨Ê±È±Ê¡Ãû¿Õ¼äÊÇ"". ÉÏÀýÖÐ, Ãû¿Õ¼ä/barspaceÖÐûÓлfoo, Òò´Ë½«ËÑË÷ȱʡÃû¿Õ¼ä²¢Ö´ÐÐ/foo.action.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Non-UI Tags.html b/docs/chinese/wikidocs/Non-UI Tags.html deleted file mode 100644 index 999a70976..000000000 --- a/docs/chinese/wikidocs/Non-UI Tags.html +++ /dev/null @@ -1,369 +0,0 @@ - - - WebWork 2 : ·ÇUIÀà±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -


-ÏÂÁбêÇ©ÓëÖµÕ»½»»¥, ²¢¿ØÖÆÒ³ÃæÂß¼­.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
±êÇ©Ãû ÃèÊö
ͨÓñêÇ©
<ww:param /> Ϊ֧³Ö²ÎÊýµÄ±êÇ©ÉèÖòÎÊý
<ww:property /> ´ÓÖµÕ»ÖÐÌáȡֵ²¢ÏÔʾ
<ww:push /> ½«Ö¸¶¨¶ÔÏóѹÈëÖµÕ»¶¥¶Ë
<ww:set /> ´´½¨Äã×Ô¼ºµÄÃüÃû±äÁ¿
URL tag (<ww:url />) ¹¹½¨Ò»¸öÒѱàÂëµÄURL
×é¼þ»¯±êÇ©
<ww:action /> ÌṩÁíÒ»ÖÖµ÷ÓûµÄ·½·¨
<ww:bean /> ³õʼ»¯Ò»¸öBeanÒÔ±ã·ÃÎÊËüµÄ¹¦ÄÜ
<ww:include /> ÓÃÓÚ°üº¬ÁíÒ»¸öÒ³Ãæ»ò»î¶¯
Á÷³Ì¿ØÖƱêÇ©
<ww:if /> ¸ù¾ÝÌõ¼þ¾ö¶¨Óï¾äÊÇ·ñÖ´ÐÐ
<ww:elseif /> µ±Ç°Ò»¸ö²âÊÔʧ°ÜºóÓÃÓÚ¾ö¶¨Óï¾äÊÇ·ñÖ´ÐÐ.
<ww:else /> Èç¹ûǰһ¸ö²âÊÔΪfalseʱִÐÐ
µü´ú±êÇ©
<ww:iterator /> ÔÚÒ»¸ö¼¯ºÏÉϽøÐеü´ú
<ww:generator /> ³£¼ûµü´úÆ÷
<ww:append /> Ìí¼ÓÒ»¸öµü´úÆ÷Áбí
<ww:subset /> µü´úÒ»¸ö¿Éµü´ú¶ÔÏóµÄÒ»²¿·Ö
<ww:merge /> ½«¼¸¸öµü´úÆ÷ºÏ²¢ÎªÒ»¸ö
<ww:sort /> ¶ÔÒ»¸öµü´úÆ÷ÅÅÐò

- -

ͨÓñêÇ©

-

<ww:param />

ÔÊÐíΪ֧³ÖÔö¼Ó²ÎÊýµÄ±êÇ©ÉèÖòÎÊý.
- - - - - - - - - -
ÊôÐÔÃû±ØÐèÃèÊö
value·ñÓÃÓÚÏò±êÇ©´«µÝÊý¾Ý.
name·ñµ÷ÓõĻÃû³Æ.

-Äã¿ÉÒÔ½«param±êÇ©·ÅÖÃÔÚÖ§³Ö²ÎÊý±êÇ©µÄÄÚ²¿, param±êÇ©°Ñ²ÎÊý¼ÓÈëµ½ËüµÄ¸¸±êÇ©. Èç¹ûvalueûÓиø¶¨, Ëü½«Ê¹ÓÃÕýÎÄÄÚÈÝ(body)×÷ΪvalueÖµ.

ÔÚÏÂÃæµÄÀý×ÓÖÐ, ÿһ¸öparam±êÇ©¶¼°Ñ²ÎÊý¼Óµ½CounterÉÏ. ÕâÒâζ×Åparam½«µ÷ÓÃCounter¶ÔÓ¦µÄsetter·½·¨.

-
<ww:bean name="'webwork.util.Counter'" id="year">
  <ww:param name="'first'" value="text('firstBirthYear')"/>
  <ww:param name="'last'" value="2000"/>

  <ui:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/>
</ww:bean>
-
-


-·µ»Ø -

<ww:property />

property±êÇ©´ÓÖµÕ»ÖÐÌáȡֵ²¢ÏÔʾ.
- - - - - - - - - - - -
ÊôÐÔÃû±ØÐèÃèÊö
id·ñΪһ¸öÔªËØÖ¸¶¨Î¨Ò»µÄÃû×Ö(×¢Òâ).
value·ñÓÃÓÚÏò±êÇ©´«µÝÊý¾Ý.
escape·ñ¾ö¶¨ÕýÎÄÊÇ·ñÐèÒª½øÐÐÊʵ±µÄתÂëÒÔ·ûºÏHTML×Ö·ûÒªÇó[Èç"&"ת»»Îª"&amp;"]

-ÏÂÃæµÄÀý×ÓÃèÊöËüµÄ²»Í¬Ó÷¨:
- -
-
Print getX().getY() 
<ww:property value="x.y"/>
-

ȱÉúÇé¿öϽ«¶ÔHTML×Ö·û½øÐÐתÂë, È»¶øÈç¹ûproperty±êÇ©µÄÄÚÈݰüº¬ÔÚÕýÎÄ(body)ÖÐʱ, ½«²»½øÐÐתÂë. ÏÔʾʹÓÃescapeÊôÐÔ½«¸²¸ÇȱʡÐÐΪ. ÒýÓõÄÎÄ×ÖÔÚתÂëʱ, ÆäÍâÃæµÄÒýºÅ(quote)½«±»È¥µô.

»¹Òª×¢ÒâÈç¹ûproperty±êÇ©µÄÕýÎÄΪ¿Õʱ(has an empty body), ËüµÄÐÐΪÓëûÓÐÕýÎÄʱһÑù. -


-·µ»Ø -

<ww:push />

ÀûÓÃww:push, Äã¿ÉÒÔ½«¶ÔÏóѹÈëÖµÕ»µÄ¶¥²¿.
- - - - - - - -
ÊôÐÔÃû ±ØÐèÃèÊö
valueÊÇÓÃÓÚÏò±êÇ©´«µÝÊý¾Ý.

Óëww:set(¼ûÏÂÎÄ)±êÇ©µÄ¹¦ÄÜÀàËÆ, Òò´ËÔÚ¾ö¶¨Ê¹ÓÃǰӦµ±¶¼¿´Ò»ÏÂ.

-
<ww:push value="counter">
  <ww:property value="count"/>
</ww:push>
-

Òª½«Ò»¸ö»î¶¯·ÅÈëÖµÕ»ÖпÉÒÔʹÓÃÏÂÃæµÄ´úÂë:

-
<ww:action name="'SomeAction'" id="sa"/>
<ww:push value="#sa">
 foo = <ww:property value="foo"/>
</ww:push>
-

- -


-·µ»Ø -

<ww:set />

ʹÓÃww:set±êÇ©, Äã¿ÉÒÔÔÚJSPÖд´½¨Ò»¸ö×Ô¼ºÃüÃû±äÁ¿. ¿ÉÒÔʹÓÃ#variableNameµÄÐÎʽÒýÓøñäÁ¿.
- - - - - - - - - - - -
ÊôÐÔÃû ±ØÐèÃèÊö
name ÊDZäÁ¿µÄΨһÃû³Æ, ¿ÉÒÔʹÓÃ"#name"·ÃÎÊËü.
value·ñÓÃÓÚÏò±êÇ©´«µÝÊý¾Ý.
scope·ñ±äÁ¿µÄ×÷Ó÷¶Î§: ¿ÉÒÔÊÇpage, request, session, application

-½«ÖµÕ»ÖжÔÏóµÄÖµÉèÖõ½Ö¸¶¨µÄscopeÖÐ. Èç¹ûֵδ¸ø¶¨, ½«Ê¹ÓÃÕ»¶¥Öµ. Èç¹ûscopeδָ¶¨, ȱʡµÄscopeÊǻÉÏÏÂÎÄ, Èç¹û¸ÃÇëÇó²¢Î´Ö´ÐÐÈκλ, ½«Ê¹ÓÃPageContext. -


-·µ»Ø
-

×éºÏ»¯±êÇ©

-

<ww:action />

Action±êÇ©ÌṩÁíÒ»ÖÖµ÷ÓûµÄ·½·¨. ÕâÊdzýÁ˵÷ÓÃÒ»¸öURLÖ®ÍâµÄÁíÒ»¸ö°ì·¨; ¼´ - *.action»á±»·¢Ë͵½ServletDispatcher.

- - - - - - - - - - - -
ÊôÐÔÃû ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
nameÊDZ»µ÷ÓûµÄÃû×Ö.
namespace ·ñ »î¶¯µÄÃû¿Õ¼ä
executeResult ·ñ ÊÇ·ñÖ´Ðнá¹û

Èç¹ûÖ¸¶¨ÁËidÊôÐÔ, ±»Ö´ÐеĻ¾Í¿ÉÒÔʹÓÃ"#id"ÔڻÉÏÏÂÎÄÖÐÒýÓÃ.

±¾ÀýÖÐ, »î¶¯ClientInfo½«±»Ö´ÐÐ, ËüµÄ·½·¨½«±»ÓÃÓÚ»ñÈ¡ÐÅÏ¢²¢Ö´ÐÐÌõ¼þ¼ì²é.
- -
-
<ww:action name="'ClientInfo'" id="cinfo">
  <ww:param name="detailedMode" value="false"/>
</ww:action>
Browser:<ww:property value="#cinfo.browser"/><br>
Version:<ww:property value="#cinfo.version"/><br>
Supports GIF:<ww:if test="#cinfo.supportsType('image/gif') == true">Yes</ww:if>
<ww:else>No</ww:else><br>
-
 

·µ»Ø
- -

<ww:bean />

´´½¨Ò»¸öJavaBean²¢³õʼ»¯ËüµÄÊôÐÔ, ²¢½«Ëü·ÅÈëActionContext. - - - - - - - - -
ÊôÐÔÃû ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
nameÊDZ»µ÷ÓõĻ[¿ÉÄÜÊDZÊÎó]Ãû.

-±¾ÀýÖÐ, Counter±»ÓÃ×÷bean. ÎÒÃÇ¿ÉÒÔµ÷ÓÃÐèÒªµÄ·½·¨. ±¾ÀýÖÐ,ÎÒÃǵ÷ÓÃsetFirst()½«³öÉúÄêÉèÖÃΪ1975²¢µ÷ÓÃsetLast()½«ËüÉèÖÃΪ2000. È»ºó½«Counter×÷Ϊһ¸öµü´úÆ÷ÏÔʾһ¸ö×éºÏ¿ò(combo box).
- -
-
<ww:bean name="'webwork.util.Counter'" id="year">
  <ww:param name="'first'" value="text('firstBirthYear')"/>
  <ww:param name="'last'" value="2000"/>

  <ui:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/>
</ww:bean>
-
-

·µ»Ø
- -

<ww:include />

ÓÃÓÚ°üº¬ÁíÒ»¸öÒ³Ãæ»ò»î¶¯.
- - - - - - - - - -
ÊôÐÔÃû ±ØÐèÃèÊö
page ·ñÒ³Ãæ»ò»î¶¯µÄÃû³Æ.
value·ñÓÃÓÚÏò±êÇ©´«µÝÊý¾Ý.

±¾ÀýÖÐ, beaninfo.jspÒýÈëÁËÒ»¸öPerson¶ÔÏópeople[0]. ¿´Ò»ÏÂbeaninfo.jspµÄÀý×Ó²¢×¢ÒâËüÊÇÈçºÎÀûÓÃ".."´ÓÖµÕ»ÖÐÈ¡³ö¸¸Ò³ÃæµÄÖµ. -

-
<ww:property value="people[0]">
  <ww:include value="'beaninfo.jsp'"/>
</ww:property>
-

±¾ÀýÖе÷ÓÃÁËÒ»¸ö»î¶¯. -
-
<h1>RSS viewer</h1>
<ww:include value="'rss.viewer.action'"/>
-
-

-

Á÷³Ì¿ØÖƱêÇ©

·µ»Ø
- -

<ww:if />

-¸ù¾ÝÌõ¼þ¾ö¶¨Óï¾äÊÇ·ñÖ´ÐÐ.
- - - - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
testÊÇÓÉWebWork½âÎöÆ÷½øÐмÆË㸳ֵµÄÌõ¼þ±í´ïʽ. Ëü·µ»Ø²¼¶ûÖµtrue»òfalse.

-±¾ÀýÖÐ, Èç¹û²âÊÔÌõ¼þΪtrue½«Ö´ÐбêÇ©ÄÚÈÝ(body). elseIf±êÇ©ºÍelse±êÇ©½«²»±»Ö´ÐÐ.
- -
-
<ww:if test="true == true">
   <b>if: Success</b>
</ww:if>

<ww:elseIf test="true == true">
   <b>elseIf: Failure</b>
</ww:elseIf>

<ww:else>
   <b>else: Failure</b>
</ww:else>
-

return to top
- -

<ww:elseif />

µ±Ç°Ò»¸ö²âÊÔʧ°ÜºóÓÃÓÚ¾ö¶¨Óï¾äÊÇ·ñÖ´ÐÐ.
- - - - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
testÊÇÓÉWebWork½âÎöÆ÷½øÐмÆË㸳ֵµÄÌõ¼þ±í´ïʽ. Ëü·µ»Ø²¼¶ûÖµtrue»òfalse.

±¾ÀýÖÐ, ÓÉÓÚelseIf±êÇ©µÄÌõ¼þΪtrue¶øif±êÇ©µÄÌõ¼þΪfalse, Òò´Ë½«Ö´ÐÐÆäÄÚÈÝ(body).

-
<ww:if test="true == false">
   <b>if: Failures</b>
</ww:if>

<ww:elseIf test="true == true">
   <b>elseIf: Success</b>
</ww:elseIf>

<ww:else>
   <b>else: Failure</b>
</ww:else>
-

return to top
- -

<ww:else />

Èç¹ûǰһ¸ö²âÊÔΪfalseʱִÐÐ.
- - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).

-±¾ÀýÖÐ, ÓÉÓÚif±êÇ©ºÍelseIf±êÇ©µÄÌõ¼þ¾ùΪfalse, else±êÇ©½«Ö´ÐÐÆäÄÚÈÝ(body).
- -
-
<ww:if test="true == false">
   <b>if: Failures</b>
</ww:if>

<ww:elseIf test="true == false">
   <b>elseIf: Failure</b>
</ww:elseIf>

<ww:else>
   <b>else: Success</b>
</ww:else>
-

-

µü´ú±êÇ©

·µ»Ø
- -

<ww:iterator />

-

Iterator±êÇ©½«ÔÚÒ»¸ö¼¯ºÏÖ®ÉϽøÐеü´ú. ¿Éµü´úµÄÖµ¿ÉÒÔÊÇÏÂÁÐÖ®Ò»: java.util.Collection, java.util.Iterator, java.util.Enumeration, java.util.Map, Êý×é, XML½Úµã »òXMLµÄNodeList.

- - - - - - - - - -
ÊôÐÔÃû ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
status·ñ¸ÃÊôÐÔ±íʾIteratorStatus¶ÔÏ󽫱»±©Â¶(exposed)³öÀ´²¢ÒÔ´ËÃüÃû. ʹÓÃIteratorStatus¶ÔÏó¿ÉÒÔ»ñÈ¡µü´úÐÅÏ¢: getCount(), getIndex(), isFirst(), isLast(), isEven(), isOdd().
value·ñÓÃÓÚÏò±êÇ©´«µÝÊý¾Ý.

-±¾ÀýÖÐ, iterator±êÇ©½«ÔÚCounterÉϽøÐеü´ú. property±êÇ©½«Êä³ö´Ó1µ½10µÄµü´úÖµ.
- -
-
<ww:bean name="'webwork.util.Counter'">
  <ww:param name="'last'" value="10"/>

  <ww:iterator>
    <ww:property/><br />
  </ww:iterator>
</ww:bean>
-

±¾ÀýÖÐ, ÎÒÃÇʹÓÃÒ»¶ÔIteratorStatusÒԲ鿴µü´úÖеÄλÖÃ.

-
<h1>Testing iterator status</h1>

<ww:bean name="'webwork.util.Counter'" id="rowcounter">
  <ww:param name="'first'" value="0"/>
  <ww:param name="'last'" value="5"/>
</ww:bean>

<table border="1">
  <ww:iterator value="#rowcounter" status="rowstatus">
  <tr>
    <ww:bean name="'webwork.util.Counter'" id="colcounter">
    	<ww:param name="'first'" value="0"/>
    	<ww:param name="'last'" value="5"/>
    </ww:bean>
    
    <ww:iterator value="#colcounter" status="colstatus">
     <!--
        if it is (first row) or (first column) or (last row) then
        output the column number.
      -->
      <ww:if test="#rowstatus.first==true || #colstatus.first==true || #rowstatus.last==true">
        <th><ww:property value="#colstatus.count"/></th>
      </ww:if>
      
      <ww:else>
        <td><ww:property/></td>
      </ww:else>
      
    </ww:iterator>

  </tr>
  </ww:iterator>
</table>
-

ÕâÀïÎÒÃÇÀûÓÃIteratorStatusÍê³É¸ôÐмÓÈëÒ»¸ö¶îÍâµÄ»»ÐÐ. ÕâÔÚ»æÖƸôÐв»Í¬µÄµ×É«µÄHTML±í¸ñʱʮ·ÖÓÐÓÃ. ÆæÊýºÍżÊýÊôÐԾݿÉʹÓÃ.

-
<ww:iterator status="status">
   <ww:if test="#status.odd == true"> <br /> </ww:if>
   <br />
</ww:iterator> 

Here we use the IteratorStatus determine every fourth row to insert an extra line break. 
<ww:iterator status="status">
  <ww:if test="#status.modulus(4) == 0"> <br /> </ww:if>
  <br />
</ww:iterator>
-

ÏÂÃæÁгöIteratorStatus¶ÔÏó¿ÉÓõIJÙ×÷: -

    -
  • even : boolean - Èç¹ûµ±Ç°µü´úλÖÃÊÇżÊý·µ»Øtrue
  • -
  • odd : boolean - Èç¹ûµ±Ç°µü´úλÖÃÊÇÆæÊý·µ»Øtrue
  • -
  • count : int - ·µ»Øµ±Ç°µü´úλÖõļÆÊý(´Ó1¿ªÊ¼)
  • -
  • index : int - ·µ»Øµ±Ç°µü´úλÖõıàºÅ(´Ó0¿ªÊ¼)
  • -
  • first : boolean - Èç¹ûµ±Ç°µü´úλÖÃÊǵÚһλʱ·µ»Øtrue
  • -
  • last : boolean - Èç¹ûµ±Ç°µü´úλÖÃÊÇ×îºóһλʱ·µ»Øtrue
  • -
  • modulus(operand : int) : int - ·µ»Øµ±Ç°¼ÆÊý(´Ó1¿ªÊ¼)ÓëÖ¸¶¨²Ù×÷ÊýµÄÄ£Êý
  • -

·µ»Ø
- -

<ww:generator />

ʹÓøø¶¨ÖµÉú³Éµü´úÆ÷(Iterator).

- - - - - - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
count·ñµü´úÖеÄÔªËØÊýÁ¿.
separator·ñStringTokenizerÓÃÓÚ¶Ï×ÖµÄ×Ö·û.
valÊÇÓÃÓÚÉú³Éµü´úÁбíµÄ×Ö·û´®.

±¾ÀýÖд´½¨ÁËÁ½¸öµü´úÆ÷. Ò»¸öÊÇval="'foo,bar,xyzzy'" ÁíÒ»¸öÊÇval="' '".

-
<h1>Testing append, subset, and value generators</h1>

<table border="1">
  <ww:bean name="'webwork.util.Counter'">
    <ww:param name="'last'" value="5"/>
    <ww:iterator id="colcount">
      <tr>

        <!--
           Generator will create an Iterator that has 5 items.
           The first 3 are "foo,bar,xyzzy". Item 4 and 5 will be
           foo and bar respectively. If the count is more than
           the items, you start over.
        -->
        
        <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/>

       <!--
           Generator will create an Iterator that has infinite
            . Count=-1 means indefinite.
        -->
        <ww:generator val="' '" count="-1" id="space"/>
        <ww:append>
          <ww:param name="'source'" value="#values"/>
          <ww:param name="'source'" value="#space"/>

          <ww:subset count="6">
            <ww:iterator>
              <td width="40"><ww:property/></td>
            </ww:iterator>
          </iterator:subset>
        </iterator:append>
      </tr>
    </ww:iterator>
  </ww:bean>
</table>
-

¸Ã±êǩĿǰÊǶàÓàµÄ, ¿ÉÒÔʹÓÃOGNLÀ´Íê³É: -

-
<ww:iterator value="{1, 2, 3, 4}">
</ww:iterator>
-

·µ»Ø
- -

<ww:append />

Append±êÇ©ÓÃÓÚÌí¼ÓÒ»¸öµü´úÆ÷Áбí. µü´úµÄÖµ½«±»Ìí¼ÓÔÚÒ»Æð²¢×÷Ϊһ¸öµü´úÆ÷ʹÓÃ. ¸Ãµü´úÆ÷µÄÊä³ö˳ÐòÓëÌí¼Ó˳ÐòÒ»ÖÂ.

- - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).

±¾ÀýÖÐ, Ìí¼ÓÁËÁ½¸öµü´úÆ÷#valuesºÍ#spaces. ÕâÒâζ×Å#spacesµÄÖµÔÚ#valuesÖ®ºó.

-
<h1>Testing append, subset, and value generators</h1>

<table border="1">
  <ww:bean name="'webwork.util.Counter'">
    <ww:param name="'last'" value="5"/>
    <ww:iterator id="colcount">
      <tr>
        <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/>
        <ww:generator val="' '" count="-1" id="space"/>
        <ww:append>
          <ww:param name="'source'" value="#values"/>
          <ww:param name="'source'" value="#space"/>

          <ww:subset count="6">
            <ww:iterator>
              <td width="40"><ww:property/></td>
            </ww:iterator>
          </iterator:subset>
        </iterator:append>
      </tr>
    </ww:iterator>
  </ww:bean>
</table>
-

·µ»Ø
- -

<ww:subset />

Subset±êÇ©½öµü´úsourceµÄÒ»²¿·Ö. Ëü´ÓÆðµã¿ªÊ¼²¢½øÐÐcountÖ¸¶¨µÄµü´ú´ÎÊý. Èç¹ûÄãÏëµü´úµ½×îºó, ¿ÉÒÔ½«countÉèÖÃΪ-1. Èç¹û²»ÌṩsourceÊôÐÔ, ½«Ê¹ÓÃÖµÕ»µÄµ±Ç°¶ÔÏó- ".".
- - - - - - - - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
count·ñÖ¸¶¨µü´ú´ÎÊý.
source·ñÖ¸¶¨±¾±êÇ©²Ù×÷µÄµü´úÆ÷. ¿ÉÒÔÊÇEnumeration, Iterator, »òCollection.
start·ñÖ¸¶¨¿ªÊ¼µü´úµÄλÖÃ.

±¾ÀýÖÐ, subset±êÇ©½«¶ÔÖµÕ»Öе±Ç°¶ÔÏóµÄ6¸öÔªËØ½øÐеü´ú.

-
<h1>Testing append, subset, and value generators</h1>

<table border="1">
  <ww:bean name="'webwork.util.Counter'">
    <ww:param name="'last'" value="5"/>
    <ww:iterator id="colcount">
    <tr>
      <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/>
      <ww:generator val="' '" count="-1" id="space"/>
      <ww:append>
        <ww:param name="'source'" value="#values"/>
        <ww:param name="'source'" value="#space"/>

        <ww:subset count="6">
          <ww:iterator>
            <td width="40"><ww:property/></td>
          </ww:iterator>
        </iterator:subset>
      </iterator:append>
      </tr>
    </ww:iterator>
  </ww:bean>
</table>
-

·µ»Ø
- -

<ww:merge />

½«¼¸¸öµü´úÆ÷ºÏ²¢ÎªÒ»¸ö. ¸Ã±êÇ©½«ÕâЩµü´úÆ÷½»Ö¯ÔÚÒ»Æð. If one iterator runs out, it will drop off and the others will continue weaving until there are no more values.
- - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).

±¾ÀýÖÐ, #foo, #bar, and #xyzzy±»ºÏ²¢ÔÚÒ»Æð. Òò´Ë, Êä³ö˳ÐòÊÇfoo, bar, xyzzy until #foo #xyzzy iterators run out in which case #bar will finish.

-
Three value generators with merge and subset limits:<br>
<ww:generator val="'foo'" count="5" id="foo"/>
<ww:generator val="'bar'" count="10" id="bar"/>
<ww:generator val="'xyzzy'" count="5" id="xyzzy"/>
<ww:merge>
  <ww:param name="'source'" value="#foo"/>
  <ww:param name="'source'" value="#bar"/>
  <ww:param name="'source'" value="#xyzzy"/>

  <ww:subset count="30">
    <ww:iterator status="status">
      <ww:property value="#status.count"/>:<ww:property/><br>
    </ww:iterator>
  </iterator:subset>
</iterator:merge>
-

·µ»Ø
- -

<ww:sort />

Sort¿ÉÒÔ¶ÔÒ»¸öµü´úÆ÷½øÐÐÅÅÐò. ËüʹÓÃÄãÌṩµÄ±È½ÏÆ÷(Comparator)½øÐбȽÏ, ʹÓÃCollections.sort()·½·¨½øÐÐÅÅÐò.
- - - - - - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
id·ñÎªÔªËØÖ¸¶¨Î¨Ò»Ãû³Æ(×¢Òâ).
comparatorÊÇÓÃÓÚ¼¯ºÏÅÅÐòµÄCompartor.
source·ñÖ¸¶¨±¾±êÇ©²Ù×÷µÄµü´úÆ÷.¿ÉÒÔÊÇEnumeration, Iterator, »òCollection.

±¾Àý½øÐÐÉýÐòÅÅÐò.

-
<ww:bean name="'webwork.util.Counter'" id="counter">
  <ww:param name="'first'" value="0"/>
  <ww:param name="'last'" value="5"/>
</ww:bean>

<ww:bean name="'webwork.util.Sorter'" id="sorter"/>

Ascending:<br />
<ww:sort source="#counter" comparator="#sorter.ascending">
  <ww:iterator>
    <ww:property/><br />
  </ww:iterator>
</iterator:sort>
-

±¾Àý½øÐнµÐòÅÅÐò.

-
<ww:bean name="'webwork.util.Sorter'" id="sorter"/>

<ww:bean name="'webwork.util.Counter'" id="counter">
  <ww:param name="'first'" value="0"/>
  <ww:param name="'last'" value="5"/>
</ww:bean>

Descending:<br>
<ww:sort source="#counter" comparator="#sorter.descending">
  <ww:iterator>
    <ww:property/><br>
  </ww:iterator>
</iterator:sort>
-

±¾Àý½øÐÐ×Ö·û´®ÉýÐòÅÅÐò.

-
<ww:bean name="'webwork.util.Sorter'" id="sorter"/>

Sorting strings:<br>
<ww:generator val="'Rickard,Maurice,Hristo'" separator="','" id="names"/>
<ww:sort source="#names" comparator="#sorter.ascending">
  <ww:iterator>
    <ww:property/><br>
  </ww:iterator>
</iterator:sort>
-

×¢Òâ

-
- Id ÊôÐÔ"id"ÎªÔªËØÖ¸¶¨Ãû×Ö. ¸ÃÃû³ÆÔÚÕû¸öÎĵµÖбØÐëÊÇΨһµÄ. ¸ÃÊôÐÔÊÇÓÉTagSupportÌṩµÄ, Òò´ËÓÀÔ¶ÊÇÒ»¸ö×Ö·û´®. ²»ÐèÒªÏñÆäËûWebWork±êÇ©ÄÇÑùʹÓÃ×Ö·û´®ÎÄ·¨(string literal); Ò²¾ÍÊÇ˵ - id="'age'". Äã¿ÉÒÔÖ±½ÓʹÓÃid="age".


- ±ØÐè×¢ÒâµÄÊÇËùÓн«Ä³Ð©Öµ±£´æÔÚÖµÕ»µÄ±êÇ©(Èçi18n»òbean)¶¼½«ÔÚ±êÇ©½áÊøÊ±´ÓÖµÕ»Öн«ËüÃÇɾ³ý.
-Òò´Ë, Èç¹ûÄãÓÃbean±êǩʵÀý»¯Ò»¸öbean(<ww:bean name="'br.univap.fcc.sgpw.util.FormattersHelper'">), ¸Ãbean½öÔÚ</ww:bean>±êǩ֮ǰ²ÅÄÜÔÚÖµÕ»ÖзÃÎÊ. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/OGNL Basics.html b/docs/chinese/wikidocs/OGNL Basics.html deleted file mode 100644 index 95a509ace..000000000 --- a/docs/chinese/wikidocs/OGNL Basics.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork 2 : OGNL»ù´¡ - - - - - - - - - -
- -
- This page last changed on Nov 17, 2004 by casey. -
- -

XWorkÌØÊâÓïÑÔÌØÐÔ

-XWork»ùÓÚOGNL²¢Ôö¼ÓµÄ×î´ó¹¦ÄÜÊÇÖ§³ÖÖµÕ». OGNL¼Ù¶¨Ö»ÓÐÒ»¸ö"¸ù(root)", ¶øXWorkÖµÕ»µÄ¸ÅÄîÖ§³Ö¶à¸ö"¸ù".

ÀýÈç, ¼ÙÉèÎÒÃÇʹÓñê×¼OGNL(²»ÓÃXWork), ÔÚOgnlContext±íÖÐÓÐÁ½¸ö¶ÔÏó: "foo" -> fooºÍ"bar" -> bar, ²¢ÇÒfoo±»ÉèÖÃΪ¸ù¶ÔÏó. ÏÂÁдúÂëÃèÊöOGNLÈçºÎ´¦ÀíÏÂÁÐÈýÖÖÇé¿ö:
- -
-
#foo.blah // returns foo.getBlah()
#bar.blah // returns bar.getBlah()
blah      // returns foo.getBlah() because foo is the root
-

ÕâÒâζ×ÅOGNLÔÊÐíÉÏÏÂÎÄÖаüº¬¶à¸ö¶ÔÏó, µ«³ý·ÇÄãÒª·ÃÎʵĶÔÏóÊǸù, ÆäËû·ÃÎʱØÐë¼ÓÉÏÃû¿Õ¼äÈç, @bar. ÏÖÔÚÎÒÃÇÀ´ÌÖÂÛXWorkµÄÒ»µãÇø±ð…

ÔÚXWorkÖÐ, Õû¸öÖµÕ»ÊÇÉÏÏÂÎÄÖеĸù¶ÔÏó. µ«Èç¹ûÄãÏò´ÓÕ»ÖлñÈ¡¶ÔÏó»òÊÇÓÃËüÃǵÄÊôÐÔ, Äã²¢²»ÐèÒªÕë¶ÔÖµÕ»±àд±í´ïʽ(Èç: peek().blah), XWorkÓÐÒ»¸öÌØÊâµÄOGNL PropertyAccessorËü½«×Ô¶¯ËÑË÷Õû¸öÖµÕ»(×ÔÉ϶øÏÂ)ÖªµÀÕÒµ½¾ßÓÐÄãÒª²éÕÒµÄÊôÐԵĶÔÏóΪֹ.

ÀýÈç, ¼ÙÉèÕ»ÖÐÓÐÁ½¸ö¶ÔÏó: AnimalºÍPerson. À´¸ö¶ÔÏó¶¼ÓÐ"name"ÊôÐÔ, AnimalÓÐÒ»¸ö"species"ÊôÐÔ, PersonÓÐÒ»¸ö"salary"ÊôÐÔ. AnimalÔÚÕ»¶¥, PersonÔÚËüÏÂÃæ. ÏÂÃæµÄ´úÂëÆ¬¶ÏÓÐÖúÓÚÄãÁ˽â»á·¢Éúʲô:

-
species    // call to animal.getSpecies()
salary     // call to person.getSalary()
name       // call to animal.getName() because animal is on the top
-

ÔÚ×îºóÒ»¸öÀý×ÓÖÐ, Á½¸ö¶ÔÏó¶¼ÓÐnameÊôÐÔ, Òò´Ë·µ»ØÁËanimalµÄname. ͨ³£Õâ¾ÍÊÇÆÚÍûµÄЧ¹û, µ«ÓÐʱÄãÐèҪʹÓõͲã¶ÔÏóµÄÊôÐÔ. Ϊ´Ë, XWorkÖ§³ÖÖµÕ»Ë÷Òý. Äã½öÐèÒª±àд:

-
[0].name   // call to animal.getName()
[1].name   // call to person.getName()
-

·ÃÎʾ²Ì¬ÊôÐÔ

OGNLÖ§³Ö¶Ô¾²Ì¬·½·¨ºÍÊôÐԵķÃÎÊ. ÕýÈçOGNLÎĵµÖ¸³öµÄ, ¿ÉÒÔʹÓÃÏÂÁдúÂëÏÔʽµ÷Óþ²Ì¬ÄÚÈÝ:
- -
-
@some.package.ClassName@FOO_PROPERTY
@some.package.ClassName@someMethod()
-

È»¶ø, XWork²»ÐèÒªÖ¸¶¨»î¶¯ÀàµÄÍêÕû°üÃû¶øÊÇÓÃ"vs"ǰ׺:

-
@vs@FOO_PROPERTY
@vs@someMethod()

@vs1@FOO_PROPERTY
@vs1@someMethod()

@vs2@BAR_PROPERTY
@vs2@someOtherMethod()
-

"vs"¾ÍÊÇ"value stack". ÐèҪעÒâµÄÊÇÈç¹ûÄãʹÓÃ"vs"¶ø²»Ö¸¶¨ÀàÃû, ½«Ê¹ÓÃÕ»¶¥¶ÔÏóÀà. Èç¹ûÄãÔÚ"vs"ºóÔö¼ÓÊý×Ö, ½«Ê¹ÓÃÕ»ÖиüµÍ²ãµÄ¶ÔÏó.

ÓëWebWork 1.x±í´ïʽÓïÑÔµÄÇø±ð

-³ýÁËÉÏÃæµÄÀý×ÓºÍÃèÊöÒÔÍâ, »¹Óм¸¸öÖ÷񻂿±ð. ×î´óµÄÇø±ðÊÇÊôÐÔ²»ÔÙʹÓÃ'/'·ÃÎʶøÊÇÓÃ'.'. ÁíÍâ, ²»ÔÙʹÓÃ".."ÏòϱéÀúÖµÕ», ĿǰʹÓÃ"[n]", nÊÇÒ»¸öÊý×Ö. ×îºó, ÔÚWebWork 1.xÖпÉÒÔʹÓÃ"@foo"·ÃÎÊÌØÊâÃüÃû¶ÔÏó, µ«ÏÖÔÚÌØÊâ±äÁ¿Ê¹ÓÃ"#foo"·ÃÎÊ. ÎÞÂÛÈçºÎ, ×îÖØÒªµÄÊÇ"#foo"²»ÄÜ·ÃÎÊÇëÇóÊôÐÔ. ÒòΪXWork²»½öÊÇΪWeb¶ø´´½¨, Òò´ËûÓÐ"ÇëÇóÊôÐÔ"µÄ¸ÅÄî, Òò´Ë"#foo"½ö½öÊÇÇëÇóOgnlContextÖзǸù¶ÔÏóµÄ±í´ïʽ.
- -
Old ExpressionNew Expression
foo/blahfoo.blah
foo/someMethod()foo.someMethod()
../bar/blah[1].bar.blah
@baz²»Ö±½ÓÖ§³Ö1, µ«#bazÓëÖ®ÀàËÆ
.top or [0]
-

WebWorkµÄÌØÊâÃüÃû¶ÔÏó

-
Ãû×ÖÖµ
#parameters['foo'] or #parameters.foorequest parameter ['foo'] (request.getParameter())
#request['foo'] or #request.foorequest attribute ['foo'] (request.getAttribute())
#session['foo'] or #session.foosession attribute 'foo'
#application['foo'] or #application.fooServletContext attributes 'foo'
#attr['foo'] or #attr.fooAccess to PageContext if available, otherwise searches request/session/application respectively
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/OGNL.html b/docs/chinese/wikidocs/OGNL.html deleted file mode 100644 index 8bddd9293..000000000 --- a/docs/chinese/wikidocs/OGNL.html +++ /dev/null @@ -1,83 +0,0 @@ - - - WebWork 2 : OGNL - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

×ÛÊö

OGNL¾ÍÊÇObject Graph Navigation Language - Çë·ÃÎÊhttp://www.ognl.org²é¿´OGNLÍêÕûÎĵµ. ±¾ÎÄÖÐÎÒÃǽöչʾ¼¸¸öÓëWebWork¹²´æµÄOGNLÌØÐÔ. - -

WebworkºÍOGNL

WebworkʹÓñê×¼ÃüÃûÉÏÏÂÎÄ(namming context)ÔËËãOGNL±í´ïʽ. OGNL´¦ÀíµÄ¶¨¼¶¶ÔÏóÊÇÒ»¸ömap(ͨ³£±»³ÆÎªcontext map). OGNLÓÐÒ»¸ö¸ù¶ÔÏóµÄ¸ÅÄî (ÔÚwebworkÊõÓïÖÐ, ¾ÍÊÇOGNLValueStack). ÆäËû¶ÔÏóºÍ¸ù¶ÔÏóÒ»Æð·ÅÖÃÔÚcontext map(¼ò³Æcontext)ÖÐ, °üÀ¨session/application/requestÊôÐÔ. ÕâЩ¶ÔÏóºÍ¸ù¶ÔÏóûÓйØÏµ, Ö»ÊÇ˳Ðò´æÔÚÓÚcontext mapÖÐ. Òò´Ë, Ϊ·ÃÎÊÕâЩ¶ÔÏóÐèÒª ʹÓÃ#¸æËßognl²»ÒªÔÚ¸ù¶ÔÏóÖвéÕÒ, ¶øÓ¦µ±ÔÚÆäËûcontextÖвéÕÒ -

-
|             

                     |--request
                     |
                     |--application
                     |
       context map---|--OgnlValueStack(root)
                     |
                     |--session
                     |
                     |--attr
                     |
                     |--parameters
-

N×¢Òâcontext mapÖл¹ÓÐÆäËû¶ÔÏó, ±¾ÀýÖнöÒýÓÃÁËÒ»²¿·Ö. ÏÖÔÚ, »î¶¯¶ÔÏó±»·ÅÈëOGNLValueStackÒò´Ë¿ÉÒÔ²»Ê¹ÓÃ#·ÃÎÊËüµÄÊôÐÔ. -
-
<ww: property value="myBean.myProperty"/>
-

Òª·ÃÎÊsession, requestºÍÆäËû¶ÔÏó: -

-
ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
-
-
-
<ww: property value="#session.mySessionPropKey"/> or
<ww: property value="#session['mySessionPropKey']"/>

<ww: property value="#attr.mySessionPropKey"/>
-

¼¯ºÏ (Maps, Lists, Sets)

-ÔÚWebWorkÖо­³£Òª´¦Àí¼¯ºÏ(maps, lists, sets), Òò´ËÏÂÃæÊǼ¸¸öʹÓÃselect±êÇ©µÄÀý×Ó:
-listµÄÓï·¨: {e1,e2}. Ëü´´½¨Ò»¸öList, °üº¬×Ö·û´®"name1"ºÍ"name2". -
-
<webwork:select label="'lebal'" name="'nmae'" list="{'name1','name2'}" />
-

-mapµÄÓï·¨: #{key1:value1,key2:value2}. Ëü´´½¨Ò»¸öMap, ½«"foo"Ó³Éäµ½"foovalue", "bar"Ó³Éäµ½"barvalue": -
-
<webwork:select label="'lebal'" name="'nmae'" list="#{'foo':'foovalue', 'bar':'barvalue'}" />
-

ÓÐʱÐèÒªÅжÏÒ»¸öÔªËØÊÇ·ñ°üº¬ÔÚ¼¯ºÏÖÐ. ¿ÉÒÔʹÓÃÏÂÃæµÄ²Ù×÷inºÍnot in -

-
<ui:if test="'foo' in {'foo','bar'}">
   muhahaha
</ui:if>
<ui:else>
   boo
</ui:else>

<ui:if test="'foo' not in {'foo','bar'}">
   muhahaha
</ui:if>
<ui:else>
   boo
</ui:else>
-

Ñ¡Ôñ¼¯ºÏµÄÒ»¸ö×Ó¼¯(³ÆÎªÍ¶Ó°), ¿ÉÒÔÔÚ¼¯ºÏÖÐʹÓÃͨÅå·û(wildcard). -
    -
  • ? - ËùÓÐÆ¥ÅäÑ¡ÔñÂß¼­µÄÔªËØ
  • -
  • ^ - µÚÒ»¸öÆ¥ÅäÑ¡ÔñÂß¼­µÄÔªËØ
  • -
  • $ - ×îºóÒ»¸öÆ¥ÅäÑ¡ÔñÂß¼­µÄÔªËØ
  • -

-´Ó¶ÔÏóPersonÖлñÈ¡ÄÐÐÔÇ×ÊôµÄ×Ó¼¯: -
-
person.relatives.{? #this.gender == 'male'}
-

Lambda±í´ïʽ

-OGNLÖ§³Ö»ù±¾µÄlamba±í´ïʽÓï·¨¿ÉÒÔÓÃÀ´±àд¼òµ¥µÄº¯Êý.

ÀýÈç:

Äã¿ÉÄܲ»»áÏëµ½»áÔÚÊýѧ¿ÎÍâÔÚ¼ûµ½Õâ¸ö.
-·Æ²¨ÄÉÇÐ(Fibonacci)ÊýÁÐ: if n==0 return 0; elseif n==1 return 1; else return fib(n-2)+fib(n-1);
-fib(0) = 0
-fib(1) = 1
-fib(11) = 89

Lambda±í´ïʽµÄÈκÎÄÚÈݶ¼°üÀ¨ÔÚÀ¨ºÅÖÐ. #this±äÁ¿±£´æ±í´ïʽµÄ²ÎÊý, ËüµÄ³õʼֵÊÇ11.
- -
-
<ww:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Packages.html b/docs/chinese/wikidocs/Packages.html deleted file mode 100644 index 055b6e572..000000000 --- a/docs/chinese/wikidocs/Packages.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork 2 : °ü - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

×ÛÊö

ʹÓðü¿ÉÒÔ½«»î¶¯, ½á¹û, ½á¹ûÀàÐÍ, ½ØÈ¡Æ÷ºÍÕ»×éºÏΪһ¸öÂß¼­µ¥ÔªµÄ²¢Ê¹ËüÃǹ²ÏíͨÓÃÅäÖÃ. °üºÍ¶ÔÏóÀàËÆ, ×Ó°üÒ²¿ÉÒÔÀ©Õ¹²¢¸²¸Ç¸¸°üµÄijЩ²¿·Ö.

°ü

packageÔªËØÓÐÒ»¸ö±ØÐèÊôÐÔ"name", Ëü×÷ΪºóÃæÒýÓøðüµÄ¼üÖµ. "extends"ÊôÐÔÊÇ¿ÉÑ¡µÄ, ÔÊÐíÒ»¸ö°ü¼Ì³Ðǰһ¸ö»ò¼¸¸ö°üµÄÅäÖÃÐÅÏ¢, °üÀ¨ËùÓеĽØÈ¡Æ÷, ½ØÈ¡Æ÷Õ», ºÍ»î¶¯. ÐèҪעÒâµÄÊÇ, ÅäÖÃÎļþÊÇ´ÓÉϵ½ÏÂ˳Ðò½øÐд¦ÀíµÄ, Òò´Ë±»ÆäËû°üÒýÓõİüÓ¦µ±¶¨ÒåÔÚÇ°Ãæ. "abstract"¿ÉÑ¡ÊôÐÔÓÃÀ´´´½¨Ò»¸ö³éÏó°ü, À©Õ¹¸Ã°üʱ²»°üº¬ÆäÖеĻÅäÖÃ.
- - - - - - - - - - - - - -
ÊôÐÔ ±ØÐè ÃèÊö
name ÊÇ ÆäËû°üÒýÓÃʱµÄ¼üÖµ
extends ·ñ ´ÓÀ©Õ¹µÄ°üÖм̳Ð
namespace ·ñ ²Î¼ûÃû¿Õ¼ä
abstract ·ñ ÉùÃ÷Ϊ³éÏó°ü(°üÖв»ÐèÒª»î¶¯ÅäÖÃ)
-
xwork.xmlÖеÄʹÓÃʾÀý
-
-
<package name="bar" extends="webwork-default" namespace="/foo/bar">
        <interceptors>
            <interceptor-stack name="barDefaultStack">
                <interceptor-ref name="debugStack"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

        <action name="Bar" class="com.opensymphony.xwork.SimpleAction">
            <interceptor-ref name="barDefaultStack"/>
        </action>

        <action name="TestInterceptorParamInheritance" class="com.opensymphony.xwork.SimpleAction">
            <interceptor-ref name="test">
                <param name="expectedFoo">expectedFoo</param>
            </interceptor-ref>
        </action>

        <action name="TestInterceptorParamInehritanceOverride" class="com.opensymphony.xwork.SimpleAction">
            <interceptor-ref name="test">
                <param name="foo">foo123</param>
                <param name="expectedFoo">foo123</param>
            </interceptor-ref>
        </action>
    </package>

    <package name="abstractPackage" namespace="/abstract" abstract="true">
        <action name="test" class="com.opensymphony.xwork.SimpleAction"/>
    </package>

    <package name="nonAbstractPackage" extends="abstractPackage" namespace="/nonAbstract"/>

    <package name="baz" extends="default" namespace="baz">
        <action name="commandTest" class="com.opensymphony.xwork.SimpleAction">
            <param name="foo">123</param>
            <result name="error" type="chain">
                <param name="actionName">bar</param>
            </result>
            <interceptor-ref name="static-params"/>
        </action>
        <action name="myCommand" class="com.opensymphony.xwork.SimpleAction" method="commandMethod">
            <param name="bar">456</param>
            <result name="success" type="chain">
                <param name="actionName">foo</param>
            </result>
            <interceptor-ref name="logger"/>
        </action>
    </package>

    <package name="multipleInheritance" extends="default,abstractPackage,bar" namespace="multipleInheritance">
        <action name="testMultipleInheritance" class="com.opensymphony.xwork.SimpleAction">
            <result name="success" type="chain">
                <param name="actionName">foo</param>
            </result>
            <interceptor-ref name="barDefaultStack"/>
        </action>
    </package>
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Password tag.html b/docs/chinese/wikidocs/Password tag.html deleted file mode 100644 index 558e6b11e..000000000 --- a/docs/chinese/wikidocs/Password tag.html +++ /dev/null @@ -1,83 +0,0 @@ - - - WebWork 2 : Password±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:password />

ÀàÐÍΪpasswordµÄINPUT±êÇ©.

±¾ÀýÖÐÏÔʾһ¸öpassword¿Ø¼þ. ͨ¹ýµ÷ÓÃActionSupportµÄgetText()·½·¨´ÓResourceBundleÖÐÌáÈ¡Îı¾×÷ΪÆä±êÇ©. -

-
<ww:password label="text('password')" name="'password'" size="10" maxlength="15"/>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ Îı¾Öµ
size ·ñ HTMLµÄsizeÊôÐÔ
maxlength ·ñ HTMLµÄmaxlengthÊôÐÔ
disabled ·ñ HTMLµÄdisabledÊôÐÔ
readonly ·ñ HTMLµÄreadonlyÊôÐÔ
onkeyup ·ñ HTMLµÄonkeyupÊôÐÔ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
show ·ñ ÊÇ·ñÏÔʾÃÜÂëÖµ(Éæ¼°°²È«ÐÔ)
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Pico.html b/docs/chinese/wikidocs/Pico.html deleted file mode 100644 index 4dd1cd9cd..000000000 --- a/docs/chinese/wikidocs/Pico.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Pico - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

Pico is an Inversion of Control container available at http://picocontainer.codehaus.org. There have been several reports of integration between WebWork and Pico. We recommend that you build your own ObjectFactory to do this integration.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Previous releases.html b/docs/chinese/wikidocs/Previous releases.html deleted file mode 100644 index 67e896516..000000000 --- a/docs/chinese/wikidocs/Previous releases.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork 2 : Previous releases - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- - -

Old format of release notes and upgrade guides

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Projects Using WebWork.html b/docs/chinese/wikidocs/Projects Using WebWork.html deleted file mode 100644 index e80568bed..000000000 --- a/docs/chinese/wikidocs/Projects Using WebWork.html +++ /dev/null @@ -1,68 +0,0 @@ - - - WebWork 2 : Projects Using WebWork - - - - - - - - - -
- -
- This page last changed on Nov 17, 2004 by mcampbell. -
- -
    -
  • Atlassian Confluence - Commercial Wiki and knowledge management system using WebWork 2.0, Hibernate, Spring, and Velocity
  • -
- -
    -
  • DriveNow - last minute Autralian car rentals
  • -
-
    -
  • OpenReports - an open source web based reporting application that uses WebWork 2.0, Velocity, and Hibernate
  • -
-
    -
  • eSage Group is a consulting company that uses it for all their client engagements. Additionally, its used for their internal systems
  • -
- -
    -
  • TeraMEDICA - WebWork is used in TeraMEDICA's commercial TI2m product, which performs intelligent image management for the healthcare enterprise. Specifically, WebWork is a key component of the system's management interface.
  • -
-
    -
  • EBIA COBRA and 401K Benefits Site provides law reviews for employee benefits like COBRA and 401K. The site moved from all struts to a current architecture of about 50% WebWork and 50% Struts. We are trying to move it all over to WebWork. This site is also a great example of porting from Tiles to SiteMesh.
  • -
-
    -
  • Midwinter - an open source rapid web application develop system using WebWork 2.0, Hibernate, Spring, and Velocity
  • -
-
    -
  • Valtira Rolecall - Identity Management Framework that provides single sign-on for J2EE and .NET web applications.
  • -
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Quartz.html b/docs/chinese/wikidocs/Quartz.html deleted file mode 100644 index a5616fd8a..000000000 --- a/docs/chinese/wikidocs/Quartz.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork 2 : Quartz - - - - - - - - - -
- -
- This page last changed on Jun 10, 2004 by ctran. -
- -

The following class performs the glue between Quartz and Webwork:

-
package com.trantek.sit.action;

import com.opensymphony.xwork.ActionProxy;
import com.opensymphony.xwork.ActionProxyFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class WebWorkJob implements Job
{
    public void execute(JobExecutionContext context) throws JobExecutionException
    {
        try
        {
            ActionProxy proxy = ActionProxyFactory.getFactory().
                    createActionProxy("", context.getJobDetail().getName(), context.getJobDetail().getJobDataMap());

            proxy.execute();
        }
        catch (Exception e)
        {
            throw new JobExecutionException(e);
        }
    }
}
-

To schedule webwork actions you simply create a job where

    -
  • the name of your job is the name of the WW action to execute (no ".action" suffix).
  • -
  • all the parameters you want to send to the WW action is contained in the JobDataMap of the JobDetail
  • -

(the Quartz scheduler is setup as a servlet according to the javadocs of org.quartz.ee.servlet.QuartzInitializerServlet.)

The following code schedules an e-mail action:
- -
-
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

JobDetail jobDetail = new JobDetail("email.send", 
                                     scheduler.DEFAULT_GROUP, WebworkJob.class);

Map m = jobDetail.getJobDataMap();
m.put("to", "me@bogusdomain.com");
m.put("subject", "quartz test");
m.put("body", "This is a quartz test, Hey ho");
m.put("smtpServer", "smtp.bogusdomain.com");
m.put("from", "quartz@bogusdomain.com");

SimpleTrigger trigger = new SimpleTrigger("myTrigger", 
                                          scheduler.DEFAULT_GROUP, 
                                          new Date(), null, 0, 0L);

scheduler.deleteJob("email.send", scheduler.DEFAULT_GROUP);
scheduler.scheduleJob(jobDetail, trigger);
-

This example is based on WW1:Integrating Webwork and Quartz

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/QuickStart.html b/docs/chinese/wikidocs/QuickStart.html deleted file mode 100644 index 0791148c7..000000000 --- a/docs/chinese/wikidocs/QuickStart.html +++ /dev/null @@ -1,113 +0,0 @@ - - - WebWork 2 : QuickStart - - - - - - - - - -
- -
- This page last changed on Nov 08, 2004 by matthew. -
- -

WebWork is a popular, easy-to-use MVC framework, for more information on the WebWork project, please visit WW:WebWork. This guide should be helpful to seasoned Java developers with previous experience in MVC frameworks. We will briefly cover the three main components on a WebWork2 based application, the configuration the action classes, and the views.

GETTING STARTED

-To use WebWork as your framework for writing Java-based web applications, you need to start by installing the various libraries (these are all available in the webwork 2.x distribution):

Core JAR files

- -

Optional JAR files

-
    -
  • jstl.jar (needed for Standard Tag Libraries)
  • -
  • cos-multipart.jar
  • -
  • pell-multipart.jar
  • -
  • standard.jar
  • -
  • mail.jar
  • -
-

CONFIGURATION

-WebWork is built upon the Xwork framework. Xwork handles the translation requests to commands execution, but let's not worry about that right now. You need to know this information in case you were curious about the xwork JAR file, and if you want to learn some of the more advanced features of the WebWork command structure, you can visit the XW:XWork site.

Example web.xml file

-
-
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app 
          PUBLIC 
          "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
          "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>WebWork 2.0 Quick Start</display-name>
    <servlet>
        <servlet-name>webwork</servlet-name>
          <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>                                            
    </servlet>


    <servlet-mapping>
        <servlet-name>webwork</servlet-name>
	<url-pattern>*.action</url-pattern>
    </servlet-mapping>


    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <taglib> 
        <taglib-uri>webwork</taglib-uri> 
        <taglib-location>/WEB-INF/lib/webwork-2.1.5.jar</taglib-location> 
    </taglib>

</web-app>
-

Servlet mappings

-
-
<servlet-mapping>
    <servlet-name>webwork</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>
-

-The above section will map ANY servlet called with an extension of .action to the WebWork base servlet, and assume it is a WebWork action class.

Taglibs

-
-
<taglib> 
  <taglib-uri>webwork</taglib-uri> 
  <taglib-location>/WEB-INF/lib/webwork-2.1.5.jar</taglib-location> 
</taglib>
-

-The above section will load the standard WebWork tag libraries. This is required for JSP 1.1 compatible containers. To load more or different libraries, add more <taglib> calls.

Example Xwork config file (xwork.xml)

-
-
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xwork 
          PUBLIC 
          "-//OpenSymphony Group//XWork 1.0//EN" 
          "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
    <include file="webwork-default.xml"/>
    <package name="default" extends="webwork-default">
        <interceptors>
                <interceptor name="security" class="com.acme.LoginCheck"/>
                <interceptor-ref name="defaultStack"/>
        </interceptors>

        <default-interceptor-ref name="security"/>
       
        <action name="showForm" class="com.acme.FormAction">
            <result name="success" type="dispatcher">
                <param name="location">/form.jsp</param>
            </result>
        </action>

        <action name="saveForm" class="com.acme.FormAction" method="processForm">
            <result name="success" type="dispatcher">
                <param name="location">/form.jsp</param>
            </result>
             <result name="missing-data" type="dispatcher">
                <param name="location">/form.jsp</param>
            </result>
            <interceptor-ref name="security"/>
        </action>

    </package>
</xwork>
-

ACTIONS

-
-
<action name="saveForm" class="com.acme.FormAction" method="processForm">
-

Actions are the basic "unit-of-work" in WebWork, they define, well, actions. An action will usually be a request, (and usually a button click, or form submit). The main action element (tag is too synonymous with JSP) has two parts, the friendly name (referenced in the URL, i.e. saveForm.action) and the corresponding "handler" class.

The method parameter tells WebWork which method to call based upon this action. If you leave the method parameter blank, WebWork will call the method execute() from the Action Interface by default. Since every Action must implment the Action Interface, this method will always be available.

RESULTS

-
-
<result name="missing-data" type="dispatcher">
    <param name="location">/form.jsp</param>
</result>
-

Result tags tell WebWork what to do next after the action has been called. There are a standard set of result codes built-in to WebWork, (in the Action interface) they include: -
-
String SUCCESS = "success";
String NONE    = "none";
String ERROR   = "error";
String INPUT   = "input";
String LOGIN   = "login";
-

You can extend these as you see fit. Most of the time you will have either SUCCESS or ERROR, with SUCCESS moving on to the next page in your application; -

-
<result name="success" type="dispatcher">
    <param name="location">/thank_you.jsp</param>
</result>
-

…and ERROR moving on to an error page, or the preceding page; -
-
<result name="error" type="dispatcher">
    <param name="location">/error.jsp</param>
</result>
-

You can stack as many result tags within a single action tag as you wish.

For further reading on Result types, see WW:Result Types. -

INTERCEPTORS

-Interceptors allow you to define code to be executed before and/or after the execution of an action. Interceptors can be a powerful tool when writing web applications. Some of the most common implementations of an Interceptor might be:

    -
  • Security Checking (ensuring the user is logged in)
  • -
  • Trace Logging (logging every action)
  • -
  • Bottleneck Checking (start a timer before and after every action, to check bottlenecks in your application)
  • -

-You can also group Interceptors together to create "stacks". If you wanted to do a login check, security check, and logging all before an Action call, this could easily be done with an interceptor stack.

For further Reading on Interceptors, see XW:Interceptors
-For further Reading on Xwork configuration files, see XW:Configuration

ACTION CLASSES

-The action classes do what they say, they handle the action. They are called by the actions specified in the xwork.xml file and initiated by the user in the "views". To turn your class into an action class, you simply need to extend the class ActionSupport or implement the Action interface.

Here is what our saveForm action looks like in its Java form (NOTE: If you look in the xwork.xml file above, we've overridden the action to call the processForm method):

-
package com.acme;
import com.opensymphony.xwork.*;

public class FormAction extends ActionSupport {
    
    private FormBean myFormBean = new FormBean();

    public void setFormBean(FormBean inBean) {
        myFormBean = inBean;
    }

    public FormBean getFormBean() {
        return myFormBean;
    }

    public String processForm() {

        FormParameters formParams = this.getFormBean();
        checkBizRules(formParams);
        this.saveParamsToDb(formParams);

        return SUCCESS;
    }
...
}
-

VIEWS

-WebWork supports JSP, Velocity, and FreeMarker for your application presentation layer. For this example, we will use a JSP file. The appropriate presentation layer is denoted by the result type specified. For JSPs, the result type is the name mapped to the com.opensymphony.webwork.dispatcher.ServletDispatcherResult. Typically, this is "dispatcher".

WebWork comes packaged with a tag library (taglibs). You can use these taglibs as components in your JSP file. Here is an section of our form.jsp page: -
-
<%@ taglib prefix="ww" uri="webwork" %>
<html>
<head><title>Webwork Form Example</title></head>
<body>

<ww:form name="'myForm'" action="'saveForm.action'" method="'POST'">
    <table>

    <ww:textfield label="'First Name'" name="'formBean.firstName'" value="formBean.firstName"/>
    <ww:textfield label="'Last Name'" name="'formBean.lastName'" value="formBean.lastName"/>

    </table>
    <input type="submit" value="Save Form"/>
</ww:form>
</body>
-

The process of events will go as follows: -

    -
  1. WebWork will take notice since the URI ends in .action (defined in our web.xml files)
  2. -
  3. WebWork will look up the action saveForm in its action hierarchy and call any Interceptors that we might have defined.
  4. -
  5. WebWork will translate saveForm and decide we would like to call the method processForm in our class com.acme.FormAction as defined in our xwork.xml file.
  6. -
  7. Our method will process successfully and give WebWork the SUCCESS return parameter.
  8. -
  9. WebWork will translate the SUCCESS return parameter into the location thank_you.jsp (as defined in xwork.xml) and redirect us accordingly.
  10. -
-

SUMMARY

-The purpose of this guide is to provide the user with a quick-and-dirty understanding of WebWork2. I hope we successfully briefed you on the three most important components of any WebWork based application, the configuration (including web.xml and xwork.xml), the action classes, and the views. This information should give you a starting point to experiment and become more familiar with the rising star of the open source, Model2, web frameworks.

Miscellaneous Notes

-It is not necessary to map and load the WebWorkVelocityServlet in in the web.xml in order to use Velocity rendered pages. WebWork includes a built-in Velocity result type. Using the result type should be faster than sending the result to the servlet dispatcher which then delegates to the servlet mapping for WebWorkVelocityServlet. -

Originally by:
-Matt Dowell
-matt.dowell@notiva.com
-September 15, 2003

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Radio tag.html b/docs/chinese/wikidocs/Radio tag.html deleted file mode 100644 index 7f01c3949..000000000 --- a/docs/chinese/wikidocs/Radio tag.html +++ /dev/null @@ -1,80 +0,0 @@ - - - WebWork 2 : Radio±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:radio />

Ò»¸öHTMLµ¥Ñ¡°´Å¥UI×é¼þ

±¾ÀýÖÐ, Ò»¸öÊý¾ÝÁÐ±í±»»æÖƳÉÒ»×鵥ѡ°´Å¥. The gender list is built from attribute ¸ù¾ÝÊôÐÔid=genders½¨Á¢ÐÔ±ðÁбí. WebWorkµ÷ÓÃgetGenders()·½·¨, ¸Ã·½·¨·µ»ØÒ»¸öMap.listKeyºÍlistValueÊôÐÔµÄÓ÷¨²Î¼ûselect±êÇ©. -

-
<ww:action name="'GenderMap'" id="genders"/>
<ww:radio label="'Gender'" name="'male'" list="#genders.genders"/>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×Ö¶ÎÖµ
list ·ñ ÁбíʹÓõĿɵü´úÊý¾ÝÔ´
listKey ·ñ Áбí¶ÔÏóµÄ¼üÖµÊôÐÔ
listValue ·ñ Áбí¶ÔÏóµÄÄÚÈÝÊôÐÔ
disabled ·ñ HTMLµÄdisabledÊôÐÔ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Redirect Result.html b/docs/chinese/wikidocs/Redirect Result.html deleted file mode 100644 index db93aaf0f..000000000 --- a/docs/chinese/wikidocs/Redirect Result.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork 2 : Redirect Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

ÖØ¶¨Ïò

֪ͨä¯ÀÀÆ÷ÖØ¶¨Ïòµ½ÁíÒ»¸öλÖÃ(½«´Ó¿Í»§¶Ë·¢³öеÄÇëÇó). ÕâÒâζןղÅÖ´ÐеĻ(»î¶¯ÊµÀý, »î¶¯´íÎó, ×ֶδíÎóµÈ)½«¶ªÊ§²»ÔÙ¿ÉÓÃ. ÕâÊÇÒòΪ»î¶¯»ùÓÚµ¥Ïß³Ìģʽ. ´«µÝ²ÎÊýµÄΨһ°ì·¨ÊÇʹÓÃsession»òʹÓÃOGNL±í´ïʽ×÷Ϊweb²ÎÊý(url?name=value).
- - - - - - - - - -
²ÎÊý ±ØÐè ÃèÊö
location ÊÇ Ö´ÐкóÌø×ªµÄλÖÃ
parse ·ñ ȱʡΪtrue. Èç¹ûÉèΪfalse, location²ÎÊý½«²»×÷ΪOgnl±í´ïʽ½øÐнâÎö
-
-
<result name="success" type="redirect">
    <param name="location">foo.jsp</param>
    <param name="parse">false</param>
</result>
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.1.html b/docs/chinese/wikidocs/Release Notes - 2.1.1.html deleted file mode 100644 index ba1842149..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.1.html +++ /dev/null @@ -1,535 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1.1 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.1 Release Notes

Key Changes

-
    -
  • Improved integration with Sitemesh
      -
    • WebWork taglibs can be used in Sitemesh decorators to access Action properties
    • -
  • -
  • Validator short-circuiting to allow validation to stop on first invalid data
  • -
  • Improved class hierarchy resource bundle searching
  • -
  • File upload support has been rebuilt to allow for multiple files with the same HTTP parameter name. Besides "cos" and "pell" support, "jakarta" support has been added, utilizing the Commons-FileUpload library. Only "jakarta" supports multiple files with the same HTTP parameter name. In future versions "jakarta" may become the default upload library, replacing "pell".
  • -
-

Migration Notes

- - - - - - - - - -
Version Description Old Code New Code
2.1 There is a new validator DTD: xwork-validator-1.0.2.dtd. You aren't required to use this, but you will need to if you wish to use the new short-circuiting validation N/A N/A
2.1 File upload support has been rebuilt, although we don't see any compatibility problems with 2.1. However, many of the methods in MultiPartRequest have become deprecated in favor of new ones. Please switch to these as soon as possible. N/A N/A
-

Changelog

-

WebWork 2.1.1

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (25 issues) -
- T - Key - Summary
- Bug - - WW-648 - - Client-side validation doesn't allow cancelling -
- Improvement - - WW-647 - - Client-side validation: show all validation errors -
- New Feature - - WW-646 - - HTML Editor Component -
- Bug - - WW-635 - - Components and HttpSession persistence/distribution -
- New Feature - - WW-598 - - Add ability to map exceptions to pages (or actions) -
- Bug - - WW-596 - - IllegalArgumentException when setting an indexed property -
- Bug - - WW-591 - - Wrong output when using nesting #bodytags (with a custom tag) -
- Improvement - - WW-589 - - Printer-friendly of all documentatioon -
- Bug - - WW-588 - - Unexpected behaviour of SessionMap.clear() -
- New Feature - - WW-574 - - ActionButton and ActionLink UI tags -
- Bug - - WW-570 - - Table tag parameters and sorting -
- New Feature - - WW-558 - - Exception Handler Interceptor and Exception Action -
- Bug - - WW-557 - - Generator Tag doesn't work properly -
- Improvement - - WW-556 - - Allow ComponentManager scopes to be independant -
- Improvement - - WW-555 - - Disable logging by default -
- New Feature - - WW-540 - - Add a ServletFilter to clean up the ActionContext, allowing Sitemesh decorators to use the ActionContext with the taglib -
- Bug - - WW-536 - - Lost the session on OC4J 9.0.4 using WebWork2 -
- Bug - - WW-533 - - Add support for Velocity 1.4 - Changes WebWork directives -
- Improvement - - WW-528 - - Switch to using VelocityViewServlet from VelocityTools -
- Bug - - WW-527 - - Multiple components with same <class> but different <enabler> throws exception -
- Bug - - WW-520 - - Wrong &amp; management in XML based output (WML and XHTML) -
- Bug - - WW-513 - - IOC Application and Session scopes do not work in Tomcat 5 -
- Improvement - - WW-511 - - Support a list of resource bundles on i18n tag -
- Bug - - WW-507 - - "command" parameter isn't honored for command driven actions -
- New Feature - - WW-506 - - Param tag should try to get parameters from the original request as well -
-

-

Xwork 1.0.2

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (15 issues) -
- T - Key - Summary
- Improvement - - XW-210 - - Make default type conversion message a localized text that can be overidden -
- Bug - - XW-205 - - missing xwork 1.0.2 dtd in jar and website and typo in ValidationInterceptor -
- Improvement - - XW-204 - - TextProvider.getText() should look in child property files -
- Improvement - - XW-203 - - Add "trim" parameter to string validators -
- Bug - - XW-202 - - Integer and Float conversion dont work in CVS HEAD -
- Bug - - XW-200 - - i18n broken when the name of the text to find starts with a property exposed by the action -
- Improvement - - XW-195 - - Add interface XWorkStatics which contains XWork-related constants from WebWorkStatics -
- Improvement - - XW-194 - - Patch to help LocalizedTextUtil deal with messages for indexed fields (collections) -
- Improvement - - XW-193 - - InstantiatingNullHandler and Typeconversion fails -
- Improvement - - XW-192 - - Create a version 1.0.2 of the XWork validation DTD with short circuit -
- Improvement - - XW-191 - - Type conversion improvement. -
- Improvement - - XW-190 - - Provide a xwork-default.xml. -
- Improvement - - XW-189 - - Improve ActionValidationManager's short circuit behaviour -
- Improvement - - XW-179 - - Optimise OgnlUtil.copy method -
- New Feature - - XW-172 - - XWorkBasicConverter doesn't care about the current locale -
-

-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.2.html b/docs/chinese/wikidocs/Release Notes - 2.1.2.html deleted file mode 100644 index f3787f87a..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.2.html +++ /dev/null @@ -1,215 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1.2 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.2 Release Notes

Key Changes

-
    -
  • This version ships with XWork 1.0.3 – we recommend you make sure you are running this version (or later) of XWork.
  • -
  • Minor bug fixes for file upload support with Jakarta
  • -
  • New StreamResult type which allows you to stream content directly back from an action
  • -
  • UI tags may now be written in languages other than Velocity. JSP is supported, though you currently must write your own templates similar to the Velocity templates. Future versions of WebWork will include more languages supported as well as templates shippped out of the box.
  • -
-

Migration Notes

Migration should require nothing more than copying over the new libs. Specifically note that XWork 1.0.3 and WebWork 2.1.2 should be copied over.

Changelog

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (14 issues) -
- T - Key - Summary
- Improvement - - WW-642 - - Allow the 'name' attribute of the TextTag to be evaluated at runtime -
- Bug - - WW-639 - - "Could not open template ", possible a bug -
- Improvement - - WW-634 - - File Upload Interceptor stack -
- Bug - - WW-633 - - Jakarta File Upload fails with mixed content (normal and file) -
- New Feature - - WW-630 - - upload newest webwork files to ibiblio -
- Improvement - - WW-629 - - checkboxlist doesn't have a disabled attribute tag -
- Bug - - WW-628 - - Bug with request parameter handling with WebLogic 8.1sp3 -
- Bug - - WW-624 - - If/Else tag do not render body -
- Bug - - WW-622 - - The changelog for WW2.1.1 shows open issues not the closed ones! -
- Bug - - WW-616 - - ww:label and ww:textarea problem with null values -
- Bug - - WW-612 - - WebworkStatistics.SERVLET_DISPATCHER is spelled incorrectly -
- Bug - - WW-611 - - Error in Freemarker docs -
- New Feature - - WW-602 - - Stream Result Type -
- Task - - WW-485 - - Add docs for WebWork2 tags -
-

-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.3.html b/docs/chinese/wikidocs/Release Notes - 2.1.3.html deleted file mode 100644 index 403e9f029..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.3.html +++ /dev/null @@ -1,67 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1.3 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.3 Release Notes

Key Changes

-WebWork version 2.1.3 resolves a critical problem preventing UI tags from working under certain circumstances. It is recommended that all users use 2.1.3 in place of 2.1.1 or 2.1.2

Changelog

- - - - - - - - - - - - - - -
- OpenSymphony JIRA - (1 issues) -
- T - Key - Summary
- Bug - - WW-659 - - VelocityTemplateEngine broken -
-

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.4.html b/docs/chinese/wikidocs/Release Notes - 2.1.4.html deleted file mode 100644 index 27bb41578..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.4.html +++ /dev/null @@ -1,66 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1.4 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.4 Release Notes

Key Changes

-This release is the first release to include the re-vamped JSP tag support. Specifically, there is an option (off by default) that now lets you use an alternative syntax for JSP tags.

When webwork.tag.altSyntax is set to true in webwork.properties, all attributes in the JSP tags (both UI and non-UI) that evaluate to a String (as opposed to a Boolean, Integer, Collection, or anything else) shall not be evaluated like it normally is.

Rather, the string will be parsed for the pattern "%{...}" and only the text between those braces shall be evaluated. This should make using all the tags, but especially the UI tags, much easier.

The only exception to this rule of parsing String attributes is for the <ww:property/> tag. That is because the usage for <ww:property/> is so commonly used for pulling values from the stack, enforcing the "%{..}" syntax on it would be overly tedious.

Migration Notes

There is nothing to migrate for now. Because this new syntax is optional and turned off by default, you don't need to do anything to migrate as long as you don't plan to use this new syntax. If you DO plan to use this new syntax, you must modify all your tag attributes that previously had the pattern of "'...'" to just be "...". Basically, you must remove single quotes where they once were.

Also, any place where an attribute did not have single quotes, you must check to see if the attribute is expected to be a String attribute. If so, you should replace the pattern of "..." with "%{...}" so that the expression is still being evaluated.

Note that attributes such as disabled, maxlength, etc do not need the new syntax. That is becaus the syntax is only applied to attributes that are expected to be strings. This is very important to remember!

Finally, please note that this release is a preview release for the new syntax. The new syntax will not be finalized and turned on by default until 2.2.0. You are free to use it, but it is not guaranteed to be stable and may change in the coming releases.

Changelog

- - - - - - - - - - - - - - -
- OpenSymphony JIRA - (1 issues) -
- T - Key - Summary
- Improvement - - WW-581 - - JSP Tags should support better syntax -
-

- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.5.html b/docs/chinese/wikidocs/Release Notes - 2.1.5.html deleted file mode 100644 index 8795fab20..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.5.html +++ /dev/null @@ -1,264 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1.5 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.5 Release Notes

Key Changes

-
    -
  • All UI tags now support the complete set of JavaScript event listeners now, such as onChange, onBlur, etc.
  • -
  • ExecuteAndWaitInterceptor is easier to use
  • -
  • Several important bug fixes for Velocity integration
  • -
 

Migration Notes

- - - - - -
Version Description Old Code New Code
2.1.4 and below TLD updated – be sure you are using the latest webwork.tld file N/A N/A

Changelog

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (18 issues) -
- T - Key - Summary
- Improvement - - WW-666 - - ExecAndWaitInterceptor should put executing action on the stack -
- Bug - - WW-663 - - VelocityResult doesn't initialize VelocityManager -
- Improvement - - WW-660 - - xhtml's checkbox.vm vertical alignment -
- Improvement - - WW-658 - - JSP Tags do not support onFocus, onBlur js handlers -
- Bug - - WW-653 - - url taglib does not support 'page' attribute but the webwork-example.war uses it all over the place. -
- Improvement - - WW-651 - - IfTag does not convert to Boolean -
- Bug - - WW-644 - - Xhtml generated by the ui tags is (still) invalid -
- Improvement - - WW-632 - - Onclick for radiotag -
- Bug - - WW-627 - - select.vm requires htmlEncode for name parameter -
- New Feature - - WW-626 - - Principal Interceptor -
- Bug - - WW-614 - - Cannot set velocity macro autoreloading -
- Bug - - WW-554 - - Bad value for IMAGES_URI in JasperReportsResult.java -
- Bug - - WW-526 - - Velocity using include ignores character encoding -
- Bug - - WW-479 - - getValueClassType() in ComboboxTag returns Boolean.class -
- Improvement - - WW-425 - - Refactoring to decouple the UI Tag dependency on velocity -
- Task - - WW-392 - - Update doubleselect tag -
- Bug - - WW-223 - - Multipart & SaveDir -
- Improvement - - WW-161 - - ServletDispatcher could be a lot simpler to extend -
-

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.6.html b/docs/chinese/wikidocs/Release Notes - 2.1.6.html deleted file mode 100644 index c9733be6d..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.6.html +++ /dev/null @@ -1,111 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1.6 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.6 Release Notes

Key Changes

-This release includes a few bug fixes for the URL tag, a new base class to make type conversion easier, and better documentation. It also includes the latest XWork release: version 1.0.4

Changelog

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (5 issues) -
- T - Key - Summary
- Improvement - - WW-673 - - Create a WebWorkTypeConverter for extension -
- Bug - - WW-672 - - URLTag does not reset between invocations -
- Improvement - - WW-671 - - URLTag does not include parameters when value is specified -
- New Feature - - WW-664 - - Document WebFlow -
- Improvement - - WW-585 - - ComboBoxTag should sublass TextFieldTag -
-

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Release Notes - 2.1.html b/docs/chinese/wikidocs/Release Notes - 2.1.html deleted file mode 100644 index cffc3add8..000000000 --- a/docs/chinese/wikidocs/Release Notes - 2.1.html +++ /dev/null @@ -1,360 +0,0 @@ - - - WebWork 2 : Release Notes - 2.1 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Key Changes

    -
  • 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
  • -
  • The label attribute in UI tags are no longer required
  • -
  • The themes and templates in UI tags behave like they did in 1.x
  • -
  • A new theme, in addition to the existing "xhtml" one, called "simple" is included that doesn't have any of the labels, error reporting, or table rows that the "xhtml" template has. This is more in line with the tags included with Struts.
  • -
  • New UI tags for CSS styles and classes added: cssStyle and cssClass
  • -
  • Old action!command URL support works again. This means you can invoke a doCommand() method like in 1.x
  • -
  • 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.
  • -
  • UI tags now have access to the FormTag parameter map using the "form" key. This means $parameters.form.name would return the form name, for example. The result is that complex JavaScript-based components can be built.
  • -
-

Migration Notes

- - - - - - - - - - - - - - - -
Version Description Old Code New Code
2.0 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
2.0 The webwork.ui.templateDir configuration property has been broken into webwork.ui.templateDir and webwork.ui.theme
-
webwork.ui.templateDir= /webwork/mytheme
-
-
webwork.ui.templateDir = /webwork 
webwork.ui.theme = mytheme
-
2.0 "namespace" attribute of the ww:action tag is now evaluated; those upgrading from 2.0 will need to place single quotes around the attribute value <ww:action namespace="/foo" .../> <ww:action namespace="'/foo'" .../>
2.0, but not 1.x 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 <ww:xxxx theme="/template/foo" template="bar.vm"/> <ww:xxxx theme="'foo'" template="'bar.vm'"/>
1.x, 2.0 label UI tag evaluates the value attribute now instead of the name attribute <ww:label name="'Foo'"/> <ww:label value="'Foo'"/>
-

Changelog

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (25 issues) -
- T - Key - Summary
- Improvement - - WW-592 - - Upgrade commons-logging -
- Bug - - WW-560 - - SessionMap holds on to requests when it doens't need to -
- New Feature - - WW-546 - - Make the config-browser show validators applied via the XML validation files -
- Bug - - WW-544 - - Velocity result hardcodes contenttype and encoding -
- Improvement - - WW-541 - - Webpage link for download -
- Bug - - WW-537 - - Velocity tag outputs to the response, not the velocity writer -
- Bug - - WW-530 - - Config Browser doesn't work after lates ActionConfig refactoring -
- Bug - - WW-519 - - ActionTag should evaluate namespace attribute -
- Improvement - - WW-518 - - Label attribute shouldn't be required -
- Bug - - WW-517 - - Themes and templates should behave like 1.x -
- Improvement - - WW-516 - - Simple theme that has no tables and xhtml extends from -
- Bug - - WW-515 - - Class attribute is illegal -
- Bug - - WW-514 - - Form tag double evaluates name attribute -
- Bug - - WW-503 - - Fix tag libraries -
- Bug - - WW-502 - - foo!default.action should work -
- New Feature - - WW-501 - - JavaSript-based client side validation -
- Bug - - WW-500 - - ww:param tag fixes -
- New Feature - - WW-499 - - UI tags should have access to form -
- Task - - WW-488 - - Check QuickStart Guide to make sure it works -
- Bug - - WW-487 - - WebWorkConversionErrorInterceptorTest in wrong branch -
- Bug - - WW-484 - - label tag problems -
- Bug - - WW-478 - - URLTag tld entry does not correspond with actual property -
- Improvement - - WW-476 - - WebWork needs a simple changelog for each release -
- Bug - - WW-475 - - Multipart encoding still not fixed -
- Bug - - WW-474 - - Ability to dynamically create array of Objects from a given request -
-

-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Reloading configuration.html b/docs/chinese/wikidocs/Reloading configuration.html deleted file mode 100644 index 87f9bb046..000000000 --- a/docs/chinese/wikidocs/Reloading configuration.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork 2 : ÖØ¼ÓÔØÅäÖÃÎļþ - - - - - - - - - -
- -
- This page last changed on May 14, 2004 by mgreer. -
- -

WebworkÔÊÐí¶¯Ì¬ÖØÐ¼ÓÔØxmlÅäÖÃÎļþ(ÀýÈç, ÖØÐ¼ÓÔØactions.xml).

ÕâÔÊÐíÄãÔÚ¿ª·¢ÆÚ¼äÖØÐÂÅäÖûӳÉä. Õâ¿ÉÄÜ»á´øÀ´Ò»Ð©ÐÔÄÜËðʧ, Òò´Ë²»ÍƼöÔÚ²úƷģʽÏÂʹÓÃ.

ΪÁ˼¤»î¸ÃÌØÐÔ, ÐèÒªÔÚwebwork.propertiesÖмÓÈë:

-
webwork.configuration.xml.reload=true
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Resources Available to Velocity Views.html b/docs/chinese/wikidocs/Resources Available to Velocity Views.html deleted file mode 100644 index bf4f3eb9f..000000000 --- a/docs/chinese/wikidocs/Resources Available to Velocity Views.html +++ /dev/null @@ -1,97 +0,0 @@ - - - WebWork 2 : Resources Available to Velocity Views - - - - - - - - - -
- -
- This page last changed on Dec 10, 2004 by sutter2k. -
- -

Summary

-Here's the quick summary of the references available to Velocity templates that are kicked-off from WebWork:

    -
  • $actionInstanceVariable
  • -
  • $req - the current HttpServletRequest
  • -
  • $res - the current HttpServletResponse
  • -
  • $stack - the current OgnlValueStack
  • -
  • $ognl - an OgnlTool
  • -
  • $webwork - an instance of WebWorkUtil
  • -
  • $action - the current WebWork action
  • -
  • $taglib (or something like that) - access to the JSP tag library via Velocity macros (!!)
  • -
-

Detail

-
-$actionInstanceVariable
-Each of your action class instance variables (for which you've written a getter method) are available in your Velocity template as $actionInstanceVariableName.

In other words, if you have an instance variable in your Action class: -

-
public class ProcessEditTableRowAction extends ActionSupport {
  private String fooString;
-

And you have a getter method for that string (in that same ActionClass):
- -
-
public String getFooString() { return fooString; }
-

Then in your Velocity template you can retrieve the value of that String by simply refering to: -

-
$fooString
-

Note: For the most part you don't have to worry about lettercase. If your Velocity reference is $fooString (note the lowercase "f" in foo) and your getter method is called getFooString (note uppercase "F" in foo) then WebWork does the "right thing" and uses getFooString() to retrieve the value of $fooString.

But things can get weird is some circumstances. TODO: At least I think they can get weird. At one point, I remember having a problem with the lettercase of Velocity variable names and the corresponding getter methods that was being used to lookup the value. But I can't remember exactly how the problem manifested so can't provide an example. Need to do that.

TODO: I'm curious what takes care of translating the $variableName references to method calls on the Action object's getters. Where does that happen?


-$req
-The current HttpServletRequest created and managed by your Servlet environment (Tomcat, Resin, etc.).


-$res
-The current HttpServletResponse created and managed by your Servlet environment (Tomcat, Resin, etc.).


-$stack
-The OGNL value stack. (API Docs)

TODO: Talk about what's actually on the stack. Doesn't do a whole lot of good to know it's there without knowing what's on it.


-$ognl
-A reference to an OGNL tool. (API Docs)
-(See OGNL Basics)

At the time of this writing, there are no docs for that object, so if you really want to know how it works, be a Jedi and "use the source". (The CVS repository is browsable here: https://webwork.dev.java.net/source/browse/webwork/src/java)


-Tip:
-Jason/Patrick note that one nifty thing you can do with this tool is to call static class methods. That's rather handy since Velocity doesn't offer access to class variables or methods, but only to instantiate objects that have been placed in the Velocity Context. So you can't normally do things like Math.random().

To call a class method, from within Velocity template, using the OGNL tool, you do this:
- -
-
$ognl.findValue("@com.acme.FooClass@FOO")
-

TODO: the original email detailing the above example used $value to refer to the OGNL tool, not $ognl. But the source indicates it's "$ognl" that's shared with the context. Which is right?


-$webwork
-A reference to the VelocityWebWorkUtil class. (API Docs)

At the time of this writing, the API docs for this object are effectively blank, so if you really want to know how it works, be a Jedi and "use the source". (The CVS repository is browsable here: https://webwork.dev.java.net/source/browse/webwork/src/java)


-Tip:
-Mathew notes that the VelocityWebWorkUtil class can instantiate other objects for you. This, too, is very handy since Velocity is normally constrained to only the objects that have been explicitely shared with it's context (and not something you have control over when using Velocity templates kicked off by WebWork).

To instantiate an object from a Velocity page (that's been kicked off by WebWork, of course) do this:

-
#set($object = $webwork.bean("com.foo.ClassName"))
-

This technique can be particularly handy for grabbing a reference to one of the VelocityTools objects. (The VelocityTools are not included with WebWork, you'll need to go grab the lib and put it in your classpath if you want to use $webwork.bean() to grab references to the tool objects.)

(Note: If you're rumaging through the source, the source-code for the $webwork.bean() method above is really in VelocityWebWorkUtil's parent class WebWorkUtil.)


-$action
-A reference to the action context that called this template. TODO: Not really sure what's in there or what it's good for. Should probably note that.


-#tag and #bodytag#

Provides a way of using a JSP taglib from velocity.
-Many, but not all taglibs can be used.

ex: -
-
#tag( Text "name='title.edit'" )
-

-provides a way to uses the <ww:text name="title.edit" /> tag from velocity.

Note the <ww:text /> is probably not that useful from velocity since -

-
$action.getText('title.edit')
-
would perform the same thing.

see UI tags#WW/UI+Tags for more information about webworks tags. Many provide equivalent velocity examples. Usage with other tags could be infered based on examples given.
- - - - - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Result Types.html b/docs/chinese/wikidocs/Result Types.html deleted file mode 100644 index 9e81eff07..000000000 --- a/docs/chinese/wikidocs/Result Types.html +++ /dev/null @@ -1,81 +0,0 @@ - - - WebWork 2 : ½á¹ûÀàÐÍ - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

×ÛÊö

½á¹ûÀàÐÍÊÇһЩÀà, ÓÃÓÚ¾ö¶¨»î¶¯ÖµÖ´ÐÐÍê±Ï²¢·µ»ØÒ»¸ö½á¹ûºóÓ¦¸ÃÖ´ÐÐÄÇЩ¶¯×÷. ¿ª·¢Õß¿ÉÒÔ¸ù¾ÝÓ¦Óûỷ¾³µÄÐèÒª×ÔÓɵĴ´½¨×Ô¼ºµÄ½á¹ûÀàÐÍ. ÔÚWebWork 2ÖÐ, ÀýÈç, ServletºÍVelocity½á¹ûÀàÐÍÒѾ­±àдÍê³ÉÓÃÀ´´¦ÀíÊÓͼ»æÖÆ.

×¢Òâ: ËùÓÐWebWork¸½´øµÄ½á¹ûÀàÐͶ¼ÊµÏÖÁËcom.opensymphony.xwork.Result½Ó¿Ú, ËüÃèÊöÁËËùÓлִÐнá¹ûµÄͨÓýӿÚ, ²»¹ÜÊÇÏÔʾWebÒ³Ãæ, Éú³Éµç×ÓÓʼþ, ·¢ËÍJMSÏûÏ¢, µÈµÈ.

½á¹ûÀàÐͶ¨ÒåÁËÀಢ½«ËüÓ³ÉäΪµ½Ò»¸öÃû×ÖÒÔ±ãÔڻ½á¹ûÅäÖÃÖÐÒýÓÃ. ËüΪÕâЩÀàÌṩÁ˼òдµÄÃûÖµ¶Ô. -
webwork-default.xmlµÄƬ¶Ï
-
...
<result-types>
    <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
    <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
    <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
    <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
    <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
    <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
    <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
    <result-type name="httpheader" class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
    <result-type name="stream" class="com.opensymphony.webwork.dispatcher.StreamResult"/>
</result-types>
...
-

- -
xwork.xmlµÄƬ¶Ï
-
<include file="webwork-default.xml"/>

<package name="myPackage" extends="default">
  <action name="bar" class="myPackage.barAction">
    <!-- default result type is "dispatcher" -->
    <!-- default result name is "success" -->
    <result>foo.jsp</result>
    <result name="error">error.jsp</result>
    </result>
  </action>
</package>
-

Result Types

WebworkÌṩÁËcom.opensymphony.xwork.Result½Ó¿ÚµÄ¼¸¸öʵÏÖʹµÃ»ùÓÚWebµÄÓ¦ÓÃÈÝÒ×Óë»î¶¯Ïà½áºÏ. ÕâЩ½á¹ûÀàÐͰüÀ¨:
- - - - - - - - - - - - - - - - - - - - - - - -
Result Type name class
Dispatcher Result dispatcher com.opensymphony.webwork.dispatcher.ServletDispatcherResult
Redirect Result redirect com.opensymphony.webwork.dispatcher.ServletRedirectResult
Action Chaining Result chain com.opensymphony.xwork.ActionChainResult
Velocity Result velocity com.opensymphony.webwork.dispatcher.VelocityResult
FreeMarker Result freemarker com.opensymphony.webwork.views.freemarker.FreemarkerResult
JasperReports Result jasper com.opensymphony.webwork.views.jasperreports.JasperReportsResult
XSL Result xslt com.opensymphony.webwork.views.xslt.XSLTResult
HttpHeader Result header com.opensymphony.webwork.dispatcher.HttpHeaderResult
Stream Result stream com.opensymphony.webwork.dispatcher.StreamResult

-½á¹ûÔÚxwork.xmlÖÐÖ¸¶¨²¢Ç¶Ì×ÔÚ<action>ÖÐ. Èç¹ûÄãÖ»ÐèÒªÖ¸¶¨"location"ÊôÐÔ, ¿ÉÒÔʹÓüòдÐÎʽ:
- -
-
<action name="bar" class="myPackage.barAction">
  <result name="success" type="dispatcher">
    <param name="location">foo.jsp</param>
  </result>
</action>
-

»ò¼òдΪ

-
<action name="bar" class="myPackage.barAction">
  <result name="success" type="dispatcher">foo.jsp</result>
</action>
-

Èç¹ûÄãÀ©Õ¹ÁËwebwork-default.xml, ÄÇôȱʡ½á¹ûÀàÐÍÊÇ"dispatcher". Èç¹ûÄã²»Ö¸¶¨½á¹ûÃû×Ö, Ëü½«±»Ö¸¶¨Îª"success". ÕâÒâζ×ÅÄã¸öÒ»½øÒ»²½¼òд

-
<action name="bar" class="myPackage.barAction">
  <result>foo.jsp</result>
</action>
-

×¢Òâ: locationÔªËØ½«×÷Ϊ±í´ïʽ½øÐнâÎö. ÏÂÃæµÄÀý×Ó˵Ã÷ÁËÕâÑù×öµÄºÃ´¦: -

-
<result name="success" type="redirect">/displayCart.action?userId=${userId}</result>
-

×¢Òâ: ÄãÒ²¿ÉÒÔΪ¶à¸ö»î¶¯Ö¸¶¨È«¾Ö½á¹û. µ±ÄãΪ¶à¸ö²»Í¬»î¶¯ÉèÖÃÏàͬµÄÊôÐÔʱ, ÕâÄܽÚʡһЩʱ¼ä. ¹ØÓÚ½á¹ûºÍÈ«¾Ö½á¹ûµÄ¸ü¶àÐÅÏ¢, ²Î¼û½á¹ûÒ»½Ú.
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Results.html b/docs/chinese/wikidocs/Results.html deleted file mode 100644 index f6a6d87b1..000000000 --- a/docs/chinese/wikidocs/Results.html +++ /dev/null @@ -1,60 +0,0 @@ - - - WebWork 2 : ½á¹û - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

×ÛÊö

½á¹ûÊǻ·µ»ØµÄ×Ö·û´®³£Á¿, ±íÊö»î¶¯µÄÖ´ÐÐÇé¿ö. WebWorkȱʡ¶¨ÒåÁËÒ»¸ö±ê×¼½á¹û¼¯: error, input, login, none and success. µ±È», ¿ª·¢×Å¿ÉÒÔÖ»Óе͍Òå×Ô¼ºµÄ½á¹ûÒÔ±íÊöÆäËûÓ¦ÓÃ״̬. ½á¹ûʹÓÃÃûÖµ¶ÔµÄ½á¹¹Ó³Éäµ½½á¹ûÀàÐÍ. - -

ResultÔªËØ

-
String SUCCESS = "success";
String NONE    = "none";
String ERROR   = "error";
String INPUT   = "input";
String LOGIN   = "login";
-

Äã¿ÉÒÔÀ©³äÄãÈÏΪÊʺϵĽá¹û´úÂë(Èç"missing-data"). ´ó¶àÊýÇé¿öÏÂÄãÖ»ÐèʹÓÃSUCCESSºÍERROR, SUCCESS½«Ç°½øµ½ÏÂÒ»¸öÒ³Ãæ; -
-
<result name="success" type="dispatcher">
    <param name="location">/thank_you.jsp</param>
</result>
-

ERROR½«Ç°½øµ½´íÎóÒ³Ãæ, »òǰһ¸öÒ³Ãæ; -

-
<result name="error" type="dispatcher">
    <param name="location">/error.jsp</param>
</result>
-

½á¹ûÔÚxwork.xmlÖÐÖ¸¶¨²¢Ç¶Ì×ÔÚ<action>ÖÐ. Èç¹ûÄãÖ»ÐèÒªÖ¸¶¨"location"ÊôÐÔ, ¿ÉÒÔʹÓüòдÐÎʽ:
- -
-
<action name="bar" class="myPackage.barAction">
  <result name="success" type="dispatcher">
    <param name="location">foo.jsp</param>
  </result>
</action>
-

-»ò¸ü¼òµ¥ -
-
<action name="bar" class="myPackage.barAction">
  <result name="success" type="dispatcher">foo.jsp</result>
</action>
-

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Select tag.html b/docs/chinese/wikidocs/Select tag.html deleted file mode 100644 index abcb13017..000000000 --- a/docs/chinese/wikidocs/Select tag.html +++ /dev/null @@ -1,95 +0,0 @@ - - - WebWork 2 : Select±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:select />

Éú³ÉÒ»¸öSELECTÑ¡ÏîÁбí. quot;listKey"ÊôÐÔÊÇÁбíÖÐÿ¸öÔªËØµÄÓÃÓÚÉú³É<option>±êÇ©ÖÐvalueµÄÊôÐÔ. "listValue"ÊôÐÔÌî³äoptionµÄÎı¾±êÇ©(ÏÔʾÃû³Æ). Ò»´óÌØÐÔÊǸù¾Ý"value"ÊôÐÔ×Ô¶¯Ñ¡ÖÐÊʵ±µÄÑ¡Ïî. Èç¹ûvalueÓÚµ±Ç°listKeyÏàµÈ, ¸ÃÑ¡ÏîÉèΪselected(Èç¹ûÀàÐÍ·ûºÏµÄ»°; ¼ûÏÂÎÄ).
- -
-
<ww:select label="'Users'" 
	name="'userId'" 
	listKey="id" 
	listValue="name" 
	list="app.users" 
	value="app.user.id" 
	onchange="'chooseUser(this)'"
/>
-

½«Éú³ÉÏÂÁнá¹û(¼ÙÉègetApp().getUser().getId() == 2): -

-
<tr>
	<td>Users</td>
	<td>
		<select name="userId" onchange="chooseUser(this)">
			<option value="1">
				User Number One
			</option>
			<option value="2" selected="selected">
				User Number Two
			</option>
		</select>
	<td>
</tr>
-

µ±È», <td>µÈ¸ñʽÒÀÀµÓÚÄãʹÓõÄÄ£°æ.

Ó÷¨Ê¾Àý -

-
<ww:select label="'Pets'" 
        name="'petIds'" 
        list="petDao.pets" 
        listKey="id" 
        listValue="name" 
        multiple="true" 
        size="3" 
        required="true" 
/>

<ww:select label="'Months'" 
        name="'months'" 
        list="#{'01':'Jan', '02':'Feb', [...]}" 
        value="selectedMonth"
        required="true" 
/>

// The month id (01, 02, ...) returned by the getSelectedMonth() call 
// against the stack will be auto-selected
-

×¢Òâ: ¶ÔÓÚÈκÎʹÓÃÁбíÊý¾ÝµÄ±êÇ©(select¿ÉÄÜÊÇ×î³£¼ûµÄ), ËüʹÓÃOGNLµÄÁбí±íʾ·¨(²Î¼ûÉÏÃæµÄÀý×Ó"months"), ×¢ÒâµÄÊÇ, ÕâÀï¼üÖµ(ÔÚmonthsÀý×ÓÖÐÊÇ'01', '02'µÈµÈ)ÊÇÊÖ¹¤ÊäÈëµÄ. '1'ÊÇ×Ö·û, '01'ÊÇ×Ö·û´®, "1"ÊÇ×Ö·û´®. Èç¹û"value"ÊôÐÔ·µ»ØµÄÖµºÍ"Áбí"ÖеļüÖµÀàÐͲ»Í¬Ê±, ¼´Ê¹×Ö·û´®ÖµÏàͬ, Ò²ÎÞ·¨Æ¥Åä. Èç¹ûÎÞ·¨Æ¥Åä, ÁбíÖн«Ã»ÓÐ×Ô¶¯Ñ¡ÖеÄÑ¡Ïî.

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×Ö¶ÎÖµ
list ·ñ ÁбíʹÓõĿɵü´úÊý¾ÝÔ´, Èç¹ûÁÒ±íÊÇMap (key, value), key½«×÷ΪoptionµÄvalue, value×÷ΪËüµÄÄÚÈÝ(body)
listKey ·ñ Áбí¶ÔÏóµÄ¼üÖµÊôÐÔ
listValue ·ñ Áбí¶ÔÏóµÄÄÚÈÝÊôÐÔ
headerKey ·ñ µÚÒ»¸öÑ¡ÏîµÄ½¨Öµ
headerValue ·ñ µÚÒ»¸öÑ¡ÏîµÄÖµ
emptyOption ·ñ ÊÇ·ñÔÚÑ¡ÏîÍ·(header option)ºó¼ÓÈë¿Õ°×(--)Ñ¡Ïî
multiple ·ñ ÊÇ·ñÔÊÐí¶àÑ¡?
size ·ñ HTMLµÄsizeÊôÐÔ
disabled ·ñ HTMLµÄdisabledÊôÐÔ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Simple validators.html b/docs/chinese/wikidocs/Simple validators.html deleted file mode 100644 index eefaa4966..000000000 --- a/docs/chinese/wikidocs/Simple validators.html +++ /dev/null @@ -1,87 +0,0 @@ - - - WebWork 2 : ¼òµ¥Ð£ÑéÆ÷ - - - - - - - - - -
- -
- This page last changed on Jul 10, 2004 by unkyaku. -
- -

ÏÂÁÐУÑéÆ÷°üº¬ÔÚȱʡµÄvalidators.xmlÖÐ:
- - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû³ÆÊ¹ÓÃJavaScriptÃèÊö
#required ×ֶαØÐëÓÐÖµ(·Ç¿Õ)
#requiredstringx×Ö¶ÎÖµ±ØÐë·Ç¿ÕÇÒ³¤¶È > 0
#intx×Ö¶ÎÖµ±ØÐëÊÇÕûÊý²¢ÔÚÒ»¶¨·¶Î§ÄÚ
#date ×Ö¶ÎÖµ±ØÐëÊÇÈÕÆÚ(ÈÕÆÚ¸ñʽÒÀÀµÓÚÇøÓòÉèÖÃ)²¢ÔÚÒ»¶¨·¶Î§ÄÚ
#expression ¸ø¶¨Ò»¸öOGNL±í´ïʹ²¢Ê¹ÓÃÖµÕ»½øÐÐÔËËã, ·µ»ØÖµ±ØÐëÊÇtrue. ¿ÉÓÃÓÚ¿ç×Ö¶ÎУÑé. ´íÎó½«×÷Ϊ»î¶¯´íÎó
#fieldexpression ¸ø¶¨Ò»¸öOGNL±í´ïʹ²¢Ê¹ÓÃÖµÕ»½øÐÐÔËËã, ·µ»ØÖµ±ØÐëÊÇtrue. ÀàËÆÓÚexpressionµ«´íÎó½«×÷Ϊ×ֶδíÎó
#emailx×Ö¶ÎÖµ±ØÐëÊǺϷ¨µÄµç×ÓÓʼþµØÖ·
#urlx×Ö¶ÎÖµ±ØÐëÊǺϷ¨µÄURL
visitor ÔÊÐí½«Ð£Ñé×ªÒÆ¸ø»î¶¯µÄÊôÐÔ²¢Ê¹ÓÃËü×Ô¼ºµÄУÑéÎļþ
conversion °ÑActionContextÖеÄÀàÐÍת»»´íÎó×÷Ϊ»î¶¯µÄ×ֶδíÎó. ÓëWebWorkConversionErrorInterceptorµÄ¹¦ÄÜÏàͬ

-×¢Òâ: Èç¹ûÄãʹÓÃ×Ô¼ºµÄvalidators.xmlÎļþ, ÉÏÊöÃû×Ö¿ÉÒÔÐÞ¸Ä.

required

SimpleAction-validation.xml:
- -
-
<validators>
    <field name="bar">
        <field-validator type="required">
            <message>You must enter a value for bar.</message>
        </field-validator>
    </field>
</validators>
-

#top

requiredstring

LoginAction-validation.xml:

-
<validators>
    <field name="userName">
        <field-validator type="requiredstring">
            <message>You must enter an username.</message>
        </field-validator>
    </field>
</validators>
-

The error is shown if request parameter userName is missing or an empty string

#top

int

-
<validators>
    <field name="foo">
        <field-validator type="int">
            <param name="min">0</param>
            <param name="max">100</param>
            <message key="foo.range">Could not find foo.range!</message>
        </field-validator>
    </field>
</validators>
-

#top

date

- -
-
<validators>
    <field name="startDate">
        <field-validator type="date">
            <param name="min">12/22/2002</param>
            <param name="max">12/25/2002</param>
            <message>The date must be between 12-22-2002 and 12-25-2002.</message>
        </field-validator>
    </field>
</validators>
-

#top

expression

- -
-
<validators>
    <validator type="expression">
        <param name="expression">foo > bar</param>
        <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>
    </validator>
</validators>
-

УÑéÆ÷²»½ö¼ì²éÒ»¸ö×Ö¶Î. Èç¹û±í´ïʽÖаüº¬xml×Ö·û, ¿ÉÒÔʹÓÃCDATA.

#top

fieldexpression

-
<validators>
     <field name="productCode">
        <field-validator type="fieldexpression">
            <param name="expression">name.length() == 5</param>
            <message>Product code must be 5 characters, it is currently '${productCode}'</message>
        </field-validator>
    </field>
</validators>
-

#top

email

- -
-
<validators>
    <field name="email">
        <field-validator type="email">
            <message>You must enter a valid email address.</message>
        </field-validator>
    </field>
</validators>
-

address±ØÐë·ûºÏ¸ñʽxxx@yyy.com|net|gov|org|edu|info|mil|biz|tv|…

#top

url

-
<validators>
     <field name="companyUrl">
        <field-validator type="url">
            <message>You must enter a valid URL.</message>            
        </field-validator>
    </field>
</validators>
-

#top

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Sitemesh.html b/docs/chinese/wikidocs/Sitemesh.html deleted file mode 100644 index 5c1409f71..000000000 --- a/docs/chinese/wikidocs/Sitemesh.html +++ /dev/null @@ -1,42 +0,0 @@ - - - WebWork 2 : SiteMesh - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

SiteMeshµÄÍøÖ·ÊÇhttp://www.opensymphony.com/sitemesh

¼¯³ÉWebWorkºÍSiteMeshÊ®·Ö¼òµ¥:ʵ¼ÊÉÏÄã²»ÐèÒª×öÈκÎÊÂ. WebWork½«È«²¿ÖµÕ»ÐÅÏ¢±£´æÔÚrequestÊôÐÔÖÐ, ÕâÒâζ×ÅÄãÐèÒªÏÔʾµÄÊý¾ÝÔÚÕ»ÖÐ(»òÔÚActionContextÖÐ), ¿ÉÒÔÖ±½ÓʹÓÃWebWorkµÄ±êÇ©¿â. ¾ÍÕâô¼òµ¥!

´«µÝÊý¾Ý

ÐèҪעÒâµÄÊÇ, Èç¹ûÄãÏëʹÓÃ<ww:set>±êÇ©´Ó±»ÐÞÊÎÒ³ÃæÏòÐÞÊÎÆ÷´«µÝÊý¾Ý, ¶ø±»ÐÞÊÎÒ³ÃæÊDZ»Ö±½Óµ÷ÓõÄ(²»ÊǻµÄ½á¹û), ÕâʱÄãÐèÒªÖ¸¶¨·¶Î§(request, session, application). ȱʡÇé¿öÏÂÈç¹ûûÓÐÖ´ÐлҲûÓÐÖ¸¶¨·¶Î§, ÉèÖõÄÖµ½öÔÚͬһ¸öPageContextÖпÉÓÃ.

µØ·½»¯

WebWork 2.1.7ÖÐ, ÔÚÐÞÊÎÆ÷ÖÐʹÓÃi18n¸üÈÝÒ×. ʹÓÃ<ww:text/>±êÇ©²¢²»ºÏÊÊ. µ±ÄãÐèҪʹÓÃi18n×Ö·û´®Ê±, ʹÓÃText±êÇ©µÄidÊôÐÔ.

ÏÂÃæÊÇÕâÖÖÇé¿öµÄÀý×Ó. Ò»°ãÇé¿öÏÂÔÚ±íµ¥ÔªËØÖÐǶÈëi18nʹÓÃÏÂÁдúÂë:

-
<ww:textfield label="getText('com.acme.login.text')" name="'login'"/>
-

µ«ÓÉÓÚWebWorkºÍSiteMeshµÄ¹¤×÷·½Ê½, ÄãÐèÒª°ÑÉÏÃæµÄ´úÂë·Ö³ÉÁ½¸ö±êÇ©.

-
<ww:text id="login" name="'com.acme.login.text'"/>
<ww:textfield label="#login" name="'login'"/>
-

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Spring.html b/docs/chinese/wikidocs/Spring.html deleted file mode 100644 index 9cf76241b..000000000 --- a/docs/chinese/wikidocs/Spring.html +++ /dev/null @@ -1,53 +0,0 @@ - - - WebWork 2 : Spring - - - - - - - - - -
- -
- This page last changed on Nov 03, 2004 by matthew. -
- -

What is Spring and Why do you want to use it with WebWork?

-Check out http://www.springframework.org for more details about Spring. To summarize, Spring provides several different layers. Spring's IoC container, for instance, provides a nice transparent way to wire together objects with their dependencies, such as services they use. It can also, with the help of its AOP framework, provide transactional behavior to plain Java beans. Spring also provides an MVC framework, which is what could be compared to WebWork. There are those who believe WebWork is a better MVC framework, and so would choose WebWork for this part and integrate the rest of the Spring stack. -
-There are a number of ways to integrate Spring into WebWork.

Use SpringObjectFactory

The xwork-optional package from dev.java.net contains a module xwork-spring that contains all the necessary code to use Spring in WebWork. It contains primarily a SpringObjectFactory to wire up the dependencies for an Action before passing it to WebWork. Each action should be configured within a Spring application context as a prototype (because WebWork assumes a new instance of a class for every action invocation). Specify something like this in applicationContext.xml: -

-
<bean name="some-action" class="fully.qualified.class.name" singleton="false">
    <property name="someProperty"><ref bean="someOtherBean"/></property>
</bean>
-

and in xwork.xml: -
-
<action name="myAction" class="some-action">
    <result name="success">view.jsp</result>
</action>
-

Notice that the WebWork Action's class name some-action is the bean name defined in the Spring application context.

Another advantage of the SpringObjectFactory approach is that it can also be used to load interceptors using the same sort of logic. If the interceptor is stateless, then it's possible to create the interceptor as a singelton instance, but otherwise it's best to create it as a Spring prototype. -
-In order to be used, the default ObjectFactory that WebWork uses should be replaced with an instance of the SpringObjectFactory. There are two different ways to accomplish this. The first method is to use the ContextListener in the xwork-optional package. This method assumes that the Spring application context has already been configured. Add the following to web.xml: -
-
<!-- This needs to be after Spring ContextLoaderListener -->
<listener>
  <listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class>
</listener>
-

Note: this is actually a XWork configuration but for simplicity, I just assume WebWork.

The second method is to call the initObjectFactory method on com.opensymphony.xwork.spring.SpringObjectFactory. The easiest way to do this is to have Spring's application configure and supply the aforementioned method as the "init-method". Add the following to your applicationContext.xml: -
-
<bean id="spring-object-factory" class="com.opensymphony.xwork.spring.SpringObjectFactory" init-method="initObjectFactory"/>
-

Note: The second option should work when only using Xwork (as compared to XW and WW2).

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Stream Result.html b/docs/chinese/wikidocs/Stream Result.html deleted file mode 100644 index e10667da1..000000000 --- a/docs/chinese/wikidocs/Stream Result.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork 2 : Stream Result - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Stream

-Ö±½ÓÏòHttpServletResponse·¢ËÍ(ͨ¹ýInputStream)ԭʼ(raw)Êý¾ÝÁ÷. Óû§ÏÂÔØÕýÎÄʱ·Ç³£ÓÐÓÃ.

- - - - - - - - - - - -
²ÎÊý ±ØÐè ȱʡֵ ÃèÊö
inputName ·ñ inputStream »î¶¯ÖÐÀàÐÍΪInputStreamµÄÊôÐÔµÄÃû×Ö(ÈçgetInputStream())
contentType ·ñ text/plain ·µ»ØµÄÕýÎÄÀàÐÍ
contentDisposition ·ñ inline ÏìÓ¦µÄÍ·ÐÅÏ¢Content-dispositionµÄÖµ. µäÐ͵ÄÖµÊÇfilename="doc.pdf"
bufferSize ·ñ 1024 »º³å´óС(×Ö½ÚÊý)

Example: -

-
<result name="success" type="stream">
    <param name="inputName">inputStream</param>
    <param name="contentType">${contentType}</param>
    <param name="contentDisposition">filename="${filename}"</param>
    <param name="bufferSize">2024</param>
</result>
-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Submit tag.html b/docs/chinese/wikidocs/Submit tag.html deleted file mode 100644 index d47c65214..000000000 --- a/docs/chinese/wikidocs/Submit tag.html +++ /dev/null @@ -1,67 +0,0 @@ - - - WebWork 2 : Submit±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:submit />

Ìá½»°´Å¥.

Ó÷¨Ê¾Àý -

-
<ww:submit value="'Submit'"/>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ Îı¾Öµ
align ·ñ HTMLµÄalignÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Tabbedpane tag.html b/docs/chinese/wikidocs/Tabbedpane tag.html deleted file mode 100644 index c9d95b7be..000000000 --- a/docs/chinese/wikidocs/Tabbedpane tag.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork 2 : Tabbedpane±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:tabbedpane />

Ñ¡ÏÔÊÐíÇл»ÏÔʾ²»Í¬µÄÊÓͼ. µ±Óû§µã»÷Ò»¸öÑ¡Ïîʱ, Ëü±ä³Éµ±Ç°ÊÓͼ²¢±»»æÖƳöÀ´. Ñ¡Ïһ°ãÊÇÒ»¸ö±í¸ñ, µ×²¿°üº¬Ò»¸öÑ¡ÏîÒ³Ãæ.

±¾ÀýÖÐ, Ñ¡ÏµÄÑ¡ÏîÏòÓÒ¶ÔÆë. ¸üÈ«ÃæµÄÁ˽âÇë²é¿´WebWorkµÄÀý×Ó. -

-
<p><ww:tabbedpane id="tp1" contentName="'tabs1'" tabAlign="'RIGHT'"/></p>
-

ÊôÐÔ - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
contentName ÊÇ ???
tabAlign ·ñ Ñ¡Ïîˮƽ¶ÔÆë·½Ê½: RIGHT,LEFT,CENTER
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Table tag.html b/docs/chinese/wikidocs/Table tag.html deleted file mode 100644 index 6fddb4be6..000000000 --- a/docs/chinese/wikidocs/Table tag.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork 2 : Table±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:table />

ÏÔʾHTML±í¸ñ.

Ó÷¨Ê¾Àý -

-
<ww:table modelName="'/result'" sortable="true" sortColumn="0" sortOrder="ASC">
  <ww:param name="'columnHidden(1)'" value="true"/>
  <ww:param name="'columnDisplayName(2)'" value="'New Display Name'"/>
  <ww:param name="'columnRenderer(0)'" value="#dateRenderer"/>
  <ww:param name="'columnRenderer(2)'" value="#linkRenderer"/>
  <ww:param name="'columnRenderer(4)'" value="#intRenderer"/>
</ww:table>
-

ÊôÐÔ - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
Ö÷Ìâ ·ñ ʹÓõÄÖ÷Ìâ
modelName ÊÇ ???
sortable ·ñ ±í¸ñÁÐÊÇ·ñÐèÒªÅÅÐò
sortColumn ·ñ ³õʼÅÉÐòÁеÄÐòºÅ
sortOrder ·ñ ÅÅÁÐ˳Ðò(ASC,DESC,NONE)
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Tabular inputs with XWorkList.html b/docs/chinese/wikidocs/Tabular inputs with XWorkList.html deleted file mode 100644 index 024610749..000000000 --- a/docs/chinese/wikidocs/Tabular inputs with XWorkList.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork 2 : Tabular inputs with XWorkList - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Sometimes you need a way to enter tabular data such as list of quantity for products in a shopping cart, marks from a list of examination candiates, etc. If you just have one input value per line item, you can use a HashMap to store the value. This can be expanded to support multiple input values by having multiple HashMap. This describes a number of alternatives using some of more advanced features of WebWork. Assume you want to capture the quantity and a gift note for a list of products in a shopping cart (i.e Amazon).

1. When the number of line items is known

the cart.vm file

-
#foreach ( $item in $cart.items )
  #set($index = $velocityCount - 1)
  <input type="hidden" name="cart.items[$index].productId" value="$item.productId">
  <input type="text" name="cart.items[$index].qty" value="$item.qty">
  <input type="text" name="cart.items[$index].note" value="$item.note">
#end
-

the UpdateCartAction.class

-
public class UpdateCartAction extends ActionSupport {

	public Cart getCart() {
		return ActionContext.getContext().getSession("cart.key");
	}

	public String execute() throws Exception {
		Cart cart = getCart();

		// loop through a
	}
}
-

the Cart.class

-
public class Cart implements Serializable {
  private List items = new ArrayList();

  public List getItems() {
    return items;
  } 

  public void addItem(CartItem item) {
      ...
  }
}
-

the CartItem.class

-
public class CartItem implements Serializable {
  private int qty;
  private int productId;
  private String note;

  // getters/setters...
}
-
-

Explanation

The resulting vm file is rendered as
- -
-
<input type="hidden" name="cart.items[0].qty.productId" value="1">
<input type="text" name="cart.items[0].qty" value="2">
<input type="text" name="cart.items[0].note" value="This is a fun book!">

<input type="hidden" name="cart.items[1].qty.productId" value="2">
<input type="text" name="cart.items[1].qty" value="2">
<input type="text" name="cart.items[1].note" value="You love this one">

<input type="hidden" name="cart.items[2].qty.productId" value="3">
<input type="text" name="cart.items[2].qty" value="$item.qty">
<input type="text" name="cart.items[2].note" value="">
-

Webwork will populate all the entries in Cart with the correct values.

2. When the number of line items is unknown

For example, you want to allow the user to enter any number of ISBN, quanty and a note. You can replace ArrayList with XWorkList, which will automatically create new items if the index is greater than the size of the list.

3. Use Type Conversion

If you want more advanced way to do this, check out XW:Null Property Access for type conversion.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Templates.html b/docs/chinese/wikidocs/Templates.html deleted file mode 100644 index 6aba13cf9..000000000 --- a/docs/chinese/wikidocs/Templates.html +++ /dev/null @@ -1,171 +0,0 @@ - - - WebWork 2 : Ä£°æ - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

×ÛÊö

ÔÚWebWorkÖÐ, UI±êÇ©°ü×°Á˳£ÓõÄHTML¿Ø¼þÒÔ±ãÓëºËÐÄ¿ò¼Ü½ôÃܼ¯³É. ÕâЩ±êÇ©Éè¼ÆÎª×îС»¯Âß¼­´úÂë²¢½«×îÖÕHTML»æÖƹ¤×÷ת½»¸øÄ£°æÏµÍ³. Ä£°æ¿ÉÒÔ×éÖ¯ÆðÀ´·Ö³É²»Í¬µÄÖ÷Ìâ. UI±êÇ©ÊÔͼ¸²¸Ç×î³£¼ûµÄÇé¾°, »¹ÌṩÁËcomponent±êÇ©ÓÃÒÔ´´½¨¶¨ÖÆ×é¼þ. UI±êÇ©ÄÚ²¿Ö§³ÖÏÔʾ´íÎóÐÅÏ¢. -

Ä£°æ

WebWorkʹÓÃVelocityÄ£°æÏµÍ³ÎªËùÓÐUI±êÇ©(jspºÍvelocity)»æÖÆ×îÖÕµÄHTMLÊä³ö. È«²¿Ä£°æµÄȱʡʵÏÖ°üº¬ÔÚºËÐÄ·¢²¼°üÖÐÔÊÐíÓû§Ö±½ÓʹÓÃWebWorkµÄUI±êÇ©. Ä£°æ¿ÉÒÔµ¥¶À±à¼­Ò²¿ÉÒÔÈ«²¿Ìæ»», ÕâÔÊÐí¶¨ÖÆÈ«²¿HTMLÊä³ö½á¹û. ÁíÍâ, ȱʡģ°æ¿ÉÒÔÔںܾ«Ï¸µÄ¿ØÖƼ¶±ð϶Ôÿ¸ö±êÇ©½øÐи²¸Ç.

Ä£°æ´æ·ÅÔÚ·¢Ðаüwebwork-x.x.jarµÄsrc/javaĿ¼ÏµÄtemplateĿ¼ÖÐ. ҪʹÓö¨ÖÆÄ£°æ, ¿ÉÒÔ½«templateĿ¼¸´ÖƵ½Ó¦ÓõĸùĿ¼»òÀà·¾¶ÖÐ. WebworkÊ×ÏÈ´ÓÉÏÊöÁ½¸öµØ·½¼ÓÔØÄ£°æ. ·ñÔò, ½«´Ówebwork.jarÖмÓÔØ. -
-
/myApp
      /META-INF
      /WEB-INF
      /template
-

ÔÚtemplateĿ¼ÖÐ, ¿ÉÒÔÕÒµ½Á½¸ö³Æ×÷Ö÷ÌâµÄÄ£°æ¼¯ºÏ(xhtmlºÍsimple). UI±êǩȱʡʹÓõÄÄ£°æÊÇ'xhtml', ³ý·ÇÔÚUI±êÇ©ÖÐÖ¸¶¨themeÊôÐÔ»òÔÚwebwork.propertiesÖÐÖ¸¶¨webwork.ui.theme. Äã¿ÉÒÔÐÞ¸ÄÒÑÓÐÄ£°æ»ò´´½¨×Ô¼ºµÄÄ£°æ.

ÀàAbstractUIÊÇÆäËûUI±êÇ©µÄ»ùÀà. ËüÌṩһ×éUI×é¼þ³£ÓõÄÊôÐÔ. ÀàAbstractUI¶¨ÒåÁËÒ»¸ö³éÏó·½·¨:
- -
-
protected abstract String getTemplateName();
-

ÀàAbstractUI½«¼ÓÔØ×ÓÀàÖ¸¶¨µÄ»òÓû§Ê¹ÓÃtemplateÊôÐÔÖ¸¶¨µÄÄ£°æ. ÏÂÁдúÂëÖÐtextfield±êÇ©½«Ê¹ÓÃmyOwnTextTemplate.vm¶ø²»ÊÇÄÚ½¨Ä£°ætext.vm

×¢Òâ: Äã±ØÐë´´½¨Ò»¸öÄ£°æÎļþmyOwnTextTemplate.vm²¢°ÑËü±£´æÔÚxhtmlĿ¼ÖÐ. -
-
<!-- loads /template/xhtml/myOwnTextTemplate.vm -->

<ww:ui textfield label="'mylabel'" name="'myname'" template="'myOwnTextTemplate.vm'" />
-

-·ñÔò -
-
<!-- loads default /template/xhtml/text.vm -->
<ww:ui textfield label="'mylabel'" name="'myname'" />
-

ÄÚ½¨Ä£°æ

ÿ¸öUI±êÇ©µÄȱʡģ°æÈçÏÂ: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
UI±êÇ© ȱʡģ°æ
checkboxList checkboxlist.vm
checkbox checbox.vm
combobox combobox.vm
component empty.vm
doubleSelect doubleselect.vm
file file.vm
form form.vm(to open)
-form-close.vm(to close)
hidden hidden.vm
label label.vm
password password.vm
radio radiomap.vm
select select.vm
submit submit.vm
tabbedpane tabbedpane.vm
textarea textarea.vm
textfield text.vm
token token.vm
-

·ÃÎʱäÁ¿

WebWorkʹÓÃÏÂÁÐÉÏÏÂÎıäÁ¿´´½¨VelocityContext¶ÔÏóÓÃÓÚÈ«²¿velocityÊÓͼ:

    -
  • tag - ±êÇ©¶ÔÏó
  • -
  • stack - µ±Ç°µÄOgnlValueStack
  • -
  • ognl - ¹¤¾ßÀàOgnlTool
  • -
  • req - HttpServletRequest¶ÔÏó
  • -
  • res - HttpServletResponse¶ÔÏó
  • -
  • webwork - WebWorkUtilʵÀý
  • -
  • action - µ±Ç°»î¶¯
  • -
  • parameters - µ±Ç°²ÎÊý±í
  • -

-ÔÚÄ£°æÖпÉÒÔʹÓÃ$TAG_NAME·ÃÎÊÉÏÊö±äÁ¿(TAG_NAME¿ÉÒÔÊÇtag, stack, ognl, reqÖеÄÒ»¸ö). Ä£°æÎļþËæºó½éÉÜ. һЩÀý×Ó:
-×¢Òâ: ¸Ð̾ºÅ(!)½«Êä³ö¶¨ÒåµÄÖµ, ·ñÔòÊä³ö"" -
-
$!req.requestURI
$!req.method
-

- -
-
$!tag.templateDir
$!tag.theme
-

- -
-
$!parameters.name
$!parameters
-

Àí½âWebworkÄ£°æÏµÍ³

¿´¿´Ä£°æÊÇÈçºÎ±»ÕÒµ½²¢¼ÓÔØµÄ. AbstractUITagչʾÁËʹÓÃ×Ö·û´®¹¹½¨Ä£°æµÄ·½·¨: -
-
protected String buildTemplateName(String myTemplate, String myDefaultTemplate) {
        ...
        return "/" + getTemplateDir() + "/" + getTheme() + "/" + template;
}
-

-ȱʡÇé¿öÏÂtextfield±êÇ©µÄ·µ»ØÖµÎª -
-
/template/xhtml/text.vm
-

-Webwork½«ÔÚʹÓÃȱʡֵ֮ǰ³¢ÊÔ²éÕÒ¸ÃÖµ. Èç¹ûÄãÔ¸Òâ, Äã¿ÉÒÔ²»ÐÞ¸ÄÈκÎÖµ¾Í¿ÉÒÔÐÞ¸ÄÄÚ½¨Ä£°æ(Çë×ÔÐÐÑ¡Ôñ). Webwork½«Ê¹ÓÃÏÂÁÐ˳Ðò½øÐÐËÑË÷: -
    -
  • getTemplateDir()
      -
    • webwork.propertiesÖеÄwebwork.ui.templateDir
    • -
    • ·ñÔò, ·µ»Ø"template"
    • -
  • -
  • getTheme()
      -
    • UI±êÇ©µÄthemeÊôÐÔ
    • -
    • webwork.propertiesÖеÄwebwork.ui.theme
    • -
    • ·ñÔò, ·µ»Ø"xhtml"
    • -
  • -
  • template
      -
    • UI±êÇ©µÄtemplateÊôÐÔ
    • -
    • ·ñÔò, ʹÓÃȱʡָ¶¨µÄÄ£°æ
    • -
  • -

Ä£°æÖÐʹÓÃCSS

ȱʡģ°æÔÚÊä³öHTMLʱʹÓÃÁ˼¸¸öCSSÊôÐÔ. ÕâЩÊôÐÔÔÚ/template/xhtmlĿ¼ÖеÄstyles.cssÑùʽµ¥ÖÐ. Äã¿ÉÒÔ½«¸ÃÑùʽµ¥×÷ΪÄãµÄÓ¦ÓõÄÑù°åÒ²¿ÉÒÔÔÚ´´½¨Äã×Ô¼ºµÄÑùʽµ¥, µ«Òª¼ÇµÃÔÚJSP»òvelocityÒ³ÃæÖаüº¬¸ÃÑùʽµ¥µÄÁ´½Ó.
-styles.css: -
-
.label {font-style:italic; }
.errorLabel {font-style:italic; color:red; }
.errorMessage {font-weight:bold; text-align: center; color:red; }
.checkboxLabel {}
.checkboxErrorLabel {color:red; }
.required {color:red;}
.requiredLabel {font-weight:bold; font-style:italic; }
-

-ÔÚÄãµÄÒ³ÃæÖÐʹÓÃLINKÒýÓøÃÎļþ(¿ÉÒÔʹÓÃÏà¶Ô·¾¶»ò¾ø¶Ô·¾¶): -
-
<link rel ="stylesheet" type="text/css" href="/webwork-example/template/xhtml/styles.css" title="Style">
-

×¢Òâ: ÏÖÔÚWebworkÔÚUI±êÇ©ÖÐÔö¼ÓÁËеÄÊôÐÔÒÔ±ã¸üÈ«ÃæµÄÖ§³ÖHTMLµÄstyleºÍclass, ¿ÉÒÔ¸üÁé»îµÄʵÏÖÍâ¹Û. ÕâЩÊôÐÔ·Ö±ð¶¨ÒåΪcssStyleºÍcssClass. -

-
<ui:textfield label="'lebal'" name="'nmae'" cssStyle="'float:left; color:red'" cssClass="'myclass'"   />
-

´´½¨¶¨ÖÆ×é¼þ

¶Ôcomponent±êÇ©µÄ×î³õ½éÉܲ¢Ã»ÓиøÈËÉî¿ÌµÄÓ¡Ïó. Ö»ÄÜÖ¸¶¨Ò»¸öÄ£°æ, ʹÓÃһЩԤÏȶ¨ÒåµÄÊôÐÔ¿´ÆðÀ´ÄÜÁ¦ÓÐÏÞ. µ«¸Ã±êǩΪ¿ª·¢ÕßÌṩÁËÐí¶àºÃ´¦.

ÔÚÉîÈëµ½¶¨ÖÆ×é¼þ֮ǰ, Ê×ÏÈÃ÷ȷʹÓÃcomponent±êÇ©´´½¨¶¨ÖÆ×é¼þµÄ¼¸¸öÓŵã. È»ºó½«Ïêϸ½éÉÜWebWork 2ÖеÄÁ½ÖÖ´íÎóÐÅÏ¢ÒÔ¼°¶¨ÖÆ×é¼þÈçºÎ(ÏÔʾÆäÖÐÒ»ÖÖ)ÊÊÓ¦. ×îºó, ½«ÎªÎÒÃǵÄ×é¼þÌṩһ¸ö¼òµ¥µÄ»î¶¯Àà, jspÎļþºÍÄ£°æÎļþ. ½áÊøÊ±, Ä㽫Äܹ»°ÑÐÂ×é¼þÓ¦Óõ½ÄãµÄÓ¦ÓÃÖÐ.

ΪʲôʹÓÃcomponent±êÇ©? -

    -
  • ²»ÐèÒª¿ª·¢Äã×Ô¼ºµÄ±êÇ©¿â
  • -
  • ¼¯³É¶ÔÖµÕ»µÄ·ÃÎÊ
  • -
  • ÀûÓÃXWorkµÄ¹ú¼Ê»¯, ±¾µØ»¯ºÍ´íÎó´¦ÀíÄÜÁ¦
  • -
  • ʹÓÃÄ£°æ(¿É±à¼­Îı¾Îļþ)¶ø²»ÊDZàÒë´úÂë¿ÉÒÔ¸ü¿ìµÄ½¨Á¢Ô­ÐÍ
  • -
  • ¸´Óò¢×éºÏÒÑÓÐÄ£°æ
  • -

-¶Ô´íÎóÏûÏ¢µÄÖ§³Ö:

ÔÚWebWork 2ÖÐ, ÓÐÁ½Àà´íÎóÏûÏ¢: ×ֶδíÎóÏûÏ¢ºÍ»î¶¯´íÎóÏûÏ¢. ×ֶδíÎóÏûÏ¢´ú±íijһ¿Ø¼þµÄÎÊÌâ²¢ÏÔʾÔڿؼþÖÐ. Ðí¶à±êǩ֧³ÖÏÔʾÕâÖÖÏûÏ¢. ÁíÒ»·½Ãæ»î¶¯´íÎóÏûÏ¢´ú±í»î¶¯Ö´ÐеÄÎÊÌâ. ÔÚWebÓ¦ÓÃÖкܶàÊÂÎï»áµ¼Ö´íÎó, ÓÈÆäÊÇÔÚÒÀÀµÓÚÍⲿ×ÊÔ´µÄÓ¦ÓÃÖÐÈçÊý¾Ý¿â, Ô¶³ÌWeb·þÎñ, »òÆäËûÔڻִÐÐÆÚ¼ä¿ÉÄܲ»¿ÉÓõÄ×ÊÔ´. ÄÜ·ñÓÅÑŵĴ¦Àí´íÎó²¢ÏòÓû§ÌṩÓÐÓõÄÏûϢͨ³£ÊÇÓû§ÌåÑéºÃÓ뻵µÄÇø±ð.

µ±ÕâÖÖ´íÎó·¢Éúʱ, °ÑÏûÏ¢´Ó±íµ¥¿Ø¼þÖзÖÀë³öÀ´µ¥¶ÀÏÔʾ¸üΪºÏÊÊ. ÏÂÀýÖÐ, ÎÒÃǽ«´´½¨Ò»¸ö¿ÉÒÔÓÃÁбíÏֻ´íÎóÏûÏ¢µÄ¶¨ÖÆ×é¼þ. ¸Ã×é¼þ¿ÉÒÔÓÃÓÚÈ«²¿ÏÔʾÕâÀà´íÎóÏûÏ¢µÄ±íµ¥ÖÐ.

ÏÂÃæµÄ»î¶¯½«´¦ÀíÍøÕ¾ÉÏµÄ¹ã¸æ: Ãâ·ÑµÄµç×ÓÖ¤Êé. Ëü½«³¢ÊÔ·¢ËÍÖ¤ÊéÓʼþ, µ«»áÅ׳öÒì³£.

»î¶¯Àà:

-
package example;

import com.opensymphony.xwork.ActionSupport;

public class AddUser extends ActionSupport {

    private String fullname;
    private String email;

    public String execute() throws Exception {
        // we are ignoring field validation in this example

        try {
            MailUtil.sendCertificate(email, fullname);
        } catch (Exception ex) {
            // there was a problem sending the email
            // in a real application, we would also
            // log the exception
            addActionError("We are experiencing a technical problem and have contacted our support staff. " +
                           "Please try again later.");
        }

        if (hasErrors()) {
            return ERROR;
        } else {
            return SUCCESS;
        }
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}
-

JspÒ³Ãæ:

-
<%@ taglib uri="webwork" prefix="ui" %>

<html>
<head><title>custom component example</title></head>

<!-- don't forget this -->
<link rel ="stylesheet" type="text/css" href="/webwork-example/template/xhtml/styles.css" title="Style">

<body>

<ui:form action="AddUser.action" method="POST">
<table>
    <ui:component template="action-errors.vm" />
    <ui:textfield label="Full Name" name="fullname" />
    <ui:textfield label="Email" name="email" />
    <ui:submit name="submit" value="Send me a free E-Certificate!" />
</table>
</ui:form>

</body>
</html>
-

HTMLÊä³ö(Ìύǰ):

-
<html>
<head><title>custom component example</title></head>
<link rel ="stylesheet" type="text/css" href="/webwork-example/template/xhtml/styles.css" title="Style">

<body>

<form  action="AddUser.action" method="POST" />

<table>
    

    <tr>
  <td align="right" valign="top"><span class="label">Full Name:</span></td>
  <td>
<input type="text" name="fullname" value="" />
  </td>
</tr>
    <tr>
  <td align="right" valign="top"><span class="label">Email:</span></td>
  <td>
<input type="text" name="email" value="" />
  </td>
</tr>
    
<tr>
  <td colspan="2">
    <div align="right">
      <input type="submit" name="submit" value="Send me a free E-Certificate!"/>
    </div>
  </td>
</tr>


</table>
</form>

</body>
</html>
-

ÏÂÃæµÄÄ£°æ½«Ñ­»·È«²¿»î¶¯´íÎó²¢ÏÔʾÔÚÁбíÖÐ.

Ä£°æ(action-errors.vm)
- -
-
#set ($actionErrors = $stack.findValue("actionErrors"))

#if ($actionErrors)
<tr>
    <td colspan="2">
        <span class="errorMessage">The following errors occurred:</span>
        <ul>
            #foreach ($actionError in $actionErrors)
            <li><span class="errorMessage">$actionError</span></li>
            #end
        </ul>
    </td>
</tr>
#end
-

HTMLÊä³ö(Ìá½»Ö®ºó):

-
<html>
<head><title>custom component example</title></head>
<link rel ="stylesheet" type="text/css" href="/webwork-example/template/xhtml/styles.css" title="Style">

<body>

<form  action="AddUser.action" method="POST" />

<table>
    
<tr>
    <td colspan="2">
        <span class="errorMessage">The following errors occurred:</span>
        <ul>
            <li class="errorMessage">
                We are experiencing a technical problem and have contacted our 
                support staff. Please try again later.
            </li>
        </ul>
    </td>
</tr>

    <tr>
  <td align="right" valign="top"><span class="label">Full Name:</span></td>
  <td>
<input type="text" name="fullname" value="Sample User" />
  </td>
</tr>
    <tr>
  <td align="right" valign="top"><span class="label">Email:</span></td>
  <td>
<input type="text" name="email" value="user@example.com" />
  </td>
</tr>
    
<tr>
  <td colspan="2">
    <div align="right">
      <input type="submit" name="submit" value="Send me a free E-Certificate!"/>
    </div>
  </td>
</tr>


</table>
</form>

</body>
</html>
-

- - - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Text tag.html b/docs/chinese/wikidocs/Text tag.html deleted file mode 100644 index 1c9162c2c..000000000 --- a/docs/chinese/wikidocs/Text tag.html +++ /dev/null @@ -1,69 +0,0 @@ - - - WebWork 2 : Text±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

<ww:text />

Êä³öÒ»¸ö¾­¹ý¹ú¼Ê»¯´¦ÀíµÄ×Ö·û´®. ËüÓëi8ln±êÇ©ÁªºÏʹÓÃ. text´ÓÖÜΧµÄi8ln±êÇ©¶¨ÒåµÄ×ÊÔ´°üÖлñȡָ¶¨µÄÎı¾ÐÅÏ¢. ²ÎÊýÖµ¿ÉÒÔ´«µÝµ½ÏûÏ¢ÖÐ, ÀýÈç¸ñʽ»¯ÈÕÆÚ»ò»õ±Ò.

ÊôÐÔ - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
name ÊÇ ÌáÈ¡µÄÊôÐÔÃû
id ·ñ Ö¸¶¨Ê±, ½«Êä³ö½á¹ûʹÓÃid×÷Ϊ¼üÖµ±£´æÔÚActionContextÖÐ
value0 ·ñ ´«µÝÏûÏ¢ÖеIJÎÊý0
value1 ·ñ ´«µÝÏûÏ¢ÖеIJÎÊý1
value2 ·ñ ´«µÝÏûÏ¢ÖеIJÎÊý2
value3 ·ñ ´«µÝÏûÏ¢ÖеIJÎÊý3

-Ó÷¨Ê¾Àý -

-
Accessing messages from a given bundle (the i18n Shop example bundle in this case)<br>
<ww:i18n name="'webwork.action.test.i18n.Shop'">
  <ww:text name="'main.title'"/>
</ww:i18n>
-

-
<ww:i18n id="foo" name="'webwork.action.test.i18n.Shop'">
  <ww:text name="'main.title'"/>
</ww:i18n>
<ww:property value="#foo"/>
-

×¢Òâ: Äã¿ÉÒÔʹÓÃÏÂÃæµÄ¸ñÊ½Ìæ»»value0..value4: -

-
<ww:text name="'someKey'">
    <ww:param value="'Hello'"/>
</ww:text>
-

- -»òÕß

-
<ww:text name="'someKey'">
    <ww:param>Hello</ww:param>
</ww:text>
-

- -
µ±Ä㽫HTMLǶÈëÏûÏ¢ÖÐʱ, ÕâÖÖ¸ñʽ·Ç³£ÓÐЧ, ÒòΪÄã²»ÐèÒªµ£ÐÄÕⲿ·Ö´úÂë¿ÉÄÜÓÐתÂë(escaping)ÎÊÌâ.
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Textarea tag.html b/docs/chinese/wikidocs/Textarea tag.html deleted file mode 100644 index 128f7fe35..000000000 --- a/docs/chinese/wikidocs/Textarea tag.html +++ /dev/null @@ -1,79 +0,0 @@ - - - WebWork 2 : Textarea±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:textarea />

»æÖÆÒ»¸ötextarea±êÇ©.

Ó÷¨Ê¾Àý -

-
<ww:textarea label="'Comments'" name="'comments'" cols="30" rows="8"/>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
value ·ñ ×Ö¶ÎÖµ
rows ·ñ HTMLµÄrowsÊôÐÔ
cols ·ñ HTMLµÄcolsÊôÐÔ
wrap ·ñ HTMLµÄwrapÊôÐÔ
disabled ·ñ HTMLµÄdisabledÊôÐÔ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Textfield tag.html b/docs/chinese/wikidocs/Textfield tag.html deleted file mode 100644 index 7f207e12d..000000000 --- a/docs/chinese/wikidocs/Textfield tag.html +++ /dev/null @@ -1,78 +0,0 @@ - - - WebWork 2 : Textfield±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:textfield />

±¾ÀýÖÐ, »æÖÆÁËÒ»¸öÎı¾¿Ø¼þ. Ëüͨ¹ýµ÷ÓÃActionSupportµÄgetText()·½·¨´ÓResourceBundleÖÐÌáÈ¡Îı¾±êÇ©. -
-
<ww:textfield label="text('user_name')" name="'user'"/>
-

ÊôÐÔ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
id ·ñ HTMLµÄidÊôÐÔ
name ÊÇ HTMLµÄnameÊôÐÔ
size ·ñ HTMLµÄsizeÊôÐÔ
maxlength no HTMLµÄmaxlengthÊôÐÔ
readonly no HTMLµÄreadonlyÊôÐÔ
disabled ·ñ HTMLµÄdisabledÊôÐÔ
tabindex ·ñ HTMLµÄtabindexÊôÐÔ
onchange ·ñ HTMLµÄonchangeÊôÐÔ
onclick ·ñ HTMLµÄonclickÊôÐÔ
label ·ñ ÓÃÓÚÄ£°æÖеıêÇ©ÎÄ×Ö
labelposition ·ñ ±êÇ©µÄ¶ÔÆë·½Ê½ (left,right,center)
required ·ñ ÔÚ±íµ¥ÌύʱÊÇ·ñÊDZØÐè×Ö¶Î
cssClass ·ñ HTMLµÄclassÊôÐÔ
cssStyle ·ñ HTMLµÄstyleÊôÐÔ
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû

- -×¢Òâ: ±¾±êÇ©µÄȱʡģ°æÊÇtext.vm¶ø²»ÊÇtextfield.vm.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Themes.html b/docs/chinese/wikidocs/Themes.html deleted file mode 100644 index 9a0fcec11..000000000 --- a/docs/chinese/wikidocs/Themes.html +++ /dev/null @@ -1,85 +0,0 @@ - - - WebWork 2 : Ö÷Ìâ - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

Ö÷ÌâÊÇÒ»×éÓÃÓÚ¶¨ÖÆÊ¹ÓÃUI±êÇ©¿ª·¢µÄÒ³ÃæµÄÄ£°æ. ËüÌṩÁËÒ»¸öÇ¿´óµÄ»úÖÆÔÊÐíweb¿ª·¢ÈËԱʹÓûìºÏ·ç¸ñ(ÑÕÉ«, ×ÖÌåµÈ)ΪÓû§½çÃæÔöÌíÁÁÉ«. ÀýÈç, Äã¿ÉÄÜÏ£Íû±íµ¥ÖÐÒ»°ëÎı¾¿òʹÓÃÀ¶É«±³¾°¶øÁíÒ»°ëʹÓð×É«±³¾°. ×¢Òâ:

    -
  • Webwork¸½´øÁ½¸öÒѶ¨ÒåµÄÖ÷Ìâ; "simple"ºÍ"xhtml"(ȱʡµÄ). WebWorkȱʡÔÚÓ¦ÓõÄ/templateĿ¼Ï²éÕÒÖ÷Ìâ. ȱʡÖ÷ÌâÊÇxhtml. ÕâÒâζ×ÅÈç¹ûÄãûÓÐÔÚUI±êÇ©ÖÐÖ¸¶¨themeÊôÐԵϰ, ½«Ê¹ÓÃȱʡÖ÷Ìâ. ×¢Òâ: Äã¿ÉÒÔÔÚwebwork.propertiesÎļþÖÐÐÞ¸Äwebwork.ui.theme=ºÍwebwork.ui.templateDir=À´¸Ä±äȱʡֵ.
  • -
-
    -
  • Ò²¿ÉÒÔ´´½¨¶¨ÖÆÖ÷ÌâÒÔÊʺÏ×Ô¼ºµÄÐèÒª. ÎÒÃÇÍÆ¼ö²Î¿¼ÒѶ¨ÒåµÄÄ£°æ×÷ΪÆðµã.
  • -
-
    -
  • ÿ´ÎʹÓÃUI±êǩʱ, ±êÇ©¶¼ÒýÓÃÒ»¸öÄ£°æÀ´»æÖÆHTML. Òò´ËÄ£°æ¾ö¶¨ÁË×Ö¶ÎÍâ¹ÛºÍËüÔÚÒ³ÃæÉϵÄλÖÃ. Ŀǰ, ½öÖ§³ÖvelocityÄ£°æ. ÎÞÂÛÈçºÎ, Ï£ÍûÔÚδÀ´°æ±¾ÖÐÖ§³Ö´´½¨JSPÄ£°æ.
  • -

-×¢Òâ: ÔÚ¼ÌÐøÖ®Ç°, ÍÆ¼öÄ㸴²éWebWorkÄ£°æÏµÍ³µÄ¹¤×÷Ô­Àí. (²Î¼ûÄ£°æ)

xhtml

xhtmlÊÇWebWork¸½´øµÄȱʡÖ÷Ìâ. ËüÀ©Õ¹ÁËsimpleÖ÷Ìâ²¢ÌṩÄÚ½¨µÄ´íÎ󱨸æ, ±í¸ñ¶¨Î»ºÍÌí¼ÓÎı¾±êÇ©µÄ¹¦ÄÜ. È»ÎÒÃÇ¿´¿´×î³£ÓõÄUI±êÇ©, textfield, ²¢Õ¹Ê¾Ê¹ÓÃXHTMLÖ÷Ìâ´´½¨ÊÓͼµÄÕýÈ··½·¨.

Äã¿ÉÄÜÒѾ­ÖªµÀ, textfield±êǩʹÓõÄȱʡģ°æÊÇ/template/xhtmlĿ¼ÏµÄtext.vm.

-
#*
   -- text.vm
*#
## notice the re-use of the simple theme template text.vm
#parse("/template/xhtml/controlheader.vm")
#parse("/template/simple/text.vm")
#parse("/template/xhtml/controlfooter.vm")
-

-¸ÃÄ£°æ¼ÓÔØÊ±, ½«Ê×ÏȽâÎö²¢»æÖÆ/template/xhtml/controlheader.vm. ÔÚcontrolheader.vmÖпÉÒÔ¿´µ½´íÎ󱨸æ, ±í¸ñ¶¨Î»ºÍÌí¼ÓÎı¾±êÇ©µÄ¹¦ÄÜ. Èç¹ûActionSupport·µ»ØÁË´íÎó, ½«Ê¹ÓÃÕâ¸öÄ£°æ»æÖƳÉHTML. »¹ÄÜ¿´µ½ÈçºÎ»ñÈ¡parameter.labelµÄÖµ²¢Ê¹Óñí¸ñÔªËØtrºÍtd½øÐж¨Î».
- -
-
#*
   -- controlheader.vm
*#
## Only show message if errors are available.
## This will be done if ActionSupport is used.

#if( $fieldErrors.get($parameters.name) )
  #set ($hasFieldErrors = $fieldErrors.get($parameters.name))
  #foreach ($error in $fieldErrors.get($parameters.name))
    <tr>
        #if ($parameters.labelposition == 'top')
            <td align="left" valign="top" colspan="2">
        #else
            <td align="center" valign="top" colspan="2">
        #end
            <span class="errorMessage">$!webwork.htmlEncode($error)</span>
            </td>
    </tr>
  #end
#end

## Provides alignment behavior with table tags
## if the label position is top,
## then give the label it's own row in the table
## otherwise, display the label to the left on same row

<tr>
    #if ($parameters.labelposition == 'top')
        <td align="left" valign="top" colspan="2">
    #else
        <td align="right" valign="top">
    #end

        #if ($hasFieldErrors)
            <span class="errorLabel">
        #else
            <span class="label">
        #end

## If you want to mark required form fields with an asterisk, 
## you can set the required attribute
## Ex. <ui:textfield label="'mylabel'" name="'myname'" required="'true'" /> 
        #if ($parameters.label)
            #if ($parameters.required) <span class="required">*</span> #end 
               $!webwork.htmlEncode($parameters.label):
        #end
            </span>
        </td>

## add the extra row
#if ($parameters.labelposition == 'top')
</tr>
<tr>
#end
    <td>
-

-ÏÂÒ»¸ö±»/template/xhtml/text.vm½âÎöµÄÄ£°æÊÇ/template/simple/text.vm. ÕâÀï¿ÉÒÔ¿´µ½Êµ¼ÊµÄHTMLµÄtextÔªËØÈçºÎ»æÖÆÒÔ¼°²ÎÊýÈçºÎ´«µÝµÄ. -
-
#*
  -- text.vm
  --
  -- Required Parameters:
  --   * label      - The description that will be used to identfy the control.
  --   * name       - The name of the attribute to put and pull the result from.
  --                  Equates to the NAME parameter of the HTML INPUT tag.
  --
  -- Optional Parameters:
  --   * labelposition   - determines were the label will be place in relation
  --                       to the control.  Default is to the left of the control.
  --   * size       - SIZE parameter of the HTML INPUT tag.
  --   * maxlength  - MAXLENGTH parameter of the HTML INPUT tag.
  --   * disabled   - DISABLED parameter of the HTML INPUT tag.
  --   * readonly   - READONLY parameter of the HTML INPUT tag.
  --   * onkeyup    - onkeyup parameter of the HTML INPUT tag.
  --   * tabindex  - tabindex parameter of the HTML INPUT tag.
  --   * onchange  - onkeyup parameter of the HTML INPUT tag.
  --
    *#
<input type="text"
                                   name="$!webwork.htmlEncode($parameters.name)"
#if ($parameters.size)             size="$!webwork.htmlEncode($parameters.size)"            #end
#if ($parameters.maxlength)        maxlength="$!webwork.htmlEncode($parameters.maxlength)"  #end
#if ($parameters.nameValue)        value="$!webwork.htmlEncode($parameters.nameValue)"      #end
#if ($parameters.disabled == true) disabled="disabled"                                      #end
#if ($parameters.readonly)         readonly="readonly"                                      #end
#if ($parameters.onkeyup)          onkeyup="$!webwork.htmlEncode($parameters.onkeyup)"      #end
#if ($parameters.tabindex)         tabindex="$!webwork.htmlEncode($parameters.tabindex)"    #end
#if ($parameters.onchange)         onchange="$!webwork.htmlEncode($parameters.onchange)"    #end
#if ($parameters.id)               id="$!webwork.htmlEncode($parameters.id)"                #end
#if ($parameters.cssClass)         class="$!webwork.htmlEncode($parameters.cssClass)"       #end
#if ($parameters.cssStyle)         style="$!webwork.htmlEncode($parameters.cssStyle)"       #end
/>
-
 
-×îºó, ½âÎöcontrolfooter.vm, ¹Ø±Õcontrolheader.vmÖÐÊä³öµÄtrºÍtd. -
-
#*
   -- controlheader.vm
*#

  </td>
</tr>
-

ÔÚÎÒÃǵÄÊÓͼÖÐ, ÓÉÓÚtrºÍtdÔªËØÒѾ­´´½¨ºÃÁË, ÎÒÃÇÖ»ÐèÒª¼òµ¥µÄÓÃtableÔªËØ½«ËüÃǰü×°ÆðÀ´. ³öÓÚѧϰµÄÔµ¹Ê, ÎÒÃǽöʹÓÃÆÕͨµÄtable¶ÔÏó, µ«Ò²¿ÉÒÔ¿´¿´table.vmµÄÄÚÈÝ. -

-
<%@ taglib uri="webwork" prefix="ui" %>
<link rel ="stylesheet" type="text/css" href="template/xhtml/styles.css" title="Style">
<html>
<head><title>JSP PAGE</title></head>
<body>
<form>
  <table>
	<!-- we can set the required attribute to true if we want to 
	     display and asterisk next to required form fields
	 -->

	<ui:textfield label="'Username'" required="'true'" name="'user'" /> 
	<ui:textfield label="'Email'" name="'email'"/> 
  </table>
</form>
</body>
</html>
-

-
<link rel ="stylesheet" type="text/css" href="template/xhtml/styles.css" title="Style">
<html>
<head><title>VM PAGE</title></head>
<body>
<form>
  <table>
    #tag( TextField "label='Username'" "name='user'" )<br>
    #tag( TextField "label='Email'" "name='email'" )<br>
  </table>
</form>
</body>
</html>
-

simple

simple½öÌṩHTML±êÇ©¶ø²»°üº¬¸½¼Ó¹¦ÄÜ(ÓëstrutsÀàËÆ). ¸ÃÖ÷ÌâÖ»¿¼Âǵײã½á¹¹, ¿ÉÒÔÏñxhmlÄÇÑù¸´ÓÃÒÔÔö¼Ó¶îÍâµÄ¹¦ÄÜ»òÐÐΪ. Äã¿ÉÒÔºÜÈÝÒ×µÄÀ©Õ¹¸ÃÖ÷ÌâÀ´´´½¨Äã×Ô¼ºµÄÖ÷Ìâ, ÒԱ㽨Á¢¸ü¸´ÔÓµÄÒ³ÃæÀ´Âú×ãÒªÇó.
-ʹÓÃÒѶ¨ÒåµÄÖ÷Ìâsimple -
-
<%@ taglib uri="webwork" prefix="ui" %>
<link rel ="stylesheet" type="text/css" href="template/xhtml/styles.css" title="Style">
<html>
<head><title>JSP PAGE</title></head>
<body>
  <form>
	<ui:label name="'userlabel'" label="'user" theme="'simple'"/>
                <ui:textfield name="'user'" theme="'simple'"/>

	<ui:label name="'emaillabel'" label="'user" theme="'simple'"/>
                <ui:textfield name="'email'" theme="'simple'"/>
  </form>
</body>
</html>
-

- -
-
<link rel ="stylesheet" type="text/css" href="template/xhtml/styles.css" title="Style">
<html>
<head><title>VM PAGE</title></head>
<body>
  <form>
#tag( Label  "name='userlabel'" "label='user'" "theme='simple'" )
#tag( TextField  "name='user'" "theme='simple'" )<br>

#tag( Label  "name='emaillabel'" "label='email'" "theme='simple'" )
#tag( TextField  "name='email'" "theme='simple'" )<br>
  </form>
</body>
</html>
-

´´½¨Äã×Ô¼ºµÄÖ÷Ìâ

´´½¨Ö÷Ìâ·Ç³£¼òµ¥, ²¢ÄÜÔÚ´´½¨¸´ÔÓUIÒ³ÃæÊ±°ïÖúÄã½Úʡʱ¼ä, ×îС»¯´úÂë. ÔÚ¼ÌÐøÖ®Ç°ÍÆ¼öÄãÀí½âWebWorkµÄÄ£°æÏµÍ³(²Î¼ûÄ£°æ). ʹÓÃÒ»¸öÄ£°æÐèÒªÏÂÁв½Öè. -
    -
  1. ¶¨ÒåÖ÷ÌâµÄÃû×Ö²¢ÔÚ/templateĿ¼Ï´´½¨Ò»¸ö×ÓĿ¼. ×ÓĿ¼µÄÃû×ÖÓ¦µ±ºÍÄãÔÚUI±êÇ©themeÊôÐÔÖÐÖ¸¶¨µÄÖµÏàͬ. -
    -
    /template/myTheme
    -
    -
    -
    <ui:textfield label="'foo'" name="'bar'" theme="'myTheme'" />
    -
    -
  2. -
  3. Ϊÿһ¸öÏëʹÓÃUI±êÇ©´´½¨Ò»¸övelocityÄ£°æ. ÀýÈç, Èç¹û±íµ¥ÖÐÖ»ÓÐtextfieldûÓÐÆäËû¿Ø¼þ, ÄãµÄ×ÓĿ¼ÏÂÖ»ÐèÒªÒ»¸ötext.vmÄ£°æ. ×¢Òâ: Èç¹ûÄã´´½¨Ò»¸ötext.vm²¢ÓÃparse±êÇ©ÒýÓÃÆäËûÄ£°æ, Äã±ØÐëÈ·±£ÕâЩģ°æÒѾ­¶¨ÒåºÃÁË(ÀýÈç, controlheader.vm).
  4. -
  5. Èç¹ûÏë°ÑеÄÖ÷Ìâ×÷ΪȱʡÖ÷Ìâ, ´Ó¶ø²»ÐèÒªÔÚUI±êÇ©ÖÐÖ¸¶¨themeÊôÐÔ, ÕâÐèÒªÐÞ¸Äwebwork.propertiesÖеÄwebwork.ui.theme. ·ñÔò, ÄãÖ»ÄÜÔÚËùÓÐUI±êÇ©ÖÐÖ¸¶¨themeÊôÐÔ.
  6. -

°ÑxhtmlµÄÄÚÈݸ´ÖƵ½ÐµÄĿ¼ÖÐÊÇÒ»¸öºÃµÄ¿ªÊ¼. ÕâÑù, Äã¿ÉÒÔÐÞ¸ÄÄ£°æ, ²¢ÈÔÈ»¿ÉÒÔ°ÑԭʼÄÚÈÝ×÷Ϊ²Î¿¼µã.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Token tag.html b/docs/chinese/wikidocs/Token tag.html deleted file mode 100644 index 534b89c29..000000000 --- a/docs/chinese/wikidocs/Token tag.html +++ /dev/null @@ -1,51 +0,0 @@ - - - WebWork 2 : Token±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by casey. -
- -

<ww:token />

ÁîÅÆ±êÇ©ÓÃÓÚ½â¾ö"Ë«»÷"Ìá½»ÎÊÌâ. ÕâÐèÒªÉèÖÃTokenInterceptorºÍTokenSessionInterceptor. ¹ØÓÚËûÃǵÄÎĵµ²Î¼ûwiki. ww:token±êÇ©½ö·ÅÖÃÒ»¸ö°üº¬ÎªÒ»ÁîÅÆµÄÒþ²ØÔªËØ.

Ó÷¨Ê¾Àý -

-
<ww:token />
-

ÊôÐÔ - - - - - - - - - - -
Ãû×Ö ±ØÐè ÃèÊö
name ·ñ ÁîÅÆÃû
theme ·ñ ʹÓõÄÖ÷Ìâ
template ·ñ ʹÓõÄÄ£°æÃû
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Transparent web-app I18N.html b/docs/chinese/wikidocs/Transparent web-app I18N.html deleted file mode 100644 index 072f12e13..000000000 --- a/docs/chinese/wikidocs/Transparent web-app I18N.html +++ /dev/null @@ -1,55 +0,0 @@ - - - WebWork 2 : Transparent web-app I18N - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Consider adding transparent i18 with simple on-the-fly locale switching to your appliction via I18NInterceptor.

The main idea:
-Interceptor could track locale switch requests, persist selection in current session and set locale for all (or appropriate) actions invoked.
- -
-
package neuro.util.xwork;

import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;

import java.util.Locale;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * I18nInterceptor
 * @author Aleksei Gopachenko
 */
public class I18nInterceptor implements Interceptor
{
    protected static final Log log = LogFactory.getLog(I18nInterceptor.class);

    public static final String DEFAULT_SESSION_ATTRIBUTE = "WW_TRANS_I18N_LOCALE";
    public static final String DEFAULT_PARAMETER = "request_locale";

    protected String parameterName = DEFAULT_PARAMETER;
    protected String attributeName = DEFAULT_SESSION_ATTRIBUTE;

    /**
     */
    public I18nInterceptor()
    {
        if(log.isDebugEnabled()) log.debug("new I18nInterceptor()");
    }

    public void setParameterName(String parameterName) {
        this.parameterName = parameterName;
    }

    public void setAttributeName(String attributeName) {
        this.attributeName = attributeName;
    }

    /**
     */
    public void init() {
        if(log.isDebugEnabled()) log.debug("init()");
    }

    /**
     */
    public void destroy() {
        if(log.isDebugEnabled()) log.debug("destroy()");
    }

    /**
     */
    public String intercept(ActionInvocation invocation) throws Exception {
        if(log.isDebugEnabled()) log.debug("intercept '"
            +invocation.getProxy().getNamespace()+"/"
            +invocation.getProxy().getActionName()+"' { ");

        //get requested locale
        Object requested_locale = invocation.getInvocationContext().getParameters().get(parameterName);
        if(requested_locale!=null && requested_locale.getClass().isArray() && ((Object[])requested_locale).length==1) {
            requested_locale=((Object[])requested_locale)[0];
        }
        if(log.isDebugEnabled()) log.debug("requested_locale="+requested_locale);
        //save it in session
        if (requested_locale!=null) {
            Locale locale = (requested_locale instanceof Locale)? 
              (Locale) requested_locale : localeFromString(requested_locale.toString());
            if(log.isDebugEnabled()) log.debug("store locale="+locale);
            if(locale!=null)invocation.getInvocationContext().getSession().put(attributeName,locale);
        }
        //set locale for action
        Object locale = invocation.getInvocationContext().getSession().get(attributeName);
        if (locale!=null && locale instanceof Locale) {
            if(log.isDebugEnabled()) log.debug("apply locale="+locale);
            invocation.getInvocationContext().setLocale((Locale)locale);
        }

        if(log.isDebugEnabled()) log.debug("before Locale="+((ActionSupport)invocation.getAction()).getLocale());
        final String result = invocation.invoke();
        if(log.isDebugEnabled()) log.debug("after Locale="+((ActionSupport)invocation.getAction()).getLocale());

        if(log.isDebugEnabled()) log.debug("intercept } ");
        return result;
    }

    Locale localeFromString(String localeStr) {
        if ((localeStr == null) || (localeStr.trim().length() == 0) || (localeStr.equals("_"))) {
            return Locale.getDefault();
        }
        int index = localeStr.indexOf('_');
        if (index < 0) {
            return new Locale(localeStr);
        }
        String language = localeStr.substring(0,index);
        if (index == localeStr.length()) {
            return new Locale(language);
        }
        localeStr = localeStr.substring(index +1);
        index = localeStr.indexOf('_');
        if (index < 0) {
            return new Locale(language,localeStr);
        }
        String country = localeStr.substring(0,index);
        if (index == localeStr.length()) {
            return new Locale(language,country);
        }
        localeStr = localeStr.substring(index +1);
        return new Locale(language,country,localeStr);
    }

}
-

-Can be enabled for whole package via something like: -
-
<interceptor name="i18n" class="neuro.util.xwork.I18nInterceptor">
    <!-- on which request parameter we should react, optional, defaults to "request_locale" ->
    <param name="parameterName">set_locale</param>
    <!- under which session attribute locale should be stored, optional, defaults to "WW_TRANS_I18N_LOCALE" ->
    <param name="attributeName">ww_locale</param>
</interceptor>

<interceptor-stack name="i18nStack">
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="defaultStack"/>
</interceptor-stack>

<default-interceptor-ref name="i18nStack"/>
-

-...and invoked in web-app just by adding few links to menu: -
-
<a href="?set_locale=en">EN</a>
<a href="?set_locale=ru">RU</a>
<!- etc -->
-

-Of course you still need to move all explisitly defined messages or labels to appropriate ResourceBundles and make translations. Be sure to check out your -
    -
  • Actions - to use getText(...)
  • -
  • *-validation.xml files - to use <message key=...>
  • -
  • results/views - to use WW i18n services by <webwork:text ...> tag, or directly by evaluating getText(...) OGNL expression on current stack.
  • -

If this Interceptor is generally useful, may be it should go into codebase?

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialEnd.html b/docs/chinese/wikidocs/TutorialEnd.html deleted file mode 100644 index 62b6f5461..000000000 --- a/docs/chinese/wikidocs/TutorialEnd.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork 2 : TutorialEnd - - - - - - - - - -
- -
- This page last changed on May 13, 2004 by vitorsouza. -
- -

End of Tutorial

This is the end of the WebWork Tutorial. If you followed the tutorial and understood the concepts that were explained and exemplified, you're ready to start developing your own WebWork application. If you want go deeper into WebWork's details, I suggest you read the Reference Guide at the Documentation Page.



-Previous Lesson


- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialExamples.html b/docs/chinese/wikidocs/TutorialExamples.html deleted file mode 100644 index eff5e5593..000000000 --- a/docs/chinese/wikidocs/TutorialExamples.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork 2 : TutorialExamples - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

WebWork Tutorial's Examples

The examples supplied in this tutorial are available as a Web Application for you to deploy and run. The file is included in WebWork's binary distribution under the /docs/tutorial folder. You can either deploy it on your Servlet Container or extract the files from the archive using your favorite Zip software. - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson01.html b/docs/chinese/wikidocs/TutorialLesson01.html deleted file mode 100644 index 561b589f3..000000000 --- a/docs/chinese/wikidocs/TutorialLesson01.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork 2 : TutorialLesson01 - - - - - - - - - -
- -
- This page last changed on Sep 15, 2004 by vitorsouza. -
- -

µÚÒ»¿Î: ÏÂÔØ²¢°²×°WebWork

ʹÓÃWebWorkÊ×ÏÈÐèÒª°²×°WebWork. µ±Ç°°æ±¾¿ÉÒÔÔÚWebWorkµÄÖ÷Ò³ÉÏÕÒµ½. ±¾Ö¸ÄÏ»ùÓÚ2.1.1°æ±¾, ËüÊDZ¾Îĵ±±àдʱµÄ×îа汾.

ÏÂÔØwebwork-2.1.1.zipÖ®ºó, ½âѹµ½ÈÎÒâĿ¼ÏÂ. The libraries that are needed to use WebWorkËùÐèµÄÀà¿â°üÀ¨webwork-2.1.1.jarºÍlib/coreĿ¼ÏµÄÈ«²¿JARÎļþ.

ÏÂÒ»¿ÎÖн«Ê¹ÓÃÕâЩÀà¿âÉèÖÃWebÓ¦ÓÃ.


ÏÂÒ»¿Î - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson02.html b/docs/chinese/wikidocs/TutorialLesson02.html deleted file mode 100644 index 6491991f8..000000000 --- a/docs/chinese/wikidocs/TutorialLesson02.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork 2 : TutorialLesson02 - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

µÚ¶þ¿Î: ÉèÖÃWebÓ¦ÓÃ

ÕâÀï¼Ù¶¨ÄãÒѾ­ÉèÖúÃServletÈÝÆ÷²¢ÖªµÀÈçºÎ´´½¨webÓ¦ÓÃ. Èç¹ûûÓÐ, ½¨ÒéÄãÁ˽âÒ»ÏÂApache Tomcat, ÕâÊÇÒ»¸öÓÉApache JakartaÏîÄ¿¿ª·¢µÄÃâ·ÑµÄServletÈÝÆ÷, Ò²¿ÉÒÔʹÓÃCaucho TechnologyµÄResin, Ëü¿ÉÒÔÃâ·ÑÓÃÓÚ·ÇÉÌÒµÓÃ;.

ҪʹÓÃWebWork, ÐèÒª½«ÉÏÒ»¿ÎÖнéÉܵıØÒªµÄÀà¿â(webwork-2.1.1.jarºÍlib/core/*.jar)¸´ÖƵ½WebÓ¦ÓõÄWEB-INF/libĿ¼ÖÐ. È»ºó, ÅäÖÃweb.xml²¡´²½¨ÆðËüµÄÁ½¸öXMLÎļþ: xwork.xmlºÍvalidators.xml. ÕâÈý¸öÎļþ½«ÔÚÏÂÎĽéÉÜ.

web.xml:

ÐÞ¸ÄwebÓ¦ÓõÄweb.xmlÈçÏÂ:

-
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
	<display-name>My WebWork Application</display-name>
	<servlet>
		<servlet-name>webwork</servlet-name>
		<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>webwork</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>
	<taglib>
		<taglib-uri>webwork</taglib-uri>
		<taglib-location>/WEB-INF/lib/webwork-2.1.1.jar</taglib-location>
	</taglib>
</web-app>
-

ҪʹÓÃWebWorkÄã±ØÐë×¢²áServletDispatcher²¢Ó³Éäµ½*.action. ÕâЩÐÐΪºÎÈç´ËÖØÒª½«ÔÚÏÂÒ»¿ÎÖйØÓڻµÄÕ½ڽøÐнâÊÍ. ÔÚÕâÒ»Àý×ÓÖÐͬʱÉùÃ÷ÁËWebWork±êÇ©¿âÃèÊöÎļþÒÔ±ãʹÓÃWebWork±êÇ©(¹ØÓÚWebWork±êÇ©µÄ¸ü¶àÐÅÏ¢Çë²ÎÔÄ4.1) – Èç¹ûÄ㲻ʹÓÃWebWork±êÇ©, ¿ÉÒÔ°²È«µÄɾµôËü.

½øÒ»²½ÔĶÁ: web.xml
-

xwork.xml:

ÔÚ¸ùÀà·¾¶(Ò²¾ÍÊÇWEB-INF/classes)Öд´½¨Îļþxwork.xml, ÕâÊÇWebWork×ÔÉíµÄÅäÖÃÎļþ. ÏÖÔÚ, ÔÚÎļþÖмÓÈëÏÂÁÐÄÚÈÝ:
- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
	</package>
</xwork>
-

ÕâÖ»ÊÇÅäÖÃÎļþµÄÒ»¸ö¹Ç¼Ü, ÔÚÎÒÃDZéÀúÕû¸öÖ¸ÄϵĹý³ÌÖÐ, Ëü½«²»¶ÏµÄÔö³¤. ĿǰΪֹ, ËüÖ»×öÁ½¼þÊÂÇé:

    -
  • ֪ͨWebWorkÐèÒª´Ówebwork-default.xml(λÓÚwebwork-2.1.1.jarµÄ¸ùĿ¼Öв¢Ò»Ö±¿ÉÓÃ)Öе¼ÈëÅäÖÃÐÅÏ¢ – ¸ÃÎļþ¶¨ÒåÁ˰üwebwork-default, Ëü°üº¬ÁËWebWorkÓ¦ÓÃËùÐèµÄȱʡÅäÖÃ;
  • -
-
    -
  • ¶¨ÒåÁËÒ»¸ödefault°ü, »î¶¯(actions), ½á¹û(results)ºÍ½ØÈ¡Æ÷(interceptors)½«×¢²áÔÚÆäÖÐ. Õâ¸ö°ü»¹À©Õ¹(extends)ÁËwebwork-default, Ò²¾ÍÊÇ˵, default°ü½«¼Ì³Ð(inherit)¶¨ÒåÔÚwebwork-defaultÖеÄÈ«²¿ÅäÖÃ.
  • -

-
½øÒ»²½ÔĶÁ: xwork.xml
-

validators.xml:

ÔÙ´ÎÔÚ¸ùÀà·¾¶Öд´½¨Îļþvalidators.xml, ²¢ÏÂÁÐÄÚÈݰüº¬:
- -
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"> 

<validators> 
	<validator name="required"
		class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/> 
	<validator name="requiredstring"
		class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/> 
	<validator name="int"
		class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/> 
	<validator name="date"
		class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/> 
	<validator name="expression"
		class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/> 
	<validator name="fieldexpression"
		class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/> 
	<validator name="email"
		class="com.opensymphony.xwork.validator.validators.EmailValidator"/> 
	<validator name="url"
		class="com.opensymphony.xwork.validator.validators.URLValidator"/> 
	<validator name="visitor"
		class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/> 
	<validator name="conversion"
		class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/> 
</validators>
-

¸ÃÎļþ¶¨Òå¿ÉÓõÄУÑéÆ÷.

½øÒ»²½ÔĶÁ: УÑé
-

È«²¿ÉèÖÃÍê³É!

ÏÖÔÚÒ»¸öWebWorkÓ¦ÓõĹǼÜÒѾ­ÅäÖÃÍê³É. ÏÂÒ»¿Î½«Ñ§Ï°ÈçºÎʹÓÃWenWorkµÄ»î¶¯, ÊÓͼºÍ½ØÈ¡Æ÷.


ÉÏÒ»¿Î | ÏÂÒ»¿Î
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson03.html b/docs/chinese/wikidocs/TutorialLesson03.html deleted file mode 100644 index 733bd0347..000000000 --- a/docs/chinese/wikidocs/TutorialLesson03.html +++ /dev/null @@ -1,108 +0,0 @@ - - - WebWork 2 : TutorialLesson03 - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

µÚÈý¿Î: »î¶¯ºÍ½á¹û

»î¶¯(Action)ÊdzÌÐòÖ´ÐеĻù±¾µ¥Ôª. »î¶¯ÊÇÒ»¸ö×¢²áÔÚWebWorkÅäÖÃÎļþÖÐÓÃÒÔÏìӦijһÇëÇóµÄÀà. ÔÚÄ£ÐÍ-ÊÓͼ-¿ØÖÆÆ÷·½Ê½ÖÐ, »î¶¯ÊÇ¿ØÖÆÆ÷µÄÒ»²¿·Ö, Áô¸øJSPÒ³ÃæµÄÊÇËûÃÇ×îÉó¤µÄ¹¤×÷: ´´½¨ÊÓͼ.

ÏÂÃæÊÇÔÚWenWorkÖд´½¨»î¶¯µÄ¿ÉÄܵIJ½Öè:

    -
  1. ´´½¨Ò»¸öµ÷ÓûµÄJSPÒ³Ãæ;
  2. -
  3. ´´½¨Ò»¸ö»î¶¯Àà;
  4. -
  5. ´´½¨Ò»¸ö´¦Àí½á¹ûµÄJSPÒ³Ãæ;
  6. -
  7. ÔÚxwork.xmlÖÐ×¢²á»î¶¯.
  8. -

-±¾Ö¸ÄϵĵÚÒ»¸öÀý×ÓÕýÊÇ"Hello, WebWorld!". ÏÂÃæµÄ´úÂëչʾÁ˺¬ÓÐÒ»¸ö»î¶¯ÅäÖÃÐÅÏ¢µÄWebWorkÅäÖÃÎļþxwork.xml, ¸Ã»î¶¯×¢²áÔÚdefault°üÖÐ. -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref name="defaultStack" /> 
		
		<!-- Action: Lesson 03: HelloWebWorldAction. --> 
		<action name="helloWebWorld" class="lesson03.HelloWebWorldAction"> 
			<result name="success" type="dispatcher">ex01-success.jsp</result> 
		</action> 
	</package>
</xwork>
-

²»ÐèÒª¹ØÐÄdefault-interceptor-ref. ĿǰÎÒÃǽö¹Ø×¢»î¶¯. Õâ¸öÅäÖÃÎļþ¸æËßWebWorkÒ»¸öÃûΪhelloWebWorldµÄ»î¶¯ÓÉÀàlesson03.HelloWebWorldActionʵÏÖ. ¶ÔÓÚÕâÒ»»î¶¯, ÎÒÃǶ¨ÒåÁËÒ»¸öÃûΪsuccessµÄ½á¹û, ËüÖ¸ÏòÒ³Ãæex01-success.jsp.
- -
½øÒ»²½ÔĶÁ: xwork.xml

Ò»µ©ÎÒÃÇ¿´µ½µ÷ÓûµÄ´úÂë, Ò»Çлá±äµÃÇåÎú:

ex01-index.jsp:

-
-
<html>
<head>
<title>WebWork Tutorial - Lesson 3 - Example 1</title>
</head>

<body>

<p>Click the button below to activate HelloWebWorldAction.</p>

<form action="helloWebWorld.action" method="post">
<p><input type="submit" value="Hello!" /></p>
</form>

</body>
</html>
-

Õâ¾ÍÊÇÒ³ÃæÓëWebWorkÏà½áºÏµÄ·½Ê½: ͨ¹ý·ÃÎÊ*.actionµØÖ·. »ØÏëÉÏÒ»¿Î, Õâ¾ÍÊÇÎÒÃÇΪʲôע²áServletDispatcher²¢½«ËüÓ³Éäµ½*.actionµÄÔ­Òò.

µ±ÎÒÃǵã»÷Àý×ÓÒ³ÃæÉϵݴťʱ, ä¯ÀÀÆ÷½«°Ñ±íµ¥Êý¾Ý·¢Ë͵½µØÖ·helloWebWorld.action. ÓÉÓÚÕâ¸öµØÖ··ûºÏÓ³Éä*.action, ServletÈÝÆ÷½«¼¤»îWebWorkµÄServletDispatcher, Ëü½«¶Á³öxwork.xml ²¢²éÕÒÃûΪhelloWebWorldµÄ»î¶¯. Èç¹ûÕÒµ½ÁË, »î¶¯ÀàµÄÒ»¸öеÄʵÀý½«±»´´½¨²¢ÇÒ·½·¨execute()½«±»Ö´ÐÐ.

ÏÈÀ´¿´¿´»î¶¯Àà:

HelloWebWorldAction.java:

-
-
package lesson03; 

import com.opensymphony.xwork.ActionSupport; 

public class HelloWebWorldAction extends ActionSupport { 
	String hello; 
	public String getHello() { 
		return hello; 
	}
	public String execute() throws Exception { 
		hello = "Hello, WebWorld!"; 
		return SUCCESS; 
	} 
}
-

Ê×ÏÈ, ¸ÃÀàÀ©Õ¹ÁËcom.opensymphony.xwork.ActionSupport²¢ÊµÏÖÁË·½·¨public String execute(). ¶ÔÓÚÐÂÊÖ¶øÑÔ, ËùÓеĻÀà¶¼Ó¦µ±ÕâÑù±àд. Æä´Î, execute()·½·¨½öÉèÖÃÁËhelloÊôÐÔ(property)µÄÖµ²¢·µ»ØÖµÎª"success"µÄ×Ö·û´®³£Á¿SUCCESS.

µ±ServletDispatcherµÃµ½execute()µÄ·µ»ØÖµ"success"ºó, ÔÙ´ÎÔÚxwork.xmlÖвéÕÒÓësuccessͬÃûµÄ½á¹û, ÈçÅäÖÃÎļþËùÃèÊöµÄ, ÕÒµ½²¢Ç°½øµ½ex01-success.jsp.

ÈÃÎÒÃÇ¿´¿´Õâ¸öÒ³Ãæ×öÁËʲô:

ex01-success.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %> 
<html> 
<head> 
<title>WebWork Tutorial - Lesson 3 - Example 1</title> 
</head> 
<body> 

<ww:property value="hello" /> 

</body> 
</html>
-

Èç¹ûÔËÐÐÕâ¸öÀý×Ó, Äã»á·¢ÏÖÒ³ÃæÉÏÏÔʾ×Å"Hello, WebWorld!". ¿´ÆðÀ´ÊÇÒòΪ<ww:property value="hello" />±êÇ©ÔÚ¸Õ¸ÕÖ´ÐеĻÀàÖвéÕÒÁËÊôÐÔhello. ÊÂʵÉÏ, ¸Ã±êÇ©²éÕÒÒ³¸ö´æÈ¡Æ÷(accessor)·½·¨, Òò´Ë×îÖÕµ÷ÓÃÁËgetHello(). ÓÉÓÚHelloWebWorldAction±»µ÷Óò¢½«ÊôÐÔhelloÉèÖÃΪ"Hello, WebWorld!", Òò´ËgetHello()·µ»Ø¸ÃÖµ²¢±»½á¹ûÒ³ÃæÓÃÓÚÏÔʾ.

ÊÔÒ»ÊÔÕâ¸öÀý×Ó!
-

Ϊ»î¶¯ÌṩÊý¾Ý

ÉÏÒ»¸öÀý×ÓÑÝʾÁËWebWorkµÄ»î¶¯ÊÇÈçºÎ¹¤×÷µÄ, µ«Èç¹û²»ÄÜΪ»î¶¯ÌṩÊý¾ÝÎÒÃǾͲ»ÄÜ×ö¸ü¶à. ÈÃÎÒÃÇ¿´Ò»¸öÕâÑùµÄÀý×Ó: -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref name="defaultStack" /> 
		
		<!-- Action: Lesson 03: HelloAction. -->
		<action name="hello" class="lesson03.HelloAction">
			<result name="error" type="dispatcher">ex02-index.jsp</result>
			<result name="success" type="dispatcher">ex02-success.jsp</result>
		</action>
	</package>
</xwork>
-

HelloAction.java:

-
-
package lesson03;

import com.opensymphony.xwork.ActionSupport;

public class HelloAction extends ActionSupport {
	String person;
	public String getPerson() {
		return person;
	}
	public void setPerson(String person) {
		this.person = person;
	}
	public String execute() throws Exception {
		if ((person == null) || (person.length() == 0)) return ERROR;
		else return SUCCESS;
	}
}
-
-

ex02-index.jsp:

-
-
<html>
<head>
<title>WebWork Tutorial - Lesson 3 - Example 2</title>
</head>

<body>

<p>What's your name?</p>

<form action="hello.action" method="post">
<p><input type="text" name="person" /><input type="submit" /></p>
</form>

</body>
</html>
-

ex02-success.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head>
<title>WebWork Tutorial - Lesson 3 - Example 2</title>
</head>
<body>

Hello, <ww:property value="person" />

</body>
</html>
-

ÈÃÎÒÃÇ·ÖÎöһϲî±ð: ±¾ÀýÖÐÎÒÃÇͨ¹ýPOST·½Ê½·¢ËÍÃûΪpersonµÄ±íµ¥Êý¾Ý. ÕâÑù, ÔÚHelloActionеÄʵÀý´´½¨Ö®ºó, WebWorkµÄServletDispatcher½«ÊÔͼʹÓ÷¢Ë͵ÄÊý¾ÝÌî³ä»î¶¯µÄÊôÐÔperson, Òò´Ëµ÷ÓÃÑÆ(mutator)·½·¨setPerson()(ÊÂʵÉÏ, ÕâÒ»²½¹¤×÷ÊÇÓÉParametersInterceptorÍê³ÉµÄ, ÎÒÃǽ«ÔÚµÚÎå¿ÎÖÐѧµ½ – Ŀǰ, Ö»ÐèÒªÖªµÀµ±»î¶¯Ö´ÐÐʱ, ÊôÐÔÒѾ­±»ÉèÖÃÁË).

Èç¹ûÄã²é¿´»î¶¯ÀàµÄ´úÂë, Äã»á·¢ÏÖÔÚexecute()ÆÚ¼ä, ½«¼ì²éÊôÐÔÊÇ·ñÒÑÌîд(Ò²¾ÍÊÇ˵±íµ¥×Ö¶ÎÊÇ·ñÌṩÁËÊý¾Ý). Èç¹ûÒÑÌîд, ½«·µ»ØSUCCESS, ´Ó¶ø½«ÇëÇó·Ö·¢µ½ex02-success.jsp, ·ñÔò, ·µ»ØERROR, ·µ»Øex02-index.jsp.
- -
ÊÔÒ»ÊÔÕâ¸öÀý×Ó!
-

½á¹ûµÄÀàÐÍ(Types of Result)

ͨ¹ýÉÏÃæµÄÀý×Ó, µ±ÎÒÃÇÌáµ½Ò»¸ö½á¹ûÊÇ"dispatcher"ÀàÐÍʱÒâζ×ÅWebWork²éÕÒÒ»¸öÃûΪdispatcherµÄ ½á¹ûÀàÐͲ¢ÕÒ³öËüÓÉÄĸö½á¹ûÀàʵÏÖ. Ö»Òª»î¶¯·µ»Ø¸ÃÀàÐ͵Ľá¹û, ¸Ã½á¹ûÀàµÄÒ»¸öʵÀý¾Í±»¼¤»î.

½á¹ûÀàʵÏÖÁËcom.opensymphony.xwork.Result½Ó¿Ú. WebWork¸½´øÒ»Ð©ÒÑʵÏֵĽá¹ûÀà, µ«Èç¹ûÐèÒª, Ò²¿ÉÒÔ¹¹½¨×Ô¼ºµÄ½á¹ûÀà. WebWork¸½´øµÄ½á¹ûÀàÐÍÒѾ­ÅäÖÃÔÚwebwork-default.xmlÖÐ:

    -
  • dispatcher (com.opensymphony.webwork.dispatcher.ServletDispatcherResult): ½«½á¹ûת·¢µ½Ö¸¶¨µÄµØÖ·;
  • -
-
    -
  • redirect (com.opensymphony.webwork.dispatcher.ServletRedirectResult): ½«½á¹ûÖØ¶¨Ïòµ½Ö¸¶¨µÄµØÖ·. Óëdispatcher²»Í¬, ÖØ¶¨Ïò²»ÏòÖ¸¶¨µÄÒ³Ãæ·¢ËÍ±íµ¥Êý¾Ý(ͨ¹ýPOST»òGET);
  • -
-
    -
  • velocity (com.opensymphony.webwork.dispatcher.VelocityResult): ʹÓÃÒ»¸öVelocityÄ£°æ×÷Ϊ½á¹û. You could use the dispatcher to forward results to Velocity pages if you haveÈç¹ûÄãÔÚweb.xmlÖÐÅäÖÃÁË VelocityServlet, Äã¾Í¿ÉÒÔʹÓÃdispatcher½«½á¹ûת·¢µ½VelocityÒ³Ãæ, ²»¹ýʹÓÃVelocity½á¹ûÊǸüºÃµÄ·½Ê½. ¹ØÓÚVelocityµÄ¸ü¶àÐÅÏ¢Çë²ÎÔÄ4.2;
  • -
-
    -
  • chain (com.opensymphony.xwork.ActionChainResult): ½«Ò»¸ö»î¶¯Á´½ÓÔÚÁíÒ»¸ö»î¶¯ÉÏ, Ò²¾ÍÊÇ˵, Ò»¸ö»î¶¯µÄ½á¹ûÊÇÁíÒ»¸ö»î¶¯;
  • -
-
    -
  • xslt (com.opensymphony.webwork.views.xslt.XSLTResult): ÓÃÒ»¸öÓÉXSLTÑùʽµ¥×ª»»µÄXMLÎĵµ×÷Ϊ½á¹û.
  • -

-
½øÒ»²½ÔĶÁ: ½á¹ûÀàÐÍ(Result Types)
-

¼ÌÐø½øÐÐ

ÉÏÊöÀý×ÓչʾÁ˻ºÍ½á¹ûµÄÖ÷Òª¸ÅÄî: ËüÃÇÊÇÏìÓ¦ÇëÇóµÄ´úÂëÖ´Ðеĵ¥Ôª, Íê³ÉijЩ´¦ÀíÈ»ºó¸ù¾Ý½á¹û½«ÇëÇóת·¢µ½ÆäËûµØÖ·. ËäÈ»ÕâЩ¿´ÆðÀ´·Ç³£¼òµ¥, ËüÈ´ÊÇWebWork¹¦ÄܵĺËÐÄ.

ÏÂÃæÁгöµÄÁíһЩ¿ÉÒÔÓûʵÏÖµÄÄÚÈÝ, ½ö½öÊÇÔÚ¼ÌÐø½øÐе½ÆäËû¿Î³ÌǰÈÃÄãÁ˽⵽WebWork¿ÉÒÔ×öµ½ÄÄЩ:

    -
  • ʹÓýØÈ¡Æ÷, ¿ÉÒԼǼÿһ¸ö»î¶¯µÄÖ´ÐÐÉõÖÁ¼ÆËãÖ´ÐÐʱ¼ä(µÚÎå¿Î);
  • -
-
    -
  • ͨ¹ýʵÏÖModelDriven½Ó¿Ú, »î¶¯¿ÉÒÔÖ±½Ó²Ù×÷ÒµÎñ¶ÔÏó;
  • -
-
    -
  • ¶Ô·¢Ë͵½actionµÄÊý¾ÝµÄУÑ鹿Ôò¿ÉÒÔÔÚXMLÎļþÖÐÅäÖÃ. Èç¹ûijЩÊý¾Ý²»·ûºÏÄãµÄ¹æ·¶, »î¶¯²»»áÖ´ÐÐ, ͬʱ´íÎóÐÅÏ¢»áÁ¬½Óµ½¸Ã»î¶¯(²Î¼û: УÑé);
  • -
-
    -
  • ͨ¹ý½«WebWork UI±êÇ©ÓëУÑé¿ò¼ÜÏà¹ØÁª, ±íµ¥Äܹ»×Ô¶¯ÏÔʾÓÉÎÞЧÊäÈëµ½ÖµµÄ´íÎóÐÅÏ¢(4.1.1);
  • -
-
    -
  • WebWorkÄܹ»×Ô¶¯ÎªÄ³Ð©»î¶¯Ìṩ×é¼þ, ²¢ÔÊÐí·´×ª¿ØÖÆ(²Î¼û: [·´×ª¿ØÖÆÓë×é¼þ]);
  • -

-ÏÂÒ»¿Î½«ÌÖÂÛWebWorkÄܹ»Ê¹ÓõIJ»Í¬ÀàÐ͵ÄÊÔͼ.


ÉÏÒ»¿Î | ÏÂÒ»¿Î
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson04-01-01.html b/docs/chinese/wikidocs/TutorialLesson04-01-01.html deleted file mode 100644 index 0e82bad61..000000000 --- a/docs/chinese/wikidocs/TutorialLesson04-01-01.html +++ /dev/null @@ -1,111 +0,0 @@ - - - WebWork 2 : TutorialLesson04-01-01 - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

4.1.1: WebWorkµÄUI±êÇ©

ÔÚWebWorkÖÐ, UI±êÇ©°ü×°ÁËHTML¿Ø¼þÒÔ±ãÓëºËÐÄ¿ò¼Ü½ôÃܼ¯³É. ÕâЩ±êÇ©Éè¼ÆÄ¿±êÊÇ×îС»¯´úÂëÖеÄÂß¼­²¿·Ö, ²¢ÓÃÒ»¸öÄ£°æÏµÍ³´úÀí×îÖÕµÄHTML»æÖÆ. UI±êÇ©ÊÔͼ¸²¸Ç×îÆÕ±éµÄÇé¾°(scenario), ²¢ÌṩÁËÒ»¸öcomponent±êÇ©ÒÔ´´½¨¶¨ÖÆ×é¼þ.UI±êÇ©»¹ÄÚ½¨Ö§³ÖÏÔʾÄÚǶµÄ´íÎóÐÅÏ¢.

±¾½Ú½âÊÍÈçºÎÀûÓÃUI±êÇ©µÄÓŵ㹹½¨±íµ¥ºÍÆäËûͼÐοؼþ, ²¢Í¨¹ý½²½âÄ£°æÏµÍ³µÄ¹¤×÷Ô­Àí, ѧϰÈçºÎÐÞ¸ÄÒÑÓÐ×é¼þµÄÍâ¹ÛÒÔ¼°¶¨ÖÆÐÂ×é¼þ.

¹¹½¨±íµ¥(form):

WebWorkÌṩÏֳɵÄÓÃÓÚ¹¹½¨±íµ¥µÄ±êÇ©. ÆäÖÐһЩ±êÇ©µÄÃû×Ö¿ÉÒÔºÍHTML±êÇ©Ãû×ÖÖ±½ÓÁªÏµÆðÀ´, ͨ¹ýÃû×ÖÄã¾Í¿ÉÒÔÁì»áËüµÄÓÃ;: <ww:checkbox />, <ww:file />, <ww:form />, <ww:hidden />, <ww:label />, <ww:password />, <ww:radio />, <ww:select />, <ww:submit />, <ww:textarea />ºÍ<ww:textfield />.

ҪʹÓÃÕâЩ±êÇ©¹¹½¨±íµ¥, Ö»Ðè°ÑËüÃÇÏñHTML±êÇ©ÄÇÑù·ÅÔÚÒ³ÃæÉÏ. ΨһµÄÇø±ðÊDzÎÊýÓ¦µ±ÓÃË«ÒýºÅºÍµ¥ÒýºÅÀªÆðÀ´(key="'value'"). ÕâÊÇÒòΪ·Çµ¥ÒýºÅµÄÃû³Æ½«Ê¹ÓÃÖµÕ»ÖØÐ¸³Öµ.

È»ÎÒÃÇ¿´¿´Õâ¸öÀý×Ó:

ex01-index.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head>
<title>WebWork Tutorial - Lesson 4.1.1 - Example 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
	.errorMessage { color: red; }
</style>
</head>

<body>

<p>UI Form Tags Example:</p>

<ww:form action="'formProcessing.action'" method="'post'">
	<ww:checkbox name="'checkbox'" label="'A checkbox'" fieldValue="'checkbox_value'" />
	<ww:file name="'file'" label="'A file field'" />
	<ww:hidden name="'hidden'" value="'hidden_value'" />
	<ww:label label="'A label'" />
	<ww:password name="'password'" label="'A password field'" />
	<ww:radio name="'radio'" label="'Radio buttons'" list="{'One', 'Two', 'Three'}" />
	<ww:select name="'select'" label="'A select list'" list="{'One', 'Two', 'Three'}" 
		emptyOption="true" />
	<ww:textarea name="'textarea'" label="'A text area'" rows="'3'" cols="'40'" />
	<ww:textfield name="'textfield'" label="'A text field'" />
	<ww:submit value="'Send Form'" />
</ww:form>

</body>
</html>
-

ex01-index.jsp´¦ÀíºóµÄHTML½á¹ûÈçÏÂ:

-
-
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.1.1 - Example 1</title>
<style type="text/css"> 
  .errorMessage { color: red; } 
</style>   
</head> 

<body> 

<p>UI Form Tags Example:</p> 

<table> 
<form 
action="formProcessing.action" method="post" > 

   


<tr> 
<td valign="top" colspan="2"> 

<table width="100%" border="0" cellpadding="0" cellspacing="0"> 
<tr><td valign="top"> 
<input type="checkbox" 
name="checkbox" 
value="checkbox_value" 
/> 
</td> 
<td width="100%" valign="top"> 
<span class="checkboxLabel"> 
A checkbox 
</span> 
</td> 
</tr> 
</table> 
</td> 
</tr> 

   



<tr> 
<td align="right" valign="top"> 

<span class="label"> 

A file field: 
</span> 
</td> 

<td> 

<input type="file" 
name="file" 
/> 

</td> 
</tr> 

  <input 
type="hidden" 
name="hidden" value="hidden_value" /> 
   



<tr> 
<td align="right" valign="top"> 

<span class="label"> 

A label: 
</span> 
</td> 

<td> 
<label> </label> 
</td> 
</tr> 

   




<tr> 
<td align="right" valign="top"> 

<span class="label"> 

A password field: 
</span> 
</td> 

<td> 

<input type="password" 
name="password" 


/> 

</td> 
</tr> 

   



<tr> 
<td align="right" valign="top"> 

<span class="label"> 

Radio buttons: 
</span> 
</td> 

<td> 





<input 
type="radio" 
name="radio" 
id="radioOne" 
value="One" /> 
<label for="radioOne">One</label> 





<input 
type="radio" 
name="radio" 
id="radioTwo" 
value="Two" /> 
<label for="radioTwo">Two</label> 





<input 
type="radio" 
name="radio" 
id="radioThree" 
value="Three" /> 
<label for="radioThree">Three</label> 


</td> 
</tr> 

   



<tr> 
<td align="right" valign="top"> 

<span class="label"> 

A select list: 
</span> 
</td> 

<td> 

<select name="select" 
> 


<option value=""></option> 





<option value="One" 
>One</option> 





<option value="Two" 
>Two</option> 





<option value="Three" 
>Three</option> 


</select> 

</td> 
</tr> 

   



<tr> 
<td align="right" valign="top"> 

<span class="label"> 

A text area: 
</span> 
</td> 

<td> 

<textarea name="textarea" 
cols="40" 
rows="3" 
></textarea> 

</td> 
</tr> 

   



<tr> 
<td align="right" valign="top"> 

<span class="label"> 

A text field: 
</span> 
</td> 

<td> 

<input type="text" 
name="textfield" 
/> 

</td> 
</tr> 

  <tr> 
<td colspan="2"><div 
align="right" ><input 
type="submit" 
value="Send Form" /></div> 
</td> 
</tr> 

</form> 
</table> 


</body> 
</html>
-

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<action name="formProcessing" class="lesson04_01_01.FormProcessingAction">
			<result name="input" type="dispatcher">ex01-index.jsp</result>
			<result name="success" type="dispatcher">ex01-success.jsp</result>
			<interceptor-ref name="validationWorkflowStack" />
		</action>
	</package>
</xwork>
-

FormProcessingAction.java:

-
-
package lesson04_01_01;

import com.opensymphony.xwork.ActionSupport;

public class FormProcessingAction extends ActionSupport {
	private String checkbox;
	private String file;
	private String hidden;
	private String password;
	private String radio;
	private String select;
	private String textarea;
	private String textfield;
	
	public String getCheckbox() { return checkbox; }
	public String getFile() { return file; }
	public String getHidden() { return hidden; }
	public String getPassword() { return password; }
	public String getRadio() { return radio; }
	public String getSelect() { return select; }
	public String getTextarea() { return textarea; }
	public String getTextfield() { return textfield; }
	
	public void setCheckbox(String checkbox) { this.checkbox = checkbox; }
	public void setFile(String file) { this.file = file; }
	public void setHidden(String hidden) { this.hidden = hidden; }
	public void setPassword(String password) { this.password = password; }
	public void setRadio(String radio) { this.radio = radio; }
	public void setSelect(String select) { this.select = select; }
	public void setTextarea(String textarea) { this.textarea = textarea; }
	public void setTextfield(String textfield) { this.textfield = textfield; }
	
	public String execute() throws Exception {
		return SUCCESS;
	}
}
-

FormProcessingAction-validation.xml:

-
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">

<validators>
  <field name="checkbox">
    <field-validator type="requiredstring">
      <message>Please, check the checkbox.</message>
    </field-validator>
  </field>

  <field name="file">
    <field-validator type="requiredstring">
      <message>Please select a file.</message>
    </field-validator>
  </field>

  <field name="password">
    <field-validator type="requiredstring">
      <message>Please type something in the password field.</message>
    </field-validator>
  </field>

  <field name="radio">
    <field-validator type="requiredstring">
      <message>Please select a radio button.</message>
    </field-validator>
  </field>

  <field name="select">
    <field-validator type="requiredstring">
      <message>Please select an option from the list.</message>
    </field-validator>
  </field>

  <field name="textarea">
    <field-validator type="requiredstring">
      <message>Please type something in the text area.</message>
    </field-validator>
  </field>

  <field name="textfield">
    <field-validator type="requiredstring">
      <message>Please type something in the text field.</message>
    </field-validator>
  </field>
</validators>
-

ex01-success.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head>
<title>WebWork Tutorial - Lesson 4.1.1 - Example 1</title>
</head>

<body>

<p>UI Form Tags Example result:</p>

<ul>
  <li>checkbox: <ww:property value="checkbox" /></li>
  <li>file: <ww:property value="file" /></li>
  <li>hidden: <ww:property value="hidden" /></li>
  <li>password: <ww:property value="password" /></li>
  <li>radio: <ww:property value="radio" /></li>
  <li>select: <ww:property value="select" /></li>
  <li>textarea: <ww:property value="textarea" /></li>
  <li>textfield: <ww:property value="textfield" /></li>
</ul>

</body>
</html>
-

Çë×¢ÒâÓëHTML½á¹ûÏà±È, ex01-index.jspÒªÇåÎúµÄ¶à. ±íµ¥×é¼þµÄȱʡ²¼¾ÖÊÇÒ»¸öÎÄ×Ö±êÇ©ÔÚ×ó²à, ÊäÈë×Ö¶ÎÔÚÓÒ²àµÄ±í¸ñ²¼¾Ö. ÔÚÏÂÎĽâÊÍÁËÄ£°æÏµÍ³ºó, ÎÒÃÇ¿ÉÒÔÖªµÀͼºÍ´´½¨×Ô¼ºµÄ²¼¾Ö.

ÁíÍâÐèҪעÒâµÄÊÇÔڻÅäÖÃÖжÔvalidationWorkflowStackµÄÒýÓÃ. ËüÒªÇóWebWork°´ÕÕÓڻÀàλÓÚͳһλÖõÄÅäÖÃÎļþУÑé·¢Ë͵½»î¶¯ÖеÄÊý¾Ý, ±¾ÀýÖÐÊÇFormProcessingAction-validation.xml (²Î¼ûУÑé). Èç¹ûijЩÊý¾Ý²»ÕýÈ·, Õ⽫²»Ö´Ðл²¢½«ÇëÇóת·¢µ½ÊäÈëÒ³Ãæ, ͬʱ½«´íÎóÐÅÏ¢¸½¼ÓÔÚÿһ×Ö¶ÎÉÏ(ʹÓ÷½·¨addFieldError(String fieldName, String errorMessage)).

µ«ÊÇÎÒÃÇÏÖÔÚ²»±Ø¹ØÐÄУÑé¿ò¼ÜÈçºÎ¹¤×÷. ÔËÐиÃÀý×Ó²¢ÊÔ×ÅÈÃijЩ×ֶοÕ×Å. Äã»á¿´µ½UI±êÇ©ÏÔʾ³öÓëУÑé¿ò¼Ü¼¯³ÉµÄ´íÎóÐÅÏ¢, ¶øÕâÒ²ÊÇÎÒÃÇÒªÏòÄãÑÝʾµÄ. ·ÖÀë¹Ø×¢µãÄܹ»°ïÖú³ÌÐòÔ±ºÍÉè¼ÆÈËÔ±¸ü¹Ø×¢×Ô¼ºµÄÄDz¿·Ö¹¤×÷.
- -
½øÒ»²½ÔĶÁ: UI±êÇ©

- -
ÊÔÊÔÕâ¸öÀý×Ó!
-

ÆäËûUI¿Ø¼þ:

³ýÁËHTMLÉè¼ÆÈËÔ±ÒѾ­ÊìϤµÄ±ê×¼±íµ¥¿Ø¼þÍâ, WebWork»¹ÌṩÁËÆäËûһЩ¿Õ¼ä²¢ÇÒÒ²ÄÜ´´½¨¶¨ÖÆ×é¼þ. ÈÃÎÒÃÇ¿´Ò»¿´WebWorkÌṩµÄÕâЩ¿Ø¼þ:
- - - - - - - - - - - -
<ww:checkboxlist />Óë<ww:radio />±êÇ©µÄ¹¦ÄÜÏàËÆ, µ¥Ê¹Óø´Ñ¡¿ò(checkbox)¶ø²»Êǵ¥Ñ¡°´Å¥(radio button). Ëü´Ó¼¯ºÏÖлñÈ¡¼üÖµºÍÖµÀ´´´½¨Ò»×é¾ßÓÐÏàͬÃû×ֵĸ´Ñ¡¿ò.
<ww:combobox />Ä£·ÂÒ»¸ö×éºÏ¿ò(combobox), »ìºÏÁËÒ»¸öÑ¡ÏîÁбíºÍÒ»¸öÎı¾¿ò. ËüÔÚÒ»¸ö<select />ÁбíÉÏ·ÅÖÃÁËÒ»¸öÎı¾¿ò, ÿһ´ÎÑ¡ÏîÁбíÖµ·¢Éú±ä»¯Ê±ÀûÓÃJavaScript´úÂëÌîÈëÎı¾¿òÖÐ.
<ww:tabbedpane />Õⲿ·ÖÄÚÈÝÐèÒª°ïÖú.
<ww:token />Õⲿ·ÖÄÚÈÝÐèÒª°ïÖú.

-
½øÒ»²½ÔĶÁ: UI Tags
-

Ä£°æÏµÍ³:

WebWorkʹÓÃVelocityÄ£°æÏµÍ³ÎªÃ¿¸öUI±êÇ©»æÖÆ×îÖÕµÄHTML. ËùÓÐÄ£°æµÄȱʡʵÏÖÒѾ­°üº¬ÔÚºËÐÄ·¢ÐаüÖв¢ÔÊÐíÓû§'´òÆÆ³£¹æ'ʹÓÃUI±êÇ©. Ä£°æ¿ÉÒÔ·Ö±ðÐ޸ĻòÕû¸öÌæ»»ÒÔ±ãÍêÈ«¶¨ÖÆHTMLÊä³ö½á¹û. ÁíÍâ, ÿһ¸ö±êÇ©¶¼¿ÉÒÔÑ¡Ôñ¸²¸Çȱʡģ°æ´Ó¶øÔÊÐí½øÐо«Ï¸µÄ¿ØÖÆ. ȱʡģ°æÎ»ÓÚÎļþwebwork-2.1.1.jarµÄ/template/xhtmlĿ¼ÏÂ.

Èç¹ûÄã½â¿ªwebwork-2.1.1.jar²¢²é¿´Ä¿Â¼/template/xhtml¾Í»á·¢ÏÖÒ»×évelocityÄ£°æÎļþ. ´ó²¿·ÖÓëijһUI±êÇ©Ïà¶ÔÓ¦, Ãû³ÆÒ²Óë±êÇ©Ïàͬ. Èç¹ûÄãÒѾ­ÊìϤÁËVelocity, ÍÆ¼öÄã·ÖÎöÕâЩģ°æÎļþ¿´¿´ÄãÄܶÔËûÃÇ×öʲô. ´Ó2.1°æ±¾¿ªÊ¼, »¹ÓÐÒ»¸öĿ¼/template/simple, ÕâÀïÓÐÒ»¸öHTML±íµ¥¿Ø¼þµÄ¸ü¼òµ¥°æ±¾(½ö°üº¬¿Ø¼þ, ûÓбí¸ñºÍÎı¾±êÇ©).

Èç¹ûÄãÏëÓò»Í¬ÓÚWebWork×Ô´øµÄ²¼¾ÖÏÔʾÄãµÄUI×é¼þ, Äã¿ÉÒÔ:
- -
    -
  • ±à¼­²¢Ìæ»»/template/xhtmlĿ¼ÏµÄÎļþ(ÖØÐ´ò°üJarÎļþ»òÔڱ𴦴´½¨ÏàͬµÄĿ¼½á¹¹²¢È·±£WebÈÝÆ÷Äܹ»ÔÚJarÎļþ֮ǰÕÒµ½Ëü);
  • -
-
    -
  • ͨ¹ýÐÞ¸ÄÎļþwebwork.properties(Ó¦µ±Î»ÓÚ¸ùÀà·¾¶ÖÐ)ÖеÄwebwork.ui.themeÊôÐÔÀ´¸Ä±äÄ£°æÄ¿Â¼;
  • -
-
    -
  • ʹÓÃÖ÷Ìâ(theme)»òÄ£°æÊôÐÔ·Ö±ðΪÿ¸ö±êǩָ¶¨Ä£°æÎ»ÖÃ. ÕâÖÖ·½·¨ÔÊÐíÖ¸¶¨È«²¿Ä£°æËùÔÚµÄĿ¼(WebWorkÓÃÓë/template/xhtmlĿ¼ÏÂÏàͬµÄÎļþÃû²éÕÒÄ£°æÎļþ), ÕâÔÊÐíÄ㾫ȷµÄÖ¸¶¨×é¼þËùʹÓõÄÄ£°æ.
  • -

-
½øÒ»²½ÔĶÁ: Ä£°æ, Ö÷Ìâ

ÏÂÃæµÄÀý×ÓÖÐÑÝʾÁ˵ÚÈýÖÖ·½Ê½. ÐèҪעÒâµÄÊÇ, ȱʡÇé¿öÏÂ, Ö¸¶¨µÄÖ÷ÌâĿ¼Ӧµ±Î»ÓÚ/templateĿ¼ÏÂ, Ö¸¶¨µÄÄ£°æÎļþÓ¦µ±Î»ÓÚ/template/xhtmlĿ¼ÏÂ.

ex02.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %> 
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.1.1 - Example 2</title> 
</head> 

<body> 

<p>Template Change Example:</p> 

<p><ww:checkbox name="'checkbox'" label="'A checkbox'" fieldValue="'checkbox_value'" theme="'mytheme'" /></p> 

<p><ww:textfield name="'textfield'" label="'A text field'" template="mytextfield.vm" /></p> 

</body> 
</html>
-

/template/mytheme/checkbox.vm:

-
-
<div align="center"> 
	<input type="checkbox" 
		name="$!webwork.htmlEncode($parameters.name)" 
		value="$!webwork.htmlEncode($parameters.fieldValue)" 
	#if ($parameters.nameValue) checked="checked" #end 
	#if ($parameters.disabled == true) disabled="disabled" #end 
	#if ($parameters.tabindex) tabindex="$!webwork.htmlEncode($parameters.tabindex)" #end 
	#if ($parameters.onchange) onchange="$!webwork.htmlEncode($parameters.onchange)" #end 
	#if ($parameters.id) id="$!webwork.htmlEncode($parameters.id)" #end 
	/><br /> 
	$!webwork.htmlEncode($parameters.label) 
</div>
-

/template/xhtml/mytextfield.vm:

-
-
<div align="center"> 
	<input type="text" 
		name="$!webwork.htmlEncode($parameters.name)" 
	#if ($parameters.size) size="$!webwork.htmlEncode($parameters.size)" #end 
	#if ($parameters.maxlength) maxlength="$!webwork.htmlEncode($parameters.maxlength)" #end 
	#if ($parameters.nameValue) value="$!webwork.htmlEncode($parameters.nameValue)" #end 
	#if ($parameters.disabled == true) disabled="disabled" #end 
	#if ($parameters.readonly) readonly="readonly" #end 
	#if ($parameters.onkeyup) onkeyup="$!webwork.htmlEncode($parameters.onkeyup)" #end 
	#if ($parameters.tabindex) tabindex="$!webwork.htmlEncode($parameters.tabindex)" #end 
	#if ($parameters.onchange) onchange="$!webwork.htmlEncode($parameters.onchange)" #end 
	#if ($parameters.id) id="$!webwork.htmlEncode($parameters.id)" #end 
	/><br /> 
	$!webwork.htmlEncode($parameters.label) 
</div>
-

ex02.jsp´¦ÀíµÄHTML½á¹û:

-
-
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.1.1 - Example 2</title> 
</head> 

<body> 

<p>Template Change Example:</p> 

<p><div align="center"> 
  <input type="checkbox" 
         name="checkbox" 
         value="checkbox_value" 
            /><br /> 
  A checkbox 
</div></p> 

<p><div align="center"> 
  <input type="text" 
                                     name="textfield" 
                    /><br /> 
  A text field 
</div></p> 

</body> 
</html>
-

ÊÔÊÔÕâ¸öÀý×Ó!
-

¹¹½¨¶¨ÖƵÄUI×é¼þ:

ÓÐʱºòûÓÐÒ»¸öWebWork¸½´øµÄUI×é¼þÄܹ»Âú×ãÄãµÄÒªÇó. Õâʱ, ÍÆ¼öµÄ·½Ê½¾ÍÊÇ´´½¨×Ô¼ºµÄ¶¨ÖÆ×é¼þ. ͨ¹ýÕâÖÖ·½Ê½, ±£³ÖÁËÒ³ÃæÁËÇåÎúÇÒÓë²¼¾ÖºÍ´íÎó¼ì²éÎÊÌâÎÞ¹Ø, ²¢´Ù½øÁË×é¼þ¸´ÓÃ.

Òª´´½¨Ò»¸ö¶¨ÖÆ×é¼þ, Ö»ÐèҪΪËü´´½¨Ò»¸öVelocityÄ£°æ, ¾ÍÏñÄÇЩÒÑÓÐ×é¼þÄÇÑù. Ϊ°ÑËüÓÃÔÚÒ³ÃæÉÏ, ʹÓÃ<ww:component />±êÇ©²¢ÔÚtemplate²ÎÊýÖÐÖ¸¶¨Ä£°æ¼´¿É.

Òª´«µÝÄ£°æËùÐèµÄ²ÎÊý, ¿ÉÒÔʹÓÃ<ww:param />±êÇ©(²Î¼û4.1). ÏÂÃæµÄÀý×ÓÑÝʾÁËÒ»¸ö¶¨ÖƵÄÈÕÆÚ×ֶεĴ´½¨¹ý³Ì.
- -
½øÒ»²½ÔĶÁ: UI±êÇ©
-

ex03.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %> 
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.1.1 - Example 3</title> 
</head> 

<body> 
<p>Custom Component Example:</p> 

<p> 
<ww:component template="datefield.vm"> 
	<ww:param name="'label'" value="'Date'" /> 
	<ww:param name="'name'" value="'mydatefield'" /> 
	<ww:param name="'size'" value="3" /> 
</ww:component> 
</p> 

</body> 
</html>
-

/template/xhtml/datefield.vm:

-
-
#set ($name = $parameters.get('name')) 
#set ($size = $parameters.get('size')) 
#set ($yearSize = $size * 2) 

$parameters.get('label'): 
<input type="text" name="${name}.day" size="$size" /> / 
<input type="text" name="${name}.month" size="$size" /> / 
<input type="text" name="${name}.year" size="$yearSize" /> (dd/mm/yyyy)
-

ex03.jsp´¦ÀíµÄHTML½á¹û:

-
-
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.1.1 - Example 3</title> 
</head> 
<body> 
<p>Custom Component Example:</p> 

<p> 
Date: 
<input type="text" name="mydatefield.day" size="3" /> / 
<input type="text" name="mydatefield.month" size="3" /> / 
<input type="text" name="mydatefield.year" size="6" /> (dd/mm/yyyy) 
</p> 

</body> 
</html>
-

ÊÔÊÔÕâ¸öÀý×Ó!


ÉÏÒ»¿Î | ÏÂÒ»¿Î
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson04-01.html b/docs/chinese/wikidocs/TutorialLesson04-01.html deleted file mode 100644 index 18acd085b..000000000 --- a/docs/chinese/wikidocs/TutorialLesson04-01.html +++ /dev/null @@ -1,145 +0,0 @@ - - - WebWork 2 : TutorialLesson04-01 - - - - - - - - - -
- -
- This page last changed on Oct 04, 2004 by kousuke. -
- -

4.1: ÀûÓÃJSP×÷ΪÊÓͼ

ÔÚʹÓÃJSP»æÖÆÊÓͼʱ, Äã¿ÉÒÔÑ¡ÔñʹÓýű¾(Scriplet)»ò±êÇ©·ÃÎʻ(action)µÄÊý¾Ý. ±êÇ©ÊÇÍÆ¼öʹÓõķ½Ê½. -

ʹÓýű¾·ÃÎʻÊý¾Ý

»î¶¯Êý¾Ý¿ÉÒÔͨ¹ý¶ÔÏóÖµÕ»(Value Stack)½øÐзÃÎÊ. ÏÈÃæµÄÀý×ÓÍê³ÉÁËÓëµÚÈý¿ÎµÚ¶þ¸öÀý×Ó(Supplying Data to the Action)ÖеĽá¹ûÒ³ÃæÏàͬµÄ¹¤×÷, µ«Ê¹ÓÃÁ˽ű¾:
- -
-
<%@ page import="com.opensymphony.xwork.util.OgnlValueStack" %>
<html>
<head>
<title>WebWork Tutorial - Lesson 4.1 - Lesson 3's example modified</title>
</head>
<body>

<%
OgnlValueStack stack = (OgnlValueStack)request.getAttribute("webwork.valueStack");
out.write("Hello, " + stack.findValue("person"));
%>

</body>
</html>
-

ÎÞÂÛÈçºÎ, ÍÆ¼öʹÓÃWebWork±êÇ©¶ø²»Êǽű¾. ÀýÈç, <ww:property />±êǩ׼ȷµÄÍê³ÉÁËÉÏÃæ½Å±¾µÄ¹¤×÷, ͬʱ¾ßÓиüÇåÎúµÄÓï·¨²¢´¦ÀíÁ˵±ÖµÕ»²»´æÔÚµÄÇé¿ö.

WebWork±êÇ©¿â:

ÎÒÃÇÒѾ­ÔÚµÚÈý¿ÎµÄÀý×ÓÖÐչʾÁËÈçºÎʹÓñêÇ©·ÃÎʻµÄÊôÐÔ. ±¾½Ú½éÉܲ¢¾ÙÀý˵Ã÷WebWork±êÇ©¿âµÄÓÃ;, Ëü·ÖΪÆß´óÀà:

    -
  • ͨÓñêÇ©: ×î³£ÓÃ, ×î»ù±¾µÄ±êÇ©;
  • -
  • ×é¼þ»¯±êÇ©: ¹ÄÀøÊÓͼµÄ×é¼þ»¯;
  • -
  • Á÷³Ì¿ØÖƱêÇ©: ÔÚJSPÒ³ÃæÖйÜÀí¿ØÖÆÁ÷³Ì;
  • -
  • µü´ú±êÇ©: µü´úÔªËØ²¢²Ù×÷¿Éµü´ú(iterable)µÄ¶ÔÏó;
  • -
  • UI±êÇ©: Éú³ÉHTML±íµ¥×ֶκͿؼþ;
  • -
  • VUI±êÇ©: ÐèÒª×ÔÔ¸ÕßÀ´±àдÕⲿ·Ö;
  • -
  • ¹ú¼Ê»¯Ö§³Ö±êÇ©: Ìṩ¹ú¼Ê»¯ÊÓͼ֧³Ö.
  • -

- -

ͨÓñêÇ©

- - - - - - - - - - - - - -
<ww:property />»ñÈ¡½á¹ûµÄÊôÐÔÖµ. Èç¹ûֵδָ¶¨, ½«·µ»ØÕ»¶¥Öµ.
<ww:push />½«Ò»¸öֵѹÈëÖµÕ».
<ww:param />ÉèÖø¸±êÇ©µÄ²ÎÊý. ½öÓÃÓÚÆäËû±êÇ©ÄÚ²¿, ÓÃÓÚÉèÖø¸±êǩijЩÊôÐÔµÄÖµ.
<ww:set />½«ÖµÕ»ÖеÄij¸ö¶ÔÏóµÄÖµÉèÖõ½Ò»¸öscope(page, stack, application, session)ÖÐ. Èç¹ûֵδ¸ø¶¨, ½«Ê¹ÓÃÕ»¶¥Öµ. Èç¹ûscopeδ¸ø¶¨, ʹÓÃ"webwork"µÄȱʡscope.
<ww:url />¹¹½¨Ò»¸ö±àÂëµÄURL.
-
-
´Ë´¦ÐèҪʵÀý.
-

- -
½øÒ»²½ÔĶÁ: ·ÇUIÀà±êÇ©
-

×é¼þ»¯±êÇ©

- - - - - - - -
<ww:action />ÔÚ±êÇ©¿âµÄÉÏÏÂÎÄ»·¾³ÖÐÖ´ÐÐÒ»¸ö»î¶¯. ±êÇ©µÄÖ÷ÌåÓÃÀ´ÏÔʾ»î¶¯Ö´ÐеĽá¹û.
<ww:bean />´´½¨Ò»¸öJavaBean, ³õʼ»¯ËüµÄÊôÐÔ²¢·ÅÈëActionContextÒÔ±ãºóÐøÊ¹ÓÃ.
<ww:include />°üº¬ÁíÒ»¸öÒ³Ãæ»ò»î¶¯.
-
-
´Ë´¦ÐèҪʵÀý.
-

- -
½øÒ»²½ÔĶÁ: ·ÇUIÀà±êÇ©
-

Á÷³Ì¿ØÖƱêÇ©

Õâ¸öif-elseµÄ±êÇ©¼¯ºÏ¾ÍÏñif-else½Å±¾Ò»Ñù.
- - - - - - - - - -
<ww:if />ÓÐÌõ¼þÖ´Ðз¾¶. »»ÑÔÖ®, Èç¹û²¼¶ûÌõ¼þÊÇtrueµÄ»°, ¾ÍÔËËã±êÇ©Ö÷ÌåÄÚÈÝ.
<ww:else />if±êÇ©µÄ·´ÏòÖ´Ðз¾¶. »»ÑÔÖ®, Èç¹ûǰһ¸öif±êÇ©µÄ²¼¶ûÌõ¼þÊÇfalseµÄ»°, ¾ÍÔËËã±êÇ©Ö÷ÌåÄÚÈÝ.
<ww:elseif />if±êÇ©µÄ·´ÏòÖ´Ðз¾¶. »»ÑÔÖ®, Èç¹ûǰһ¸öif±êÇ©µÄ²¼¶ûÌõ¼þÊÇfalseÇÒ±¾±êÇ©µÄ²¼¶ûÌõ¼þÊÇtrueµÄ»°, ¾ÍÔËËã±êÇ©Ö÷ÌåÄÚÈÝ.
-
-
´Ë´¦ÐèҪʵÀý.
-

- -
½øÒ»²½ÔĶÁ: ·ÇUIÀà±êÇ©
-

µü´ú±êÇ©

- - - - - - - - - - - - - -
<ww:iterator />ÔÚÒ»¸ö¼¯ºÏ(collection)Éϵü´ú.
<ww:generator />Éú³Éµü´úÆ÷(Iterator).
<ww:append />Ìí¼Ó¼¸¸öµü´úÆ÷.
<ww:subset />»ñȡһ¸öµü´úÆ÷µÄ×Ó¼¯.
<ww:merge />ºÏ²¢¼¸¸öµü´úÆ÷.
<ww:sort />¶Ôµü´úÆ÷½øÐÐÅÅÐò.
-
-
´Ë´¦ÐèҪʵÀý.
-

- -
½øÒ»²½ÔĶÁ: ·ÇUIÀà±êÇ©
-

UI±êÇ©

UI±êÇ©°ü×°ÁËHTML¿Ø¼þÒÔ±ãÓëºËÐÄ¿ò¼Ü½ôÃܼ¯³É. ÕâЩ±êÇ©Éè¼ÆÄ¿±êÊÇ×îС»¯´úÂëÖеÄÂß¼­²¿·Ö, ²¢ÓÃÒ»¸öÄ£°æÏµÍ³´úÀí×îÖÕµÄHTML»æÖÆ. UI±êÇ©ÊÔͼ¸²¸Ç×îÆÕ±éµÄÇé¾°(scenario), ²¢ÌṩÁËÒ»¸öcomponent±êÇ©ÒÔ´´½¨¶¨ÖÆ×é¼þ. UI±êÇ©»¹ÄÚ½¨Ö§³ÖÏÔʾÄÚǶµÄ[inline, ²Î¿¼C++ ÖеÄinline¶¨Òå]´íÎóÐÅÏ¢.

¶ÔUI±êÇ©µÄһЩϸ½ÚÄÚÈݵÄÃèÊöÈçËüÃÇÈçºÎ¹¤×÷, ÈçºÎÀûÓÃÄ£°æ¶¨ÖÆËüÃǵÄÍâ¹Û, ÈçºÎ´´½¨¶¨ÖÆ×é¼þµÈµÈ, ½«ÔÚÁíÒ»¿ÎÖнéÉÜ.

Ìø×ªµ½WebWorkµÄUI±êÇ©½Ì³Ì. -

VUI(Voice UI)±êÇ©

- - - - - - - - - - -
<ww:audio />???
<ww:prompt />???
<ww:filled />???
<ww:log />???

-ÐèÒª×ÔÔ¸Õß±àдÕâÒ»²¿·Ö.

¹ú¼Ê»¯±êÇ©

- - - - - - - -
<ww:text />Êä³öÒ»¸ö¾­¹ý¹ú¼Ê»¯´¦ÀíµÄ×Ö·û´®.
<ww:i18n />½«¹ú¼Ê»¯×ÊÔ´°ü(resource bundle)·ÅÈëÖµÕ»ÖÐ, Ϊtext±êǩʹÓÃ.

-
½øÒ»²½ÔĶÁ: UI±êÇ©


ÉÏÒ»¿Î | ÏÂÒ»¿Î
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson04-02.html b/docs/chinese/wikidocs/TutorialLesson04-02.html deleted file mode 100644 index 0d9e3cf0e..000000000 --- a/docs/chinese/wikidocs/TutorialLesson04-02.html +++ /dev/null @@ -1,112 +0,0 @@ - - - WebWork 2 : TutorialLesson04-02 - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

4.2: ÔÚWebWorkÖÐʹÓÃVelocity

ÓÐÁ½ÖÖ·½·¨¿ÉÒÔÀûÓÃVelocity×÷ΪÊÓͼ.
- -
    -
  • ʹÓÃvelocity½á¹ûÀàÐÍ»æÖÆvelocityÄ£°æ;
  • -
  • ÔÚweb.xmlÎļþÖÐ×¢²áWebWorkVelocityServletÒÔ±ãÖ±½Óͨ¹ýä¯ÀÀÆ÷ÇëÇó»æÖÆVelocityÄ£°æ.
  • -

-ΪʹÓõڶþÖÖ·½Ê½, ±ØÐëÐÞ¸Äweb.xmlÎļþ¼ÓÈëWebWorkVelocityServletµÄservlet¶¨Òå¼°ÆäÓ³Éä, ÈçÏÂ:
- -
-
<servlet> 
	<servlet-name>velocity</servlet-name> 
	<servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class> 
	<load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
	<servlet-name>velocity</servlet-name> 
	<url-pattern>*.vm</url-pattern> 
</servlet-mapping>
-

- -
½øÒ»²½ÔĶÁ: xwork.xml

ʹÓÃvelocity½á¹ûÀàÐÍÒâζ×ÅVelocityÄ£°æ½öÄÜͨ¹ý»î¶¯½øÐлæÖÆ, »»ÑÔÖ®, ·ÃÎÊ.vmÒ³Ãæ½«²»»á½øÐлæÖƶøÖ±½Ó·µ»ØÎı¾ÄÚÈÝ. Èç¹ûÄãÑ¡ÔñÕâÖÖ·½Ê½, ÍÆ¼öÄ㽫VelocityÎļþ·ÅÔÚWEB-INFĿ¼ÏÂʹÆä²»¿É·ÃÎÊ.

ʹÓÃWebWorkVelocityServletÒâζ×ÅVelocityÄ£°æ¿ÉÒÔͨ¹ý¶Ô.vmÒ³ÃæµÄÇëÇó½øÐлæÖÆ. ÕâÒ²Òâζ×ÅÐèÒª¶ÔÄ£°æÊµÏÖ°²È«¼ì²é, ÒÔ±ãÓû§²»ÄÜÈÆ¹ý»î¶¯(Èç¹ûÕâÊDZØÐèµÄ)Ö±½Ó·ÃÎÊËü.

²»¹ÜÄãÑ¡ÔñÄÄÖÖ·½Ê½(ÄãÒ²¿ÉÒÔÑ¡ÔñͬʱʹÓÃÁ½ÖÖ·½Ê½), µ±Äã±àдģ°æÊ±²»½ö¿ÉÒÔʹÓÃÈ«²¿VelocityµÄÌØÐÔ, »¹¿ÉÒÔʹÓÃWebWorkÌṩµÄÆäËû¹¦ÄÜ. ÕâÀï¼ÙÉèÄãÒѾ­ÊìϤÁËVelocity, Òò´ËÎÒÃǽö¹Ø×¢WebWorkÌṩµÄÌØÐÔ. Èç¹ûÄã²»ÊìϤ, ÇåÔÚ¼ÌÐøÔĶÁ֮ǰ²ÎÔÄ'¿ªÊ¼VelocityÖ®ÂÃ'.

Ö÷ÒªÌØÐÔÊÇÌṩÁ˶ÔÖµÕ»ÖжÔÏó·½±ãµÄ·ÃÎÊ;¾¶, ÕâÀï°üº¬ÁËWebWork×Ô¶¯ÌṩµÄһЩÄÚÈÝ, ÒòΪÄãÔÚijЩµØ·½»á·¢ÏÖËüµÄ¼ÛÖµ. ÕâÊÇÖµÕ»Öаüº¬µÄ²¿·Ö¶ÔÏó:
- -
    -
  • µ±Ç°µÄHttpServletRequest;
  • -
  • µ±Ç°µÄHttpServletResponse;
  • -
  • µ±Ç°µÄOgnlValueStack;
  • -
  • Ò»¸öOgnlToolµÄʵÀý;
  • -
  • µ±Ç°»î¶¯ÀàµÄÈ«²¿ÊôÐÔ.
  • -

-Òª·ÃÎÊÖµÕ»ÖеÄÊý¾Ý, ÄãÖ»ÐëʹÓÃÊʵ±µÄVelocityÒýÓÃ:
- -
    -
  • $req = HttpServletRequest;
  • -
  • $res = HttpServletResponse;
  • -
  • $stack = OgnlValueStack;
  • -
  • $ognl = OgnlTool;
  • -
  • $name-of-property = property of the current action class.
  • -

-ÏÂÃæµÄÀý×ÓÍê³ÉÁËÓëµÚÈý¿ÎÏàͬµÄ¹¦ÄÜ, µ«ÊÇÏÖÔÚʹÓÃVelocityÄ£°æ×öΪ½á¹û. ÐèҪעÒâµÄÊÇ<property value="person" />±êÇ©±»Ìæ»»³É$personÒýÓÃ, Ëü·µ»ØÍ¬ÑùµÄÄÚÈÝ: »î¶¯ÀàµÄÒ»¸öÊôÐÔ. ±¾ÀýÖÐÎÒÃÇʹÓÃÁËvelocity½á¹ûÀàÐÍ·½Ê½.

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref name="defaultStack" /> 
		
		<!-- Action: Lesson 4.2: HelloAction using Velocity as result. -->
		<action name="helloVelocity" class="lesson03.HelloAction">
			<result name="error" type="dispatcher">ex01-index.jsp</result>
			<result name="success" type="velocity">ex01-success.vm</result>
		</action>
	</package>
</xwork>
-

HelloAction.java (ÓëµÚÈý¿ÎÏàͬ):

-
-
package lesson03;

import com.opensymphony.xwork.ActionSupport;

public class HelloAction extends ActionSupport {
	String person;
	public String getPerson() {
		return person;
	}
	public void setPerson(String person) {
		this.person = person;
	}
	public String execute() throws Exception {
		if ((person == null) || (person.length() == 0)) return ERROR;
		else return SUCCESS;
	}
}
-

ex01-index.jsp (ÓëµÚÈý¿ÎÏàͬ):

-
-
<html>
<head>
<title>WebWork Tutorial - Lesson 3 - Example 2</title>
</head>

<body>

<p>What's your name?</p>

<form action="hello.action" method="post">
<p><input type="text" name="person" /><input type="submit" /></p>
</form>

</body>
</html>
-

ex01-success.vm:

-
-
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.2 - Example 1</title> 
</head> 
<body> 

Hello, $person 

</body> 
</html>
-

- -
ÊÔÊÔÕâ¸öÀý×Ó!
-

ÔÚVelocityʹÓÃWebWorkµÄUI±êÇ©:

ÈçÄãËùÖª, ´ÓJSPת»»µ½VelocityʱʧȥÁËʹÓÃJSP±êÇ©µÄÄÜÁ¦. µ«WebWorkµÄVelocityServletÌṩһ¸ö·½·¨: ʹÓÃ#tag, #bodytagºÍ#paramVelocityºê¶¨Òå(velocimacros). Óï·¨ÈçÏÂ:
- -
-
#tag (name-of-tag list-of-attributes)
-

– »ò –

-
#bodytag (name-of-tag list-of-attributes)
	#param (key value)
	#param (key value)
...
#end
-

ÈÃÎÒÃǻعË4.1.1µÄ±íµ¥Ê¾ÀýÀ´ÑÝʾÔÚvelocityÖÐʹÓÃUI±êÇ©µÄÓ÷¨:

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref name="defaultStack" /> 
		
		<!-- Actions: Lesson 4.2: FormProcessingAction using Velocity. --> 
		<action name="formProcessingVelocityIndex" class="lesson04_02.FormProcessingIndexAction">
			<result name="success" type="velocity">ex02-index.vm</result>
		</action>
		<action name="formProcessingVelocity" class="lesson04_01_01.FormProcessingAction"> 
			<result name="input" type="velocity">ex02-index.vm</result> 
			<result name="success" type="velocity">ex02-success.vm</result> 
			<interceptor-ref name="validationWorkflowStack" /> 
		</action> 
	</package>
</xwork>
-

ex02-index.vm:

-
-
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.2 - Example 2</title> 
<style type="text/css"> 
  .errorMessage { color: red; } 
</style>   
</head> 

<body> 

<p>UI Form Tags Example using Velocity:</p> 

#bodytag (Form "action='formProcessingVelocity.action'" "method='post'") 
	#tag (Checkbox "name='checkbox'" "label='A checkbox'" "fieldValue='checkbox_value'") 
	#tag (File "name='file'" "label='A file field'") 
	#tag (Hidden "name='hidden'" "value='hidden_value'") 
	#tag (Label "label='A label'") 
	#tag (Password "name='password'" "label='A password field'") 
	#tag (Radio "name='radio'" "label='Radio buttons'" "list={'One', 'Two', 'Three'}") 
	#tag (Select "name='select'" "label='A select list'" "list={'One', 'Two', 'Three'}" 
		"emptyOption=true") 
	#tag (Textarea "name='textarea'" "label='A text area'" "rows='3'" "cols='40'") 
	#tag (TextField "name='textfield'" "label='A text field'") 
	#tag (Submit "value='Send Form'") 
#end 

</body> 
</html>
-

ex02-success.vm:

-
-
<html> 
<head> 
<title>WebWork Tutorial Lesson 4.2 - Example 2</title> 
</head> 

<body> 

<p>UI Form Tags Example result using Velocity:</p> 

<ul> 
	<li>checkbox: $!checkbox</li> 
	<li>file: $!file</li> 
	<li>hidden: $!hidden</li> 
	<li>password: $!password</li> 
	<li>radio: $!radio</li> 
	<li>select: $!select</li> 
	<li>textarea: $!textarea</li> 
	<li>textfield: $!textfield</li> 
</ul> 

</body> 
</html>
-

FormProcessingAction.java (Óë4.1.1Ïàͬ):

-
-
package lesson04_01_01;

import com.opensymphony.xwork.ActionSupport;

public class FormProcessingAction extends ActionSupport {
	private String checkbox;
	private String file;
	private String hidden;
	private String password;
	private String radio;
	private String select;
	private String textarea;
	private String textfield;
	
	public String getCheckbox() { return checkbox; }
	public String getFile() { return file; }
	public String getHidden() { return hidden; }
	public String getPassword() { return password; }
	public String getRadio() { return radio; }
	public String getSelect() { return select; }
	public String getTextarea() { return textarea; }
	public String getTextfield() { return textfield; }
	
	public void setCheckbox(String checkbox) { this.checkbox = checkbox; }
	public void setFile(String file) { this.file = file; }
	public void setHidden(String hidden) { this.hidden = hidden; }
	public void setPassword(String password) { this.password = password; }
	public void setRadio(String radio) { this.radio = radio; }
	public void setSelect(String select) { this.select = select; }
	public void setTextarea(String textarea) { this.textarea = textarea; }
	public void setTextfield(String textfield) { this.textfield = textfield; }
	
	public String execute() throws Exception {
		return SUCCESS;
	}
}
-

FormProcessingAction-validation.xml (Óë4.1.1Ïàͬ):

-
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 
1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">

<validators>
  <field name="checkbox">
    <field-validator type="requiredstring">
      <message>Please, check the checkbox.</message>
    </field-validator>
  </field>

  <field name="file">
    <field-validator type="requiredstring">
      <message>Please select a file.</message>
    </field-validator>
  </field>

  <field name="password">
    <field-validator type="requiredstring">
      <message>Please type something in the password field.</message>
    </field-validator>
  </field>

  <field name="radio">
    <field-validator type="requiredstring">
      <message>Please select a radio button.</message>
    </field-validator>
  </field>

  <field name="select">
    <field-validator type="requiredstring">
      <message>Please select an option from the list.</message>
    </field-validator>
  </field>

  <field name="textarea">
    <field-validator type="requiredstring">
      <message>Please type something in the text area.</message>
    </field-validator>
  </field>

  <field name="textfield">
    <field-validator type="requiredstring">
      <message>Please type something in the text field.</message>
    </field-validator>
  </field>
</validators>
-

- -
ÊÔÊÔÕâ¸öÀý×Ó!

ÉÏÃæµÄÀý×ÓûÓÐʹÓÃ#param±êÇ©. Òò´Ë, ÈÃÎÒÃǻعË4.1.1ÖеÄÁíÒ»¸öÀý×Ó - ¶¨ÖÆ×é¼þ:

ex03.vm:

-
-
<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.2 - Example 3</title> 
</head> 

<body> 

<p>Custom Component Example:</p> 

<p> 
#bodytag (Component "template=datefield.vm") 
	#param ("label" "Date") 
	#param ("name" "mydatefield") 
	#param ("size" "3") 
#end 
</p> 

</body> 
</html>
-

/template/xhtml/datefield.vm (Óë4.1.1Ïàͬ):

-
-
#set ($name = $parameters.get('name')) 
#set ($size = $parameters.get('size')) 
#set ($yearSize = $size * 2) 

$parameters.get('label'): 
<input type="text" name="${name}.day" size="$size" /> / 
<input type="text" name="${name}.month" size="$size" /> / 
<input type="text" name="${name}.year" size="$yearSize" /> (dd/mm/yyyy)
-

×¢Òâ, Õâ´ÎÎÒÃÇûÓÐÏñʹÓÃJSP±êÇ©ÄÇÑù½«DateºÍmydatefieldÓõ¥ÒýºÅ¿òÆðÀ´.

ÊÔÊÔÕâ¸öÀý×Ó!


ÉÏÒ»¿Î | ÏÂÒ»¿Î
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson04-03.html b/docs/chinese/wikidocs/TutorialLesson04-03.html deleted file mode 100644 index a99633f79..000000000 --- a/docs/chinese/wikidocs/TutorialLesson04-03.html +++ /dev/null @@ -1,71 +0,0 @@ - - - WebWork 2 : TutorialLesson04-03 - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

Lesson 4.3: Using Freemarker with WebWork

Freemarker is a powerfull template engine that competes with Velocity. You can learn more about it in the project's homepage: http://freemarker.sourceforge.net.

First of all, to use Freemarker with Webwork, you have to place the freemarker.jar in your WEB-INF\lib folder. You can download the distribution here.

After that, just configure web.xml and start writing your templates, as explained below. -

web.xml:

To use Freemarker as the view, you need to modify web.xml and add a servlet and a servlet mapping for FreemarkerServlet, as demonstrated below:
- -
-
<servlet>
	<servlet-name>freemarker</servlet-name>
	<servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>
		<!-- FreemarkerServlet settings: -->
		<init-param>
			<param-name>TemplatePath</param-name>
			<param-value>/</param-value>
		</init-param>
		<init-param>
			<param-name>NoCache</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>ContentType</param-name>
			<param-value>text/html</param-value>
		</init-param>
		<init-param>
			<param-name>default_encoding</param-name>
			<param-value>ISO-8859-1</param-value>
		</init-param>
		<init-param>
			<param-name>number_format</param-name>
			<param-value>0.##########</param-value>
		</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping> 
	<servlet-name>freemarker</servlet-name> 
	<url-pattern>*.ftl</url-pattern> 
</servlet-mapping>
-

The configuration above means that Freemarker templates can be rendered through requests to .ftl pages. That also means that you should implement security checks in your templates so an user doesn't access it directly without going through an action first (if that is required). But you can always place your Freemarker files under WEB-INF so they become unaccessible to direct requests. We will use the latter approach in our examples.

Inside a Freemarker template, you will have access to every object managed by WebWork with the following syntax:
- -
    -
  • $stack = OgnlValueStack;
  • -
  • $webwork = FreemarkerWebWorkUtil, a toolbox providing services like formatting url, accessing the value stack, etc;
  • -
  • $name-of-property = property retrieved from the value stack. If that fails, it looks up an attribute with that name in the HttpServletRequest, HttpSession and ServletContext, in that order;
  • -
  • $Request = HttpServletRequest;
  • -
  • $Session = HttpServletResponse;
  • -
  • $Application = OgnlValueStack.
  • -

-The example below does the same thing as example 2 from lesson 3, but now, using Freemarker templates. -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref name="defaultStack" /> 
		
		<!-- Action: Lesson 4.3: HelloAction. -->
		<action name="indexFreemarker" class="com.opensymphony.xwork.ActionSupport">
			<result name="success" type="dispatcher">/WEB-INF/ftl/lesson3/index.ftl</result>
		</action>

		<action name="helloFreemarker" class="lesson03.HelloAction">
			<result name="error" type="dispatcher">/WEB-INF/ftl/lesson3/index.ftl</result>
			<result name="success" type="dispatcher">/WEB-INF/ftl/lesson3/success.ftl</result>
		</action>
	</package>
</xwork>
-

HelloAction.java (same as lesson 3):

-
-
package lesson03;

import com.opensymphony.xwork.ActionSupport;

public class HelloAction extends ActionSupport {
	String person;
	public String getPerson() {
		return person;
	}
	public void setPerson(String person) {
		this.person = person;
	}
	public String execute() throws Exception {
		if ((person == null) || (person.length() == 0)) return ERROR;
		else return SUCCESS;
	}
}
-
-

ex02-index.ftl

-
-
<#assign ww=JspTaglibs["/WEB-INF/lib/webwork.tld"] />

<html>
<head>
<title>WebWork Tutorial - Lesson 4.3 - Example 1</title>
</head>

<body>

<p>Click <a href="${wwUtil.buildUrl('indexFreemarker.action')}">here</a> to reload this page.</p>

<@ww.form name="'nameForm'" action="'helloFreemarker.action'" method="'POST'">
	<@ww.textfield label="'What is your name ?'" name="'person'" value="person" size="20"/>
	<@ww.submit name="'submit'" value="'Submit'"/>
</@ww.form>

</body>
</html>
-

If you don't want to use WebWork's UI Tags, you could do it like this:

ex02-index-notags.ftl

-
-
<html>
<head>
<title>WebWork Tutorial - Lesson 4.3 - Example 1</title>
</head>

<body>

<p>Click <a href="${wwUtil.buildUrl('indexFreemarker.action')}">here</a> to reload this page.</p>

<form name="nameForm" action="${wwUtil.buildUrl('helloFreemarker.action')}" method="POST">
	What is your name ? 
	<input type="text" name="person" value="${person}" size="20">
	<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
-

However, if you choose no to use tags, it's recommended that you use Freemarker Macros to write the form elements. -

ex02-success.ftl:

-
-
<#assign ww=JspTaglibs["/WEB-INF/lib/webwork.tld"] />

<html> 
<head> 
<title>WebWork Tutorial - Lesson 4.3 - Example 1</title> 
</head> 
<body> 

Come from the property WW tag (taglibs support) : <@ww.property value="person"/> <br>
Come from the Freemarker lookup in the WW stack : ${person}

</body> 
</html>
-

You can use either WebWork property tag or the Freemarker $person reference. Both of them return the same thing: a property from the action class.


Previous Lesson | Next Lesson
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson04.html b/docs/chinese/wikidocs/TutorialLesson04.html deleted file mode 100644 index ee4d72200..000000000 --- a/docs/chinese/wikidocs/TutorialLesson04.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork 2 : TutorialLesson04 - - - - - - - - - -
- -
- This page last changed on May 31, 2004 by vitorsouza. -
- -

µÚËÄ¿Î: ÊÓͼ

Äã¿ÉÒÔ½«¶àÖÖ²»Í¬µÄ¼¼Êõ×÷ΪÊÓͼ, Ò²¾ÍÊÇ´´½¨Óû§½çÃæ: -

4.1 - Java Server Pages

JSPÊÇͨ³£µÄÑ¡Ôñ, ÒòΪ´ó²¿·ÖJava¿ª·¢ÕßÒѾ­ÊìϤÕâÒ»¼¼Êõ. ±¾½Ú¼Ù¶¨ÄãÒѾ­¾ß±¸JSP¿ª·¢¾­Ñé, ÑÝʾÈçºÎʹÓÃWebWorkµÄÌØÐÔ, Ö÷ÒªÊÇʹÓÃWebWork±êÇ©.

Ìø×ªµ½ 4.1

4.2 - Velocity

VelocityÊÇÒ»¸ö»ùÓÚJavaµÄÄ£°æÒýÇæ, ÌṩÁËÒ»¸ö¼òµ¥È´Ç¿´óµÄÄ£°æÓïÑÔÓÃÒÔÌæ´úJSP²¢ÔÊÐí·ÖÀë¹Ø×¢µã. ±¾½Ú¼Ù¶¨ÄãÒѾ­ÊìϤÁËVelocity, ²¢½éÉÜÈçºÎÓ¦ÓÃWebWorkÌØÐÔ.

Ìõתµ½4.2 -

4.3 - Freemarker

FreemarkerÊÇΪMVCģʽÉè¼ÆµÄÁíÒ»¸ö»ùÓÚJavaµÄÄ£°æÒýÇæÌṩÁËÇ¿´óµÄÄ£°æÓïÑÔÓÃÒÔ´úÌæJSP, µ«¿ÉÒÔͨ¹ý¶ÔJSP±êÇ©¿âµÄÖ§³Ö±£ÁôÓëJSPµÄ¼æÈÝ. ±¾½Ú½éÉÜÈçºÎ½«WebWorkºÍFreemarker½áºÏʹÓÃ.

Ìø×ªµ½4.3


ÉÏÒ»¿Î | ÏÂÒ»¿Î

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/TutorialLesson05.html b/docs/chinese/wikidocs/TutorialLesson05.html deleted file mode 100644 index 9bf0a5b00..000000000 --- a/docs/chinese/wikidocs/TutorialLesson05.html +++ /dev/null @@ -1,85 +0,0 @@ - - - WebWork 2 : TutorialLesson05 - - - - - - - - - -
- -
- This page last changed on Sep 16, 2004 by vitorsouza. -
- -

µÚÎå¿Î: ½ØÈ¡Æ÷(Interceptors)

½ØÈ¡Æ÷¿ÉÒÔ½«ÈÎÒâ´úÂë°üº¬ÔÚµ÷ÓÃÕ»ÖлִÐÐǰ»òÖ®ºó, Ëü¿ÉÒÔ¼«´óµÄ¼ò»¯´úÂëͬʱÌṩÔöÇ¿´úÂ븴ÓÃÄÜÁ¦. XWorkºÍWebWorkµÄÐí¶àÌØÐÔ¶à×÷Ϊ½ØÈ¡Æ÷ʵÏÖ, ¿ÉÒÔºÍÄã×Ô¼ºµÄÀ¹½ØÆ÷Ò»Æðͨ¹ýÍⲿÅäÖÃÈÎÒâÖ¸¶¨Ë³Ðò²¢ÅäÖÃÔÚÈÎÒâ»î¶¯ÉÏ.

»»ÑÔÖ®, µ±Äã·ÃÎÊÒ»¸ö*.actionµÄµØÖ·, WebWorkµÄ class="monospaced">ServletDispatcherÖ´ÐÐÒ»¸ö»î¶¯µ÷ÓÃ. ÔڻִÐÐǰ, ÕâÒ»µ÷ÓÿÉÒÔ±»ÁíÒ»¸ö¶ÔÏó½ØÈ¡, Õâ¸ö¶ÔÏó¾Í³ÆÎª½ØÈ¡Æ÷. ÒªÏëÔÚÒ»¸ö»î¶¯Ö´ÐÐ֮ǰ(»òÖ®ºó)ÉèÖÃÒ»¸ö½ØÈ¡Æ÷, Ö»ÐèÕýÈ·ÅäÖÃxwork.xml, ÈçÏÂÀýËùʾ, ½èÓÃ×Ô4.1.1:

4.1.1ÖеĽØÈ¡Æ÷ÅäÖÃ:

-
-
<action name="formProcessing" class="lesson04_01_01.FormProcessingAction"> 
	<result name="input" type="dispatcher">ex01-index.jsp</result> 
	<result name="success" type="dispatcher">ex01-success.jsp</result> 
	<interceptor-ref name="validationWorkflowStack" /> 
</action>
-

ÈçÄãËù¼û, 4.1.1ÖеĻformProcessingʹÓÃÁËvalidationWorkflowStack. ËüÊÇÒ»¸ö½ØÈ¡Æ÷Õ», Õ»Öа´ÕÕ½ØÈ¡Æ÷µÄÖ´ÐÐ˳Ðò½øÐÐ×éÖ¯. Õâ¸ö½ØÈ¡Æ÷Õ»¶¨ÒåÔÚwebwork-default.xml, ÕâÑùÎÒÃÇÐèÒª×öµÄ¾ÍÊÇÔڻÅäÖõÄ<interceptor-ref />»ò°üÅäÖÃÖеÄ<default-interceptor-ref />ÖÐÉùÃ÷, ¾ÍÏñµÚÈý¿ÎµÄµÚÒ»¸öÀýÒ»Ñù:

3.1ÖеĽØÈ¡Æ÷ÅäÖÃ:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref name="defaultStack" /> 
		
		<!-- Action: Lesson 03: HelloWebWorldAction. --> 
		<action name="helloWebWorld" class="lesson03.HelloWebWorldAction"> 
			<result name="success" type="dispatcher">ex01-success.jsp</result> 
		</action> 
	</package>
</xwork>
-

ÈÃÎÒÃÇÏÈ¿´¿´ËüÊÇÈçºÎ¹¤×÷µÄ:

    -
  1. ´´½¨Ò»¸ö½ØÈ¡Æ÷Àà, ËüʵÏÖÁËcom.opensymphony.xwork.interceptor.Interceptor½Ó¿Ú (°üº¬ÔÚxwork-1.0.jarÖÐ);
  2. -
  3. ÔÚXMLÅäÖÃÎļþ(xwork.xml)ÖÐʹÓÃǶÌ×ÔÚ<interceptors />ÖеÄÔªËØ<interceptor />ÉùÃ÷¸ÃÀà;
  4. -
  5. ʹÓÃ<interceptor-stack />ÔªËØ(¿ÉÑ¡µÄ)´´½¨½ØÈ¡Æ÷Õ»;
  6. -
  7. ʹÓÃ<interceptor-ref /> »ò<default-interceptor-ref />¾ö¶¨»î¶¯Ê¹ÓÃÄÇЩ½ØÈ¡Æ÷. Õâ¸öÑù°å¶¨ÒåÁ˸ýØÈ¡Æ÷±»ÓÃÓÚÒ»¸öÖ¸¶¨µÄ»î¶¯, ¶øÖ®ºóÖ¸¶¨È±Ê¡½ØÈ¡Æ÷Õ»ÓÃÓÚÄÇЩûÓÐÖ¸¶¨<interceptor-ref />µÄ»î¶¯.
  8. -

-ÉîÈë¹Û²ìwebwork-default.xmlÎÒÃÇ¿ÉÒÔ·¢ÏÖÕâÊÇÔõÑù×öµ½µÄ:

webwork-default.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<package name="webwork-default">
		<result-types>
			<result-type name="dispatcher" default="true"
				class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"/>
			<result-type name="redirect" 
				class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
			<result-type name="velocity" 
				class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
			<result-type name="chain" 
				class="com.opensymphony.xwork.ActionChainResult"/>
			<result-type name="xslt" 
				class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
		</result-types>
	
		<interceptors>
			<interceptor name="timer" 
				class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
			<interceptor name="logger" 
				class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
			<interceptor name="chain" 
				class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
			<interceptor name="static-params" 
				class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
			<interceptor name="params" 
				class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
			<interceptor name="model-driven" 
				class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
			<interceptor name="component" 
				class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
			<interceptor name="token" 
				class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
			<interceptor name="token-session" 
				class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
			<interceptor name="validation" 
				class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
			<interceptor name="workflow" 
				class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
			<interceptor name="servlet-config" 
				class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
			<interceptor name="prepare" 
				class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
			<interceptor name="conversionError" 
				class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
			<interceptor-stack name="defaultStack">
				<interceptor-ref name="static-params"/>
				<interceptor-ref name="params"/>
				<interceptor-ref name="conversionError"/>
			</interceptor-stack>
			<interceptor-stack name="validationWorkflowStack">
				<interceptor-ref name="defaultStack"/>
				<interceptor-ref name="validation"/>
				<interceptor-ref name="workflow"/>
			</interceptor-stack>
		</interceptors>
	</package>
</xwork>
-

ÓÉÓÚÔÚxwork.xmlÖаüº¬ÁËwebwork-default.xml, ÉÏÊöÈ«²¿½ØÈ¡Æ÷ºÍÕ½¶·¿ÉÒÔÓÃÓÚÎÒÃǵĻ. ÏÂÃæÁгöÕâЩ½ØÈ¡Æ÷µÄ¹¦ÄÜ:
- -
    -
  • timer: ¶Ô»î¶¯(°üº¬Ç¶Ì׵ĽØÈ¡Æ÷ºÍÊÓͼ)Ö´ÐнøÐмÆÊ±;
  • -
  • logger: ¼Í¼½«ÒªÖ´ÐеĻ;
  • -
  • chain: ʹµÃǰһ¸ö»î¶¯µÄÊôÐÔÔÚµ±Ç°»î¶¯ÖпÉÓÃ. ÓÃÓÚʵÏֻÁ´(action chaining) (²ÎÔÄ: ½á¹ûÀàÐÍ);
  • -
  • static-params: ½«xwork.xmlÖж¨ÒåµÄ²ÎÊýÉèÖõ½»î¶¯ÖÐ. Ï൱ÓÚ°üº¬ÔÚ<action />±êÇ©ÖеÄ<param />±êÇ©;
  • -
  • params: ½«ÇëÇó(POSTºÍGET)µÄ²ÎÊýÉèÖõ½»î¶¯ÀàÖÐ. ÔÚµÚÈý¿ÎÖÐÓÐÕâÑùµÄÀý×Ó;
  • -
  • model-driven: Èç¹û»î¶¯ÊµÏÖModelDriven, ½«getModel()µÄ½á¹ûѹÈëÖµÕ»;
  • -
  • component: ¼¤»î×¢²áµÄ×é¼þ²¢ÔÊÐí»î¶¯Ê¹ÓÃ. (²Î¼û: [IoCÓë×é¼þ]);
  • -
  • token: ÔڻÖмì²éºÏ·¨ÁîÅÆ(token), ·ÀÖ¹±íµ¥µÄÖØ¸´Ìá½»;
  • -
  • token-session: ͬÉÏ, µ«ÊÇÔÚ½Óµ½·Ç·¨ÁîÅÆÊ±½«Ìá½»µÄÊý¾Ý±£´æÔÚsessionÖÐ;
  • -
  • validation: ʹÓö¨ÒåÔÚ{Action}-validation.xmlÖеÄУÑéÆ÷½øÐÐУÑé(²Î¼û: УÑé). ÔÚ4.1.1ÖÐÓÐÕâÑùµÄÀý×Ó;
  • -
  • workflow: µ÷ÓûÀàÖеÄvalidate·½·¨. Èç¹û»î¶¯²úÉúÁË´íÎ󽫷µ»Øµ½ÊäÈëÊÓͼ. Ó¦µ±ÓëУÑé½ØÈ¡Æ÷Ò»ÆðʹÓÃ(²Î¼û: УÑé);
  • -
  • servlet-config: Ìṩ·ÃÎÊHttpServletRequestºÍHttpServletResponseµÄ;¾¶(ʹÓÃǰÇëÈý˼, ÒòΪËüʹÄãµÄ´úÂëÓëServlet½Ó¿Ú°ó¶¨ÔÚÒ»Æð);
  • -
  • prepare: ÔÊÐíÔÚ²ÎÊýÉèÖÃ֮ǰͨ¹ý´úÂë·ÃÎʻ.;
  • -
  • conversionError: ´Ë´¦ÐèÒª°ïÖú.
  • -

¹¹½¨×Ô¼ºµÄ½ØÈ¡Æ÷

Èç¹ûÉÏÊö½ØÈ¡Æ÷¶¼²»·ûºÏÄãµÄÌØÊâÐèÒª, ÄãÐèҪʵÏÖ×Ô¼ºµÄ½ØÈ¡Æ÷. ÐÒÔ˵ÄÊÇ, ÕâÊÇÒ»¸ö·Ç³£ÈÝÒ×Íê³ÉµÄÈÎÎñ. ¼Ù¶¨ÎÒÃÇÐèÒªÒ»¸ö½ØÈ¡Æ÷¸ù¾Ý²»Í¬µÄʱ¶Î(Ô糿, ÏÂÎç»òÍíÉÏ)ÔÚsessionÖзÅÈë¶ÔÓ¦µÄÎʺòÓï. ÏÂÎÄչʾÁËÈçºÎʵÏÖËü:

GreetingInterceptor.java:

-
-
package lesson05;

import java.util.Calendar;
import com.opensymphony.xwork.interceptor.Interceptor;
import com.opensymphony.xwork.ActionInvocation;

public class GreetingInterceptor implements Interceptor {
	public void init() { }
	public void destroy() { }
	public String intercept(ActionInvocation invocation) throws Exception {
		Calendar calendar = Calendar.getInstance();
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		String greeting = (hour < 6) ? "Good evening" : 
			((hour < 12) ? "Good morning": 
			((hour < 18) ? "Good afternoon": "Good evening"));

		invocation.getInvocationContext().getSession().put("greeting", greeting);

		String result = invocation.invoke();

		return result;
	}
}
-

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<interceptors> 
			<interceptor name="greeting" class="section02.lesson05.GreetingInterceptor" /> 
		</interceptors> 
		
		<!-- Action: Lesson 5: GreetingInterceptor. --> 
		<action name="greetingAction" class="lesson05.GreetingAction"> 
			<result name="success" type="velocity">ex01-result.vm</result> 
			<interceptor-ref name="greeting" /> 
		</action> 
	</package>
</xwork>
-

GreetingAction.java:

-
-
package lesson05;

import com.opensymphony.xwork.ActionSupport;

public class GreetingAction extends ActionSupport {
	public String execute() throws Exception {
		return SUCCESS;
	}
}
-

ex01-result.vm:

-
-
<html>
<head>
<title>WebWork Tutorial - Lesson 5 - Example 1</title>
</head>
<body>

#set ($ses = $req.getSession())
<p><b>${ses.getAttribute('greeting')}!</b></p>

</body>
</html>
-

ÏÈÀ´¿´Ò»Ï½ØÈ¡Æ÷Àà. ºÍ֮ǰ½éÉܵÄÒ»Ñù, ½ØÈ¡Æ÷±ØÐëʵÏÖcom.opensymphony.xwork.interceptor.InterceptorµÄ·½·¨: init(), ½«ÔÚ³õʼ»¯Ê±±»µ÷ÓÃ, destroy(), ÔÚÏú»Ùʱ±»µ÷ÓÃ, ×îÎªÖØÒª, intercept(ActionInvocation invocation), ¸Ã·½·¨ÊǼÓÈ빤×÷´úÂëµÄµØ·½.

×¢Òâ, ÎÒÃǵĽØÈ¡Æ÷·µ»Øinvocation.invoke()µÄ½á¹û, ¸Ã·½·¨½«Ö´ÐÐÕ»ÖÐÏÂÒ»¸ö½ØÈ¡Æ÷, Èç¹û±¾½ØÈ¡Æ÷ÊÇÕ»ÖеÄ×îºóÒ»¸ö, ½«Ö´Ðл. ÕâÒâζ׎ØÈ¡Æ÷ÓжÌ·(short-circuiting)»î¶¯µ÷ÓõÄÄÜÁ¦, ¿ÉÒÔ¸ù±¾²»Ö´Ðлֱ½Ó·µ»ØÒ»¸öString½á¹û! ÕâÖÖÓ÷¨ÐèÒª½÷É÷ʹÓÃ.

½ØÈ¡Æ÷µÄÁíÒ»¸ö¹¦ÄÜÊÇÔڻִÐкóÖ´ÐдúÂë. Ϊ´Ë, Ö»Ð轫´úÂë·ÅÔÚinvocation.invoke()µ÷ÓÃÖ®ºó. WebWorkÌṩһ¸öÒѾ­ÊµÏÖÏÂÁÐÐÐΪµÄ³éÏóÀà: com.opensymphony.xwork.interceptor.AroundInterceptor. Ö»Ðë¼Ì³Ð(extend)¸ÃÀಢʵÏÖ·½·¨before(ActionInvocation invocation)ºÍafter(ActionInvocation dispatcher, String result).

xwork.xmlÖйØÓڻÀàºÍ½á¹ûÒ³ÃæµÄÅäÖÃÄÚÈݼò½àÃ÷Á˲»ÐèÒª½øÒ»²½½âÊÍ.
- -
ÊÔÊÔÕâ¸öÀý×Ó!
-


ÉÏÒ»¿Î | Ö¸ÄϽáÊø
- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Type Conversion.html b/docs/chinese/wikidocs/Type Conversion.html deleted file mode 100644 index 30e5029ef..000000000 --- a/docs/chinese/wikidocs/Type Conversion.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork 2 : ÀàÐÍת»» - - - - - - - - - -
- -
- This page last changed on Nov 14, 2004 by plightbo. -
- -

¸ÐлXWorkÈÃWebWorkÓµÓзdz£ÏȽøµÄÀàÐÍת»»ÄÜÁ¦. ¸ü¶àÄÚÈݲμûType Conversion.

Ò»¸ö¼òµ¥µÄÀý×Ó

µ±ÄãÐèÒª½«Ò»¸ö×Ö·û´®×ª»»³ÉΪһ¸ö¸üΪ¸´ÔӵĶÔÏóʱ, ÀàÐÍת»»ÄÜ·¢»ÓÇ¿´óµÄ×÷ÓÃ. ÓÉÓÚWebÊÇÀàÐͲ»¿ÉÖªµÄ(type-agnostic)(HTTPÖÐÈκÎÀàÐͶ¼ÊÇ×Ö·û´®), Òò´ËWebWorkµÄÀàÐÍת»»¹¦Äܷdz£ÓÐÓÃ. ÀýÈç, Èç¹ûÄãÌáʾÓû§Ê¹ÓÃ×Ö·û´®¸ñʽ("3, 22")ÊäÈëÒ»¸ö×ø±ê, ÄãÐèÒªÈÃWebWorkÍê³ÉStringµ½PointºÍPointµ½StringµÄת»».

-

×ܻᷢÉúת»»´íÎó(ÀýÈçÓû§ÊäÈë´íÎóµÄ¸ñʽ). WebWorkͨ¹ýXWorkÀàÐÍת»»´íÎó´¦Àí»úÖÆÀ´´¦ÀíËü.

-

ʹÓÃ"point"µÄÀý×Ó, Èç¹û»î¶¯(»òÕ߯äËûÐèÒªÉèÖÃÊôÐÔµÄ×éºÏ¶ÔÏó)ÓÐÒ»¸ö¶ÔÓ¦µÄclassName-conversion.propertiesÎļþ, WebWork»áʹÓÃÅäÖõÄÀàÐÍת»»Æ÷½øÐиÃÀàºÍ×Ö·û´®µÄת»». Òò´Ë½«"3, 22"ת»»³Énew Point(3, 22)Ö»ÐèÔÚClassName-conversion.propertiesÖмÓÈëÏÂÁÐÄÚÈÝ:

-
point = com.acme.PointConverter
# ×¢Òâ: PointerConverter±ØÐèʵÏÖognl.TypeConverter 
#          »ò¼Ì³Ðognl.DefaultTypeConverter
-

Äã±àдµÄÀàÐÍת»»Æ÷±ØÐë¼ì²é±»ÓÃÓÚת»»ÄÄÖÖÀàÐÍ. ÓÉÓÚÈ«²¿ÊÇÓëString½øÐÐÏ໥ת»», ÐèÒª½«×ª»»·½·¨·ÖΪÁ½²¿·Ö: Ò»¸ö½«Stringת»»ÎªPoint, ÁíÒ»¸ö½«Pointת»»ÎªString.

ÕâЩÍê³Éºó, Äã¿ÉÒÔÒýÓÃpoint¶ÔÏó(<ww:property value="point"/>)²¢ÇÒËü½«Êä³öΪ"3, 22". ͬÑùµÄ, Èç¹ûÄ㽫ËüÌá½»µ½»î¶¯, Ëü½«ÔÙ´Îת»»³ÉPoint.

×¢Òâ: ÀàÐÍת»»²»ÄÜ×÷Ϊi18nµÄÌæ´úÆ·. ²»ÍƼöʹÓÃÕâÒ»ÌØÐÔÊä³öÏàÓ¦µÄÈÕÆÚ¸ñʽ. Ïà·´, ÄãÓ¦¸ÃʹÓÃWebWorkµÄi18n¹¦ÄÜ(²¢ÇÒÑо¿Ò»ÏÂJDKÖÐMessageFormatµÄJavaDoc)À´Á˽âÈçºÎʹÓÃÏàÓ¦ÕýÈ·µÄÈÕÆÚ¸ñʽ.

°ïÖúÀà/a>

-WebWork¸½´øÁËÒ»¸ö°ïÖúÀàÒÔ±ã¸üÈÝÒ×ʵÏÖÀàÐÍת»». ¸ÃÀàÊÇcom.opensymphony.webwork.util.WebWorkTypeConverter. Ëü±àдÀàÐÍת»»Æ÷¸ü¼ÓÈÝÒ×. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/UI Tags.html b/docs/chinese/wikidocs/UI Tags.html deleted file mode 100644 index 0240dc416..000000000 --- a/docs/chinese/wikidocs/UI Tags.html +++ /dev/null @@ -1,89 +0,0 @@ - - - WebWork 2 : UI±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Çëµã»÷Click±êÇ©ÒԲ鿴¹ØÓڸñêÇ©µÄ¸ü¶àÐÅÏ¢. ÐèҪעÒâµÄÊÇËùÓеÄUI±êÇ©¶¼ÒÀ¿¿ÖµÕ»ÔËÐÐ, Òò´ËÄãÐèÒª½«×Ö·û´®ÖµÓÃ(µ¥)ÒýºÅÀ¨ÆðÀ´.

ÕâЩ±êÇ©µÄ×îÖÕ»æÖƽá¹û¿ÉÒÔ½øÐж¨ÖÆ. ±êǩģ°æµÄλÖÃÓÉwebwork.propertiesÎļþÖеÄÊôÐÔwebwork.ui.theme¶¨Òå. ²Î¼ûÖ÷ÌâºÍÄ£°æÒÔÁ˽â¸ü¶àÐÅÏ¢.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ãû³Æ ±êÇ© ÃèÊö
¸´Ñ¡¿ò <ww:checkbox /> »æÖÆÒ»¸ö¸´Ñ¡¿òÊäÈë×Ö¶Î
¸´Ñ¡¿òÁбí <ww:checkboxlist /> »æÖÆÒ»¸ö¸´Ñ¡¿òÁбí
×éºÏ¿ò <ww:combobox /> Ò»¸öÑ¡ÏîÁбíºÍÒ»¸öÎı¾¿òµÄ×éºÏ×é¼þ
×é¼þ <ww:component /> »æÖÆÒ»¸ö¶¨ÖƵÄUI×é¼þ
ÎļþÊäÈë¿ò <ww:file /> »æÖÆÒ»¸öÎļþÑ¡ÔñÊäÈë×Ö¶Î
±íµ¥ <ww:form /> ¶¨ÒåÒ»¸öÊäÈë±íµ¥
Òþ²Ø <ww:hidden /> »æÖÆÒ»¸öÒþ²Ø×Ö¶Î
Îı¾±êÇ© <ww:label /> »æÖÆÒ»¸öÎı¾±êÇ©, ÏÔʾֻ¶ÁÐÅÏ¢
ÃÜÂë <ww:password /> »æÖÆÒ»¸öÃÜÂëÊäÈë×Ö¶Î
µ¥Ñ¡°´Å¥(Radio) <ww:radio /> »æÖÆÒ»¸öµ¥Ñ¡°´Å¥
Ñ¡ÏîÁбí <ww:select /> »æÖÆÒ»¸öÑ¡ÏîÁбíÔªËØ
Ìá½»°´Å¥ <ww:submit /> »æÖÆÒ»¸öÌá½»°´Å¥
±í¸ñ <ww:table />»æÖÆÒ»¸ö±í¸ñ
Ñ¡Ï(TabbedPane) <ww:tabbedpane /> »æÖÆÒ»¸öÑ¡Ï
Îı¾Óò <ww:textarea /> »æÖÆÒ»¸öÎı¾Óò
Îı¾¿ò <ww:textfield /> »æÖÆÒ»¸öÎı¾¿ò
ÁîÅÆ <ww:token /> ·ÀÖ¹±íµ¥Öظ´Ìá½»
¹ú¼Ê»¯±êÇ©
I18n <ww:i18n /> ½«×ÊÔ´°ü·ÅÈëÕ»ÖÐ
Text <ww:text /> »æÖÆ×ÊÔ´°üÖеÄ×Ö·û´®

×¢Òâ

-´ó²¿·ÖUI±êÇ©µÄ'required'ÊôÐÔÔÚȱʡÇé¿öϲ¢²»ÊDZØÒªµÄ, ½öµ±¸ÃÊäÈë×Ö¶ÎʹÓÃУÑéÆ÷²¢¼¤»îÁ˿ͻ§¶ÎУÑéµÄÇé¿öʱ²ÅÐèÒªÉèÖÃ. -

- -
-±ØÐè×¢ÒâµÄÊÇËùÓн«Ä³Ð©Öµ±£´æÔÚÖµÕ»µÄ±êÇ©(Èçi18n»òbean)¶¼½«ÔÚ±êÇ©½áÊøÊ±´ÓÖµÕ»Öн«ËüÃÇɾ³ý. -. ÕâÒâζ×Å, Èç¹ûÄãÓÃbean±êǩʵÀý»¯Ò»¸öbean(), ¸Ãbean½öÔÚ±êǩ֮ǰ²ÅÄÜÔÚÖµÕ»ÖзÃÎÊ. -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/URL tag.html b/docs/chinese/wikidocs/URL tag.html deleted file mode 100644 index 8b1a99b3e..000000000 --- a/docs/chinese/wikidocs/URL tag.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork 2 : URL±êÇ© - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

URL±êÇ©¹¹ÔìÒ»¸ö±àÂëµÄURL. Èç¹û²»Ö¸¶¨Öµ, ½«¸ø³öµ±Ç°Ò³ÃæµÄURL.

- - - - - - - - - - - - - - - -
ÊôÐÔ ±ØÐèÃèÊö
value·ñÏò±êÇ©´«µÝÊý¾Ý.
id·ñ Èç¹ûÖ¸¶¨id, ½«²»Êä³öURL¶øÊ¹ÓÃid×÷Ϊ¼üÖµ½«Ëü±£´æÔÚActionContextÖÐ
scheme·ñ¿ÉÒÔÊÇ"http"»ò"https"
includeContext ·ñ¾ö¶¨ÊÇ·ñ½«»·¾³Â·¾¶¼ÓÔÚ¾ø¶Ô·¾¶Ç°Ãæ. ȱʡֵÊÇfalse
encode ·ñ¾ö¶¨ÊÇ·ñ¶ÔÄÚÈݽøÐбàÂë
includeParams ·ñ¸Ã²ÎÊý¿ÉÒÔʹÓÃÖµ'none' (no params), 'get'(½ö°üº¬GET²ÎÊý)»ò'all'(°üÀ¨GETºÍPOST²ÎÊý). It is used when the url tag is used without a value or page attribute. Its value is looked up on the ValueStack. Èç¹ûûÓÐÖ¸¶¨½«Ê¹ÓÃ'get'.

-±¾ÀýÖÐ, ±íµ¥µÄactionÊôÐÔhiturl.action½«±»±àÂë.
- -
-
<form action="<ww:url value="'hiturl.action'"/>" method="POST">
    ...
  </form>
-

±¾ÀýÖÐ, ÔÚURLÖÐÔö¼ÓÁËÃûÖµ¶Ô. URL½«×¼È·¹¹ÔìURL. Ò²¿ÉÒÔʹÓÃͨ³£µÄ·½Ê½"?"; i.e., - 'hiturl.action?user=john'.

-
<form action="<ww:url value="'hiturl.action'">
      <ww:param name="'user'" value="'john'"/>
   </ww:url>" method="POST">
...
</form>
-

ȱʡÇé¿öÏÂ, 80¶Ë¿Ú×÷Ϊ"http"¶Ë¿Ú, 443¶Ë¿Ú×÷Ϊ"https"¶Ë¿Ú. ÎÞÂÛÈçºÎ, ijЩ·þÎñÆ÷, ÈçTomcat, ʹÓò»Í¬µÄȱʡ¶Ë¿Ú, Èç8080ºÍ8443. ¿ÉÒÔͨ¹ýÐÞ¸Äwebwork.propertiesÎļþÖеÄÅäÖÃÏîÀ´¸Ä±äËü: -

    -
  • webwork.url.http.port
  • -
  • webwork.url.https.port
  • -

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 1.4.html b/docs/chinese/wikidocs/Upgrading from 1.4.html deleted file mode 100644 index d18252cf2..000000000 --- a/docs/chinese/wikidocs/Upgrading from 1.4.html +++ /dev/null @@ -1,121 +0,0 @@ - - - WebWork 2 : Upgrading from 1.4 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Package changes

-Webwork1.x was seperated into two projects, XWork and Webwork. From this, several classes have been moved to different package names. -
    -
  • ActionSupport has moved from webwork.ActionSupport to com.opensymphony.xwork.ActionSupport
      -
    • doExecute() no longer exists, override execute()
    • -
    • the methods addError and addErrorMessage are now addFieldError and addActionError respectively
    • -
  • -
-

Configuration changes

    -
  • actions.xml/views.properties needs to be converted to xwork.xml
    -If you're using an actions.xml file to configure your webwork 1, you can use the attached XSLT to convert the actions.xml file to a vanilla xwork.xml file.
    -To apply this XSLT, you'll need to do the following:
    -Get a copy of the XSLT. You can find the latest version in CVS in webwork/src/etc/actions.xsl . Next, find yourself an XSLT rendering engine. Xalan is a good choice and can be found at http://xml.apache.org/xalan-j/index.html
    -Finally, do the conversion. -
  • -
-
-
java org.apache.xalan.xslt.Process -IN actions.xml -XSL actions.xsl -OUT xwork.xml
-

Remember that you'll need to Xalan libraries in your classpath to run the above command.
-If you want to look at these pages directly in your browser, I recommend user Internet Explorer as it automagically formats XML documents reasonably. There one caveat though. WW1 had a way to shorten the declaration of actions by allowing you to specify a package prefix in webwork.properties file. Since this information is outside the actions.xml file, the XSLT is unable to take advantage of it. Consequently, you might need to edit the xwork.xml file to update the class names.

WebWork 1.x configuration used a pull paradigm to load action configurations when they are asked for, whereas WebWork2 builds the configuration up-front to make the configuration queryable. The webwork.MigrationConfiguration must therefore act as an adapter between these two paradigms. It does this by returning a custom RuntimeConfiguration which first tries the default XWork Configuration (which, by default, loads configuration information from a file named "xwork.xml" in the root of the classpath) and then attempts to load action configuration using the Configuration classes from WebWork 1.x. In this way, an application can be slowly converted over to WebWork2 while reusing the configuration and Actions from a WebWork 1.x application. One caveat in this is that your migrated application MUST be rebuilt against the WebWork2 and migration jar files, as the classloader will rightly recognize that the webwork.Action and webwork.ActionSupport in WebWork 1.x are not the same as those provided by the migration jar files. Other than that, it should be seamless (and let us know if it isn't).

If the webwork.MigrationRuntimeConfiguration does not find the action configuration using the RuntimeConfiguration from the supplied RuntimeConfiguration (which is acquried from the Xwork DefaultConfiguration and will load configurations from all of the sources configured for XWork / WebWork2), it will build an ActionConfiguration by instantiating an Action using the ActionFactories from WebWork 1.x. The ActionFactory stack used is a subset of the default ActionFactory stack used in WebWork 1.x:

-
factory = new JavaActionFactory();
        factory = new ScriptActionFactoryProxy(factory);
        factory = new XMLActionFactoryProxy(factory);
        factory = new PrefixActionFactoryProxy(factory);
        factory = new JspActionFactoryProxy(factory);
        factory = new CommandActionFactoryProxy(factory);
        factory = new AliasingActionFactoryProxy(factory);
        factory = new CommandActionFactoryProxy(factory);
        factory = new ContextActionFactoryProxy(factory);
-

Some of the ActionFactory classes have been left out as they are handled by Interceptors in WebWork2. If the Action instance is created (meaning that the configuration has been found in the webwork.properties or actions.xml files used by the WebWork 1.x configuration classes) a parameter Map is created by introspecting the Action instance. A Map is needed for results and, again, WebWork 1.x used a pull paradigm to find results when they were needed, so a LazyResultMap is created which extends HashMap and overrides get() to look up the Result configuration if it has not previously been loaded. If the result ends in the Action suffix (defaulting to ".action"), then a ChainingResult is created, otherwise a ServletDispatcherResult is created. Using the Action class of the instantiated Action, the Map of parameters introspected from the Action instance, and the LazyResultMap, a new ActionConfig is created. The ActionConfig is saved into a special Package, "webwork-migration", so that it will pick up the default Interceptor stack defined for that package. The "webwork-migration" package is defined in a webwork-migration.xml file which is included in the migration jar file and which is automatically added to the Xwork configuration providers when the MigrationConfiguration is used:

-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
    <include file="webwork-default.xml"/>
    <package name="webwork-migration" abstract="true" extends="webwork-default">
        <interceptors>
            <interceptor-stack name="migrationStack">
                <interceptor-ref name="timer"/>
                <interceptor-ref name="logger"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="static-params"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="migrationStack"/>
    </package>
</xwork>
-

Here we can see that a number of the functions previously performed by ActionFactories in WebWork 1.x are now replaced by Interceptors in WebWork2, including the parameters, the chaining, calling prepare(), and the workflow (which was formerly implemented in ActionSupport in WebWork 1.x).

By creating and saving the ActionConfig in the PackageConfig for the "webwork-migration" package, the ActionConfig for the migrated Action is available for future calls, obviating the need to re-parse the old configuration files and making the configuration for the Action available for querying via the configuration API for tools such as the configuration browser. -

Tag Changes

-The biggest change is the use of OGNL for accessing object properties. Properties are no longer accessed with a forward slash "/" but with a dot "." Also, rather than using ".." to traverse down the stack, we now use "[n]" 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 "@foo", but now special variables are accessed using "#foo". However, it is important to note that "#foo" does NOT access the request attributes. "#foo" is merely a request to another object in the OgnlContext other than the root. See OGNL reference for more details.

property

The property tag is now only used to print out values from the stack. In WW1, it was also used to set a variable in the scope, and to push properties to the top of the stack. These functions are now performed by the set and push tags.

action tag

The action tag does not evaluate the body section any more and does not push the executed action onto the ValueStack. Instead, use the "id" attribute to assign a name to the action and reference it as "#id".

Examples

Lets enumerate some examples of differences between code snips using WW:WebWork and WW:WebWork.

    -
  • New JSP syntax
  • -

-There are numerous changes in syntax. First of all there are new tags and secondly there is a new expression language. Here's a small example:

Webwork 1 -

-
<ww:property value="a/b">
  <ww:property value="foo" />
</ww:property>
-

-Webwork 2 -
-
<ww:push value="a.b">
  <ww:property value="foo" />
</ww:push>
-

One can note that the "push" tag doesn't just push it pops too at the end of the tag. Surprise! Also note the "." instead of the "/" for traversing object properties.
- -
    -
  • List errors posted by an Action
    -Webwork 1 -
    -
    <webwork:if test="hasErrorMessages == true">
      ERROR:<br />
      <font color="red">
        <webwork:iterator value="errorMessages">
          <webwork:property/><br />
        </webwork:iterator>
      </font>
    </webwork:if>
    -

    -Webwork 2 -
    -
    <webwork:if test="hasErrors()">
      ERROR:<br />
      <font color="red">
        <webwork:iterator value="actionErrors">
          <webwork:property/><br />
        </webwork:iterator>
      </font>
    </webwork:if>
    -
    -
  • -

Update your web.xml file

-
    -
  • If you're using Velocity for views, you'll need to make sure you have the following snippet. Specifically note that the <load-on-startup> tag is now required so that the servlet can initialize some important Velocity properties. -
    -
    <servlet>
        <servlet-name>velocity</servlet-name>
        <servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    -
    -
  • -
-
    -
  • Set the property webwork.velocity.configfile in your _webwork.properties_. For example: -
    -
    webwork.velocity.configfile=velocity.properties
    -
    -
  • -

-WebWork will use this file to initialize the Velocity engine. The search path for the file is: -
    -
  1. context root (web root)
  2. -
  3. WEB-INF/
  4. -
  5. classpath
  6. -

    -
  • Additional Steps:
  • -
    1. -
    2. If you used the <ww:action taglib in 1.3… you used to refernece the java Action classname. In 2.x this reference is now the action name not the class. you will need to change all your old references in your view.
    3. -
  • -
-

ResultException doesn't exist anymore

It might be possible to copy WW1's ResultException, and write an Interceptor that catches the ResultExceptions and add the result of getMessage() to the actionErrors of the
-executed Action and return ResultException.getResult().

Maybe it would be possible to include ResultException in WW2 too to make migration easier?! -

DateFormatter doesn't exist anymore

-It can be replaced by directly using java.text.DateFormat -

addError(String, String) in webwork.action.ActionSupport has been removed

The new method to use is addFieldError(String, String). -

addErrorMessage(String) in webwork.action.ActionSupport has been removed

The new method is now addActionError(String). -

webwork.util.ValueStack has been removed

The ValueStack is com.opensymphony.xwork.util.OgnlValueStack

The old methods pushValue and popValue are renamed to simply push and
-pop.

An instance of the ValueStack can be obtained by using ActionContext.getContext().getValueStack instead of the old ValueStack.getStack(). -

*Aware-Interfaces have been removed

Instead of implementing ServletRequestAware etc the
-[Servlet]ActionContext.getXXX-methods can be used to obtain application-map, request, response etc. -

CommandDriven interface removed

The CommandDriven interface is removed. It is not neccesary to implement a special interface when working with commands anymore. Use the method attribute in your action-Element in xwork.xml to tell xwork which method to invoke on your action. -

isCommand(String) method has been removed

You can see which alias you're accessing by doing this: ActionContext.getContext().getActionInvocation().getProxy().getActionName() - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.0.html b/docs/chinese/wikidocs/Upgrading from 2.0.html deleted file mode 100644 index 2ae842a58..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.0.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork 2 : Upgrading from 2.0 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Upgrading from Webwork 2.0 is rather trivial. This version of webwork adds enhancements and bug fixes with hardly any configuration or syntax changes. Follow these two simple steps and you should be on your way with the latest and greatest from the OS crew.
- -

    -
  1. Update/Replace your current binaries with the new binaries located in the distribution download under the lib/core. You may also want to grab any related jars from the lib/optional folder. Don't forget the webwork binary webwork-2.1.jar in the base directory of the distribution download. Review the Dependencies for Webwork.
  2. -
  3. Check out the Release Notes - 2.1 to see if any of changes need to be applied to your code base.
  4. -

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.1.1.html b/docs/chinese/wikidocs/Upgrading from 2.1.1.html deleted file mode 100644 index 373a65d45..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.1.1.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Upgrading from 2.1.1 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Upgrading from 2.1.1 to 2.1.2 is very easy. Simply copy over the new webwork.jar file and make sure you are running all the correct Dependencies – especially make sure you are using XWork 1.0.3.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.1.2.html b/docs/chinese/wikidocs/Upgrading from 2.1.2.html deleted file mode 100644 index e7a673ca7..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.1.2.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Upgrading from 2.1.2 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Upgrading from 2.1.2 to 2.1.3 is very easy. Simply copy over the new webwork.jar. There have been no new dependencies.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.1.3.html b/docs/chinese/wikidocs/Upgrading from 2.1.3.html deleted file mode 100644 index f425e6298..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.1.3.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Upgrading from 2.1.3 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Since this release is merely a preview release of the new tag syntax (see Release Notes - 2.1.4) and no other changes have been made, simply copying over the new webwork jar file is all that is needed to upgrade. No other libraries have changed.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.1.4.html b/docs/chinese/wikidocs/Upgrading from 2.1.4.html deleted file mode 100644 index c5467df07..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.1.4.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Upgrading from 2.1.4 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Upgrading from 2.1.4 is pretty easy as no new libraries have been introduced. However, the TLD (taglib definition file) has been modified to support more JavaScript events, such as onBlur, onChange, etc. Be sure to check that you are using the latest TLD. This is automatic if you point web.xml to /WEB-INF/webwork.jar.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.1.5.html b/docs/chinese/wikidocs/Upgrading from 2.1.5.html deleted file mode 100644 index 71c169377..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.1.5.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Upgrading from 2.1.5 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Upgrading from 2.1.5 to 2.1.6 requires that you copy over the new webwork-2.1.6.jar and xwork-1.0.4.jar. Note that WebWork 2.1.6 includes a new version of XWork, version 1.0.4.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Upgrading from 2.1.html b/docs/chinese/wikidocs/Upgrading from 2.1.html deleted file mode 100644 index 86a3de027..000000000 --- a/docs/chinese/wikidocs/Upgrading from 2.1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork 2 : Upgrading from 2.1 - - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Upgrading from 2.1 to 2.1.1 is very easy. Simply copy over the new webwork.jar file and make sure you are running all the correct Dependencies.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using Checkboxes - EditAction.java.html b/docs/chinese/wikidocs/Using Checkboxes - EditAction.java.html deleted file mode 100644 index b2e207294..000000000 --- a/docs/chinese/wikidocs/Using Checkboxes - EditAction.java.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork 2 : Using Checkboxes - EditAction.java - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -
-
package cash.action;

import org.apache.log4j.Logger;

import cash.config.ConfigManager;
import cash.model.User;
import cash.util.HibernateUtil;
import cash.validator.PasswordFormatValidator;

import net.sf.hibernate.LockMode;

/**
 * Edit a user
 * @author Joel Hockey
 * @version $Id: Using\040Checkboxes\040-\040EditAction.java.html,v 1.1 2005/03/21 04:16:01 plightbo Exp $
 */
public class EditAction extends HibernateAction {
    private static final Logger LOG = Logger.getLogger(EditAction.class);

    private User m_user = new User();
    private String m_repeatPassword;

    /** return user to be edited. */
    public User getUser() { return m_user; }

    /** @param pwd repeat of password */
    public void setRepeatPassword(String pwd) { m_repeatPassword = pwd; }
    /** @return repeat password */
    public String getRepeatPassword() { return m_repeatPassword; }

    /** override super */
    public String execute() throws Exception {
        LOG.debug("EditAction started");

        // get original user from session, check that password is valid, update and save.
        User u = (User)get("user");
        HibernateUtil.currentSession().lock(u, LockMode.NONE);

        // check that password has actually changed before updating
        if (!PasswordFormatValidator.PASSWORD_MASK.equals(m_user.getPassword())) {
            if (!u.changePassword(m_user.getPassword())) {
                addFieldError("user.password", "password must be different to previous "
                    + ConfigManager.getConfig().getUser().getNoRepeatHistory() + " passwords");
                return INPUT;
            }
        }

        m_user.copy(u);
        HibernateUtil.currentSession().save(u);
        User loginUser = (User)get(LoginAction.LOGIN_USER);
        if (u.getId() == loginUser.getId()) {
            set(LoginAction.LOGIN_USER, u);
        }
        return SUCCESS;
    }
}
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using Checkboxes - User.java.html b/docs/chinese/wikidocs/Using Checkboxes - User.java.html deleted file mode 100644 index c95018180..000000000 --- a/docs/chinese/wikidocs/Using Checkboxes - User.java.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork 2 : Using Checkboxes - User.java - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -
-
package cash.model;

import net.sf.hibernate.HibernateException;

import org.apache.log4j.Logger;

import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.SortedSet;
import java.util.TimeZone;
import java.util.TreeSet;

import cash.config.ConfigManager;
import cash.util.Hex;
import cash.util.HibernateUtil;
import cash.util.UtcDate;
import cash.validator.PasswordFormatValidator;

/**
 * Represents a User object.  Clients of this class should instantiate a User object with the
 * multi-arg constructor rather than using setters.
 *
 * @author Joel Hockey
 * @version $Id: Using\040Checkboxes\040-\040User.java.html,v 1.1 2005/03/21 04:16:01 plightbo Exp $
 * @hibernate.class
 *      table="user"
 *      dynamic-update="true"
 *      optimistic-lock="version"
 */
public class User implements java.io.Serializable {
    private static final Logger LOG = Logger.getLogger(User.class);

    private static MessageDigest s_md5;
    private static SecureRandom s_random;

    private static final int MAX_LOGIN_FAILURE_COUNT = 20;
    private static final boolean RESET_LOCKED_OUT_AFTER_TIME = true;
    private static final long RESET_LOCKED_OUT_TIME = 1 * 60 * 60 * 1000; // 1 hour

    private int m_id;
    private int m_version;
    private String m_username;
    private String m_password;
    private Date m_passwordChangeDate;
    private String m_hashedPassword;
    private SortedSet m_passwordHistory = new TreeSet();
    private String m_salt;
    private byte[] m_saltBytes;
    private Date m_createDate;
    private String m_email;
    private Locale m_locale;
    private TimeZone m_timeZone;
    private String m_telephone;
    private Date m_lastSuccessfulLogin;
    private String m_lastSuccessfulLoginIp;
    private Date m_lastFailedLogin;
    private String m_lastFailedLoginIp;
    private int m_loginFailureCount;
    private int m_maxLoginFailureCount = MAX_LOGIN_FAILURE_COUNT;
    private boolean m_resetLockedOutAfterTime = RESET_LOCKED_OUT_AFTER_TIME;
    private long m_resetLockedOutTime = RESET_LOCKED_OUT_TIME;
    private boolean m_lockedOut = false;
    private boolean m_disabled = false;
    private boolean m_isSuperUser = false;
    private boolean m_passwordNeverExpires = false;
    private Set m_privileges = new HashSet();

    static {
        try {
            s_md5 = MessageDigest.getInstance("MD5");
            s_random = SecureRandom.getInstance("SHA1PRNG");
        } catch (GeneralSecurityException gse) {
            // shouldn't happen
            LOG.error("Error creating MD5 or SHA1PRNG", gse);
            throw new RuntimeException("Error creating MD5 or SHA1PRNG");
        }
    }

    /** default constructor for Hibernate */
    public User() { }

    /**
     * Create a User.
     *
     * @param username The username for logging in
     * @param password The user's password
     * @param email The user's email
     * @throws InvalidPasswordException if password is invalid.
     */
    public User(String username, String password, String email) throws InvalidPasswordException {

        m_username = username;

        // password
        initSalt();
        if (!PasswordFormatValidator.checkPasswordFormat(password)) {
            throw new InvalidPasswordException();
        }
        m_hashedPassword = hashPassword(password);

        m_createDate = UtcDate.createUtcDate();
        m_email = email;
        m_locale = Locale.getDefault();
        m_timeZone = TimeZone.getDefault();
    }

    /** @param id The id to set */
    public void setId(int id) { m_id = id; }

    /**
     * @return unique id of this User.  Generated by DB.
     * @hibernate.id
     *      generator-class="native"
     */
    public int getId() { return m_id; }

    /** @param version The version of this object */
    public void setVersion(int version) { m_version = version; }

    /**
     * @return version of this object
     * @hibernate.version
     */
    public int getVersion() { return m_version; }

    /** @param username The username to set */
    public void setUsername(String username) { m_username = username; }

    /**
     * @return username
     * @hibernate.property
     *      length="32"
     *      unique="true"
     *      not-null="true"
     */
    public String getUsername() { return m_username; }

    /**
     * Set's the user's password without updating history or checking validity.
     * This should only be used at User creation time, and password validity
     * should be checked externally to this method.
     * Do not use to update password, see {@link #changePassword(String)}
     * @param password user's password
     */
    public void setPassword(String password) {
        m_password = password;
        if (m_salt == null) {
            initSalt();
        }
        m_hashedPassword = hashPassword(password);
        m_passwordChangeDate = UtcDate.createUtcDate();
    }

    /**
     * This method is provided to help at User creation time.  It will only return
     * valid values if {@link #setPassword(String)} has already been called.
     * @return plaintext password.
     */
    public String getPassword() { return m_password; }

    /** @param time Date (UTC) user last changed password. */
    public void setPasswordChangeDate(Date time) { m_passwordChangeDate = time; }

    /**
     * @return UTC date of last password change
     * @hibernate.property
     *      type="cash.model.TimestampType"
     *      length="23"
     */
    public Date getPasswordChangeDate() { return m_passwordChangeDate; }

    /**
     * Sets the user's hashed password.  This method is provided only for the use
     * of hibernate.  Users of this class should not call this method.
     * Use the {@link #setPassword(String)} method to set the plaintext password.
     * @param hash The hashed password to set
     */
    public void setHashedPassword(String hash) {
        m_hashedPassword = hash;
    }

    /**
     * @return hashed password
     * @hibernate.property
     *      column="pwd"
     *      length="32"
     *      not-null="true"
     */
    public String getHashedPassword() { return m_hashedPassword; }

    /**
     * @param oldPasswords The last n passwords, where n
     * is defined as noRepeatHistory in User configuration.  Passwords are ordered
     * in descending order of creation.
     */
    public void setPasswordHistory(SortedSet oldPasswords) { m_passwordHistory = oldPasswords; }

    /**
     * @return Password history
     * @hibernate.set
     *      lazy="true"
     *      sort="cash.model.PasswordHistory"
     *      inverse="true"
     *      cascade="all"
     * @hibernate.collection-key
     *      column="userId"
     * @hibernate.collection-one-to-many
     *      class="cash.model.PasswordHistory"
     */
    public SortedSet getPasswordHistory() { return m_passwordHistory; }

    /** @param random The random salt to be used with password */
    public void setSalt(String random) {
        m_salt = random;
        m_saltBytes = Hex.fromString(random);
    }

    /**
     * @return random salt used with password
     * @hibernate.property
     *      length="32"
     *      not-null="true"
     */
    public String getSalt() { return m_salt; }

    /** @param time create date */
    public void setCreateDate(Date time) { m_createDate = time; }

    /**
     * @return Date in UTC user was created.
     * @hibernate.property
     *      update="false"
     *      not-null="true"
     *      type="cash.model.TimestampType"
     *      length="23"
     */
    public Date getCreateDate() { return m_createDate; }

    /** @param email User's email */
    public void setEmail(String email) { m_email = email; }

    /**
     * @return User's email
     * @hibernate.property
     *      length="255"
     *      not-null="true"
     */
    public String getEmail() { return m_email; }

    /** @param locale The User's locale.  This should be a 2 character field. */
    public void setLocale(Locale locale) { m_locale = locale; }

    /**
     * @return User's locale.  Uses 2 character ISO-something value.
     * @hibernate.property
     *      not-null="true"
     */
    public Locale getLocale() { return m_locale; }

    /** @param timeZone User's time zone */
    public void setTimeZone(TimeZone timeZone) { m_timeZone = timeZone; }

    /**
     * @return User's timezone
     * @hibernate.property
     *      not-null="true"
     */
    public TimeZone getTimeZone() { return m_timeZone; }

    /** @param telephone User's telephone */
    public void setTelephone(String telephone) { m_telephone = telephone; }

    /**
     * @return Telephone of user
     * @hibernate.property
     *      length="16"
     */
    public String getTelephone() { return m_telephone; }

    /** @param time user's last successful login date in UTC. */
    public void setLastSuccessfulLogin(Date time) { m_lastSuccessfulLogin = time; }

    /**
     * @return UTC date of last successful login
     * @hibernate.property
     *      type="cash.model.TimestampType"
     *      length="23"
     */
    public Date getLastSuccessfulLogin() { return m_lastSuccessfulLogin; }

    /** @param ip IP address used for user's last successful login. */
    public void setLastSuccessfulLoginIp(String ip) { m_lastSuccessfulLoginIp = ip; }

    /**
     * @return IP address used for last successful login
     * @hibernate.property
     */
    public String getLastSuccessfulLoginIp() { return m_lastSuccessfulLoginIp; }

    /** @param time user's last failed login date in UTC. */
    public void setLastFailedLogin(Date time) { m_lastFailedLogin = time; }

    /**
     * @return UTC date of last failed login
     * @hibernate.property
     *      type="cash.model.TimestampType"
     *      length="23"
     */
    public Date getLastFailedLogin() { return m_lastFailedLogin; }

    /** @param ip IP address used for user's last failed login. */
    public void setLastFailedLoginIp(String ip) { m_lastFailedLoginIp = ip; }

    /**
     * @return IP address used for last failed login
     * @hibernate.property
     */
    public String getLastFailedLoginIp() { return m_lastFailedLoginIp; }

    /**
     * Sets the number of times that a user has failed when attempting to login.
     * This value is reset when a user logs in successfully, or their account is reset.
     * @param count the value to set.
     */
    public void setLoginFailureCount(int count) { m_loginFailureCount = count; }

    /**
     * @return The number of times that a user has failed when attempting to login.
     *  This value is reset when a user logs on successfully, or their account is reset.
     * @hibernate.property
     */
    public int getLoginFailureCount() { return m_loginFailureCount; }

    /**
     * @param count The maximum number of times that a user may fail to login before
     * their account is locked out
     */
    public void setMaxLoginFailureCount(int count) { m_maxLoginFailureCount = count; }

    /**
     * @return The maximum number of times that a user may fail to login before their account
     * is locked out.
     * @hibernate.property
     */
    public int getMaxLoginFailureCount() { return m_maxLoginFailureCount; }

    /**
     * @param reset Whether this user's account will be unlocked after a specified time when it is locked
     * due to login failure.
     * @see #setResetLockedOutAfterTime(boolean) setResetLockedOutAfterTime
     */
    public void setResetLockedOutAfterTime(boolean reset) { m_resetLockedOutAfterTime = reset; }

    /**
     * @return Whether this user's account will be unlocked after a specified time when it
     * is locked out due to login failure.
     * @see #getResetLockedOutAfterTime getResetLockedOutAfterTime
     * @hibernate.property
     */
    public boolean getResetLockedOutAfterTime() { return m_resetLockedOutAfterTime; }

    /**
     * @param time The time in millis between login attempts before login failure count is reset.  Login failure
     * count will only be reset if the Reset Locked Out After Time boolean is set to true.
     */
    public void setResetLockedOutTime(long time) { m_resetLockedOutTime = time; }

    /**
     * @return Time in milliseconds before account is auto-reset after login lockout.
     * @hibernate.property
     */
    public long getResetLockedOutTime() { return m_resetLockedOutTime; }

    /** @param lockedOut User's locked out status. */
    public void setLockedOut(boolean lockedOut) { m_lockedOut = lockedOut; }

    /**
     * @return Whether this user's account is locked out
     * @hibernate.property
     */
    public boolean isLockedOut() { return m_lockedOut; }

    /** @param disabled User's disabled status. */
    public void setDisabled(boolean disabled) { m_disabled = disabled; }

    /**
     * @return Whether this user's account disabled
     * @hibernate.property
     */
    public boolean isDisabled() { return m_disabled; }

    /** @param superUser True if user is super user */
    public void setSuperUser(boolean superUser) { m_isSuperUser = superUser; }

    /**
     * @return Whether this user is a super user
     * @hibernate.property
     */
    public boolean isSuperUser() { return m_isSuperUser; }

    /** @param expires True if user's password never expires */
    public void setPasswordNeverExpires(boolean expires) { m_passwordNeverExpires = expires; }

    /**
     * @return Whether this user's password ever expires
     * @hibernate.property
     */
    public boolean getPasswordNeverExpires() { return m_passwordNeverExpires; }

    /** @param privs Set of privileges for this user  */
    public void setPrivileges(Set privs) { m_privileges = privs; }

    /**
     * @return Set of Privileges for this User.
     * @hibernate.set
     *      table="user_priv"
     *      lazy="true"
     *      cascade="all"
     * @hibernate.collection-key
     *      column="userId"
     * @hibernate.collection-element
     *      column="priv"
     *      type="string"
     */
    public Set getPrivileges() { return m_privileges; }

    /** convenience method of OGNL */
    public void setPriv(String[] privs) {
        for (int i = 0; i < privs.length; i++) {
            m_privileges.add(privs[i]);
        }
    }


// other methods

    /**
     * Changes the user's password.  Password must meet criteria
     * defined in configuration.  The user's password will be appended to
     * a random 20 byte salt and then hashed using MD5 to create the
     * value that will be stored in the DB.  The current Hibernate Session
     * will be used to update pwd history.
     *
     * @param password The password to set
     * @return true if password is changed, false if password was not changed
     * because it did not meet password requirements.
     * @throws HibernateException if error updating password history
     */
    public boolean changePassword(String password) throws HibernateException {
        // check format
        if (!PasswordFormatValidator.checkPasswordFormat(password)) {
            return false;
        }

        // check history
        // first check current password
        String hashedPwd = hashPassword(password);
        LOG.debug("checking if password is same as current");
        if (hashedPwd.equals(m_hashedPassword)) {
            LOG.info("password is same as current password");
            return false;
        }

        LOG.debug("checking if password exists in history.  History size is " + m_passwordHistory.size());
        for (Iterator i = getPasswordHistory().iterator(); i.hasNext(); ) {
            PasswordHistory ph = (PasswordHistory)i.next();
            if (hashedPwd.equals(ph.getHashedPassword())) {
                LOG.info("password already used as one of last "
                    + ConfigManager.getConfig().getUser().getNoRepeatHistory());
                return false;
            }
        }

        // add current pwd to history and truncate history if it is too long now
        PasswordHistory ph = new PasswordHistory(this, m_hashedPassword);
        m_passwordHistory.add(ph);
        LOG.debug("saving old password into password history");
        HibernateUtil.currentSession().save(ph);
        // compare to (noRepeat - 1) because we are checking current as part of history
        if (m_passwordHistory.size() > ConfigManager.getConfig().getUser().getNoRepeatHistory() - 1) {
            PasswordHistory toRemove = (PasswordHistory)m_passwordHistory.first();
            LOG.info("Removing password history object for user " + m_username
                    + " created: " + toRemove.getCreateDate());
            m_passwordHistory.remove(toRemove);
            HibernateUtil.currentSession().delete(toRemove);
        }

        // now set password and date
        m_hashedPassword = hashedPwd;
        m_passwordChangeDate = UtcDate.createUtcDate();
        return true;
    }

    /**
     * Hashes input pwd to see if it equals stored pwd hash value.
     * @param pwd Password to check
     * @return true if passwords are equal.
     */

    public boolean passwordEquals(String pwd) {
        String hash = hashPassword(pwd);
        return m_hashedPassword.equalsIgnoreCase(hash);
    }

    /**
     * Hashes salt and password to produce hashed password.
     * @param pwd Password to hash
     * @return Hex encoding of MD5 hash of salt and pwd
     */
    private String hashPassword(String pwd) {
        byte[] pwdBytes = pwd.getBytes();  //TODO:  should an encoding be specified here?
        byte[] in = new byte[OS:m_saltBytes.length + pwdBytes.length];
        System.arraycopy(m_saltBytes, 0, in, 0, m_saltBytes.length);
        System.arraycopy(pwdBytes, 0, in, m_saltBytes.length, pwdBytes.length);
        byte[] out = s_md5.digest(in);
        return Hex.toString(out);
    }

    /** initialises salt */
    private void initSalt() {
        m_saltBytes = new byte[OS:16];
        s_random.nextBytes(m_saltBytes);
        m_salt = Hex.toString(m_saltBytes);
    }

    /** @return String representation of User */
    public String toString() {
        StringBuffer sb = new StringBuffer(500);
        sb.append("[").append("ID:").append(m_id)
        .append(",version:").append(m_version)
        .append(",hashedPassword:").append(m_hashedPassword)
        .append(",salt:").append(m_salt)
        .append(",createDate:").append(m_createDate)
        .append(",email:").append(m_email)
        .append(",locale:").append(m_locale)
        .append(",timeZone:").append(m_timeZone)
        .append(",telephone:").append(m_telephone)
        .append(",lastSuccessfulLogin:").append(m_lastSuccessfulLogin)
        .append(",lastSuccessfulLoginIp:").append(m_lastSuccessfulLoginIp)
        .append(",lastFailedLogin:").append(m_lastFailedLogin)
        .append(",lastFailedLoginIp:").append(m_lastFailedLoginIp)
        .append(",loginFailureCount:").append(m_loginFailureCount)
        .append(",maxLoginFailureCount:").append(m_maxLoginFailureCount)
        .append(",resetLockedOutAfterTime:").append(m_resetLockedOutAfterTime)
        .append(",resetLockedOutTime:").append(m_resetLockedOutTime)
        .append(",lockedOut:").append(m_lockedOut)
        .append(",disabled:").append(m_disabled)
        .append(",isSuperUser:").append(m_isSuperUser)
        .append(",passwordNeverExpires:").append(m_passwordNeverExpires)
        .append(",passwordChangeDate:").append(m_passwordChangeDate)
        .append(",privs:").append(m_privileges);
        return sb.toString();
    }

    /**
     * Copies editable data from this object to User object provided.  This is used
     * in Edit actions.  Not all fields are copied, only those that are editable
     * @param user Object to copy to
     */
    public void copy(User user) {
        user.setUsername(m_username);
        user.setEmail(m_email);
        user.setLocale(m_locale);
        user.setTimeZone(m_timeZone);
        user.setTelephone(m_telephone);
        user.setLockedOut(m_lockedOut);
        user.setDisabled(m_disabled);
        user.setPasswordNeverExpires(m_passwordNeverExpires);

        // do some smarts for privs removal.  Clear all if more than half are removed
        if (m_privileges.size() <= user.getPrivileges().size() / 2) {
            LOG.debug("detected that many privs are removed, clearing all");
            user.setPrivileges(m_privileges);
        } else {
            // find which ones should be removed
            List toRemove = new ArrayList();
            for (Iterator i = user.getPrivileges().iterator(); i.hasNext(); ) {
                String priv = (String)i.next();
                if (!m_privileges.contains(priv)) {
                    toRemove.add(priv);
                }
            }

            // remove them
            for (int i = 0; i < toRemove.size(); i++) {
                user.getPrivileges().remove(toRemove.get(i));
            }

            // add all new privs
            for (Iterator i = m_privileges.iterator(); i.hasNext(); ) {
                user.getPrivileges().add(i.next());
            }
        }
    }
}
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using Checkboxes - Velocity and HTML.html b/docs/chinese/wikidocs/Using Checkboxes - Velocity and HTML.html deleted file mode 100644 index 841a57d5f..000000000 --- a/docs/chinese/wikidocs/Using Checkboxes - Velocity and HTML.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork 2 : Using Checkboxes - Velocity and HTML - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

Velocity View - edit.vm: -

-
<html>
<body onload="document.forms[0].elements[0].focus()">

<a href="home.vm">Home</a><br/>

#if ($fieldErrors)
  #foreach ($error in $fieldErrors)
    $error<br>
  #end
#end
#if ($actionErrors)
  #foreach ($error in $actionErrors)
    $error<br>
  #end
#end

<form name="edit" action="edit.action" method="post">
<table>
<tr><td>Name</td><td>$user.username</td></tr>
#formRowText("Password" "user.password" $stack.findValue("@cash.validator.PasswordFormatValidator@PASSWORD_MASK"))
#formRowText("Repeat Password" "repeatPassword" $stack.findValue("@cash.validator.PasswordFormatValidator@PASSWORD_MASK"))
#formRowText("Email" "user.email" $!user.email)
#formRowSelect("Language" "user.locale" $stack.findValue("@cash.util.Html@getInstance()").getLocales($locale) $!user.locale.toString())
#formRowSelect("Time Zone" "user.timeZone" $stack.findValue("@cash.util.Html@getInstance()").getTimeZones($locale) $!user.timeZone.ID)
#formRowText("Telephone" "user.telephone" $!user.telephone)
#formRowCheckbox("Locked Out" "user.lockedOut" "true" $user.lockedOut)
#formRowCheckbox("Disabled" "user.disabled" "true" $user.disabled)


#set ($privs = [OS:"boss", "admin", "early", "late", "train"])

#foreach ($priv in $privs)
  #set ($checked = $user.privileges.contains($priv))
  #formRowCheckbox($priv "user.priv" $priv $checked)
#end
<tr><td> </td><td><input type="submit" name="submit" value="submit"></td></tr>
</table>

<input type="hidden" name="user.username" value="$user.username">
</form>

</body>
</html>
-

Velocity Macros - macros.vm: -
-
#macro (formRowText $label $name $value)
  <tr><td><label for="$name">$label</label></td><td><input id="$name" type="text" name="$name" value="$!value"></td></tr>
#end

#macro (formRowSelect $label $name $options $selectedValue)
  <tr><td><label for="$name">$label</label></td><td><select id="$name" name="$name">
#foreach ($option in $options)
<option#if ($option.get(0).equals($selectedValue)) selected#end value="$option.get(0)">$option.get(1)</option>
#end
</select></td></tr>
#end

#macro (formRowCheckbox $label $name $value $checked)
  <tr><td><label for="$name.$value">$label</label></td><td><input id="$name.$value" type="checkbox" name="$name" value="$value"#if ($checked) checked#end ></td></tr>
#end
-

Note that I don't use the webwork UI tags. (The HTML that comes out of them looks like vomit.)

The HTML generated from above looks like: -
-
<html>
<body onload="document.forms[0].elements[0].focus()">

<a href="home.vm">Home</a><br/>

    
<form name="edit" action="edit.action" method="post">
<table>
<tr><td>Name</td><td>user</td></tr>
  <tr><td><label for="user.password">Password</label></td><td><input id="user.password" type="text" name="user.password" value="********"></td></tr>
  <tr><td><label for="repeatPassword">Repeat Password</label></td><td><input id="repeatPassword" type="text" name="repeatPassword" value="********"></td></tr>

  <tr><td><label for="user.email">Email</label></td><td><input id="user.email" type="text" name="user.email" value="user@example.com"></td></tr>
  <tr><td><label for="user.locale">Language</label></td><td><select id="user.locale" name="user.locale">
<option value="en">English</option>
<option selected value="en_AU">English (Australia)</option>
<option value="en_US">English (United States)</option>
<option value="en_GB">English (United Kingdom)</option>
<option value="es">Spanish</option>
<option value="fr">French</option>

<option value="de">German</option>
</select></td></tr>
  <tr><td><label for="user.timeZone">Time Zone</label></td><td><select id="user.timeZone" name="user.timeZone">
<option selected value="America/Los_Angeles">(GMT-08:00) Los Angeles</option>
<option value="Europe/London">(GMT+00:00) London</option>
<option value="Australia/Brisbane">(GMT+10:00) Brisbane</option>
</select></td></tr>
  <tr><td><label for="user.telephone">Telephone</label></td><td><input id="user.telephone" type="text" name="user.telephone" value="134"></td></tr>
  <tr><td><label for="user.lockedOut.true">Locked Out</label></td><td><input id="user.lockedOut.true" type="checkbox" name="user.lockedOut" value="true" ></td></tr>

  <tr><td><label for="user.disabled.true">Disabled</label></td><td><input id="user.disabled.true" type="checkbox" name="user.disabled" value="true" ></td></tr>



    <tr><td><label for="user.priv.boss">boss</label></td><td><input id="user.priv.boss" type="checkbox" name="user.priv" value="boss" ></td></tr>
    <tr><td><label for="user.priv.admin">admin</label></td><td><input id="user.priv.admin" type="checkbox" name="user.priv" value="admin" ></td></tr>
    <tr><td><label for="user.priv.early">early</label></td><td><input id="user.priv.early" type="checkbox" name="user.priv" value="early" ></td></tr>
    <tr><td><label for="user.priv.late">late</label></td><td><input id="user.priv.late" type="checkbox" name="user.priv" value="late" ></td></tr>

    <tr><td><label for="user.priv.train">train</label></td><td><input id="user.priv.train" type="checkbox" name="user.priv" value="train" ></td></tr>
<tr><td> </td><td><input type="submit" name="submit" value="submit"></td></tr>
</table>

<input type="hidden" name="user.username" value="user">
</form>

</body>
</html>
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using Checkboxes.html b/docs/chinese/wikidocs/Using Checkboxes.html deleted file mode 100644 index c59c9c919..000000000 --- a/docs/chinese/wikidocs/Using Checkboxes.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork 2 : Using Checkboxes - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Using Checkboxes (General)

-The biggest gotcha for newbies is that you must set the 'value' attribute in the html <input> field to use Checkboxes with WW. By default your browser will set this to some value. Firebird uses "on" - not sure what IE or others use. You must make this a sensible value for whatever property you are setting. -

Using Checkboxes to set boolean fields

-HTML: -
-
<input type="checkbox" name="user.lockedOut" value="true"/>
-

If the user checks this box, the browser will send "user.lockedOut=true" in the QueryString and action.getUser().setLockedOut(true) will be called. If the user does not check the box, the browser will not send anything, so make sure that you have initialised lockedOut to false to start with.
- -
-
private boolean m_lockedOut = false;

    public void setLockedOut(boolean lockedOut) { m_lockedOut = lockedOut; }
-
-

Using Checkboxes to set a collection

-Our user has a number of priviliges that are stored as a Set of strings. To use checkboxes for these, we have HTML that looks like:
- -
-
<input type="checkbox" name="user.priv" value="boss"/>
<input type="checkbox" name="user.priv" value="admin"/>
<input type="checkbox" name="user.priv" value="manager"/>
-

Say a user checks the first 2; the browser will send the query string: user.priv=boss&user.priv=admin.

OGNL will end up calling
-
action.getUser().setPriv(String[] {"boss", "admin"})
-

You can write this method like: -

-
Set m_privileges = new HashSet();

    public void setPriv(String[] privs) {
        for (int i = 0; i < privs.length; i++) {
            m_privileges.add(privs[i]);
        }
    }
-
-

Full Detailed example:

-This example uses a kind-of XW:Interceptors#ModelDriven Action. The action returns a single getter for the User object whose values are populated.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using Localized Texts in Sitemesh Decorators.html b/docs/chinese/wikidocs/Using Localized Texts in Sitemesh Decorators.html deleted file mode 100644 index d7a0f48d1..000000000 --- a/docs/chinese/wikidocs/Using Localized Texts in Sitemesh Decorators.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork 2 : Using Localized Texts in Sitemesh Decorators - - - - - - - - - -
- -
- This page last changed on Dec 02, 2004 by jcarreira. -
- -

In WebWork 2.1.7 and XWork 1.0.5 support was added for supporting the use of the localization services of WebWork in Sitemesh decorators. In the com.opensymphony.xwork.TextProvider Interface, this method was added:

-
public String getText(String aTextName, String defaultValue, List args, OgnlValueStack stack)
-

and this method was added to com.opensymphony.xwork.util.LocalizedTextUtil which com.opensymphony.xwork.TextProviderSupport (the default TextProvider implementation) calls in the implementation of the above method:

-
public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, OgnlValueStack valueStack)
-

What this does is to use this value stack and the locale in its context if it's there to find the correct text and resolve any variable subsitutions. The problem before was that down in LocalizedTextUtil it was using ActionContext.getContext().getValueStack() to get the value stack and the Locale, so localized texts wouldn't work in Sitemesh decorators. The TextTag automatically uses this form now, and passes in the value stack it gets from the request if it's there. You can also access this form of the method in OGNL expressions like this:

-
<ww:submit value="%{getText('text.search','Search',null,#request['webwork.valueStack'])}"/>
-

- - - - - - - - - - - - - -
ArgumentDescription
'text.search'the text key to look up
'Search'the default text to use if no localized text is found
nullthe spot where you could give it a List of arguments to fill in MessageFormat indexed variable substitutions
#request['webwork.valueStack']gets the value stack from the spot where the ServletDispatcher saves it to make it available to the tags
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 09:55
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using WebWork Components.html b/docs/chinese/wikidocs/Using WebWork Components.html deleted file mode 100644 index 463e8a2f2..000000000 --- a/docs/chinese/wikidocs/Using WebWork Components.html +++ /dev/null @@ -1,44 +0,0 @@ - - - WebWork 2 : Using WebWork Components - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

A simple example of using WebWork components is available in the webwork-example.war that comes with the WebWork 2.0 Beta 1 distribution. You can download the distribution from https://webwork.dev.java.net/servlets/ProjectDocumentList .

Components are defined _/WEB-INF/classes/components.xml_.

The example consists of one component, which is defined by

-
<component>
  <scope>session</scope>
  <class>com.opensymphony.webwork.example.counter.Counter</class>
  <enabler>com.opensymphony.webwork.example.counter.CounterAware</enabler>
</component>
-

com.opensymphony.webwork.example.counter.Counter is just a POJO.

com.opensymphony.webwork.example.counter.CounterAware is an interface which your *Action classes have to implement.
- -
-
public interface CounterAware {
    public void setCounter(Counter counter);
}
-

Additionally, you need to tag your actions with the intercepter, for example,

-
<action name="SimpleCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
  <result name="success" type="dispatcher">
    <param name="location">/success.jsp</param>
  </result>
  <interceptor-ref name="defaultComponentStack"/>
</action>
-

WebWork will call the interface and set the Counter bean . The Counter bean would then be subsequently be available to be used by your *Action classes.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Using WebWork2 and XWork1 with JSP 2.0 and JSTL 1.1.html b/docs/chinese/wikidocs/Using WebWork2 and XWork1 with JSP 2.0 and JSTL 1.1.html deleted file mode 100644 index 5facd08a4..000000000 --- a/docs/chinese/wikidocs/Using WebWork2 and XWork1 with JSP 2.0 and JSTL 1.1.html +++ /dev/null @@ -1,66 +0,0 @@ - - - WebWork 2 : Using WebWork2 and XWork1 with JSP 2.0 and JSTL 1.1 - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

WW2/WX1 and its taglib is oriented towards OGNL, which is using a value stack
-for all action properties. These values are not direct available for the
-expression language of JSP2/JSTL1.1.

However, it's easy to populate the request
-attribute set, with all gettable properties of an action object. You need to provide
-an interceptor that does the job, by register a PreResultListener which is
-invoked after the return of Action.execute() but before the rendering of the result .

The interceptor below is using Jakarta BeanUtils. It first extracts all getters
-of the current action, invokes them one at the time and stores the values into a map.
-Then it iterates over the map and populates the request attribute set.
-The double iteration is not needed, it's just there for clarity. -

class ActionPropertyExportInterceptor

-
-
package com.whatever.interceptors;

import com.opensymphony.webwork.WebWorkStatics;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.AroundInterceptor;
import com.opensymphony.xwork.interceptor.PreResultListener;
import org.apache.commons.beanutils.PropertyUtils;
import javax.servlet.http.HttpServletRequest;
import java.beans.PropertyDescriptor;
import java.util.*;

/**
 * Populates HTTP Request Attributes with all gettable properties of the current action.
 */
public class ActionPropertyExportInterceptor extends AroundInterceptor {
    protected void before(ActionInvocation invocation) throws Exception {
        invocation.addPreResultListener( new PropertyExporter() );
    }
    protected void after(ActionInvocation dispatcher, String result) throws Exception { }

    public static class PropertyExporter implements PreResultListener {
        private static final List   ignore = Arrays.asList(new String[] {"class", "texts"}); //skip getClass,...

        //Invoked after Action.execute() but before Result
        //Calls all getters of the action and insert the values into the request
        public void beforeResult(ActionInvocation invocation, String resultCode) {
            Map                 props   = extractGetterPropertyValues( invocation.getAction() );
            HttpServletRequest  request = getRequest(invocation);
            for (Iterator it = props.entrySet().iterator(); it.hasNext();) {
                Map.Entry   e = (Map.Entry) it.next();
                request.setAttribute((String) e.getKey(), e.getValue());
            }
        }

        public Map extractGetterPropertyValues(Object bean) {
            PropertyDescriptor[]  descr = PropertyUtils.getPropertyDescriptors(bean);
            Map                   props = new HashMap();
            for (int i = 0; i < descr.length; i++) {
                PropertyDescriptor d = descr[i];
                if (d.getReadMethod() == null) continue;
                if (ignore.contains(d.getName())) continue;

                try {
                    props.put(d.getName(), PropertyUtils.getProperty(bean, d.getName()));
                } catch (Exception e) { }
            }
            return props;
        }

        public HttpServletRequest getRequest(ActionInvocation invocation) {
            return (HttpServletRequest) invocation.getInvocationContext().get(WebWorkStatics.HTTP_REQUEST);
        }
    }
}
-

Don't forget to declare the interceptor in your xwork.xml file and insert it
-into your interceptor stack. -

xwork.xml snippet

-
-
<interceptor name="export" class="com.whatever.interceptors.ActionPropertyExportInterceptor" />
. . .
<interceptor-stack name="standard-interceptors">
    <interceptor-ref name="timer" />
    <interceptor-ref name="logger" />
    <interceptor-ref name="params" />
*    <interceptor-ref name="export"/>*
    <interceptor-ref name="validateParams"/>
    <interceptor-ref name="awarePlugger" />
</interceptor-stack>
-

Your action need to provide getters for all properties that should be exported into the
-request attribute set. -

class ViewUser

-
-
public class ViewUser extends ActionSupport {
    private int                         id;
    private User                        user;

    public String execute() throws Exception {
        user = findUser( getId() );
        return Action.SUCCESS;
    }

    public  int   getId()          {return id;}
    public  void  setId(int id)    {this.id = id;}
*    public  User  getUser()        {return user;}*

    private User  findUser(int id) {...}
}
-

The User class might look like this -

class User

-
-
import java.util.Date;
public class User {
    private int     id;
    private String  firstName, lastName, email;
    private String  street, zip, city;
    private Date    date;
    
    public String  getFirstName() {return firstName;}
    //..._getters and setters_...
}
-

Finally, using the samples above you can write your JSP2 page like this. -

ViewUser.jsp

-
-
<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
    <title>Info about ${user.firstName}</title>
</head>
<body>
    <h1>Info about ${user.firstName} ${user.lastName} [OS:ID=${user.id}]</h1>
    <table border="1" cellspacing="0" cellpadding="2" width="90%" >
    <tr>
        <th>Name</th> <td>${user.firstName} ${user.lastName}</td>
    </tr>
    <tr>
        <th>Created</th> <td><fmt:formatDate value="${user.date}" pattern="yyyy-MM-dd HH:mm"/></td>
    </tr>
    <tr>
        <th>Email</th> <td>${user.email}</td>
    </tr>
    <tr>
        <th>Address</th> <td>${user.street} ${user.zip} ${fn:toUpperCase(user.city)}</td>
    </tr>
    </table>
</body>
</html>
-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Validation Examples.html b/docs/chinese/wikidocs/Validation Examples.html deleted file mode 100644 index 9ed434e0c..000000000 --- a/docs/chinese/wikidocs/Validation Examples.html +++ /dev/null @@ -1,87 +0,0 @@ - - - WebWork 2 : УÑéʾÀý - - - - - - - - - -
- -
- This page last changed on Nov 29, 2004 by jcarreira. -
- -

ÕâÊǰüº¬ÔÚWW:WebWorkʾÀýwarÎļþÖÐÒ»¸öʹÓÃXWork:УÑé¿ò¼ÜµÄÀý×Ó. Àý×ÓÓÉÈý²¿·Ö×é³É, ʹÓÃÏàͬµÄ»î¶¯ÀàºÍÊÓÍ¼Ò³Ãæ(Velocity). -

Ô´´úÂë

Ê×ÏÈ, ½«validators.xmlÎļþ¼ÓÈëµ½Ô´´úÂë¸ù·¾¶Ï -
-
<validators>
    <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
</validators>
-

±¾ÀýÖÐʹÓõĻÀàÊÇValidatedAction -

-
package com.opensymphony.webwork.example;

import com.opensymphony.xwork.ActionSupport;

/**
 * ValidatedAction
 * @author Jason Carreira
 * Created Sep 12, 2003 9:23:38 PM
 */
public class ValidatedAction extends ActionSupport {
    private ValidatedBean bean = new ValidatedBean();
    private String name;
    private String validationAction = "basicValidation.action";

    public ValidatedBean getBean() {
        return bean;
    }

    public void setBean(ValidatedBean bean) {
        this.bean = bean;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValidationAction() {
        return validationAction;
    }

    public void setValidationAction(String validationAction) {
        this.validationAction = validationAction;
    }
}
-

ValidatedActionµÄ»ù±¾Ð£ÑéÎļþÊÇValidatedAction-validation.xml -
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>You must enter a name.</message>
        </field-validator>
    </field>
</validators>
-

-ËüÓëÆäËüУÑéÎļþ·ÅÖÃÔÚÓëÀàÏàͬµÄĿ¼ÏÂ.

»î¶¯µÄ±íµ¥ÊÇvalidationForm.vm -

-
<html>
<head><title>Webwork Validation Example</title></head>
<body>
#if( $actionErrors.size() > 0 )
<p>
<font color="red">
<b>ERRORS:</b><br>
<ul>
#foreach( $error in $actionErrors )
<li>$error</li>
#end
</ul>
</font>
</p>
#end
<p>
<form name="myForm" action="${validationAction}" method="POST">
<input type="hidden" name="validationAction" value="${validationAction}"/>
Action Properties:
<br>
<table>
#tag( TextField "label=Name" "name=name" "value=name" )
</table>
Bean Properties:
#if( $stack.findValue("fieldErrors") )
    #set( $beanErrors = $stack.findValue("fieldErrors.get('bean')") )
    #if( $beanErrors.size() > 0 )
    <br>
    <font color="red">
    <b>Bean Errors:</b><br>
    <ul>
    #foreach( $beanError in $beanErrors )
    <li>$beanError</li>
    #end
    </ul>
    </font>
    #end
#end
<table>
#tag( TextField "label=Bean.Text" "name=bean.text" "value=bean.text" )<br>
#tag( TextField "label=Bean.Date" "name=bean.date" "value=bean.date" )<br>
#tag( TextField "label=Bean.Number" "name=bean.number" "value=bean.number" )<br>
#tag( TextField "label=Bean.Number2" "name=bean.number2" "value=bean.number2" )<br>
</table>
<input type="submit" value="Test Validation"/>
</form>
</body>
-

±¾ÀýµÄ³É¹¦Ò³Ãæ·Ç³£¼òµ¥, valid.vm -
-
<html>
<head><title>WebWork Validation Test: Valid</title></head>
<body>
Input was valid!
</body>
</html>
-

ºóÃæÎÒÃǽ«Õ¹Ê¾±¾ÀýÖÐÆäËûÅäÖÃÎļþµÄÄÚÈÝ. -

»ù±¾Ð£Ñé

»ù±¾Ð£ÑéÀý×Ó¶¨ÒåÔÚxwork.xmlÖÐ -
-
<action name="basicValidation" class="com.opensymphony.webwork.example.ValidatedAction">
            <interceptor-ref name="validationWorkflowStack"/>

            <result name="success" type="dispatcher">valid.vm</result>
            <result name="input" type="dispatcher">validationForm.vm</result>
            <result name="error" type="dispatcher">validationForm.vm</result>
        </action>
-

ÕâÀïinterceptor-refµÄÖµ"validationWorkflowStack"¶¨ÒåÔÚwebwork-default.xmlÖÐ, ËüÌṩValidationInterceptor(²Î¼ûXWork:УÑé¿ò¼ÜºÍDefaultWorkFlowInterceptor(²Î¼ûXWork:DefaultWorkflow)µÄ½ØÈ¡¹¦ÄÜ. ÅäÖÃÎļþÖÐËùÓеIJÎÊý(±¾ÀýÖÐÓÐÒ»¸ö)¶¼´ÓrequestÈ¡³öÉèÖõ½»î¶¯. ½ÓÏÂÀ´, Ö´ÐÐУÑé, ×îºó½«Ö´ÐÐDefaultWorkflow(²Î¼ûXWork:DefaultWorkflow).

±¾ÀýÊ®·Ö¼òµ¥, ½öʹÓÃÁËÒ»¸öÅäÖÃÎļþValidatedAction-validation.xml. ÕâÒâζ×ÅֻУÑéname×Ö¶ÎÊÇ·ñÊäÈëÄÚÈÝ. -

·ÃÎÊÕßУÑéʾÀý

×¢Òâ: ²é¿´ÁíÒ»¸ö·ÃÎÊÕß×Ö¶ÎУÑéÆ÷ʾÀý.

ValidatedAction°üº¬Ò»¸öÆÕͨJava¶ÔÏóÒýÓÃ, ValidatedBean: -
-
package com.opensymphony.webwork.example;

import java.util.Date;

/**
 * ValidatedBean
 * @author Jason Carreira
 * Created Sep 12, 2003 9:24:18 PM
 */
public class ValidatedBean {
    private String text;
    private Date date = new Date(System.currentTimeMillis());
    private int number;
    private int number2;
    public static final int MAX_TOTAL = 12;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getNumber2() {
        return number2;
    }

    public void setNumber2(int number2) {
        this.number2 = number2;
    }
}
-

ValidatedBeanµÄУÑéÅäÖÃÎļþÊÇValidatedBean-validation.xml -

-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="text">
        <field-validator type="requiredstring">
            <message key="invalid.text">Empty Text!</message>
        </field-validator>
    </field>
    <field name="date">
        <field-validator type="date">
            <param name="min">01/01/1970</param>
            <message key="invalid.date">Invalid Date!</message>
        </field-validator>
    </field>
    <field name="number">
        <field-validator type="int">
            <param name="min">1</param>
            <param name="max">10</param>
            <message key="invalid.number">Invalid Number!</message>
        </field-validator>
    </field>
</validators>
-

±¾ÀýÖÐ, Ôö¼ÓÒ»¸öVisitorFieldValidatorÀ´ÊµÏÖ¶ÔValidatedBeanµÄУÑé. »î¶¯¶¨ÒåÔÚxwork.xmlÎļþÖÐ: -
-
<action name="visitorValidation" class="com.opensymphony.webwork.example.ValidatedAction">
            <interceptor-ref name="validationWorkflowStack"/>
            <param name="validationAction">visitorValidation.action</param>
            <result name="success">valid.vm</result>
            <result name="input">validationForm.vm</result>
            <result name="error">validationForm.vm</result>
        </action>
-

¿ÉÒÔ·¢ÏÖ±¾ÀûÓÚ»ù±¾Ð£ÑéµÄϸ΢²î±ð. »î¶¯Ôö¼ÓÁËÒ»¸ö¾²Ì¬²ÎÊý. ¸Ã²ÎÊýÉèÖÃÁË¶Ô±íµ¥½øÐÐУÑéµÄ»î¶¯(²Î¼ûvalidationForm.vm).

»î¶¯µÄÃû×Ö, visitorValidationÓ³Éäµ½ÁíÒ»¸öÎļþValidatedAction-visitorValidation-validation.xmlÖеÄУÑé»î¶¯ -
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="bean">
        <field-validator type="required">
            <message>The bean must not be null.</message>
        </field-validator>
        <field-validator type="visitor">
            <message>bean: </message>
        </field-validator>
    </field>
</validators>
-

УÑé¿ò¼Ü½«»ùÓÚÀàÃû(ValidatedAction), »î¶¯±ðÃû(visitorValidation)ºÍ±ê×¼ºó׺(-validation.xml)×é³ÉÎļþÃûValidatedAction-visitorValidation-validation.xml.

¸ÃÎļþΪbean×ֶζ¨ÒåÁËÁ½¸öУÑéÆ÷£º requiredУÑéÆ÷±£Ö¤bean²»Îªnull; VisitorFieldValidator. VisitorFieldValidator½«Ê¹ÓÃValidatedBeanµÄУÑéÅäÖò¢Ê¹ÓÃÓëValidatedActionÏàͬµÄУÑéÉÏÏÂÎÄ(validation context)visitorValidation. Òò´Ë½«Ë³Ðò²éÕÒÎļþValidatedBean-validation.xml (ValidatedBeanµÄȱʡУÑéÎļþ)ºÍValidatedBean-visitorValidation-validation.xml (±¾Ð£ÑéÉÏÏÂÎÄʹÓõÄУÑé).

ValidatedBean-validation.xmlÈçÏÂ:

-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="text">
        <field-validator type="requiredstring">
            <message key="invalid.text">Empty Text!</message>
        </field-validator>
    </field>
    <field name="date">
        <field-validator type="date">
            <param name="min">01/01/1970</param>
            <message key="invalid.date">Invalid Date!</message>
        </field-validator>
    </field>
    <field name="number">
        <field-validator type="int">
            <param name="min">1</param>
            <param name="max">10</param>
            <message key="invalid.number">Invalid Number!</message>
        </field-validator>
    </field>
</validators>
-

¸ÃÎļþУÑéÈý¸ö×Ö¶Î(text, date, and number)²¢Î´ËüÃÇÌṩÁËÏûÏ¢. ÏûÏ¢¼üÖµ½«ÓÃÓÚÔÚValidatedBeanÀàÖ¸¶¨µÄ×ÊÔ´ÎļþÖвéÕÒÎı¾. ÓëValidatedBeanÔÚͬһĿ¼ÖÐÎļþÃûΪValidatedBean.properties -

-
invalid.date=You must enter a date after ${min}.
invalid.text=You must enter some text.
invalid.number=You must enter a number between ${min} and ${max}.
invalid.total=The total of number and number2 must be less than ${@com.opensymphony.webwork.example.ValidatedBean@MAX_TOTAL}.
-

ÕâЩÏûÏ¢½«ÓÃÓÚÈκÎÓëValidatedBeanÓйصĴíÎóÖÐ. ÈçÄãËù¼û, ÏûÏ¢Ìå¿ÉÒÔʹÓÃBean, ½ØÈ¡Æ÷, »î¶¯µÄÊôÐÔ(½«°´ÕÕÕâÑùµÄ˳Ðò½øÐÐËÑË÷)½øÐвÎÊý»¯. ÕâÒ²ÊÇÒ»¸öʹÓþ²Ì¬×ֶεÄÀý×Ó ${@com.opensymphony.webwork.example.ValidatedBean@MAX_TOTAL}.

ValidatedBean-visitorValidation-validation.xmlÎļþ¶¨ÒåvisitorValidation УÑéÉÏÏÂÎÄϵÄУÑ鹿Ôò, µ«Ëü²¢²»´æÔÚ, Òò´Ë±»ºöÂÔ. -

´øÓбí´ïʽУÑéÆ÷µÄ·ÃÎÊÕßУÑé

×îºóÒ»¸öÀý×ÓµÄÅäÖÃÓëÉÏÒ»¸öÀý×ÓÀàËÆ. ±¾ÀýµÄxwork.xmlÅäÖúÍvisitorValidationÀý×ÓÖеĺÜÏàËÆ -
-
<action name="expressionValidation" class="com.opensymphony.webwork.example.ValidatedAction">
            <interceptor-ref name="validationWorkflowStack"/>
            <param name="validationAction">expressionValidation.action</param>
            <result name="success">valid.vm</result>
            <result name="input">validationForm.vm</result>
            <result name="error">validationForm.vm</result>
        </action>
-

ÎļþValidatedAction-expressionValidation-validation.xml¶¨Òå¸ÃУÑéÉÏÏÂÎĵļìÑ鹿Ôò: -

-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="bean">
        <field-validator type="required">
            <message>The bean must not be null.</message>
        </field-validator>
        <field-validator type="visitor">
            <param name="context">expression</param>
            <message>bean: </message>
        </field-validator>
    </field>
</validators>
-

Ëü¼¸ºõÓëValidatedAction-visitorValidation-validation.xmlÎļþÒ»Ñù, µ«ËüΪVisitorFieldValidator´«µÝÁËÒ»¸öcontext²ÎÊý. ±¾ÀýÖÐ, ²»Ê¹ÓÃÓëValidatedActionÏàͬµÄУÑéÉÏÏÂÎÄ(expressionValidation), Ëü´«µÝÁËÁíÒ»¸öÉÏÏÂÎÄ(expression).

±¾ÀýÖÐ, Õë¶ÔValidatedBeanµÄУÑéÎļþÒѾ­´æÔÚ, Ãû×ÖÊÇValidatedBean-expression-validation.xml -

-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <validator type="expression">
        <param name="expression">@com.opensymphony.webwork.example.ValidatedBean@MAX_TOTAL > (number + number2)</param>
        <message key="invalid.total">Invalid total!</message>
    </validator>
</validators>
-

-ÕâÔö¼ÓÁËÒ»¸ö¶ÔÏó¼¶±ðµÄ(ÓëÖ®Ïà·´µÄÊÇ×ֶμ¶±ð)ExpressionValidator, ½«numberºÍnumber2×ֶεĺÍÓ뾲̬³£Á¿±È½Ï, Èç¹û×ܺʹóÓÚ³£Á¿½«Ôö¼ÓÒ»¸ö´íÎóÐÅÏ¢. -

VisitorFieldValidator´íÎóÐÅÏ¢×¢ÒâÊÂÏî

ʹÓÃVisitorFieldValidator, ÏûÏ¢×Ö¶ÎÃûʹÓöÔÏóµÄ×Ö¶ÎÃû. ±¾ÀýÖÐ, ValidatedBeanµÄ×Ö¶Î"text", "date", "number"µÄ´íÎóÐÅÏ¢½«Ê¹ÓÃ×Ö¶ÎÃû"bean.text", "bean.date", "bean.number". ×îºóÒ»¸öÀý×ÓÖеĶÔÏó¼¶±ðµÄExpressionValidator²úÉúµÄ´íÎóÐÅÏ¢½«×÷Ϊһ¸ö×ֶμ¶±ðµÄ´íÎóʹÓÃÃû×Ö"bean"Ìí¼Óµ½»î¶¯ÖÐ. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Validation.html b/docs/chinese/wikidocs/Validation.html deleted file mode 100644 index ba8391e1e..000000000 --- a/docs/chinese/wikidocs/Validation.html +++ /dev/null @@ -1,65 +0,0 @@ - - - WebWork 2 : УÑé - - - - - - - - - -
- -
- This page last changed on Dec 05, 2004 by plightbo. -
- -

WebWorkÒÀ¿¿XWorkµÄУÑé¿ò¼Ü½«Ó¦ÓõÄÊäÈëУÑ鹿ÔòÓ¦Óõ½»î¶¯ÖÐ. ±¾½Ú½öÌṩºÜÉÙµÄÐÅÏ¢ÈÃÄã¿ÉÒÔÉÏÊÖ²¢È±ÄÚÈݼ¯ÖÐÔÚThis section only provides the bare minimum to get you started and focuses on WebWorkΪ֧³Ö¿Í»§¶ËУÑé¶ø¶ÔXWorkУÑéÆ÷½øÐеÄÀ©Õ¹.

¸ü¶àÐÅÏ¢Çë²ÎÔÄXWorkУÑé¿ò¼ÜÎĵµ.

²Î¿¼ÄÚÈÝ -

    -
  1. ¼òµ¥Ð£ÑéÆ÷
  2. -
  3. ·ÃÎÊÕßУÑé
  4. -
  5. ¿Í»§¶ËУÑé
  6. -
  7. ʾÀý
  8. -

×¢²áУÑéÆ÷

УÑ鹿Ôò°üº¬ÔÚУÑéÆ÷ÖÐ, Ëü±ØÐëÔÚValidatorFactoryÖÐ×¢²á. ¼òµ¥µÄ°ì·¨ÊÇÔÚ¸ùÀà·¾¶(/WEB-INF/classes)ÖÐÌí¼ÓÎļþvalidators.xml²¢ÔÚÆäÖÐÉùÃ÷ÄãʹÓõÄÈ«²¿Ð£ÑéÆ÷. ÎļþµÄÓï·¨ÈçÏÂ: -

-
<validators>
    <validator name="required" 
        class="com.opensymphony.webwork.validators.JavaScriptRequiredFieldValidator"/>
    <validator name="requiredstring"
        class="com.opensymphony.webwork.validators.JavaScriptRequiredStringValidator"/>
    <validator name="stringlength"
        class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
    <validator name="int"
        class="com.opensymphony.webwork.validators.JavaScriptIntRangeFieldValidator"/>
    <validator name="date"
        class="com.opensymphony.webwork.validators.JavaScriptDateRangeFieldValidator"/>
    <validator name="expression"
        class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression"
        class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
    <validator name="email"
        class="com.opensymphony.webwork.validators.JavaScriptEmailValidator"/>
    <validator name="url"
        class="com.opensymphony.webwork.validators.JavaScriptURLValidator"/>
    <validator name="visitor"
        class="com.opensymphony.xwork.validators.VisitorFieldValidator"/>
    <validator name="conversion"
        class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
</validators>
-

-ÕâÀïÉùÃ÷ÁËWebWork¸½´øµÄÈ«²¿Ð£ÑéÆ÷.

´ò¿ªÐ£Ñé

¼¤»î¶Ôij»î¶¯Ð£ÑéµÄ·½·¨Êǽ«ValidationInterceptor¼ÓÈë»î¶¯µÄinterceptor-refsÖÐ(²Î¼ûxwork.xml): -

-
<interceptor name="validator" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
-

×¢Òâ: ȱʡµÄvalidationWorkflowStackÒѾ­°üº¬¸ÃÀ¹½ØÆ÷. -

¶¨ÒåУÑ鹿Ôò

УÑ鹿Ôò¿ÉÒÔÖ¸¶¨¸ø:
- -
    -
  1. ÿ¸ö»î¶¯Àà: ÔÚÎļþActionName-validation.xmlÖÐ
  2. -
  3. ÿ¸ö»î¶¯±ðÃû: ÔÚÎļþActionName-alias-validation.xmlÖÐ
  4. -
  5. »î¶¯ÀàµÄ¼Ì³ÐÁ´»òʵÏֵĽӿÚ: WebWorkËÑË÷»î¶¯ÀàµÄ¼Ì³ÐÊ÷ѰÕÒ¸¸Àà»ò½Ó¿ÚµÄУÑ鹿Ôò
  6. -

-ÏÂÃæÊÇÒ»¸öÀý×ÓSimpleAction-validation.xml:
- -
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="bar">
        <field-validator type="required">
            <message>You must enter a value for bar.</message>
        </field-validator>
        <field-validator type="int">
            <param name="min">6</param>
            <param name="max">10</param>
            <message>bar must be between ${min} and ${max}, current value is ${bar}.</message>
        </field-validator>
    </field>
    <field name="date">
        <field-validator type="date">
            <param name="min">12/22/2002</param>
            <param name="max">12/25/2002</param>
            <message>The date must be between 12-22-2002 and 12-25-2002.</message>
        </field-validator>
    </field>
    <field name="foo">
        <field-validator type="int">
            <param name="min">0</param>
            <param name="max">100</param>
            <message key="foo.range">Could not find foo.range!</message>
        </field-validator>
    </field>
    <validator type="expression">
        <param name="expression">foo > bar</param>
        <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>
    </validator>
</validators>
-

ÕâÀïÊÇSimpleActionÀàµÄУÑéÎļþ. Validators(ºÍfield-validators)ÔªËØ±ØÐë¾ß±¸typeÊôÐÔ, ËüÒýÓÃValidatorFactoryÖÐ×¢²áµÄÒ»¸öУÑéÆ÷µÄÃû×Ö. ValidatorÔªËØÒ²¿ÉÒÔ°üº¬<param>ÔªËØ, ʹÓÃnameºÍvalueÊôÐÔ½«²ÎÊýÉèÖõ½Ð£ÑéÆ÷ʵÀýÖÐ. ÏÂÎÄÊǶÔmessageÔªËØµÄÌÖÂÛ.

ÿ¸öValidator»òField-ValidatorÔªËØ±ØÐ趨ÒåÒ»¸ömessageÔªËØ. messageÔªËØÓÐÒ»¸öÊôÐÔ"key", Ëü²»ÊDZØÐèµÄ. Èç¹ûУÑéʧ°Ü, messageÔªËØµÄÕýÎÄ(body)½«×÷ΪĬÈÏÏûÏ¢¼Óµ½»î¶¯ÖÐ.

"key"ÊôÐÔ¶¨ÒåÁËÏûÏ¢µÄ¼üÖµ, Èç¹û»î¶¯ÊµÏÖÁËLocaleAware½Ó¿Ú(ActionSupportÀàÒѾ­ÊµÏÖÁËÕâÒ»½Ó¿Ú), ½«ÔڻµÄ×ÊÔ´°üÖÐʹÓÃgetText()·½·¨²éÕÒÏàÓ¦µÄÏûÏ¢ÄÚÈÝ. ÕâÌṩÁ˸ù¾ÝÓû§ÇëÇóµÄÇøÓòÉèÖÃ(»òÈκÎÉèÖõ½LocaleAware»î¶¯ÖеÄÇøÓò)Ñ¡Ôñ¶ÔÓ¦µÄÇøÓò»¯ÏûÏ¢µÄÄÜÁ¦.

ÔÚʹÓÃkey´Ó×ÊÔ´°üÖлñÈ¡ÏûÏ¢»òÖ±½ÓµÃµ½Ä¬ÈÏÏûÏ¢Ö®ºó, µ±Ç°Ð£ÑéÆ÷±»Ñ¹ÈëÖµÕ», È»ºó½«¶ÔÏûÏ¢½øÐнâÎö, ½«${...}²¿·ÖÓÃ${ºÍ}Ö®¼äµÄ×Ö·û´®µÄ¸³Öµ½á¹û½øÐÐÌæ»». ¿ÉÒÔʹÓÃУÑéÆ÷ºÍ»î¶¯¶ÔÏóÀ´¶¨Òå²ÎÊý»¯ÏûÏ¢. ÏÂÃæÊDzÎÊý»¯ÏûÏ¢µÄÀý×Ó:
- -
-
bar must be between ${min} and ${max}, current value is ${bar}.
-

Ëü½«´ÓIntRangeFieldValidatorÖÐÈ¡³öminºÍmax²ÎÊý, ´Ó»î¶¯ÖÐÈ¡³öbarµÄÖµ.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Value Stack Internals.html b/docs/chinese/wikidocs/Value Stack Internals.html deleted file mode 100644 index 3e3b74d3f..000000000 --- a/docs/chinese/wikidocs/Value Stack Internals.html +++ /dev/null @@ -1,62 +0,0 @@ - - - WebWork 2 : Value Stack Internals - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

As Matt Ho explained on the mailing list:
- - A value stack is essentially a List. Calling [1] on the stack,
- returns a substack beginning with the element at index 1. It's only
- when you call methods on the stack that your actual objects will be
- called.

Said another way, let's say I have a value stack that consists of a
- model and an action as follows:

[ model, action ]

here's how the following ognl would resolve:

[0] - a CompoundRoot object that contains our stack, [model, action]

[1] - another CompoundRoot that contains only [action]

[0].toString() - calls toString() on the first object in the value
- stack (excluding the CompoundRoot) that supports the toString() method

[1].foo - call getFoo() on the first object in the value stack
- starting from [OS:action] and excluding the CompoundRoot that supports a
- getFoo() method

I hope this doesn't sound too confusing :\

If you're using Velocity, this can most easily be written as:

$stack.findValue("[0]").peek()

Unfortunately, <ww:property value="[0].peek()"/> won't work as this
- would translate into "starting at the top of the value stack (and
- excluding the CompoundRoot), find the first object that has a method
- called peek()"

--------thanks Matt!

here is the com.opensymphony.xwork.util.CompoundRoot class which Matt mentions:
- -
-
public class CompoundRoot extends ArrayList {
    //~ Constructors ///////////////////////////////////////////////////////////

    public CompoundRoot() {
    }

    public CompoundRoot(List list) {
        super(list);
    }

    //~ Methods ////////////////////////////////////////////////////////////////

    public CompoundRoot cutStack(int index) {
        return new CompoundRoot(subList(index, size()));
    }

    public Object peek() {
        return get(0);
    }

    public Object pop() {
        return remove(0);
    }

    public void push(Object o) {
        add(0, o);
    }
}
-
-

What's on the stack?

-WebWork2 contains the following items by default in the ValueStack:
- -
    -
  • req - the current HttpServletRequest
  • -
  • res - the current HttpServletResponse
  • -
  • stack - the current OgnlValueStack
  • -
  • ognl - an instance of OgnlTool
  • -
  • ui - a (now deprecated) instance of a ui tag renderer
  • -
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Velocity Result.html b/docs/chinese/wikidocs/Velocity Result.html deleted file mode 100644 index 1c0aa195e..000000000 --- a/docs/chinese/wikidocs/Velocity Result.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork 2 : Velocity Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

Velocity

¸Ã½á¹ûÄ£ÄâJSPÔËÐл·¾³, ÏÔʾVelocityÄ£°æ½á¹û²¢Ö±½ÓÊä³öµ½servletÊä³öÁ÷.

- - - - - - - -
²ÎÊý ±ØÐè ÃèÊö
location ÊÇ Ö´ÐкóÌø×ªµÄλÖÃ
parse ·ñ ȱʡΪtrue. Èç¹ûÉèΪfalse, location²ÎÊý½«²»×÷ΪOgnl±í´ïʽ½øÐнâÎö
-
-
<result name="success" type="velocity">
    <param name="location">foo.vm</param>
</result>
-
- - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Visitor validation.html b/docs/chinese/wikidocs/Visitor validation.html deleted file mode 100644 index a72ace4ad..000000000 --- a/docs/chinese/wikidocs/Visitor validation.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork 2 : Visitor validation - - - - - - - - - -
- -
- This page last changed on Jul 10, 2004 by unkyaku. -
- -

VisitorFieldValidatorÔÊÐí½«Ð£Ñé×ªÒÆ¸ø»î¶¯µÄÊôÐÔ²¢Ê¹ÓÃËü×Ô¼ºµÄУÑéÎļþ. This allows you to use the ModelDriven development pattern and manage your validations for your models in one place, where they belong, next to your model classes. The VisitorFieldValidator can handle either simple Object properties, Collections of Objects, or Arrays. See XW:Standard Validators#VisitorFieldValidator

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/VisitorFieldValidatorExample.html b/docs/chinese/wikidocs/VisitorFieldValidatorExample.html deleted file mode 100644 index d87eaee28..000000000 --- a/docs/chinese/wikidocs/VisitorFieldValidatorExample.html +++ /dev/null @@ -1,53 +0,0 @@ - - - WebWork 2 : VisitorFieldValidatorExample - - - - - - - - - -
- -
- This page last changed on Nov 29, 2004 by jcarreira. -
- -

I've been using the validator in webwork and have found myself duplicating a few of the validations throughout the app, so after asking a few questions I was told what to do.

basically I have a creation form to create a Car, and then I have another to Edit and Update the Car, I wanted to create just one validation file that would validate that Car, I was using 2 validation files, CreateCarAction-validation.xml and UpdateCarAction-validation.xml and both were identical.

what I had to do was:

first i had to expose the Car object in my action, then I had to create a validation file for the action, and placed this file in the same package as the CarAction in this example;

CarAction-validation.xml -

-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="car">
        <field-validator type="visitor">
            <message>Car Visitor: </message>
        </field-validator>
    </field>
</validators>
-

next I had to create Car-validation.xml file and put this file in the same package as the Car class

Car-validation.xml -

-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>

    <field name="name">
        <field-validator type="requiredstring">
            <message>Name is REQUIRED</message>
        </field-validator>
    </field>
    <field name="model">
        <field-validator type="requiredstring">
            <message>Model is REQUIRED</message>
        </field-validator>
    </field>

</validators>
-

so now if the input strings car.model and car.name are empty you should get fieldErrors added to the car.name and car.model fields, you just need to make sure that in your action you expose the Car object.

heres the CarAction.java file: -

-
public class CarAction extends ActionSupport {

    private Car car = new Car();

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public String execute() {
        return SUCCESS;
    }


}
-

-heres my Car bean: -
-
public class Car {
    private String name;
    private String model;

    public Car() {}

   public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }
}
-

-and then the car.vm file: -
-
<form method="get">

<table border="1" align="center">

    #tag( TextField "label=Car ID" "name=car.id" "value=car.id" )
    #tag( TextField "label=Car Name" "name=car.name" "value=car.name" )
    #tag( TextField "label=Car Model" "name=car.model" "value=car.model" )

    #tag( Submit "value='Submit Car'" "align=center")

</table>

</form>
-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebFlow.html b/docs/chinese/wikidocs/WebFlow.html deleted file mode 100644 index 25a9b9935..000000000 --- a/docs/chinese/wikidocs/WebFlow.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork 2 : WebFlow - - - - - - - - - -
- -
- This page last changed on Nov 14, 2004 by plightbo. -
- -

WebWork¸½´øÒ»¸öÃûΪWebFlowµÄ¹¤¾ß. WebFlowÓÃÓÚÉú³ÉWebÓ¦ÓóÌÐòµÄÁ÷³Ìͼ. Ëüͨ¹ý½âÎöÅäÖÃÎļþ, »î¶¯Àà, ºÍÊÓͼ(JSPºÍVelocity)Îļþ´ïµ½Ä¿µÄ.

Ó÷¨

ʹÓÃÏÂÃæµÄÃüÁî:

-

java -cp … -jar webflow.jar -config CONFIG_DIR -views VIEWS_DIRS -output OUTPUT

ÔÚÕâÀï: -
    -
  • CONFIG_DIRÊÇxwork.xmlºÍÆäËûÅäÖÃÎļþËùÔÚµÄĿ¼
  • -
  • VIEWS_DIRSÊÇÓöººÅ·Ö¸ôµÄ´æ·ÅJSPºÍVelocityÎļþµÄĿ¼Áбí
  • -
  • OUTPUTÊÇWebFlowÎļþµÄÊä³öĿ¼
  • -
-

- -
-

×¢Òâ: µ÷ÓÃWebFlow¹¤¾ßÊDZØÐëÌṩÕýÈ·µÄÀà·¾¶. ÓÈÆäÊÇXWork, WebWork, ºÍËûÃǵÄÖ§³ÖÀà¿â±ØÐëÔÚÀà·¾¶ÖÐ. ͬʱ, »¹±ØÐë°üº¬xwork.xmlÖÐÒýÓõĻÀàÎļþ. ûÓÐÕýÈ·µÄÀà·¾¶, WebFlow¾Í²»ÄÜÕýÈ·¹¤×÷.

-

ʹÓÃdotÎļþ

-WebFlowÊä³öµÄÎļþʹÓÃÀ©Õ¹Ãû"dot". ÎļþʹÓÃGraphViz¹¤¾ß. Ò»µ©WebFlowÉú³ÉÁËdotÎļþ, ¾Í¿ÉÒÔÓÃdot³ÌÐòÀ´»æÖưüº¬Õ¾µãµØÍ¼µÄGIFÎļþ.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebLogic.html b/docs/chinese/wikidocs/WebLogic.html deleted file mode 100644 index 7af2ea0ce..000000000 --- a/docs/chinese/wikidocs/WebLogic.html +++ /dev/null @@ -1,76 +0,0 @@ - - - WebWork 2 : WebLogic - - - - - - - - - -
- -
- This page last changed on Nov 20, 2004 by mcampbell. -
- -
-

> The classloaders of WLS seem not to play nice with velocity when
-> deploying this way.
->
-> If you haven't already tried, do the following, it makes it all work
-> for us:
->
-> 1) In the webwork.properties file (which should be in your
-> WEB-INF/classes directory) put a line like this:
->
-> webwork.velocity.configfile = my-velocity.properties
->
-> 2) create a "my-velocity.properties" file under WEB-INF/classes and
-> put into it the contents of the velocity.properties file that is in
-> webwork's velocity-dep.jar
->
-> 3) in your new "my-velocity.properties" file, find the section titled
-> "T E M P L A T E L O A D E R S", and change this section to look like
-> this:
->
-> ===========================================
-> resource.loader = class
->
-> file.resource.loader.description = Velocity File Resource Loader
-> file.resource.loader.class =
-> org.apache.velocity.runtime.resource.loader.FileResourceLoader
-> file.resource.loader.path = .
-> file.resource.loader.cache = false
-> file.resource.loader.modificationCheckInterval = 2
->
-> class.resource.loader.class =
-> org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
-> class.resource.loader.cache = true
-> ===========================================
->
-> … which straightens out the class resource loading problems (for us
-> at least).
->
-> hope this helps,
-> james

-

Note: The "when deploying this way" comment above refers to deploying a war file (not expanded) into the deployment directory of WebLogic; with WL 8.x, this is typically at <bea_home>/user_projects/domains/mydomain/.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebWork 2 UI Tag Guide.html b/docs/chinese/wikidocs/WebWork 2 UI Tag Guide.html deleted file mode 100644 index 8c3793f08..000000000 --- a/docs/chinese/wikidocs/WebWork 2 UI Tag Guide.html +++ /dev/null @@ -1,88 +0,0 @@ - - - WebWork 2 : WebWork 2 UI±êǩָÄÏ - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
-

[±¾ÎĵµÄÚÈÝÓëÄ£°æÄÚÈÝÖØ¸´, ²»×ö·­Òë]

-

Overview

In WebWork 2, the UI tags wrap generic HTML controls while providing tight integration with the core framework. The tags have been designed to minimize the amount of logic in compiled code and delegate the actual rendering of HTML to a template system. The UI tags attempt to cover the most common scenarios, while providing a Component Tag for creating custom components. The UI tags also provide built-in support for displaying inline error messages. -

Template System

WebWork 2 uses the Velocity template system to render the actual HTML output for all UI tags. A default implementation of all templates has been included with the core distribution allowing users to use WebWork's UI tags "out of the box". Templates can be edited individually or replaced entirely allowing for complete customization of the resulting HTML output. In addition, the default template can be overridden on a per tag basis allowing for a very fine level of control. The default templates are located in the webwork-2.0.jar file under /decorators/xhtml.

Update (2003-11-13): It is now found in /template/xhtml

Note: This is going to change with the theme support that was added.

The AbstractUI class is the base class that other UI tags extend. It provides a set of attributes that are common across UI components. There are 3 attributes that determine which template is rendered:
- -
    -
  • templateDir (defaults to webwork.ui.templateDir - /template/)
  • -
  • theme (defaults to webwork.ui.theme - xhtml)
  • -
  • templateName (default is tag dependent, subclasses must implement getDefaultTemplate() to provide this)
  • -

-These 3 attributes combine to determine the location of the template: templateDir + theme + templateName. For example, the default template for the select tag is "/template/xhtml/select.vm". Any one of these attributes can be overridden by the user at run time.

The AbstractUI class is responsible for loading the correct template. As part of the doStartTag() method, a VelocityContext object is created with the following items:

    -
  • tag - a reference to the tag object
  • -
  • stack - the ValueStack
  • -
  • ognl - a reference to the utility class OgnlTool
  • -
  • req - a reference to the HttpServletRequest object
  • -

-These variables can be accessed in the template by using $TAG_NAME where TAG_NAME is one of tag, stack, ognl or req. The template file is then processed. -

Template support for CSS

The default templates provided with WebWork define two properties for use with CSS. The first property, 'label', is applied to text specified in a label attribute in a JspTag. The second property, 'errorMessage', is applied when displaying inline error messages. Many developers need to highlight error messages more prominently by using an alternative color. The code block below can be used in an external stylesheet or in a style element to display error messages in red.
- -
-
.errorMessage {
    color: red;
}
-

Note: A default stylesheet is not provided with the core distribution. Users are encouraged to define their own stylesheet using the properties WebWork exposes or modify the supplied templates to work with an existing stylesheet.

Validation

Validation and error handling are an integrated part of the core framework. The UI tags extend this by providing built-in support for displaying inline error messages. To use this functionality, just have your actions implement the ValidationAware interface or extend the ActionSupport class. The ActionSupport class provides a default implementation of ValidationAware and also provides support for internationalization. UI tags that support displaying error messages include: Component Tag, Password Tag, Radio Tag, Select Tag, Textarea Tag and Textfield Tag.

A very simple example of validation is included below. The key point to understand is how to add an error message to a specific control. WebWork will display the specified message inline with the form element.

Users are encouraged to take a closer look at the validation framework in XWork. It provides a number of benefits including separating validation code from your action class, declaring rules based on field type, and providing different validation rules for each action alias. The XWork validation framework is based on an interceptor allowing validation to be added or removed from an action with a quick configuration file change. For more information see the XW:Validation Framework.

Example: Displaying field errors

Action class:

-
import com.opensymphony.xwork.ActionSupport;

public class RegisterEmail extends ActionSupport {

    private String email;

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public String execute() throws Exception {
        if (email == null || email.equals("")) {
            // the first parameter is the name attribute
            //   specified in <ui:textfield>
            // the second parameter is the error message
            //   to display
            addFieldError("email", "Email address is required.");
        }

        if (hasErrors()) {
            return ERROR;
        } else {
            return SUCCESS;
        }
    }

}
-

Jsp page:

-
<%@ taglib uri="webwork" prefix="ui" %>

<html>
<head><title>validation example</title></head>
<style type="text/css">
.errorMessage {
    color: red;
}
</style>
<body>

<form name="frmRegister" action="RegisterEmail.action" method="POST">
    <table>
        <ui:textfield label="Email" name="email" value="" size="50" />
        <tr>
            <td colspan="2">
                <input type="submit" name="submit" value="Register" />
            </td>
        </tr>
    </table>
</form>

</body>
</html>
-

HTML output (before submitting):

-
<html>
<head><title>validation example</title></head>
<style type="text/css">
.errorMessage {
    color: red;
}
</style>
<body>

<form name="frmRegister" method="POST" action="RegisterEmail.action">
    <table>
        <tr>
  <td align="right" valign="top"><span class="label">Email:</span></td>
  <td>
<input type="text" name="email" value="" size="50"/>
  </td>
</tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="submit" value="Register" />
            </td>
        </tr>
    </table>
</form>

</body>
</html>
-

HTML output (after submitting): -

-
<html>
<head><title>validation example</title></head>
<style type="text/css">
.errorMessage {
    color: red;
}
</style>
<body>

<form name="frmRegister" method="POST" action="RegisterEmail.action">
    <table>
            <tr>
    <td colspan="2"><span class="errorMessage">
              Email address is required.
        </span></td>
  </tr>
  <tr>
  <td align="right" valign="top"><span class="label">Email:</span></td>
  <td>
<input type="text" name="email" value="" size="50"/>
  </td>
</tr>

        <tr>
            <td colspan="2">
                <input type="submit" name="submit" value="Register" />
            </td>
        </tr>
    </table>
</form>

</body>
</html>
-

Example: Displaying action errors

-

Add the following to the JSP file above the form tag:

-
<ww:if test="hasErrors()">
<p><span class="errorMessage">
<ww:if test="hasActionErrors()">
  <b>Errors:</b><br>
  <ul>
  <ww:iterator value="actionErrors">
    <li><ww:property/></li>
  </ww:iterator>
  </ul>
</ww:if><ww:else>
  <b>Please fix the errors marked in red to continue</b>
</ww:else>
</span></p>
</ww:if>
-

This will display any action errors that may have occured.

Creating Custom Components

At first glance the component tag doesn't look that impressive. The ability to specify a single template and use a number of predetermined attributes looks rather lacking. But the supplied tag offers a number of benefits to developers.

Before diving right into the custom component, first I will identify some advantages to using the component tag to create your components. Then I will detail the two types of error messages in WebWork 2 and how our custom component (for displaying one of these types) fits into the equation. Finally, I will present a sample Action class, Jsp file and template file for our component. When we are finished, you will be able to incorporate the new component into your application.

Why use the component tag? -

    -
  • removes the need to develop your own Jsp tag library
  • -
  • provides integrated support for accessing the ValueStack
  • -
  • leverages XWork's support for internationalization, localization and error handling
  • -
  • faster prototyping using templates (editable text files) instead of compiled code
  • -
  • re-use and combine existing templates
  • -

-More on error message support:

In WebWork 2, there are two types of error messages: field error messages and action error messages. Field error messages are used to indicate a problem with a specific control and are displayed inline with the control. A number of tags provide built-in support for displaying these types of messages. Action error messages on the other hand, indicate a problem with executing an action. Many things can go wrong in a web application, especially an application that relies on external resources such as a database, remote web service, or other resource that might not be accessible during the execution of an action. Handling an error gracefully and presenting the user with a useful message can often be the difference in a positive user/customer experience and a bad one.

When these types of errors occur, it is more appropriate to display these messages separate from individual controls on the form. In the example below, we will create a custom component that can be used to display action error messages in a bulletted list. This component can then be used on all your forms to display these error messages.

The action class below was created to handle a promotion on the website: a free e-certificate. It will try to email the certificate, but an exception will be thrown.

Action class:

-
package example;

import com.opensymphony.xwork.ActionSupport;

public class AddUser extends ActionSupport {

    private String fullname;
    private String email;

    public String execute() throws Exception {
        // we are ignoring field validation in this example

        try {
            MailUtil.sendCertificate(email, fullname);
        } catch (Exception ex) {
            // there was a problem sending the email
            // in a real application, we would also
            // log the exception
            addActionError("We are experiencing a technical problem and have contacted our support staff. " +
                           "Please try again later.");
        }

        if (hasErrors()) {
            return ERROR;
        } else {
            return SUCCESS;
        }
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}
-

Jsp page:

-
<%@ taglib uri="webwork" prefix="ui" %>

<html>
<head><title>custom component example</title></head>
<style type="text/css">
.errorMessage {
    color: red;
}
</style>
<body>

<ui:form action="AddUser.action" method="POST">
<table>
    <ui:component template="action-errors.vm" />
    <ui:textfield label="Full Name" name="fullname" />
    <ui:textfield label="Email" name="email" />
    <ui:submit name="submit" value="Send me a free E-Certificate!" />
</table>
</ui:form>

</body>
</html>
-

HTML output (before submitting):

-
<html>
<head><title>custom component example</title></head>
<style type="text/css">
.errorMessage {
    color: red;
}
</style>
<body>

<form  action="AddUser.action" method="POST" />

<table>
    

    <tr>
  <td align="right" valign="top"><span class="label">Full Name:</span></td>
  <td>
<input type="text" name="fullname" value="" />
  </td>
</tr>
    <tr>
  <td align="right" valign="top"><span class="label">Email:</span></td>
  <td>
<input type="text" name="email" value="" />
  </td>
</tr>
    
<tr>
  <td colspan="2">
    <div align="right">
      <input type="submit" name="submit" value="Send me a free E-Certificate!"/>
    </div>
  </td>
</tr>


</table>
</form>

</body>
</html>
-

The template below will loop through any action errors and display them to the user in a bulletted list.

Template (action-errors.vm)
- -
-
#set ($actionErrors = $stack.findValue("actionErrors"))

#if ($actionErrors)
<tr>
    <td colspan="2">
        <span class="errorMessage">The following errors occurred:</span>
        <ul>
            #foreach ($actionError in $actionErrors)
            <li><span class="errorMessage">$actionError</span></li>
            #end
        </ul>
    </td>
</tr>
#end
-

HTML output (after submitting):

-
<html>
<head><title>custom component example</title></head>
<style type="text/css">
.errorMessage {
    color: red;
}
</style>
<body>

<form  action="AddUser.action" method="POST" />

<table>
    
<tr>
    <td colspan="2">
        <span class="errorMessage">The following errors occurred:</span>
        <ul>
            <li class="errorMessage">
                We are experiencing a technical problem and have contacted our 
                support staff. Please try again later.
            </li>
        </ul>
    </td>
</tr>

    <tr>
  <td align="right" valign="top"><span class="label">Full Name:</span></td>
  <td>
<input type="text" name="fullname" value="Sample User" />
  </td>
</tr>
    <tr>
  <td align="right" valign="top"><span class="label">Email:</span></td>
  <td>
<input type="text" name="email" value="user@example.com" />
  </td>
</tr>
    
<tr>
  <td colspan="2">
    <div align="right">
      <input type="submit" name="submit" value="Send me a free E-Certificate!"/>
    </div>
  </td>
</tr>


</table>
</form>

</body>
</html>
-
-

Changes from WebWork 1

TODO

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebWork 2.1.7.html b/docs/chinese/wikidocs/WebWork 2.1.7.html deleted file mode 100644 index 5fec45ff7..000000000 --- a/docs/chinese/wikidocs/WebWork 2.1.7.html +++ /dev/null @@ -1,384 +0,0 @@ - - - WebWork 2 : WebWork 2.1.7 - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

WebWork 2.1.7 release notes

Key changes

-
    -
  • XWork upgraded to 1.0.5
      -
    • Using i18n, especially the ww:text tag, is now possible in SiteMesh decorators. See SiteMesh.
    • -
    • Issues where the ActionContext wasn't properly cleaned up (after ww:include and ww:action) have been resolved.
    • -
    • Configuration
        -
      • If the action class is not specified, it now defaults to com.opensymphony.xwork.ActionSupport.
      • -
      • If the result name is not specified, it is assumed to be "success".
      • -
    • -
  • -
  • Non-UI tags
      -
    • ww:text and ww:url have an id attribute that, when specified, causes the tag not to print out the localized text but rather store the result in the ActionContext to be referenced later. See SiteMesh, URL tag, and Text Tag.
    • -
  • -
  • UI tags
      -
    • ww:form has an added target attribute.
    • -
    • ww:form exposes "namespace" in the parameters Map in templates.
    • -
    • ww:form tag defaults the id and name attribute to the action name that it is submitting to.
    • -
    • Form elements default the id attribute to "[formId]_[elementName]".
    • -
    • Form elements default the "required" attribute to true if there is any validator associated with that field and the form's validate attribute is enabled.
    • -
    • ww:textarea has an added "wrap" attribute.
    • -
    • XHTML theme: added a parameter called "after" and that will add text to the right of the form element.
    • -
  • -
  • Replaced old prototype client-side validation with XmlHttpRequest-based solution (STILL IN PROTOTYPE PHASE, works in XHTML theme only).
  • -
  • Interceptors
      -
    • ServletConfigInterceptor now checks for actions implementing PrincipalAware and adds a Principal that ties in to the HttpServletRequest's Principal.
    • -
    • Minor bug fixes in the ExecuteAndWaitInterceptor and FileUploadInterceptor.
    • -
  • -
  • Results
      -
    • JasperReportsResult and StreamResult both support the Content-disposition header.
    • -
    • JasperReports integration has been upgraded to 0.6.3.
    • -
    • WebWorkResultSupport has a simple conditionalParse() method making support for ${} notation in your results easier (it will parse only if the parse attribute is true).
    • -
  • -
-

Upgrade steps

-
    -
  1. Copy over the new webwork.jar and xwork.jar files.
  2. -
  3. If you are using JasperReports, you will need to upgrade to the latest JasperReports jars of 0.6.3 because the package name has changed.
  4. -
  5. Read the migration notes for anything that you should be aware of.
  6. -
-

Migration notes

-
    -
  • If you were using the old client-side validation code, it is still possible to keep using it but you will likely need to modify form-close.vm and controlheader.vm in the XHTML theme and form.vm in the simple theme. We recommend supporting the new prototype as it is a lot easier to use and doesn't require special validators.
  • -
  • It is possible, though very unlikely, that the default ids for the UI tags and the default name for the form tag might cause you some trouble. Please be aware of this change.
  • -
-

Changelog

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- OpenSymphony JIRA - (26 issues) -
- T - Key - Summary
- Improvement - - WW-706 - - Text tag and URL tag should have option to store contents to context -
- Improvement - - WW-704 - - Integrate PrincipalInterceptor with ServletConfigInterceptor -
- Improvement - - WW-703 - - Add wrap attribute to textarea -
- Improvement - - WW-702 - - Required (*) should be on by default if a validator exists -
- Improvement - - WW-701 - - UI tags should have default ids and names -
- Bug - - WW-698 - - webwork.i18n.encoding does not get set by the ServletDispatcher -
- Improvement - - WW-696 - - StreamResult should accept file option -
- Bug - - WW-695 - - JSP Form Tags does not have a target attribute -
- Bug - - WW-694 - - ExecuteAndWaitInterceptor can return null results -
- Bug - - WW-693 - - FileUploadInterceptor don't check the allowed files's Enumeration whitch is null. -
- Improvement - - WW-692 - - Webwork package of jasper reports packaged as dori.jasper. Latest release of Jasper Reports packaged as net.sf.jasperreports -
- Improvement - - WW-691 - - JasperReports 0.6.3 support -
- Improvement - - WW-687 - - Freemarker - add method buildUrl to FreemakerWebworkUtil -
- Improvement - - WW-686 - - JasperReport result - Content-Disposition management -
- Improvement - - WW-684 - - Default action class and result name. -
- Bug - - WW-681 - - getText() doesn't work in Sitemesh filters -
- Bug - - WW-677 - - ww:include replaces existing value stack with new one -
- Bug - - WW-676 - - Freemarker Support:TemplatePath in web.xml has no effect -
- Improvement - - WW-668 - - Externalise the JavaScript validation support from the JSP taglibs -
- Bug - - WW-649 - - Field errors should be displayed in the order they're in the POJO -
- Bug - - WW-638 - - Freemarker result encoding error -
- Improvement - - WW-637 - - textarea does not have maxlength attribute -
- Bug - - WW-617 - - Stale Action Invocation left in Stack Context -
- Bug - - WW-490 - - Is WW ignoring webwork.locale setting? -
- Improvement - - WW-455 - - Select tag template does not work properly for Object like BigDecima -
- Improvement - - WW-351 - - Forwarding unknown tag attributes -
-

-

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebWork Community.html b/docs/chinese/wikidocs/WebWork Community.html deleted file mode 100644 index 3332a22e8..000000000 --- a/docs/chinese/wikidocs/WebWork Community.html +++ /dev/null @@ -1,39 +0,0 @@ - - - WebWork 2 : WebWorkÍÅÌå - - - - - - - - - -
- -
- This page last changed on Jun 17, 2004 by casey. -
- -

WebWork(WW)ÍÅÌåÓÉÓû§, ¿ª·¢ÕߺÍÅÔ¹ÛÕß¹¹³É. ÔÚʹWebWork³É¹¦µÄ¹ý³ÌÖÐ, ÿһ¸ö½ÇÉ«¶¼Ê®·ÖÖØÒª. Óû§Ã¿ÌìʹÓÿò¼Ü²¢Ìṩ¿ÉÓÃÐÔ·½ÃæµÄÓмÛÖµµÄ·´À¡, ȱÏݺÍÌØÐÔ. ¿ª·¢Õß¹±Ï×ËûÃǵÄʱ¼äÀ´±àд¿É¹©ÆäËûÈËʹÓõĿò¼Ü. ÅÔ¹ÛÕßÇåÎúµÄ²é¿´Õû¸ö¹¤×÷, ËûÃÇÖеÄһЩÈË¿ÉÄÜ»áºÜ¿ì³ÉΪÓû§»ò¿ª·¢Õß.

Why we do what we do?

Õâ¾äÒý×Ôhttp://opensource.orgµÄ»°×îºÃµØ²ûÊöÁËÎÒÃÇΪʲôÀË·Ñ×Ô¼ºµÄʱ¼äΪÃâ·ÑÈí¼þ¹¤×÷.

"The basic idea behind open source is very simple: When programmers can read, redistribute, and modify the source code for a piece of software, the software evolves. People improve it, people adapt it, people fix bugs. And this can happen at a speed that, if one is used to the slow pace of conventional software development, seems astonishing."

"We in the open source community have learned that this rapid evolutionary process produces better software than the traditional closed model, in which only a very few programmers can see the source and everybody else must blindly use an opaque block of bits."

- "¿ª·ÅÔ´´úÂëµÄ»ù±¾Ïë·¨·Ç³£¼òµ¥: µ±³ÌÐòÔ±¿ÉÒÔÔĶÁ, ÖØÐ·¢²¼, ÐÞ¸ÄÈí¼þµÄÔ´´úÂëʱ, Èí¼þ×ÔÉíµÃµ½½ø»¯. ÈËÃǸĽøËü, ÈËÃǸıàËü, ÈËÃÇÐÞÕýȱÏÝ. Óë³£¹æµÄÈí¼þ¿ª·¢Ïà±È½Ï, ÕâÒ»ÇÐÒÔ¾ªÈ˵ÄËٶȽøÐÐ×Å."

"ÔÚ¿ª·ÅÔ´´úÂëÍÅÌåÖÐÎÒÃÇÒѾ­ÖªµÀÕâ¸ö¸ßËÙ½ø»¯¹ý³ÌÓ봫ͳµÄ·â±ÕģʽÏà±ÈÄÜÉú³É³ö¸üºÃµÄÈí¼þ,ÄÇÖÖģʽÖÐÖ»ÓÐÉÙÊý³ÌÐòÔ±¿ÉÒÔ¿´µ½´úÂë¶øÆäËûÈËÖ»ÄÜÏñäÈËÒ»ÑùʹÓò»Í¸Ã÷µÄ×Ö½Ú¿é."

- ÈÏʶΪWebworkºÍOpen Symphony×ö³ö¹±Ï×µÄÍÅ¶Ó - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebWork Freemarker Support.html b/docs/chinese/wikidocs/WebWork Freemarker Support.html deleted file mode 100644 index 8b8f9be4a..000000000 --- a/docs/chinese/wikidocs/WebWork Freemarker Support.html +++ /dev/null @@ -1,80 +0,0 @@ - - - WebWork 2 : WebWork Freemarker Support - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Freemarker Support in WebWork

Freemarker views can be rendered either via the webwork result type freemarker, or by using the dispatcher result type in conjunction Webwork's FreemarkerServlet.

This document will focus on using the freemarker result since it is the recommended approach. An section follows to show how to use the FreemarkerServlet.

Configure your action to use the freemarker result type

The freemarker result type is defined in webwork-default.xml, so normally you just include it, and define your resutls to use type="freemarker".

-
<include file="webwork-default.xml"/>
...
<action name="test" class="package.Test">
  <result name="success" type="freemarker">/WEB-INF/views/testView.ftl</result>
</action>
...
-

- -

Property Resoloution

Your action properties are automatically resolved - just like in a velocity view.

for example ${name} will result in stack.findValue("name"), which generaly results in action.getName() being executed.

A search process is used to resolve the variable, searching the following scopes in order, until a value is found : -
    -
  • freemarker variables
  • -
  • value stack
  • -
  • request attributes
  • -
  • session attributes
  • -
  • servlet context attributes
  • -
-

Objects in the Context

The following variables exist in the freemarer views

    -
  • req - the current HttpServletRequest
  • -
  • res - the current HttpServletResponse
  • -
  • stack - the current OgnlValueStack
  • -
  • ognl - the OgnlTool instance
      -
    • This class contains useful methods to execute OGNL expressions against arbitary objects, and a method to generate a select list using the <ww:select> pattern. (i.e. taking the name of the list property, a listKey and listValue)
    • -
  • -
  • webwork - an instance of FreemarkerWebWorkUtil
  • -
  • action - the current WebWork action
  • -
  • exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view
  • -
-

FreeMarker configuration with recent (post 2.1) releases

To configure the freemarker engine that webwork uses, just add a file freemarker.properties to the classpath. The supported properties are those that the freemarker Configuration object expects - see the freemarker documentation for these. These properties are used for both the freemarker result type, and the webwork provided FreemarkerServlet.
- -
-
default_encoding=ISO-8859-1
template_update_delay=5
locale=no_NO
-
-

Using webwork UI tags - or any JSP Tag Library

Freemarker has builtin support for using any JSP taglib. You can use JSP taglibs in FreeMarker even if
-a) your servlet container has no support for JSP, or
-b) you didn't specify the taglib in your web.xml - note how in the example below we refer to the taglib by its webapp-absolute URL, so no configuration in web.xml is needed.
- -
-
<#assign ww=JspTaglibs["/WEB-INF/webwork.tld"] />

<@ww.form method="'post'" name="'inputform'" action="'save.action'" >
    <@ww.hidden name="'id'" />
    <@ww.textarea label="'Details'" name="'details'" rows=5 cols=40 />
    <@ww.submit value="'Save'" align="center" />
</@ww.form>
-

NOTE : numeric properties for tags MUST be numbers, not strings. as in the rows and cols properties above. if you use cols="40" you will receive an exception. Other than that, the freemarker tag container behaves as you would expect.

Using the FreemarkerServlet

The FreemarkerServlet provided in the freemarker.jar will work out of the box however it won't provide any webwork specific functionality such as the context variables, property resoloution etc. Therefore webwork provides its own servlet to provide this integration.

Register the FreemarkerServlet in web.xml

To use freemarker as a view engine, the webwork2 FreemarkerServlet needs to be configured, and mapped to the file extension that you use for your templates.

-
<servlet>
  <servlet-name>freemarker</servlet-name>
  <servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>freemarker</servlet-name>
  <url-pattern>*.ftl</url-pattern>
</servlet-mapping>
-

Configure Actions to use this servlet (xwork.xml configuration)

To use the freemarker view, just use the dispatcher result type, and specify the location to the template file.
- -
-
<action name="test" class="package.Test">
  <result name="success" type="dispatcher">/WEB-INF/views/testView.ftl</result>
</action>
-

Extending the servlet

NOTE: these docs need to be revised, since the FreemarkerServlet has changed since they were written.

Please refer to the freemarker site for details about the base freemarker servlet.

Be carfeul when subclassing com.opensymphony.webwork.views.freemarker.FreemarkerServlet when overriding
- -
-
protected TemplateModel createModel(
    ObjectWrapper wrapper, 
    ServletContext servletContext, 
    HttpServletRequest request, 
    HttpServletResponse response)
-

Please call super.createModel(...) and wrap it with a new model to avoid problems with action property resoloution.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebWork.html b/docs/chinese/wikidocs/WebWork.html deleted file mode 100644 index 99ec4c5a8..000000000 --- a/docs/chinese/wikidocs/WebWork.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork 2 : WebWork - - - - - - - - - -
- -
- This page last changed on Dec 14, 2004 by plightbo. -
- -

Welcome to the WebWork wiki. WebWork's official homepage is http://www.opensymphony.com/webwork/. There you can find documentation for the latest released version of WebWork. This wiki is used for additional information as well as documentation for the latest developing version (see Previous releases).

- -
- - -
- - webworka [Converted].eps (application/octet-stream) -
-
- -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/WebWork_attachments/webworka [Converted].eps b/docs/chinese/wikidocs/WebWork_attachments/webworka [Converted].eps deleted file mode 100644 index 1624a3836..000000000 --- a/docs/chinese/wikidocs/WebWork_attachments/webworka [Converted].eps +++ /dev/null @@ -1,52 +0,0 @@ -%!PS-Adobe-3.1 EPSF-3.0 %%Title: webworka [Converted].eps %%Creator: Adobe Illustrator(R) 11 %%AI8_CreatorVersion: 11.0.0 %AI9_PrintingDataBegin %%For: H %%CreationDate: 3/30/04 %%BoundingBox: 0 0 619 576 %%HiResBoundingBox: 0 0 618.3335 576 %%CropBox: 0 0 618.3335 576 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0) %%+ procset Adobe_CoolType_Utility_T42 (1.0 0) %%+ procset Adobe_CoolType_Utility_MAKEOCF (1.19 0) %%+ procset Adobe_CoolType_Core (2.23 0) %%+ procset Adobe_AGM_Core (2.0 0) %%+ procset Adobe_AGM_Utils (1.0 0) %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 128 120 8 %%BeginData: 6480 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD7FFFA8A8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD %FCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD34FFA87EFD09FF7EA9 %FD08FFA8A8A8FD66FF7E28000000A2FD05FF5300000053A8FD04FFA92800 %002253FD32FFA8FD31FF7D00007D5328F87EFFFFFF53F84D7D5300285353 %527D0000537E280053FD63FF2800FFFFFFA82828FFFFA90053CFCFCF7E00 %0100010022A8FFFFFF2801A8FD30FFA8FD31FF0053FD04FF5300A8FF7700 %A8A77BA6A82822FFA82228FD04FF7E007EFD62FF2252FD04FF77007EA84C %00A8A7A0A0FF0053FFFF2828FD04FF7D007EFD30FFA8FD31FF28007EFFFF %A8FD060028CFA7CF52007DFFFF7DF87DFFFFA82200FD64FF000028530028 %7EA87DA977000053280028FD04FF28004D520100A8FD31FFA8FD33FF4C01 %0053A8FD05FF7D28002853FD05FFA953002228A8FDB2FFA8FDACFFCFFD2C %FFA8A8FD0AFFA8537D5377537753A9FD11FFA8FD23FFCAFFFFFFCAFFFFFF %A0A7FFFFCAFFFFFFCAFFFFFFA8FD05FFA9FD05FFA8FFFFFFA8A9A8A8A8A9 %A8FD05FFA8FFA8FFA8FF2853FD06FFA9FFFFFF7D53537DFD045300A8FD23 %FFA0FD04FFCFA0FD05FFA0FFA8A7A0A7A0A7A0A7A0A6CACA7CA7A0A7A0A7 %A0A6A6FF5353FD04FF7D28FD04FFA828A8A8002800282228002853FF7D28 %0128002822287E5353FD05FFA828A8FD05FFA8FFA8FF7E01A8FD10FFA8FD %11FFA8A6A8FFFFFFA7A0A8FFFFFFA8A6A8A6A1FFA8FFA8FFCAA77CFFA7A7 %A8FFA8FFA8FFA8A6A75328FD04FF7E00FD04FFA900A80053FFFFA8FFA8FF %7D007E2828FFFD05A8FF282828532853282800FFFFFF7D28285328532828 %53FD24FFA0CFFFFFFFCFA0FD05FFA0CFA0CFFD06FFA7CFFFC9A7FD07FFA0 %CF5328FD04FF5301A8FFFFFF7E22A8287DFD06FFA900A800A8FD07FF5301 %534C5352532828A8FFFF4D53FD18FFA8FD12FFA7A0A7A0A7A0A67CA7A0A7 %7CA7FFA87CA7A0A7A0A7A0A7A0CFA7A0A0A7A0A7A0A7A0A0CAA900282228 %280100282828222228FF53012228222828280053A8007DFD07FF2853FD05 %FFA8007E7EFF2828284C2853284C28A8FD25FFCACFA8FFFFCFA8CFCACFFD %04FFA8CFCACFA8CFCACFCFFFCACFA8CFCACFA8CFCFFFFFFF7EA87EA8A8FF %7EA87EA87EFFFFFFA8A87EA87EA87EA8FFFFA8FD08FFA8A8FD06FFA8A8FF %FFA97EA87EA87EA87EA8A8FD10FFA8FD5BFFA8FD48FFA87EA9A8A8FF7DFF %FFCBA8FF7DFF7EFFA8FFA8FF7DFFA8FFA8A8A9FFA8A8FFA8FFFFA8A8A97E %FFA8FFA87EFF7DFF7EA8FF7EFFA8A8A97EFD24FFA8FD25FF53FF7EA8A87E %FFFFA8A2A87EFFA8A8A9A8A8A87EA8A87EFFA8FFA8A87EFF7DFFFFA8A8FF %7DFF7DFF7E7EA87EFF7E7DFF77FF7DA8A8A8FDA4FFA8FDFCFFFFFFFFA8FD %FCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFF %FFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD37FFA953 %287EFFA8282877A87D2828A8FD72FF7D53FF28FF537DA7282828A8A928FD %3AFFA8FD37FF5353A828222852A128FF4C7E7D53FD73FF534D7EFFA85328 %A8FFA92853A8FD3AFFA8FDACFFCFFFCFFFFFFFCFCFA8CFCACAA7FFA8CFA8 %FFFFA9FFFFA8A87DA87EA9A87E7EA853A9FFFFA8FD2EFFA8FD2BFFA8A7FF %A7A7FFA0A7A7CFFD04A7A8CFA7527DFF28A8A828287D7D7E28287DA8A853 %287D2853FD5BFFA7CFA7CAA7CFCFCFA7CFCACFA7CFA7CFA87D537D537DA2 %A8537E7DA27DFFFFFF7EA9FFA97DFD2EFFA8FD31FFA8A9A8A9A9A9A8A9A8 %FFA8CBA8FFA8FFA8FFA8A9A8A9A8A9A8FD68FFA8FFA9FFA8FFCBFFA8FFA9 %FFA8FFFFFFA8FFA9FFA8FFA9FFA8FD34FFA8FDFCFFFFFFFFA8FDFCFFFFFF %FFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8 %FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD2BFFA0A7A0A07CA77CA6A0A67CA67C %A67CA07CA67CA07CA67CA67CA67CA07CA67CA07CA67CA67CA6A7FD58FFA7 %C9CACFA0FFCFCFA7CFA7A7A0A7A0A7A7C9A7C9FD04A7A0A7A0A7A6C9A7A7 %A6C9A7CAA0A7A0A6CAFD2CFFA8FD2AFFA6A7CAA8CFA8FFA7CAA7CAA7A7A8 %A7A8CFA7CFA8CFA7CFA8A7A7CAA7CFA7CAA8CAA0A7A8A7A8A77BCAFD57FF %A7A6A7A7A0A7A7A6A6CAA0A6A7A7A0A7A0A7A0A7A6A7A0A7A7A7A0A7A0A7 %A0A7A0A07CA7A0A6A0A7FD2DFFA8FD2BFFA8A7A7CAA7A7A7CAA7A8A7CAA7 %A7A7CAA7A7A7CAA7A7A7CAA7A7A7CAA7A7A7CAA7A8A7CAA7A8A8FDADFFA8 %FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD2BFFA87D7D7E537E7D7E537E7D7E7D %7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7DA8FD59FF7D22 %5328005328282853FD090001FD070001FD07002800000053FD2DFFA8FD2A %FF28537D7D53A8A97E7E537728284C00287D2853777E285353282828227D %5253537728537D535328007EFD57FF28537DA87EA8A82877A852537DA853 %7E7D7E7DA87D7D7D7E537E777E7D7E53A85301287E287E2800A8FD2CFFA8 %FD2AFFA82852002228280028282200280028002828280028282800282228 %00282828002800220022002853FD5AFFA9FFA9FFFFFFA9FFFFFFA9FFFFFF %A9FFFFFFA9FFFFFFA9FFFFFFA9FFFFFFA9FD34FFA8FDFCFFFFFFFFA8FDFC %FFFFFFFFA8FDACFF7EA8A8A87EA8A8A87EA8A8A8A2A8A8A8A2A8A8A8A2A8 %A8A8A2A8A8A8A2A8A8A8A2FD04A8FD2EFFA8FD2AFFA80028000127280028 %27000001FD07000100000001FD0B0001000028FD58FF2852527627A07C7C %52764B280053002853534C7D7D4C525300280028535328535253537E0053 %22007EFD2CFFA8FD2AFF2827525176757C2752514C527D7E7D7DA853A87E %7E537E7D7D7D7E537E7D7E7E7D00287D4C7D53007EFD57FF7E282728004C %270100520022FD04280028282800282822FD042800282828002200220022 %0053FD2DFFA8FD2BFFA8A87EA87EA87EA87EA87EA87EA87EA87EA87EA87E %A87EA87EA87EA87EA87EA87EA87EA87EA8FDAEFFA8FDFCFFFFFFFFA8FFFF %7D527DFD04527DA852527D7D527D527D52FD6EFFFD0BA8FFFD05A8FD6CFF %A8FFFFA87DA87DA8527DA8FD78FFA8A87DA87DFD08A8FD70FFA8FFFFA852 %7D7D7D527D7D7D527D527DFD73FFA8A87DA8A8A87DFFA8A87DFD72FFA8FF %FFA852A852FD047DA87D7DA8FDFCFFFDF4FFA8A8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 68 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /bdict { mark }bdf /edict { counttomark 2 idiv dup dict begin {def} repeat pop currentdict end }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /agm_sethalftone { dup begin /_Data load /Thresholds xdf end level3 { sethalftone }{ dup /HalftoneType get 3 eq { sethalftone } {pop} ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource {AGMUTIL_imagefile imbuf readstring pop} put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height { pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get dup type dup /filetype eq { exch flushbuffer readstring pop pop }if /arraytype eq { exec pop }if }for }for end } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 div mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if /arraytype eq { 1 1 Height { pop DataSource pop } for }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp AGMCORE_tmp 1 add ddf dup type /dicttype eq { AGMCORE_tmp exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { AGMCORE_tmp exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup AGMCORE_tmp 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { /CSD known }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 216 dict dup begin put /nd{ null def }bind def /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSA_cache 0 dict def /AGMCORE_CSD_cache 0 dict def /AGMCORE_pattern_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_ovp nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_gradientcache 32 dict def /AGMCORE_in_pattern false def /knockout_unitsq nd /AGMCORE_CRD_cache where{ pop }{ /AGMCORE_CRD_cache 0 dict def }ifelse /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /add_grad { AGMCORE_gradientcache 3 1 roll put }bdf /exec_grad { AGMCORE_gradientcache exch get exec }bdf /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def level2 not{ /xput{ dup load dup length exch maxlength eq{ dup dup load dup length dup 0 eq {pop 1} if 2 mul dict copy def }if load begin def end }def }{ /xput{ load 3 1 roll put }def }ifelse /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core exch /AGMCORE_gstackptr xpt AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if Adobe_AGM_Core exch /AGMCORE_gstackptr xpt }def /grestoreall { AGMCORE_&grestoreall Adobe_AGM_Core /AGMCORE_gstackptr AGMCORE_gstacksaveptr put }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core begin /AGMCORE_gstackptr exch def /AGMCORE_gstacksaveptr AGMCORE_gstackptr def end AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&usrshfill /shfill load def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /LeaveColorUnchanged eq }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ Adobe_AGM_Core/AGMCORE_name xddf false Adobe_AGM_Core/AGMCORE_in_pattern known {Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not currentpagedevice/OverrideSeparations known and { currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]setcolorspace false currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def level3 { /AGMCORE_IsCurrentColor { gsave false setoverprint 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq grestore }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { clonedict AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def currentdict end exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def /level2ScreenFreq{ begin 60 HalftoneType 1 eq{ pop Frequency }if HalftoneType 2 eq{ pop GrayFrequency }if HalftoneType 5 eq{ pop Default level2ScreenFreq }if end }def /currentScreenFreq{ currenthalftone level2ScreenFreq }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa dup /MappedCSA xdf /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /currentScreenFreq{ currentscreen pop pop }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /currentpagedevice currentpagedevice def /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq { indx get } if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq { sep } { ColorSpaceFamily /DeviceN eq { devn } { setcolor }ifelse }ifelse } bind def /sssetbackground { aload pop setcolor } bind def /RadialShade { 40 dict begin /ColorSpaceFamily exch def /background exch def /ext1 exch def /ext0 exch def /BBox exch def /r2 exch def /c2y exch def /c2x exch def /r1 exch def /c1y exch def /c1x exch def /rampdict exch def /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bind def /min { 2 copy lt { pop } {exch pop} ifelse } bind def rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def /theta AA 1 AA dup mul sub sqrt div 1 atan def /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires exch def hires mul /numpix exch def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def /theta AA 1 AA dup mul sub sqrt div 1 atan def /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bind def /GenStrips { 40 dict begin /ColorSpaceFamily exch def /background exch def /ext1 exch def /ext0 exch def /BBox exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /rampdict exch def /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix exch def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bind def }def /page_trailer { end }def /doc_trailer{ }def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA map_csa setcolorspace_opt set_crd end } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc /setcolor ldf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 6 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } for AliasedColorants { dup begin /Names new_names def /AliasedColorants true def /LookupTables new_LookupTables def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if currentdict /NComponents known not { /NComponents TintMethod /Subtractive eq {4}{3}ifelse def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def Names { AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse AvoidAliasedColorants { currentspotalias set_spot_alias } if /names_index names_index 1 add def } forall painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 () /findcmykcustomcolor cvx 0 /setcustomcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ /setcolor ldf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSD known { CSD get_csd /Names known { CSD get_csd begin currentdict devncs AGMCORE_host_sep{ 4 dict begin /devnCompCnt Names length def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { devnCompCnt tableIndex map_index }{ exec } ifelse setdevicencolor currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed MappedCSA HiVal [ Lookup dup type /stringtype eq {/exch cvx CSD get_csd /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx ]cvx ]setcolorspace_opt }ifelse } ifelse end }{ } ifelse set_crd } { /MappedCSA CSA map_csa def AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSD known { begin CSD get_csd begin map_indexed_devn devn end end }{ AGMCORE_gget/Lookup get 4 3 -1 roll map_index pop setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSD known and { /indexed_colorspace_dict AGMCORE_gget /CSD get get_csd begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_csa { Adobe_AGM_Core begin /AGMCORE_CSA_cache xput end }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ Adobe_AGM_Core begin 1 dict begin /name xdf AGMCORE_CSA_cache { 0 get name eq { exit }{ pop } ifelse }forall end end }{ pop } ifelse }def /map_csa { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get }if }def /add_csd { Adobe_AGM_Core begin /AGMCORE_CSD_cache xput end }def /get_csd { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get }if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /add_pattern { Adobe_AGM_Core begin /AGMCORE_pattern_cache xput end }def /get_pattern { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get dup wrap_paintproc }if }def /wrap_paintproc { statusdict /currentfilenameextend known{ begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/Intent known{ currentcolorrendering/Intent get }{ null }ifelse Intent ne{ false Intent AGMCORE_CRD_cache { exch pop begin dup Intent eq{ currentdict setcolorrendering_opt end exch pop true exch exit }if end } forall pop not{ systemdict /findcolorrendering known{ Intent findcolorrendering pop /ColorRendering findresource dup length dict copy setcolorrendering_opt }if }if }if } def /add_crd { AGMCORE_CRD_cache 3 1 roll put }def /set_crd { AGMCORE_host_sep not level2 and{ currentdict/CRD known{ AGMCORE_CRD_cache CRD get dup null ne{ setcolorrendering_opt }{ pop }ifelse }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /path_rez { dup 0 ne{ AGMCORE_deviceDPI exch div dup 1 lt{ pop 1 }if setflat }{ pop }ifelse }def /set_spot_alias_ary { /AGMCORE_SpotAliasAry where{ pop pop }{ Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf true set_spot_alias }ifelse }def /set_spot_alias { /AGMCORE_SpotAliasAry where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry{ dup/Name get AGMCORE_name eq{ save exch /Adobe_AGM_Core currentdict def /CSD get get_csd exch restore exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput Adobe_AGM_Core begin /setcustomcolor { dup /customcolor_tint exch AGMCORE_gput current_spot_alias{ 1 index 4 get map_alias{ mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop }{ AGMCORE_&setcustomcolor }ifelse }{ AGMCORE_&setcustomcolor }ifelse }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.23 0 %%Copyright: Copyright 1997-2003 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.23 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.23 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking /@_SaveStackLevels { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 2 sub 1 index lt { pop count 1 sub } if dup /argCount exch def dup 0 gt { exch 1 index 2 add 1 roll args exch 0 exch getinterval astore pop } { pop } ifelse count 1 sub /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get /args get exch get end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup begin mark { (*) { pop stop } 128 string /Category resourceforall } stopped cleartomark currentdict eq dup { end } if not } { false } ifelse def /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end userdict /Adobe_CoolType_Data 10 dict dup begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end put } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. %%Version: 1.19 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 25 add dict copy } { 25 dict } ifelse put Adobe_CoolType_Utility begin /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } } { { eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { currentcolorspace 0 get dup /DeviceCMYK eq { pop 4 } { /DeviceRGB eq { pop 3 }{ 1 } ifelse } ifelse } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /srcDataStrs xdf /dstDataStr xdf /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /samplesNeedDecoding 0 0 1 origDecode length 1 sub { origDecode exch get add } for origDecode length 2 div div dup 1 eq { /decodeDivisor 2 origBitsPerComponent exp 1 sub def } if 2 origBitsPerComponent exp 1 sub ne def [ 0 1 dsCnt 1 sub [ currentdict /origMultipleDataSources get { dup currentdict /origDataSource get exch get dup type }{ currentdict /origDataSource get dup type } ifelse dup /filetype eq { pop currentdict /srcDataStrs get 3 -1 /roll cvx /get cvx /readstring cvx /pop cvx }{ /stringtype ne { /exec cvx } if currentdict /srcDataStrs get /exch cvx 3 -1 /roll cvx /xpt cvx } ifelse ] cvx /for cvx currentdict /srcDataStrs get 0 /get cvx /length cvx 0 /ne cvx [ 0 1 Width 1 sub [ Adobe_AGM_Utils /AGMUTIL_ndx /xddf cvx currentdict /origMultipleDataSources get { 0 1 dsCnt 1 sub [ Adobe_AGM_Utils /AGMUTIL_ndx1 /xddf cvx currentdict /srcDataStrs get /AGMUTIL_ndx1 /load cvx /get cvx /AGMUTIL_ndx /load cvx /get cvx samplesNeedDecoding { currentdict /decodeDivisor known { currentdict /decodeDivisor get /div cvx }{ currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvxs BitsPerComponent /decode_image_sample load /exec cvx } ifelse } if ] cvx /for cvx }{ Adobe_AGM_Utils /AGMUTIL_ndx1 0 /ddf cvx currentdict /srcDataStrs get 0 /get cvx /AGMUTIL_ndx /load cvx currentdict /origDecode get length 2 idiv dup 3 1 /roll cvx /mul cvx /exch cvx /getinterval cvx [ samplesNeedDecoding { currentdict /decodeDivisor known { currentdict /decodeDivisor get /div cvx }{ currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvx BitsPerComponent /decode_image_sample load /exec cvx Adobe_AGM_Utils /AGMUTIL_ndx1 /AGMUTIL_ndx1 /load cvx 1 /add cvx /ddf cvx } ifelse } if ] cvx /forall cvx } ifelse currentdict /convProc get /exec cvx currentdict /origcolorSpaceElemCnt get 1 sub -1 0 [ currentdict /dstDataStr get 3 1 /roll cvx /AGMUTIL_ndx /load cvx currentdict /origcolorSpaceElemCnt get /mul cvx /add cvx /exch cvx currentdict /convProc get /filter_indexed_devn load ne { 255 /mul cvx /cvi cvx } if /put cvx ] cvx /for cvx ] cvx /for cvx currentdict /dstDataStr get ] cvx /if cvx ] cvx bind end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def 2 dict begin dup dup /dstDataStr exch /Width get colorSpaceElemCnt mul string def /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA map_csa 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA map_csa 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get map_csa }{ /CSD get get_csd /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin CSD get_csd begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA map_csa 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget bdict /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] edict setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put dup 4 get map_alias{ /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (webworka [Converted].eps) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 - - - - Adobe PDF library 4.800 - - - - - - - - - - 2004-03-31T05:29:33Z - 2001-12-11T00:25:08-08:00 - Adobe Illustrator 9.0.1 - - - - JPEG - 256 - 240 - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9QW9vbm3iJiSvBf2R4Yq qfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/AjFXfVrf/AH0n /AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/AjFXfVrf/ AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/AjFXf Vrf/AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/A jFXfVrf/AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/3 0n/AjFXfVrf/AH0n/AjFVO4t7cW8pESV4N+yPDFVS2/3ni/1F/ViqrirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUrn/AHnl/wBRv1Yq62/3ni/1 F/ViqrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVUrn/AHnl/wBRv1Yq62/3ni/1F/ViqrirsVdirsVdirsVdirsVdirsVdirHfPnnvy/wCSPLs2 u65KyW0bCOKKMBpZpWqVijUkVY0J67AEnLMWMzNBXix/5yf88tbnXY/y7uz5UHxG/wCU9PTB/vPX EHpAU+iv7WZn5OPLi9SLez+QPP3l/wA8+XYtc0SRmgZjFPBIAssMygFopFBI5AMDsaEGuYeXEYGi lh/5qfn1pPknVIfL+nadL5g80XAUjTbdiojEg/d82VZGLvWqoqkkdaVFbsOmMxZNRVjWjf8AOTV9 Yaxbab+YnlS78rR3m0F/IsojFSN3jljjbgKjkylqeGWS0YIuB4kW9PX81vyza6NovmrSjOCRwF5B 1HavKlfpzG8CfcUvLdR/5ya1nVdVurP8vPJ135ktLJqTagBKVYDusUUblQ1PhLNU/wAuZI0YAucq RbLfyo/PXRvPV7caLdWEuh+ZrMM02l3B5cgho/puVjbkh+0jKCPfelWfTGAvmEvT8xldirsVdirs VdirsVdirsVdirsVUrn/AHnl/wBRv1Yq62/3ni/1F/ViqrirsVdirsVdirsVdirsVdirsVdir55/ 5y1CLc+RJ9QV28ux6hMNVAqVIJgIBA/aMSy0+nM/Q/xVzpBe8C90U6L9cE1v+hfq/qevyT6t9W4V 5cvsenw+imYVG/NL5L/Jz85PI3kLzZ5zWVbpfLeqXbS6LHbRBwkUMs3pAqzqVLRSKB8t82mo08px j3jmhF/k95r0rzH+b3nLWkYx6zrKTP5bNyVSURNOOUK/EwE31YBRxboGpmN2jjyDT8MOYZ464t2V /ng8Ft+VGqQeYqrdXE1v+gYbj+/+tLKpleJW+IKIOYc9KGnUjNZ2HDKJm74fNtzmPRJ7v8gvKkf/ ADj7/iNdLkXzeumJqb3JnmqBQTOphLentDXbhWubkaqXi1fpunHem/8AOMl15cl/KXTIdHMYuYGk GrxrT1RdNIxLS9/iTjxJ/ZoO2Y2sB8Q2kMG86TWN3/zld5WHlwo+o20aLrjwbgFBMZRIVI+MWxAN fYe2XY7GA3y6IfSGa9LsVdirsVdirsVdirsVdirsVdiqlc/7zy/6jfqxV1t/vPF/qL+rFVXFXYq7 FXYq7FXYq7FXYq7FXYq7FUm83eUNA826FcaHrtsLmwuKEipV0dd1kjYbqynofoO1Rk8eQwNhXiv/ AEKNbCtivnPUh5dL8/0V6Y8a15ep6XL39HMz8914RaKes6F+V/kLRdBtdEttFtJ7K0qUN3DHcSM7 fbkd5FNXbufoG1BmLLNMm7Sx38yvyC8l+d0t5qNo2qWcYitb2xVVAjUkqjxUCsqkmlOJ98sw6qUP MKxnyz/zir5es9Zg1XzPrd15ne1IMFtcJ6cJ4mqLKGeZnUfy8gD3FNssnrSRURSKe4MiMhRlDIw4 lSKgg7UpmEl4b5g/5xU0KbV5tR8q6/eeWBckme1gX1YgGNWWPjJAyL/klmA+W2ZsdaaqQ4kUzD8r PyR8p/l4JrqyaW/1q5X07jVLmnPgSCUiRdkUkAnqT3PTKs2olk58kvRMx1dirsVdirsVdirsVdir sVdirsVUrn/eeX/Ub9WKutv954v9Rf1Yqq4q7FXYql2vav8AonTzeel61GVeHLh9r3o2UajN4ceK rZwhxGkfG3NFalOQBp88uBYJdpes/Xr/AFC09H0/qDqnPly58iwrSgp9nKcWfjlKNfSzlCgD3r9c 1X9F6dJe+l63AqPT5ca8iB1o3j4Yc+Xw48VWiEeI0gbrzPMLtLOxsWvboxLNKiuECBgDQsQfEZTP VHi4Yx4jVsxj2smmv055j/6sLf8ASQn/ADTj4+X+Z9q8Ee9Th80aidVt9OuNKMEs5B/vg5VO7EKv QUyMdXLjETGifNJxirtB6VrevCa/SKyfUUS6kVZDME4AHZAGByvDnyXKo8Xq72UoR23pMP055j/6 sLf9JCf805d4+X+Z9rDgj3pbrn5gvo+ha3qF1pjLeaPZyX31JpQBKsa8uIlCtxr/AKpy3S5vEyeG RwyROFCwbCZ+RPNH+KvKGl+Yvq31P9JwCf6rz9X06kjjz4x8un8ozKyQ4ZEdzWk2s/mV+jfzU0Dy F+jvV/TlrNdfpL1uPpejHM/H0fTbnX0KV5jr7ZOOG4Gd8lZldT+hazT8eXpIz8a0rxBNK5UArx4/ 85GRP5E0DXrfy/JPrnma7nsdJ0GK4Dlngk9MsZjGm3Jk6J+19OZf5T1EXsOqEaPPf/OQBFf+VYw/ 9xmz/wCasj4WL+f9iUv1j86/zJ8qQxan51/L5tO0EyLFcX1rqFvdvGXNFJSPl+JHzyUdPCW0Zb+5 CceaPzqvbXzefKnk/wAszebNUhtY768MN1HaxRRTKrJ8bpJUlZEO9PtDrkIacGPFI8ISh/8AlaH5 y/8Alp5/+4xbf9UcPg4/5/2Kxn8z/wAx/PFtp3kvUtUtJ/JLza8sGpWYvFmV7NPTZnlljWNeBBaq kdstw4okyA9WyHpv/K5Pyq/6mzS/+kmP+uY35fJ3FKTSfnl5evPPmg+U/LKw+Yf0v6rXl9aXI4Wi RKW5MojdXqqsac1p9OT/ACxETKW1Kj/zim8tW/luC58w+Z9U8r2cVyoiudGneC5nlZGCw/BHKzgi rcQO1cjp+K9gJe9Xk/reQP8Ay4H5kf8AIy+/7JMyqn/Nh9n60IzyZqerJ+Zvl+08na75q1/Q5xOf Mn+I1ne3iiEZ9Jkkmii4Nyr0G54iu5GDIBwHiEQelK+iM16XYq7FVK5/3nl/1G/Virrb/eeL/UX9 WKquKuxV2KoLWdLi1TT5bORuAehWQCpVgag02yrNiGSJiWUJcJtK49M83RxrGuqQlUAVSYQTQbCu 2Y4xZwK4h8mfFDuQ9r5Z1+znmurbVE+sXR5XXKIcS1SQR18fAZCGlyRJIlueezI5InYhUu/L/mDU IxbahqcbWhYNIscQDHjuBXbJT0+WYqUtvcgTiNwFe98vXq6l+kNJu1tJXjWKVHTmpVQADvXsoyU9 NLj4oGjSBkFUQ19Q84f9XOD/AJEj+mPh5/5w+S8UO5bZaJrsOpi9mu4HZyBcMsQDsgp8PKm3TBDB kE+IkeeymcaqlK30DzDZzXJsr+KKK4meYq0fI1Y+JHhkY6fLEnhkNzfJJnE8wr/UPOH/AFc4P+RI /pk/Dz/zh8kcUO5CXHkn9KW2qw67ci6Gq2kljL6ahOMUq8WI/wArw2yenwyhk8SRuSJzBFBgGg/l f+eHlnS4dD0Hz1Zfoey5JYrc6ejSLGWLcSSJDsSafEfuzayzYpGzHf3tSBvPyR/NzUPNFp5yvPPV t/ifTFEOmslgvoLCQ6upAKr8Qlev7s1r16UkNRjEeER9J81Ti88k/wDOQ95aTWk3nvTkhuEaKVo9 PRXCOOLcTw2NDkBkwj+E/NKnqP8Azj0kfk3yvpWg621hr3lG4lvNN1iSESK807iWTnCWIAaRUp9q gFKHEar1EkbSQiv8Kf8AORn/AFPOl/8AcOT/AJowceH+afmlLNf/ACh/N7zhZpo3m7ztay6A8qS3 cFnYpHLJ6Z5KoaiU3Hj70OSjnxwNxjv70Mq8tflhPon5ra95yjuov0bqtjbWNrYKrepELeKCIcmO xH+j5XPNxYxHqEvQsx1ee/m3+V8vn1vLqC4hitdIv1u7yCdC6zw/CHioP5gCN8yMGbgvzCph/wAq b/Kr/qU9L/6Ro/6ZH8xk7yrG9S/InSYPzA8t+afKkdnoMWkGQ39tBEyfWAwou0ZVdgzBvEbZYNSe Axlvaoz8wvy483+Z7DyrJb6xZx675dulvpLya2b0JZ0UcWEAZ6fEK0rkcWWMSdtiql+gP+chP+pr 0X/uHv8A1w8WLuPzVHaFov51w6vay615j0q70pHBu7eCyeOV0p0RydjkZSx1sDavQcoV2KuxVSuf 955f9Rv1Yq62/wB54v8AUX9WKquKuxV2KuxV2KuxV2KuxVJ9R8uC91uy1X9J6hbCzFG0+3uDHaT0 PJfXioeVCf2SK9GqNsmJ0KoKgpvJCy2N1afp3WY/rWpNqhuEvCJoyzBvqkT8TwtRSgiHbD4m/Icq /HmqbaxpT6lDBEt9dWHoTxXBks3VGf0m5CJyyvWNjTmv7Q2O1QYxlSoGbymkp1cnVtTX9MGItwu3 X6sIv2bOg/cB/wBvjucPHy2GyoqfRGliuIhqN7GlxZCx+CUBoyA4+sRuVLrP+8+3XsNtsAl5Koy+ Wy99ql4uq6hG+pwegIVn/c21ECepaxsrLHJty5UO5w8ew2GyqsOgpG1s7X17LNbWZsjI9w1JAeP7 +WNeMTTDjtJwrufoHEqnF5cEeopffpPUHKaeNO+rPcEwGjcvrJjpT6z29Tww8e1UOaqun6J9T0M6 T9fvLmqyp9fuJud3+9Zm5erQbpzom2wAwGVm6VDW/lWO3u9IuI9V1MppEUkItpLp5YroSLx53fqc 3mdftKxbY4TPnsN1Q8/kyWbSbbTj5h1iNra7a8N9HcRrcy8+fKCVxFRof3povH4aLxI4jCMm90FV rrymtxLrUv6X1SFta9D4YrplWzNsoUGyWhEPqU5SdeZ64BPlsNvxurUXlIRy6LJ+mdUc6KsoKtdE remYAM16vGkpUrVKUC1NABQB4+ew3/GyrI/JvCARfpzVmpqX6U5tdVc7U+qFuP8AvL/xX+OHxPIc q/HmrIsrV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ov6sVVcVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqlc/7zy/6jfqxV1t/vPF/qL+r FVXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY qpXP+88v+o36sVdbf7zxf6i/qxVVxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ov6sVVcVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqlc/7zy/6jfqxV1t/vPF/qL+r FVXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXiOt/mZ5zWDzb5otNZ0+w0vylqM2nJ5bubcNLdi3Kh mlnMgkR5jy9HgtKda75mxwx9MaNyHNCnqX5t6r5z80vpXkHzFBpem2FjFeXN79Vju5ppZmIaMpMy okUC09RhuCfDcVZIDFASlEyJNbMoi0HYfmv+bGvaT5ZQJpWgW3ma7lsIfNKFrlUktBJ6jLbyhI63 DQn0eTkHp7i44McSeZroxei/lr5j8yX9/wCZNC125t9Tm8u3cVrFrVpH6KXIlgWUq8as6LLFypIF NATSmUZoAAEbX0SznKFdirsVdirsVdirsVdirsVdirsVdirsVUrn/eeX/Ub9WKutv954v9Rf1Yqq 4q7FXYq7FXYq7FXYq7FXYq7FUI2p2wt7u4PLhZFxNsK1jUMab+ByvxRRP81lwnbzWX+s2VhHFJcF gkwZlKiuyIXNfoGRyZ4wAJ6rGBKnPrXoRGWWyuVQUFeMZNSaAUD16nBLPQsxP4+KRC+rGX8peR9W 14+ZLvypFc6zFI0YvjHFJyaFuCuQzKGccBRitR2OTx62ZjQEqtTCurWo6Z+W3nTXf0Pq2iQ32o6X Al8PrMKgok080PDkDyP7y3Yuv2Tt1y/Dmlw8UTQuvkxlGlHXdS/LfUvy0mvdT0lLrynZTParYCBB we2u2sB6KKyhKSA8SrA8fuyyImJ0D6vwULPKHmfy5Z6Ikfk7yhqA0H1JBBLY29pFDM0bGJ5QHnjk Ykx/adeRw5IEn1SFqiNI/N3RdbZl0HStU1Vooo5bsW8MS+gZSwWOX1pYvj/dtULXBLAY8yAqifzk 0Gz8yXOi6/byaD6VnBdwvesDK5mkljKGOATKvH0Q1fUNeXQY/lyRY3VkXlPzroXmuG+uNFkee1sL o2UlyV4o8qxpK3p1+IqBKBUgb5XPGY81T7IK7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/e eL/UX9WKquKuxV2KuxV2KuxV2KuxV2KuxVBT6NpNxMZp7OGWVqcnZFJNNhWo3yqWCEjZAtkJkdUP NoVrGn+461tIZWZVlaWHmphJHqqArJuUrTenjhjgxj+EKZnvQcHloiIie105pecNGS3dV4Dj64oX Y8j8XDfbate4OmxfzU+JLvd/hydwzTQ6bJcOKtILZ1BkKxciQZWNC/qnr0KjfiSxOnxE3wo45d6X a1+Xek60iHVdI0W9lt43jsmnsjJw5KSoqXrx9U8mUdvffMjFLwxUbA8mJNoaH8pPKNs8V1Z+XdBg 1G3kaSGYaeOK8K+gQA4IdTxLNXftTqJ+PI8yfmqne/lF5XvLye6m8vaA807SSSSPYFmaR2lIZiHW poYuXiQ/8w4ozyA5n5qnWieWJtFZv0ZbaVYpL6KXAtLR4eccPoqq0WSg4p64Xw5J/K3KEp3ztU7j 0zT49Qm1JLeNb+4jSGe6CgSPHEWKIzdSFLtT55CzVKstdG0m0vbq+tbSKG8vWD3dwigPKwVVq7Dc /Cij6MTIkUqNwK7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/eeL/UX9WKquKuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuf955f9Rv1Yq6 2/3ni/1F/ViqrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVUrn/eeX/Ub9WKutv954v9Rf1Yqq4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/eeL/UX9WKquKuxV2KuxV2Ku xV2KuxV2KtMyqpZiFVRVmOwAHc4kqkz+cvLaMVN6CRsaJIw+8KRmKdbiHX72zwpdzX+NPLP/AC2f 8k5f+aMH57F3/YV8GXc7/Gnln/ls/wCScv8AzRj+exd/2FfBl3O/xp5Z/wCWz/knL/zRj+exd/2F fBl3O/xp5Z/5bP8AknL/AM0Y/nsXf9hXwZdzv8aeWf8Als/5Jy/80Y/nsXf9hXwZdzv8aeWf+Wz/ AJJy/wDNGP57F3/YV8GXc7/Gnln/AJbP+Scv/NGP57F3/YV8GXc7/Gnln/ls/wCScv8AzRj+exd/ 2FfBl3IrT/MGj6hIYrS5WSQb8CGRiPYOFr9GW49RCZqJRKBHNMcuYOxV2KuxV2KuxV2KuxV2KuxV Suf955f9Rv1Yq62/3ni/1F/ViqrirsVdirsVdirsVdirsVdiqB1uzmvNJurWA8ZZYyE7VPWn09Mq zwMoEDmygaNsRb6wtoltPpN7OqCIfVRFSKN4QOTJIFct6lPi27nfNab4aMJHltW23n5uR1uwiL7U byaa3KaPdSRqWMry23J1DCi+lyD04n4tqCo6ZPJlkSPRL/S/ciMR3hLL62uLq5rJpd/Kn1cQm5eF hM0gcP6h2K9Ph+WY+SJkd4yO3Ot/f+hnE0OYaWxjScyjQr2QMqJ6TxsFXjxq4ov2m49Pc4jGAb4J fJeLzCtBEYgf9wl07MGUubYCisjLsAtDuwO/hkoiv4JfJBPmFF7IPEYzot4S1R6ywcGXp0CrQ9O+ RMLFcEvkm/MLU0+OORZBol9IAqIYnjYKeJXk1QtasFP34BjAN8EvkvF5hf8AVWCN/uDuZXIPplrc oFbiQpPBfiHIioOHg/oH5Lfmh47bVPqk8M2iyu0jxshWB4wAnKteIB35DICM+EgwPyTYvmj9D0S+ l121uo7GWwt4Apl9QFRyVaNx5fEeZy7BgkcgIiYgMJzHDV29AzcuK7FXYq7FXYq7FXYq7FXYq7FV K5/3nl/1G/Virrb/AHni/wBRf1Yqq4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/AHni/wBRf1Yqq4q7FXYq7FXYq7FXYq7F XYqk3nDzRYeVfLGo+Yb9We106EzPGn23NQqItdqsxC75PHAykAFeI3357/m6ulrqtloOiyJI1oW0 hbiWfULaPUeP1JrhFaMATeovEjxFQMzBpsd0Sf0bc0Jtqf5jfn/YtDTQfL1zHIGaSaO6kjWMRr6j lvrEsDOqx1flEHXiCQSBkRixHrJWJ6//AM5K/mpo0lW0TRr+za0XUI9RsjczWz2rzi2EofmpAE59 M8gCG2y2OkgepVDW/wDzk9+cFzfvp9v5RtJb6OKK4ktkiumkWG49P0pCokqFf146H/KGE6PGBfEt plY/n9+el6ZPQ8nWPGJJJHdhOq/uoXnK8jNTkY4XKr1NNsidLiH8SoG7/wCcl/zltLOS9ufJ9pHa RAmW4MdyY1AIB5MJSB9sZIaTGduJVC0/5yk/Nu8vEsrTynZz3csUU8dvHFdM7RTlFicKJKkOZUC+ NRidFjG9raOT/nIn88ZDSLyTbSnlxPpxXL0PFm+LjKabITv4YPyuL+cq7/oYf87f0dc6h/g+yMFp JDFMFW4Z+VwJDHRFlLEfuWqabfTj+VxXXEqc/lz/AM5K69qvnaz8qecNBj0m41LgtpNF6sbI8qep CJYpSzUlBHFge42puIZdIBHiibpX0BmAl2KuxV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ ov6sVVcVdirsVdirsVdirsVdirsVSvzP5d03zJ5fv9C1NS1jqMLQTcDRgG6MpNaMrUZfcZKEzEgh XlUf5FefrW2jttM/MQ2CRRx263UOkQJeyQQDjBFPdpMk0oiTZamntmV+ZgecftVT1T8hfP8Aqd9p 19c/mIq3GlvLLaejotvEnqzrxmkkjSdUlaVdm5qaio6E4x1MACOHn5oQt3/zjn5xudX/AEo/n6NZ xaLpyQJolutqtmjB0t1tRP6Hpq6hgvD7Qr1yQ1cQK4ftVWk/IDz88hl/5WMI5mCK8sWi20UjpFx4 Ru8cys8a8FpGxK7DbYYPzUP5v2q3F/zj/wCeoYxFB+YEMMXJmMUWgWUaMXieF+arIA3KORlIbscf zUf5v2lVIf8AOO/nVV4R+f4ooTXnbxaFaRwyV2/exJKsclKbc1NO2P5qP837VXyf84+ee3KsPzEE UiekEmh0S2hkCwOrxIJI5lfgjRrRK8dhtj+aj/N+1VKT/nHPzm1tPbJ5/jt4LqOSC5S20K0t/Uim ieF0cwzRlgUlYUPTqN8P5uP837VSrTf+cTNd0yyurLTvzAmtLa9eKS6SHT+BdrcOIiWW7DfD6r7A 98kdcCbMft/YtMn8mf8AOOo0jzjY+avMXmSXzHf6ZGkdgHtltqGJPTiaV/UmeX01+zU9hUnK8mru PCBVpey5hq7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/eeL/UX9WKquKuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuf955f9Rv1Yq62/3n i/1F/ViqrirsVdirsVdirsVdirsVdirGfzK80XXlXyJrXmC0hFxd6fbNJbxEEr6hIRWcChKqW5N7 DLMMOKQCvmSTzd+cWo2YurbzfqC37paXExMMNvYNHegN/o8q0Q+gG+MUHQ06ZL81jjKjEcPqHO5e nvHn0bPD2Ruraz+ZVnc2UA8/6nFLdtLHFBLCjSytAnNvSCGlSNgrH7VBXfKcOuEgT4Y2rrsL7/xy ZHFXVJbnzT+elxfPa6J5k1S6uRpqaqulyJ/uQKNcJbmJYIVlLSD1PVpt+7BOxFM2GmninEkiO0uG xy5Xz+z3tU40mMKf85PNqkljca/eWMaQ20q6hdLPFayPdGEC3ikNuTJcRm4o8SryqjgVIobv3NXT FMtM0z/nIq6SSW584XtpGFmWFXstSSWSaK1muURIp7O3d1b6vxJj5MCRRWO2RJwj+H7v1qlt1/0M tDYvcxeY764mUOY9PFvfwXcxTjyEEF1ZwPLQPU8KgAGtNqyHg3y+79aqdu//ADlA97DbXOtX+nxT Q2sovrxZobZXu5Iolt2laCgmRp6OnUcW6kYnwK5BUQV/5yLS3nubjzjPZ21ssks819BqVkoihhkn kdfrVjCZOEcLErHyf/Jwfuf5v3frVKLPzj+bV95e1PVtP/MdLx9NntIGhEv1SMi7E5q0+oJZKCv1 fZVDVr2pvM48YIBjz/HS1ZN+W35o/mzov5n6J5Y8z6kNcsNcW3Y8eE6hLuESxywXKKof0+Q58GZN mAr1yrNhxmBlEVSvqrNYl2KuxV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ov6sVVcVdirs VdirsVdirsVdirsVUbyztb20ms7uFLi0uY2iuIJAGR43HFlZTsQQaHCDW6vK7z/nGD8qbn4Pq99F bKxaG0S8mMMfLrwVy5H35kDVTBva/cqnL/zi3+VkzI8q6jI0QCxs95IxUL0CkjYDEaqQ5V8lWzf8 4rflRPK0s0d/LK+7SPduzH5kiuGOsmBQr5Ks/wChUPyi/wCWe9/6Sm/ph/O5Fp3/AEKh+UX/ACz3 v/SU39MfzuRad/0Kh+UX/LPe/wDSU39MfzuRad/0Kh+UX/LPe/8ASU39MfzuRad/0Kh+UX/LPe/9 JTf0x/O5Fp3/AEKh+UX/ACz3v/SU39MfzuRaZJ5H/Iz8uPJep/pXR9PZtTUFYbu5laZ4gw4t6YPw qSDQmlabVpleTUzmKJ2Vn+UK7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/ViqXa3cXFt5Vvrm2uBa XFvZSyw3RiM4jeOIsrmEbyAEbqNz0GKvOTr3ndpLeOPztp6CQss88mnlow8fqF1VgI1T4Yjx5k1+ E7hhVVGeUPNHmHXZ7q0sfM9tqF2sbvHE1lJEIvSmhjf1HMUQciki7KteVaDjsqn9npX5mqJRd63a PyCekUhUMpEkRep9MBv3ayD7IrX9n9lVQfRPzWaONR5jtEb0gHYWyGkgG5NY/jqe44j/ACe4VZTo tpqlrYCLU746jec3LXJjSIFSx4AJGFAotPHfviqPxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxVSuf955f9Rv1YqgNYeRPLF68cksMi2UpSa3XnMhERIaJe7jqo8c VeTWF9eS20Nx+nfNUy38FLS6FjNRWmrJyaNGZRRCBVh8jzxVXs5daNi8UvmDzNDKYnVJHsGc7BiQ pHPi5CfDzYnkR8XH4Qqmeg6L5j1ya6MHmXWbGOKSKSRbu1lgDqzF+EXqTswpxIPbpUMNiq9TxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuf8AeeX/AFG/ ViqyCZVhjVlcMqgEcH6gfLFV/wBYj8H/AOAf+mKu+sR+D/8AAP8A0xV31iPwf/gH/pirvrEfg/8A wD/0xV31iPwf/gH/AKYq76xH4P8A8A/9MVd9Yj8H/wCAf+mKu+sR+D/8A/8ATFXfWI/B/wDgH/pi rvrEfg//AAD/ANMVd9Yj8H/4B/6Yq76xH4P/AMA/9MVd9Yj8H/4B/wCmKu+sR+D/APAP/TFXfWI/ B/8AgH/pirvrEfg//AP/AExV31iPwf8A4B/6Yq76xH4P/wAA/wDTFXfWI/B/+Af+mKu+sR+D/wDA P/TFXfWI/B/+Af8ApirvrEfg/wDwD/0xV31iPwf/AIB/6Yq76xH4P/wD/wBMVd9Yj8H/AOAf+mKu +sR+D/8AAP8A0xV31iPwf/gH/pirvrEfg/8AwD/0xV31iPwf/gH/AKYq76xH4P8A8A/9MVWTzK0M iqrlmUgDg/Uj5Yq//9k= - - - - - - - uuid:dce97bfe-82d3-11d8-9b09-000a95b0d6d2 - - - - application/postscript - - - webwork - - - - - - - % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -576 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 576 li 618.334 576 li 618.334 0 li clp [1 0 0 1 0 0 ] concat 617.834 575.5 mo 0.5 575.5 li 0.5 0.5 li 617.834 0.5 li 617.834 575.5 li false sop /0 [/DeviceCMYK] add_csa 0 0 0 0 cmyk f 1 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 617.834 575.5 mo 0.5 575.5 li 0.5 0.5 li 617.834 0.5 li 617.834 575.5 li cp 0.188236 0.129412 0.101961 0.0117648 cmyk @ 363.461 98.4517 mo 360.123 98.4517 357.089 97.2378 354.812 94.9605 cv 352.537 92.6885 351.171 89.4981 351.171 86.3126 cv 351.171 82.9732 352.537 79.9395 354.812 77.6636 cv 357.089 75.3863 360.123 74.024 363.461 74.024 cv 366.647 74.024 369.681 75.3863 372.11 77.6636 cv 374.387 79.9395 375.601 82.9732 375.601 86.3126 cv 375.601 92.9898 370.138 98.4517 363.461 98.4517 cv cp 312.175 98.4517 mo 310.297 98.4517 308.445 97.9834 306.752 97.169 cv 305.636 96.5801 304.585 95.8692 303.681 94.9649 cv 301.407 92.6885 300.041 89.6553 300.041 86.3174 cv 300.041 83.1304 301.407 79.9395 303.681 77.6685 cv 305.958 75.3912 308.992 74.1768 312.331 74.1768 cv 315.648 74.1768 318.664 75.5298 320.86 77.7081 cv 323.111 79.9795 324.466 82.9927 324.466 86.3126 cv 324.466 92.9898 318.853 98.4517 312.175 98.4517 cv cp 269.694 94.9649 mo 267.418 97.2422 264.383 98.605 261.045 98.605 cv 257.858 98.605 254.672 97.2422 252.396 94.9649 cv 250.121 92.6885 248.906 89.6553 248.906 86.3174 cv 248.906 83.1304 250.121 79.9395 252.396 77.6685 cv 254.672 75.3912 257.858 74.1768 261.045 74.1768 cv 267.721 74.1768 273.335 79.6392 273.335 86.3174 cv 273.335 89.6553 271.97 92.6885 269.694 94.9649 cv cp 377.269 72.5069 mo 373.476 68.8658 368.62 66.8916 363.461 66.8916 cv 356.179 66.8916 349.957 70.8374 346.619 76.6016 cv 343.889 75.0855 340.701 74.3243 337.515 74.3243 cv 334.512 74.3243 331.513 75.0757 328.95 76.2657 cv 328.154 74.9131 327.221 73.6382 326.138 72.5069 cv 324.284 70.7334 322.073 69.3165 319.67 68.3428 cv 319.588 68.3135 319.5 68.2891 319.418 68.254 cv 318.906 68.0567 318.393 67.8692 317.863 67.7164 cv 317.822 67.7012 317.781 67.6963 317.741 67.6812 cv 315.991 67.1729 314.172 66.8916 312.331 66.8916 cv 312.304 66.8916 312.28 66.896 312.254 66.896 cv 312.228 66.896 312.202 66.8916 312.175 66.8916 cv 301.402 66.8916 292.753 75.5391 292.753 86.3126 cv 292.753 87.2505 292.841 88.1792 292.972 89.0918 cv 291.019 90.2725 288.776 91.0191 286.385 91.0191 cv 284.259 91.0191 282.136 90.4112 280.164 89.502 cv 280.314 88.4405 280.467 87.379 280.467 86.3174 cv 280.467 81.1553 278.495 76.148 274.853 72.5069 cv 271.211 69.0201 266.205 66.8916 261.045 66.8916 cv 255.887 66.8916 251.029 69.0201 247.237 72.5069 cv 243.595 76.3003 241.624 81.1553 241.624 86.3174 cv 241.624 97.0894 250.271 105.737 261.045 105.737 cv 266.205 105.737 271.211 103.763 274.853 100.122 cv 275.915 98.9073 276.977 97.6968 277.735 96.3282 cv 280.314 97.544 283.35 98.3047 286.385 98.3047 cv 289.525 98.3047 292.661 97.5577 295.365 96.0821 cv 296.187 97.524 297.179 98.8829 298.367 100.122 cv 300.858 102.415 303.814 104.103 307.008 105.002 cv 307.09 105.027 307.174 105.042 307.258 105.066 cv 307.98 105.259 308.714 105.412 309.457 105.517 cv 309.561 105.536 309.666 105.55 309.77 105.565 cv 310.565 105.668 311.365 105.737 312.175 105.737 cv 312.205 105.737 312.234 105.733 312.264 105.733 cv 312.286 105.733 312.308 105.737 312.331 105.737 cv 317.489 105.737 322.345 103.763 326.138 100.122 cv 329.628 96.4815 331.753 91.6265 331.753 86.3174 cv 331.753 85.2212 331.639 84.1334 331.452 83.063 cv 333.38 82.1924 335.445 81.6094 337.515 81.6094 cv 339.941 81.6094 342.219 82.3711 344.19 83.5801 cv 344.04 84.4942 344.04 85.2505 344.04 86.3126 cv 344.04 91.4737 346.012 96.3282 349.653 100.122 cv 353.296 103.61 358.15 105.737 363.461 105.737 cv 368.62 105.737 373.626 103.61 377.269 100.122 cv 380.759 96.4815 382.883 91.4737 382.883 86.3126 cv 382.883 81.002 380.759 76.148 377.269 72.5069 cv 0.960785 0.94902 0.29804 0.184314 cmyk f 312.251 78.7261 mo 308.062 78.7261 304.666 82.1231 304.666 86.3126 cv 304.666 90.5049 308.062 93.898 312.251 93.898 cv 316.442 93.898 319.841 90.5049 319.841 86.3126 cv 319.841 82.1231 316.442 78.7261 312.251 78.7261 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 188.062 161.73 mo 187.075 161.73 li 185.904 158.708 li 184.732 161.73 li 183.746 161.73 li 182.028 157.47 li 183.104 157.47 li 184.264 160.471 li 185.413 157.47 li 186.389 157.47 li 187.542 160.471 li 188.703 157.47 li 189.779 157.47 li 188.062 161.73 li 0.960785 0.94902 0.29804 0.184314 cmyk f 196.104 161.73 mo 196.104 157.47 li 200.242 157.47 li 200.242 158.291 li 197.113 158.291 li 197.113 159.188 li 199.6 159.188 li 199.6 159.953 li 197.113 159.953 li 197.113 160.912 li 200.286 160.912 li 200.286 161.73 li 196.104 161.73 li f 210.274 160.253 mo 209.616 159.874 li 207.781 159.874 li 207.781 160.967 li 210.274 160.967 li 210.274 160.253 li cp 210.23 158.234 mo 207.781 158.234 li 207.781 159.216 li 209.616 159.216 li 210.23 158.831 li 210.23 158.234 li cp 210.898 161.73 mo 206.772 161.73 li 206.772 157.47 li 210.859 157.47 li 211.094 157.47 211.24 157.627 211.24 157.872 cv 211.24 158.848 li 211.24 159.026 211.172 159.132 211.015 159.216 cv 210.43 159.551 li 211.055 159.885 li 211.211 159.963 211.283 160.053 211.283 160.243 cv 211.283 161.33 li 211.283 161.575 211.133 161.73 210.898 161.73 cv f 227.791 158.358 mo 226.943 160.22 li 228.644 160.22 li 227.791 158.358 li cp 229.331 161.73 mo 228.99 160.973 li 226.597 160.973 li 226.246 161.73 li 225.204 161.73 li 225.204 161.72 li 227.261 157.47 li 228.326 157.47 li 230.384 161.72 li 230.384 161.73 li 229.331 161.73 li f 240.009 158.268 mo 237.706 158.268 li 237.706 159.601 li 240.009 159.601 li 240.009 158.268 li cp 240.634 160.376 mo 237.706 160.376 li 237.706 161.73 li 236.696 161.73 li 236.696 157.47 li 240.64 157.47 li 240.874 157.47 241.013 157.627 241.013 157.872 cv 241.013 159.974 li 241.013 160.22 240.869 160.376 240.634 160.376 cv f 250.912 158.268 mo 248.609 158.268 li 248.609 159.601 li 250.912 159.601 li 250.912 158.268 li cp 251.537 160.376 mo 248.609 160.376 li 248.609 161.73 li 247.599 161.73 li 247.599 157.47 li 251.542 157.47 li 251.777 157.47 251.916 157.627 251.916 157.872 cv 251.916 159.974 li 251.916 160.22 251.771 160.376 251.537 160.376 cv f 258.501 161.73 mo 258.501 157.47 li 259.512 157.47 li 259.512 160.912 li 262.372 160.912 li 262.372 161.73 li 258.501 161.73 li f 268.708 161.73 mo 268.708 157.47 li 269.717 157.47 li 269.717 161.73 li 268.708 161.73 li f 280.619 161.73 mo 276.788 161.73 li 276.554 161.73 276.414 161.575 276.414 161.33 cv 276.414 157.872 li 276.414 157.627 276.554 157.47 276.788 157.47 cv 280.619 157.47 li 280.854 157.47 281.004 157.627 281.004 157.872 cv 281.004 159.038 li 279.995 159.038 li 279.995 158.268 li 277.424 158.268 li 277.424 160.935 li 279.995 160.935 li 279.995 160.12 li 281.004 160.12 li 281.004 161.33 li 281.004 161.575 280.854 161.73 280.619 161.73 cv f 289.836 158.358 mo 288.989 160.22 li 290.691 160.22 li 289.836 158.358 li cp 291.376 161.73 mo 291.037 160.973 li 288.644 160.973 li 288.293 161.73 li 287.25 161.73 li 287.25 161.72 li 289.308 157.47 li 290.373 157.47 li 292.431 161.72 li 292.431 161.73 li 291.376 161.73 li f 300.685 158.291 mo 300.685 161.73 li 299.68 161.73 li 299.68 158.291 li 297.874 158.291 li 297.874 157.47 li 302.491 157.47 li 302.491 158.291 li 300.685 158.291 li f 308.855 161.73 mo 308.855 157.47 li 309.863 157.47 li 309.863 161.73 li 308.855 161.73 li f 320.203 158.268 mo 317.57 158.268 li 317.57 160.935 li 320.203 160.935 li 320.203 158.268 li cp 320.839 161.73 mo 316.935 161.73 li 316.701 161.73 316.562 161.575 316.562 161.33 cv 316.562 157.872 li 316.562 157.627 316.701 157.47 316.935 157.47 cv 320.839 157.47 li 321.066 157.47 321.212 157.627 321.212 157.872 cv 321.212 161.33 li 321.212 161.575 321.066 161.73 320.839 161.73 cv f 331.507 161.73 mo 328.925 158.803 li 328.925 161.73 li 327.915 161.73 li 327.915 157.47 li 328.908 157.47 li 331.49 160.314 li 331.49 157.47 li 332.505 157.47 li 332.505 161.73 li 331.507 161.73 li f 347.819 158.291 mo 347.819 159.205 li 350.245 159.205 li 350.245 159.968 li 347.819 159.968 li 347.819 161.73 li 346.81 161.73 li 346.81 157.47 li 350.848 157.47 li 350.848 158.291 li 347.819 158.291 li f 360.617 161.73 mo 358.677 160.014 li 358.677 159.506 li 360.551 159.506 li 360.551 158.268 li 358.197 158.268 li 358.197 161.73 li 357.188 161.73 li 357.188 157.47 li 361.177 157.47 li 361.404 157.47 361.554 157.627 361.554 157.872 cv 361.554 159.83 li 361.554 160.07 361.404 160.22 361.177 160.22 cv 360.105 160.22 li 361.844 161.692 li 361.844 161.73 li 360.617 161.73 li f 370.389 158.358 mo 369.539 160.22 li 371.239 160.22 li 370.389 158.358 li cp 371.927 161.73 mo 371.587 160.973 li 369.194 160.973 li 368.844 161.73 li 367.801 161.73 li 367.801 161.72 li 369.857 157.47 li 370.924 157.47 li 372.981 161.72 li 372.981 161.73 li 371.927 161.73 li f 383.733 161.73 mo 383.733 159.126 li 382.473 161.73 li 381.554 161.73 li 380.287 159.126 li 380.287 161.73 li 379.294 161.73 li 379.294 157.47 li 380.42 157.47 li 382.004 160.688 li 382.017 160.688 li 383.605 157.47 li 384.721 157.47 li 384.721 161.73 li 383.733 161.73 li f 391.424 161.73 mo 391.424 157.47 li 395.562 157.47 li 395.562 158.291 li 392.435 158.291 li 392.435 159.188 li 394.921 159.188 li 394.921 159.953 li 392.435 159.953 li 392.435 160.912 li 395.606 160.912 li 395.606 161.73 li 391.424 161.73 li f 407.748 161.73 mo 406.76 161.73 li 405.589 158.708 li 404.418 161.73 li 403.431 161.73 li 401.713 157.47 li 402.79 157.47 li 403.947 160.471 li 405.097 157.47 li 406.073 157.47 li 407.229 160.471 li 408.389 157.47 li 409.464 157.47 li 407.748 161.73 li f 419.39 158.268 mo 416.759 158.268 li 416.759 160.935 li 419.39 160.935 li 419.39 158.268 li cp 420.026 161.73 mo 416.122 161.73 li 415.889 161.73 415.748 161.575 415.748 161.33 cv 415.748 157.872 li 415.748 157.627 415.889 157.47 416.122 157.47 cv 420.026 157.47 li 420.256 157.47 420.4 157.627 420.4 157.872 cv 420.4 161.33 li 420.4 161.575 420.256 161.73 420.026 161.73 cv f 430.533 161.73 mo 428.592 160.014 li 428.592 159.506 li 430.467 159.506 li 430.467 158.268 li 428.114 158.268 li 428.114 161.73 li 427.104 161.73 li 427.104 157.47 li 431.09 157.47 li 431.319 157.47 431.471 157.627 431.471 157.872 cv 431.471 159.83 li 431.471 160.07 431.319 160.22 431.09 160.22 cv 430.02 160.22 li 431.76 161.692 li 431.76 161.73 li 430.533 161.73 li f 441.134 161.73 mo 439.115 159.98 li 439.115 161.73 li 438.106 161.73 li 438.106 157.47 li 439.115 157.47 li 439.115 159.122 li 440.882 157.47 li 442.167 157.47 li 442.167 157.504 li 439.94 159.511 li 442.479 161.698 li 442.479 161.73 li 441.134 161.73 li f 328.594 270.938 mo 327.068 270.938 325.682 270.383 324.641 269.342 cv 323.602 268.304 322.978 266.846 322.978 265.39 cv 322.978 263.864 323.602 262.478 324.641 261.438 cv 325.682 260.397 327.068 259.775 328.594 259.775 cv 330.05 259.775 331.436 260.397 332.546 261.438 cv 333.586 262.478 334.141 263.864 334.141 265.39 cv 334.141 268.441 331.645 270.938 328.594 270.938 cv cp 305.157 270.938 mo 304.3 270.938 303.453 270.724 302.68 270.352 cv 302.169 270.082 301.689 269.757 301.276 269.344 cv 300.236 268.304 299.612 266.918 299.612 265.393 cv 299.612 263.936 300.236 262.478 301.276 261.44 cv 302.316 260.399 303.703 259.845 305.229 259.845 cv 306.744 259.845 308.122 260.463 309.126 261.458 cv 310.155 262.496 310.773 263.873 310.773 265.39 cv 310.773 268.441 308.209 270.938 305.157 270.938 cv cp 285.745 269.344 mo 284.705 270.385 283.318 271.008 281.793 271.008 cv 280.336 271.008 278.88 270.385 277.84 269.344 cv 276.8 268.304 276.246 266.918 276.246 265.393 cv 276.246 263.936 276.8 262.478 277.84 261.44 cv 278.88 260.399 280.336 259.845 281.793 259.845 cv 284.843 259.845 287.409 262.341 287.409 265.393 cv 287.409 266.918 286.785 268.304 285.745 269.344 cv cp 334.903 259.082 mo 333.17 257.418 330.951 256.516 328.594 256.516 cv 325.266 256.516 322.423 258.319 320.897 260.953 cv 319.649 260.26 318.192 259.912 316.736 259.912 cv 315.364 259.912 313.994 260.255 312.823 260.799 cv 312.459 260.181 312.032 259.599 311.538 259.082 cv 310.69 258.271 309.681 257.624 308.582 257.179 cv 308.545 257.166 308.505 257.154 308.467 257.138 cv 308.233 257.048 307.998 256.962 307.757 256.893 cv 307.738 256.886 307.719 256.883 307.701 256.876 cv 306.901 256.644 306.069 256.516 305.229 256.516 cv 305.217 256.516 305.205 256.518 305.193 256.518 cv 305.182 256.518 305.17 256.516 305.157 256.516 cv 300.234 256.516 296.282 260.467 296.282 265.39 cv 296.282 265.819 296.322 266.243 296.382 266.66 cv 295.489 267.2 294.465 267.541 293.372 267.541 cv 292.401 267.541 291.431 267.263 290.529 266.848 cv 290.598 266.363 290.668 265.877 290.668 265.393 cv 290.668 263.034 289.767 260.746 288.102 259.082 cv 286.438 257.488 284.15 256.516 281.793 256.516 cv 279.436 256.516 277.216 257.488 275.482 259.082 cv 273.818 260.815 272.918 263.034 272.918 265.393 cv 272.918 270.315 276.869 274.267 281.793 274.267 cv 284.15 274.267 286.438 273.364 288.102 271.701 cv 288.588 271.146 289.073 270.593 289.419 269.967 cv 290.598 270.523 291.985 270.871 293.372 270.871 cv 294.807 270.871 296.24 270.529 297.476 269.854 cv 297.852 270.514 298.305 271.135 298.848 271.701 cv 299.986 272.748 301.337 273.52 302.796 273.931 cv 302.834 273.942 302.872 273.949 302.911 273.96 cv 303.24 274.048 303.576 274.118 303.915 274.166 cv 303.963 274.174 304.011 274.181 304.059 274.188 cv 304.422 274.235 304.787 274.267 305.157 274.267 cv 305.171 274.267 305.185 274.265 305.198 274.265 cv 305.208 274.265 305.218 274.267 305.229 274.267 cv 307.586 274.267 309.805 273.364 311.538 271.701 cv 313.133 270.037 314.104 267.819 314.104 265.393 cv 314.104 264.892 314.052 264.395 313.966 263.905 cv 314.847 263.508 315.791 263.241 316.736 263.241 cv 317.846 263.241 318.887 263.589 319.787 264.142 cv 319.719 264.56 319.719 264.905 319.719 265.39 cv 319.719 267.749 320.619 269.967 322.283 271.701 cv 323.948 273.294 326.167 274.267 328.594 274.267 cv 330.951 274.267 333.238 273.294 334.903 271.701 cv 336.498 270.037 337.469 267.749 337.469 265.39 cv 337.469 262.963 336.498 260.746 334.903 259.082 cv f 305.192 261.924 mo 303.278 261.924 301.726 263.476 301.726 265.39 cv 301.726 267.306 303.278 268.856 305.192 268.856 cv 307.107 268.856 308.66 267.306 308.66 265.39 cv 308.66 263.476 307.107 261.924 305.192 261.924 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 248.441 299.854 mo 247.99 299.854 li 247.456 298.473 li 246.92 299.854 li 246.469 299.854 li 245.684 297.907 li 246.176 297.907 li 246.706 299.278 li 247.23 297.907 li 247.677 297.907 li 248.204 299.278 li 248.734 297.907 li 249.226 297.907 li 248.441 299.854 li 0.960785 0.94902 0.29804 0.184314 cmyk f 252.116 299.854 mo 252.116 297.907 li 254.007 297.907 li 254.007 298.282 li 252.577 298.282 li 252.577 298.692 li 253.714 298.692 li 253.714 299.042 li 252.577 299.042 li 252.577 299.479 li 254.027 299.479 li 254.027 299.854 li 252.116 299.854 li f 258.592 299.178 mo 258.291 299.006 li 257.452 299.006 li 257.452 299.504 li 258.592 299.504 li 258.592 299.178 li cp 258.571 298.256 mo 257.452 298.256 li 257.452 298.706 li 258.291 298.706 li 258.571 298.529 li 258.571 298.256 li cp 258.877 299.854 mo 256.991 299.854 li 256.991 297.907 li 258.859 297.907 li 258.966 297.907 259.033 297.979 259.033 298.09 cv 259.033 298.537 li 259.033 298.618 259.002 298.666 258.93 298.706 cv 258.663 298.858 li 258.949 299.01 li 259.02 299.046 259.053 299.086 259.053 299.174 cv 259.053 299.67 li 259.053 299.784 258.984 299.854 258.877 299.854 cv f 266.596 298.313 mo 266.209 299.164 li 266.986 299.164 li 266.596 298.313 li cp 267.3 299.854 mo 267.144 299.507 li 266.051 299.507 li 265.89 299.854 li 265.414 299.854 li 265.414 299.849 li 266.354 297.907 li 266.841 297.907 li 267.781 299.849 li 267.781 299.854 li 267.3 299.854 li f 272.18 298.271 mo 271.127 298.271 li 271.127 298.881 li 272.18 298.881 li 272.18 298.271 li cp 272.465 299.235 mo 271.127 299.235 li 271.127 299.854 li 270.666 299.854 li 270.666 297.907 li 272.468 297.907 li 272.575 297.907 272.638 297.979 272.638 298.09 cv 272.638 299.051 li 272.638 299.164 272.572 299.235 272.465 299.235 cv f 277.162 298.271 mo 276.11 298.271 li 276.11 298.881 li 277.162 298.881 li 277.162 298.271 li cp 277.447 299.235 mo 276.11 299.235 li 276.11 299.854 li 275.648 299.854 li 275.648 297.907 li 277.45 297.907 li 277.557 297.907 277.621 297.979 277.621 298.09 cv 277.621 299.051 li 277.621 299.164 277.554 299.235 277.447 299.235 cv f 280.63 299.854 mo 280.63 297.907 li 281.092 297.907 li 281.092 299.479 li 282.398 299.479 li 282.398 299.854 li 280.63 299.854 li f 285.294 299.854 mo 285.294 297.907 li 285.755 297.907 li 285.755 299.854 li 285.294 299.854 li f 290.737 299.854 mo 288.986 299.854 li 288.879 299.854 288.815 299.784 288.815 299.67 cv 288.815 298.09 li 288.815 297.979 288.879 297.907 288.986 297.907 cv 290.737 297.907 li 290.844 297.907 290.913 297.979 290.913 298.09 cv 290.913 298.624 li 290.452 298.624 li 290.452 298.271 li 289.277 298.271 li 289.277 299.491 li 290.452 299.491 li 290.452 299.118 li 290.913 299.118 li 290.913 299.67 li 290.913 299.784 290.844 299.854 290.737 299.854 cv f 294.949 298.313 mo 294.562 299.164 li 295.34 299.164 li 294.949 298.313 li cp 295.653 299.854 mo 295.498 299.507 li 294.404 299.507 li 294.244 299.854 li 293.767 299.854 li 293.767 299.849 li 294.708 297.907 li 295.194 297.907 li 296.135 299.849 li 296.135 299.854 li 295.653 299.854 li f 299.906 298.282 mo 299.906 299.854 li 299.447 299.854 li 299.447 298.282 li 298.622 298.282 li 298.622 297.907 li 300.732 297.907 li 300.732 298.282 li 299.906 298.282 li f 303.641 299.854 mo 303.641 297.907 li 304.101 297.907 li 304.101 299.854 li 303.641 299.854 li f 308.826 298.271 mo 307.623 298.271 li 307.623 299.491 li 308.826 299.491 li 308.826 298.271 li cp 309.116 299.854 mo 307.332 299.854 li 307.226 299.854 307.162 299.784 307.162 299.67 cv 307.162 298.09 li 307.162 297.979 307.226 297.907 307.332 297.907 cv 309.116 297.907 li 309.221 297.907 309.287 297.979 309.287 298.09 cv 309.287 299.67 li 309.287 299.784 309.221 299.854 309.116 299.854 cv f 313.991 299.854 mo 312.812 298.516 li 312.812 299.854 li 312.35 299.854 li 312.35 297.907 li 312.804 297.907 li 313.983 299.207 li 313.983 297.907 li 314.447 297.907 li 314.447 299.854 li 313.991 299.854 li f 321.445 298.282 mo 321.445 298.7 li 322.554 298.7 li 322.554 299.048 li 321.445 299.048 li 321.445 299.854 li 320.984 299.854 li 320.984 297.907 li 322.829 297.907 li 322.829 298.282 li 321.445 298.282 li f 327.294 299.854 mo 326.407 299.069 li 326.407 298.837 li 327.264 298.837 li 327.264 298.271 li 326.188 298.271 li 326.188 299.854 li 325.727 299.854 li 325.727 297.907 li 327.55 297.907 li 327.653 297.907 327.722 297.979 327.722 298.09 cv 327.722 298.985 li 327.722 299.094 327.653 299.164 327.55 299.164 cv 327.06 299.164 li 327.854 299.836 li 327.854 299.854 li 327.294 299.854 li f 331.759 298.313 mo 331.371 299.164 li 332.147 299.164 li 331.759 298.313 li cp 332.462 299.854 mo 332.307 299.507 li 331.213 299.507 li 331.053 299.854 li 330.576 299.854 li 330.576 299.849 li 331.517 297.907 li 332.004 297.907 li 332.944 299.849 li 332.944 299.854 li 332.462 299.854 li f 337.857 299.854 mo 337.857 298.665 li 337.281 299.854 li 336.861 299.854 li 336.282 298.665 li 336.282 299.854 li 335.828 299.854 li 335.828 297.907 li 336.343 297.907 li 337.066 299.377 li 337.072 299.377 li 337.799 297.907 li 338.309 297.907 li 338.309 299.854 li 337.857 299.854 li f 341.371 299.854 mo 341.371 297.907 li 343.263 297.907 li 343.263 298.282 li 341.833 298.282 li 341.833 298.692 li 342.97 298.692 li 342.97 299.042 li 341.833 299.042 li 341.833 299.479 li 343.283 299.479 li 343.283 299.854 li 341.371 299.854 li f 348.831 299.854 mo 348.38 299.854 li 347.845 298.473 li 347.31 299.854 li 346.858 299.854 li 346.073 297.907 li 346.565 297.907 li 347.095 299.278 li 347.619 297.907 li 348.065 297.907 li 348.594 299.278 li 349.124 297.907 li 349.615 297.907 li 348.831 299.854 li f 354.151 298.271 mo 352.949 298.271 li 352.949 299.491 li 354.151 299.491 li 354.151 298.271 li cp 354.442 299.854 mo 352.658 299.854 li 352.551 299.854 352.487 299.784 352.487 299.67 cv 352.487 298.09 li 352.487 297.979 352.551 297.907 352.658 297.907 cv 354.442 297.907 li 354.547 297.907 354.613 297.979 354.613 298.09 cv 354.613 299.67 li 354.613 299.784 354.547 299.854 354.442 299.854 cv f 359.243 299.854 mo 358.356 299.069 li 358.356 298.837 li 359.213 298.837 li 359.213 298.271 li 358.138 298.271 li 358.138 299.854 li 357.676 299.854 li 357.676 297.907 li 359.498 297.907 li 359.603 297.907 359.672 297.979 359.672 298.09 cv 359.672 298.985 li 359.672 299.094 359.603 299.164 359.498 299.164 cv 359.009 299.164 li 359.804 299.836 li 359.804 299.854 li 359.243 299.854 li f 364.087 299.854 mo 363.165 299.053 li 363.165 299.854 li 362.704 299.854 li 362.704 297.907 li 363.165 297.907 li 363.165 298.662 li 363.973 297.907 li 364.56 297.907 li 364.56 297.922 li 363.542 298.84 li 364.702 299.838 li 364.702 299.854 li 364.087 299.854 li f 245.891 288.889 mo 245.891 289.898 245.555 290.764 244.785 291.534 cv 244.063 292.256 243.197 292.592 242.139 292.641 cv 233.266 292.641 li 232.352 292.641 231.582 292.352 230.86 291.774 cv 230.187 292.352 229.37 292.641 228.408 292.641 cv 220.249 292.641 li 219.24 292.641 218.373 292.305 217.604 291.534 cv 216.883 290.811 216.545 289.948 216.497 288.889 cv 216.497 283.357 li 219.191 283.357 li 219.191 288.696 li 219.191 289.177 219.335 289.562 219.72 289.948 cv 220.057 290.235 220.441 290.378 220.97 290.428 cv 227.734 290.428 li 228.215 290.428 228.6 290.284 228.937 289.948 cv 229.273 289.608 229.417 289.225 229.465 288.696 cv 229.465 283.357 li 232.208 283.357 li 232.208 288.696 li 232.208 289.177 232.352 289.562 232.688 289.948 cv 233.025 290.235 233.409 290.378 233.938 290.428 cv 241.466 290.428 li 241.946 290.428 242.332 290.284 242.668 289.948 cv 243.005 289.608 243.149 289.225 243.197 288.696 cv 243.197 283.357 li 245.891 283.357 li 245.891 288.889 li 0.196079 0.219608 0.505883 0.0470589 cmyk f 270.398 292.641 mo 251.663 292.641 li 250.653 292.641 249.788 292.305 249.017 291.534 cv 248.296 290.811 247.959 289.948 247.911 288.889 cv 247.911 287.158 li 247.911 286.147 248.248 285.28 249.017 284.511 cv 249.739 283.79 250.604 283.452 251.663 283.405 cv 270.398 283.405 li 270.398 285.617 li 267.8 289.177 li 265.106 289.177 li 267.656 285.617 li 252.384 285.617 li 251.903 285.617 251.519 285.762 251.134 286.147 cv 250.796 286.435 250.653 286.82 250.604 287.349 cv 250.604 288.696 li 250.604 289.177 250.75 289.562 251.134 289.948 cv 251.47 290.235 251.855 290.378 252.384 290.428 cv 270.398 290.428 li 270.398 292.641 li f 292.641 288.696 mo 292.641 287.349 li 292.641 286.868 292.497 286.483 292.111 286.147 cv 291.823 285.809 291.438 285.665 290.909 285.617 cv 275.541 285.617 li 275.541 290.428 li 290.909 290.428 li 291.39 290.428 291.775 290.284 292.111 289.948 cv 292.448 289.608 292.592 289.225 292.641 288.696 cv cp 295.334 288.889 mo 295.334 289.898 294.998 290.764 294.228 291.534 cv 293.555 292.256 292.688 292.592 291.582 292.641 cv 272.847 292.641 li 272.847 280.327 li 275.541 280.327 li 275.541 283.405 li 291.582 283.405 li 292.641 283.405 293.507 283.742 294.228 284.511 cv 294.949 285.232 295.286 286.098 295.334 287.158 cv 295.334 288.889 li f 327.416 288.889 mo 327.416 289.898 327.079 290.764 326.31 291.534 cv 325.588 292.256 324.723 292.592 323.663 292.641 cv 314.789 292.641 li 313.876 292.641 313.106 292.352 312.385 291.774 cv 311.711 292.352 310.894 292.641 309.932 292.641 cv 301.058 292.641 li 300.048 292.641 299.182 292.305 298.412 291.534 cv 297.69 290.811 297.354 289.948 297.306 288.889 cv 297.306 283.357 li 299.999 283.357 li 299.999 288.696 li 299.999 289.177 300.145 289.562 300.528 289.948 cv 300.865 290.235 301.25 290.378 301.78 290.428 cv 309.259 290.428 li 309.739 290.428 310.124 290.284 310.46 289.948 cv 310.797 289.608 310.941 289.225 310.989 288.696 cv 310.989 283.357 li 313.731 283.357 li 313.731 288.696 li 313.731 289.177 313.876 289.562 314.212 289.948 cv 314.55 290.235 314.934 290.378 315.463 290.428 cv 322.99 290.428 li 323.471 290.428 323.855 290.284 324.193 289.948 cv 324.529 289.608 324.673 289.225 324.723 288.696 cv 324.723 283.357 li 327.416 283.357 li 327.416 288.889 li 0.960785 0.94902 0.29804 0.184314 cmyk f 349.178 288.669 mo 349.178 287.274 li 349.178 286.793 349.032 286.408 348.647 286.072 cv 348.312 285.735 347.926 285.592 347.397 285.542 cv 333.954 285.542 li 333.473 285.542 333.088 285.688 332.703 286.072 cv 332.365 286.361 332.223 286.746 332.174 287.274 cv 332.174 288.669 li 332.174 289.151 332.318 289.536 332.703 289.92 cv 333.04 290.21 333.426 290.354 333.954 290.401 cv 347.397 290.401 li 347.879 290.401 348.265 290.256 348.647 289.92 cv 348.984 289.583 349.129 289.198 349.178 288.669 cv cp 351.87 288.861 mo 351.87 289.874 351.534 290.739 350.764 291.507 cv 350.044 292.229 349.178 292.566 348.119 292.614 cv 333.231 292.614 li 332.223 292.614 331.356 292.276 330.587 291.507 cv 329.865 290.786 329.527 289.92 329.48 288.861 cv 329.48 287.081 li 329.48 286.072 329.817 285.207 330.587 284.437 cv 331.308 283.714 332.174 283.378 333.231 283.329 cv 348.119 283.329 li 349.129 283.329 349.996 283.666 350.764 284.437 cv 351.486 285.157 351.822 286.024 351.87 287.081 cv 351.87 288.861 li f 372.061 285.569 mo 358.271 285.569 li 357.79 285.569 357.405 285.712 357.021 286.098 cv 356.683 286.387 356.538 286.772 356.491 287.301 cv 356.491 292.641 li 353.797 292.641 li 353.797 287.11 li 353.797 286.098 354.134 285.232 354.903 284.461 cv 355.625 283.742 356.491 283.405 357.55 283.357 cv 372.061 283.357 li 372.061 285.569 li f 393.889 284.993 mo 393.889 286.049 393.504 286.916 392.735 287.686 cv 393.504 288.407 393.889 289.322 393.889 290.428 cv 393.889 292.641 li 391.148 292.641 li 391.148 290.621 li 391.148 290.139 391.004 289.754 390.618 289.416 cv 390.33 289.081 389.946 288.936 389.416 288.889 cv 376.896 288.889 li 376.896 292.641 li 374.202 292.641 li 374.202 280.327 li 376.896 280.327 li 376.896 286.531 li 389.416 286.531 li 389.897 286.531 390.283 286.387 390.618 286.049 cv 390.955 285.712 391.099 285.328 391.148 284.799 cv 391.148 283.405 li 393.889 283.405 li 393.889 284.993 li f 396.205 291.073 mo 396.008 291.073 li 396.008 291.444 li 396.205 291.444 li 396.323 291.444 396.406 291.366 396.406 291.26 cv 396.406 291.153 396.323 291.073 396.205 291.073 cv cp 396.412 292.002 mo 396.169 291.57 li 396.008 291.57 li 396.008 292.002 li 395.861 292.002 li 395.861 290.942 li 396.222 290.942 li 396.406 290.942 396.556 291.081 396.556 291.26 cv 396.556 291.415 396.459 291.51 396.329 291.551 cv 396.583 292.002 li 396.412 292.002 li cp 396.177 290.647 mo 395.728 290.647 395.364 291.019 395.364 291.473 cv 395.364 291.928 395.728 292.299 396.177 292.299 cv 396.625 292.299 396.992 291.928 396.992 291.473 cv 396.992 291.019 396.625 290.647 396.177 290.647 cv cp 396.177 292.441 mo 395.642 292.441 395.209 292.008 395.209 291.473 cv 395.209 290.939 395.642 290.506 396.177 290.506 cv 396.711 290.506 397.144 290.939 397.144 291.473 cv 397.144 292.008 396.711 292.441 396.177 292.441 cv f 402.319 392.493 mo 402.319 398.2 397.693 402.826 391.986 402.826 cv 218.985 402.826 li 213.279 402.826 208.652 398.2 208.652 392.493 cv 208.652 386.786 213.279 382.16 218.985 382.16 cv 391.986 382.16 li 397.693 382.16 402.319 386.786 402.319 392.493 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 284.759 394.229 mo 284.759 394.957 284.516 395.582 283.961 396.136 cv 283.439 396.657 282.814 396.9 282.052 396.935 cv 275.65 396.935 li 274.99 396.935 274.436 396.727 273.915 396.31 cv 273.428 396.727 272.84 396.935 272.146 396.935 cv 266.259 396.935 li 265.531 396.935 264.905 396.693 264.351 396.136 cv 263.83 395.615 263.588 394.993 263.553 394.229 cv 263.553 390.239 li 265.495 390.239 li 265.495 394.089 li 265.495 394.436 265.6 394.713 265.877 394.993 cv 266.121 395.2 266.397 395.303 266.779 395.339 cv 271.66 395.339 li 272.006 395.339 272.284 395.235 272.527 394.993 cv 272.77 394.748 272.873 394.472 272.908 394.089 cv 272.908 390.239 li 274.887 390.239 li 274.887 394.089 li 274.887 394.436 274.99 394.713 275.233 394.993 cv 275.477 395.2 275.754 395.303 276.135 395.339 cv 281.566 395.339 li 281.912 395.339 282.19 395.235 282.434 394.993 cv 282.676 394.748 282.78 394.472 282.814 394.089 cv 282.814 390.239 li 284.759 390.239 li 284.759 394.229 li 0 0 0 0 cmyk f 302.439 396.935 mo 288.923 396.935 li 288.193 396.935 287.569 396.693 287.014 396.136 cv 286.494 395.615 286.25 394.993 286.216 394.229 cv 286.216 392.979 li 286.216 392.25 286.459 391.625 287.014 391.07 cv 287.535 390.55 288.159 390.306 288.923 390.272 cv 302.439 390.272 li 302.439 391.868 li 300.564 394.436 li 298.621 394.436 li 300.461 391.868 li 289.442 391.868 li 289.096 391.868 288.818 391.973 288.541 392.25 cv 288.297 392.458 288.193 392.735 288.159 393.117 cv 288.159 394.089 li 288.159 394.436 288.264 394.713 288.541 394.993 cv 288.783 395.2 289.062 395.303 289.442 395.339 cv 302.439 395.339 li 302.439 396.935 li f 318.485 394.089 mo 318.485 393.117 li 318.485 392.77 318.382 392.493 318.104 392.25 cv 317.896 392.006 317.618 391.903 317.236 391.868 cv 306.149 391.868 li 306.149 395.339 li 317.236 395.339 li 317.584 395.339 317.861 395.235 318.104 394.993 cv 318.348 394.748 318.451 394.472 318.485 394.089 cv cp 320.43 394.229 mo 320.43 394.957 320.187 395.582 319.631 396.136 cv 319.146 396.657 318.52 396.9 317.722 396.935 cv 304.205 396.935 li 304.205 388.051 li 306.149 388.051 li 306.149 390.272 li 317.722 390.272 li 318.485 390.272 319.111 390.515 319.631 391.07 cv 320.151 391.589 320.395 392.215 320.43 392.979 cv 320.43 394.229 li f 343.574 394.229 mo 343.574 394.957 343.332 395.582 342.776 396.136 cv 342.256 396.657 341.631 396.9 340.867 396.935 cv 334.465 396.935 li 333.807 396.935 333.25 396.727 332.73 396.31 cv 332.244 396.727 331.654 396.935 330.96 396.935 cv 324.559 396.935 li 323.83 396.935 323.205 396.693 322.649 396.136 cv 322.129 395.615 321.886 394.993 321.852 394.229 cv 321.852 390.239 li 323.795 390.239 li 323.795 394.089 li 323.795 394.436 323.9 394.713 324.176 394.993 cv 324.42 395.2 324.697 395.303 325.08 395.339 cv 330.475 395.339 li 330.822 395.339 331.1 395.235 331.342 394.993 cv 331.584 394.748 331.689 394.472 331.723 394.089 cv 331.723 390.239 li 333.702 390.239 li 333.702 394.089 li 333.702 394.436 333.807 394.713 334.049 394.993 cv 334.292 395.2 334.569 395.303 334.951 395.339 cv 340.381 395.339 li 340.729 395.339 341.006 395.235 341.25 394.993 cv 341.492 394.748 341.596 394.472 341.631 394.089 cv 341.631 390.239 li 343.574 390.239 li 343.574 394.229 li f 359.274 394.071 mo 359.274 393.064 li 359.274 392.716 359.17 392.439 358.892 392.197 cv 358.649 391.953 358.371 391.85 357.99 391.815 cv 348.291 391.815 li 347.944 391.815 347.666 391.919 347.389 392.197 cv 347.145 392.405 347.042 392.683 347.007 393.064 cv 347.007 394.071 li 347.007 394.418 347.111 394.695 347.389 394.973 cv 347.633 395.181 347.91 395.286 348.291 395.319 cv 357.99 395.319 li 358.338 395.319 358.615 395.215 358.892 394.973 cv 359.135 394.729 359.24 394.452 359.274 394.071 cv cp 361.217 394.208 mo 361.217 394.939 360.975 395.563 360.418 396.117 cv 359.9 396.638 359.274 396.88 358.511 396.916 cv 347.77 396.916 li 347.042 396.916 346.417 396.672 345.862 396.117 cv 345.342 395.597 345.098 394.973 345.064 394.208 cv 345.064 392.924 li 345.064 392.197 345.307 391.573 345.862 391.015 cv 346.382 390.496 347.007 390.251 347.77 390.217 cv 358.511 390.217 li 359.24 390.217 359.865 390.46 360.418 391.015 cv 360.939 391.537 361.182 392.161 361.217 392.924 cv 361.217 394.208 li f 375.783 391.834 mo 365.834 391.834 li 365.488 391.834 365.211 391.937 364.933 392.215 cv 364.689 392.423 364.585 392.702 364.551 393.084 cv 364.551 396.935 li 362.607 396.935 li 362.607 392.945 li 362.607 392.215 362.85 391.589 363.405 391.034 cv 363.926 390.515 364.551 390.272 365.314 390.239 cv 375.783 390.239 li 375.783 391.834 li f 391.531 391.418 mo 391.531 392.18 391.254 392.804 390.699 393.361 cv 391.254 393.88 391.531 394.541 391.531 395.339 cv 391.531 396.935 li 389.555 396.935 li 389.555 395.477 li 389.555 395.129 389.45 394.854 389.172 394.609 cv 388.964 394.366 388.688 394.262 388.304 394.229 cv 379.272 394.229 li 379.272 396.935 li 377.329 396.935 li 377.329 388.051 li 379.272 388.051 li 379.272 392.527 li 388.304 392.527 li 388.652 392.527 388.93 392.423 389.172 392.18 cv 389.414 391.937 389.518 391.659 389.555 391.278 cv 389.555 390.272 li 391.531 390.272 li 391.531 391.418 li f 393.202 395.804 mo 393.06 395.804 li 393.06 396.071 li 393.202 396.071 li 393.287 396.071 393.347 396.015 393.347 395.939 cv 393.347 395.861 393.287 395.804 393.202 395.804 cv cp 393.352 396.475 mo 393.177 396.163 li 393.06 396.163 li 393.06 396.475 li 392.954 396.475 li 392.954 395.71 li 393.215 395.71 li 393.347 395.71 393.455 395.81 393.455 395.939 cv 393.455 396.05 393.385 396.12 393.292 396.149 cv 393.475 396.475 li 393.352 396.475 li cp 393.182 395.497 mo 392.857 395.497 392.596 395.765 392.596 396.093 cv 392.596 396.421 392.857 396.689 393.182 396.689 cv 393.505 396.689 393.771 396.421 393.771 396.093 cv 393.771 395.765 393.505 395.497 393.182 395.497 cv cp 393.182 396.791 mo 392.796 396.791 392.483 396.48 392.483 396.093 cv 392.483 395.708 392.796 395.395 393.182 395.395 cv 393.567 395.395 393.879 395.708 393.879 396.093 cv 393.879 396.48 393.567 396.791 393.182 396.791 cv f 252.647 396.333 mo 251.604 396.333 250.653 395.954 249.94 395.241 cv 249.229 394.53 248.802 393.532 248.802 392.535 cv 248.802 391.49 249.229 390.542 249.94 389.829 cv 250.653 389.116 251.604 388.69 252.647 388.69 cv 253.644 388.69 254.593 389.116 255.353 389.829 cv 256.065 390.542 256.445 391.49 256.445 392.535 cv 256.445 394.624 254.736 396.333 252.647 396.333 cv cp 236.602 396.333 mo 236.014 396.333 235.434 396.186 234.904 395.932 cv 234.555 395.747 234.227 395.525 233.944 395.242 cv 233.232 394.53 232.805 393.581 232.805 392.537 cv 232.805 391.54 233.232 390.542 233.944 389.831 cv 234.656 389.118 235.605 388.738 236.65 388.738 cv 237.688 388.738 238.631 389.162 239.318 389.842 cv 240.022 390.553 240.446 391.497 240.446 392.535 cv 240.446 394.624 238.69 396.333 236.602 396.333 cv cp 223.311 395.242 mo 222.598 395.954 221.648 396.381 220.604 396.381 cv 219.607 396.381 218.61 395.954 217.898 395.242 cv 217.187 394.53 216.807 393.581 216.807 392.537 cv 216.807 391.54 217.187 390.542 217.898 389.831 cv 218.61 389.118 219.607 388.738 220.604 388.738 cv 222.693 388.738 224.449 390.447 224.449 392.537 cv 224.449 393.581 224.022 394.53 223.311 395.242 cv cp 256.967 388.215 mo 255.781 387.077 254.262 386.46 252.647 386.46 cv 250.369 386.46 248.422 387.693 247.377 389.497 cv 246.523 389.022 245.525 388.784 244.529 388.784 cv 243.589 388.784 242.651 389.019 241.85 389.391 cv 241.6 388.968 241.308 388.569 240.969 388.215 cv 240.389 387.661 239.697 387.217 238.945 386.913 cv 238.92 386.904 238.893 386.896 238.867 386.885 cv 238.707 386.823 238.546 386.764 238.381 386.716 cv 238.368 386.711 238.355 386.71 238.343 386.706 cv 237.795 386.547 237.226 386.46 236.65 386.46 cv 236.643 386.46 236.634 386.46 236.625 386.46 cv 236.617 386.46 236.609 386.46 236.602 386.46 cv 233.23 386.46 230.525 389.165 230.525 392.535 cv 230.525 392.828 230.552 393.119 230.593 393.405 cv 229.981 393.774 229.28 394.006 228.532 394.006 cv 227.867 394.006 227.203 393.817 226.586 393.532 cv 226.633 393.202 226.681 392.868 226.681 392.537 cv 226.681 390.921 226.064 389.355 224.924 388.215 cv 223.785 387.125 222.219 386.46 220.604 386.46 cv 218.99 386.46 217.471 387.125 216.283 388.215 cv 215.145 389.401 214.527 390.921 214.527 392.537 cv 214.527 395.907 217.233 398.612 220.604 398.612 cv 222.219 398.612 223.785 397.994 224.924 396.856 cv 225.256 396.475 225.59 396.096 225.826 395.668 cv 226.633 396.049 227.582 396.288 228.532 396.288 cv 229.515 396.288 230.496 396.053 231.342 395.59 cv 231.6 396.042 231.91 396.467 232.281 396.856 cv 233.061 397.572 233.985 398.1 234.984 398.382 cv 235.01 398.389 235.037 398.395 235.063 398.403 cv 235.289 398.463 235.519 398.51 235.75 398.543 cv 235.783 398.548 235.816 398.553 235.849 398.558 cv 236.098 398.59 236.348 398.612 236.602 398.612 cv 236.61 398.612 236.619 398.611 236.629 398.611 cv 236.636 398.611 236.643 398.612 236.65 398.612 cv 238.264 398.612 239.783 397.994 240.969 396.856 cv 242.062 395.716 242.727 394.197 242.727 392.537 cv 242.727 392.193 242.689 391.853 242.632 391.518 cv 243.234 391.246 243.882 391.063 244.529 391.063 cv 245.289 391.063 246.002 391.301 246.618 391.68 cv 246.57 391.966 246.57 392.203 246.57 392.535 cv 246.57 394.149 247.188 395.668 248.326 396.856 cv 249.466 397.946 250.985 398.612 252.647 398.612 cv 254.262 398.612 255.827 397.946 256.967 396.856 cv 258.059 395.716 258.724 394.149 258.724 392.535 cv 258.724 390.874 258.059 389.355 256.967 388.215 cv f 236.625 390.162 mo 235.314 390.162 234.252 391.225 234.252 392.535 cv 234.252 393.847 235.314 394.908 236.625 394.908 cv 237.936 394.908 239 393.847 239 392.535 cv 239 391.225 237.936 390.162 236.625 390.162 cv f 402.319 443.725 mo 402.319 449.432 397.693 454.058 391.986 454.058 cv 218.985 454.058 li 213.279 454.058 208.652 449.432 208.652 443.725 cv 208.652 438.018 213.279 433.392 218.985 433.392 cv 391.986 433.392 li 397.693 433.392 402.319 438.018 402.319 443.725 cv 0.960785 0.94902 0.29804 0.184314 cmyk f 284.759 445.461 mo 284.759 446.189 284.516 446.814 283.961 447.369 cv 283.439 447.889 282.814 448.132 282.052 448.168 cv 275.65 448.168 li 274.99 448.168 274.436 447.96 273.915 447.542 cv 273.428 447.96 272.84 448.168 272.146 448.168 cv 266.259 448.168 li 265.531 448.168 264.905 447.925 264.351 447.369 cv 263.83 446.847 263.588 446.225 263.553 445.461 cv 263.553 441.471 li 265.495 441.471 li 265.495 445.322 li 265.495 445.668 265.6 445.946 265.877 446.225 cv 266.121 446.432 266.397 446.536 266.779 446.572 cv 271.66 446.572 li 272.006 446.572 272.284 446.467 272.527 446.225 cv 272.77 445.98 272.873 445.705 272.908 445.322 cv 272.908 441.471 li 274.887 441.471 li 274.887 445.322 li 274.887 445.668 274.99 445.946 275.233 446.225 cv 275.477 446.432 275.754 446.536 276.135 446.572 cv 281.566 446.572 li 281.912 446.572 282.19 446.467 282.434 446.225 cv 282.676 445.98 282.78 445.705 282.814 445.322 cv 282.814 441.471 li 284.759 441.471 li 284.759 445.461 li 0 0 0 0 cmyk f 302.439 448.168 mo 288.923 448.168 li 288.193 448.168 287.569 447.925 287.014 447.369 cv 286.494 446.847 286.25 446.225 286.216 445.461 cv 286.216 444.211 li 286.216 443.482 286.459 442.857 287.014 442.302 cv 287.535 441.783 288.159 441.539 288.923 441.504 cv 302.439 441.504 li 302.439 443.1 li 300.564 445.668 li 298.621 445.668 li 300.461 443.1 li 289.442 443.1 li 289.096 443.1 288.818 443.206 288.541 443.482 cv 288.297 443.691 288.193 443.967 288.159 444.349 cv 288.159 445.322 li 288.159 445.668 288.264 445.946 288.541 446.225 cv 288.783 446.432 289.062 446.536 289.442 446.572 cv 302.439 446.572 li 302.439 448.168 li f 318.485 445.322 mo 318.485 444.349 li 318.485 444.002 318.382 443.725 318.104 443.482 cv 317.896 443.239 317.618 443.135 317.236 443.1 cv 306.149 443.1 li 306.149 446.572 li 317.236 446.572 li 317.584 446.572 317.861 446.467 318.104 446.225 cv 318.348 445.98 318.451 445.705 318.485 445.322 cv cp 320.43 445.461 mo 320.43 446.189 320.187 446.814 319.631 447.369 cv 319.146 447.889 318.52 448.132 317.722 448.168 cv 304.205 448.168 li 304.205 439.284 li 306.149 439.284 li 306.149 441.504 li 317.722 441.504 li 318.485 441.504 319.111 441.748 319.631 442.302 cv 320.151 442.822 320.395 443.448 320.43 444.211 cv 320.43 445.461 li f 343.574 445.461 mo 343.574 446.189 343.332 446.814 342.776 447.369 cv 342.256 447.889 341.631 448.132 340.867 448.168 cv 334.465 448.168 li 333.807 448.168 333.25 447.96 332.73 447.542 cv 332.244 447.96 331.654 448.168 330.96 448.168 cv 324.559 448.168 li 323.83 448.168 323.205 447.925 322.649 447.369 cv 322.129 446.847 321.886 446.225 321.852 445.461 cv 321.852 441.471 li 323.795 441.471 li 323.795 445.322 li 323.795 445.668 323.9 445.946 324.176 446.225 cv 324.42 446.432 324.697 446.536 325.08 446.572 cv 330.475 446.572 li 330.822 446.572 331.1 446.467 331.342 446.225 cv 331.584 445.98 331.689 445.705 331.723 445.322 cv 331.723 441.471 li 333.702 441.471 li 333.702 445.322 li 333.702 445.668 333.807 445.946 334.049 446.225 cv 334.292 446.432 334.569 446.536 334.951 446.572 cv 340.381 446.572 li 340.729 446.572 341.006 446.467 341.25 446.225 cv 341.492 445.98 341.596 445.705 341.631 445.322 cv 341.631 441.471 li 343.574 441.471 li 343.574 445.461 li f 359.274 445.303 mo 359.274 444.296 li 359.274 443.949 359.17 443.671 358.892 443.429 cv 358.649 443.185 358.371 443.083 357.99 443.047 cv 348.291 443.047 li 347.944 443.047 347.666 443.152 347.389 443.429 cv 347.145 443.637 347.042 443.916 347.007 444.296 cv 347.007 445.303 li 347.007 445.65 347.111 445.927 347.389 446.206 cv 347.633 446.414 347.91 446.518 348.291 446.551 cv 357.99 446.551 li 358.338 446.551 358.615 446.448 358.892 446.206 cv 359.135 445.961 359.24 445.684 359.274 445.303 cv cp 361.217 445.44 mo 361.217 446.171 360.975 446.795 360.418 447.349 cv 359.9 447.871 359.274 448.113 358.511 448.148 cv 347.77 448.148 li 347.042 448.148 346.417 447.905 345.862 447.349 cv 345.342 446.83 345.098 446.206 345.064 445.44 cv 345.064 444.157 li 345.064 443.429 345.307 442.805 345.862 442.248 cv 346.382 441.728 347.007 441.484 347.77 441.45 cv 358.511 441.45 li 359.24 441.45 359.865 441.693 360.418 442.248 cv 360.939 442.769 361.182 443.393 361.217 444.157 cv 361.217 445.44 li f 375.783 443.066 mo 365.834 443.066 li 365.488 443.066 365.211 443.169 364.933 443.448 cv 364.689 443.656 364.585 443.934 364.551 444.316 cv 364.551 448.168 li 362.607 448.168 li 362.607 444.177 li 362.607 443.448 362.85 442.822 363.405 442.266 cv 363.926 441.748 364.551 441.504 365.314 441.471 cv 375.783 441.471 li 375.783 443.066 li f 391.531 442.65 mo 391.531 443.413 391.254 444.037 390.699 444.593 cv 391.254 445.113 391.531 445.773 391.531 446.572 cv 391.531 448.168 li 389.555 448.168 li 389.555 446.71 li 389.555 446.362 389.45 446.086 389.172 445.841 cv 388.964 445.598 388.688 445.495 388.304 445.461 cv 379.272 445.461 li 379.272 448.168 li 377.329 448.168 li 377.329 439.284 li 379.272 439.284 li 379.272 443.759 li 388.304 443.759 li 388.652 443.759 388.93 443.656 389.172 443.413 cv 389.414 443.169 389.518 442.891 389.555 442.51 cv 389.555 441.504 li 391.531 441.504 li 391.531 442.65 li f 393.202 447.037 mo 393.06 447.037 li 393.06 447.303 li 393.202 447.303 li 393.287 447.303 393.347 447.248 393.347 447.171 cv 393.347 447.093 393.287 447.037 393.202 447.037 cv cp 393.352 447.708 mo 393.177 447.395 li 393.06 447.395 li 393.06 447.708 li 392.954 447.708 li 392.954 446.942 li 393.215 446.942 li 393.347 446.942 393.455 447.042 393.455 447.171 cv 393.455 447.283 393.385 447.352 393.292 447.381 cv 393.475 447.708 li 393.352 447.708 li cp 393.182 446.729 mo 392.857 446.729 392.596 446.998 392.596 447.326 cv 392.596 447.654 392.857 447.921 393.182 447.921 cv 393.505 447.921 393.771 447.654 393.771 447.326 cv 393.771 446.998 393.505 446.729 393.182 446.729 cv cp 393.182 448.023 mo 392.796 448.023 392.483 447.712 392.483 447.326 cv 392.483 446.94 392.796 446.627 393.182 446.627 cv 393.567 446.627 393.879 446.94 393.879 447.326 cv 393.879 447.712 393.567 448.023 393.182 448.023 cv f 252.647 447.565 mo 251.604 447.565 250.653 447.186 249.94 446.473 cv 249.229 445.762 248.802 444.764 248.802 443.767 cv 248.802 442.722 249.229 441.774 249.94 441.061 cv 250.653 440.348 251.604 439.922 252.647 439.922 cv 253.644 439.922 254.593 440.348 255.353 441.061 cv 256.065 441.774 256.445 442.722 256.445 443.767 cv 256.445 445.856 254.736 447.565 252.647 447.565 cv cp 236.602 447.565 mo 236.014 447.565 235.434 447.418 234.904 447.165 cv 234.555 446.979 234.227 446.757 233.944 446.474 cv 233.232 445.762 232.805 444.813 232.805 443.769 cv 232.805 442.772 233.232 441.774 233.944 441.063 cv 234.656 440.35 235.605 439.97 236.65 439.97 cv 237.688 439.97 238.631 440.394 239.318 441.075 cv 240.022 441.786 240.446 442.729 240.446 443.767 cv 240.446 445.856 238.69 447.565 236.602 447.565 cv cp 223.311 446.474 mo 222.598 447.186 221.648 447.614 220.604 447.614 cv 219.607 447.614 218.61 447.186 217.898 446.474 cv 217.187 445.762 216.807 444.813 216.807 443.769 cv 216.807 442.772 217.187 441.774 217.898 441.063 cv 218.61 440.35 219.607 439.97 220.604 439.97 cv 222.693 439.97 224.449 441.679 224.449 443.769 cv 224.449 444.813 224.022 445.762 223.311 446.474 cv cp 256.967 439.448 mo 255.781 438.309 254.262 437.692 252.647 437.692 cv 250.369 437.692 248.422 438.925 247.377 440.729 cv 246.523 440.254 245.525 440.016 244.529 440.016 cv 243.589 440.016 242.651 440.251 241.85 440.624 cv 241.6 440.201 241.308 439.801 240.969 439.448 cv 240.389 438.893 239.697 438.45 238.945 438.145 cv 238.92 438.136 238.893 438.128 238.867 438.118 cv 238.707 438.055 238.546 437.997 238.381 437.949 cv 238.368 437.944 238.355 437.943 238.343 437.938 cv 237.795 437.78 237.226 437.692 236.65 437.692 cv 236.643 437.692 236.634 437.692 236.625 437.692 cv 236.617 437.692 236.609 437.692 236.602 437.692 cv 233.23 437.692 230.525 440.397 230.525 443.767 cv 230.525 444.06 230.552 444.351 230.593 444.637 cv 229.981 445.006 229.28 445.239 228.532 445.239 cv 227.867 445.239 227.203 445.049 226.586 444.764 cv 226.633 444.434 226.681 444.1 226.681 443.769 cv 226.681 442.154 226.064 440.587 224.924 439.448 cv 223.785 438.357 222.219 437.692 220.604 437.692 cv 218.99 437.692 217.471 438.357 216.283 439.448 cv 215.145 440.633 214.527 442.154 214.527 443.769 cv 214.527 447.139 217.233 449.844 220.604 449.844 cv 222.219 449.844 223.785 449.226 224.924 448.088 cv 225.256 447.708 225.59 447.329 225.826 446.901 cv 226.633 447.282 227.582 447.52 228.532 447.52 cv 229.515 447.52 230.496 447.286 231.342 446.823 cv 231.6 447.275 231.91 447.7 232.281 448.088 cv 233.061 448.804 233.985 449.333 234.984 449.615 cv 235.01 449.622 235.037 449.627 235.063 449.635 cv 235.289 449.696 235.519 449.743 235.75 449.776 cv 235.783 449.781 235.816 449.786 235.849 449.791 cv 236.098 449.823 236.348 449.844 236.602 449.844 cv 236.61 449.844 236.619 449.843 236.629 449.843 cv 236.636 449.843 236.643 449.844 236.65 449.844 cv 238.264 449.844 239.783 449.226 240.969 448.088 cv 242.062 446.949 242.727 445.429 242.727 443.769 cv 242.727 443.425 242.689 443.085 242.632 442.75 cv 243.234 442.478 243.882 442.295 244.529 442.295 cv 245.289 442.295 246.002 442.534 246.618 442.913 cv 246.57 443.199 246.57 443.435 246.57 443.767 cv 246.57 445.381 247.188 446.901 248.326 448.088 cv 249.466 449.178 250.985 449.844 252.647 449.844 cv 254.262 449.844 255.827 449.178 256.967 448.088 cv 258.059 446.949 258.724 445.381 258.724 443.767 cv 258.724 442.106 258.059 440.587 256.967 439.448 cv f 236.625 441.394 mo 235.314 441.394 234.252 442.458 234.252 443.767 cv 234.252 445.08 235.314 446.14 236.625 446.14 cv 237.936 446.14 239 445.08 239 443.767 cv 239 442.458 237.936 441.394 236.625 441.394 cv f 402.319 497.571 mo 402.319 503.278 397.693 507.904 391.986 507.904 cv 218.985 507.904 li 213.279 507.904 208.652 503.278 208.652 497.571 cv 208.652 491.864 213.279 487.238 218.985 487.238 cv 391.986 487.238 li 397.693 487.238 402.319 491.864 402.319 497.571 cv 0.960785 0.94902 0.29804 0.184314 cmyk f 284.759 499.307 mo 284.759 500.035 284.516 500.66 283.961 501.214 cv 283.439 501.735 282.814 501.978 282.052 502.013 cv 275.65 502.013 li 274.99 502.013 274.436 501.805 273.915 501.388 cv 273.428 501.805 272.84 502.013 272.146 502.013 cv 266.259 502.013 li 265.531 502.013 264.905 501.771 264.351 501.214 cv 263.83 500.693 263.588 500.071 263.553 499.307 cv 263.553 495.317 li 265.495 495.317 li 265.495 499.168 li 265.495 499.514 265.6 499.792 265.877 500.071 cv 266.121 500.278 266.397 500.381 266.779 500.418 cv 271.66 500.418 li 272.006 500.418 272.284 500.313 272.527 500.071 cv 272.77 499.826 272.873 499.55 272.908 499.168 cv 272.908 495.317 li 274.887 495.317 li 274.887 499.168 li 274.887 499.514 274.99 499.792 275.233 500.071 cv 275.477 500.278 275.754 500.381 276.135 500.418 cv 281.566 500.418 li 281.912 500.418 282.19 500.313 282.434 500.071 cv 282.676 499.826 282.78 499.55 282.814 499.168 cv 282.814 495.317 li 284.759 495.317 li 284.759 499.307 li 0 0 0 0 cmyk f 302.439 502.013 mo 288.923 502.013 li 288.193 502.013 287.569 501.771 287.014 501.214 cv 286.494 500.693 286.25 500.071 286.216 499.307 cv 286.216 498.057 li 286.216 497.328 286.459 496.703 287.014 496.148 cv 287.535 495.628 288.159 495.384 288.923 495.35 cv 302.439 495.35 li 302.439 496.946 li 300.564 499.514 li 298.621 499.514 li 300.461 496.946 li 289.442 496.946 li 289.096 496.946 288.818 497.051 288.541 497.328 cv 288.297 497.537 288.193 497.813 288.159 498.195 cv 288.159 499.168 li 288.159 499.514 288.264 499.792 288.541 500.071 cv 288.783 500.278 289.062 500.381 289.442 500.418 cv 302.439 500.418 li 302.439 502.013 li f 318.485 499.168 mo 318.485 498.195 li 318.485 497.848 318.382 497.571 318.104 497.328 cv 317.896 497.084 317.618 496.981 317.236 496.946 cv 306.149 496.946 li 306.149 500.418 li 317.236 500.418 li 317.584 500.418 317.861 500.313 318.104 500.071 cv 318.348 499.826 318.451 499.55 318.485 499.168 cv cp 320.43 499.307 mo 320.43 500.035 320.187 500.66 319.631 501.214 cv 319.146 501.735 318.52 501.978 317.722 502.013 cv 304.205 502.013 li 304.205 493.129 li 306.149 493.129 li 306.149 495.35 li 317.722 495.35 li 318.485 495.35 319.111 495.593 319.631 496.148 cv 320.151 496.668 320.395 497.293 320.43 498.057 cv 320.43 499.307 li f 343.574 499.307 mo 343.574 500.035 343.332 500.66 342.776 501.214 cv 342.256 501.735 341.631 501.978 340.867 502.013 cv 334.465 502.013 li 333.807 502.013 333.25 501.805 332.73 501.388 cv 332.244 501.805 331.654 502.013 330.96 502.013 cv 324.559 502.013 li 323.83 502.013 323.205 501.771 322.649 501.214 cv 322.129 500.693 321.886 500.071 321.852 499.307 cv 321.852 495.317 li 323.795 495.317 li 323.795 499.168 li 323.795 499.514 323.9 499.792 324.176 500.071 cv 324.42 500.278 324.697 500.381 325.08 500.418 cv 330.475 500.418 li 330.822 500.418 331.1 500.313 331.342 500.071 cv 331.584 499.826 331.689 499.55 331.723 499.168 cv 331.723 495.317 li 333.702 495.317 li 333.702 499.168 li 333.702 499.514 333.807 499.792 334.049 500.071 cv 334.292 500.278 334.569 500.381 334.951 500.418 cv 340.381 500.418 li 340.729 500.418 341.006 500.313 341.25 500.071 cv 341.492 499.826 341.596 499.55 341.631 499.168 cv 341.631 495.317 li 343.574 495.317 li 343.574 499.307 li f 359.274 499.149 mo 359.274 498.142 li 359.274 497.794 359.17 497.517 358.892 497.275 cv 358.649 497.031 358.371 496.928 357.99 496.893 cv 348.291 496.893 li 347.944 496.893 347.666 496.998 347.389 497.275 cv 347.145 497.483 347.042 497.761 347.007 498.142 cv 347.007 499.149 li 347.007 499.496 347.111 499.773 347.389 500.051 cv 347.633 500.259 347.91 500.364 348.291 500.397 cv 357.99 500.397 li 358.338 500.397 358.615 500.293 358.892 500.051 cv 359.135 499.807 359.24 499.53 359.274 499.149 cv cp 361.217 499.286 mo 361.217 500.017 360.975 500.641 360.418 501.195 cv 359.9 501.716 359.274 501.958 358.511 501.994 cv 347.77 501.994 li 347.042 501.994 346.417 501.75 345.862 501.195 cv 345.342 500.675 345.098 500.051 345.064 499.286 cv 345.064 498.002 li 345.064 497.275 345.307 496.651 345.862 496.093 cv 346.382 495.574 347.007 495.33 347.77 495.295 cv 358.511 495.295 li 359.24 495.295 359.865 495.539 360.418 496.093 cv 360.939 496.615 361.182 497.239 361.217 498.002 cv 361.217 499.286 li f 375.783 496.912 mo 365.834 496.912 li 365.488 496.912 365.211 497.015 364.933 497.293 cv 364.689 497.501 364.585 497.78 364.551 498.162 cv 364.551 502.013 li 362.607 502.013 li 362.607 498.023 li 362.607 497.293 362.85 496.668 363.405 496.112 cv 363.926 495.593 364.551 495.35 365.314 495.317 cv 375.783 495.317 li 375.783 496.912 li f 391.531 496.496 mo 391.531 497.258 391.254 497.882 390.699 498.439 cv 391.254 498.958 391.531 499.619 391.531 500.418 cv 391.531 502.013 li 389.555 502.013 li 389.555 500.555 li 389.555 500.208 389.45 499.932 389.172 499.687 cv 388.964 499.444 388.688 499.34 388.304 499.307 cv 379.272 499.307 li 379.272 502.013 li 377.329 502.013 li 377.329 493.129 li 379.272 493.129 li 379.272 497.605 li 388.304 497.605 li 388.652 497.605 388.93 497.501 389.172 497.258 cv 389.414 497.015 389.518 496.737 389.555 496.356 cv 389.555 495.35 li 391.531 495.35 li 391.531 496.496 li f 393.202 500.882 mo 393.06 500.882 li 393.06 501.149 li 393.202 501.149 li 393.287 501.149 393.347 501.093 393.347 501.017 cv 393.347 500.939 393.287 500.882 393.202 500.882 cv cp 393.352 501.553 mo 393.177 501.241 li 393.06 501.241 li 393.06 501.553 li 392.954 501.553 li 392.954 500.788 li 393.215 500.788 li 393.347 500.788 393.455 500.888 393.455 501.017 cv 393.455 501.128 393.385 501.198 393.292 501.227 cv 393.475 501.553 li 393.352 501.553 li cp 393.182 500.575 mo 392.857 500.575 392.596 500.843 392.596 501.171 cv 392.596 501.5 392.857 501.767 393.182 501.767 cv 393.505 501.767 393.771 501.5 393.771 501.171 cv 393.771 500.843 393.505 500.575 393.182 500.575 cv cp 393.182 501.869 mo 392.796 501.869 392.483 501.558 392.483 501.171 cv 392.483 500.786 392.796 500.473 393.182 500.473 cv 393.567 500.473 393.879 500.786 393.879 501.171 cv 393.879 501.558 393.567 501.869 393.182 501.869 cv f 252.647 501.411 mo 251.604 501.411 250.653 501.032 249.94 500.319 cv 249.229 499.608 248.802 498.61 248.802 497.613 cv 248.802 496.568 249.229 495.62 249.94 494.907 cv 250.653 494.194 251.604 493.768 252.647 493.768 cv 253.644 493.768 254.593 494.194 255.353 494.907 cv 256.065 495.62 256.445 496.568 256.445 497.613 cv 256.445 499.702 254.736 501.411 252.647 501.411 cv cp 236.602 501.411 mo 236.014 501.411 235.434 501.264 234.904 501.01 cv 234.555 500.825 234.227 500.603 233.944 500.32 cv 233.232 499.608 232.805 498.659 232.805 497.615 cv 232.805 496.618 233.232 495.62 233.944 494.909 cv 234.656 494.196 235.605 493.816 236.65 493.816 cv 237.688 493.816 238.631 494.24 239.318 494.92 cv 240.022 495.631 240.446 496.575 240.446 497.613 cv 240.446 499.702 238.69 501.411 236.602 501.411 cv cp 223.311 500.32 mo 222.598 501.032 221.648 501.46 220.604 501.46 cv 219.607 501.46 218.61 501.032 217.898 500.32 cv 217.187 499.608 216.807 498.659 216.807 497.615 cv 216.807 496.618 217.187 495.62 217.898 494.909 cv 218.61 494.196 219.607 493.816 220.604 493.816 cv 222.693 493.816 224.449 495.525 224.449 497.615 cv 224.449 498.659 224.022 499.608 223.311 500.32 cv cp 256.967 493.293 mo 255.781 492.155 254.262 491.538 252.647 491.538 cv 250.369 491.538 248.422 492.771 247.377 494.575 cv 246.523 494.1 245.525 493.862 244.529 493.862 cv 243.589 493.862 242.651 494.097 241.85 494.469 cv 241.6 494.046 241.308 493.647 240.969 493.293 cv 240.389 492.739 239.697 492.295 238.945 491.991 cv 238.92 491.982 238.893 491.974 238.867 491.963 cv 238.707 491.901 238.546 491.842 238.381 491.794 cv 238.368 491.79 238.355 491.789 238.343 491.784 cv 237.795 491.626 237.226 491.538 236.65 491.538 cv 236.643 491.538 236.634 491.538 236.625 491.538 cv 236.617 491.538 236.609 491.538 236.602 491.538 cv 233.23 491.538 230.525 494.243 230.525 497.613 cv 230.525 497.906 230.552 498.197 230.593 498.483 cv 229.981 498.852 229.28 499.084 228.532 499.084 cv 227.867 499.084 227.203 498.895 226.586 498.61 cv 226.633 498.28 226.681 497.946 226.681 497.615 cv 226.681 496 226.064 494.433 224.924 493.293 cv 223.785 492.203 222.219 491.538 220.604 491.538 cv 218.99 491.538 217.471 492.203 216.283 493.293 cv 215.145 494.479 214.527 496 214.527 497.615 cv 214.527 500.985 217.233 503.69 220.604 503.69 cv 222.219 503.69 223.785 503.072 224.924 501.934 cv 225.256 501.553 225.59 501.174 225.826 500.747 cv 226.633 501.127 227.582 501.366 228.532 501.366 cv 229.515 501.366 230.496 501.131 231.342 500.668 cv 231.6 501.121 231.91 501.545 232.281 501.934 cv 233.061 502.65 233.985 503.178 234.984 503.46 cv 235.01 503.467 235.037 503.473 235.063 503.481 cv 235.289 503.542 235.519 503.588 235.75 503.622 cv 235.783 503.626 235.816 503.631 235.849 503.636 cv 236.098 503.668 236.348 503.69 236.602 503.69 cv 236.61 503.69 236.619 503.689 236.629 503.689 cv 236.636 503.689 236.643 503.69 236.65 503.69 cv 238.264 503.69 239.783 503.072 240.969 501.934 cv 242.062 500.794 242.727 499.275 242.727 497.615 cv 242.727 497.271 242.689 496.931 242.632 496.596 cv 243.234 496.324 243.882 496.141 244.529 496.141 cv 245.289 496.141 246.002 496.379 246.618 496.758 cv 246.57 497.044 246.57 497.281 246.57 497.613 cv 246.57 499.227 247.188 500.747 248.326 501.934 cv 249.466 503.024 250.985 503.69 252.647 503.69 cv 254.262 503.69 255.827 503.024 256.967 501.934 cv 258.059 500.794 258.724 499.227 258.724 497.613 cv 258.724 495.952 258.059 494.433 256.967 493.293 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 236.625 495.24 mo 235.314 495.24 234.252 496.303 234.252 497.613 cv 234.252 498.925 235.314 499.986 236.625 499.986 cv 237.936 499.986 239 498.925 239 497.613 cv 239 496.303 237.936 495.24 236.625 495.24 cv f 21.0918 532.5 mo 20.5953 532.5 li 19.4888 528.51 li 18.3829 532.5 li 17.8863 532.5 li 16.6119 527.516 li 17.1792 527.516 li 18.1519 531.535 li 19.251 527.516 li 19.7271 527.516 li 20.8262 531.535 li 21.7989 527.516 li 22.3658 527.516 li 21.0918 532.5 li 0 0 0 1 cmyk f 23.1988 532.5 mo 23.1988 527.516 li 26.293 527.516 li 26.293 527.993 li 23.731 527.993 li 23.731 529.75 li 25.9151 529.75 li 25.9151 530.225 li 23.731 530.225 li 23.731 532.025 li 26.293 532.025 li 26.293 532.5 li 23.1988 532.5 li f 29.2891 530.198 mo 27.9307 530.198 li 27.9307 532.025 li 29.2891 532.025 li 29.9048 532.025 30.2901 531.668 30.2901 531.108 cv 30.2901 530.547 29.9048 530.198 29.2891 530.198 cv cp 29.233 527.993 mo 27.9307 527.993 li 27.9307 529.721 li 29.233 529.721 li 29.7857 529.721 30.2129 529.449 30.2129 528.853 cv 30.2129 528.258 29.7857 527.993 29.233 527.993 cv cp 29.3379 532.5 mo 27.399 532.5 li 27.399 527.516 li 29.275 527.516 li 30.1431 527.516 30.7447 528.013 30.7447 528.846 cv 30.7447 529.372 30.4297 529.785 30.0098 529.939 cv 30.4859 530.114 30.8218 530.527 30.8218 531.122 cv 30.8218 532.025 30.2198 532.5 29.3379 532.5 cv f 35.9458 532.5 mo 35.4488 532.5 li 34.3428 528.51 li 33.2369 532.5 li 32.7398 532.5 li 31.4659 527.516 li 32.0328 527.516 li 33.0059 531.535 li 34.105 527.516 li 34.5811 527.516 li 35.6797 531.535 li 36.6529 527.516 li 37.2198 527.516 li 35.9458 532.5 li f 40.3975 528.307 mo 40.1807 528.084 39.8658 527.951 39.5367 527.951 cv 39.2076 527.951 38.8926 528.084 38.6758 528.307 cv 38.3609 528.629 38.3257 528.965 38.3257 530.008 cv 38.3257 531.051 38.3609 531.387 38.6758 531.71 cv 38.8926 531.933 39.2076 532.067 39.5367 532.067 cv 39.8658 532.067 40.1807 531.933 40.3975 531.71 cv 40.7129 531.387 40.7476 531.051 40.7476 530.008 cv 40.7476 528.965 40.7129 528.629 40.3975 528.307 cv cp 40.8106 532.025 mo 40.4747 532.361 40.0337 532.542 39.5367 532.542 cv 39.0396 532.542 38.5987 532.361 38.2627 532.025 cv 37.7935 531.555 37.7935 531.066 37.7935 530.008 cv 37.7935 528.952 37.7935 528.461 38.2627 527.993 cv 38.5987 527.657 39.0396 527.474 39.5367 527.474 cv 40.0337 527.474 40.4747 527.657 40.8106 527.993 cv 41.2798 528.461 41.2798 528.952 41.2798 530.008 cv 41.2798 531.066 41.2798 531.555 40.8106 532.025 cv f 44.3946 527.993 mo 43.0645 527.993 li 43.0645 529.82 li 44.3946 529.82 li 44.9756 529.82 45.3887 529.518 45.3887 528.91 cv 45.3887 528.3 44.9756 527.993 44.3946 527.993 cv cp 45.3956 532.5 mo 44.2618 530.289 li 43.0645 530.289 li 43.0645 532.5 li 42.5328 532.5 li 42.5328 527.516 li 44.4439 527.516 li 45.3116 527.516 45.9205 528.042 45.9205 528.903 cv 45.9205 529.63 45.4795 530.107 44.8355 530.24 cv 46.0186 532.5 li 45.3956 532.5 li f 50.2256 532.5 mo 48.7066 529.847 li 47.6568 531.108 li 47.6568 532.5 li 47.1246 532.5 li 47.1246 527.516 li 47.6568 527.516 li 47.6568 530.379 li 49.9805 527.516 li 50.6314 527.516 li 49.0635 529.442 li 50.8555 532.5 li 50.2256 532.5 li f 53.4175 532.5 mo 53.4175 527.516 li 53.9498 527.516 li 53.9498 532.025 li 56.4976 532.025 li 56.4976 532.5 li 53.4175 532.5 li f 59.5904 528.307 mo 59.3736 528.084 59.0586 527.951 58.7295 527.951 cv 58.4004 527.951 58.0855 528.084 57.8687 528.307 cv 57.5538 528.629 57.5186 528.965 57.5186 530.008 cv 57.5186 531.051 57.5538 531.387 57.8687 531.71 cv 58.0855 531.933 58.4004 532.067 58.7295 532.067 cv 59.0586 532.067 59.3736 531.933 59.5904 531.71 cv 59.9058 531.387 59.9405 531.051 59.9405 530.008 cv 59.9405 528.965 59.9058 528.629 59.5904 528.307 cv cp 60.0035 532.025 mo 59.6675 532.361 59.2266 532.542 58.7295 532.542 cv 58.2325 532.542 57.7916 532.361 57.4556 532.025 cv 56.9864 531.555 56.9864 531.066 56.9864 530.008 cv 56.9864 528.952 56.9864 528.461 57.4556 527.993 cv 57.7916 527.657 58.2325 527.474 58.7295 527.474 cv 59.2266 527.474 59.6675 527.657 60.0035 527.993 cv 60.4727 528.461 60.4727 528.952 60.4727 530.008 cv 60.4727 531.066 60.4727 531.555 60.0035 532.025 cv f 64.6094 531.968 mo 64.2593 532.346 63.7906 532.542 63.2794 532.542 cv 62.7896 532.542 62.3414 532.361 62.0054 532.025 cv 61.5367 531.555 61.5367 531.066 61.5367 530.008 cv 61.5367 528.952 61.5367 528.461 62.0054 527.993 cv 62.3414 527.657 62.7828 527.474 63.2794 527.474 cv 64.2315 527.474 64.8755 528.09 65.0225 528.965 cv 64.4908 528.965 li 64.3506 528.335 63.9024 527.951 63.2794 527.951 cv 62.9507 527.951 62.6353 528.084 62.4185 528.307 cv 62.1036 528.629 62.0684 528.965 62.0684 530.008 cv 62.0684 531.051 62.1036 531.394 62.4185 531.716 cv 62.6353 531.941 62.9507 532.067 63.2794 532.067 cv 63.6436 532.067 63.9937 531.919 64.2247 531.639 cv 64.4273 531.394 64.5044 531.122 64.5044 530.737 cv 64.5044 530.359 li 63.2794 530.359 li 63.2794 529.889 li 65.0367 529.889 li 65.0367 530.68 li 65.0367 531.254 64.9175 531.639 64.6094 531.968 cv f 68.6905 528.307 mo 68.4737 528.084 68.1587 527.951 67.8296 527.951 cv 67.5005 527.951 67.1856 528.084 66.9683 528.307 cv 66.6534 528.629 66.6187 528.965 66.6187 530.008 cv 66.6187 531.051 66.6534 531.387 66.9683 531.71 cv 67.1856 531.933 67.5005 532.067 67.8296 532.067 cv 68.1587 532.067 68.4737 531.933 68.6905 531.71 cv 69.0054 531.387 69.0406 531.051 69.0406 530.008 cv 69.0406 528.965 69.0054 528.629 68.6905 528.307 cv cp 69.1036 532.025 mo 68.7676 532.361 68.3267 532.542 67.8296 532.542 cv 67.3326 532.542 66.8916 532.361 66.5557 532.025 cv 66.0865 531.555 66.0865 531.066 66.0865 530.008 cv 66.0865 528.952 66.0865 528.461 66.5557 527.993 cv 66.8916 527.657 67.3326 527.474 67.8296 527.474 cv 68.3267 527.474 68.7676 527.657 69.1036 527.993 cv 69.5723 528.461 69.5723 528.952 69.5723 530.008 cv 69.5723 531.066 69.5723 531.555 69.1036 532.025 cv f 74.1226 532.542 mo 73.6324 532.542 73.1846 532.361 72.8482 532.025 cv 72.3794 531.555 72.3794 531.066 72.3794 530.008 cv 72.3794 528.952 72.3794 528.461 72.8482 527.993 cv 73.1846 527.657 73.6324 527.474 74.1226 527.474 cv 75.0186 527.474 75.6836 528.02 75.8516 528.958 cv 75.3052 528.958 li 75.1724 528.349 74.7457 527.951 74.1226 527.951 cv 73.7935 527.951 73.4786 528.077 73.2613 528.3 cv 72.9463 528.623 72.9117 528.965 72.9117 530.008 cv 72.9117 531.051 72.9463 531.394 73.2613 531.716 cv 73.4786 531.941 73.7935 532.067 74.1226 532.067 cv 74.7457 532.067 75.1866 531.668 75.3194 531.058 cv 75.8516 531.058 li 75.6905 531.997 75.0113 532.542 74.1226 532.542 cv f 79.4424 528.307 mo 79.2252 528.084 78.9102 527.951 78.5816 527.951 cv 78.2525 527.951 77.9376 528.084 77.7203 528.307 cv 77.4053 528.629 77.3702 528.965 77.3702 530.008 cv 77.3702 531.051 77.4053 531.387 77.7203 531.71 cv 77.9376 531.933 78.2525 532.067 78.5816 532.067 cv 78.9102 532.067 79.2252 531.933 79.4424 531.71 cv 79.7574 531.387 79.7925 531.051 79.7925 530.008 cv 79.7925 528.965 79.7574 528.629 79.4424 528.307 cv cp 79.8555 532.025 mo 79.5196 532.361 79.0782 532.542 78.5816 532.542 cv 78.0845 532.542 77.6436 532.361 77.3072 532.025 cv 76.8384 531.555 76.8384 531.066 76.8384 530.008 cv 76.8384 528.952 76.8384 528.461 77.3072 527.993 cv 77.6436 527.657 78.0845 527.474 78.5816 527.474 cv 79.0782 527.474 79.5196 527.657 79.8555 527.993 cv 80.3243 528.461 80.3243 528.952 80.3243 530.008 cv 80.3243 531.066 80.3243 531.555 79.8555 532.025 cv f 84.7554 532.5 mo 82.1094 528.503 li 82.1094 532.5 li 81.5772 532.5 li 81.5772 527.516 li 82.0811 527.516 li 84.7271 531.5 li 84.7271 527.516 li 85.2593 527.516 li 85.2593 532.5 li 84.7554 532.5 li f 88.2554 532.542 mo 87.7652 532.542 87.3174 532.361 86.9815 532.025 cv 86.5123 531.555 86.5123 531.066 86.5123 530.008 cv 86.5123 528.952 86.5123 528.461 86.9815 527.993 cv 87.3174 527.657 87.7652 527.474 88.2554 527.474 cv 89.1514 527.474 89.8165 528.02 89.9844 528.958 cv 89.438 528.958 li 89.3052 528.349 88.8785 527.951 88.2554 527.951 cv 87.9263 527.951 87.6114 528.077 87.3941 528.3 cv 87.0792 528.623 87.0445 528.965 87.0445 530.008 cv 87.0445 531.051 87.0792 531.394 87.3941 531.716 cv 87.6114 531.941 87.9263 532.067 88.2554 532.067 cv 88.8785 532.067 89.3194 531.668 89.4522 531.058 cv 89.9844 531.058 li 89.8233 531.997 89.1441 532.542 88.2554 532.542 cv f 91.1602 532.5 mo 91.1602 527.516 li 94.2544 527.516 li 94.2544 527.993 li 91.6924 527.993 li 91.6924 529.75 li 93.876 529.75 li 93.876 530.225 li 91.6924 530.225 li 91.6924 532.025 li 94.2544 532.025 li 94.2544 532.5 li 91.1602 532.5 li f 97.1661 527.993 mo 95.8921 527.993 li 95.8921 529.973 li 97.1661 529.973 li 97.7891 529.973 98.2232 529.637 98.2232 528.979 cv 98.2232 528.322 97.7891 527.993 97.1661 527.993 cv cp 97.2154 530.45 mo 95.8921 530.45 li 95.8921 532.5 li 95.3604 532.5 li 95.3604 527.516 li 97.2154 527.516 li 98.125 527.516 98.7554 528.084 98.7554 528.979 cv 98.7554 529.876 98.125 530.45 97.2154 530.45 cv f 101.233 527.993 mo 101.233 532.5 li 100.702 532.5 li 100.702 527.993 li 99.2593 527.993 li 99.2593 527.516 li 102.676 527.516 li 102.676 527.993 li 101.233 527.993 li f 18.3062 541 mo 18.3062 536.577 li 17.375 537.395 li 17.375 536.822 li 18.3062 536.016 li 18.8101 536.016 li 18.8101 541 li 18.3062 541 li f 20.6299 541 mo 20.6299 540.552 li 22.5967 538.053 li 22.7862 537.808 22.877 537.591 22.877 537.319 cv 22.877 536.78 22.5547 536.422 22.0088 536.422 cv 21.5469 536.422 21.1412 536.681 21.1412 537.326 cv 20.6368 537.326 li 20.6368 536.542 21.1758 535.974 22.0088 535.974 cv 22.8282 535.974 23.3809 536.5 23.3809 537.319 cv 23.3809 537.717 23.2549 537.976 22.982 538.327 cv 21.2388 540.552 li 23.3809 540.552 li 23.3809 541 li 20.6299 541 li f 26.2579 539.348 mo 26.2579 538.879 li 24.3399 538.879 li 24.3399 539.348 li 26.2579 539.348 li f 28.5958 541 mo 28.5958 536.577 li 27.6646 537.395 li 27.6646 536.822 li 28.5958 536.016 li 29.0997 536.016 li 29.0997 541 li 28.5958 541 li f 32.2496 541 mo 32.2496 536.577 li 31.3189 537.395 li 31.3189 536.822 li 32.2496 536.016 li 32.754 536.016 li 32.754 541 li 32.2496 541 li f 34.6294 539.348 mo 34.6294 538.879 li 36.5474 538.879 li 36.5474 539.348 li 34.6294 539.348 li f 37.5557 541 mo 37.5557 540.552 li 39.5225 538.053 li 39.7115 537.808 39.8028 537.591 39.8028 537.319 cv 39.8028 536.78 39.4805 536.422 38.9346 536.422 cv 38.4727 536.422 38.0665 536.681 38.0665 537.326 cv 37.5626 537.326 li 37.5626 536.542 38.1016 535.974 38.9346 535.974 cv 39.7535 535.974 40.3067 536.5 40.3067 537.319 cv 40.3067 537.717 40.1807 537.976 39.9078 538.327 cv 38.1646 540.552 li 40.3067 540.552 li 40.3067 541 li 37.5557 541 li f 43.4214 537.374 mo 43.4214 536.829 43.1133 536.422 42.5606 536.422 cv 42.0074 536.422 41.6998 536.829 41.6998 537.374 cv 41.6998 539.642 li 41.6998 540.189 42.0074 540.594 42.5606 540.594 cv 43.1133 540.594 43.4214 540.189 43.4214 539.642 cv 43.4214 537.374 li cp 42.5606 541.042 mo 41.7837 541.042 41.1954 540.497 41.1954 539.67 cv 41.1954 537.346 li 41.1954 536.52 41.7837 535.974 42.5606 535.974 cv 43.3375 535.974 43.9253 536.52 43.9253 537.346 cv 43.9253 539.67 li 43.9253 540.497 43.3375 541.042 42.5606 541.042 cv f 47.0752 537.374 mo 47.0752 536.829 46.7676 536.422 46.2144 536.422 cv 45.6617 536.422 45.3536 536.829 45.3536 537.374 cv 45.3536 539.642 li 45.3536 540.189 45.6617 540.594 46.2144 540.594 cv 46.7676 540.594 47.0752 540.189 47.0752 539.642 cv 47.0752 537.374 li cp 46.2144 541.042 mo 45.4376 541.042 44.8497 540.497 44.8497 539.67 cv 44.8497 537.346 li 44.8497 536.52 45.4376 535.974 46.2144 535.974 cv 46.9913 535.974 47.5796 536.52 47.5796 537.346 cv 47.5796 539.67 li 47.5796 540.497 46.9913 541.042 46.2144 541.042 cv f 49.8472 541 mo 49.8472 536.577 li 48.9166 537.395 li 48.9166 536.822 li 49.8472 536.016 li 50.3511 536.016 li 50.3511 541 li 49.8472 541 li f 20.1192 549.5 mo 20.1192 547.225 li 17.753 547.225 li 17.753 549.5 li 17.2212 549.5 li 17.2212 544.516 li 17.753 544.516 li 17.753 546.75 li 20.1192 546.75 li 20.1192 544.516 li 20.6509 544.516 li 20.6509 549.5 li 20.1192 549.5 li f 23.521 545.28 mo 22.5831 547.912 li 24.4449 547.912 li 23.521 545.28 li cp 24.9981 549.5 mo 24.5992 548.374 li 22.4219 548.374 li 22.023 549.5 li 21.4561 549.5 li 23.2901 544.516 li 23.7378 544.516 li 25.565 549.5 li 24.9981 549.5 li f 27.4747 547.443 mo 27.4747 549.5 li 26.9429 549.5 li 26.9429 547.443 li 25.459 544.516 li 26.0328 544.516 li 27.209 546.904 li 28.3707 544.516 li 28.9449 544.516 li 27.4747 547.443 li f 31.1846 544.993 mo 31.1846 549.5 li 30.6529 549.5 li 30.6529 544.993 li 29.211 544.993 li 29.211 544.516 li 32.627 544.516 li 32.627 544.993 li 31.1846 544.993 li f 36.4556 549.5 mo 36.4556 547.225 li 34.0899 547.225 li 34.0899 549.5 li 33.5577 549.5 li 33.5577 544.516 li 34.0899 544.516 li 34.0899 546.75 li 36.4556 546.75 li 36.4556 544.516 li 36.9878 544.516 li 36.9878 549.5 li 36.4556 549.5 li f 38.4297 549.5 mo 38.4297 544.516 li 41.524 544.516 li 41.524 544.993 li 38.962 544.993 li 38.962 546.75 li 41.1456 546.75 li 41.1456 547.225 li 38.962 547.225 li 38.962 549.025 li 41.524 549.025 li 41.524 549.5 li 38.4297 549.5 li f 46.3677 549.5 mo 46.3677 545.713 li 45.0025 548.716 li 44.5479 548.716 li 43.1617 545.713 li 43.1617 549.5 li 42.6294 549.5 li 42.6294 544.516 li 43.1617 544.516 li 44.7857 548.051 li 46.3677 544.516 li 46.8995 544.516 li 46.8995 549.5 li 46.3677 549.5 li f 52.9825 549.5 mo 52.9825 547.225 li 50.6168 547.225 li 50.6168 549.5 li 50.0845 549.5 li 50.0845 544.516 li 50.6168 544.516 li 50.6168 546.75 li 52.9825 546.75 li 52.9825 544.516 li 53.5147 544.516 li 53.5147 549.5 li 52.9825 549.5 li f 56.3848 545.28 mo 55.4468 547.912 li 57.3086 547.912 li 56.3848 545.28 li cp 57.8614 549.5 mo 57.4624 548.374 li 55.2857 548.374 li 54.8868 549.5 li 54.3194 549.5 li 56.1534 544.516 li 56.6016 544.516 li 58.4288 549.5 li 57.8614 549.5 li f 61.8306 545.357 mo 61.5713 545.09 61.2354 544.993 60.8506 544.993 cv 59.7657 544.993 li 59.7657 549.025 li 60.8506 549.025 li 61.2354 549.025 61.5713 548.926 61.8306 548.661 cv 62.1734 548.303 62.1597 547.561 62.1597 546.953 cv 62.1597 546.343 62.1734 545.713 61.8306 545.357 cv cp 62.2017 549.039 mo 61.9004 549.339 61.4595 549.5 60.9415 549.5 cv 59.2334 549.5 li 59.2334 544.516 li 60.9415 544.516 li 61.4595 544.516 61.9004 544.677 62.2017 544.978 cv 62.7193 545.497 62.6915 546.259 62.6915 546.953 cv 62.6915 547.645 62.7193 548.52 62.2017 549.039 cv f 66.5416 545.357 mo 66.2823 545.09 65.9463 544.993 65.5616 544.993 cv 64.4766 544.993 li 64.4766 549.025 li 65.5616 549.025 li 65.9463 549.025 66.2823 548.926 66.5416 548.661 cv 66.8843 548.303 66.8707 547.561 66.8707 546.953 cv 66.8707 546.343 66.8843 545.713 66.5416 545.357 cv cp 66.9126 549.039 mo 66.6114 549.339 66.1705 549.5 65.6524 549.5 cv 63.9444 549.5 li 63.9444 544.516 li 65.6524 544.516 li 66.1705 544.516 66.6114 544.677 66.9126 544.978 cv 67.4302 545.497 67.4024 546.259 67.4024 546.953 cv 67.4024 547.645 67.4302 548.52 66.9126 549.039 cv f 70.0132 545.28 mo 69.0752 547.912 li 70.9371 547.912 li 70.0132 545.28 li cp 71.4903 549.5 mo 71.0914 548.374 li 68.9141 548.374 li 68.5152 549.5 li 67.9483 549.5 li 69.7823 544.516 li 70.2305 544.516 li 72.0572 549.5 li 71.4903 549.5 li f 75.459 545.357 mo 75.2002 545.09 74.8643 544.993 74.4791 544.993 cv 73.3941 544.993 li 73.3941 549.025 li 74.4791 549.025 li 74.8643 549.025 75.2002 548.926 75.459 548.661 cv 75.8023 548.303 75.7881 547.561 75.7881 546.953 cv 75.7881 546.343 75.8023 545.713 75.459 545.357 cv cp 75.8301 549.039 mo 75.5294 549.339 75.0884 549.5 74.5704 549.5 cv 72.8624 549.5 li 72.8624 544.516 li 74.5704 544.516 li 75.0884 544.516 75.5294 544.677 75.8301 544.978 cv 76.3482 545.497 76.3204 546.259 76.3204 546.953 cv 76.3204 547.645 76.3482 548.52 75.8301 549.039 cv f 17.1299 558 mo 17.1299 554.556 li 17.6338 554.556 li 17.6338 558 li 17.1299 558 li cp 17.1021 553.577 mo 17.1021 553.009 li 17.669 553.009 li 17.669 553.577 li 17.1021 553.577 li f 20.084 554.962 mo 19.335 554.962 19.2232 555.607 19.2232 556.25 cv 19.2232 556.894 19.335 557.539 20.084 557.539 cv 20.8331 557.539 20.938 556.894 20.938 556.25 cv 20.938 555.607 20.8331 554.962 20.084 554.962 cv cp 20.0069 559.582 mo 19.4888 559.582 19.2022 559.45 18.8379 559.121 cv 19.167 558.798 li 19.419 559.023 19.5938 559.141 19.9927 559.141 cv 20.6578 559.141 20.938 558.672 20.938 558.084 cv 20.938 557.545 li 20.6578 557.903 20.3428 557.994 19.9722 557.994 cv 19.6221 557.994 19.3208 557.868 19.1392 557.685 cv 18.7959 557.342 18.7188 556.81 18.7188 556.25 cv 18.7188 555.691 18.7959 555.159 19.1392 554.816 cv 19.3208 554.633 19.629 554.514 19.9791 554.514 cv 20.357 554.514 20.6651 554.598 20.9449 554.962 cv 20.9449 554.556 li 21.4419 554.556 li 21.4419 558.106 li 21.4419 558.96 20.9097 559.582 20.0069 559.582 cv f 24.9068 558 mo 24.9068 555.879 li 24.9068 555.27 24.5782 554.962 24.0601 554.962 cv 23.542 554.962 23.2061 555.278 23.2061 555.879 cv 23.2061 558 li 22.7022 558 li 22.7022 554.556 li 23.2061 554.556 li 23.2061 554.934 li 23.4507 554.655 23.7872 554.514 24.1719 554.514 cv 24.543 554.514 24.8438 554.626 25.0538 554.836 cv 25.2989 555.075 25.4112 555.397 25.4112 555.795 cv 25.4112 558 li 24.9068 558 li f 26.6358 558 mo 26.6358 554.556 li 27.1402 554.556 li 27.1402 558 li 26.6358 558 li cp 26.608 553.577 mo 26.608 553.009 li 27.1749 553.009 li 27.1749 553.577 li 26.608 553.577 li f 29.3731 558 mo 28.7847 558 28.4908 557.587 28.4908 557.077 cv 28.4908 554.962 li 28.0567 554.962 li 28.0567 554.578 li 28.4908 554.578 li 28.4908 553.5 li 28.9947 553.5 li 28.9947 554.578 li 29.73 554.578 li 29.73 554.962 li 28.9947 554.962 li 28.9947 557.062 li 28.9947 557.377 29.1416 557.567 29.4639 557.567 cv 29.73 557.567 li 29.73 558 li 29.3731 558 li f 32.7042 555.46 mo 32.5713 555.144 32.2632 554.942 31.8995 554.942 cv 31.5352 554.942 31.2276 555.144 31.0943 555.46 cv 31.0171 555.649 31.0035 555.753 30.9893 556.034 cv 32.8091 556.034 li 32.7955 555.753 32.7813 555.649 32.7042 555.46 cv cp 30.9893 556.412 mo 30.9893 557.168 31.3462 557.601 32.0044 557.601 cv 32.4034 557.601 32.6343 557.483 32.9073 557.21 cv 33.2505 557.51 li 32.9004 557.861 32.5782 558.042 31.9903 558.042 cv 31.0806 558.042 30.4854 557.497 30.4854 556.279 cv 30.4854 555.166 31.0245 554.514 31.8995 554.514 cv 32.7886 554.514 33.3135 555.159 33.3135 556.18 cv 33.3135 556.412 li 30.9893 556.412 li f 36.2393 555.214 mo 36.0782 555.053 35.8545 554.962 35.6094 554.962 cv 35.3643 554.962 35.1475 555.053 34.9864 555.214 cv 34.7344 555.466 34.7066 555.893 34.7066 556.279 cv 34.7066 556.664 34.7344 557.09 34.9864 557.342 cv 35.1475 557.503 35.3643 557.594 35.6094 557.594 cv 35.8545 557.594 36.0782 557.503 36.2393 557.342 cv 36.4913 557.09 36.5123 556.664 36.5123 556.279 cv 36.5123 555.893 36.4913 555.466 36.2393 555.214 cv cp 36.5962 557.651 mo 36.3584 557.888 36.0293 558.042 35.6094 558.042 cv 35.1895 558.042 34.8604 557.888 34.6226 557.651 cv 34.2725 557.294 34.2022 556.81 34.2022 556.279 cv 34.2022 555.747 34.2725 555.263 34.6226 554.907 cv 34.8604 554.668 35.1895 554.514 35.6094 554.514 cv 36.0293 554.514 36.3584 554.668 36.5962 554.907 cv 36.9463 555.263 37.0162 555.747 37.0162 556.279 cv 37.0162 556.81 36.9463 557.294 36.5962 557.651 cv f 40.2994 558 mo 40.2994 555.879 li 40.2994 555.27 39.9703 554.962 39.4522 554.962 cv 38.9341 554.962 38.5982 555.278 38.5982 555.879 cv 38.5982 558 li 38.0943 558 li 38.0943 554.556 li 38.5982 554.556 li 38.5982 554.934 li 38.8433 554.655 39.1792 554.514 39.5645 554.514 cv 39.9351 554.514 40.2364 554.626 40.4463 554.836 cv 40.6915 555.075 40.8033 555.397 40.8033 555.795 cv 40.8033 558 li 40.2994 558 li f 42.8892 558 mo 42.2872 558 42.0142 557.609 42.0142 557.084 cv 42.0142 553.016 li 42.5181 553.016 li 42.5181 557.062 li 42.5181 557.399 42.6304 557.567 42.9805 557.567 cv 43.2535 557.567 li 43.2535 558 li 42.8892 558 li f 44.6114 558 mo 44.6114 554.556 li 44.1075 554.556 li 44.1075 558 li 44.6114 558 li cp 44.6465 553.577 mo 44.6465 553.009 li 44.0792 553.009 li 44.0792 553.577 li 44.6465 553.577 li f 48.0831 558 mo 48.0831 555.879 li 48.0831 555.27 47.7544 554.962 47.2364 554.962 cv 46.7183 554.962 46.3824 555.278 46.3824 555.879 cv 46.3824 558 li 45.8785 558 li 45.8785 554.556 li 46.3824 554.556 li 46.3824 554.934 li 46.6275 554.655 46.9634 554.514 47.3482 554.514 cv 47.7193 554.514 48.0201 554.626 48.23 554.836 cv 48.4751 555.075 48.5875 555.397 48.5875 555.795 cv 48.5875 558 li 48.0831 558 li f 51.8423 555.46 mo 51.709 555.144 51.4014 554.942 51.0372 554.942 cv 50.6734 554.942 50.3653 555.144 50.232 555.46 cv 50.1553 555.649 50.1412 555.753 50.127 556.034 cv 51.9473 556.034 li 51.9332 555.753 51.919 555.649 51.8423 555.46 cv cp 50.127 556.412 mo 50.127 557.168 50.4844 557.601 51.1421 557.601 cv 51.5411 557.601 51.772 557.483 52.0455 557.21 cv 52.3882 557.51 li 52.0381 557.861 51.7164 558.042 51.1285 558.042 cv 50.2183 558.042 49.6231 557.497 49.6231 556.279 cv 49.6231 555.166 50.1622 554.514 51.0372 554.514 cv 51.9263 554.514 52.4512 555.159 52.4512 556.18 cv 52.4512 556.412 li 50.127 556.412 li f 54.1661 558 mo 54.1661 557.342 li 53.5084 557.342 li 53.5084 558 li 54.1661 558 li f 56.7491 558.042 mo 55.8809 558.042 55.2232 557.455 55.2232 556.279 cv 55.2232 555.102 55.8809 554.514 56.7491 554.514 cv 57.2252 554.514 57.5259 554.64 57.8834 555.026 cv 57.5401 555.347 li 57.2813 555.06 57.0782 554.962 56.7491 554.962 cv 56.4131 554.962 56.1334 555.095 55.9512 555.354 cv 55.7901 555.579 55.7271 555.844 55.7271 556.279 cv 55.7271 556.712 55.7901 556.978 55.9512 557.203 cv 56.1334 557.461 56.4131 557.594 56.7491 557.594 cv 57.0782 557.594 57.2813 557.49 57.5401 557.203 cv 57.8834 557.532 li 57.5259 557.916 57.2252 558.042 56.7491 558.042 cv f 60.5914 555.214 mo 60.4302 555.053 60.2061 554.962 59.961 554.962 cv 59.7164 554.962 59.4991 555.053 59.3379 555.214 cv 59.086 555.466 59.0582 555.893 59.0582 556.279 cv 59.0582 556.664 59.086 557.09 59.3379 557.342 cv 59.4991 557.503 59.7164 557.594 59.961 557.594 cv 60.2061 557.594 60.4302 557.503 60.5914 557.342 cv 60.8433 557.09 60.8643 556.664 60.8643 556.279 cv 60.8643 555.893 60.8433 555.466 60.5914 555.214 cv cp 60.9483 557.651 mo 60.71 557.888 60.3809 558.042 59.961 558.042 cv 59.5411 558.042 59.212 557.888 58.9742 557.651 cv 58.6241 557.294 58.5542 556.81 58.5542 556.279 cv 58.5542 555.747 58.6241 555.263 58.9742 554.907 cv 59.212 554.668 59.5411 554.514 59.961 554.514 cv 60.3809 554.514 60.71 554.668 60.9483 554.907 cv 61.2979 555.263 61.3682 555.747 61.3682 556.279 cv 61.3682 556.81 61.2979 557.294 60.9483 557.651 cv f 66.8702 558 mo 66.8702 555.879 li 66.8702 555.27 66.5411 554.962 66.023 554.962 cv 65.5191 554.962 65.1622 555.278 65.1622 555.824 cv 65.1622 558 li 64.6582 558 li 64.6582 555.879 li 64.6582 555.27 64.3292 554.962 63.8111 554.962 cv 63.293 554.962 62.9502 555.278 62.9502 555.879 cv 62.9502 558 li 62.4463 558 li 62.4463 554.556 li 62.9502 554.556 li 62.9502 554.934 li 63.1949 554.655 63.5381 554.514 63.9229 554.514 cv 64.399 554.514 64.7701 554.71 64.98 555.088 cv 65.2461 554.71 65.6309 554.514 66.1143 554.514 cv 66.4849 554.514 66.793 554.633 67.003 554.836 cv 67.2481 555.075 67.3741 555.397 67.3741 555.795 cv 67.3741 558 li 66.8702 558 li f 155.499 137.735 mo 155.499 139.944 154.763 141.838 153.078 143.524 cv 151.499 145.105 149.603 145.84 147.289 145.947 cv 127.871 145.947 li 125.871 145.947 124.186 145.314 122.607 144.05 cv 121.132 145.314 119.344 145.947 117.239 145.947 cv 99.3848 145.947 li 97.1768 145.947 95.2794 145.21 93.5958 143.524 cv 92.0186 141.942 91.2803 140.051 91.1749 137.735 cv 91.1749 125.63 li 97.0694 125.63 li 97.0694 137.312 li 97.0694 138.367 97.3853 139.208 98.2276 140.051 cv 98.9659 140.681 99.8067 140.996 100.964 141.103 cv 115.766 141.103 li 116.817 141.103 117.66 140.787 118.396 140.051 cv 119.133 139.31 119.449 138.472 119.553 137.312 cv 119.553 125.63 li 125.555 125.63 li 125.555 137.312 li 125.555 138.367 125.871 139.208 126.607 140.051 cv 127.344 140.681 128.184 140.996 129.342 141.103 cv 145.815 141.103 li 146.867 141.103 147.71 140.787 148.446 140.051 cv 149.183 139.31 149.499 138.472 149.603 137.312 cv 149.603 125.63 li 155.499 125.63 li 155.499 137.735 li 0.196079 0.219608 0.505883 0.0470589 cmyk f 209.129 145.947 mo 168.13 145.947 li 165.919 145.947 164.026 145.21 162.34 143.524 cv 160.762 141.942 160.024 140.051 159.92 137.735 cv 159.92 133.947 li 159.92 131.735 160.656 129.837 162.34 128.155 cv 163.919 126.578 165.813 125.838 168.13 125.735 cv 209.129 125.735 li 209.129 130.575 li 203.443 138.367 li 197.549 138.367 li 203.127 130.575 li 169.708 130.575 li 168.656 130.575 167.814 130.894 166.972 131.735 cv 166.233 132.366 165.919 133.208 165.813 134.365 cv 165.813 137.312 li 165.813 138.367 166.131 139.208 166.972 140.051 cv 167.708 140.681 168.551 140.996 169.708 141.103 cv 209.129 141.103 li 209.129 145.947 li f 257.802 137.312 mo 257.802 134.365 li 257.802 133.313 257.488 132.47 256.645 131.735 cv 256.013 130.996 255.171 130.68 254.012 130.575 cv 220.383 130.575 li 220.383 141.103 li 254.012 141.103 li 255.066 141.103 255.909 140.787 256.645 140.051 cv 257.381 139.31 257.697 138.472 257.802 137.312 cv cp 263.697 137.735 mo 263.697 139.944 262.961 141.838 261.276 143.524 cv 259.803 145.105 257.906 145.84 255.486 145.947 cv 214.488 145.947 li 214.488 119 li 220.383 119 li 220.383 125.735 li 255.486 125.735 li 257.802 125.735 259.699 126.473 261.276 128.155 cv 262.854 129.733 263.593 131.627 263.697 133.947 cv 263.697 137.735 li f 333.903 137.735 mo 333.903 139.944 333.166 141.838 331.481 143.524 cv 329.903 145.105 328.009 145.84 325.691 145.947 cv 306.271 145.947 li 304.273 145.947 302.588 145.314 301.01 144.05 cv 299.535 145.314 297.747 145.947 295.641 145.947 cv 276.222 145.947 li 274.012 145.947 272.117 145.21 270.433 143.524 cv 268.854 141.942 268.116 140.051 268.012 137.735 cv 268.012 125.63 li 273.906 125.63 li 273.906 137.312 li 273.906 138.367 274.224 139.208 275.064 140.051 cv 275.8 140.681 276.643 140.996 277.802 141.103 cv 294.168 141.103 li 295.219 141.103 296.062 140.787 296.798 140.051 cv 297.535 139.31 297.85 138.472 297.956 137.312 cv 297.956 125.63 li 303.957 125.63 li 303.957 137.312 li 303.957 138.367 304.273 139.208 305.007 140.051 cv 305.747 140.681 306.587 140.996 307.745 141.103 cv 324.218 141.103 li 325.27 141.103 326.112 140.787 326.851 140.051 cv 327.586 139.31 327.901 138.472 328.009 137.312 cv 328.009 125.63 li 333.903 125.63 li 333.903 137.735 li 0.960785 0.94902 0.29804 0.184314 cmyk f 381.525 137.255 mo 381.525 134.203 li 381.525 133.15 381.207 132.308 380.365 131.572 cv 379.629 130.834 378.785 130.52 377.63 130.412 cv 348.21 130.412 li 347.156 130.412 346.315 130.73 345.474 131.572 cv 344.734 132.203 344.422 133.045 344.315 134.203 cv 344.315 137.255 li 344.315 138.308 344.631 139.15 345.474 139.993 cv 346.211 140.625 347.054 140.941 348.21 141.045 cv 377.63 141.045 li 378.683 141.045 379.526 140.728 380.365 139.993 cv 381.103 139.255 381.418 138.411 381.525 137.255 cv cp 387.418 137.674 mo 387.418 139.889 386.681 141.783 384.995 143.465 cv 383.42 145.045 381.525 145.782 379.208 145.886 cv 346.63 145.886 li 344.422 145.886 342.526 145.147 340.842 143.465 cv 339.263 141.887 338.524 139.993 338.42 137.674 cv 338.42 133.78 li 338.42 131.572 339.157 129.678 340.842 127.992 cv 342.42 126.412 344.315 125.676 346.63 125.569 cv 379.208 125.569 li 381.418 125.569 383.315 126.307 384.995 127.992 cv 386.576 129.57 387.312 131.468 387.418 133.78 cv 387.418 137.674 li f 431.601 130.472 mo 401.424 130.472 li 400.371 130.472 399.529 130.785 398.688 131.627 cv 397.949 132.26 397.633 133.104 397.528 134.26 cv 397.528 145.947 li 391.634 145.947 li 391.634 133.842 li 391.634 131.627 392.371 129.733 394.056 128.047 cv 395.634 126.473 397.528 125.735 399.846 125.63 cv 431.601 125.63 li 431.601 130.472 li f 479.367 129.21 mo 479.367 131.522 478.526 133.418 476.843 135.103 cv 478.526 136.68 479.367 138.683 479.367 141.103 cv 479.367 145.947 li 473.37 145.947 li 473.37 141.525 li 473.37 140.473 473.055 139.631 472.211 138.892 cv 471.581 138.154 470.739 137.84 469.579 137.735 cv 442.181 137.735 li 442.181 145.947 li 436.286 145.947 li 436.286 119 li 442.181 119 li 442.181 132.575 li 469.579 132.575 li 470.633 132.575 471.477 132.26 472.211 131.522 cv 472.947 130.785 473.263 129.942 473.37 128.786 cv 473.37 125.735 li 479.367 125.735 li 479.367 129.21 li f 484.438 142.514 mo 484.005 142.514 li 484.005 143.327 li 484.438 143.327 li 484.695 143.327 484.877 143.157 484.877 142.924 cv 484.877 142.689 484.695 142.514 484.438 142.514 cv cp 484.889 144.549 mo 484.356 143.602 li 484.005 143.602 li 484.005 144.549 li 483.684 144.549 li 483.684 142.228 li 484.473 142.228 li 484.877 142.228 485.204 142.532 485.204 142.924 cv 485.204 143.263 484.993 143.474 484.707 143.561 cv 485.263 144.549 li 484.889 144.549 li cp 484.374 141.584 mo 483.391 141.584 482.596 142.397 482.596 143.391 cv 482.596 144.386 483.391 145.199 484.374 145.199 cv 485.356 145.199 486.158 144.386 486.158 143.391 cv 486.158 142.397 485.356 141.584 484.374 141.584 cv cp 484.374 145.509 mo 483.204 145.509 482.256 144.562 482.256 143.391 cv 482.256 142.222 483.204 141.274 484.374 141.274 cv 485.543 141.274 486.49 142.222 486.49 143.391 cv 486.49 144.562 485.543 145.509 484.374 145.509 cv f 499.045 141.886 mo 505.853 141.886 511.491 141.886 522.601 141.886 cv 533.618 141.886 538.455 141.886 537.112 141.797 cv 537.112 145.918 li 494.178 145.918 li 494.178 136.87 li 494.178 134.899 494.805 133.287 496.238 131.942 cv 497.582 130.599 499.193 129.972 501.165 129.882 cv 529.049 129.882 li 529.945 129.882 530.662 129.613 531.289 128.987 cv 531.916 128.36 532.185 127.643 532.275 126.657 cv 532.275 126.12 li 532.275 125.313 532.007 124.597 531.289 123.88 cv 530.752 123.253 530.035 122.984 529.049 122.895 cv 494.983 122.895 li 494.983 118.774 li 530.304 118.774 li 532.185 118.774 533.798 119.401 535.23 120.834 cv 536.574 122.178 537.202 123.791 537.291 125.762 cv 537.291 127.105 li 537.291 128.987 536.664 130.599 535.23 132.033 cv 533.887 133.287 532.275 133.914 530.304 134.003 cv 502.51 134.003 li 501.613 134.003 500.896 134.272 500.18 134.988 cv 499.553 135.526 499.284 136.243 499.193 137.228 cv 499.193 141.797 li f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 11.0.0 %%For: (H) (D) %%Title: (webworka [Converted].eps) %%CreationDate: 3/30/04 9:29 PM %AI9_DataStream %Gb"-6CQg$SN?J!(r'/,d2O!R+F5?Y8h:S+6F&mKF;O^k$RC0<-[Sh7U\otE[g?R'hmB8`:8^Q9<1[C`sjt+t3/&Ms@3XLB<#Qipc %?QJ!NGl@Taf7,ioq-UnjI@YT2R!398]2ZZ:eQ;eDjmQNgl\hR..A_j^DBb3GC4K+k3]cf %m>c[Ap3QHdci+()4PThD(O((Ark(>J4a[/mbp2+pq!"]gQS6(.(V]_7(7tNUmO+sph2D$>rV(70pu8ot(I,[EF5QA7%55J9]+LY5 %58QcF4b*@g`Tq_GAmCYtkC<g&#'f+dhH$s5>!**Dhcg)>rgPcgO&Fs5Ft_pl"U?C[^bNr#L4bp;Qq':d:V"K!uj%jhLaY %G49sg)sNf7^\IQ\^%g&LlLW1XYQ+JQTeIUFhtcYtT:RbWC4hDJ3+D@KieM.gmbW"pG-)I+I/hA1FnW:/+lFA(PitP\NV0]$PmYn( %lO!U!@a"3Xl?7UmkV_7FF2D!O %Z./<":EGSlc1-U$/f4HZE_-S0^0L1)bCuSI(3=i54o@eK(8'+F]cXu*s03:3$3/%DfI-&8Itp2(s03"+#lhqo.jk$olkBAZGM"/< %+)>=JER!,\r#bfqIh@Qd_KRanq>FD&qh>&[REGbB3^22:`\CtcZ%W/KPMC4s4h%!:`c&n`lPO=BrkVLb5PuU=iXt6Xo63<+p_QS3 %s)`o3/,Usl&-'[3llD-Orm*/d#l]m]Y^cF4O!7L/j-AM_Dc@XjQ7MptQuW!?lWB&7VKh'kF6g*mgb+%/f<"#O-1hGc@.0=8Z$5t" %pR8k9ro*lZMWl)Wa#N$jnUE*B]c4[`b1=,@R,^+ZFXmnOXXLScbF)7q(3EmHQnmO/Fc:Hl0B3LGXs9Zhj0iGHI66'+ch$o/__(&> %ajeOEcFDgO0(d'RgL`N31OQ%*[EU8A;knc/;6q.Hcnbg1:qn:)K\^=PIG$iP/*(ujYAiGN#r %j`7pm"3uFAUQh:CZk4@[k_C4O;*i\-U(4Id"^bO&G-huFXpblG2d0neoQ5Qrnfa2PeM]QVVnqIIB-VWW#oWDHgD=dq,8iRt. %Sgi&WO8\4HdITH)V?F8ZT=*2Z0)@EbpW!YJq+U6H$Ce7'qnf2g\VXKE[aoE"fOfLeQ:,Hgl!F'D+81QJ5ck8(PhojILnt5nkarN% %7d.R>,PE(KhiIY3hEZ"_c_'uXgCEQ`ir\*IjV$S3GhM9?,s&s\IL#lhre0Y>/=]UG\j;kFs2.pjL4%_$9_F3QK_(]'F#ZI6'D7XI %9RiaiiAaTbEZ)iPDrYI:6P4<3mf5IXM1^cO*bY?2EcT*LQqkXaIY)Qln][DNp[dK'anm(Keif(Ore5f^qeRGP=5/?bd,1SerQLL_ %PZg_Fp+'uUo^%8dLpR=F"FS:H6YiX^,NJ"/T-?QR162&e*VW&@Q3O+MVgUlM;JJPRa]p6Sg5)-7?c8REPtE3r[Vt_>lA5:Ih^b?_ %U>]h9q9:lf8enF8Ri7"orD'JLiuTWG8EDU8c!UrPAt#'Oc?2;qVNd7O4O>!DZHPUJ-fZ1"X9F+.>fFE\36Z=)Vo.4YAO@7-7u$X! %@=p5R)PM?g):5+7HZtpKi3JBTN]Hb/Lm/8kN/m#sUhY=D4HSfsB\N,h@!b:,O8V+?5p/a,]:C.-i:C:W62qN.b_/-T4"q[&l%8&PMXFnSo= %jStY0#0mjukDYX"FmM2(F(lVhddi"J[le4Hmj==[e`F;F"h4Hb<('@0aS %kY+m%O+4.:=_:g&ha15(IeRMk6+M9\cV-d/M:(*=[FVYE-7YPMU0iMVh,lJJtYn),Te,5)NAq/N8D))$,cE9&MScR=(!Zd=7i'1,9FdO,mjWZRll,je(4:%W:2N\%QAV`,C]>fZ\4j*85P0 %In@AuUkLdmr[_JX=2>U^Xqjjb[_KE!+[&86Z:?s"Utan!A_B@db:JSA3M-8Te3*>+7V+`k*-D`Dc*O"rK(::$X]a`mF'X.p@E;YV %Ig@ujQ)kh>;Q*CNRsEOPXZe5[M&rqJN\u+04D?\3RZ:PeIn=R`&72"#;oIqo_C%at?N(+C\akaUH^2LI*,@<[nY:>DIo/Zgs3bY" %iu=H5iqUZ5A0jZV%-YDj8D:4;;t#NEPRGc-^SgR+_S[(E+""@[4Op5(d$)0*Q&Rds"f(nYro\R0l:$A!b24N-r)ea %R#h._lOmq[8n#E0cC&PkiVuTJfFD_K;BJIcl8PkTU#43UVA-u!MDj$^V$Y0maV?HX9Drf+(J!hc;EtKM%;NGX`^Ondf6E>Fi3nFjc3+*YJLoB,J-]=rfC`O4WjDr9:r6sD55Q1BJq,[/-hq.U-HhQ;4?LFDuIF7>Qg\U[$ %-bk()W8)-!s&H1Kj,*Zjn<[4+Huo&Qh5aS]J[E`6;$7Mo5J2:=ap]jfc`_hIEVJTCK>n7DpA4[B %^HR#Ae$WqqF[*NdrB4QMgCGsp^M!`Jk1*8kI^/eDa(IU[GZBo>#g=>O5JI-nSr#8l%^4./l4WWfh(Qhsiu`IEqBJtPq]13Z_9d!b %Blj7BrUB9n8Cp'9j2_*l="hVGTHE7cjpKoZc'@A4EYZ/t]E\.L0@tcX,?uV-c>[(YU*dr6#@&=Q0L`Ja>T'\"c#E(/3XjJG3_h'4 %cI7IcM=r)'#U2nQab\>'-H`a,8-',9q"J-(j\p;P@,mgoE]:]j,4k(Ao0Pc=Ej9.k9GPZ,+X?i1o,%*R,[Hj7giI=tV9*gZ)X_fQ0>I$bGKr&hQ#"BB/# %!4(&;!9adQE]sQAr$>Y2$^:Y-#NC()-QiSSJnL7$LW^aQ/=-d!,033&EL5oFShK9uq/efl&*Nn:L5PO^SKh+ucgEod7hE/me*1s: %*FL1@[ %!X&g%.hLkbL_Q,s"CrI%HlWbRkfuHE-Qqm\d/"/mT4%qS((2q8_ %]>IiP*BGi<[u5J5hgIS6p"ebSLNc,S`^XpG[=;ra/Ne5:7D;(5V`Lsi9!>-auXCgCa/eSmsj %[M)]l?*B@(*DCV!l^E-A[5+m=5&d>g[*;S'])7pG4^@riCpFou]sc:-%6\^`I.q8Y_`_?j((jhVLIZJX0E:N!X8p>C.i)*@SjdR0 %SbXhJZ>.L41h>0t8N/!8R+5YDM?hRdRm'O"E2O6@)Y(OU`=&LZeRD@4#@MKUeVd!TSq$tK@"sLjerTR"+eO:%U6[p(T'V$'U9:"X %>FpDt*n"a&epAQ\RXc9&@*4URk6u/F(d0S>"6n0GS%AYi-8MNF@."VoHid>UJEN]dk5Z.Q<)*N$K+"bBE5CHt6i]FU@?IcH&03Ro %#ou9uJ1Lf-EhS3/"G-h=#""*S#C,QJ%g!&*g&SDb6mHC-\9aQ.BE'l5:ShEBH5*`OLdqJl$.6OcB9%3V]788Pp=iul)MU'kLW!Js"4pMq;1Q#!sgBIe_8/#99uop(6NZHua#X[VlJ5nk-9\q'>q %\r4sBN;h6^R&7d"('CU4iomlm4p4P[lP:-@O5H#T.8:?)*+LB"KXomod1miBi %9k1/]`"ga&?%Ql2K324?%hcUV@fJDem=fi"jnER5;9MM:M58;aBArX0o82cD$YtR+LTgnhRu!=3/.'reK!Kp'6(oIV%jV\r1m04% %$R?Qc1e]acScj_(#dg/,jlB+@!Gs0"0fbF;n3](!S;?>Qa%(#3)dA.DmZ*fc:HTZN\Ka"m/=bBPZYm8H"7^6jfuU@J=][N+%([!c %-Do!;,3D1B\;M^Ej+tn:`O):#;1D?sFmQ;?`DY$:TdgRQY)0?:GmXriq?e$X$=J.*+X@T:rK=O.UP5cB/R,_u-+EBJ\FuED]Xl8N %aofa%]a2!VP$Wh6%7,(i9g$LdnM(_f^sZ*&!CKAV2ZliCWT[`-U;T0e&4K_?J6=#D5/@5o%*fu^"0ddnb"L[M,0A%Q0LbnS=7!##A_SNIm"0o[/r(hUq7*G_C*mVjHmi&AS %/k:PSXDL2;Hq/X?Hji"PF"Ubj(#g<08,jrP*561UIDF";=;VHh7F2IUpKDb%D7s6,E3Z*8>t'$Ul>*flVQ.Q%l$nU;Q3SYnkr_oo %cu]48gg<(Vo)+]UqRp>-`@dg<"fM*,e[WK]PJQ@!?uY?ZrF&l:dehVP#-IV@=rVC`O3?gggE>n;Dd8(JF^/4MFq&&\p"*c#D/AsJ %J)!:f_d7e7"hbW7N8CGNj@\o'*o`R)bM:c3u6mqDFho3Z]aNf01(1]!#E0722T%S^jRX[P)_eQ*#sDdLub](R]@g.?I9G]er1 %dPB2/G.G9I"g4$mXtF^P/9,Z6kX:$l65gBk0T'"-P@h)c2_JaG[[\C# %%FaT[7S?ZC9GOU--%qNqYqoV)"X`!Naau/=F1.\3$Bbh\@Q%lTM+m%6WD1WHhV68De_J@EYNZ'8ZfIUV(9k"ZY?-"0[G/+crE7ai %(#Jt3=^H_=]jGi@[?];/6f,Gp*A3k %?K?mQb\%m]OdGoTIUq %IfV<;,"FgZ!D>OPeOq-7]=^75eCHEt#,a'%P-lU8WT]e=MCOin88W.kmr75fU7%fJO;7N#)T8`=WS7CjM[2/q2-P/hR>)\LdLfb(Z&4-t^ %!XQc+'.5jQ4Y1iHfP*Zb-4BC4KT32/@h^Y,4U1/fZ@sS4acunF$4<%l!X6QbKg\KTB=oED"=4>s&"UmEG49#VfeEbD>ImkQ-`_So %EVR.UScA3pr`*UHIu4T*b_T&D>Kq*0-k=FkVp0(LV8U#:g(&:qL/\7T&+&CZQb.DMf=qrQGhl/hECLP`D9]Jr?I]@T;d`u"-#,"< %[B3A+FbYTje^UXC*C[AFB8`Uu7:ket-l=jcbiYpIV59Z59[%RUhZsb,]3/sC#DcdD/&EgBkp %B5X99CIZ4Srs+Thc=0`_5=mX`#7ro4mn %;h\Sk_WI&i^,F2P)q;7Rml#9rZY?\4e@PnY4%.9*+`W8V7*3sE\@>9Qf/)aHg%X2(Z2gn@g%n94b_m!S[agf&9RDX0u5g07S_dFZ;)LH/AiN]JX]#5)L:Mf2#,K.%sg_la8RSR_DMiDHp %ho%75+(02sL'BGMg@49P9O[K2S7&sQifZ.Jm(SoUD6beM[p&6F>-f3]IlMjCs]d'HFsmY %5"NWhW#-+fb+]jtk7=pb>]*IYMK_>!E-L@YlkL9".H.kKF_@n@\Ohqb\/0,l4rKHj)Drn&BP!<%2Dir0"Bk0EhNt"UXYsp*Rs(_l[BTp9>bq4.kdR^]>Ag5'$A1)uGPV*#4q\%sUZPGmeo8unf? %A?O>X%i6s]VMQ174]K1JUmX2>G)8mq37r'(l`[>)8uBHkFIk/ZoCqKu+MMKgelVgumNp)"0;55k=K75dQ147KZX:A^((=_JRauX" %f@t>j;RnP\*]6C)H"!\Z[S#._FbnR_a`^=#"CpaDgFr:'/MoFeb>IEGR?KObQe3_.)^[S7e;JH*83/4qk.m;.m)hTh]k5CQYa5bu %SDiET':,3009Y^2PakaDomnl"&ag\b,X4af%Zg8jH`W/G*[;pp7RdlK&X"6BEDtZr)`\pS$BM$ii1otBcdSC,^t`S+%*iQu/l"Kd$(odO!U\REq6hpjT#!;hBF %NP%6+qJ3Fsd-n3,(2&a5#N\cnHVD*Klg(`Z"4=OU[O\LE`HnA,ja&B-/-ATVrB8Zfj+;nA*_K@%J'#d,]TdjM4n2ZeRB'#)qi`s! %F941&h.#@p>5Nlf1ll0a\l@7\kl>.HhWH514g1e4Q_IYA[?;9I4IE3oeu*FJS>=I8Z1^H!]F15)=149S2QoL6DqNM,M50%VGoN4I %k`odf*uM?V5-03k9>A@ra2MmC_GBjiqq.O]\-[UrR*"5SLr=]\a:F("59dB(6QU=#1.fO_qm^G#!Om7Ig1J`D`GJ]P`qmng/VdHa %idTUOH.nckmF.V[s"uFc!WlT;e`neioCTE&$oR4uE43;,=qITDX0BF()EM#9]O[g;TjGeG=81`?ZudW(l:?30pHheLQUV=^>lcliE7$+Ik$P$/dWa["A2dS%%Pdun0dZ';cElgtiq@$b3,9,H6AG(@!`2Ct9i[KC@7bPCt: %S3ubgBbSC5RNq!727_t[,Nh;b)6I_b`l\?b<@4c1Xn%qi&*-YqAh@>Y.9enrl'>'>>\>52X"'pHU-,Z`pc-6'>GLs]/Z4*pUQd13 %WdVJ3@=*Pc>VS/0*?HI/cJ.s8,b&B)"ilOOX:DDFkZ8hV4"N@7=0VMrX1n]e %s4?ZGLhGBNdt6-nY/EX"#+COYt'k+5V^>'fdI!LPgE'%HI8-Ck!5NE3K/`R %iYb,ig66cAe_7%sf&#D$'#^0%G%)k8#=bdMNn.I1J'6nldoD=H6=Cteeqab;`&d;]1;S7&eGO&2F47oWEVYlIjd`5rA[:^J[_:o` %0>;.eb,-k7ib:!;1mN#A6fqdb5;s&i(rh#9ACj<&S`r>a"SPoYrnIYRN]i'KM4 %lK;28mr`a#dK`Xum7pL,e=3Vt2@5kmhK8JD(tR(&$ruEFR@U%JhVBL91.a/kRib%l>aQV!L-o`;m#;R`!Z5GS?u6JpJYgAFfF3V]PdkZ.rpZRbo%[sS%qT+GSO.+k:e%C"DmV.U %s#@*g9[p)HRI4&\3Y3%PFdo6?V]R>)XjZ;lrG5]%g(e>)P.n7nYR.(#U9QXkch^UekSJrCR=*S\Ub^[scgQZ::Qj4$]\$Fl1IHIV %G(WB4T>dQG':^5:m;%;0ok6QkO*2ct:Bqo2CJK>S*]FYh+OTO7][t\S`HEcVMN3_oTC+DD^$e0jOTM0A#r6nPVSCC#LdA4ui\K2d %n&Dc>bV%Q@^-Wf9$:r%;2uj^)ZNu[##;$kc%EsT8,"s*WaJ2'sA%YB3H$n8DPioXR4:YbWGS%n8-J'GS5q(7Hf6!4,Kp[(3giFIR %$cV$sBMT#a:#q!7h07smKJ>6Bk$jECOJ[de^Tl$)NX;F>@e %fh<0dFnkN>@Ld4mH5BtW;rdl$)@pYU54m2H[S_g>2a-5cG\up%Za],*9I]_FA:%8-09^H>e>DQ$eK9L_X..@ubB*=)PRf:sh^:[q=Hd[s"/Vg,>iS`]V'C,J!#@.rtdVjdmpciI256.#f>F$^\2$*,gheUb.Y,`P(UHVTNC %*(1rr_,+,6<=Vtk:^)DM"B?(:9i+9p*m5k-:_2)kV$Bl(g0b_VI"5omM;"Oi>u.6Ho;Do"#^`n6ljou5`?]BrLo&:b:9E\XlNu+K %\/]I/=H9@u9?\&`U_c%m=r3ZS@!+Q:)Y])$=a%*=lo<)Oo0f'k(J9EHaT9taetJe?7GC\jeqhm!@rWF*RWe+ZU6$%k2j-[$a]cC/ %^.&&C_Gq0iM#ZFr6%A&RU_Jd6oAi_V:gDD9UfSDe&4T,?UAg5_f0Uh9(1R\XW/uZZ%h8Pd:PQCS`dD[d4)P %)2+oY`<,AHaKN6->#uCk(LfjU)gAb%SQqEjT_3//^'pQfa7Y+(Zp3h%[(eN)Ja6NgKE?MgA!bfD:lrH5?*p#Di]@-C38+LYkn? %*`XAO$)Wcm)Eqgn*7fu-(Z#.,3F(2HY?;BklLrb5^\C;mMAO*:b_s`6 %bH[1,r"@],GcZ@!Zhe[h&Z.i&6B8K=aA_UqFEsU+F>0T466&\tT@="s>S,BrH(oS/+EQUm&>+VBHbt)L[MgLG5@Gb,qGL%P-ea>> %<(#au*XfN(/B$gAj^gNdq(5jO%J(k%$bY<02]`C(Gqf`ga:Q=Y+]LZ-j%3'q$.QW[fk%0F %9k#lkBWaPb'k'%mNlJ3Q##q\Tr-#V8CbF$U?>XP_/iGJ*4hR54^hrC7>G@bLT)?MqT")iT(O>!a*>_jh%qni>Xt1gn(Z.A*%:c"5 %o+?[@bG+@3%*B(IaYdkL[_;/2F5\Jc"s:;2X^:O^m.o+Xh8cF(cVMZST9;?%jjj1dae#,b(4&#FkilcSV[@9lVk\s;NY[cZ:IbdU %Ko1pmNYZq%bkUEVj/9eRT+3Z+3m@B`0]UCZ:PTfPfc8SRI/e1?&Pi7eP<+[p)Lu-BWZ^*KbPIbqfqE1g1=;P;ZSuPrdSqPHR0Q\i %Q^'D*1s#1E!NNn"ca[=15pjaDX&1!?Sp#)roR,%$da2\ppZOjheo\[+57)_9W>`!X%HG#0RS!-cVVca[C!?Eii@q11[!kOV2,p[U %[&cP_mLEIc7I9\+NKEO5XKV"mChtd^k&gm:KgFH2fG+U+?[tjr?r7i;%D6D-1[PEV9?<>;0r-@u4]-/Vn0$dWHHt!MT(T(i2A.WK9p-Bb>PpKUEB%)1[nn+3DGgOFpeQX>S_1Qu/A8c-"QnQDJ(-SSC48#Xtdq)cM;U(iADaq+i@0 %5/4tLl4!G`;;kH"\gNu"[5h4*@@]Ec]<'nu=djO`XDH<7alBT?%bat+QCKEZ/@cB^s[6O9>$D,*2RsmM5A`!=S!"-MRdg\qf'eE9L2BCj#t\' %M(J)TS9K4@XMaBehReiHl9;?\jCc^q]Tm1j)CKRM1OQ?Cj@;6X;r,MN/N3anc(H%8`ePP'3(puJ<#s$"l8#NaK6bFeY0s8VnT&-# %Z#Ir.>TL[Qhcr0oM^s%qE3o$9(JjOo3J1CgE-2LPfAq\O)QrMel69PLCcsZn=X#pf*T;:l-uf^Q/7dYtJ5&2uS3o,s,fH5/@?@]e4bSF)0l8&q^8<8WD/#t&F]"JmN>"ga.2]Bn4Xrpq.YC-DX1"h8 %P*^9E*&MpXN/3-EUh+1:KPQXAsR8\\1JJ?l[U)C %[$M$ggM;q\kEX2jdC.Z7hI+BEkS2oOZA*D>aeo%q"^"\'2'"ZDn6$Tb6'U?.%a-jtWYDr'E2a&e*YtHU2@k07G0Npa2Ub"1I&PnM3kX-XW'j@)O>-P[Jb?SdU?5B25%o,KH/Xa%hXI@^"00@jGPpWT$Fc;?AIQJblb5@f %A*?8.l\$rj6754g4BZqAG\GLg1+V-VdfVi.ne)tmXqi=:$'\0DiYEljOt!m3TBDY^X\WZAL_(IG$5#$Z6L+oNN@5smaNQ"[Xs<0M %$eJMWF.N9Pau,DiEs4'eh[_'"rbP\&9*3P^dd*l&&HJ^tbC/]&8\dTc0LPSMF6K0>8EV:uFaDj"saONs.)KS,6-BV:\&L!$I\O9O%/s=5[AJ@.47ZjIRh)FYJZem\Lrn;)O %WghG`NX=N$,IF!V@cKJ8AFCW8*0>IPLaqPeQD^aK]5%7FoDd2Xqk7YOKV=-D:0hPr %6&`O!(Y<@2qH-1/8keDUJiYcbF-M''/Y7#Z=WfPe1Nk2r>9#">mXo3@R[[V@pL#f,f>u46S6M7`'312*51Hn]s5Wj&5'$C1fZ6+B %5B?e%gAr3NF,l7kliCDL"\QZfRS!4([W[82p4?>W6,WB*VN%gWITOVY$e:fA_42jV2qp\=EDBf,dp2X(>&mJt5sVJN+8'o3;F-6] %BNL;nIZuWb&eU-_Z-/F-kU4H[0nH"8%"`%!eS9([#*3AS6I0P'MLO&R+(O^5f,nA6J+4&]_qhZ^s7;REInOpII:I(Oo8i]md+Gh7 %a^#EH]e:;QUcTPs)95sanbuA?Q:Td\H-=,nLI!a[2>QPFW1*\R>lefprJ.G.s-EB.-JP/(JYR*'Od7dZY?Ojo)8rSNaF`M?99i&k %PQNL6e<'j"-"k"%Y"(7L6uX.ZaD9fA6JR^4`dRnu,nTGgE5uu_!l@(hdWo7WJ(e^gg2)90]6GNR-W515Kagp^jO'?*UM$FVCk%A3 %dNZ_$\)Fdgh0iH;!5A?TS(HQ1IJNa76u$?&gn8uAiA-Z[YXkS"`\pCMjie;%5fYhV;9cP[[C+2t$;;P?"gtI3K5'X@ %a#fghps]MogsRWm=IM8Cc_pKA)H'2,o("f*We#R8(66sh7J^.?Kn#@.Qu;S\fkThiCY0V>=*NpY51s6nOa5d %.K[uGqG:s7fA]C2FJiVQ>?i,[Cp-%&:\:DI+*;2.55*h$0LIG=LK``Lk#Qfd_IMKY7Vq`hI>27K(&%0:. %i\h(GoM.oC7]#EqUWp)2QZ@ka-2gdrL*W]g,meu7!U)arW"n`(>Y0P8FF\.bCP.u@e`Km:d1&K.gMJ&0mWY%l(?e,fEF!W98T`6^J@M:(I8OP4Z\j?h%'T"]UFXG%bZ;GWnBdjM);G_YP5Vp]2#9oY^hUNMMna4Rem5$7^]W&CK06q(5CW_K@r %a,^)ffrI%RI^jauV\_&Nk(\2E4oG2Qn]%J6d9igSgI,'+VhmJgJ*hJjIj[Eo7#pj%:E`:!$^!('N\;g`440BJNfJ]BNptJOttJUp+f*(r2nbb46#rOCHT-#QeW(`sd@`-Ftq7DUZiIJ,t`W %'[V5k7gGeN5sM&UbPU4+,SRpZ62>,O.IEf$#s!E`$d9:8Di>kD"W7-pTbZd;[CRsZHuRL^!i:a5bi'lp5HSfJTP[Z@12+D<@l\`o %KQ-CX''_X,a:Yh5%%Ij^-7#@q=rJ[/#Re[V>J2sKX>"?%N'Z&b]sk\T0^6**2cGZaI;_r[0Z>Zo;.,]mn([Uc8;@bF3l,i[I;c'W %_Lt`j!mVA:lJ@\-KeY=!+'=;beZC!,Kdji"?k5e"X*ZX4.SQ]Re,a@Q\@OUT;F*'LFa.I]lg7*9d&)8%*j_>t?TMd81\*psBF=_Q %A6a]#U[8@s+TWnn0N@0WEe?#5-3-"V.[a9::B>ftHZ_NTmpS@5NVo(L_\:$F2IL\g05l9QECK]5 %_E=dQ+I44UN0N,_hT`jA<$3Uu81H!)rJXWlGn21aKbZ$FFFdD!2Fdul!%%%'5(_XTpmDJYDS1UJ!EhFYBm$%Vpet-K'?K(T\a4EW %"&BNBA\M(<_+-#9GAmKYHFJD(Si8".>7d(L?mIdg1>n@<8?LsR_a-R^%f] %ZCX>SRmWi%>V#6L.^jXH,DENC1eW].B4Qu6bO>t+Ph.TWRNRZ7/Mqme*ihRIo-:[n8[%%^-7)1qOpC23N.M_)#Lec\PngcYe%(-7 %^S[@L7hmu)$.QX %LMEk#&nu?fQ-/AB#pRWV#>JE,#Obg!Z\#3pQLIm!$@0EgE4DnZHO@2JNCbg)d["?/*nU %TrTs"Y=cPTbIeIaPc=pFpklRnAP:g0p,)HF#ie]R2hl'Gm:`o0BPIl>q$IF)H_$Ic&?d1QRrI[]\>oTk:i# %fgr\8b(`t4!4+YZ=@*XEJ2]k:W#$?7[&sI$DW)D\9m_D.UcP>&']I@-5gVl\[Q1-M^6)9fQSCm3-BE?;>d6_bAQ(H3m)0W/3`oo& %<'J/!Ql9XVJ@j2PiQqr[r^;`;nD_Z!`#J;uE!Dm$Hk.d_0uN%,BG@kk3m$[1phOc'5&/hdGpG,+-loBOP"q?T;o-\X]jkItG8$p? %9J'2aU`^h`RC_HKQjN1lf'iG-okCsJeZ%E!E^^Uk+8#c&WdS`6IC4I+c'5,AWuiu*=RlOa<6tpoJZ@j(D$#]b7uC>W53iY^7;-tj %J5W!h=s8`IOqSldOj]ifcMb#h?PSf!mgEP8PJF+o/*bDooR21UMRpgRSpM?r/7ldsiSID"m^j2j(#4^#q@cke>")d.pBdj7[!9:4P!IU8,uChZS8 %%&VlNSbcC_[XW>s"R6Du,>Z#gHGe93,LEur;!;"+;4m/1potGKh?`4WH)EMW:83Ean!ou.;W51PW@_h,f0a[+bIEdT0cZ[)@ %ipDBTeCqnM(js7+k_#)$G;9oVC\@T(iC29-CL)4bFS.]HW;M)11p0[i/u*@H?JU4qFm>8D"1YY9$:K:Q6b!I!W,:J51B5#FrB9Ij %Pu$!\*8>H"lm&X@b4Q(oNU'BB[^Jr_2ou]HHZ&-7]MCS$,Fl*&c*7r,9?B;!_*%!=UC,CG7I/G0jeYY2<[;<&OgS%:Q64'*S_/AH %7mq&5EW(u,lj=\6.P-17LZDK(,7C0jNAU9K_H!&[MnUol>b,RHcuX7_Fm-NO7ho]g@G')4ecFEIdC`!;KbLG'a^nZQ\W0+.'Fg*\ %AUX0:\'JBor#T.al:9^OSU&3MBc^c$&!Z@iPni3Imcn+l?%q9A)HH5Q_qXYR-7ID#2HV@D %U"]jRQN4\3bZ$6BX:@tg,I/"]92`oTV]1,rqWi9nesj7g9F12/LuEV8`%b$pp")&!IM?X,lXNKNG;$\fIJa$2bF``Xh;"[qS7iEm %IMu)Ro.1oT%c,iVTA\JY>&NSFGi)\>bO;Zsf:g6!arJaf-Ubt`f9,UNm[T!G3P>=[mRODB(Vb7ckFLCYPka>ome4PRTkiREWX)I/ %k5n&0ELkHo\/F,IR-0;L[ln71\6CjGR%@JKkc*1`JDVtaAq?bN'I[Ofn#E/W!c&.lN&@7D!Vfp44%+PaG#9*#?q88q1>R5&8O9Vot_KbX*nQVk-#Zt2P!>'+b.'*DPE0GAn$k7YX=L9@/*Z*ajCDHoqijZmlk.olM\nFJ=_"NBkX_4Er\K56VW`[i3;bsF' %D=)^RdOKc5jbl:(6>OJ$\XliQ&B7C*[2l@NR.e'O>(qNdAM06MTb+H@ZD:TIGqS^<;f%+Q%!,4K!"5L1'u>K2m_%il2EC2=8$Qd> %_:[lb`?OK*4i,-)*_m`h7aun-\>32>.fa4hnLs)`_%Jkq"heMEkd!tlHC\t>0D8%b9gXs__5>.G.ilUG9;0sd8[6n`2s-]@END=2^ecT?^_O\X %Ti_;A["`c=$c'mG\YiQ.FWS5';Cmi$EN,jeUA@&d$/kL4e%VJ4KZrH;(AdVKt-WcU'*,>$W*9!_>"F0I302G_JT%*_,"I)rjr=TFVWl[i_)-pqmB(Gn5F2HNDTJB/:U`u1=7n+MT` %>bfs\6U*>iCbuO;j-+G-6aP,n(s]Xa=dU=&"WbkMOXKmTAeCQ%#/E'RprYVk1^h)1h6a!24L0gNUY.c8@;:u1T5TqURUuq(_)O#\ %(2tI&cHpBA05NHQ5[W]"UY.Dcc)DpjJ@UnB:U4*%8p*e4JEVh8RitpZ.h#rpODKK2)`1baYV9-o1^e_OSoeqFfbr;Lka++6D$!El %oe]lBG!YG-[\-un-oH`kiJhAUl=dU+c8&7JU"PTqjGM2QDP7^X:kGJ3O@l\Fnp.@T!gNWV3blWBpPapsG"hd-ubdo*?j5[?M^(mlT%Pl_.)+Ht[.OV;+P5rM]-Ir5=%_5WP!,Ju[AlV`1 %=]EmFdb6J%>j\Q'7j%ri7$>%iZMkT"q,bpBa*u3gZ%m$b'lC!p.,)c(Q>@[T'[_U2fQl$kjJBlu#ij)+_kuoa#@6\@7cU;\'aru` %N6+s1W#9p`lU>%jeI$WlXUI#X/[3$Y'!I_.[E,kGThRs`Z_r!JFXbHP6n?.`AIROE;TJ&cU;R:@LP9C^>,t_-72:MJfFNgC!G8&e %jJZ!V9Wc*603K*I+7"M#JC$a5`GboXenuG&YR+>;UP0L_P?7ZB>T5BIKc%!*/lEOc$$B]Hb/puj(1PD5K?7Jb_CWi9#pb*jZ"VE[ %9,O7>lktK+KtSgDk>?4^8)iEZCH$YSY0Cp2dFT@!g1;.(d0pg*JbUW5iAAt^6`EH*O[ptUjT6^t?3C0=UnC"9c5%iRd[m.$OAO&G %HiGc_:H0md&#)r,kkCJm$mtK>pc1jnQGs<1D4YMXShLc(3JEq?TK/eYBJmJMfEJrb(pd?uS %=#X$7C,1k%V]=p]X8rRo1@M<;0nZiR"lK#]LSdK^.NajHY(0_&YHRE&^oD#-aXT.@9#.Yr(E9nt)grmA2%:8f$&mR)I\sED\V!-O %0Prf@\eK[9NWP0LFfo;R8;`WBC1bGO"inCa=rYO(.N;7]OS4SRTHdBM7&EUN0;)VW;hiIj*5Y$:,I1jQGAJq@m8X6Ag"^$36IUf9 %6e".mlO#6P/!!64#$URF?GE.i&XW<0>=KE!/dmU&dEDNRX:,Z-H"*Pl-a(t/Ce!`Vj)1fdWr]m:Qtk;6PJ"bgWu/5qBZ2bP-d>E0 %![!eD-0%kn-cR#PFY$eq`0#aYG%PeRAtpS85"0$[ %L#D'LoO1CM^dlf9=QSmAI<(4`+3+!`N_%66lF[dkW9gZ&/aa %+I+\5p:@NMpl%LT`@t8-0YhWse5dCq'CV5aHW=FuW/cjT8RN!=^u*Q[=Cf==5qjJ/,PMhf"\h4Y+IFDaMEk9:B%j`F$1Y@c#E`)$ %(kiPWQN_D;r>(q_&a2=a3\9`;:&?Td$OWRQFPuI/c-tO9P-$BkoNh)u@aeNd9HgU::."D.jY\@4.M#PYe6&8ZSE*j(#adWlA^M>0XiTTK %3O!VbQ]uPg*"0_jIAI*pKt,fbs01_A59%@4*epbX(O5a*;H=gIj8>2#@n(FD9JCJWo9Q,4[&AOtb[qP*I2ZR+Z`F %BZGG/uFXV%537DISSui/]?r"-?*#_8U=rC\d9r[OgZF,(b&68N#>W9<7Rt9r?!CQ.:@8+1c %S]08P'n16gSTAr)OliAGC7/V^(,#(fP*n]][@C5PjS3k1A`gFs3 %m=`(&NaXV1`:cl?9.cTFh1/Poh@P4[-^ks\XcY1r0]^50M=`VZUF*)Zh9AKi^blHp;p5t2o((@p=2PfZgqppQ6J%>D;Q$1g1mc2F %O\)EQS9`eHiE;9h^WZm33u3i5+Y`.R#_XWG8P5_tauF1gJ64ThBJa$MNG9mTHtsBb2QWZ99>%_;g>Z'Wk](^mahAq7oGZ#A\Z;)RVNG`6i%,E$C4!cTWaG]JnBK$2$8o!/coEQX;# %rd[p@9VI1=>e'-Rp32qS,g3_"Z#AY8"8sBbe/XAp&?0Cg"CN!X%NnKq0,5"X[mP*R*CQZ]"m01JYu,slD>JS3I[kV?q\tpNo5a,h %H$a!%F!IOu,%+fJQSL8;3i")L$ocLK27:D"%XK=Zin=<[f*bm>eT%thC8CXMoKqee?/3%+`@hBYk% %rL(au]n8=UL1SrL2L9NS-I8DNVg*;aDfsnsRQ1d+i-ohA<_&&[3^5:A8GchI5"rTg1%60N6R&"AA9UAgf-m='X/I^,4DeVPi$a&; %GC:e$L#bOf\D+1`DYW8]eT_%)s7ZEUjn&4"hn4F3p+O$b!U(>,UJW(^I_#>/kUul2:V0sR%f>G85J6jKS+k75ln?S"!t"(r)FDE_sjMA6?&l7^c>R\PkJ$Y59RE#duAcM_Y27?k,M*-k3oI::C^ %mX!2<40r)aQg:CN7o3k9b$WHV1q(2Ueji^Bct(,(cabMA+@YH+QG)TF^"&*2X^A528,$)-jbb!cUX1'NR)Bns.jObM %rL-c9@1)9iQa?=_X7:*io-,f7fX`CBift?;Ba]r;*&EcRh*'fOO3hL@?`oaia7X9nrDepN:j?8g]A:ukAX@;DM=Yn;7c&%RU.&L% %]*khul.,uXmrNL%eq/I'>-K6LgMIY[r_46H)Wtu:i9g[#/FMr"[k0YpXS,;LQZWT14P-7^j?Gq'5uS"Y`o-Q3VE>`R0SM@X+5FEr %:,]0,UK>7uq:A\eQ'$p>_Z+V?JGRFu3hB@)`u[&->=bAPK2(9RpD`FIZ[[3gVLhm=#;\'1>I@RgBr5% %V.\E$#0re["E)12R)P<m$kmX>6]m"l %U]k?%\Haksp&1+UO7Nc:`gK-\[4kD^7-sR+O/o)@,IQU2mra^B1(&R`'0#^P$ucNE2?[pF.&YWNUXBXk?W.h %M%H#n#/i-mq`X=RBD'EF(#IQTh]F\ZJQA+#d(urU\/PTuhJ*W_jiDuuj4@Tqcm^6:_N]_N34locaE]gKSg?:d,HCYm5Y5M59nHV[ %B$>?c"9b&,^hsGEHmA.J!fWPtU2l#)`^/:Gq_?#qVpn6fORX5M2FXf4PO8@.k',[!0YkaDV\M%mdZLLD(?ErC/P,4gP%@^%;<->5 %Lk-%rLDKd+Y1'n'3fE;qAXci4e+7EoHM<-Gq&b]no6Q["L5FE"Woc_*\cAtQ[A#GWR8O>^qrk-BLhgK,-<_10`0?.0Kg1k3);BT%kN.XJ^>$7@=m/:j;-1;-f'r4IRk[KWe#*`6C#fbLV"]e\6cTWN^aF8+E9W[\X^tuC&?E?5&j@UErNK]G=:0k'% %8NmDpnu.Z_"_4C^"VFl=Z^fI6_[MVCTSaV@;DLtLEgCs7R0+K*olG'faKKgS=4EQGkZfQZdZtmUUPiUJV-La\"T_Am8d*AG&k=-R %&O'r[_#'"B8Qp)[JB$quB2/]:++\B,W"\Gs(E+,;Nf+Mm=+Io*@p5*k\eU.2WqVGUVD,Id'HCkdL?Yk/"q?D/nuOuf %d*s%udDa/NM[::_5HlNq\&mn[`#>n-YQ?pn_Z_^.El!]ZTPQ9Wml"!Ob/&@TG0jWT867mf,iK7PQrN=acHb %r(7eCZ"!ir3p"K/XAR]J.+tAU^n*2]>L]?M=8dh6p8QW>W7If+ZS+oDSX-D`(NJ!`T@rX[%9h7f;fh_ibPu2>^$\a'9<.AhA5=K# %r,U.!17@aeo&*#Dq+ajWqqM*gAR)Mm:NEiZ'8>'3k_-aJq*\rdPJPc4/#+[8:GVu@#Z4,`@`iq%u>RV.$`I$Aaj %3RBH7NKMi`'?eRo&.j%eE*Nr;8NDNQoSM/d+Wm8JPqLM`_d^:Y,#%9Xd%* %MUVG@doF4P-Z)@lbZ!2HFsM$";,(-`cMEh)p*CK3Mpe,PK-8On-LFt3:Y_pWa-qL$;>At,4Ue[`gcJI(Z#p'c+sEIM$]@nCPg %cP0=N]E+;EJpWmU4];b\26_7hfQI1Ycr(H71Y4B='j(H02<>:Nj)ChH^2i4boj"k4EVRGb*cZs%K06c6,6c@aA)l,5L5B6eXGs8t %2NuL0EuLgP)akN/lSYi/2N$0-2JJ+*k!k`gId(I(i7,9u)&Gm0-nfSL8Cp\8Y,10CAWjtIkFthXR=4mu`l[V7d!fN,RK5uOBfGo8 %Q!=?6HnEksE,:>"]3oe(ZF/$^jk.TG?p83E].K;[G/"ruG&Ia#f9!Fti2r-O12'ko]L`I^aC^XS2MlFCE&WW$F#n,Gqs)7=NT#2r %O./8mXtg1DY!PdUnCkM)^b31ZkOQmqBm^R5Wmfs-&#"AGOsq$^2Xf4%"]mm#CM_5_Se[.//q^-5G0HN %g79:oC73F)HBNqQ\YdR6^g=[\*M510B)*]ik)KmD,aF!`Z&F^],tYBIMN.S'I%eLs/%]Q]7,MIWl(OPK'O>rpHcMAqQnH?tX[TT3 %!t6.i`t^FMe7=9oc5l[k^i[NIO,hG@]m0&a'fF)NE+0hX>+;hI)C9K969bk7T+[gV5_;C@=beFOASY`^-*2VR#[0M3H'+IN\IJ]> %m'I.85fYX["'Nf!jrEQ7;^^9(SnYE/7_-8Om)+kSq(`\i&(%#,m'W9+-l!)5B!.E3WSI$YJ`Md<- %/%D4]KtWJ3^tCiRd(/S%@^L[J,tj((fMSaSWiZWNgO>0ue8$a.-#"FRf]UFC:a2F/YmC-p>ddRI)/Z4ZAle]0qaKoigE %I\@W!3hY(]N>=W63f7Oo0Vo\Yk=3Rj(ol6jS'$TgmYlq"bYqIFMuh$X$;Hn#&ggVTJp7HeZAuE#qH=oG]O_HtNMn[n`DdKAZ<%Lf %@DIIF[T]L3Y>#BY,N(O;F?`f#VO::u5bW_g[cWDcF4Cqu7"[5Eh,?qN`u'(HW(4:*%!S&90eP28Ti5:&,8d2HnBpnG1I-l'%]gL' %Pr=RuJh<=8N+#Z(25t!m4!de$@E\^'`c,SBZY*.SfFfa!&`4lBeM_2W_cWIkg'jlB7,%Z"g]0.P\_qeJJ^V=0()[pC)JO*3U7dkF %[#K,ET]L1ugc-LTB,]q:n&2l6*!P!b=T`P(\O]oTNdG7K\_4/G4eQBq9_YE#)oX-g3acH=[-p64Z/M$@@?Q0#?KMORH]+eV)Z2h3\*.G?c^_8(1j$`(GU5(EGX02kT"7?WVUNb40`j4Voa%rVY(dFdu_YEeh-MHC]Pn7l1?TuN$;7q %fesY82M\Fb;$FBo@[hXD+md"E;kdX@XBN#HTBHP\1_jlV/hc?hVW6_QlX9ogk*n8M&ZBsfbq-p'VD>_OfrCf(hU)Gk'L?[UkMCYQ08j"7&'ghi#34,]d=[-' %@]^>(Abi6@J`4""=SOZ15br2Wi&TG:IPto1^Fbc$db;Wp"WC7%l&5qPWtH1@)=qu=f*a8?1r@OiX'ikLe]#(V:hhMm%Tm_/4]R3g %Pf9s]F6S?;+\JQ!&bpMf<9:nj>1FgCR)+9AF@N+9i2XrH]0[!udUNNdW^elV3GE5,Ukl0#:%g"c%b75%u(4N)=K8U"1bVE2"N;tj!/,2&0I0_N<7[!a]*WiE): %2u7(U[P[@i:Kg&_l\j3bJB,g#d@FLSf]O2=Mf+i8;*DNG[$Ct1qct2.`2r.Ub'sEW5;ol=3Ps/7$L@dGYEG6c34eb;0&E[nGudQGf!EcSB?o$O)tBk5T#VK %;[k.L'>UC,`0s:HN9Z7[^A7!_8JV#"Qe@ahJeM:GRdS1SMPC;h9!-VO>-n(1!+J/k(M^tBUh:VicjTRVlo!,8_qZZH7_+I?#r!7; %<+PQt_VQ/t<%9t4jO]#/$D(,=@3;l4a.$p0<1g$ch6;=^ik_]>WF8%D>GIcjK0Z&lYRL3#!+=`tA]PK@JU[DKb;L]Hb`%1qhVEFbN#iPKfs7p':WZ`HK\7p#1"32!3G@5KUQEl'3,cIeLGb(qN4eMf".:irDN'6JjT-[)G^6bh,m$q):l!+TtR-."9T=:a!3"lE$Z"j?&WKfuJ\r.rZE>>J.`s]ZpkA9];U99>Zj2&7ee6JcZP2N^'Lp,#bMs\TEFT %d5puQ,%Cga::4X:"bJ2:K,#(+9\"tm:.`=_bU!.Q&JRVd]Hc&3"]JIg"U1JAU;B$`Ts"":gbaq(enoP7@mF@Y-SFl&cM+ZBdkH"6rjegTGUrDfkZ0@cXmdL^D.G-*Y9)b-R^\?NNf`9-t&QFUf]pF %kGV:X$&UiH-*@O]"HFJ9@0HgD5duHJTV)]beZD1A"T^XHU_ORLQK&=@TKo.e':PT0F;\Bp)_lpG<,5Lo%+gnWF`"+0!c\d>+^76` %?qDe^"9i3lV-ZuW?:Af\-kIqILJ:UlnYE/gWh:1`GZGKq`&\/1_is4X:bZU_(+=b9aUls(?/;QSaCP5=V%XPGSM7.k*ZU@&`41]5DekIG!/i4rQE$lEXR&=IW?phhF`k.XS %+nFjaG)`,E)RT.qicNk@^lH@VpKn)&--Kn#0P-h%(9`(F<6_HI(p-dNls/#e@dpM`2(1(:la$Y823OsgVO#J3='o_F8di"X"o)s= %ef:FHAY(,lqh>E=lYW1HAM"[4XXhm`ho=<>,k7GT%6MbLN3=#T:tK9-XD=q7O#t8WoHAP`A<"/)Q^Y2[<9%MieGuEL>/:8f[fVc@ %^409K9[ksoJ?3Io:7/=&$X2j72:&`d-E#@%qVA(tH;pp2_(n[iN1:3a%;9Y9pNH$.H$>C\54gR$G>?lN^T %MsZ0H>KiLh[FQ(-So8+4:cW#TXKa=TZ3SQ,Tg[DlB0/\.:3m%q*IOdl*_U3E2JZ&9>H7qY_;>7M/\mXUmE=c/YRND;`HK+_D;@(W %Y#+_;)e37734dpF5/Zhr&oVni;\Yb#rnEm*?lQ2nhl^^APlIb3Jb\)8gnn]4&b'WJmbWkY\g;4='sQkk\')d0KA.n@cJ+V!ciY\; %c"@o,[MR,A=3Z)dZO/Y(C>p'6g8leF39s-S@oZ$=L=^5uUH0i%hLaq=J231si>%Q&C9+tJb_md/cI>!L"6?*g"lCc=Srt!<`@M4Y %<^/Fsmmdbc;emZ[eM?Ggonh2(:?*l;1RcF\!V,fGp3_LmSt8@30"crsC9-F:1'O[h2[8*r1M%jU%QVf^20XAEB'bh_#d_p:7uJg# %cR)$/VS%Km$FKntMF#)L0!AjJ:bFp,R:*9`ggDA*,Z9`u\E2M9rnRY*[PtE/PP!L_OFJ_;-_[f&#UU^Y*RnTI%?@%uFTYjar$j_-$=B'6esqlI)!+R\g]Gb6.Si7M4j\2YOWm92 %'5(D)>/_-mF.;IjaHN'8'WCn:@9*UI/PG4n-i%J>*p?MOk6rBU]UIa.?JWC*PT:ifSWXC(%>N_&Rc2A=@m)%Gc/mg8;="P(%W)Go %HGC/2HYW*snd1C!YT6Pk>/A.45ajN"R#3KHKI=;W>&$=OK#4nO\$i5J'kU^un?*0<854,(%?t/OYs'7fT"6lX\pA;1Q4Kqs45J.5 %l8E:=,h7R:$ET_ZPFcJlb5r2F8Q+oR'Xb/uHA$/`/%F]"0qE.p_4WK%n?7j<"4ng3PjPKHIY&=urYkCI(LadnhDbO-UXj9k;V;3)pHQr* %AfjHm>*G5_RRouaRNb7#a]Lo>AaS5KM/6.)9d[1M9n==9QMnArY)WZm1-YZ,YT?2(,9"3&ooiP6_Y<:S='/2QZuEGCbLFAWlR9uQ%+i.gD^^i$W^rZZ%Wgt9gQT4f?<.g&(3 %2)B5IWN0ETrcV<%isZ(Q"js4%m0j+Lh/5"[G`sT.1hRc_.f&&Nfl-K3.B[tj!9nDra&S\Q.`:77j_F^h*%IY.P#\fYB$@UHGROtQ %,H!SNhCA>A18F<("1'&LBU93/&@cVG_*S6N("M7t:T5mqM-G+e$8hFRJF?OsWdZt?J5Y4YFc3B%!;^SA(,Qtc?,FkO#c3[U!dq_N %NjW]k(6ObQ0R!oMg4J*3:?=aee1G0!j%hN]D!"ZBZipe32/baeb@j,jiu?a9)hEkJp#Ir@?+5o^*k6+8*uf>^M9AJVOK9TkEk5?q %9&<0G`\p\T]/2tcQP]*,TG!U!NRW#$-*8k(;)khcqJ!7S-0Z`_JrOoMQBfD.AB/]DJJ+J35]oV^cmW*VFI"1T#$@P`=U$kWBm;C: %H;N'm;bRnN?CJKj3*m7fgTo*CdaG&rBT6mEJSi[=piZhl,NTIrC[gF6#!-#H)'bh9L`omUHAZ;=2DZ*XO!UrZF3S$,^p?amg,r:* %@*HVLBk:ZIer$#Urn6U.Tk1W9kX`7X_WjZ2?uJpDp1g.L)Qg/S!pnIK24/KWRTF@k<2!$*c,I0WiPQ#N>/n9[J>5\CB/Jmj0^6oP %bL%Hu$J7uJ[9Be2o_hcYInNZ6U<,RRoSM9tlg"nk>:9d-`F^(Eks=XH+/]O8[od2idtWQ`.RO[#Bg&=fgYbk)L.nF!WG>IE9+*T- %kU?"hl<&`@>.2k1Pm("tg0)lj0X&>1..Nh5CooNQj2M-Li6!^?AHsL#HB\anTL-F4(+Da4)O=ZtChh1bK#qb,:DF!LGW)_I::qM0 %KSojh1"65(?r;a8<24bA[,Ln1>_t`R]c5e%XKS*P9t6MO`+]BpO[tRFfbF*j.c*6pP@U1#e7)Hbk#:^?$T-'r/Qalm%]W,oBeI+o %]eSubW_`q$[AbuO\LCXW-Go#30a[r(bHbW;5H5WnJT],nXF@6OE@fX7_Pij@3,0:Q["45%.Vm("aedYD(^s5\kY5rp=ed(\^>#X? %P`RrhV+PX&5uZ[cS8F.4#;h([At=Hj(Z;aWTFg9`Yb2@;1Q$>f;d(_C>OWbT8NNQR2!TU6'kO&%,p]U7Z>n32Ao+r8.s5-,Q@(". %o6ooXd-t?":sZTgC/]n.W0S?s%Q.ptpTP?<6]AUoQs6R[*'L^VFo%gOi(hm4T<[WeE)hHi]m)V!6$aA0(ZE#GB\&"W<_cU)0 %Q=c-dAKXe6ZJ9.Y%G\Mj/_#D+X8TP(e:*i:\&f&XcJ9*SX^)c(2>e2naWoJRj=HFS3_[cViMbm(Z#r-7eJFP$[H$!H&,mdGf1Tcj %mBbBmaZS"/? %5O6`*0^`%gjh`EiHn+l@nT6G/1l>5?So1q>VScGT1C+dl&TIuE-!4r>RVa`:OG2OuMqgPq+?h)j=?VTeJY`)VJhAR`?%#qL>!jbo %DcU+Rs-Rj,hY,mPg1q=/>PXO/4u!)tR-2NOU=WndYN:b71t*B)=B.(0RT.m)19UaXN2$U6<*/Zn_k]dA3K"pmC7HUu(7o.[F7L,j %AY%?R?:.s0j;(%dW3 %\oOBWhV&^=T3j`si+mG?FhZ(\4@S5c[-N^M1R^Pk-1tcg;mA`ZU&hHJH(5q03IT_(C/sbil2B5@2^(p1lRlLX9%S%<(gW?G2Bc?L %\g;32'(?WFhjbOQ;s;AGgR=S#PB_]gY>X_MY1N;qm.&t/Mq,%ZWA4F9E[:V.bbTL=GT:UmiY[TFq(V%u0#ASQK)n)+T_$BNZ7p%3[#[/kZa1,'38rp-!";WYI5%?%VlIPBp5+cgZ!%B[Uj')rQ\\Ih %.7m8J7D60nQnk3+$VZhrg+U(ij##i@"fA8099"j)U&UUgrBH11Yjd+4:H$+V,R!iYGWAbc+\udqD\Q)B4Z9Pk-D20>RQMc9LCn-? %(>S.6`eeOaa2(%)Lb=.6%WUPCf#7Y$9e)['%:bQj?--k1<.q\T7EqUVWW+GNJ9G(HVuCRX7WjJ7&hYY$eL:.T2!E:P;Vl`00OL,'_VE %M,'7@4\IZLT=ceW^VX*^FK8aLm:T%K)P+B5Xii]<\SfR!]fS5IQ@UdmBYTafgAtq%>6[.=3Gp=;3.e2L^gmL7>$G]%"Kaq8"[MEi %f7/@N7q:[8N)gR2.Yls@GqD=;2,&=r4Ip&bMP_B0Mt8Ph%@Bs61KSY3b^:1SKs@O78B?XYUKbiR)R!.1=.NF[lf4pJ4Jo(Y-U=35 %5#HJUF\JsO8%'`N4D`-jGXZ;%RbXc-I],i,bs3G6SUeqG)P@uH%[p*hWO*sP0b"uERCoZ,\=jJ1K%_`KoWJ4[q>jO3(NH/`hJb`M %8p[:"^?#V&VH?Gb<)Ob0>6[O?Uqj;IJ8IpEPVbXDgk?YKRDnOp9HamPWXoNU9L#gKL6A;[$RD?3DAWdP,T23(9hu`NQ%_%1(hQM+ %C0;tEKf:P6$cTbq;i(DDeZ'^Q'SQT.k'G+mf@-*t?ND#l$atS7_RtT\Mrn/nVT=ll!0[MA3l0g^7`Jo@\R`_/b`g,E+<^2/5d=?s %%cE2Ml:+i6?@>One79jP[Ad/,WTkpT>O5!Po<\j>;JW3qSP]&X:L,X]J<-.]h5CZ$Y\=e8lM`8.n'GC\$\Zm>f)Z0;5HusW2#mV; %+=SsOn0h7iJZAH%%;DY4*]`AJJdequKAK8d"*=Ml_)3WRCB2%6PW[nsR#5EJ1]om19PK;73h=ScSkmStJ6>5U?*KbBkS7cr1,+$% %XphP"`9\PAb^Ga4\d$Goq>*,8\alVsPk?<`Y"s,i%&sBha,>5.Q7O"Yq>\k9DS)3Na`Z5PS:@IR!@6TKd:b@3VUncgkY1/\DB#Ml%WW5.MBY=Z@/Dh9:f!+9X^L&TC %/RU>W&W]ATE>isb`4cum4da#r^>3sY,b>ZnpGKD.B);%eY>k,Q[LK3eQOe66]e^kC+r7asK?P]?DshJI1hS&j.X:,_Z+^GG^c'4@ %nWl92hP,WJO1EbkKf7QufUB]$>tq`%m9\!m:;H:O1a)Z/q$[4sro[=B_DkaN9S(PDU]9sU)1[Vjmb>TmM>?[!u],9+&i@d7r %E:8)D'[N8i)T)Q06k7dl(;186T7#.i(d?e>11C^agbS4W's&d&.rOMTg&CW7R,P3u?-kE]O+)&gT`+fH[)T?8"V$NG48r(aKZ?(< %+ed-'cnWn(!L6J_UcN@13cI^g\r"=uZ5UtB5PTTF^Yj([4p@Z*_;mJP`4Rg#.PFlj1p17-5e41CY]7ABX@AVCk+3I%t64AHQ-5:WgYi]h<$,3])DQj^:TGla:Xr_9:,D:gN[;]NWU*a?7uKar5Dl#V\X8EFnVq!2!dlY3>RCG %*Pp42A9tKF=8Ml@2QHC>GO6K,J8TB.[ZnE(+J.]lU?4`jSHck$!GjfGig4el!I\[GEdeu*dc\BbbNWrWMBYCTg%_O@oc;cJ`SnQN %A-e=WDW3OC:e-h([IR)i!3h#lGQ]3bF62+p)spIYs4@U#X(TGJ"[bQQI$,YFc;Li7jPacHhn;q/Xu[Ts./IqKrt?$NjIUe2r9F.C %RO[sWc[Z;^I6Vn#c)ZMH;tgnjk-kf?S],/,5qPS^3T-7+e..WC*J,XC]dT5o*X5kbeUuf@NqcXi0#n-Zs"LKO>3N[i@Z\:Wm-E5:s2KrNse`S:1Qc4/K>W56^s+?*BroD@"9] %!,(0&%3[\Ilgu%.XqUD%gR3="H2g*XH]Wf\TFB1RCr0[+^,i"_(6KJbo>FfT %W9J[jQF\6Sp_dq"ni:^@%MAeTCZcqA39p,S"J[_-P<[t@j %qh(m^;E>7qW=GR,0RC82q[Q?C, %J]>V)%%!H]fDR7"D/'c,u7K;k1d2l_imu:KQOZLY%4J&cZ_d\#8`D.pXm`WM@PC$Dj5IoPA#tn`U_C@ELT^4M[<+Q'[UfGF' %k-$P@Gf%W$Ma]5$:h_ptg!R!Gf37]IVa1hZ&\ICO1B%_3;R1C'rY&;rVQEYNgKHnKOF#Q/j>3o;sRN9M5t/t4:FFQoHFCr*I@!p_p)Lo[\7UC %A:3H)hQ1,UAXHcDI>.#Q=)1IE1G%P%BRjoEklJY4A*G3 %BmtqPjF1NFh2`o^3J:_[3XhtCIQ(QR2lVUU-VUlp:%]"*]W_M9n[0ZZKQ]5n"8Mei$NneX!q3e:ktaAjfBPW;aa_JIiQ:2$4[poeT"N'`%?Er?JJ0&mDc3fLoY=#Z_8T@:qVDi`) %W0rPD/RN91/1At8b6%qm\N)T4r%.S+I-ruT+i!0qpkPkLm(5!q'I&\oH:*LoEU(//7aNJ!a%$ZS9F %TG>:k3s5R$/Z5SL4)Jud[Cn4g5dHZ#SUth/jF4h)%m-/Oh$nOKCifXX\^Ij%9(2%5)UmX*"M)/n2Ma_8B=#0ISD10)O/2U6,*$>d %BaKgUks(_dnb;ps3ip%+&SYAoi@!bKQoL`Cq6lchP_*:-9,2eR8&3J!\bBteu" %;Vl19ljEJBU;*6)qKHr?8^u"5;YSV(SSj=)XTR4]VAdO2 %j5GWSqr34[*G$<0`PrERUW]2bs#H6m>CX)O.Q&pq8i0uPA[U&?Y2.#:C@Pc#F*s_#f?i"+]P.!=K-\]kNJu8.4^0*M5V:[Lc.K3o %b7WVQLVm-C;*qb`aq6Y'qm@d/Fe(I543r8!Zs<#$a&3tB1ubjmOcQKQ+a@9Gs7WHSl&gToU1qCAqb";98TiaT-"WuMh`jX_*DD_N %6kP\!D's0=a(+fE$b3.kg_X%RX,%:,7;Q-e_P0VR+TN0>Ia=d[4l)jb&oBDR$tBSdZG7+t/%;k"&/"?P1(K!HV5c6hWfg47TkjZC %ApiV.(`_06N8O?JHRf+4p]U'5TQ8%DgpA/r8[ckp`4Qp,KY2@-TIAm3BgV#1RGVgbjm&g^4ih.aJ %4%Sr$(*N>9UTtekQU\cX)=`=R$#2,3c-2nIV'W:r:89+dG]@r>.n=j(jfG%SU!TF)%]eSaNj(MnhYjLm %"c:obnVuA-mfs^;KuF'WZ#:_#I=Bgg)El(\6rqFBM&("RN^VMn*0>@3Cs*`^+Sr1`fPC@[Rf@ac+g9R^\Z_YH^3ukW:CabTiWM"E %lARm'C:s-`OeFp6@T^cK@nL@30BWS7aD_geJ4>?.3EnlTFbsFjCcUTeh/m`-\9iK[**r!F+VGep^h@SPi&Ha\g%UGuSR=(QE*H&ck!K!Co$De_ %X.(eLGs_0eiMj[J'8Edu[pjp9R@"/1\5uJc6]24*5b6`nKjL_`6Vnr(LW+[C61e[=ZW+.;keQe(YrWCh7u&6b:F&^1\cU!H&OgiF %?3$MZ$CK1H*$&/d2J5U7%)>sTh1*'A52%gM-+IQ#L6Zp;?.WfP8Ss$&gPR\hgmjD$EI\T?4mk,-O:$+557r&eh%>+Wa\GZTlgbP> %.M\5DZk:B#CF!]m/UgJuZU=iqZ!b!J2$@G)'3j/`%*T'OI(E9RLr5ufHiu`)\J""]<\bqRMaO.[GNQ/^gr@:#m^=>^f*lB!#qj'T %^7it:H>$5FXMR:2P:9NHWUk(uj\nLBM#;5g%!:r<0]X5K8M^0=%fqJ;9q(e5-W-UCV1sc@LlA2@2h?B+m*FW;Y]3t>mF"]/,-O]X %^d1&q,%<9l>Fn?X'W^>9\EmsY\*/ZIrd_6&%stVYdnSa,#E&D%V@0.7Gu8Ppi(^%"V6ml\SWk`s=9K_<+&/?61=Qn->WF06$!dt? %ZQE&opsHCX'Te=V1J/6\WAk5M*aU?K*0F23ntQ+"KK %(#DU'k^o/r>6Ns"#oP1dNj8Rd):qIp3g"X;Gf^nE3]BtB8NpCI!3sVs?>b--NtkLPdB8c[LpBG0;'65-V7ZTl6kuA1?LQ4l?jO^, %d(S6ADq+q1osdogB3HJG8>@=07=`rncXRlW@\H$nfqo^XJVjMXp\k*-hbS.-:dDS-_mj'u(;\=*+\jtCWrnJc>a\K7q.B&aKsY&f %it[hG(EG"oR!IA+J:\G(k`Wi4=K9S\,`uS-aC3&G1]na_IB:>lJe[hhP,"0:93QoZM0b8mj$AW^<2b**5kL05E][ptcB"HR$*#i/lf55qB6>]EidofjQ5MMZmp"2ulh=(#.[@^f#[)`uf*dhk/'aSE(]gOrJLDB$EGk?Tdft\cjfsjo %P6?#S5$BX3>Ja%t<+M.7[WP2V$2&U+U[1r68L&++9_(a`ZXKP^XB@Uo=gJU2aI6\E.;P5PQ/`MK06[l;I;?[FK=)f_!q6>%;cm/2 %T%d]Ep1:2InpI(9L[1m?mc0b[c-?FNCK2OtY9?j,o8h<7WKa\oW %8ifrBTo*RG@n75ST3rNRb\G15EA0?Y1OsI\A%IIgn[S1r1*nEH/7M)FPgtemPd3#$.]$rj7\u@:cDZt"bc$aRPu0!`>.`rsk0*8TV=\b0uh3_.m9i61-VCAN,=#k3$s`,M"Yd %"+4sDr"dT"T"sZ6-Ce%eF>F"C_t0 %VBF<-3NT0fm6*QkPk#EjmIb%.]lS7>PC`#PDKR$0hYMJS5Z$B6661Zj&X35q$p>D:S>UsI&`RD8)NrVl%[IReaJUlt;#)i((!5/>l60gePWq85'm0^j'Kdoc/pgZMmRFUF9%=_>*/:]LAeC$ug7C!=P]bo;%.'S952]ca^ %\tn5pLBYa+TL;]ngHok:5TRGNqbA-uGhB/bP:n5agt:WJ-&P=<.192DEnp$QI/EbZS=Jb-7tG`<.3T(2QJ(#]oM&o"ZrFI^0U-nO %2Sp>CK0,iY,0\#%G1j65kk":,:"Q'nH2+\.F/*j?F20PmhkBB.;k]D-a[46qE[Fjk!JG,XKCG3Cm6?-U&ROmUMXcbaLLP3pULLh:gb1>AKI %-c]LSOi).q5t*MoCko8)\H#:G)+M6ZG.8J?Pdk-P'%qFstk/m81oem=9)RAnSOS"s?QDa`[Z0T6duF %A7DkCP4b-XfR8sYQ?hFX-;N&q-`=(`>>JS4*FE"0&=g+6PY<=ik>QSL'#P>`W9MYWSYecL%%oXl[aGd; %$?C1.bctG.ctX2Em=BsTdsSI1W&>31Q@7to=,Y9DP$;W<0Hd48A(UVMq#&O1R6?:N9Yp2\S;pOR7%O9r`WK.DcLfo=ZjBaP\ba2P %HCP?3/gf$lT$h(Q/]=sl&#p+3kqjD!AH:8SOb6A`7S]sC1iiTgoH-Hgr_tYXVY.bb^:fH;fp6hL8e[K`=k`b9!O@=`ulLbXtPLo1>d==Z['5ZOWYlR!#L* %*WjS9FJgnoe?[43.P6"l'$sq=jZ9M9*q!u/?de^hfoMJI#-`g!MdR;@Eu6IH'12biL*7A0bK]V*?]bBe@61"F0V5o@:IWRnIOl@= %=D$HoV35'1ZlCWq/S&jU%mHm();K\N^"U=RPD8lk(A8),WRN$@k%^^BI;:Gq`PCq5YOI(6"&JI@4Z %MO/nYPsr?n7D)*:[Tn-11@kNNciVE?1*8bV4?[:?'Ib.\+"FO+4qr%^I&Q,II)*e$W+>#m7XP!ZXI0TdQm+:1o>)]J\_-W:OdV?k %R@+Rf_+qg#>OEtWEuqAkP6Oj(WJu?m/07E;=cIjX&OA:_BAIp?1e_oUrPRls[,+=C#dcB^U7R5U>&cI>L4$A[d&pN0mhl*I/4Bo)8<8 %@\"Rlj*gS$>l2]Km":Rpma$'I<4q[BroNbs3.`St@@=96HMLJC@T4L*QkY!t;ZKtX"Hh1UM/!r,dV*Ouq!CA%m`EP-4sL*qCML90 %=7Y<`.3L7`3cL#UC!6lOqCTZOC^q>::`.94)KLO_+E3lSF_(kl<&./P!Y6W3JRflZn7!IJ">TJ+(/4ugpNZQ+>SLX-64^(58EhrK %8/X[(+D%e!5g$/tR8o=?bd^!G^WR8rXLQsl"$nKrod7u>4Vk>@4)B4\h+P2,0U]Vs:&a`4[out4&N%+QC>s4BO3]3GE#Iqt#ZYje %c3[/Y9"1^>%E,p/FMh*fjWR3uJ4c(HH,ra3[6[Xp980Ii=_(\:#)6`"@![^9_4Mcm/(jV"JfUtkYtW>*'CN%]m;Pa9.#8sdYc*hQ4D86?6);9rKY3rSZp@XBP7_j>A, %C_8Y@VES*Q+X[YK*SjGDKnUYA`q)G:P;'UsgRg$-0R!E26;fkFMjT*$@3I)i,n!<'nA.FhO=Vq.7F#p/*lL$+KpjP<7GbmJ;ETE4 %O;+N!$cuQ5e]@R<99aIEBc4d%\X0984RR/<''6j*`fZ3'Fd's7+MQ/"g!YO\0e7C7WmTku/b.#)W6i#nbNr.`X0YSBma73??=>"V %(d;%m.ZoF=Uq0]280O;TIo'3):j^:#8!X*`UjZX6^2Mb"nTXB6_?mIZj[uVorBgX#[P2=>;f^*=CYGusP:/$k&JRW[&W#Ej(8A9!)Tj6@s %M)Qs!g5fmi&P2,^b8#R9p%.>qkAV:g,#\-4*n%2s+CK?c2`3gb/JIr7%(%1&`F7r1,RuT1bbcWq,2EDOM*Hi0Hp=SRM&VR<91\(9 %-/**l,];[1p*jW52HF!:65$bqqV,*tnTJc3@2K9t=OWJ:Jj>.#L%Yq+M@bba;/MXbL^(+Q2%Cfu=(4IOIZfO!%3eO9M%FNrnfk[\ %+W=kq\L0^#7SBPK7#2&0O'kD4DV'L7hWtOP+hGQUm)K!]U'U>/T`mdT4f[B[*nHJ[d3/!lR$[tG+$l/ZdSc0p3nYp_H!Q]C2(?]96IaRL3QW8%tGW@Kp-%\5f@]18LU8!Z;E@P,`Gs&`oWVVc_1q?o-D_u;fe.+?o-Mu] %AkTU8UM(uGZ3NuO>V^cVTRd*k/j-8OM!fd@p0cdrLpdb7@&1_Q]m!V'Z=64G+J4#'A&X6VjG,osaJk69kN&pMd7:VqnGT@TZif[S %Hnf=XVX*G!-B5\h\?AM8!3*]@(O]g9;CYTefb$ikC8SCgImiEil6@EXj$cmp&47WneC6u\Vl>`A!E=Ima'/+tS5m_b3WCRkmtYXC %Q'V/?`sgZH',V.E#"N36Nob6Gb\(=Udrn%mgHkl0(%9LS/AKPUp"I+QO-6(OSgo4U-j %oaqc4]06::HdtVO4C7]C9$H+@;HGbnYPLd15g`*E?rJ-rZO2,VbeKZsaC6`qWMkk7e@M;55l(c;R?d+'mCSdD?l;ia!AX%"ooVit %qFDc2N+g;gbX/DZ%>8ht9-bToL:X0<,TKs/\Def$6a:KstR2P<>>aX7*R;5g4JA_99U&$JJN4&hnL5=5MO_W^Z=]A-KR%NhV[5rD?RQC]Y!Z#KmAX.m(\\MT^-FQ<-*O %JSjaJ7iA5\1ZjX0G,cok4R4W#&&TrLl,`46Gk>kH8Q^8a`1:kX5LJ!G;.:a[LG49m$]:nkpJ` %I/e/i*S091=I\@9i7[%YQIcF_dLXWPXQ+\BG<^]b8]N9S,uFG.TR?X_:X;7IEgpCg0oDb,Ml';#J7PW#%"@*>GV%guiQRj!mqn%4 %BlX1<>2JRrb-[,E0e9nt?un.5;jaWlKccrC$_;Ai%ViAMRO"]^pAl`-,o0&E_MjdH17uE>I)7JZ*jV:?MsqnLfS:!a)?E]EY,k]9W:[*AR6[&R_"QSW8.J66=cWAYddG+,SH)pMjJC3V %f:hs652s4!'<&!r&qS#/OiZf'c%Z-uilGI3D3]kBZ?mq@oCM]")_,&k#0N)UcRHP&>2R#]K\*\BM^W%h-o,h#GrUU&q[T4+Gm9:k %M,JR",f@eQJX@G)lc5*!59F%T,?l3Di6p^&l*9pQh-b*&k>6/:Xu9cR^n1,n%[o-1Y5I-EM]Ar:%Yb;@jf")bP8d/9jG);aGOY:\ %\d't)S?sL[[]&o9Gc^aegoW.mYG!"DGksFmj(64mfS2sJW$V$YE:o6D_BNb.TdjMQKpWYB#9["sJL.rKcIhDF4k^:'=5(B\A2/V\ %(\56DF,t@$IajHYF"Iu(l),X^J\5it+sIt!1S3S6ajtt\a7P_8(/[Maji7^4`"3#W:H%)D=bb]X7lD813**u(;UJ#PI@ %0>DjN69jb6RHV]RQ:EL'o&[+VH.N/^1!3O$d/akF4/4-%dut]<5$#Cs28+.nT?-ZYRZ^n[8_I\Q\,hM.4PI46;a%dq`H:AiNHD58 %p?.'gF=Z81o(3`-'bc\H2&q%.&1ROEB;X\0%T]Hc@Y]\Pe7/>,<+e,8U#/M39A/K.6=^6j8-$$Y>*^'W5]/oj+SE@u0aT"kbQjsg %`t:UG@W\R;15DU?"'clRZSDP&:4`do,ftNUi*G"G\^%6?qn"b_niXVq23["`3DPeQCu[OL/'@mTk!'sXWS2Af"aT[0[.6JB0aOW9 %N9Z0CFGWq:QB_]LGMj)`gQU:4pQJ2TCa6Oaf(>h<22@E!]/c(3!Osn=`5VNM;W(2h"F84*=-1WtN)?YirJRnhDiQo,*NG]H=Ti&t %in9H7r,*glGc?";e6shJ92T?IU(`rC#$bo#Pn0TP2X3Pg.'!Sr0TuCE"We.h3l70@ %K;p'H'uf!Q`sr/jknk?P-u1;-)4Sd:!HgUAmH?J51uXd=!o#fq=W!9bGtjQR6ucG1C6hajihjLD?@sV&2s*]njf4lk2(Sj.=1/Mq %YBQC7n:<@p_D+l!9hp4P\Kc9-5+*^36I'P:"N*Rn\)&qk-IpeW! %5BQs>ns#A]YnS@c@4qt0__Y9+>=HSB>c4a3Ri.6B&O@l6jbiWBdCPEM5;iSqeD7H_K[T6emDg>:/qmR-8j47XcA?V=Y3GKrlBeYM %2E(q)aF@MGb%Fi!hlV-6esk*!hlU?BKleF%=_^=gRK3VFJO@jDp[BFmZqWgR$tVUpgY;l2[jW((U+TTF8^B%qp=R+Mq-NDRAY@l8 %s3E-RQV$B%DT'<^(0uJp7>1h[#Hd4_AH6`UU"iO'7$`pm*N;DD6YOeGgY %?uKer1?kcTK#m4M%$YC?Q)LR)ibSg9J#X?(g=8hfa7d-'H"g:tn`PO\L^h7b %=Rb!jh.X\]@#`3"jX,OhE2ZkUA3^AcS&8AgLs+U^L55+_6U$O"nXX2T*X#$5m=oE]dio14%Usqt,'XuPiBND">DU$Wr2Pf(XWOuT %i0\ufb"oX5%O,cnD->:J:,bJY$:+iMlH3*\,]FS@&B"dMW7"1G=!+P`B=#*GHdMCEmuE` %).ELt>R*ZP6n/&u5of^dTWQY(>paJ@T"[(<^3!V;&G" %4BnD>/Wa6>8sXUhlK;598W!%!<;6H-7eOMLiN-_4E%(D,CPt%=ns'HBG`buMYd/H(GY/Jh?;Xa\ElO<1?V[%"6g6@:SGN%*&(R@O %EiQGP$*-gi#908V;s<,TCRaM5<69"Y+EftUV*GaFSA*W)0nQ?n9$&h[os#.W]PWEr1lBpjU#8GrXp:`d9CO!iI1fpYoV&aaG]5RG?ct,#r*d8'&RPiZknB!sNX\4U/U:V9l@H-CLW %@0G.s0<`X/&[g%<0QWX:\C%6c+:$f+\g.AZ5\k7CA@C;t&F-$8: %;*6Da9t_p9ps+$P*MuC/GB$kj&Gk)pL22$;jV^SDaL9A!BfKMq6O&q=ndcT^ZKnf!%E]u$_%L4W*o.f;B %SF(M]1gQcWV"r=Ia%(B]K[%e#*I18ABrhf2f6u@LSq6(joWU.W>3J0JfQ"c"I;oPL$8J7f]AlUfn4ch)7c7YpoW"NI'N@>+.8dT4 %*2bB&e(D,ZW$Ic>Kq1+i7<*j!N;G6=5i6;F$p3D5)EB3^N36m %ATbK/q?8+t'.2-V,U]ij\r[0R_Sb+tYAggFK?4_@*0'^63lo]PhWa",(Lp'3dW<^GKp7S9=\Ooi4"R,C:)UhBjc7s0MaN:tRb?"7 %)6el+GC/YRbaX5lfaAalE$+ZTqXj\CNK*?2\,[uR!nW+J+Tf/_Ac]+P@Mk3nqXn[8&(OCZ'\ge=0;eG- %3KZU+G$gd0-1S7HKtR?%4F0H+$&^7P!0HH%l3BA9*:0)>B[-qtf^&H,Z_-DQ7E`!4kRpkq*m9Vj"!,mX5IP;ISs/g%lK'`U?g`CZ %?9BhTRRD0AeCL6;&$PDHP8QMp7"5p`?fFu'KBNCfPU9h7G1bT:pAB/V;+)E9k0]EF6U8l6k.Z]'A_Z;)2N%GI7bY-Ag'S#JREH[`-XoZd=h/uW'NeN"*F\SXLlL]kZVWcQ,5m(R$^ %fMiTif"KjJMr,DTQbQ:tZW6GDj;]4/dn'0/ZMge\fMt>jdZAYboj[W-#D@(dV:4I$gRZ?<;I('Qp %979tLSs.%A#bq$43?Zpt/$_)EQ2*1KR0O,))j<*56XbQRa]GhTml\rgOh:iSbjrp %?dTO9c0Nbt>1HG!@e]CoV)O..!UY)Q'i]inp`pB$i96!aqtQDZ%@KYn0*@OgXe%uF.D;Cap`1" %a+H;E)2[T/O*\)3&?j^dot_N8?1gK%F`,Y*kGn`=Whk7i0`GUPjEOSiP=ZF]uW'T$Yaffc@rL'"$, %XD(=Z'\(a]<0ms8i_fE"6KI!D]2>oV\KrH->`_6c7@&1LX']kC.'CXqB\;Q&(W!50Q,hTcY(^"]_TaicTup*[a$;C3"."\AQD:UV %NqV^7%M.Pt"k^s:5]`^n.PZfc*AY.>er,eYrVKXbcg3d=c/mib>2gT'do@rF=`Q;q)>Yd1qm@p[$L&=DHCn4B9'._3H8uXBDN$cK %,+ej1q,-`?o,HlVol?o6[V5-g/XQ/HOG1niWH=Fl-X3^]U)A^'$3)6[*Y\%#"ps4Lr8mQ4sJg4Nt&R[2s$rR %it.=`4uN_c+7+N]51333/[o`I2=MmN"Zp@U5\-V@Hp5YQ<-Msc[&hP88J&]8js-BSMNo;(D9/^'pnF7=h;WO]I=+hKS/:`]OTm6l %'VTNV$1[modd9]P`2s_*19P3he^h>D@;(f/;0]kJ$F5sX\.q4 %=#$g_%]+H`L'nra>2^5Dd&GsPMP6Ra#sE"rF+d`a223!UWRusZAa$+ScU5@?7\<%:iB49's*[9Y8c:1PNn*-"-0d2+)n_qI!3@Mm %prp1L=DjSg%K5(gSC8b`,`_YBdW?>QA`TE0,]CW"fbu2_+&s$+M:&fJ!-,oX(&nrO1[?[#J5t:q3Z8hsCPV;+OF:,c8YCpT*C%utQ/%.>6AD+"VZYQ`)TKgE'QLsa&8TQ/csI&m\raXX)H;8pt,%nlF&[a:%U4l"812&hJ6G-GXl>YF#P,Ie%C&rWnq.hj*r9mfqJP>HG[c %`+cIK/:(R3dL6i;_SK&+Et;'Ahd#q@L0Udq'N\?jOj\9K^.[j6$<-*WH$FXq4d_sro&CohGnNhGrbg6un+/D*]N?=h;o09KUn(^B %R/Qt#A\k#r&melr-4>pc?AQg!>5Zfkb\'Rm&7f\^5g/VuD0rWlg[Y!NQ'"np)&7*mhP)Vk;[>Zl1^JGp2DQ'cclgs+rgp%?8F@Bo %G?91umH5lae;f=))RYTG9^36+>LjCbT1A0`]X^(\=2*#[pD*UuU(>+@h:Dm9"scO=BfHid%V&%R"5C8;@:V^P('XM=5I2n"M>#[= %VDBQnI(+t`KZ3MV>uk[XDX=/+Sc.o6[p.h^iTsEY4i9"UCgXfq%:r]G3/Zu@E/A0NDgh4']>>sh %%VP)E.;>d/,![anfZ<2?,`m;W\L2C8YEQE#@4%gJp8af=Z_$1Ckg7I90[Xa\ORP5]`7(U][3!RMs2V2b#*5fqJj^"Fac1c7^,:'%G@=WlMq>!?HAsF;U %o4*SYp/n[W0W5TqQfAcbO`*KP:ehg8);!`;X&?eiaoZ0W7Tnp\b:%^8__TC6AQVFTkmYa['&.^o'H*364,pJ'14U:/;9#&5).ch\ %EDYe)9j2gNZK5M8"b.OOX"0U9L.:+@[]*pLEnR`+'/>_YiRpaPD)'>n`=b %Y"Y#C_7^t7AV.uSCcS3W8l"u_-%?PS0AP,L\c^'l.fdZr>m3`C&Q>]!oHV'5KfGU=]EmY@M[XLhG#Ndu+q28;%kgSb %KuXG;YWYeq`-<\)0"5Pgm#%E9.i^XG((5gLE,bR=M"lV>H#p3Zg9teC;)a4VI+2,:&_TkM%$SO/Ntr^(k$=+EN68n%!g#:"+(a`IO:fMDk0H^iae2\JG'p?RWi[D=DPPb/dumT+ %+;.,>7e'^)^3/]*H5(jSdkd$!&kaL"'c'CmIjOPd!-q2aaCp#2N(>-MRbsnX=!0;f+7d^&F@AKM%+M2<@e8cP5Z=DR/[?u/h[t(u4UP(6([SZ? %4j]k8?%BbXrfE!V3;`MgKY?e,>gSAA"MQlD"N*PFkKD@,ddNX./['\0kC\@Q-Rs"9*ZqG4Ek\1^FURTeIVLqc`7XnkH]]&R8cB7AcDAd6Q&!#DPogQ\Ycl4btFEH=G7aj0XNQAr_nn+#[)6\*\6M2PhO)2'cKg.+29t[\&LF105q3bjXXNB %Zr]"jaB4'$.8%a?m)S\FJmGNHYmq_&HM.a45Zf!PX^iIH=>$e]qH1L*WOBo0`hiFEYRX?<.6'7h#HGbGJ1W/7!0Ie@3>@aGkGM5P %dPRsHMKRt[*ipRk>?FD@Wn`K!J%\(F=7n%3+D-248b5R2R]hP?qSHVOA6j<\Rg0:h:MCgVdjV:"3EG;f;6mA^?'bIDiVi/uB?10d %SEEa!HZDI"Mq0D5&#uO=nHmQ'T]64&U4UZ?N8Q %QX)6+P6^XF32@$j]*rO>5@4!Y3lnN+eEOVNK2Z-:bJG$7UXC>`DI9eXPae,-NcLo4,Z:do0qK(#OY)cbPV/0i4?fB2WXLbqg%iMV %cK)Hd>As7@Go,mocUtgqJm9BQYCLkTPQ.!QE,DL&=GSJ0SF.G+d3H\KbSJJS0RqF-N-;i+ES %m#(pJ3()tL&'g9J?JudbP)D*5dK0+9'g=kiHh[dsBm;Hu+(Q&6-> %N>NdR+Y\7SRe'r"[g>$'EXL#kmY9G.$HuU$Q)>";i-%jqC.We\/2U!IBODC@4*D5Tpdkm-i(=Jm?nVVi %Esi6_N"L/%F=Y_Rh<`;aW4H-.e%C;nJB*)_ %_3V^(ZV$3;k?i@Iq!1'u^9m6uX8PlHbr6hSUf?aUXV=m%)#t8`a+I+\qS?KBZ.:p!BNG$liMM8SRdhlAi1RkDn1b@8ZAp`L$A[#lP^ncu,-_o#f'hKFrrE+J-Tn-(\Y6Cpa %Tn0KJH^aR0%?-I0$D%]?@,&J&E&>N$7*.r)a8ug0)K;2/mo=&Z6@S,6Kq,`n9r+F^FGp$thD/bo'n`qn0]GO1!9,tJ"&cV\UK"?` %Yl0[Z[HJBQ/U)^.k`;[@S[udhA3O;_(9!Tl<8/*7+2ec+:7?9_dUh\ZjmuK]-j*3"U.f:69KFj$u_t""a7E=,+k[D$r-1j %;$7FtFZadS@s2e%"fg17II,:Gn6I&1h#^%.qR+$%(+A:rfD3oJ9OdK&atohCY,e@bjU$^=`V-<95ao4>FUO;W=5PY.r>@:CPHf?rl+@+kO[U1:Oi0*5Ps3Ms*t$Os6[#hmdL/2hu:HKJ+i@1_r(CN62m'to7oR.e^&a>fAG;SrjI7PrGR1H8q>gmDk$^o %0E0/nQ[a/XiW$V`s7on!p:l"P5Q9!rgL&jf^\IDIfI)7f>^X'UrTBBMBH]24q"t#-?7P1UA0JoVHMm^.%lU$Zof!sgN6>rHih6dg %f]qMq,^DhhZ>Fm#,S3+5%7JbN!mu!>X?Io1V-18/b8+,ALjhNQ*5pEX)h8a6WRKS6cG<;>Q&W;Q\1B[T]*cY`!6-*"R/hOk2_BBS %7-MH]of/*f#,%(f8'iLQd$\[hg-\nXDs(^P!!qhJca%"e,W\+=;NoG(V0qMd5KLW=`8(N6/N0RW*6aea5'T)dV:AF*cQKuEo'*gi %XDLDg4?T`176WaupJ&>?,/JiGShD`KKpK*^TMA@MdIuQm9[6e(-Gh[#-n%d!KAN`*Z@AN5M-"1-'67, %XNl/m0sT;]pbDn'FMHgS1e6j,8b*]jQ/3B9B4\g4_I8FjQT)NUk6"+*a7.q95DMXYW.8[9)a?o#%_m$rTeI0.]`R&>gEqc1:URdF %V[??s7+HoWUH@$JG8k=/S9N'*B6DcS.rZgdS:K,>o#ET]R=J^U0qD^t:#7QT_+;X`1(M@WF-^ %dd!FP;?.KF2\$\g66>?Kg:CV%(W>I/(Fok%K'4(LX1Ms?6QJ.:mHR%(ZB)9i??`W.01ShtIN,lBk?`?2kT]c]gKRkt>^"7kL %__i="e(@Z=oqg9DfnoWa]Ar"Of57L(qdNZ_WGpjuXF,_3"]RL%etWO8Z?p,a1XVb1%G]Bg9H)LX(Mb<5L<.q*\!uRl,MKHCanlAC %!S4R[M?_AI]i,5KT:Zo&#BAY?D6:>(LH:7)R,U68"C#$n-o(KSk;fj*c0P!",l++o!L00o:267*I?.mtcQ_3HNnD4a0nF2Uj'%OuJcak:c8HR(ek>nC7`">Bjp%@/n^LtZ1.\:p>p]E9O%D%?djQ"a\Z!.[p;ibjhH^+6K?gEY! %D9k:'p\F4"c[RoLds!>>]/`\%mdcOV!26tGAG?qclpMWMJKj&!LB.'E]a1T'L[#@Z6C0Id@/fsIfd&?97o6@?m"YCkUh5@[JkXDl %SN+d.\U$5XLHs-["4FYd;B$LG:?-Vt?EHjHR9#Q_"A_+Id!8edo"dVZ3$e(SCM7t]+AH"Qm5J9q9-b3Kog]I=6piX\r^ek>D2U;& %hknYl"`4utD5\<@-l%]geue\$GnLL1$:>^fFpMam),4fN[pIYrKrIF4[?t=i(R7F5^66`LDnTWQ7\VLTLjh?#1!.ss$1aDJ\4(CQ %`_IKH:YS<[?\`X-1WtKEDS&0BXi&\[.maut.Cm>'NSZA`'kHprV+TW$AVd8Y'UKr!%#A^jTK`q,kL1Gj"Qb3Tglbcl+c8PsWK1Me*"iS-q7*0XAZ %ml`^&Ao.)=,WX&3feHl=#E%BDGa=l"jrA''?T06ZdmXEtpMlr.'U40F\(rPjfB[C>:;q^nS8a$Am*W+"+Mj[dA %pdF&B*'+h7U,@!D2o4EeKI?`^8\):_?LP*bZ@LPTY;X!-Du?6c#X(8kU*K"71%9:/:^;Y=G!E9d.5%[DS07o8+ %XGA9X4X9BH$ll?@%VC,[-T;^K3Zt5Qc1f]n9":-jg"(9(!P]tcQGp;n\"T5GUp^2d'/o^QrfT=M+YXtrL_/)Q.9!^[\K8ghV4#?f1^arma""k%$W'*a7/Z/iFI)D16;l\2j6eDEp5]T?pJSCXG0^tbL45/h,Qf`Q[jj)09Lt?]j9uJ&*Q\ho-dUVF]hHHKq!Il-`a1M#Cu[*QDR;TAR6!X1"arT-t!4!?Oe`!kT-2T %E8'.B%MWopL\Na%L9ccgl9GQ(1fr!Z]SN&?$ULQn?eBYh?lt$Do]VUH#NA/\_S]*%:8I;qMg/h=gSLh)''DI/DZnIJI:)8k(Af>0 %WgVu*N`%,ABU_`pb.P@R]V1sse@"(Hl:`J[B:eJ%_)Rj.Je?1-n!\8;H6fi5jb@.tPGN %/a@20_/)/h$PB>ud8WZa,X6Fe2\")VA"`BQ"8iIHE9JGVpS#JN>mM/L_?'i\R/QG]r3-mffqM!h,gQ"sV2P %aD\C;B5%W,n$;L%(;F(jY4@85bpAC>R+K>7(afZ:\&k,W%O/3HAQ;".G*VgVC"Ad\K%'WD;?o$U6_8GYn8fjECr"PNQkGkHbD-OL %5Nj+Aao7K7WoXeF%_q'L,"Tph:'9_9Eg)Hlm8E]I[R@J[Q"BHFNjK38Nn2N/:3#TFFnL(mA,U@H7cPf'^"kE&MeV,%a("W,&k2@3 %+"O?a*C@QKM/\+_D5t'BRk*Pe747XdQUU5V-!d*]7"^nR;OIlqbV3/G9:Qf]8rEc(U4Y@#E^Fuk, %Ms?m6+k:/49'+cYN0o]V(jk2;JW3BHmGZVa/10iupu[)Y>?\rA'<9$qa4[J>W.L3:4*Uu^cGgWC%(+jPJ._5g/`9I`_3ru-M']f* %o%'JAihQFrG+oV\Rb+!JUc*gmrmSPe` %0nVi9#]RI"O1c0#G0o[]@!_UEFJ;GpLT8IIGlK4?A*]!^j9.H4YseogJ%"R6>t50f^[$P..*8"7Z"]0BZu=>( %%@?r\)PJVALmIN$g*Hg028f06`VEne&8s$I;0G9H68\bRa]--1)A$'/>UE#iB#26!8nUF26$h^.$+)H*q%UGWNnab4[^fhc46Y&mI;2Lkb[UI? %>lGb87m6`>*1?49j7@!T_@T1-X,"m6BKK`9hKeIiLlJK1:!sHk>nJ^O=6:3oFQ2-"Ln.'sQm$=%#`N\-&^e*_nVJ$$!*D86iUM<%$f758c*Si[&1"5'%(X3TJfK4Xa/0UN=JMY[+P^n%r]aNL%QL@`"NBWZWIhn[?q5p)41SF@LE"O"`DJMe<'B %h()JenOb1S-?BghMDj#B,K-^,i,:0&\WL%baD,s7"H7U0BBD(jJo;9Ha6p%/AI-MG+L`I,IEKG+W(sas.Ze=;M]?a^2TZ8rP"s1u %;MXEl.^24+lmOR4`$&oEWeqoLn60W2O2C>*k5-5.R-;1[5f`MdMUc_7m\(-50eYNFK2Wb/Xh)jg<*9))Vd-#\Sb.YajS%)4- %RHBq;U$jpCTilF-ZlIM8'Of6jcHr'/QdGlS+1Su$*MmV6&gU]F&u?3UF&4t]jbhUB>h+9Lnm)7?pX"hJ:ZHEeSA&S"#fXF_JBUV]PS"T"OKTh!1%80)NA`q+C9.>Vl(0Bk7TC+.!&QEA?D%4ZDU^d=r_7FZ!3m@ %=^e*3^-r1k7?-frqeS.27TbC.@,X(<`,`..Ua9qR7UV!Vp9qP=LLUuX;4fTl>'3(Z$Z(i\lES8i0sOB67uQ\Gr*I-MXW[N[:_c/G %'V].AOND4oW^5hVAF#3$'Gplmmd;[6f0/pBs;Ot7>`M[.U<\&)1] %5Z/$!CVOL!2UM.qd)JY#N*`&F@qXAh_,?u7F$+ekO9N'N#D>"0/&V]4E@bsC9nn!:&]KDD)`llRrI0p"@lQ@eAJt[`$f[#H`Za>j %=;$6G`:R4e(*^&+NXlSWFtCuWD8&-0?.X]H;"/!FfUDB+9el4)@'2^PRqA-D87(j<03U+2.I-G)q3ag;g3q/)A$t*-N=pn\$4L^NCc)-Z? %3*hb!H;pu_V[rnIdehH6S9(\4^1lfhg-hb%&!&jH/bFgp,Hp$DWtQYNpbAeU7dR3>J*MPb8rLiLGj7g+5egSO2Q/N.-1K,9(h=0@ %2^c84nW8q$iPk<9#6VsSeXZ5>J@Y'j3IXX9C.J?$)pG0Ae@rJq(7dc-C %hP4q3N"Kl<%m?J_+L[QqL^n*+;KVIWa^QdaifZL94N>6"aZt)s/J5aB/]G.OYPZ%Ir08_/0&N&HBE?9ekhOKr@'@t<#[OA6Eb/!In"jD)Z8b*USTTHC_Hb+d;FhlWoOsZ<(rs3s# %b8l*637^C#=^qu>fHmWM?'Q%Pq_`.dYnQes9.M,#a#uNFZ2u %,Ee>l"W%8./\P(Lb/&I0EUk\"*EKa2+V1B.i-u%"T,Q/[OXh5W]'ln.H+q0UXN.aun.DEb, %]W\Vj,UY@h=',CO*[rOSU %5\6!k1'grrUs\;8=G]j,Gs)/Fj%'k7^t`*tR\a*e+sNt3`-2SI:aOZNme[N<5c*2VFr]eu %//"R#lR[5re.dhIY'=]m?W)PAGp)3`cMkR_!1&5rHV$]51@[jC>mgFIG1 %;O]sqpTq!_;KQ-t\o&r[XRA.uaB.oS06T(2WMC#Klm)Ig'1[<;aIB/-"k::S(LGlO".VZ9CrZ%gs0CP+=A_I*L*kb6'T;K:=J]g; %U(MJK!KW`K/k,')f^T0#/'Y.?P)`gQWh-:?Kf0[8K?+!Sdk42gQ,I3Vi"f6&Q(%P-Y`HTN2a2H,FDH%^XZbt[SA[P@)PpY&I3e9P %0GDoSkiJa#9C#B:ZhG>?=Wg5.mLe<\pP>ZlYP\=C,;g^u!E("U83]OL,@k/2Jj9aDDb``n&RbnggS*tUCO.DtL/u?-V_a1U!Jj;Y %3"RWD*DE/nR[2/o\*8b4hQlP%JLYAp0PF6E;(&1uK1H\GiMSS9I%!h4m8aF %2\?qkUnq#q,8Nh!7!srWSe8t]L%$s8lqQEGWIXgeH*q"F+B)TZW"CB,.-4Ge)ItC)$3]*(S(KCb$CUprP>(/kqfgpe_!rh.r>#TN %I(21(POc&\DZ&?E3UQRF'kP;maSQD&6$Mj!PZn=\_<\l'0p.PY+).o/3_8*>@5r1(i6'mE[3X)[n7b*9)DK+Z3oQbsP[ImD#>N.= %Kt$,*;`J4%%*L-Qda$N#]SgYmtC@=>H61I0sP'b[itD?2[@$J>D3UK/o6!-op*G4@H"Fgl_j#>V\)PQLq^:Ajb8:.jC)O %MB)XrN<6=OaV6Dp!Xn(NT-l87gRpaESl^1ad*\iQD+gZrc`&:9^Lc1SOjGh"kFOc@4;Q6=TB)"q'CT#Mj+#mgf\;:I$/jP]Sen8u %\++5-RU/tk_dnTfO;[2!QA6\p#@sa"m^=8.O9(a<5%!sZ_%(d]U=T4!Ia>647-mf%for_lIb!o%k?>r]ZWs*Q'k9c\3^I;cCfrOb %Xh6WtVef;%0[AHH^U\Bdd:8L>l\^s;<]nH\5jF6/12s1p\.>R(!8_KP\D?+)Gm#$uSX.d0hRsAk][Q6r:q(UJIZc5aqW0GG/l_7r %*:"Hbng!*djE>2+4lZ3k/mGhIc3Q_k,'k2j %(u^mnc4]6UMY6\C12:;63J;s%(:%rE=KS0W*;B6GV]4#7"O+:ha:O^$.F8J?=p9t!O!Q>p;OUfo\C\rIWC17N`99I*(j-Jqkk*C2 %rk5H`F1F4'1]AY&WKN`4$qZBjnId(kcEC&Bis?=kePnJ6dFL7=IUVi*;T.kjWa'EG;?qOIY:uR+A)X;t17mkL,@DiYVB?[GO*Ji" %5a^E[TQ$Rb@tq=aobeAC/Tq!4@(C&O:F>]^^+oT>4b>ddM&J/0%p,MV@)r3C?]C`r%h*,Rop)^tcN2[8"]V4fMGI,&WeGI`7-Qg,K_DBQM1/\:nYS7t@d53'qWaL3Zt4p!>k/aEL6"2< %.noe[7]%4MRcBnuJuRdCAooE+&i$8a#]2sNn%==PRB>@NAR)-N@8hun+bk9XI"rKASqo7s$2JFPX)2PcL]Ohns!1`]5mAs((?uXa %8/Z[<6Iq,HP'JW!S:/`-Dq[Pq^PRVfZ[cMWcFcb[jq],81Q[mhORC8n<,gF^4!fNm%7',6h.%]JYd=_-VF;9Gu>Knn^,S %?+_U64AAQrfF%nr8Zmd?:Z"4d/shO.h>f#YQLRNd;T5)WRM#HuAFXKTj;-\bZ'>eRf04[&9n-W7AJMJc?-hd/[ %.Q-<(^NI`;TgUrVfm#f3P+:e"F0M7K[14UA<=qi03m$6*Uu.We=M65[M;TR'm_Z`%o?Q"gU$1C%BEEN->8'u_hH#=68prXs(7glD %,a9,V;<7'eE#llM"[2ng#V@W+B>;V!Ts-PT-8*Qroh[%Vap#hAC0h)2-;#QJ;/mYQgtB*9"2WP0Q:%eiTHhG&Q3,TjpbpZ6TUbP=M\_0k-XKCC\/7+E:Lt(kbNh!6qP)"jo %#+C]+]R<'B9ZilO"n:_DAoR.!4(d %S1]X0Te=YP'H#&C.!^<;?0D^d,`=*pmdiK>o&-]Gf@na%7@eTj&qgE#Do+D/K(KgRc^RIF!o1"1O)/ZqQqLrj3S"K0Cn_]mfsUmm %8\Efc#Je7>MO4'q>:8rJh?.lH"kY*\chkqXIN5Uk98$%V>(FaFhK#+e20t=DkSkas?-ml%VCSWlbM\f;Mi7?u[NIcK04XiVHKW2I %#kB,HT%PihaKYHY&mHV&$E6eqLp7#\'H3luY=E]X.$(2EG-!>P2YDFM+Kmb*@te^qMHgY`\ncrB^`N[2!iScFYV?3c.ZEDKcf![. %WKi=1C,rBAaOtlH6eU5+hDP3u]G.]=(i5*3'$N[`9E]\L:>*VD3g"Z68e$&j.L_k7f)I6'=b=DUWHf$=1]Ys)3%dMR_chNW6J+7( %4a/pu&&71%>4s!PfF8!@3Z8oN1tg?XnXU49MGL]/,(@k"1<'T`8>NsfI/`d=VF.(c+UPk<:P$*Y(#dgVU5>s+JjY??YRLpu6u0#S %@6VH_L+:_CD&pT2r?RfalAA.Yd0ob8kS9CXjS2kK@ltfpO_E#pO(!X^ofcB;"je0$2BVR3]#TO6BS-b?/0G5RZOMi<=fEL- %";M5fa=\c,>5pc`F5U%EM!&`PL(i$%>O[HCUo),o?#$F=O6J!if8kE7`bTS9B4(s;j-A*%4#l@MagQEeXl?iLL.rbpae#,3p\j>F %h5)=@W5*CP'leu)mYIO^'eukGjhqE!CZMY:V,5aB/_r%M:;C@XT2."UjU>-cne$WiH)%uJ/H@R@IZdBWUT#s>dVNqcQu6oMh7mLT9WjA6gTB*F>ha$u_1"A?Qf1T,&GR$%%Yt.R %[4@a9D5^]GU^hR-b7^i:Iku(pAG8q@O]K1bljS\E$&'7YNSd5aS'3/F#b6]&=S)Ci5%8'(ggVc\G)3fPGptP6iNO_38p$-t?YpZ2 %:66b2m@<-q+9q^;Pd+e@:l/NfNGT?POAJ.YD'W0=l[O?[EXHj0Cm)[F_d^_>^VqL4WY5LZoAIl$j/gF[S!Zmjm)XGib5A_crZmo" %7qYd'Z_ZeM&_]%Eqdj.RnI]_:H\m-TqE8J]5W[V-A<8Z@c\o1FBSLC'LH=&i-N?'eYB]r78g!E"6)uPsT-V0^i$`k?a^d1-s$/]# %<\1rF4jE-Lld'8bXZTT6h=rS+TphJ9'fR7QeM88CAMMlr5k"Yd""\sd*il9e*%MrIK*,dYDEj"&n=NI(+q/l%0AM %]OHS9,a*jiR"'S@M=dkbct>i`PcJSUfkBuUQ;eb_KcNFHNg>&4:BTY9DF(-_MTo1J>s)#X@k-X8WR;=#nZH,i1\LS"V:*=="rU(=[8s+gLO^KLCMfL6VUm6iWRs-"s]o_H)HR&<$F:r81<,aQm+=i_AP@"8",/!Uj\k,sYRr/%0%qsJn1 %Oi%C/@haeOU5A=j*N8F*q!l\=UgQ)G@Qgm"ZMVFeQ65J$-;O1o2_F:k)%kVP5>PXX]O.5XWuc=O-sFj#M7Uc:JZeg81m3#`I]rk9 %;HB]Qpu/>7Is%Fa=V`[d*JBF\Qf%@hNFDdgg])K#fSWdLG:BGb[+kPIB2f$i9=Ka3o*e_:o/)rC!)U//fDMPl0^"6Y>25^=@fbZLgF=\,s.s3M<:M:eNm8-:Fd2)%sB3&r%WmA(N8\a9WR.mUl!hM[cn!3MDOEHQ@3CEH\ %%DgZFIK8]j:RQ[_OgQturdKRrf`N55$pm91A*3feFj0N#2tAqr6!+o;_*^BAp?T`c4`#tqI`Z\b6kW5P)S8n3ekdQQ&k76%s01?4 %n2LB2YMLEfY=7NBn*\!co<^D*q/6KKS0P5N0iU6<`^B@12X1*@5c@+,gFt`.PKf75`^d<5*6A"sQ(.OHBRbF:hM:JtB"#r7lu8e+ %ba'+84\WATVdV)#MV/(k61AhC,Dp(P_e\t5lP0FMF+rH4I9h4`)r=&/e[j`"U<`]uc%Q %&"9KPr>ZX,UDY:J&(,SGck_trkXKXVKVBi^FCsKG8&RU&MN&&!d/s"33NdiO1If7TYh'*5.!AiR@A`!F4JWbmP[aho(gWY&dI@c1 %[*>CQ4r6bF5fD@eWhB*M48a0S8VDUE`\8qNnB5g"r8UQJ0BVlF-b^SDYJr_j9@XWHE%.E>.BHRlFAjqMIB%m3QL;G/b6\/pKI45l %?.D^g&oR_n=o-tSME)qq`7rd*]tt^NJ)J&<%UOt7hS,t20SSe!SD&7t6ati8K&aMKQCkoQh9N;X%*.e2_S1QYm/"++:t<*&D?N4+d-hL:nS:&u&$X!k$S06gI:8?mp;4'ZdE$mCX;iZ6 %pQo9l`YRh-4c4IU9E24Mu+2Z=4nU0Pm[6:^"[^lX)!7>Q;\'^KdY>Qh8J_s*CHSi8T6>_7d*@n\*bZ %Bco0Z'28D\4--hLP^hcEs&)1.'dMS!UrGS"]hnK'Pk=D8m@E3h;gaYAq]1d24s??;\Dd%H'6=r?ZuEE[%a+gpVF>goWJ'3s8?lV %[t"(OO$C^1Z_9CmY/;p6Gie@k--471?eG+V=7*cN_Y%8]>@u`XJ,D17B+Qs?[k&:%'X&qC@-4A2$Lc3FT45&9_.uh)4<8[a$q_:o %,@?Sm6q98NBK].W>C?4'?91YRPU^K\B'`BLjqLh^HKd58lBt4-G-7[&I[?!QL0Na#5;^iP0i\TuFWuD5e<\&$9O:&O0-+2JV[)A3 %(kGi;UN@\d_0mt-JM)R7]%=p09EKJP=nh0gK@9i(#*[>'*;f^nXHs+c&YEn %o]TReZdAm:"06B/bE]hTdOVn/0))L[8Lp2A$iZZHU%Z1 %]$t:WUJ[f]AR(+/lAGO/jP1$bRKn+>!G*Zk<7ZOn*l=+gn,"nAM#cQa4;T&fbAoaZF,UM9JihKJi5--9=^E.fAa[?d-tm(CR&)$Y"XaT)``A5` %9:kSJ!h"&PE3K&$`t]o]cd4J&AQSJP2MLM8)Th2!0C*qIa<4nA?Ylp1Ld*]r:VqU)5ZD`NMer4=hZI^bPi*]Z>/jsMp6Y*=J@nPF %_6\D=qk#'Z1agA/rINVfM3G8W,[2OD:&:ADfE'/c+ss$77gcAB;`-+TU9TL9oqcP0j1TjP&&e@DgWak-6f2s%$%V)#A$i'>%QJJn %E3khp["(/DDME%+C&-/b&;Qb0%r'`p=D_i_ltG\GPC#IY=Bl'_Cj9c^1r9!Wh^;/!%SWWbW=EG'#LeQ=tCE?@)R8TPdW;ik5Ok %T:'sdH#)!%H>bC@bT`B$VZiL._(-(9T096RqHL_&JBjs>,_caS$6XiR/\RH'k"1/#,":]#d1Gaje(dBOEL)Fur1mQV:4^lsW0d;W %f#tRffao%%`ZSijZs9;_>YC?^O]UUR"7_?JTkJ*FR??aoBrJ@.n[KGo-XMV\FaVR;Mp";u[4">M/BdlJJWbf+a+krrI`c9j@aG7H %_i"(#>(ErLL1TT8@L]XkhJ)_G:iMah/^+\sMU-5mFV3_H0asl0[Z&8Ra1e'1cL%8:45niMAY@q!"]E2C&ZR+TNF2c,^gg6e1HkrN?9'DJ/[s(1o7-qk``'8[^"!$!;MZk2pX_s9V\=2Wg,4aekQ?:U$k9tMOR %.dH%eB9WcS;n+#4,7fo#p=0:&Z(X!!4Oq6e(T=77?42Sa3>A"_,e!$e`JG:6[,p%D0)8>+9&.HSZuX:?.]B"XJshJ_D,?r(dLi+$ %)8E[-Jmk*O&#Hu_=3HM/=>f?afUmK8XRD;4QVO?e#-b@X/'eV?Tm,AS1b,)&/mjEfN$K+QYfhJgpDaF16BoC4^keITO84Itq4Hs,1Iba%RIYaW_YAI'LtR8+)SPJg"E %%sDLpRRef*.$-+PbfFiG7Js4)Z.BK(ggn2lJ1qNF0k_:\I\/sPm0MOijAO6>G8h^HV2i,+ktId[_"r[#5XLN\Q#*$%FqFj\Am:4'QMk_YP2l<5@SB^n?;6IcrJ!q,u=[aDF-:K_&X[2Q[7L*=*>;I!.2?VjrYJPg;CjK\,l!-MSq0)[Gd;9;)96+\cER7 %@EH8Y+i.<,g"V7bgdn>+j<==&*3:HPE8]YK]`HO$h$tp#eRBfjpo2KFQ=]([pnVJkVqF%i[Nb+al92^TUoh)fQ0?9QDf7UEV5H!-I+8 %jmhS),G&J"3Kd\?3$%<]&T"gsNUEYuL\Wr\6UH%ree+e2mSU\n,g*Kk'g"\.Y7'Lo]C#F>=tM*W!mU/+R*,Ok(kmi1nA&ugUAXPdm>UPB8r+PH0id]Q>#5uo$G6GX<`nY=Sl7#:hm_Qn`.:I;Z\`rg&4],_=kr6(>O0"a %0;rAR]WSZa"98VgP/.93a,Yl?FrO"-@'-YW8p&0ehmE7*!rY'6@\*X[,&!<+acfQk`UP-aAW*"33fuN(S*L&T))9HJb/uhRCbY6ZW+Y`9);*+E%ak]M>s84#t0*Q#!]-#o=&M %\Z>kj25=RW,QNT1J6MkUT$>TTP4JqL4NWU2H^JlaW(doKA@d3mar"=FVkU.`;[Ai!^XKk#XT#rc[Y\^GflIs_6]tke`J07/.cbmYbbtJ+(H`fkYM2=kNfaSuN)0b*p9(nquO %A954`!V>6rBO>?u!Iknf(L@)t/s-E3Y'U>JeD+%ll%RdOgc'Z@K,k6hAd_-u&GIVt.75(q"COe5$m!_7UoJeM)>)YR5j`R62Qmoh %@XR'bpXQBbjYtf+U54b0>r=S-WI>_9U8@[+]mb6p4'Wu]gWF[S&crpT5]%ejYgrUAlV;nOZ-C4rPY;;_0eh'!^cHbi;etT)g'NJl %TF4edZc^GmIbWY^@OicfQfrT>VDP$!q,1OJ&"G'FeWir'!-`R"iUM9W(X7WJ#1:\TQLQ2HlQ@+2D`TVPJ^6gXUkImR:Y@h>B9!G7 %[YDd\eQ2I]I.a%$o*K_+7q0$"mb]ql^GF%O$,C@-N_4>]Oo"grR..MB%*'-q/t1OS:lbV=E/:_'SnA&EE<\A+/6? %lT23?_'d#[SDR:k9$3OZmb@0dEQqH[PjKkb/<+0f:,3\'GQ'T:_>JQQZbA5"pI:+iJud0cUQ %=fI=>4uO3uS)Vsll3a'Rrhi/UQ3PDCftfGUKGK\XDJJ@UDTI1*C?_,[e=`R9cR?1(nPZEklkG-KG/'4#1,Ud.c2*d!0kW2F(9#bL)::;\r %7lM=%'b+Apdj,F('+=^0Y&8P^0*W]3kYa)tB[PAWN&8*oCKXFHA.03r1R'J+O3qN8 %](BNi&=8LGCgf%_^+mkj%L3c/;3p=B1Rr`s__"JpPEaHgF,Lp./?C;Ik`l%926I?qQ^`Vl==>CiZ\1M5ZXsS7A]_R7!h!2HUt-AA?_;E](T"Y@si^>126@QRG8WAK/E?5,4@_\%XZ[#S7si$34+@BDlEU*aqNSUF_T6Xq]tpoHa`OeGT. %D-.W!UdX]KgHPIg?<,@.e+Gsc;<[jES2LeKAI_(1&P.6>V/K"fe9Xln7>^d>JpU_K9n2OB#LAQubH'.%Hn*5hO_(b#_%N9(e^rQW %Y=Ehm::]^"+dk]8ZD>MJ$ck*%\HQOJaDWW3eLE8?3d.g8_IC^24_kPs\V3([gUa9a(:R2X0.khV8mm@5>-5"\J=X6NGDeRd,50QA %d%(6'kTh=88Wg.+oth#35[RYi_*X=2'%\nHfGuaq&`:aoF4,H5RT^g;eV^%qNT"XKBWXPen693a4"eaI43tpIme$O@N!(s!FUgGb %Zem#K\XJ[CLk!>C@VW>A4(pB6KUp[Hm:[-C'Ihu=gq#6)JlKXGA4C"+,T<_nM"u)+6BVXHL9mc7.!Dg?o`aecirI*G:-=ZfXH0eJ %MS<_(Kn^W**UiT*ZM,l\4,,#b!PN[n"`9On<4cL>'p:`j&M(gAHQfA[%`)]HXHCX0=MuJ9`#;g5k)=*?fRp'4jK^7UQ?jEjHi]un %cU+jd0"DJn$rl"r87p[Gj9BeM=)iBX#u!6V6om/)P+P %b$a5;&<2#H(@SqgHH:alc"`%Mlo\JLJSkf!:a/H)Jtt`m?q+?KS#/+$.`N,82CZgI-V3es[YL-QkTZ,0Sd]BSGCd0Y>p)5tEGu]WNiR]Un?7i!^2djW]J2o(sRAEHE3nPu/WATP3"AQ-d9hXbC/d<4. %Q"X(IGVKWl.gW.O-Y&Li>d?15LZaoFlKG(%'lQ#%jJetQUMOI&UhO^mU1mDOrWidZ`#:jUr:$Z9.m9\cRU4I0/--Wbjlh:.bgMRb %0rh?'4aMObVdJH$N`'`8bnn"E4_i!*Rf4XX.Gu@D&n+m["HT!R!52Cccd):rhOW'T^6ur68h#%;.t"W1K*E_#.ljP80Pq*h?a>L\ %Nq8Vn/.QL<`.uupqJ\:5?Y0tKkOQ;?e6O'/A0P.3VuY*:,)b`G/!sG#/Z4se05#`Z;#:P\mFYa79=C?A:0fCO3t!LB1Z"<_'B.F\ %6;Jr)9P]YrX]H/RXIAa0T"?'4ks\rNCQ`A9$VT^dp,=dPak6P8laRcV9,&$@&U.J&VF7%3_Ql;uR2+L9qdS5rQ;=l$O?!EN;FWL,g2]"*LXHs4j- %ktF3`$)Y"BYO<-f"6F\?WUbJG!*mmg7o_g:QpeAF^Q=U@KsnR@fF\e$1=4=Z'kVW^(6G`=,`^/RJ_Y`#q6In3*>:3+\]n6R!1[gWA*S+46hU[&:7PAqAf0cj"mSW;o[K\0%8it-5 %getUkI*?Tu_#1PcKr(d_)j,=/k)4S(L)1cGO$R3OGPg/^r/!lL%M<tD#ET.Bs\Fu[,(XXhbX%sOD>'rWH)=]2ETb^0u[?!;e_ng"\o+_AXTViE:]&G0CtGWT%3ElsKn %hbH1O6HGlc;i6p7X\GmYlAA&sC[[h8[ToAWIAXEIbI(L!8*'lEGm677q#\WghuH61#rp2+XVL&g'VY;J@12+Pd`%Rm$MhN2fVl3a %CYbL#5,_P)ouT&OX?[:XrM9PLR:qT%HPF0!0M-RP-&Wh=i9kjEm54/\H5,"V]nSC'.uBk1Pjiqdr92_%<;3EEJ-oqM)T4K[g7$g]Cs+Lc`t@R/RX)7E(\F5$>X6aZ=`/FK]sZE16H^hbSep.?iKq1!TXV5"Ki$)s#M#W@A_rfB,Jh-LuW('ZGs1R8OeC]L-<,.&=i]?Ra4#fhL''MHL[ %PW's+'T'9);cZ-iP863q1b+TF#Z4CIROn`Oo?\rqB$O-Jr0l'NE`;H45*8[-m8D$=7R@+Zp5*D.dWJ$+i_u?SrEbjh'[9[XH>lEi %oR"^H\Xk+tPQXaY.:&<]m(*2Dl[c7!EP5[G4_q_4Z6a'XocBp9?.q$hS*aoMbb]Wh%RV'_=AA>IJLBA@>"Sm@[52C3]W4;?[=D>D %*.#:%96:UBN2Y;U'c$r[?s0D$B^.)<[UBiG?qHJ(elaiD$L03?@(qV_nNgW-H](Kq_.5Uq&sW85@FM %fHP!9ZXK-ed-,dPP1D\dTU!d.`b,XT48IBX+V`*pe2=\%n_L3TXfR1XOO@"fBPerKk4I$:OJ@DVd:l_-UW*b4=Njag^IFEA8FR\9 %P#2SnY3%8^7*B%2-cG.rm[r[+k2>M%Pjj*!`ska6LR_@R[5i;=*Nc"(!`A_\iM?EEk&ZJYjB,;[n.jO=qQh;Vt-J0i,@b)1iFglBd2!'q@Y6X)CD %67Q<".&t.NIN"ts".2`#]1)IVH:>V:MOq)NB"1EXdZW)uJrqMmlXESg@AJXH+'#ZNis3t\&aG9o7,&CcCN)-:&O_:@+.-1t1hkC9 %CpH/Vk5G?n'r(q(NXJZ)5U%+n/eo'6\WLii6+&oa/Had=f#@b@JQ0E,qMd+4.7Kp_RdarEJQ_EV3fS7j4kq]]:Y$\J^=g;-ONu2Bi@sD/ZNZU-,-R5/Ee@k9BGAlHACWnim:q.UE%(d3=Rk3 %j!1t%M$RJPA(P'l&7VfO)Ff@mM1LFgZrl4FU*(H"RrhEu-.Tn#pZT#hY$u,[)WjE)XTclf5'OSd+4N.\=em@@=O=u9=Z#jSM@s3ZK2sE>G(c/pGuFfD\A:M18OYX2]J5/( %Ap3FP.ZJsnXLZIjZ%B$?%s`*U)Bqc$$8U?h!JXMK6sp=p6SauR22EsqMFqJdb:GZ0CqM],7n^qbSV:-]F]uj?/]cg29:;A&Y`O'@ %s-q4\_j`nm`B[UX37";%P+ffiqN?Ve92]jB+@Wm&$7rP#-8>WR/)oj&J0m@J_)pj"``m$n^m7""\*Q*!;UJ]f1>OT];U.q&d\uFQ %A`\$)/^,\6.lPJTKm*)"!#=0)Uls78)QX6*5Xg]L!Xk^MkUfOq1WsUA!caG-4D4&4o'\.2r!9=$gKU1/6-&embmOpF-)fL[3*aRg %j#BST2ToC-9h@pJc#O'cr7 %=71>62$Ur(g4DT'k0gC0B7QVD3e(q2h[27HqI%$4J;mR+H;=ZMbkkS9'k=qoetWK4f\[_cTnS,i/L+07.LO\2%'$0&WWEX_aipo0 %.#/Fo@2pl:I[e868)1=@*B;7YId4Y!:3p# %@])\+U;6gH)p#T#J0d$F,>kPX!SU+:%3C`c1(ET)7)%P_VM#_9!kHq9?Qujj(!SHrbk;M](NK^K!DQnRRS+K/,s"P.^MS[/n7iW_ %biW4eRq@&7gbKDcgG#jg-IKIeYD-$aT4mJb.F07J+Y]lVRpurIXm$3@!]] %.5Een*@#(-h2[U?9C&.90q`W-r+pGO&;;e6bX[b9(?m#eJTG'pIq4OCj'&>3CuJ6^Z]1,0$YmHiM&a_"k)EVeO"R!L(!=\@]^O8`JU!TY3XZe8Zk=u8RlLn %i7V6kJ[pJqG,/f8mn)#A;j0&Y+P?oJAXX^I*#6aJisfh0C;ijQTQt?r94mDi`H7$8NiXd8Y6;:'fu]!'5S>S\]e75E[X&bWRZW_q %3MnY^59%X%FHseu]3SG.+T5L"H\TpDAl0%?2WA1)gJHiS3R#*!b-J5Y`0@hi0B]JB87H3PV5bTJe^h`>3&#mMD`M<"B1%G!@aVST %DMedVTJb1SEa=C1QOa=1dTHFbTh7T-KBS@`FD?Et7A^`_.H,l6p_WW!a>2B]au&QfL" %&MA`nknd"U(g*cQTZAe.'N\65,-\Q;:(*e15[88gHNoB\$1j2`i[/VJS8Y+G!2%K&=JLUJ!-./),DQMO0$UH9OTcssW:*k` %!ODM"@n`Wr5^$jg0/$pq(cakVM84gt^Q;0Fh?tH8e='=tB+7lf9T,^,ZM"tB'(C!#1Pb&F*L!b4ho=2!S6T]Jt;D*^*Z/"I_I2@!Xm+H_%bA>UjF-P@\6J(4pZ`)mA20o6lZ;QBX)en%s9jE5oJ5h6M"[W--KA)ki>\''.ONN?r:9d*WOt+eL&e\lPJo %cENh/RMc,As%@n/P"um,&PU*`0&>hKoG:,H?%s-Y^?_r2phF)Y]mALL8YrqAX=C;-l!9O"SHSi+Ukq[a@]hTE;HPoN\(7V#o>7e( %X]GT!i;O@%>#aI?"VOn0h3HU1X;\rp@=p-IZUXTi+V%sZ0rJoJ!RuA&9.po'qqKW:;?;]8L^s:\f9aUR?HE7A^k7>XC[D!al$U'F %V4q_#;+qYhKDDeh[EN)^rJlu:Al6s3m%21jP!cN12r;D/\WQ.`(5qY`0^3X*$La %!!.5$Mt"R$n-_Hh(mMNV?'H:!7\#05Z6eXc3WsY@B=sYD+ILC>'i_g,M8dR`=m'Ig>r7uNS0Tr/#^0*^0t#R%%a+i@KfNo6OCB)N %.kW@8]bkB'/A`%A'!gqoAn]iQH&""a:hJ;F6&UKQoTm/pW;39a/[8`O)GdtD`M)VL %'t%V(/cbjbg4:KmG#&6AlgpDQXb,iPOj$*'-,i_Ke-XHt!d3$Y&.a&HB8t.B\\$K>\DGjo0(uA[(79oeTunk:>CkL4\nK<&$J.FV %a+U^Q3.A026$#IcI'(I47&`.FcpgJdDl]ZgP?3X:VA)tl2!M2o/JYMVIqNb'&0'Df1Upok1bj1u'o6o>M53%VBCaFGE^e6u-t9^k %oc)h70sOD,T<K6]L,0T]*<9%C%E^`7%pVC6R&>&XTjX^)N/amHUV9(Qb5CUA7X %\Y.b%W8Pk9DJ.j0Y<*-)%AOtQk+'D,UG07LlAGE\=6%Ke;SaX]V._Q:f+"AYdgLPK+FqN!(%4mskEIRI-Q"$Np`m=gIN9`#W\!FBER#dq#_Rc]D&hoR[717f2eXCq?BuR[#"nR._lt^sEYk61CJpGsQcCJN*E>H%2bY88c)ZRi'OMSdC3Xb!O %O@.`:#G1DQQZa332NhgD-F(^7F/KLGE<\hD:6eTg4"i[__G$t'11*[eM(J^#=ES6W-d\)'(2t%e!(s95l2H6a?ZY/*Hsn=ab)9"W#c:"F/#Tu/.*3:n)h:%E*V$P=QN!m/3;Pu<:O0hnS;Gj4,d1Tdb_^>=%CY#aQ1k?I,RaS>(M@mc4Y#! %APnVc-5V]XoRoYUU0P_04fNC)h@:C*KgQ(rRd>`^7Oi5>8A]X\!L(C;h]_fn6ocE1T9HR=(rJA;^0J`C$?<0XUVU][%+uNQao/pS<=+b/8`skPZiXh.ouFq-.WGh%S-`L=hWf5V&cmgKl('GBOI;Pb/*@ZM=@mU.qfU2LhS`h0"OH. %h#eQGGj10B!@M17)ClGnS.[T@lhuns,.),o%Yh8%Lc-n%OrN_T1JIiXVCrkG8RpDbTWU#6%+R:=rR)K$>o-a75 %[b"V^OR"@C"u$tJUoRqT*'$C"jJ:W8_Hm9kWs]ZAXVg?!^9X9:<`9;m'kOBUR.FoFNiWMpG:#&LM&MaNp6dV;dEHT,[]"-!Pk)K@ %I%bTql&Ga+SP0bF3CA>:8(=j)4A0)9mElh)AjtdXcF'pX@^.*/ %Xl`Y@rAj'eED0oB>TL[RDd7:VC07mU6o#)LSf`L1#8?Rl4duFk9Oq\`Z+ZD/-0.&^aGEpR!qp14q]qa$bm6QNhL@ENJZ$LZ.gj7o\S(k %ab80'NT&)sD-Uf\.Qc;fk4LF,$ZX/,k\7?smZU:`CqVT.sqQidOMeM_N;CmZnZdQpL$ %X\.D@!]N'*b>*TtIks/>EQQGP#BT#UW*4c9V#Um]2G(nP]Ja;aU>2OkKN+ju/hT#3Kh37LN=e.%QHshk@r,\7,K_qR.SD.L&mpPrY,7CWP*VEmc3c.hCNt?q]Z;4'=I'<$7\N5`%t=R*93K`-D>!AbILpgRr+RF='GX^N9Lm!6]rJ<%b,DUtt/YRQ*Rm %cmHr2W%`k(lX#N?m$?;PYnnW9nkjpXB.PBERp$ZkeUYWD#>`KRZ44WRhQ^*][gNYPJd.E$91^?L907+@RKr[]A0jpI8Carp`B1=L %A33$ZeAK:_ZeiQNb42Q89L",lEfe-U:p*/*5uAFIRHC+i4DXR&Pql'.C,:Hb1:D/X6bPL[s4qWPWnl8`Zi#Fl3lFu+WlUs>iI]T1 %V?hnCgn]P'N?u\c\pM*U\R-o2cGFAT9&ZH-+#I6s<%NIM_GRTA1`]4Dl.&W!+p+=7=9J^#]'ttARAVKK2(?j^o(K*Znd.Z9n0(p_$ZLh %A5qA??Vs(iZ#L\N2M9Y^.tKR\W:63qb"A>?`mRV%c$J[&X*R./W3s7;JXZRl%Wnn''DV6DeM2XJ:/Ob"-H9WMWE1lm%M]BmlRG0* %:91k&mt@PkRTe)/JI3ob4Z?:(61%dkJ$fAS@c@GcGZ]/@n`8nSoqH2,-5BV27EcagA9L[G1r#1`%%9@\6*?l+4A@/,T>]]f[3"ZE %L3\S=)5gl'^(scT2&=@E+M=@IfQ7d*Erg?ZL8\Jq*M/IN\#<)%#d,uD!us-q^G;tJ+=5>[KBe#tWh@3#HoOt_jW516GQkUcA6lF^ %((Bk*p%4"D6/6Ya9'!7C:^W`?2"-GUC8RMM&CLE*L'ejOPVtnB7bMJAK4@Ah^!`(_RiYTVeS?_*X?kIk1(o5:c&qkpA>^%qDm7Zr %L?b\5Zs0!mLZi$@TXb?$kJ8@T3a+0NFecd9&f0&fGT3=>MCFa%>CA(`JG<'NASUf`O^]1b$etb(erGVlS@M0bbpCcBeV\mo'I/X' %^)a+Z!Y`T]FX\i(&SLV[VkDV5\g"6Xaj`55PuPT2c59OJVX%L%.QjP99qL^eRcFn8V"m>nX*Dn14-%N@7ku]3YNZu``@6G.##+SO %Co)_s;&V:]8QW@>Q_-D+Yo$GS_:1TdI!_Q4'39HQSqrOF3d7kh02qJ/'R8t0@+Q%m(Y-lqY[&bUV:nb^CuKlo*sJ<=a7#<_DlA3E %ObQ4,3N7cm#un9`(;e^qjMA]rKm%1=,ni6_J1[r?CKVSal4\fU;87$h2k>ZVkk7a7!_,mMZPmV''il5tlW.aDTOYTQj %e4@[._GO"f^?puK@^0uN6.@S[?!4Ep_hq;D-(+@`mpuh;Denj=1mPB3Xge'+]8)o^%9"'^Oq]uZ![mTH09WYiRP^^$"R)R<#&*Of %ZaWI#e47@i^Cbu3=aB_Q=A!`:p2*Z/8-.g5P"7YC8iD_]OdiERMjU0;>R\eb3%#$c"]3.3JN]lH"=!7E)F0JE(,X`LOI2^SB*gEq %Mf>Fqqic`2%-BJQ0^'30i@LFe/C'1XPsFT8bH*mQXU6rr#.XH!C."Ec@3hA=BJX[kki2X^]=DSlIDDgn"=hug\GrpE!>J%t[eJ?a %`OchWNuH)DmMc5p&s8ik$u8%#cXHOCCg)"/TXFnWY2'Fq_PjP=s$WKIYf/p3pa/oB>b#,Ge:SEc>9"qq*/*"\BH8feHX.V2l)N9l %Ya-l8^^&XIBK?8*FrF([*(L8K&N=SW-^Z0gdB0d@moCeJd_'H1W"H)$7gu[6oQ"bL949=Xt/=sfX-?.C-A(NWsQC*MPrlGM5 %bF%7)?6XQe:tZW.T:J/C;F2;\"SAtc1a`O2e1*kjiu4TCXnG7HQ'E`'l;>U1jD#OJU:H0f[\2NP1*,,DHUpCDf:(X3?;\WjAX^(; %LI`DC9"YBIJ;=:P>B/E-bgD1'P9!a#Le2k*Eh^/Qj!/:knL=79-o@j@i`T4NZ]QKS1UthT$.W7/%T(CX]H4Q %3UM3$9V.[I1tMo2o#OQ6e8OWn8,'O8OuR+H7m^[W"`6u?W$\g:OFq/m#U9teJe"WYhp\o.:GpBY/[-4;_D*E]RZOk=/Om(BP0aR. %#W5m-*VYJl5!;EFT_h'C=D;NN=,Ud]=[58A3E79WRZh#OVW]'^YaA6R/;6"S*_9rHlsbo(*#cBbM`_VD6'RqOu:W52AZ(J3<.Yu9D8m5^l]:11q28X,NC=Za&lkh*H&Kj+'j*u'luo`'l'TD$Q8-nDWCS@YXAN*cdR%?`+J.BVn#AC25#h?l/!_ef'Ymlm@9%;%`g6] %<\mmV0F5IC:,jOo)D$Ymr7J)8,2 %Y&odAr/Q=m5dgSt'2+1L])WJcBel&fEK5K:%H4NqqS]Cr!)Vm$1IO/@GuS8XZ99+pQ9TT`&,O-PD6_9-)f4*N,-IW$)EF1eY&KVU %`?&_OO8*P=KE3ErFL08aq6=*OH:O!!<+H^oOOGQX$t^Z:3'*6+(*OJ)[2#".$F'B+Qjkk2LZkh.YqgoZb %UQN89a[iLbUOC7,PXGeDTX$p7-TW$,fBA:VmrOI>SL0`Y6IlXGKMc>ca<#Ad<>PJdB+qGE1 %?6bd#5j)C]P:"`$a))*fn`2[aHhasXnXua?Mrp=SLW;R5sbN?M42h1c"iGZJUp/1Y7 %YHQ89\9iAunrqOXL\&,n#!Y*Iio597htt=ap$($&fd=I`1i8g)]fPHV&AG,.r,_h[T.BR,->rg*o3_M\D9aX-a%t*^&iD.^5ubd* %'XllRjV0lr@1TMF/c8g!#N/Y)F`$s7,PWfjAcSg%4oSC5rj778BK\c!CK:WON+Bb#%OM.">/0rVm:>bRaOS,;3]II7=uK`_fn>+l %Y9hN\>14SBdcP2J89YZfHWnAXN$R4dU$V,G(r[C29"2UTAgq.0lc!ojk9lcQSjg?3o=7.u.@on&T!Y668=:RsL!qh]fq$Dq*keNE %E\QOLW.]-mqp:.k-Dhhe4b@Jk^RGe#6;gZ4*&k&tAF\ZP$2^AreB$DX(T^+NeZCIpAscR!>_OJ!N2e*n$L3E#JCg"],l6IY9pjRaQ]-qPO;FTO)!_4g=[^sDT4/XlPsRLa\LO9hg?,@\p&Q)1%iE'q9lLWRT:'A^una]AfP %Rfgf\PJnq8K4&/FMjMbCJ@-?Q(uFn';p]'\8/36OBMPDE0J2gL'ilq`HsP8e2[\!,5FMM=#>95))P03"\fh2N?;,d[j_DYuk4DUe %%tU#%oN7[W*#=/m$Cn*#ZH.EE.tHh__k*oS'Y3:,NWi"O:_3^2d)>WJoQc!)Q;_.':-6FfVXKN\@>u+XjOfugm_7[;Si"k=C %,h_XVP7S?q8CTqb@gdUj[\fiY]EQ!Z&ZB5r)Um1A)RY>c;NYr&83"h=U*aJV5lRM'Hc]J/>7R]cDT.=%]0(R3j,Luj_^G$e3]%G, %?(T&HUd9Y@F-f]T:E!IS]33]lD'@8Q$IPB3)^jd/Ae-W`@;j0Q8*-1L;rc2u`1ucYbWdji(HO+abZhnA!)!BTRl&5p-PbM^2elrs %`d(H^/V9!V[iLifFc&h,8L`ui]^W]nd4-^rg(qN2H2a!k %4Vf>agCXRl4a^5lsF='GW%EEN+d\uX`V6_ %4R\gl;2Nc=b3hm2bgZ-J>j0?tI#60]<.V?C(j015XtJg>p+peD"L(ag*h74)`0-rQ+d] %PR,sinNK@1_]Wr6=S>B)CN@(V313ur[e+Z-@L5[R_(nV/`#t\)`Dr)*eAuYX+i3[".8,ukJt@?7-N_9]inSmTOsM'^71Nk6FnnW> %?sO/f!aHF3a6\'oSeg@!hj#oLb*[Z/esuB*R<``u5XT/8730<('f\+sITTm7LDlQsrtOg-.TipCGY;3b?N/="`CG%sID*B#=45T_ %6f-8oJ`.`%D14KGdbrH3Ids>6cgDi<]\#DQgg$K.IC&ai$GAt"4."sah`Ul(iU5_%Mp6SjI.1saI(3 %H#7#mM?C*5ED:lYGb9=FWF2G][ZJ;s8mo2#Z96F)YZ=)l::"MhJ?5B^%TsE\RUTbu;V!5m>^]nrNeqTgbhK&[Wtp[VQErbGaCnuO %!f@D)cN#)2fYfecGPhCU %BnP$$Xq6Ml5k]NXj4J/M2*+crSihR.T7dQBZ\e.^m*u<\>HZ1dfaW-dn5e_cEa63P/>hukQ_huI'RtR^8NkPp6H$eo)TG,$a5.*`kPYgK&4J[;AD,H#3"fGC`o?:%2?Y;*'_g2,T& %_@_;.'+(+%WBW(Hii'7F($abUS\[ %18kR6QJ?sd; %(JRA"1t;ba)grJu*7$l&9(9_E2-^;mFhC!k3jBOl-B^2;boV2Ge[\ZVcb`.bb!)gE6.'db!1V;C/Cq?6UJn&ub7@BVdEk0kg'.r] %/AC.9"4g:Y/h"q!+R3"5DXgTO1URBkP.(d?AKu63UgDKpE^Gn@ %^,]qOGnO_-jL&YQC1L5p"@4Q"@ip\A9AcsU"fD,)m!I&d$^i)q9._,/L;>kt.8*\k$na!O=Jt5li-7i299F1X5n,VL>3N?Uj$lLX %McER[C2gH1F@gmde_-#!`D.S[U!k46d3oHuf,fV323br*HB<"&[YtXaX41']?1QRbpie`OIG&+gt^Z+RRne$t^V>)%eK_.:_cP&\s` %"LhQhZ!57#lk->AAA-&LgZ*&]*J&i]\@s60=%q0*1q[uf0Go2[>/@!]1,2nX$J])pWF2,NC75;7b2uFIR0mIt0U4`_9c+Mfg4MMG %km_lBj^H\p$kZR-jHM6V9i8Z9%ITm\U/!bpTE\KBQ:"A+A#hj`5N7ELfW8DO1$\330^6R-]Zjh[AX$2=27I[)0.\U*U7nE?hmU$r %cm:-O[BI;9(Q,b\H)SUPG\pJ(IPPbGk&>&Dk/A6k=8BU&=`nK#(30K0g:YEhZ,k..LL&n7A'QVYjf3VNC$;q*qMLqMY%WUkAQo.m %*Y`&-1iC[g]uSX\"Q\"u6;)KKFJ.jS3Y/^7VltG;FcZYs=c+4b76Trg>#>JCdmI.gr4V:JWc2@gXOOBmKYGFDRH\Yqp.X)pM;;;; %O"QgMiqe_26ORo&P!-%^;/alZ/c)pG'_btFk;5%?C9X.7RP9eU!LekkE\JW3Mrge!5X<_;"AkOFUG=gIYnF:h$b3kQb:J4OFVYCqcMpHXH?Mp>7$Kn]P:R&)MEg"h%!"^E(K%Q %CNs@S0t0jf$&RfcrJ>?!`3plPb"^;FOqJJNZLig8hF/[*W9"pF7?EgeL8gaVEQ*cjrs@p9-WZ0NZEaV084f4lR-74X0bpGD8h/6@ %S)e]hQY6KL?KG-#7D_(U %p0%0u5[[D($Z8/7_O:Q6emeO](BM!!3"g3LX2De\P*N)`C,,cNAq$P@jtr$&c&^0pTf0B+Ab[B&V\^^MW//,Z?EaUIr+]I'QRGaj %d#so1c*@hQO!ahJC&j.:8gGP3gs&toP()8h&ZpXR;\c,iFnAE\cGJMW!-HYsg)4oUHBNGfP3DZnE\o6%(Vr'^#r[L7e=h^?"kGE5 %Vnqt7nKK$2C6f4M.?/aJ?=!Il`1i.q>qC2h;aE*`eQu'm]7F(p$Z%58)$VFe4:lClm:hHa<"X"W&K$/:K$5>No.1WT6,g4pa\$Xe %WQV"`/*'?]Kl2L]JeQeLne]ip6:rVD\7m[XDW.#8$K>N'@9(=TBW+tQR)HdcJd-[i_hgAGmErbU#AQEKK>"tS40H7RW4Rda/nJeg %Hrtis4DU(d:)*`NKO!dS8oW2i:RX4j9(q+GCkDer+coKo8fop)^g\XC'I>,@"d0"5C4(/4F#0tL`8/ir%CeK2j6[Wm7E_?='G_2+ %V\LVlNMJ=$!u"BUl8&`_@8WcgDrsogc1\B/Fknlq"A$8Qk+GS.-Kh2(WVO4M.=g8rC/@[a^/Q":knsCob-or&asJrb0B-M6n>ufb %DN_=pAS`&'Vi`L=&3\]5VO8b&PWE-Q88Rm'M9:=\2//&61gonJRP`,PK^Xj([[ZWW*C\dd9Qp^*JabpW\0gL+dm*Jf"gBZI?q&LX %I4#]KW"88B=G[s9[KW,;]\=UB)T)48OQS3!2AS](3EX3gm?dPk@QWO,cYg^hGnQ#W2P"Es+454p %iGtib+'O:KU4pPP]%$keB_F#hk:$1FQG0EYU):'@9,kni1okgVQ7Ek$8ode<)K`&J6OGSqC&R;=FouKemZ-l-ZML4u:S5<_]flDR %o)/?c:A;qm53)n?hS1$]o)!?Ccb!19@9VqFZ?^V;A@>Wps"fl'dtS8sfUeQ2_tM@9L>t-\)'6Rp,7JE"46.O]P1Y%M9:Q0$;qAH/ %B_*GWI4JMg(Em*7D4%cXZdiGr!j>WRHu-_pX`ZlpmXTGg/)(NAe[eBS8o2;*B>@o;4^!Za#n]<7Ae7;TC*X;(Q8E;0h+@!d3Z+h3 %q,*P3^HA+;ejkXYtcQ=m'jlR<:k,k7]_/;ZCb2(GQ!F:/'F[7O>2lk,pJL* %6H7+G$k_J@-6p`nRg6*nf]l;clUZ4OZQ3)"MeX]>;1A^*.XDoOZ?4`6+CM=Z"1\M-`.g=2@,3<'>nE1[[S#%K%`LE!a,_6^i&0i,,jE]&_,APl=(E-!]9_j3,sZ'Hue6@61F4&C6r6r_fA0!JCBg_,"A*[o)mYho(b %gUOguGA$t+o$%\WMb_#li-+/ML(Z-Xcne%4"/AJ$CGIY<=u^oM,(<*(S7Lb>0uIg95dNHN/#]iI&qlpC`K_X0f@E/Z]A'(mL,X^/ %%C?Hieuasl$cn=:Nco!gBY%Ak7Xg^@GkSRk!Mh9DW=[r9EHgud&JAAaQE^\o.2K<:^oR'!@H!?$fj+^PRS6i&N!%]m-lZMW,A3NrPsDsiEnc5]tD#QipQI4 %ji(7mrr2'Bo''cCgcfP'F*[VdH2:(ZpGYm.hP9XZ_?V04FaEjcGqSBiBO<\u[Jp@/k&o8pp\'0_Z$lj&FImcNrrjlWn)e%EZ)37e-.oW.S9?c9NW %^ie%sMNdp'i]hZ)'M<]G"Cc"_[Ym]cV@AN.H>I!H[\%D$N1J2J8I*l)-n`:iL_F`=K"0G)"=+Ii9(LR]'6WluIWhRYPXXXSDn51[ %3"15%Ss/b!G`fkERH)&$a($A=9>;FZRDAKd!@2USg[B8HVFH0LVo3r6UVYLc;0\CVaZiS`qT!kVNVHO9erDi[f^I,#f'TncNeg=- %4Df334SRRa-\NmabOo^N:f#m7YT6:q#RJgt&akGk49("i;;`O"8U9[uh8:V(j-Aph^>!ue`$tU\B?Gd0(?;b`S-E:!WV#l`G&8\mI.b,*bcKSOK^rCChaOkj3RH[kf-:n_mS$_)ls9GN4L@nHF&T6j^pFT %A$5i=kl5QTg:+U!p+[r&?ckJ#VVg#,3^)<_5DbHAqR?=]lZ)Mh;9TjWd/ut=JiP_2iirK %Sg<&X.-l+^K\I!n^RD#U\'OtQb)Qd`R9 %pFERQ]=7UtdF2a_LPr@][D:8S2cmJuIXcEY#r_8pl+F^>hJ`KbhrftM7=Mf9UWV)(^\kM^]g5:5SDIUhgD;t^Q!a=GANbR2^fL4n %_k/\ilYk'[f\Q"FJ+7JLPitQ0Ps.,;T:Tt>m`t)Crpm#%@QlrYCtO+/(OmS?B>'uB3I?8ZW$7_/+4Ok"Md/EX"RrH$YO:$_\!(g3oqW[f>?LH!X8Jj %T)A)%2##t2ci&_2cYou4?hTcOY3tkio;NkC!.6?(bQO[l]r(,qb$MCS*dQ]mk#SDX6E>P#lQnn&V.ErRVZhTFgK %DOrh+HC@MlT-eK"RbV3(5?r[//fZ'RO1Y56M_G'MqS`qc;rPuN!oLoN[,8P/F5rLO3IPmsF8>+[r;-?jrr)g4G8Q43`ql33Ilem5H2:7$N[oj_5]Wml=;Qd"@7'B[ouB/b#NT3lDa^*qm$ %Mt3FO1;;9Jn\L,E0CSl:bDV/I?Z&Eo`m$_N<48b@Idff)k(=3$rgiV':RUj'CsS_dr8!q6o)2>YpH*Tlq,">h_?l7q*TdLFq@7Ru0d3Pk%_Jeb19D`;m@"cK`?A0u]ZUZMI^.Ab7p3[2cgMPupuAVU^H&uV %35**'R>(L*KmK4)Wh.fa]YrX+`][\aSXs,W?U&B)q_6!\4CWq/]oFce$TYl;d+O\VijJ+-c]$H0=Vj[/'bQ5&KXrGg2!:LjP5&A/ %ocHjYq-DY::Oi8Xk0pmm?U/q>d^nmYk5GkYk.;R78,YU-bAV4en08l7]Rttp48/XPoYoqfp6$3<]D%7fPMhYNSt2G/efXm595gOh %4hnVdI6Kg/qr[kYSftj05S5(!:V7jWRc.l]oP^\D1/J,e:$+#j5G7t5f5 %nUH;fnFQ\Ms8?;IbZ)Q**WF+6lVD_Zs7,g\oQp,n`U3'Srpd0!Hkuj;q7@3r=9%jP\%c\]p]p`p:[R?>?V?KqX(2*ldtbPnRtlo= %SZ3JZ&;0>OT(%N:IOjZShqVM0hqdb-rU#*HhZA$NnRcR[%"Z7P]fN+4IiEU[j*kK"-cr'&qbEEIZJG;*,\'<^Du')c?gk>Q6BZ_@ %EIW=\q@3Hqg\nT'^\IDu[>oal$t$Z-`_Ur"N7rjWKNR+uO8;eF^Q-K[O%`[RH,AF#$+$0ls3Z=V&"E29Abk67jLlLu00`\5^1G=D %eQq;72P7WC4!Ot!n+5@k,jL<,ca)$qDtsS4j*>g9A^/p1[-:_^bL[f!:ogf1kV(iYk5"fDcgT1%i-kHBpSHC>DVmfqq#).kr/(+= %k4AJ*@>%^K(K^(sg81^rTShf'u^>@Mdr361b[mb)]ac+Nn&<;YakrM*F^SsrM.:G:#m5*+Rh:R1V`$JF9rD#>Yq?o!/VL5YLI %\,*EtjMsJr_6)3qS=a0fI@d].X$qIo?1mZ(^,dS-2!%$@IfmR7a+P-_IY20IrWgkKn#-VCH[!0V@=iuU="1kMrRKeQ(Bm+qhaKh- %IfI1_qr^Zsn8eNSj8X8QIf=igh8R.AXQ=p,N;eQ]rT7=";;UR](On@*Ga$mAcJm(RVg"Vk55LkS\"@l\cd+.?6e*7VRb^;[HktWf %Y+^20"l8o)[ID7(J6,18PSka*G9jeF\,<7U+9?*5`$#fbY;f8)!%1U/k,at7=)$YZ'D'#3i:ZWL(?EDg)8Epp^+kE?GAu'G\qc-Z %-g,F&52f!nBA\7t]G$7fXfbtBN5'\K]XYs@nboq`NNYNqZ]!n(HhRUj.Df7[EA1)*Nfml*X/$#>TVQhq`E,8S>MnlEpt>B/il-hb %*^An[dHp6)m$tdWcpeJ-:UE1?SCX,.rR^51?g\=kcohKYhgE%[g;W`X?@7$>pQkpUlMU)/rVhGulg;jr\9TqI\@C.!I%PRu5?InK %:++"p-(E-sAP)ZG,_\bl%:uq3G0\S'N0)$MZhkI.?d5rcr`)\>R(fKR.oEZfQu-`dA*PX:/h61339oK/D9]E2l404'$>2& %3E'ktVciZ+5DuVpb"+_/]=G>RYH-n/I^`sqa5=YZ<9Np;SbGZE8B(Peo(m/NnDa#h*D;3WM!4L!bCs$i%5 %hk0qp_lLE'V3@O4keFAIqCNe6msXcOhR?T0?e825U(%"7\N@RH%QlsWiY>VB[G+.@hoT9>m.479WX7QV-\C^&@:&fiMbbp;WjBYgLHm@KCUKQpi+X&XZ0/Gaj@2-m'bZaWWtg&g %o:;o\g=4D'_=S?8=)/JJ1cjO:&L8[Kmk2>g\Gl&>[:TKds.nK"m36?FZsM0n\7#2D_YW?[luLppI=-6brP`N>aiT_190$-sdWj.! %=*bob6_XL_Dl=N#perABp\gfTabL;@=%0ZSOYNS;rGk7/2kO.5#R1Qqf"(M_leIt6WNV1_%<(UP24!#V3-HQmZjn_:])V'lmc+6D %FZn>Sot0Z*")R]N<:k%!-=(&-qWom.q7HI0Z8-@lohZ\E5fSXG)7OMu$@4+\c_&hTl?`'giPCi@CFU/cTIRZU0^>>k+*2JZ1Wr1q %Q6V-\1/=EWI/3(#bJ_"+fta6;>i+7Q55Y3K@Jb**oDmi%mJEsLGbVPD3-4e\RIB3m,(&YH<7`K>(qZbPjgRgDHr:j)St0aZP4p6# %m,JJWj&>:NKXLNK?5rfd<`aXei.KSFNWc3s)iR@S7__8!]@^b_BZ]ggG]t@P@J3u_pYjBjeQ%%VIM1C9ZBODHr@0Ps>$O's&pQ[%R,P9>`^gH@Gnb2.'%pr1E5*\Yu?"lYZCu05(YMFKk8$f/MG;DeeIL\@^.2p"k2slhT5Q %X/iD>s6_'Km9?.f>m,lL*A>VK_+SUBOOEIoIU"\@"^bPR?W6%`)LUAo %)f=s@j8ZYQ^:#W+YP)/Xk4\/lCC8k3Y(l>gGW;l6@#7$Qi8tr(X*\hiGbco?g%Kqh#>3S5ANXYj38[g.DI##qr<7sn\p*:TH/9X8 %oie:Ho!)GDf;sm22Wt#+r:0V9*Hpr:_kVo8m2g/J+/(?Q\\e'Sn#rX;jfZqE3/&F?n?gb50?Bnh#'cg$mC_<-dc]3ma7o7#G[t21 %Ecu_Tp\@O5%NQs@F`Sm8T(eEFMlSLlY>4Q#]YF:?oA^WG%sAl(61I$;'Y\#?LR[$W/phmCGpC+U_Y&:95?mmY%>oACIY6)"lSg4R %oQk`L;3q!c(T2JrRrF7;*fAk1HSa"$SgH*4P=e(ME)9ETl\\_LK:FnGiamCCB]5"CC(Fh7QhV %as1JPqdX!4mG6Ic6[`SqT=JkFU!3IYHi;T/j>+32>J9.m+)>,_5$sAcHGabV+'Eb8F`[;2f(E\oWFt)hO!;%lpD8lD16eg1IB/)= %Pp=P/b166!AZfCHC:BORa2UZ`@&_jiAbE4=]m4j5gRr(=m.RWh\e\Yj*h^H0Mhe@^g[u;,W&0LnoU\9nK;(;cYAc#d!g84,`f#F] %kP#d">ec,]\KcHC2VHV^MBmc(7#QIhJl/d1>Z05@u4lO()$+>3tX %p(Wr+f@Z4!0AB?^S?[2%O[HAhH9JH]s)9E`DK!i2[tnMAU6RfF@4d(ZH.aP7Og8*bkBF&ll^I#-qFp*pk5/>\Qga#r4d=YVs&UP% %K$O7](>dt<[7:e4qm\\o2pp:B_eXGl?"F6/ma"bbh;JC0jSbD]\+Qi8rpk3p)qY0gG3k7XT5S%`<*=omFA9>G$iTpccSclKT"'DH %8BRI\Xo7VSJZ\Sg[sM((,[^LNbsq1;bD?]l6gPbXKfo;mQ5Y-i8898Q(Fd/ggKWoMREp1N_/?O@O:aSk)8W5aN8RF+9W6n^dF'.o %]=quWL!@Ro#psU=g\gH?\7UgWMJ7Q;&JAl%o'qpmDpIg3S=!*NoKOuJkKAT[PR6Qq$`NZ3=U=LmY-I?Zr2rFqX[G,'>--IQp!;$m %Gue.F5IX.Z/tZd#Nu4q1Tuk9C>HuDt*CH`_FPBke:D,LsM1.LjT9,o8`(H%SEQK"RN!VjrP"SB9jW*b>5+%LEjG4T]j+`9Wh %[>qIJA:#"'9h=\E`Gh>E``J&n\c.P8!P[,@c,XCp-(Z34OH6`g=*9&@`EFb0itS5kaE$Wf.MZsD+m.RAg6sZ0M]ER\W^r;A4SnID %E@q8LeaD#:B[=C'V/)kuG$(1mD')SKHJspehq![%O;-+c<<#<0nmJ:g;,.DMrF0rNQ!tEd+Ho.]%;DLUsK8NI`VgkjNRu6I^C_CU*;G!$8mBVk&%7 %7kh<]S[M%Cc1Uk)h;GW[r67WmJA()X*$"VW\&DUeRhNXm/[TV0*WD"]Tl_7/V`OTXi\1CQ3R2O,VTHk^CA,L/M01>nkYKqm^2EFB %.7ZOAFkiHIM=h_$nS5a#CuQ %;_+l'AX_q9<_qe&jLD%Y\6?qo4,'3/V?l6quA2:^`f,5#>J.cJ`ZFL4^W=LE+1N5cXR7kT*Nj)jj7ebP'E %[%Z#-4YQK`:Seg[WNO$/juJ%%PpBe;9=qKJa!J=NagureKp68?_Or=`Q>s]7%Ru#$e;=N6oWo+nm&F/"aMYS:e7hZ47m^koKW4C< %;O9BjBdmJa,H,d1iON4U3YMLl-\TujQ&p7u%"uQY719b5'6rE(a-O- %F+/;j0)-FZ$--DQ`2.'c_r3edF&[[95UE=@L6RMujuK]I-J#qVlq_I,=%!$-M`VTMVo*_qal'J"=mD)lfIM]a(hR$'>#X8Hp!fO1 %CTm_6\%8>PC9PFtQGYC5i54eF=8rJ#+rNdm``JTc:pBP$LXYbQRb,->ekKZ(s^6L %I2#!tj"]#^>^p.Uf8\tW1gfO1!.LYO[#^;4^>9BWQ5[#_38]pXI[D$_T9d3p(^<`s2P,Z15qCN`7Vca;U[@_Q;u;uL.CH.kpaVJq %)poTtfqntTB]Y_pklU/i_(QCiQZ3VqA[6t[m6PcI'=Ld`K$Ql`quf3qi!EA]isE2\+oQk*==rX35g9UZ?k]l<5+5G4/@nDIJ_>SI %D8IUa(>_!VYFVk4G)fGobsDYK?/$NTg!Ij?0,_2u"\4FX]`VI$'r)ormC6/,F(/lk>8aI)U^3I_6d!=O`c"pC`q4LNg@q:mr/4#mjq*+p*'W@A6ALBSKXtOQ/>m: %KG*A,a>&Sd8/QsG$E1-+)<5Oel5>a$f-?-5ijq>/lLR).PJ04&L2p\?li0E_jMGNt^9,_oH>'IqXn6aD %i5T]IO^I[bK06$V*O50p,RUo>Z)r(0KL%F[#[-P]]h%74SPOo=Fsl4mYnmf+^6eBEI97LIQuh[#F1HWPSXshcD>51<$]DsC?XG)! %f_+rT")RK%Wa9I\N@fVI<^8h#.u?A%KW_-PR6A;a)ceJkUSYO_XM..DIn;1#a>VWbMtRK!m6GDdFDk4(KC&cglE84VY>P^;ZV+Wj %Ve7?4>Br'*hnb-Q8A/?QL_(6=I20t-m^:p.QTaKh;\H$Ab=pAQ,[Ae8>8^m8i,tY=?82!;M#%Y`L!m2h*g;]f6T;haoU+01.60') %Le3#^H_>8n.h?.-+a_bk=QreqV6T-1(q*btQDMhi`IpE4>. %W'1$j`omc=9c^J*;XQGcO6EHY(c]/ho#hW?!H[?T>MjYEB3Q[4l_PgHr2a8FOUH=f;PPd9,g=!YLWR"U6<@cYpud[ap":"RO$00U %Uh#Gp-b7ui1np^f^;pM[Eb\6;l&+P(;Ffsm;+`dK;7af8dStQaNRI+n)Ppr7P8NJ6dVYM6dQKUTWpSPhfR?F??XHI2j%2;-;5^_4 %,^nI/g!/\YA_\YJD',WrZ>-_X%VLU4VS4tuBe=t"AqeVr9NtZMe[:PblW.1>\_aT?lMHt-=?P?'NM#GLD:_HKj>,F1FdT7lP7cht %eEYVmf%LpNg\8"5Z=5U(,Me[u08HC-]gHn,2@M[;=&?&X"QJnK=BfJW6BSeu^cZkje[PF[\ld+^a;C^+qlk7K2p<[fUR*tYkAf6g %\@unZe8s?>TqGIsGEEWP!X?mEINadqfV_)mgeX3uF`A>p?o2#sP8/h=X`B$iD3&ZEA,#A."(sbMEOaa1h:c;I`upcD_I"1hrcWDq %<2MN5SU09d)P[16kQU;H,/SFhcCUpom6qp6(?j&<5ChFRA"Qqc+Wm+TLFa+o+]]fo_4gSWO3&6iF`jfOFoih$CW0"!bALZgKN,1- %i9.>ciC;#!6gUK00KUZeN5a>LDWuZ&^)[nn0A@m\j;Xch&j1ACqV"#!%Z1b&NS%Yt,-,"h4OQeS1Z4N+lr\ok'(4QYDdpDB@Xer48/k"9M*0l%Qu(f*s1=C>SD]V"-EQbBBj-l-NJ3%76%.=7.rj,K8jA\@@pGDgRFI)#LL<-u/D2jo,TUb9?cA.>[Gj4C5)#hl_t]Lumd0'BXC-?(.0Vq)i`n %_:I/,#$1>K'Oo?`DYVEu.tj6Vh?Pl@_<:p9>[=9>7Ac.W@+LI&%c+,dA!?&(MF-3F`Sntpm0Qb6cGCBnUpdl>sEV4'nG/3]k8 %dn+OVqr3r^>+p867c"HBT4U#QJ0Qmj]ICF4FjDW1ZMq9SGXiBJ*slY<4\9DCW?3aSbcMG.T<1$28NOf"X:@$=CV].Ymcp+pG3p68 %eb-5-$2b([5l7i25(qS=hBR(9GF3AQ*Mt&r[I]beFAa_!\G&2]>ZM!j81O:Um<+e9<8G%\Ye=:B,SBP$?.omr1`qKGHbe]oNaD+Y %p0t/%+@461!2aPK,EgHEp*+@64QPM^&K#M:Vg_tQ#ug%?m/bU[CRAD]"%JW#=1_]X>p&F]Nf_X65?uq;dZ+C>Zj08o3RY[s8HG"C %rcjF==/q,LSQ*9M4f1)k9&&;)l]=TDp>%n@2\d?gkXBY>pDh)`qdVsE'cJ=M_upif/VVN9;"$t'//]<8X>&o%3+AT#+#KYSgahaj %$JSopDiDgccqHo1kTStBPg)k?TIba&D&kQ7!9;OJ=kgW:HHP2%iTL0UTH4'3V&lg,ma6 %b%06<>p9@"LDJXoH>$cUQ2rNmJ=o/tfeST5#srU1D<\A5N!?MR4BpX,5[BiEj/0%13>M@-SsYhZZ3uW--BSkl?nmg-,=,p_p8".\ %2g'jh1n^"H]:LWH+516,Te!F-Z/79,HCkO]I(Z>pS%I% %p,&1nU(B.b3&)Ne9D&;E7?O]Uoe9W#29-LW4F]G)6K&J>U+.+"YgND:g%d&pR<-8dj^U2>H7cBN4Gd)cre^(a>?X:$Km3RqAJLn9$4<@A0;h(#-DZSdNeQhH)@,e)mWPGQs8T/Lu)[7L%QFV*`O[iP!l3+V5L %lO_f9"#dIh?6rpOKWJ2K>#/F'nOJs'@hs,:GT5!ZQH.1n5aYD'g18JJtKV'1%qK63+IPD.4jtn''6"%VS^8PRr..m4?X.EDFb_8@=DZaP#dd!?'/1qE=R)V_Qnjm'U"u1&[Q:dW<0/1F3q+4KeTDJp(_#mEIDVDX>6=)j+Lj(pD]2Cdocln*1qPQ*Vg/^&JVbi %f*"GK:Z#l5*fSOc:,glWaK-cZQJnFqI\FuAZU?$m1KKGTdQ]f%WuGH']WJ^k-l-=J[,qK& %O/k5tLn9k>0niM"LNL^@1$ql>W-*GM\@5rG$^2SAc_"#8]9HT`Gu>g'IDsiLWUd]E_8&[tPKpHtpq_k@@lYeio&I1[M\W]Dr$#Nb %a5uT]XK4-3e-[m-n6Shc.MJGoEfO.4mF^,gVP.W)+MXd+gcK%[M.n< %Foa*i@dp]`@IqaVE_)NJ]df%XMV'CV4(P*[B%S1-.FMPYnLK865giTNlJYrc6'r8W=G@,2+`?`Ad[JHnN/.C-;-"APDHGod7BV/q %Sb/;.Q,hg1>XMCpjCdf#SgMND3/R-p#Np`lj_9EgfkkpL$_5$/Up"YX-;CSmhX$W]l;uk*iSj4#*k!k"#R;'d)Tt[kTXSB %@1e*X[^UfukI\F`,J(?'(>8W`El;Y0>^Hg[pU_ZW4Yr:LMgIbli,7n5SFk]/a&^[=$>,3#J.'?%UeZfb`M>* %GQ;NCZI<^KVra;48(T&@]%3SFc-$-hCM?dQf+EBK2ZX %=CDl7$c@kCosm2q_jK4bE,^M!GaPmmq>V27a)Vqq&K!kY6IQ[RCoX]%m>PAD>l %3-<)kJc+L=VSn"50K^Qj@J9*"Isp4\"RP>!]O>*ZO:WMP]()lf>8`8`'!loC5[NI^m\j,Qd6^aqWhFVdq6]G0*Y:>'3m:?^!Md?b %eLlJg?*JsWl`#j\;BlMKeU8:e0WhCg6f]BS0\`T0-3LR-D:!'5R;F[[[Zg>YmQT&;,WWa&d-35G@(L:N@=*8/esaY0]Zodr:(2Q- %A>n+aDDGi7&[3ACW&mA`P=I1a[DMY`3H#F1=0AoY[#9(oY/`92^gZV);,"R7ggPFJMhUuN-"otnF?>kKF$0u'Z)G\^,;/!j+c)SK9!2G*3[]fhe75bsqQ6a^\Yr@(![W %iKtbjM%H$!NMK%*)&82e9*<,UV9EaOO!l+%Yf=`V(n^/sG!5e.*uZBUqV$q4ErENb/-1TI*bt-T]f-k\(qC]O&R"KZl8?86Oc,WQ %Vk0$OUThdnhOG$j9O%C;+1B)._,I5Fcpf>lEn)?E+MIGp9Q,0'bLas%XS!7#dbqIH+)t!'^X]KrId9A5ocZecY2]Yp/n&/BXZp2ScLjH`?(+K,p)6GNp;#Opa+N5gXi(*$b&Cjj!nd%uOr %$&I(J!%)AJ_]ggq&>aJ7@XB6YaA>*RE=f4F%BD-qn9?YB1X&4ON?u9rDF#sV01!j5A3X#^[>I[r)+oU/c2"%W0=K>8(Wak<%m=l_ %j573S&Q0I[gf-9;+be5l/B2u[^g[l&!X%*j_OqW-]a1PAEi&u?+"Nd43?kGqi2s+N_i@#J^lTkl?ns %O@a]`Lt+Cg,F2e%@<@:n_e`3D0fbs6j`NA`8tHd.h56$bCRk5q'*Cb4BU^>8YtJSBRjNH8or3c]R_HNl`oj.9s%49W<#.gUn) %T7K@E:5-8Uq%#^O^'b+Y-:F`bd?JX9+V5k,7;+A7_*K?(P\3?1"12n^([U8V&n[1<"UmCCO<&RTe5@sr_gJb9*gQ1p^:pl[5#/8eEGUE %e'?CS*!H'I>Xs"I)5L><.I8Y7Xu;+*kAbp9XS8>nD2""+mUdtq5IF^,-@1^(MIQ(9F?/h%(@ptN$aiDL%1LT7VJ:uc8&HOO30eqL %D5j!A*ub:4BLEU!rrUlE_j&(&,Wk>f/i?j(''Y-&NN4+a-$1nOZkn5q^[RC46ZS-Kifa".[UO(%LcF176^!L$->I0/7'OrA-7$/C %[RS2D(FmoM;#@Q9^p]$d,ctd_m^iIi%nDuS2B-8%oR-^+mSrR763MORJEsXj %r@9n4[He+;bM7(?KS7cj#QBafr`V`4aL,L_l;,h]1=V^@VXZ1*Vt0SYHpu?ZjQsCLSWR)n%%g/pd;n@:UCK %Ea/($#epcg+A6+Pj4Js]fjY^p(-E.c:=Lk?_`G)2_2tYg5-1O0J4X!V?"u\Vb/P$)rEE?]8?J.X5WCWX&dt9M'K2d8(2S_RcN0Z" %r@p>12I_f\>j5?Mll6L>hY!ROjN5uojU/cO)S+R^CZJBp-]Ms44jY5[%\\sTs52PBlroPsfqEHfnII@RTi016P=$ek5QaN<#+@JK %V\>m2,-$Te:#4%q2^KN8NReGq-'Ur)'gQK7*OgVdQm8_C`(eSo=9s80M%d(=&^,L %C2Ch*Ri^0*H^8k@UtHHGD=PM5(LiBu?ZhI?Q?/6kC)M(g3-j%W#WCPBMdR"Cr!6pl-; %MLK(En`4?1bu2TlV:DX%$g'R3F=u?lj`,ugoomoW4;NX'arUh$IAjK!bq:B+g@W(\WJb]tkq!!DAAS.nsa3b!Z'OX"C5S!:4?NIetM)>^jBX6[[??.,Z(7VRj+mTNI]2S7:5G$r\cYtlCF3I=7H %KEPthU-9,9!OFsjKguVkG&VY&&/]'I->qRUV:l^MU"tNlCh:b&V\"C4Q6>>lcORnT@D*2CVhA:;`[';1_Q=o#c&_6k(#TBVgriF$ %2IYQto[Ds#-Z"CQ2t*,k_(B2#\#>LLm;$!IiJuq6A`CR=Ejo<[GKE]pc9"3dIte$ri;KP&*&C*kIR+gjk5UPujO`=5s/B51\,_5n %#`Fp=VfbOHUsC^YTcp+S;aL@#IE9$C,c8Dn6Be3-jL*SK]Bnn>qi3Q,@?q+@"QGq(W?6?DY(@uaB0W9pPT+^:^K$58i_c6#G#V`$;/.`>_tsa>fSXKS3%mpi\g2stB.,em'#!7q0XiF;2=;hZ %+$<*1N6Cis5:!tjWK-QnUkC<^kmQ^EB/0Zj3=,Q\P+dFWCT3[Nd9k>B'`"O)\ct]$m;pQP;F^"oJXK2/P)9-<3Br2>P&O*XC.eU4 %_qNO@)GLj1ofJ72 %D;Y`#ElmW75!YRY*NN`7)$Zn=,u:N?Pn7tVV"0O#?PcAh.fS!.QpPg)OM5#NAS+58(%FFk"p9]INiGCg]^CZ*gp(?_YGo4)0O?GU %lrNl/qRRoNVN*C1e?'ugnLj.j:X5![1)j/Lrnj4iaX.P,8N&ArM%(?2L>GqgZ5OlbE;fN1IQ4m]NdU_U@ho9%E9paL,8X[cl+)[5 %Hu&@&4V3h9.dIQ@aOl`bK9m(>?pjh%%$#`4ij(V"L=@,%Q8G;3^[(%:K>'OP7af1:[`(m7='eFQZ\D160"QLBCrme)jKb>uD89GE %3tVK$RKV/SZcd4WbN1jejE5"?#]T48G1B9I#BC%n(a("EE1[fU`1M?5U@l=+T=/9Mlkg;i;k+KI#m!cQA4SYfjgsVCj>uWaa$We. %WMb>e<4KqRKL7XMZ3Xr5c/R!QFT7hE.^?%!+\XnbeM'`Y_?WQ%(_H+a;5"4nIpq6$ql6Z>Gu$-^,NoRh"Q2Q=asRU=?7FtNj2qo= %:W[-G(25IAEN4[#T6tGG"rq=1[.S^cH2n66);^F;*c`Ef/ito2H`iBW&ED`XA'd=o[?AgQ(ONZXc8)&@CqlLL:`40U43KrfLUr$Z %4Kd:BLWTrcLN[>nc!,TDK&A_,@lE7\ca4RRHB;a1WdMgk;1PP5XS(&O&+ %E_DcpD@HGK1lN8![jGNmDNe:71oQZd\&JDJ2,.u4kR?W1cRaF"gQ_Sj@sc:.]ak<1i0jHuk&qKsaOhdF4WD9eD=;KPYnqV6X\NN>nSrV+'CW^VN3ec$X&R!kVS^jJsnH2;OB'ZY)Y"QBc\K6=khB_\OTYW`'a&inX1,[3hp+l %9_%Nk_^V0EP4-#l(oKaLY]80jnBBY,C"@7r)WUJ%[U-D[OL"[Alcjk\1]%=^G@pG`;po/go0j^&-G=To7:'U]E\h("loAf=?\C?^ %,:8g32A3R6lPTAkeM!ZK`>qR(HUtjgG;ddRjJOUBf%G(0\Bs)M'&[F*J]=tu`Eb$AnNsmXEIu$s8sf6GSTr59Ue`[0cD&eP&@3;g %g+CQ'J]1#K)="c)Yo"^(R%.(tnl=.q??Tk!UiU&q1a+4/G8hfQ=G+uk5"Gb.V'RKUJn-a,@DdhfIVg@B#-uK:'I1W.K=KAR"1`F) %L8tM;$6'1)7e3`>lg_K3Z7lm=&Ke9RY)J4K_V@gj's1PD6sYuRaL--kl>i9#&?8Aa?tcSapK-*.D7)!#6(tF3_mpM![;gCa5"U-? %Fk!3=F>;(eY-$o0Te4)+p0_GFMhT:`'JAJ8i*]J`kBV6kVJ#$p1l'3>mo"4e63nN41Ok=(PobSlf!Rasdtq6XtR3:7dH4m4jSRcD70D[DML'@&B
- -

- -WebWork is a Java web-application development framework. It is built specifically with developer productivity and code -simplicity in mind, providing robust support for building reusable UI templates, such as form controls, UI themes, -internationalization, dynamic form parameter mapping to JavaBeans, robust client and server side validation, and much -more. - -


- -<%= com.opensymphony.util.FileUtils.readFile(new java.io.File("/var/www/domains/opensymphony.com/blogs/htdocs/webwork/website.html")) %> - - - \ No newline at end of file diff --git a/docs/logo-small.png b/docs/logo-small.png deleted file mode 100644 index 7437edd3a..000000000 Binary files a/docs/logo-small.png and /dev/null differ diff --git a/docs/logo.png b/docs/logo.png deleted file mode 100644 index d77172a56..000000000 Binary files a/docs/logo.png and /dev/null differ diff --git a/docs/meta.xml b/docs/meta.xml deleted file mode 100644 index 4a1c0583f..000000000 --- a/docs/meta.xml +++ /dev/null @@ -1,148 +0,0 @@ - - WebWork - 10030 - WW - WW - - - 1 - 32 - 9 - - - - wikidocs/Documentation.html - - - - - Patrick Lightbody - plightbo@gmail.com - - - Jason Carreira - jcarreira@gmail.com - - - - - - Jay Bose - - Docmentation - - - Rene Gielen - - Docmentation, Development, etc - - - Toby Jee - - Docmentation, Development, etc - - - Rainer Hermanns - - Development, Portlet, AJAX, etc - - - Alexandru Popescu - - Development - - - Bob Lee - - Misc - - - Gabe Zimmerman - - Type conversion - - - Nils-Helge Garli - - Portlet integration - - - Henry Hu - - Portlet integration - - - Ian Roughley - - AJAX components - - - Cameron Braid - - UI templates - - - Mathias Bogaert - m.bogaert at memenco dot com - Bugfixing, UI templates, Velocity - - - Claus Ibsen - - Unit tests, Bugfixing - - - Philip Luppens - - Documentation - - - - - - 2.2.2-RC1 - 03/18/2006 - 21600 - - - https://webwork.dev.java.net/files/documents/693/31211/webwork-2.2.2-RC1.zip - Full release - - - - - 2.2.1 - 02/03/2006 - 21591 - - - https://webwork.dev.java.net/files/documents/693/28623/webwork-2.2.1.zip - Full release - - - - - 2.2 - 1/10/2006 - 21320 - - - https://webwork.dev.java.net/files/documents/693/27236/webwork-2.2.zip - Full release - - - - - 2.1.7 - 12/14/2004 - 21421 - - - https://webwork.dev.java.net/files/documents/693/9723/webwork-2.1.7.zip - Full release - - - - - - diff --git a/docs/overview.png b/docs/overview.png deleted file mode 100644 index a116c7b2b..000000000 Binary files a/docs/overview.png and /dev/null differ diff --git a/docs/tags/ActionComponent.html b/docs/tags/ActionComponent.html deleted file mode 100644 index 8aab9a305..000000000 --- a/docs/tags/ActionComponent.html +++ /dev/null @@ -1,136 +0,0 @@ - - - -<ww:action /> - - - - -

Tag Name: <ww:action />

- -

Description

-

- -Execute an action from within a view - -

- -

-

This tag enables developers to call actions directly from a JSP page by specifying the action name and an optional namespace. The body content of the tag is used to render the results from the Action. Any result processor defined for this action in xwork.xml will be ignored, unless the executeResult parameter is specified.

  • id (String) - the id (if specified) to put the action under stack's context.
  • name* (String) - name of the action to be executed (without the extension suffix eg. .action)
  • namespace (String) - default to the namespace where this action tag is invoked
  • executeResult (Boolean) - default is false. Decides wheather the result of this action is to be executed or not
  • ignoreContextParams (Boolean) - default to false. Decides wheather the request parameters are to be included when the action is invoked
  public class ActionTagAction extends ActionSupport { public String execute() throws Exception { return "done"; } public String doDefault() throws Exception { ServletActionContext.getRequest().setAttribute("stringByAction", "This is a String put in by the action's doDefault()"); return "done"; } }  
   ....  success.jsp   success.jsp  ....   
  
The following action tag will execute result and include it in this page


The following action tag will do the same as above, but invokes method specialMethod in action


The following action tag will not execute result, but put a String in request scope under an id "stringByAction" which will be retrieved using property tag
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

idfalse Stringthe id (if speficied) to put the action under stack's context.
nametrue Stringname of the action to be executed (without the extension suffix eg. .action)
namespacefalsenamespace from where tag is usedStringnamespace for action to call
executeResultfalsefalseBooleanwhether the result of this action (probably a view) should be executed/rendered
ignoreContextParamsfalsefalseBooleanwhether the request parameters are to be included when the action is invoked
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/ActionError.html b/docs/tags/ActionError.html deleted file mode 100644 index 281c12005..000000000 --- a/docs/tags/ActionError.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:actionerror /> - - - - -

Tag Name: <ww:actionerror />

- -

Description

-

- -Render action errors if they exists - -

- -

- Render action errors if they exists the specific layout of the rendering depends on the theme itself.

Examples

  <ww:actionerror /> <ww:form .... >> .... </ww:form>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/ActionMessage.html b/docs/tags/ActionMessage.html deleted file mode 100644 index 8f8a3cad2..000000000 --- a/docs/tags/ActionMessage.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:actionmessage /> - - - - -

Tag Name: <ww:actionmessage />

- -

Description

-

- -Render action messages if they exists - -

- -

- Render action messages if they exists, specific rendering layout depends on the theme itself.

Examples

  <ww:actionmessage /> <ww:form .... > .... </ww:form>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Anchor.html b/docs/tags/Anchor.html deleted file mode 100644 index b5dd5ee51..000000000 --- a/docs/tags/Anchor.html +++ /dev/null @@ -1,730 +0,0 @@ - - - -<ww:a /> - - - - -

Tag Name: <ww:a />

- -

Description

-

- -Render a HTML href element that when clicked calls a URL via remote XMLHttpRequest - -

- -

- A tag that creates a HTML <a href='' /> that when clicked calls a URL remote XMLHttpRequest call via the dojo framework. The result from the URL is executed as JavaScript. If a "listenTopics" is supplied, it will publish a 'click' message to that topic when the result is returned.

Examples

  <ww:a id="link1" theme="ajax" href="/DoIt.action" errorText="An error ocurred" showErrorTransportText="true"> <img border="none" src="<%=request.getContextPath()%>/images/delete.gif"/> <ww:param name="id" value="1"/> </ww:a>  

Results in

  <a dojoType="BindAnchor" evalResult="true" id="link1" href="/DoIt.action?id=1" errorHtml="An error ocurred" showTransportError="true"></a>  

Here is an example that uses the postInvokeJS. This example is in altSyntax=true:

  <ww:a id="test" theme="ajax" href="/simpeResult.action" preInvokeJS="confirm(\'You sure\')"> A </ww:a>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

idfalse StringThe id to assign the component
notifyTopicsfalse Object/StringTopic names to post an event to after the remote call has been made
preInvokeJSfalse StringA javascript snippet that will be invoked prior to the execution of the target href. If provided must return true or false. True indicates to continue executing target, false says do not execute link target. Possible uses are for confirm dialogs.
themefalse StringThe theme to use for the element. This tag will usually use the ajax theme.
hreffalse StringThe URL to call to obtain the content
errorTextfalse StringThe text to display to the user if the is an error fetching the content
showErrorTransportTextfalsefalseBooleanwhen to show the error message as content when the URL had problems
afterLoadingfalse StringJavascript code that will be executed after the content has been fetched
openTemplatefalse Object/StringSet template to use for opening the rendered html.
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/AppendIterator.html b/docs/tags/AppendIterator.html deleted file mode 100644 index 82a90d114..000000000 --- a/docs/tags/AppendIterator.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -<ww:append /> - - - - -

Tag Name: <ww:append />

- -

Description

-

- -Append the values of a list of iterators to one iterator - -

- -

-

Component for AppendIteratorTag, which jobs is to append iterators to form an appended iterator whereby entries goes from one iterator to another after each respective iterator is exhausted of entries.

For example, if there are 3 iterator appended (each iterator has 3 entries), the following will be how the appended iterator entries will be arranged:

  1. First Entry of the First Iterator
  2. Second Entry of the First Iterator
  3. Third Entry of the First Iterator
  4. First Entry of the Second Iterator
  5. Second Entry of the Second Iterator
  6. Third Entry of the Second Iterator
  7. First Entry of the Third Iterator
  8. Second Entry of the Third Iterator
  9. Third Entry of the Third ITerator
  • id (String) - the id of which if supplied will have the resultant appended iterator stored under in the stack's context
public class AppendIteratorTagAction extends ActionSupport { private List myList1; private List myList2; private List myList3; public String execute() throws Exception { myList1 = new ArrayList(); myList1.add("1"); myList1.add("2"); myList1.add("3"); myList2 = new ArrayList(); myList2.add("a"); myList2.add("b"); myList2.add("c"); myList3 = new ArrayList(); myList3.add("A"); myList3.add("B"); myList3.add("C"); return "done"; } public List getMyList1() { return myList1; } public List getMyList2() { return myList2; } public List getMyList3() { return myList3; } } <ww:append id="myAppendIterator"> <ww:param value="%{myList1}" /> <ww:param value="%{myList2}" /> <ww:param value="%{myList3}" /> </ww:append> <ww:iterator value="%{#myAppendIterator}"> <ww:property /> </ww:iterator> -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

idfalse Object/Stringthe id of which if supplied will have the resultant appended iterator stored under in the stack's context
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Bean.html b/docs/tags/Bean.html deleted file mode 100644 index 8070b6d0a..000000000 --- a/docs/tags/Bean.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:bean /> - - - - -

Tag Name: <ww:bean />

- -

Description

-

- -Instantiate a JavaBean and place it in the context. - -

- -

-

Instantiates a class that conforms to the JavaBeans specification. This tag has a body which can contain a number of {@link Param} elements to set any mutator methods on that class.

If the id attribute is set on the BeanTag, it will place the instantiated bean into the stack's Context.

  • id - the stack's context id (if supplied) that the created bean will be store under
  • name* - the class name of the bean to be instantiated (must respect JavaBean specification)

Examples:

  <-- in freemarker form --> [ww.bean name="com.opensymphony.webwork.example.counter.SimpleCounter" id="counter"] [ww:param name="foo" value="BAR"/] The value of foo is : [ww:property value="foo"/], when inside the bean tag.
[/ww:bean] <-- in jsp form --> <ww:bean name="com.opensymphony.webwork.example.counter.SimpleCounter" id="counter"> <ww:param name="foo" value="BAR" /> The value of foot is : <ww:property value="foo"/>, when inside the bean tag <br /> </ww:bean>

This example instantiates a bean called SimpleCounter and sets the foo property (setFoo('BAR')). The SimpleCounter object is then pushed onto the Valuestack, which means that we can called its accessor methods (getFoo()) with the Property tag and get their values.

In the above example, the id has been set to a value of counter. This means that the SimpleCounter class will be placed into the stack's context. You can access the SimpleCounter class using WW's tag:

 <-- jsp form --> <ww:property value="#counter" /> <-- freemarker form --> [ww:property value="#counter.foo"/] 

In the property tag example, the # tells Ognl to search the context for the SimpleCounter class which has an id(key) of counter

-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

nametrue Stringthe class name of the bean to be instantiated (must respect JavaBean specification)
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Checkbox.html b/docs/tags/Checkbox.html deleted file mode 100644 index a58f47760..000000000 --- a/docs/tags/Checkbox.html +++ /dev/null @@ -1,622 +0,0 @@ - - - -<ww:checkbox /> - - - - -

Tag Name: <ww:checkbox />

- -

Description

-

- -Render a checkbox input field - -

- -

- Renders an HTML input element of type checkbox, populated by the specified property from the OgnlValueStack.

Examples

  JSP: <ww:checkbox label="checkbox test" name="checkboxField1" value="aBoolean" fieldValue="true"/> Velocity: #tag( Checkbox "label=checkbox test" "name=checkboxField1" "value=aBoolean" ) Resulting HTML (simple template, aBoolean == true): <input type="checkbox" name="checkboxField1" value="true" checked="checked" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

fieldValuefalse'true'Object/StringThe actual HTML value attribute of the checkbox.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/CheckboxList.html b/docs/tags/CheckboxList.html deleted file mode 100644 index 2f1dd9caa..000000000 --- a/docs/tags/CheckboxList.html +++ /dev/null @@ -1,658 +0,0 @@ - - - -<ww:checkboxlist /> - - - - -

Tag Name: <ww:checkboxlist />

- -

Description

-

- -Render a list of checkboxes - -

- -

- Creates a series of checkboxes from a list. Setup is like <ww:select /> or <ww:radio />, but creates checkbox tags.

Examples

  <ww:checkboxlist name="foo" list="bar"/>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/ComboBox.html b/docs/tags/ComboBox.html deleted file mode 100644 index e3cad83ea..000000000 --- a/docs/tags/ComboBox.html +++ /dev/null @@ -1,694 +0,0 @@ - - - -<ww:combobox /> - - - - -

Tag Name: <ww:combobox />

- -

Description

-

- -Widget that fills a text box from a select - -

- -

- The combo box is basically an HTML INPUT of type text and HTML SELECT grouped together to give you a combo box functionality. You can place text in the INPUT control by using the SELECT control or type it in directly in the text field.

In this example, the SELECT will be populated from id=year attribute. Counter is itself an Iterator. It will span from first to last. The population is done via javascript, and requires that this tag be surrounded by a <form>.

Note that unlike the <ww:select/> tag, there is no ability to define the individual <option> tags' id attribute or content separately. Each of these is simply populated from the toString() method of the list item. Presumably this is because the select box isn't intended to actually submit useful data, but to assist the user in filling out the text field.

Examples

  JSP: <ww:bean name="webwork.util.Counter" id="year"> <ww:param name="first" value="text('firstBirthYear')"/> <ww:param name="last" value="2000"/> <ww:combobox label="Birth year" size="6" maxlength="4" name="birthYear" list="#year"/> </ww:bean> Velocity: #tag( ComboBox "label=Birth year" "size=6" "maxlength=4" "name=birthYear" "list=#year" )  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

listtrue Object/StringIteratable source to populate from. If this is missing, the select widget is simply not displayed.
maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Date.html b/docs/tags/Date.html deleted file mode 100644 index 4ba65be7b..000000000 --- a/docs/tags/Date.html +++ /dev/null @@ -1,118 +0,0 @@ - - - -<ww:date /> - - - - -

Tag Name: <ww:date />

- -

Description

-

- -Render a formatted date. - -

- -

- Format Date object in different ways.

The date tag will allow you to format a Date in a quick and easy way. You can specify a custom format (eg. "dd/MM/yyyy hh:mm"), you can generate easy readable notations (like "in 2 hours, 14 minutes"), or you can just fall back on a predefined format with key 'webwork.date.format' in your properties file. If that key is not defined, it will finally fall back to the default DateFormat.MEDIUM formatting. Note: If the requested Date object isn't found on the stack, a blank will be returned.

Configurable attributes are :-
  • name
  • nice
  • format

Following how the date component will work, depending on the value of nice attribute (which by default is false) and the format attribute.

Condition 1: With nice attribute as true
i18n key default
webwork.date.format.past {0} ago
webwork.date.format.future in {0}
webwork.date.format.seconds an instant
webwork.date.format.minutes {0,choice,1#one minute|1<{0} minutes}
webwork.date.format.hours {0,choice,1#one hour|1<{0} hours}{1,choice,0#|1#, one minute|1<, {1} minutes}
webwork.date.format.days {0,choice,1#one day|1<{0} days}{1,choice,0#|1#, one hour|1<, {1} hours}
webwork.date.format.years {0,choice,1#one year|1<{0} years}{1,choice,0#|1#, one day|1<, {1} days}

Condition 2: With nice attribute as false and format attribute is specified eg. dd/MM/yyyyy

In this case the format attribute will be used.

Condition 3: With nice attribute as false and no format attribute is specified
i18n key default
webwork.date.format if one is not found DateFormat.MEDIUM format will be used

Examples

  <ww:date name="person.birthday" format="dd/MM/yyyy" /> <ww:date name="person.birthday" format="%{getText('some.i18n.key')}" /> <ww:date name="person.birthday" nice="true" /> <ww:date name="person.birthday" />  
Date -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

formatfalse Object/StringDate or DateTime format pattern
nicefalsefalseBooleanWhether to print out the date nicely
nametrue StringThe date value to format
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/DatePicker.html b/docs/tags/DatePicker.html deleted file mode 100644 index 0260c9664..000000000 --- a/docs/tags/DatePicker.html +++ /dev/null @@ -1,748 +0,0 @@ - - - -<ww:datepicker /> - - - - -

Tag Name: <ww:datepicker />

- -

Description

-

- -Render datepicker - -

- -

- Renders datepicker element.

Implementation was changed in WebWork 2.2 to use jscalendar instead of non locale aware tigracalendar. Check locale and format settings if you used the old widget in your applications. Be sure to include proper stylesheet as described below if you don't want the calender widget to look transparent.

Important: Be sure to set the id attributs if not used within a <ww:form /> tag, as it takes care of setting the id for you, being required to copy selected date to text input element.

Following a reference for the format parameter (copied from jscalendar documentation):
%a abbreviated weekday name
%A full weekday name
%b abbreviated month name
%B full month name
%C century number
%d the day of the month ( 00 .. 31 )
%e the day of the month ( 0 .. 31 )
%H hour ( 00 .. 23 )
%I hour ( 01 .. 12 )
%j day of the year ( 000 .. 366 )
%k hour ( 0 .. 23 )
%l hour ( 1 .. 12 )
%m month ( 01 .. 12 )
%M minute ( 00 .. 59 )
%n a newline character
%p ``PM'' or ``AM''
%P ``pm'' or ``am''
%S second ( 00 .. 59 )
%s number of seconds since Epoch (since Jan 01 1970 00:00:00 UTC)
%t a tab character
%U, %W, %V the week number
%u the day of the week ( 1 .. 7, 1 = MON )
%w the day of the week ( 0 .. 6, 0 = SUN )
%y year without the century ( 00 .. 99 )
%Y year including the century ( ex. 1979 )
%% a literal % character

Examples

  Date in application's locale format: <ww:datepicker name="order.date" id="order.date" /> Date in german locale, with german texts: <ww:datepicker name="delivery.date" id="delivery.date" template="datepicker_js.ftl" language="de" /> Date in german locale, with german texts and custom date format, including time: <ww:datepicker name="invoice.date" id="invoice.date" template="datepicker_js.ftl" language="de" format="%d. %b &Y %H:%M" showstime="true" />  

If you use this jscalendar based datepicker widget, you might want to use one of the standard stylesheets provided with jscalendar (all distribution stylesheets are included in webwork jar). The easiest way to do so is to place the <ww:head/> tag in the head of your html page, as it takes care of including calendar css. Otherwise, to manually activate the calendar-blue style, include the following in your stylesheet definition:

  <link href="<ww:url value="/webwork/jscalendar/calendar-blue.css" />" rel="stylesheet" type="text/css" media="all"/>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

languagefalseThe language of the current LocaleStringThe language to use for the widget texts and localization presets.
formatfalseDateformat specified by language preset (%Y/%m/%d for en)StringThe format to use for date field.
showstimefalsefalseStringWhether time selector is to be shown. Valid values are "true", "false", "24" and "12".
singleclickfalsetrueBooleanWhether to use selected value after single or double click.
maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Debug.html b/docs/tags/Debug.html deleted file mode 100644 index 23b70dba2..000000000 --- a/docs/tags/Debug.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:debug /> - - - - -

Tag Name: <ww:debug />

- -

Description

-

- -Render debug tag - -

- -

-

Renders an debug tag.

The debug information contain mostly stack information:
  • Value Stack Contents
  • Stack Context

Examples

  <ww:debug/>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Div.html b/docs/tags/Div.html deleted file mode 100644 index bcf972b30..000000000 --- a/docs/tags/Div.html +++ /dev/null @@ -1,766 +0,0 @@ - - - -<ww:div /> - - - - -

Tag Name: <ww:div />

- -

Description

-

- -Render HTML div providing content from remote call via AJAX - -

- -

- The div tag is primarily an AJAX tag, providing a remote call from the current page to update a section of content without having to refresh the entire page.

It creates a HTML <DIV /> that obtains it's content via a remote XMLHttpRequest call via the dojo framework.

If a "listenTopics" is supplied, it will listen to that topic and refresh it's content when any message is received.

Important: Be sure to setup the page containing this tag to be Configured for AJAX

Examples

  <ww:div ... />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

updateFreqfalse0IntegerHow often to re-fetch the content (in milliseconds)
delayfalse0IntegerHow long to wait before fetching the content (in milliseconds)
loadingTextfalse Object/StringThe text to display to the user while the new content is being fetched (especially good if the content will take awhile)
listenTopicsfalse Object/StringTopic name to listen to (comma delimited), that will cause the DIV's content to be re-fetched
themefalse StringThe theme to use for the element. This tag will usually use the ajax theme.
hreffalse StringThe URL to call to obtain the content
errorTextfalse StringThe text to display to the user if the is an error fetching the content
showErrorTransportTextfalsefalseBooleanwhen to show the error message as content when the URL had problems
afterLoadingfalse StringJavascript code that will be executed after the content has been fetched
openTemplatefalse Object/StringSet template to use for opening the rendered html.
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/DoubleSelect.html b/docs/tags/DoubleSelect.html deleted file mode 100644 index 4e65366b1..000000000 --- a/docs/tags/DoubleSelect.html +++ /dev/null @@ -1,1288 +0,0 @@ - - - -<ww:doubleselect /> - - - - -

Tag Name: <ww:doubleselect />

- -

Description

-

- -Renders two HTML select elements with second one changing displayed values depending on selected entry of first one. - -

- -

- Renders two HTML select elements with second one changing displayed values depending on selected entry of first one.

Examples

  <ww:doubleselect label="doubleselect test1" name="menu" list="{'fruit','other'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" /> <ww:doubleselect label="doubleselect test2" name="menu" list="#{'fruit':'Nice Fruits', 'other':'Other Dishes'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

doubleListtrue Object/StringThe second iterable source to populate from.
doubleListKeyfalse Object/StringThe key expression to use for second list
doubleListValuefalse Object/StringThe value expression to use for second list
doubleNametrue Object/StringThe name for complete component
doubleValuefalse Object/StringThe value expression for complete component
formNamefalse Object/StringThe form name this component resides in and populates to
doubleCssClassfalse Object/StringThe css class for the second list
doubleCssStylefalse Object/StringThe css style for the second list
doubleHeaderKeyfalse Object/StringThe header key for the second list
doubleHeaderValuefalse Object/StringThe header value for the second list
doubleEmptyOptionfalse Object/StringDecides if the second list will add an empty option
doubleDisabledfalse Object/StringDecides if a disable attribute should be added to the second list
doubleIdfalse Object/StringThe id of the second list
doubleMultiplefalse Object/StringDecides if multiple attribute should be set on the second list
doubleOnblurfalse Object/StringSet the onblur attribute of the second list
doubleOnchangefalse Object/StringSet the onchange attribute of the second list
doubleOnclickfalse Object/StringSet the onclick attribute of the second list
doubleOndblclickfalse Object/StringSet the ondbclick attribute of the second list
doubleOnfocusfalse Object/StringSet the onfocus attribute of the second list
doubleOnkeydownfalse Object/StringSet the onkeydown attribute of the second list
doubleOnkeypressfalse Object/StringSet the onkeypress attribute of the second list
doubleOnkeyupfalse Object/StringSet the onkeyup attribute of the second list
doubleOnmousedownfalse Object/StringSet the onmousedown attribute of the second list
doubleOnmousemovefalse Object/StringSet the onmousemove attribute of the second list
doubleOnmouseoutfalse Object/StringSet the onmouseout attribute of the second list
doubleOnmouseoverfalse Object/StringSet the onmouseover attribute of the second list
doubleOnmouseupfalse Object/StringSet the onmouseup attribute of the second list
doubleOnselectfalse Object/StringSet the onselect attribute of the second list
doubleSizefalse Object/StringSet the size attribute of the second list
doubleListKeyfalse Object/StringSet the list key of the second attribute
emptyOptionfalsefalseBooleanDecides of an empty option is to be inserted in the second list
headerKeyfalse Object/StringSet the header key of the second list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringSet the header value of the second list
multiplefalse Object/StringCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Else.html b/docs/tags/Else.html deleted file mode 100644 index bffc14113..000000000 --- a/docs/tags/Else.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -<ww:else /> - - - - -

Tag Name: <ww:else />

- -

Description

-

- -Else tag - -

- -

-

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

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

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/ElseIf.html b/docs/tags/ElseIf.html deleted file mode 100644 index e9517d6d4..000000000 --- a/docs/tags/ElseIf.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:elseif /> - - - - -

Tag Name: <ww:elseif />

- -

Description

-

- -Elseif tag - -

- -

-

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

  • test* (Boolean) - Logic to determined if body of tag is to be displayed
  <ww:if test="%{false}"> <div>Will Not Be Executed</div> </ww:if> <ww:elseif test="%{true}"> <div>Will Be Executed</div> </ww:elseif> <ww:else> <div>Will Not Be Executed</div> </ww:else>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

testtrue BooleanExpression to determine if body of tag is to be displayed
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/FieldError.html b/docs/tags/FieldError.html deleted file mode 100644 index 622cdcffa..000000000 --- a/docs/tags/FieldError.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:fielderror /> - - - - -

Tag Name: <ww:fielderror />

- -

Description

-

- -Render field error (all or partial depending on param tag nested)if they exists - -

- -

- Render field errors if they exists. Specific layout depends on the particular theme.

Examples

  <!-- example 1 --> <ww:fielderror /> <!-- example 2 --> <ww:fielderror> <ww:param>field1</ww:param> <ww:param>field2</ww:param> </ww:fielderror> <ww:form .... >> .... </ww:form> OR <ww:fielderror> <ww:param value="%{'field1'}" /> <ww:param value="%{'field2'}" /> </ww:fielderror> <ww:form .... >> .... </ww:form>  

Description

  Example 1: display all field errors

Example 2: display field errors only for 'field1' and 'field2'

-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/File.html b/docs/tags/File.html deleted file mode 100644 index beecd960a..000000000 --- a/docs/tags/File.html +++ /dev/null @@ -1,640 +0,0 @@ - - - -<ww:file /> - - - - -

Tag Name: <ww:file />

- -

Description

-

- -Render a file input field - -

- -

- Renders an HTML file input element.

Examples

  <ww:file name="anUploadFile" accept="text/*" /> <ww:file name="anohterUploadFIle" accept="text/html,text/plain" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

acceptfalse Object/StringHTML accept attribute to indicate accepted file mimetypes
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Form.html b/docs/tags/Form.html deleted file mode 100644 index 7874e5fe5..000000000 --- a/docs/tags/Form.html +++ /dev/null @@ -1,784 +0,0 @@ - - - -<ww:form /> - - - - -

Tag Name: <ww:form />

- -

Description

-

- -Renders an input form - -

- -

- Renders HTML an input form.

The remote form allows the form to be submitted without the page being refreshed. The results from the form can be inserted into any HTML element on the page.

Examples

  <ww:form ... />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

onsubmitfalse Object/StringHTML onsubmit attribute
actionfalsecurrent actionObject/StringSet action nane to submit to, without .action suffix
targetfalse Object/StringHTML form target attribute
enctypefalse Object/StringHTML form enctype attribute
methodfalse Object/StringHTML form method attribute
namespacefalsecurrent namespaceObject/Stringnamespace for action to submit to
validatefalsefalseBooleanWhether client side/remote validation should be performed. Only useful with theme xhtml/ajax
portletModefalse Object/StringThe portlet mode to display after the form submit
windowStatefalse Object/StringThe window state to display after the form submit
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/GenericUIBean.html b/docs/tags/GenericUIBean.html deleted file mode 100644 index d3cf8e2ca..000000000 --- a/docs/tags/GenericUIBean.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:component /> - - - - -

Tag Name: <ww:component />

- -

Description

-

- -Render a custom ui widget - -

- -

- Renders an custom UI widget using the specified templates. Additional objects can be passed in to the template using the param tags. Objects provided can be retrieve from within the template via $parameters._paramname_.

In the bottom JSP and Velocity samples, two parameters are being passed in to the component. From within the component, they can be accessed as $parameters.get('key1') and $parameters.get('key2'). Velocity also allows you reference them as $parameters.key1 and $parameters.key2.

Currently, your custom UI components can be written in Velocity, JSP, or Freemarker, and the correct rendering engine will be found based on file extension.

Remember: the value params will always be resolved against the OgnlValueStack so if you mean to pass a string literal to your component, make sure to wrap it in quotes i.e. value="'value1'" otherwise, the the value stack will search for an Object on the stack with a method of getValue1(). (now that i've written this, i'm not entirely sure this is the case. i should verify this manana)

Examples

  JSP <ww:component template="/my/custom/component.vm"/> or <ww:component template="/my/custom/component.vm"> <ww:param name="key1" value="value1"/> <ww:param name="key2" value="value2"/> </ww:component> Velocity #tag( Component "template=/my/custom/component.vm" ) or #bodytag( Component "template=/my/custom/component.vm" ) #param( "key1" "value1" ) #param( "key2" "value2" ) #end  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Head.html b/docs/tags/Head.html deleted file mode 100644 index 556c31718..000000000 --- a/docs/tags/Head.html +++ /dev/null @@ -1,640 +0,0 @@ - - - -<ww:head /> - - - - -

Tag Name: <ww:head />

- -

Description

-

- -Render a chunk of HEAD for your HTML file - -

- -

- Renders parts of the HEAD section for an HTML file. This is useful as some themes require certain CSS and JavaScript includes.

If, for example, your page has ajax components integrated, without having the default theme set to ajax, you might want to use the head tag with theme="ajax" so that the typical ajax header setup will be included in the page.

The tag also includes the option to set a custom datepicker theme if needed. See calendarcss parameter for description for details.

If you use the ajax theme you can turn a debug flag on by setting the debug parameter to true.

Examples

  <head> <title>My page</title> <ww:head/> </head>  
  <head> <title>My page</title> <ww:head theme="ajax" calendarcss="calendar-green"/> </head>  
  <head> <title>My page</title> <ww:head theme="ajax" debug="true"/> </head>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

calendarcssfalse Object/StringThe jscalendar css theme to use" default="calendar-blue.css
debugfalse Object/StringSet to true to enable debugging mode for AJAX themes
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Hidden.html b/docs/tags/Hidden.html deleted file mode 100644 index 6d67cf1c4..000000000 --- a/docs/tags/Hidden.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:hidden /> - - - - -

Tag Name: <ww:hidden />

- -

Description

-

- -Render a hidden input field - -

- -

- Renders an HTML input element of type hidden, populated by the specified property from the OgnlValueStack.

Examples

  <-- example one --> <ww:hidden name="foo" /> <-- example two --> <ww:hidden name="foo" value="bar" /> Example One Resulting HTML (if foo evaluates to bar): <input type="hidden" name="foo" value="bar" /> Example Two Resulting HTML (if getBar method of the action returns 'bar') <input type="hidden" name="foo" value="bar" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/I18n.html b/docs/tags/I18n.html deleted file mode 100644 index fc15fe495..000000000 --- a/docs/tags/I18n.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:i18n /> - - - - -

Tag Name: <ww:i18n />

- -

Description

-

- -Get a resource bundle and place it on the value stack - -

- -

- Gets a resource bundle and place it on the value stack. This allows the text tag to access messages from any bundle, and not just the bundle associated with the current action.

  • name* - the resource bundle's name (eg foo/bar/customBundle)

Example:

  <ww:i18n name="myCustomBundle"> The i18n value for key aaa.bbb.ccc in myCustomBundle is <ww:property value="text('aaa.bbb.ccc')" /> </ww:i18n>  
  <ww:i18n name="some.package.bundle" > <ww:text name="some.key" /> </ww:i18n>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

nametrueStringObject/StringName of ressource bundle to use (eg foo/bar/customBundle)
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/If.html b/docs/tags/If.html deleted file mode 100644 index c7f8a59e7..000000000 --- a/docs/tags/If.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:if /> - - - - -

Tag Name: <ww:if />

- -

Description

-

- -If tag - -

- -

-

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

  • test* (Boolean) - Logic to determined if body of tag is to be displayed
  <ww:if test="%{false}"> <div>Will Not Be Executed</div> </ww:if> <ww:elseif test="%{true}"> <div>Will Be Executed</div> </ww:elseif> <ww:else> <div>Will Not Be Executed</div> </ww:else>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

testtrue BooleanExpression to determine if body of tag is to be displayed
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Include.html b/docs/tags/Include.html deleted file mode 100644 index 366a7aa6d..000000000 --- a/docs/tags/Include.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:include /> - - - - -

Tag Name: <ww:include />

- -

Description

-

- -Include a servlet's output (result of servlet or a JSP page) - -

- -

-

Include a servlet's output (result of servlet or a JSP page).

  • value* (String) - jsp page to be included

Examples

  <-- One: --> <ww:include value="myJsp.jsp" /> <-- Two: --> <ww:include value="myJsp.jsp"> <ww:param name="param1" value="value2" /> <ww:param name="param2" value="value2" /> </ww:include> <-- Three: --> <ww:include value="myJsp.jsp"> <ww:param name="param1">value1</ww:param> <ww:param name="param2">value2<ww:param> </ww:include>   Example one - do an include myJsp.jsp page Example two - do an include to myJsp.jsp page with parameters param1=value1 and param2=value2 Example three - do an include to myJsp.jsp page with parameters param1=value1 and param2=value2  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

valuetrue StringThe jsp/servlet output to include
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/IteratorComponent.html b/docs/tags/IteratorComponent.html deleted file mode 100644 index acafcda60..000000000 --- a/docs/tags/IteratorComponent.html +++ /dev/null @@ -1,100 +0,0 @@ - - - -<ww:iterator /> - - - - -

Tag Name: <ww:iterator />

- -

Description

-

- -Iterate over a iterable value - -

- -

-

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.

  • status (String) - if specified, an instanceof IteratorStatus will be pushed into stack upon each iteration
  • value (Object) - the source to iterate over, must be iteratable, else an the object itself will be put into a newly created List (see MakeIterator#convert(Object)
  • id (String) - if specified the current iteration object will be place with this id in webwork stack's context scope

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

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

The following example uses a {@link Bean} tag and places it into the ActionContext. The iterator tag will retrieve that object from the ActionContext and then calls its getDays() method as above. The status attribute is also used to create a {@link IteratorStatus} object, which in this example, its odd() method is used to alternate row colours:

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

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

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

The next example will further demonstrate the use of the status attribute, using a DAO obtained from the action class through OGNL, iterating over groups and their users (in a security context). The last() method indicates if the current object is the last available in the iteration, and if not, we need to seperate the users using a comma:

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

The next example iterates over a an action collection and passes every iterator value to another action. The trick here lies in the use of the '[0]' operator. It takes the current iterator value and passes it on to the edit action. Using the '[0]' operator has the same effect as using >ww:property />. (The latter, however, does not work from inside the param tag).

  <ww:action name="entries" id="entries"/> <ww:iterator value="#entries.entries" > <ww:property value="name" /> <ww:property /> <ww:push value="..."> <ww:action name="edit" id="edit" > <ww:param name="entry" value="[0]" /> </ww:action> </push> </ww:iterator>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

statusfalsefalseBooleanif specified, an instanceof IteratorStatus will be pushed into stack upon each iteration
valuefalse Object/Stringthe iteratable source to iterate over, else an the object itself will be put into a newly created List
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/IteratorGeneratorTag.html b/docs/tags/IteratorGeneratorTag.html deleted file mode 100644 index 1db0246e1..000000000 --- a/docs/tags/IteratorGeneratorTag.html +++ /dev/null @@ -1,136 +0,0 @@ - - - -<ww:generator /> - - - - -

Tag Name: <ww:generator />

- -

Description

-

- -Generate an iterator for a iterable source. - -

- -

- NOTE: JSP-TAG

Generate an iterator based on the val attribute supplied.

NOTE: The generated iterator will ALWAYS be pushed into the top of the stack, and poped at the end of the tag.
  • val* (Object) - the source to be parsed into an iterator
  • count (Object) - the max number (Integer, Float, Double, Long, String) entries to be in the iterator
  • separator (String) - the separator to be used in separating the val into entries of the iterator
  • id (String) - the id to store the resultant iterator into page context, if such id is supplied
  • converter (Object) - the converter (must extends off IteratorGenerator.Converter interface) to convert the String entry parsed from val into an object
Example One:
 Generate a simple iterator <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}"> <ww:iterator> <ww:property /><br/> </ww:iterator> </ww:generator> 
This generates an iterator and print it out using the iterator tag. Example Two:
 Generate an iterator with count attribute <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3"> <ww:iterator> <ww:property /><br/> </ww:iterator> </ww:generator> 
This generates an iterator, but only 3 entries will be available in the iterator generated, namely aaa, bbb and ccc respectively because count attribute is set to 3 Example Three:
 Generate an iterator with id attribute <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" /> <% Iterator i = (Iterator) pageContext.getAttribute("myAtt"); while(i.hasNext()) { String s = (String) i.next(); %> <%=s%> <br/> <% } %> 
This generates an iterator and put it in the PageContext under the key as specified by the id attribute. Example Four:
 Generate an iterator with comparator attribute <ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}"> <ww:iterator> <ww:property /><br/> </ww:iterator> </ww:generator> public class GeneratorTagAction extends ActionSupport { .... public Converter getMyConverter() { return new Converter() { public Object convert(String value) throws Exception { return "converter-"+value; } }; } ... } 
This will generate an iterator with each entries decided by the converter supplied. With this converter, it simply add "converter-" to each entries. -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

countfalse Integerthe max number entries to be in the iterator
separatortrue Stringthe separator to be used in separating the val into entries of the iterator
valtrue Object/Stringthe source to be parsed into an iterator
converterfalse com.opensymphony.webwork.util.IteratorGenerator.Converterthe converter to convert the String entry parsed from val into an object
idfalse Stringthe id to store the resultant iterator into page context, if such id is supplied
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Label.html b/docs/tags/Label.html deleted file mode 100644 index 50463a851..000000000 --- a/docs/tags/Label.html +++ /dev/null @@ -1,622 +0,0 @@ - - - -<ww:label /> - - - - -

Tag Name: <ww:label />

- -

Description

-

- -Render a label that displays read-only information - -

- -

- Renders an HTML LABEL that will allow you to output label:name combination that has the same format treatment as the rest of your UI controls.

Examples

In this example, a label is rendered. The label is retrieved from a ResourceBundle by calling ActionSupport's getText() method giving you an output of 'User Name:tm_jee'. Assuming that i18n message user_name corresponds to 'User Name' and the action's getUserName() method returns 'tm_jee'

  <ww:label label="%{text('user_name')}" name="userName" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

forfalse Object/StringHTML for attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/MergeIterator.html b/docs/tags/MergeIterator.html deleted file mode 100644 index 76553a02d..000000000 --- a/docs/tags/MergeIterator.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -<ww:merge /> - - - - -

Tag Name: <ww:merge />

- -

Description

-

- -Merge the values of a list of iterators into one iterator - -

- -

-

Component for MergeIteratorTag, which job is to merge iterators and successive call to the merged iterator will cause each merge iterator to have a chance to expose its element, subsequently next call will allow the next iterator to expose its element. Once the last iterator is done exposing its element, the first iterator is allowed to do so again (unless it is exhausted of entries).

Internally the task are delegated to MergeIteratorFilter

Example if there are 3 lists being merged, each list have 3 entries, the following will be the logic.

  1. Display first element of the first list
  2. Display first element of the second list
  3. Display first element of the third list
  4. Display second element of the first list
  5. Display second element of the second list
  6. Display second element of the third list
  7. Display third element of the first list
  8. Display thrid element of the second list
  9. Display third element of the thrid list
  • id (String) - the id where the resultant merged iterator will be stored in the stack's context
public class MergeIteratorTagAction extends ActionSupport { private List myList1; private List myList2; private List myList3; public List getMyList1() { return myList1; } public List getMyList2() { return myList2; } public List getMyList3() { return myList3; } public String execute() throws Exception { myList1 = new ArrayList(); myList1.add("1"); myList1.add("2"); myList1.add("3"); myList2 = new ArrayList(); myList2.add("a"); myList2.add("b"); myList2.add("c"); myList3 = new ArrayList(); myList3.add("A"); myList3.add("B"); myList3.add("C"); return "done"; } } <ww:merge id="myMergedIterator1"> <ww:param value="%{myList1}" /> <ww:param value="%{myList2}" /> <ww:param value="%{myList3}" /> </ww:merge> <ww:iterator value="%{#myMergedIterator1}"> <ww:property /> </ww:iterator> This wil generate "1aA2bB3cC". -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

idfalse Object/Stringthe id where the resultant merged iterator will be stored in the stack's context
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/OptionTransferSelect.html b/docs/tags/OptionTransferSelect.html deleted file mode 100644 index ac0104e01..000000000 --- a/docs/tags/OptionTransferSelect.html +++ /dev/null @@ -1,1540 +0,0 @@ - - - -<ww:optiontransferselect /> - - - - -

Tag Name: <ww:optiontransferselect />

- -

Description

-

- -Renders an input form - -

- -

- Create a option transfer select component which is basically two <select ...> tag with buttons in the middle of them allowing options in each of the <select ...> to be moved between themselves. Will auto-select all its elements upon its containing form submision.

NOTE: The id and doubleId need not be supplied as they will generated provided that the optiontransferselect tag is being used in a form tag. The generated id and doubleId will be <form_id>_<optiontransferselect_doubleName> and <form_id>_<optiontransferselect_doubleName> respectively.

  <-- minimum configuration --> <ww:optiontransferselect label="Favourite Cartoons Characters" name="leftSideCartoonCharacters" list="{'Popeye', 'He-Man', 'Spiderman'}" doubleName="rightSideCartoonCharacters" doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}" /> <-- possible configuration --> <ww:optiontransferselect label="Favourite Cartoons Characters" name="leftSideCartoonCharacters" leftTitle="Left Title" rightTitle="Right Title" list="{'Popeye', 'He-Man', 'Spiderman'}" multiple="true" headerKey="headerKey" headerValue="--- Please Select ---" emptyOption="true" doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}" doubleName="rightSideCartoonCharacters" doubleHeaderKey="doubleHeaderKey" doubleHeaderValue="--- Please Select ---" doubleEmptyOption="true" doubleMultiple="true" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

addAllToLeftLabelfalse Object/Stringset Add To Left button label
addAllToRightLabelfalse Object/Stringset Add All To Right button label
addToLeftLabelfalse Object/Stringset Add To Left button label
addToRightLabelfalse Object/Stringset Add To Right button label
allowAddAllToLeftfalse Object/Stringenable Add All To Left button
allowAddAllToRightfalse Object/Stringenable Add All To Right button
allowAddToLeftfalse Object/Stringenable Add To Left button
allowAddToRightfalse Object/Stringenable Add To Right button
leftTitlefalse Object/Stringset Left title
rightTitlefalse Object/Stringset Right title
allowSelectAllfalse Object/Stringenable Select All button
selectAllLabelfalse Object/Stringset Select All button label
buttonCssClassfalse Object/Stringset buttons css class
buttonCssStylefalse Object/Stringset button css style
doubleListtrue Object/StringThe second iterable source to populate from.
doubleListKeyfalse Object/StringThe key expression to use for second list
doubleListValuefalse Object/StringThe value expression to use for second list
doubleNametrue Object/StringThe name for complete component
doubleValuefalse Object/StringThe value expression for complete component
formNamefalse Object/StringThe form name this component resides in and populates to
doubleCssClassfalse Object/StringThe css class for the second list
doubleCssStylefalse Object/StringThe css style for the second list
doubleHeaderKeyfalse Object/StringThe header key for the second list
doubleHeaderValuefalse Object/StringThe header value for the second list
doubleEmptyOptionfalse Object/StringDecides if the second list will add an empty option
doubleDisabledfalse Object/StringDecides if a disable attribute should be added to the second list
doubleIdfalse Object/StringThe id of the second list
doubleMultiplefalse Object/StringDecides if multiple attribute should be set on the second list
doubleOnblurfalse Object/StringSet the onblur attribute of the second list
doubleOnchangefalse Object/StringSet the onchange attribute of the second list
doubleOnclickfalse Object/StringSet the onclick attribute of the second list
doubleOndblclickfalse Object/StringSet the ondbclick attribute of the second list
doubleOnfocusfalse Object/StringSet the onfocus attribute of the second list
doubleOnkeydownfalse Object/StringSet the onkeydown attribute of the second list
doubleOnkeypressfalse Object/StringSet the onkeypress attribute of the second list
doubleOnkeyupfalse Object/StringSet the onkeyup attribute of the second list
doubleOnmousedownfalse Object/StringSet the onmousedown attribute of the second list
doubleOnmousemovefalse Object/StringSet the onmousemove attribute of the second list
doubleOnmouseoutfalse Object/StringSet the onmouseout attribute of the second list
doubleOnmouseoverfalse Object/StringSet the onmouseover attribute of the second list
doubleOnmouseupfalse Object/StringSet the onmouseup attribute of the second list
doubleOnselectfalse Object/StringSet the onselect attribute of the second list
doubleSizefalse Object/StringSet the size attribute of the second list
doubleListKeyfalse Object/StringSet the list key of the second attribute
emptyOptionfalsefalseBooleanDecides of an empty option is to be inserted in the second list
headerKeyfalse Object/StringSet the header key of the second list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringSet the header value of the second list
multiplefalse Object/StringCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Panel.html b/docs/tags/Panel.html deleted file mode 100644 index 09dcacf37..000000000 --- a/docs/tags/Panel.html +++ /dev/null @@ -1,820 +0,0 @@ - - - -<ww:panel /> - - - - -

Tag Name: <ww:panel />

- -

Description

-

- -Render a panel for tabbedPanel - -

- -

- Render a panel for tabbedPanel.

Examples See the example in {@link TabbedPanel}.

-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

tabNametrue Object/StringThe text of the tab to display in the header tab list
subscribeTopicNamefalse Object/StringSet subscribeTopicName attribute
remotefalsefalseBooleandetermines whether this is a remote panel (ajax) or a local panel (content loaded into visible/hidden containers)
updateFreqfalse0IntegerHow often to re-fetch the content (in milliseconds)
delayfalse0IntegerHow long to wait before fetching the content (in milliseconds)
loadingTextfalse Object/StringThe text to display to the user while the new content is being fetched (especially good if the content will take awhile)
listenTopicsfalse Object/StringTopic name to listen to (comma delimited), that will cause the DIV's content to be re-fetched
themefalse StringThe theme to use for the element. This tag will usually use the ajax theme.
hreffalse StringThe URL to call to obtain the content
errorTextfalse StringThe text to display to the user if the is an error fetching the content
showErrorTransportTextfalsefalseBooleanwhen to show the error message as content when the URL had problems
afterLoadingfalse StringJavascript code that will be executed after the content has been fetched
openTemplatefalse Object/StringSet template to use for opening the rendered html.
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Param.html b/docs/tags/Param.html deleted file mode 100644 index 20e54a738..000000000 --- a/docs/tags/Param.html +++ /dev/null @@ -1,100 +0,0 @@ - - - -<ww:param /> - - - - -

Tag Name: <ww:param />

- -

Description

-

- -Parametrize other tags - -

- -

-

This tag can be used to parameterize other tags.

The include tag and bean tag are examples of such tags.

The parameters can be added with or without a name as key. If the tag provides a name attribute the parameters are added using the {@link Component#addParameter(String, Object) addParamter} method. For unnamed parameters the Tag must implement the {@link UnnamedParametric} interface defined in this class (e.g. The TextTag does this).

This tag has the following two paramters.

  • name (String) - the name of the parameter
  • value (Object) - the value of the parameter

Note: When you declare the param tag, the value can be defined in either a value attribute or as text between the start and end tag. WebWork behaves a bit different according to these two situations. This is best illustrated using an example:
<param name="color">blue</param> <-- (A) -->
<param name="color" value="blue"/> <-- (B) -->
In the first situation (A) the value would be evaluated to the stack as a java.lang.String object. And in situation (B) the value would be evaluated to the stack as a java.lang.Object object.
For more information see WW-808.

Examples

 <ui:component> <ui:param name="key" value="[0]"/> <ui:param name="value" value="[1]"/> <ui:param name="context" value="[2]"/> </ui:component> 

where the key will be the identifier and the value the result of an OGNL expression run against the current OgnlValueStack.

This second example demonstrates how the text tag can use parameters from this param tag.

 <ww:text name="cart.total.cost"> <ww:param value="#session.cartTotal"/> </ww:text> 

-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

namefalse StringName of Parameter to set
valuefalseThe value of evaluating provided name against stackObject/StringValue expression for Parameter to set
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Password.html b/docs/tags/Password.html deleted file mode 100644 index cf1c2fce7..000000000 --- a/docs/tags/Password.html +++ /dev/null @@ -1,712 +0,0 @@ - - - -<ww:password /> - - - - -

Tag Name: <ww:password />

- -

Description

-

- -Render an HTML input tag of type password - -

- -

- Render an HTML input tag of type password.

Examples

In this example, a password control is displayed. For the label, we are calling ActionSupport's getText() to retrieve password label from a resource bundle.

  <ww:password label="%{text('password')}" name="password" size="10" maxlength="15" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

showPasswordfalsefalseBooleanWhether to show input
showfalse Object/StringDeprecated. Use showPassword instead.
maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Property.html b/docs/tags/Property.html deleted file mode 100644 index dfe2087cd..000000000 --- a/docs/tags/Property.html +++ /dev/null @@ -1,118 +0,0 @@ - - - -<ww:property /> - - - - -

Tag Name: <ww:property />

- -

Description

-

- -Print out expression which evaluates against the stack - -

- -

- Used to get the property of a value, which will default to the top of the stack if none is specified.

  • default (String) - The default value to be used if value attribute is null
  • escape (Boolean) - Escape HTML. Default to true
  • value (Object) - value to be displayed
         
  Example 1 prints the result of myBean's getMyBeanProperty() method. Example 2 prints the result of myBean's getMyBeanProperty() method and if it is null, print 'a default value' instead.  
  <ww:property value="getText('some.key')" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

defaultfalse StringThe default value to be used if value attribute is null
escapefalsetrueBooleanWhether to escape HTML
valuefalse<top of stack>Objectvalue to be displayed
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Push.html b/docs/tags/Push.html deleted file mode 100644 index 8d1b1a3b4..000000000 --- a/docs/tags/Push.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:push /> - - - - -

Tag Name: <ww:push />

- -

Description

-

- -Push value on stack for simplified usage. - -

- -

-

Push value on stack for simplified usage.

  • value* (Object) - value to be pushed into the top of the stack

Examples

  <ww:push value="user"> <ww:propery value="firstName" /> <ww:propery value="lastName" /> </ww:push>  
Pushed user into the stack, and hence property tag could access user's properties (firstName, lastName etc) since user is not at the top of the stack
  <ww:push value="myObject"> ----- (1) <ww:bean name="jp.SomeBean" id="myBean"/> ----- (2) <ww:param name="myParam" value="top"/> ----- (3) </ww:bean> </ww:push>  
  when in (1), myObject is at the top of the stack when in (2), jp.SomeBean is in the top of stack, also in stack's context with key myBean when in (3), top will get the jp.SomeBean instance  
  <ww:push value="myObject"> ---(A) <ww:bean name="jp.SomeBean" id="myBean"/> ---(B) <ww:param name="myParam" value="top.mySomeOtherValue"/> ---(C) </ww:bean> </ww:push>  
  when in (A), myObject is at the top of the stack when in (B), jp.SomeBean is at the top of the stack, also in context with key myBean when in (C), top refers to jp.SomeBean instance. so top.mySomeOtherValue would invoke SomeBean's mySomeOtherValue() method  
  <ww:push value="myObject"> ---- (i) <ww:bean name="jp.SomeBean" id="myBean"/> ---- (ii) <ww:param name="myParam" value="[1].top"/> -----(iii) </ww:bean> </ww:push>  
  when in (i), myObject is at the top of the stack when in (ii), jp.SomeBean is at the top of the stack, followed by myObject when in (iii), [1].top will returned top of the cut of stack starting from myObject, namely myObject itself  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

valuetrue Object/StringValue to push on stack
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Radio.html b/docs/tags/Radio.html deleted file mode 100644 index e21fe2fd5..000000000 --- a/docs/tags/Radio.html +++ /dev/null @@ -1,658 +0,0 @@ - - - -<ww:radio /> - - - - -

Tag Name: <ww:radio />

- -

Description

-

- -Renders a radio button input field - -

- -

- Render a radio button input field.

Examples

In this example, a radio control is displayed with a list of genders. The gender list is built from attribute id=genders. WW calls getGenders() which will return a Map. For examples using listKey and listValue attributes, see the section select tag. The default selected one will be determined (in this case) by the getMale() method in the action class which should retun a value similar to the key of the getGenters() map if that particular gender is to be selected.

  <ww:action name="GenderMap" id="genders"/> <ww:radio label="Gender" name="male" list="#genders.genders"/>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Reset.html b/docs/tags/Reset.html deleted file mode 100644 index 7e76a2880..000000000 --- a/docs/tags/Reset.html +++ /dev/null @@ -1,676 +0,0 @@ - - - -<ww:reset /> - - - - -

Tag Name: <ww:reset />

- -

Description

-

- -Render a reset button - -

- -

- Render a reset button. The reset tag is used together with the form tag to provide form resetting. The reset can have two different types of rendering:

  • input: renders as html <input type="reset"...>
  • button: renders as html <button type="reset"...>
Please note that the button type has advantages by adding the possibility to seperate the submitted value from the text shown on the button face, but has issues with Microsoft Internet Explorer at least up to 6.0

Examples

  <ww:reset value="%{'Reset'}" />  
  Render an button reset: <ww:reset type="button" value="%{'Reset'}" label="Reset the form"/>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

labelfalse Object/StringSupply a reset button text apart from reset value. Will have no effect for input type reset, since button text will always be the value parameter.
actionfalse StringSet action attribute.
methodfalse StringSet method attribute.
alignfalse StringHTML align attribute.
typefalseinputStringThe type of submit to use. Valid values are input, button and image.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/RichTextEditor.html b/docs/tags/RichTextEditor.html deleted file mode 100644 index 462cf75b2..000000000 --- a/docs/tags/RichTextEditor.html +++ /dev/null @@ -1,1594 +0,0 @@ - - - -<ww:richtexteditor /> - - - - -

Tag Name: <ww:richtexteditor />

- -

Description

-

- -Render a rich text editor element - -

- -

- Create a Rich Text Editor based on FCK editor (www.fckeditor.net).

  <ww:richtexteditor toolbarCanCollapse="false" width="700" label="Description 1" name="description1" value="Some Content I keyed In In The Tag Itself" />  
It is possible to have a rich text editor do server side browsing when for example the image button is clicked. To integrate this functionality with webwork, one need to defined the following action definition typically in xwork.xml
 <package name="richtexteditor-browse" extends="webwork-default" namespace="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp"> <action name="connector" class="com.opensymphony.webwork.components.DefaultRichtexteditorConnector" method="browse"> <result name="getFolders" type="richtexteditorGetFolders" /> <result name="getFoldersAndFiles" type="richtexteditorGetFoldersAndFiles" /> <result name="createFolder" type="richtexteditorCreateFolder" /> <result name="fileUpload" type="richtexteditorFileUpload" /> </action> </package> 
By default whenever a browse command is triggered (eg. by clicking on the 'image' button and then 'browse server' button, the url '/webwork/static/richtexteditor/editor/filemanager/browser/default/browser.html?&Type=Image&Connector=connectors/jsp/connector.action'. The page browser.html which comes with FCK Editor will trigger the url '/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp/connector.action' which will caused the webwork's DefaultRichtexteditorConnector to be executed. The trigerring url could be changed by altering the 'imageBrowseURL'. There 3 types of such related url, namely 'imageBrowseURL', 'linkBrowseURL' and 'flashBrowseURL'. It is recomended that the default one being used. One could change the Connector parameter instead. For example
 /webwork/static/richtexteditor/editor/filemanager/browser/default/browser.html? &Type=Image&Connector=connectors/jsp/connector.action 
could be changed to
 /webwork/static/richtexteditor/editor/filemanager/browser/default/browser.html? &Type=Image&Connector=myLittlePath/myConnector.action 
In this case the action will need to have a namespace of '/webwork/richtexteditor/editor/filemanager/browser/default/myLittlePath' and action name of 'myConnector'

By default the action method that needs to be defined in xwork.xml needs to be 'browse'. If this needs to be something else say, myBrowse, the following could be used

 public String myBrowse() { browse(); } 

It is possible for the richtexteditor to do server side uploading as well. For example when clicking on the 'Image' button and then the 'Upload' tab and then selecting a file from client local machine and the clicking 'Send it to the server'. To integrate this functionality with webwork, one need to defined the following action definition typically in xwork.xml

 <package name="richtexteditor-upload" extends="webwork-default" namespace="/webwork/richtexteditor/editor/filemanager/upload"> <action name="uploader" class="com.opensymphony.webwork.components.DefaultRichtexteditorConnector" method="upload"> <result name="richtexteditorFileUpload" /> </action> </package> 
By default whenever an upload command is triggered, a '/webwork/static/richtexteditor/editor/filemanager/upload/uploader.action?Type=Image' will be issued. This could be changed by setting the imageUploadURL attribute of the tag. When this link is issued, the webwork action will get executed. There's 3 such related upload url namely, 'imageUploadURL', 'linkUploadURL' and 'flashUploadURL'. It is recomended that the default one being used. However one could change the url, but need to include the Type parameter. For example
 /webwork/static/richtexteditor/editor/filemanager/upload/uploader.action?Type=Image 
could be changed to
 /webwork/static/richtexteditor/editor/filemanager/upload/aDifferentUploader.action?Type=Image 
In this case the action will need to have a namespace of '/webwork/static/richtexteditor/editor/filemanager/upload' and action name of 'aDifferentUploader' By default the action method that needs to be defined in xwork.xml needs to be 'upload'. If this needs to be something else say, myUpload, the following could be used
 public String myUpload() { upload(); } 
The webwork action that handles the server-side browsing and uploading needs to extends from AbstractRichtexteditorConnector. There are four abstract methods need to be implemented, namely

 protected abstract String calculateServerPath(String serverPath, String folderPath, String type) throws Exception; protected abstract Folder[] getFolders(String virtualFolderPath, String type) throws Exception; protected abstract FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, String type) throws Exception; protected abstract CreateFolderResult createFolder(String virtualFolderPath, String type, String newFolderName) throws Exception; protected abstract FileUploadResult fileUpload(String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) throws Exception; protected abstract void unknownCommand(String command, String virtualFolderPath, String type, String filename, String contentType, java.io.File newFile) throws Exception; 
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

checkBrowserfalsetrueBooleanWhether the rich text editor should check for browser compatibility when rendering its toolbar
displayErrorfalsetrueBooleanWhether should the rich text editor display error when it fails to render etc.
autoDetectLanguagefalsetrueBooleanTells the editor to automatically detect the user language preferences to adapt its interface language. With Internet Explorer, the language configured in the Windows Control Panel is used. With Firefox, the browser language is used
baseHreffalse StringBase URL used to resolve links (on images, links, styles, etc.). For example, if BaseHref is set to 'http://www.fredck.com', an image that points to "/images/Logo.gif" will be interpreted by the editor as "http://www.fredck.com/images/Logo.gif", without touching the "src" attribute of the image.
basePathfalse/webwork/static/richtexteditor/StringSet the dir where the FCKeditor files reside on the server
contentLangDirectionfalseltrStringSets the direction of the editor area contents. Either ltr or rtl
customConfigurationsPathfalse StringSet the path of a custom file that can override some configurations. It is recommended to use absolute paths (starting with /), like /myfckconfig.js.
debugfalsefalseBooleanEnables the debug window to be shown when calling the FCKDebug.Output() function.
defaultLanguagefalseenStringSets the default language used for the editor's interface localization. The default language is used when the AutoDetectLanguage options is disabled or when the user language is not available.
editorAreaCSSfalsecss/fck_editorarea.cssStringSet the CSS styles file to be used in the editing area. In this way you can point to a file that reflects your web site styles
enableSourceXHTMLfalsetrueStringTells the editor to process the HTML source to XHTML when switching from WYSIWYG to Source view
enableXHTMLfalsetrueStringTells the editor to process the HTML source to XHTML on form post.
fillEmptyBlocksfalsetrueStringBlock elements (like P, DIV, H1, PRE, etc...) are forced to have content (a &nbsp;). Empty blocks are "collapsed" by while browsing, so a empty <p></p> is not visible. While editing, the editor "expand" empty blocks so you can insert content inside then. Setting this option to "true" results useful to reflect the same output when browsing and editing.
flashBrowserURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ browser/default/browser.html? Type=Flash& Connector=connectors/jsp/connector.actionStringSets the URL of the page called when the user clicks the 'Browse Server' button in the "Flash" dialog window. In this way, you can create your custom Flash Browser that is well integrated with your system.
flashUploadURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ upload/uploader.action? Type=FlashstringSets the URL of the upload handler called when the user clicks the 'Send it to server' button in the "Flash" dialog window. In this way, you can create your custom Flash Uploader that is well integrated with your system.
fontColorsfalse000000, 993300, 333300, 003300, 003366, 000080, 333399, 333333, 800000, FF6600, 808000, 808080, 008080, 0000FF, 666699, 808080, FF0000, FF9900, 99CC00, 339966, 33CCCC, 3366FF, 800080, 999999, FF00FF, FFCC00, FFFF00, 00FF00, 00FFFF, 00CCFF, 993366, C0C0C0, FF99CC, FFCC99, FFFF99, CCFFCC, CCFFFF, 99CCFF, CC99FF, FFFFFFstringSets the colors that must be shown in the colors panels (in the toolbar).
fontFormatsfalsep; div; pre; address; h1; h2; h3; h4; h5; h6stringSets the list of formats to be shown in the "Format" toolbar command.
fontNamesfalseArial; Comic Sans MS; Courier New; Tahoma; Times New Roman; VerdanastringSets the list of fonts to be shown in the "Font" toolbar command.
fontSizesfalse1/xx-small; 2/x-small; 3/small; 4/medium; 5/large; 6/x-large; 7/xx-largestringSets the list of font sizes to be shown in the "Size" toolbar command.
forcePasteAsPlainTextfalsefalsebooleanConverts the clipboard contents to pure text on pasting operations
forceSimpleAmpersandfalsefalsebooleanForces the ampersands (&) on tags attributes to not be converted to '&amp;' This conversion is a W3C requirement for XHTML, so it is recommended to leave this option to 'false'.
formatIndentatorfalse' 'booleanSets the characters to be used when indenting the HTML source when formatting it. Useful values are a sequence of spaces (' ') or a tab char ('\t').
formatOutputfalsetruebooleanThe output HTML generated by the editor will be processed and formatted.
formatSourcefalsetruebooleanThe HTML shown by the editor, while switching from WYSIWYG to Source views, will be processed and formatted
fullPagefalsefalsebooleanEnables full page editing (from <HTML> to </HTML>). It also enables the 'Page Properties' toolbar button.
geckoUseSPANfalsetruebooleanTells Gecko browsers to use SPAN instead of <B>, <I> and <U> for bold, italic an underline
heightfalse200stringSet the height of the rich text editor
imageBrowserURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ browser/default/browser.html? Type=Image& Connector=connectors/jsp/connector.actionstringSets the URL of the page called when the user clicks the 'Browse Server' button in the 'Image' dialog window. In this way, you can create your custom Image Browser that is well integrated with your system.
imageUploadURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ upload/uploader.action? Type=ImagestringSets the URL of the upload handler called when the user clicks the 'Send it to server' button in the 'Image' dialog window. In this way, you can create your custom Image Uploader that is well integrated with your system.
linkBrowserURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ browser/default/browser.html? Type=File& Connector=connectors/jsp/connector.actionstringSets the URL of the page called when the user clicks the 'Browse Server' button in the 'Link' dialog window. In this way, you can create your custom File Browser that is well integrated with your system.
linkUploadURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ upload/uploader.action? Type=FilestringSets the URL of the upload handler called when the user clicks the 'Send it to server' button in the 'Link' dialog window. In this way, you can create your custom Link Uploader that is well integrated with your system.
pluginsPathfalse/webwork/static/richtexteditor/plugins/stringSets the base path used when looking for registered plugins.
skinPathfalse/webwork/static/richtexteditor/skins/defaultstringSets the path to the skin (graphical interface settings) to be used by the editor.
startupFocusfalsefalsebooleanForces the editor to get the keyboard input focus on startup (page load)
stylesXmlPathfalse/webwork/static/richtexteditor/fckstyles.xmlstringSets the path to the XML file that has the definitions and rules of the styles used by the 'Style' toolbar command
tabSpacesfalse0stringSet the number of spaces (&nbsp) to be inserted when the user hits the 'tab' key. This is an Internet Explorer only feature. Other browsers insert spaces automatically by default.
toolbarCanCollapsefalsetruebooleanTells the editor that the toolbar can be Collapsed/Expanded by the user when clicking the vertical bar placed on the left of it (on the right for 'rtl' languages).
toolbarSetfalseDefaultstringSet the name of the toolbar to display
toolbarStartExpandedfalsetruebooleanDecide if the toolbar should be expanded when the rich text editor is loaded
useBROnCarriageReturnfalsetruebooleanDecide if a <br/> should be used in place of the occurence of a carriage return
widthfalse100%stringset the width of the rich text editor
allowFlashBrowsefalsetruebooleandetermine if to allow flash browsing
allowFlashUploadfalsetruebooleandetermine if to allow flash upload
allowImageBrowsefalsetruebooleandetermine if to allow image browsing
allowImageUploadfalsetruebooleandetermine if to allow image uploading
allowLinkBrowsefalsetruebooleandetermine if to allow link browsing
allowLinkUploadfalsetruebooleandetermine if to allow link uploading
flashUploadAllowedExtensionfalse.(swf|fla)$stringregexp for allowed flash upload file format
flashUploadDeniedExtensionfalsestringregexp for deinied flash upload file format
imageUploadAllowedExtensionfalse.(jpg|gif|jpeg|png)$stringregexp for allowed image upload file format
imageUploadDeniedExtensionfalsestringregexp for denied image upload file format
linkUploadAllowedExtensionfalsestringregexp for allowed link upload file format
linkUploadDeniedExtensionfalse.(php| php3| php5| phtml| asp| aspx| ascx| jsp| cfm| cfc| pl| bat| exe| dll| reg| cgi)$stringregexp for denied link upload file format
smileyImagesfalse Object/Stringjs array of smilies files to be included
smileyPathfalse/webwork/static/ richtexteditor/editor/ images/smiley/msn/stringpath where smilies are located
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Select.html b/docs/tags/Select.html deleted file mode 100644 index 1ac785fd6..000000000 --- a/docs/tags/Select.html +++ /dev/null @@ -1,748 +0,0 @@ - - - -<ww:select /> - - - - -

Tag Name: <ww:select />

- -

Description

-

- -Render a select element - -

- -

- Render an HTML input tag of type select.

Examples

  <ww:select label="Pets" name="petIds" list="petDao.pets" listKey="id" listValue="name" multiple="true" size="3" required="true" /> <ww:select label="Months" name="months" headerKey="-1" headerValue="Select Month" list="#{'01':'Jan', '02':'Feb', [...]}" value="selectedMonth" required="true" /> // The month id (01, 02, ...) returned by the getSelectedMonth() call // against the stack will be auto-selected  

Note: For any of the tags that use lists (select probably being the most ubiquitous), which uses the OGNL list notation (see the "months" example above), it should be noted that the map key created (in the months example, the '01', '02', etc.) is typed. '1' is a char, '01' is a String, "1" is a String. This is important since if the value returned by your "value" attribute is NOT the same type as the key in the "list" attribute, they WILL NOT MATCH, even though their String values may be equivalent. If they don't match, nothing in your list will be auto-selected.

-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

emptyOptionfalsefalseBooleanWhether or not to add an empty (--) option after the header option
headerKeyfalse Object/StringKey for first item in list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringValue expression for first item in list
multiplefalsefalseBooleanCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute. Passing a Collection may work too? Haven't tested this.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Set.html b/docs/tags/Set.html deleted file mode 100644 index b3f46bb39..000000000 --- a/docs/tags/Set.html +++ /dev/null @@ -1,118 +0,0 @@ - - - -<ww:set /> - - - - -

Tag Name: <ww:set />

- -

Description

-

- -Assigns a value to a variable in a specified scope - -

- -

-

The set tag assigns a value to a variable in a specified scope. It is useful when you wish to assign a variable to a complex expression and then simply reference that variable each time rather than the complex expression. This is useful in both cases: when the complex expression takes time (performance improvement) or is hard to read (code readability improvement).

Parameters

  • name* (String): The name of the new variable that is assigned the value of value
  • value (Object): The value that is assigned to the variable named name
  • scope (String): The scope in which to assign the variable. Can be application, session, request, page, or action. By default it is action.

Examples

  <ww:set name="personName" value="person.name"/> Hello, <ww:property value="#personName"/>. How are you?  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

nametrue StringThe name of the new variable that is assigned the value of value
scopefalseactionStringThe scope in which to assign the variable. Can be application, session, request, page, or action.
valuefalse Object/StringThe value that is assigned to the variable named name
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/SortIteratorTag.html b/docs/tags/SortIteratorTag.html deleted file mode 100644 index 1e0680b66..000000000 --- a/docs/tags/SortIteratorTag.html +++ /dev/null @@ -1,100 +0,0 @@ - - - -<ww:sort /> - - - - -

Tag Name: <ww:sort />

- -

Description

-

- -Sort a List using a Comparator both passed in as the tag attribute. - -

- -

- NOTE: JSP-TAG

A Tag that sorts a List using a Comparator both passed in as the tag attribute. If 'id' attribute is specified, the sorted list will be placed into the PageContext attribute using the key specified by 'id'. The sorted list will ALWAYS be pushed into the stack and poped at the end of this tag.

  • id (String) - if specified, the sorted iterator will be place with this id under page context
  • source (Object) - the source for the sort to take place (should be iteratable) else JspException will be thrown
  • comparator* (Object) - the comparator used to do sorting (should be a type of Comparator or its decendent) else JspException will be thrown
  USAGE 1: <ww:sort comparator="myComparator" source="myList"> <ww:iterator> <!-- do something with each sorted elements --> <ww:property value="..." /> </ww:iterator> </ww:sort> USAGE 2: <ww:sort id="mySortedList" comparator="myComparator" source="myList" /> <% Iterator sortedIterator = (Iterator) pageContext.getAttribute("mySortedList"); for (Iterator i = sortedIterator; i.hasNext(); ) { // do something with each of the sorted elements } %>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

comparatortrue java.util.ComparatorThe comparator to use
sourcefalse Object/StringThe iterable source to sort
idfalse StringThe id of the tag element.
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Submit.html b/docs/tags/Submit.html deleted file mode 100644 index 6d222cf24..000000000 --- a/docs/tags/Submit.html +++ /dev/null @@ -1,784 +0,0 @@ - - - -<ww:submit /> - - - - -

Tag Name: <ww:submit />

- -

Description

-

- -Render a submit button - -

- -

- Render a submit button. The submit tag is used together with the form tag to provide asynchronous form submissions. The submit can have three different types of rendering:

  • input: renders as html <input type="submit"...>
  • image: renders as html <input type="image"...>
  • button: renders as html <button type="submit"...>
Please note that the button type has advantages by adding the possibility to seperate the submitted value from the text shown on the button face, but has issues with Microsoft Internet Explorer at least up to 6.0

Examples

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

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

resultDivIdfalse StringThe id of the HTML element to place the result (this can be the form's id or any id on the page.
onLoadJSfalse StringJavascript code that will be executed after the form has been submitted. The format is onLoadJS='yourMethodName(data,type)'. NOTE: the words data and type must be left like that if you want the event type and the returned data.
notifyTopicsfalse StringTopic names to post an event to after the form has been submitted.
listenTopicsfalse StringSet listenTopics attribute.
preInvokeJSfalse StringJavascript code that will be executed before invokation. The format is preInvokeJS='yourMethodName(data,type)'.
labelfalse Object/StringSupply a submit button text apart from submit value. Will have no effect for input type submit, since button text will always be the value parameter. For the type image, alt parameter will be set to this value.
srcfalse Object/StringSupply an image src for image type submit button. Will have no effect for types input and button.
actionfalse StringSet action attribute.
methodfalse StringSet method attribute.
alignfalse StringHTML align attribute.
typefalseinputStringThe type of submit to use. Valid values are input, button and image.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/SubsetIteratorTag.html b/docs/tags/SubsetIteratorTag.html deleted file mode 100644 index 2e15998dd..000000000 --- a/docs/tags/SubsetIteratorTag.html +++ /dev/null @@ -1,136 +0,0 @@ - - - -<ww:subset /> - - - - -

Tag Name: <ww:subset />

- -

Description

-

- -Takes an iterator and outputs a subset of it - -

- -

- NOTE: JSP-TAG

A tag that takes an iterator and outputs a subset of it. It delegates to {@link com.opensymphony.webwork.util.SubsetIteratorFilter} internally to perform the subset functionality.

  • count (Object) - Indicate the number of entries to be in the resulting subset iterator
  • source* (Object) - Indicate the source of which the resulting subset iterator is to be derived base on
  • start (Object) - Indicate the starting index (eg. first entry is 0) of entries in the source to be available as the first entry in the resulting subset iterator
  • decider (Object) - Extension to plug-in a decider to determine if that particular entry is to be included in the resulting subset iterator
  • id (String) - Indicate the pageContext attribute id to store the resultant subset iterator in
  public class MySubsetTagAction extends ActionSupport { public String execute() throws Exception { l = new ArrayList(); l.add(new Integer(1)); l.add(new Integer(2)); l.add(new Integer(3)); l.add(new Integer(4)); l.add(new Integer(5)); return "done"; } public Integer[] getMyArray() { return a; } public List getMyList() { return l; } public Decider getMyDecider() { return new Decider() { public boolean decide(Object element) throws Exception { int i = ((Integer)element).intValue(); return (((i % 2) == 0)?true:false); } }; } }  
  <!-- A: List basic --> <ww:subset source="myList"> <ww:iterator> <ww:property /> </ww:iterator> </ww:subset>  
  <!-- B: List with count --> <ww:subset source="myList" count="3"> <ww:iterator> <ww:property /> </ww:iterator> </ww:subset>  
  <!-- C: List with start --> <ww:subset source="myList" count="13" start="3"> <ww:iterator> <ww:property /> </ww:iterator> </ww:subset>  
  <!-- D: List with id --> <ww:subset id="mySubset" source="myList" count="13" start="3" /> <% Iterator i = (Iterator) pageContext.getAttribute("mySubset"); while(i.hasNext()) { %> <%=i.next() %> <% } %>  
  <!-- D: List with Decider --> <ww:subset source="myList" decider="myDecider"> <ww:iterator> <ww:property /> </ww:iterator> </ww:subset>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

countfalse IntegerIndicate the number of entries to be in the resulting subset iterator
sourcefalse Object/StringIndicate the source of which the resulting subset iterator is to be derived base on
startfalse IntegerIndicate the starting index (eg. first entry is 0) of entries in the source to be available as the first entry in the resulting subset iterator
deciderfalse com.opensymphony.webwork.util.SubsetIteratorFilter.DeciderExtension to plug-in a decider to determine if that particular entry is to be included in the resulting subset iterator
idfalse StringThe id of the tag element.
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/TabbedPaneTag.html b/docs/tags/TabbedPaneTag.html deleted file mode 100644 index a5ff000c9..000000000 --- a/docs/tags/TabbedPaneTag.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:tabbedpane /> - - - - -

Tag Name: <ww:tabbedpane />

- -

Description

-

- -This tag is deprecated. Use tabbed panel instead. - -

- -

-TabbedPane tag. -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

contentNametrue Object/String
idfalse StringThe id of the tag element.
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/TabbedPanel.html b/docs/tags/TabbedPanel.html deleted file mode 100644 index e9faa4139..000000000 --- a/docs/tags/TabbedPanel.html +++ /dev/null @@ -1,622 +0,0 @@ - - - -<ww:tabbedPanel /> - - - - -

Tag Name: <ww:tabbedPanel />

- -

Description

-

- -Render a tabbedPanel widget. - -

- -

- The tabbedpanel widget is primarily an AJAX component, where each tab can either be local content or remote content (refreshed each time the user selects that tab).

Examples

The following is an example of a tabbedpanel and panel tag utilizing local and remote content.

  <ww:tabbedPanel id="test2" theme="simple" > <ww:panel id="left" tabName="left" theme="ajax"> This is the left pane<br/> <ww:form > <ww:textfield name="tt" label="Test Text" /> <br/> <ww:textfield name="tt2" label="Test Text2" /> </ww:form> </ww:panel> <ww:panel remote="true" href="/AjaxTest.action" id="ryh1" theme="ajax" tabName="remote one" /> <ww:panel id="middle" tabName="middle" theme="ajax"> middle tab<br/> <ww:form > <ww:textfield name="tt" label="Test Text44" /> <br/> <ww:textfield name="tt2" label="Test Text442" /> </ww:form> </ww:panel> <ww:panel remote="true" href="/AjaxTest.action" id="ryh21" theme="ajax" tabName="remote right" /> </ww:tabbedPanel>  

Additional Configuration If you are looking for the "nifty" rounded corner look, there is additional configuration. This assumes that the background color of the tabs is white. If you are using a different color, please modify the parameter in the Rounded() method.

  <link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/tabs.css"/>"> <link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/niftycorners/niftyCorners.css"/>"> <link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/niftycorners/niftyPrint.css"/>" media="print"> <script type="text/javascript" src="<ww:url value="/webwork/niftycorners/nifty.js"/>"></script> <script type="text/javascript"> dojo.event.connect(window, "onload", function() { if (!NiftyCheck()) return; Rounded("li.tab_selected", "top", "white", "transparent", "border #ffffffS"); Rounded("li.tab_unselected", "top", "white", "transparent", "border #ffffffS"); // "white" needs to be replaced with the background color }); </script>  
Important: Be sure to setup the page containing this tag to be Configured for AJAX -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

idtrue StringThe id to assign to the component.
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Text.html b/docs/tags/Text.html deleted file mode 100644 index 0830497db..000000000 --- a/docs/tags/Text.html +++ /dev/null @@ -1,82 +0,0 @@ - - - -<ww:text /> - - - - -

Tag Name: <ww:text />

- -

Description

-

- -Render a I18n text message. - -

- -

- Render a I18n text message.

The message must be in a resource bundle with the same name as the action that it is associated with. In practice this means that you should create a properties file in the same package as your Java class with the same name as your class, but with .properties extension.

If the named message is not found, then the body of the tag will be used as default message. If no body is used, then the name of the message will be used.

  • name* (String) - the i18n message key

Example:

  Accessing messages from a given bundle (the i18n Shop example bundle in the first example) and using bundle defined through ww in the second example.

  <!-- First Example --> <ww:i18n name="webwork.action.test.i18n.Shop"> <ww:text name="main.title"/> </ww:i18n> <!-- Second Example --> <ww:text name="main.title" />  
  <ww:text name="some.key" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

nametrue Object/StringName of resource property to fetch
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/TextArea.html b/docs/tags/TextArea.html deleted file mode 100644 index b42d4ae8c..000000000 --- a/docs/tags/TextArea.html +++ /dev/null @@ -1,676 +0,0 @@ - - - -<ww:textarea /> - - - - -

Tag Name: <ww:textarea />

- -

Description

-

- -Render HTML textarea tag. - -

- -

- Render HTML textarea tag.

Examples

  <ww:textarea label="Comments" name="comments" cols="30" rows="8"/>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

colsfalse IntegerHTML cols attribute
readonlyfalsefalseBooleanWhether the textarea is readonly
rowsfalse IntegerHTML rows attribute
wrapfalse StringHTML wrap attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/TextField.html b/docs/tags/TextField.html deleted file mode 100644 index db5e7ac86..000000000 --- a/docs/tags/TextField.html +++ /dev/null @@ -1,676 +0,0 @@ - - - -<ww:textfield /> - - - - -

Tag Name: <ww:textfield />

- -

Description

-

- -Render an HTML input field of type text - -

- -

- Render an HTML input field of type text

Examples

In this example, a text control is rendered. The label is retrieved from a ResourceBundle by calling ActionSupport's getText() method.

  <ww:textfield label="%{text('user_name')}" name="user" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Token.html b/docs/tags/Token.html deleted file mode 100644 index 785e746a5..000000000 --- a/docs/tags/Token.html +++ /dev/null @@ -1,604 +0,0 @@ - - - -<ww:token /> - - - - -

Tag Name: <ww:token />

- -

Description

-

- -Stop double-submission of forms - -

- -

- Stop double-submission of forms.

The token tag is used to help with the "double click" submission problem. It is needed if you are using the TokenInterceptor or the TokenSessionInterceptor. The ww:token tag merely places a hidden element that contains the unique token.

Examples

  <ww:token />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/Tree.html b/docs/tags/Tree.html deleted file mode 100644 index bd11adb24..000000000 --- a/docs/tags/Tree.html +++ /dev/null @@ -1,784 +0,0 @@ - - - -<ww:tree /> - - - - -

Tag Name: <ww:tree />

- -

Description

-

- -Render a tree widget. - -

- -

- Renders a tree widget with AJAX support.

Examples

  <tree .../>  
Created : Oct 27, 2005 3:56:23 PM -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

togglefalse Object/StringThe toggle property.
treeSelectedTopicfalse Object/StringThe treeSelectedTopic property.
treeExpandedTopicfalse Object/StringThe treeExpandedTopic property.
treeCollapsedTopicfalse Object/StringThe treeCollapsedTopic property.
openAllfalsefalsebooleanThe openAll property.
rootNodefalse Object/StringThe rootNode property.
childCollectionPropertyfalse Object/StringThe childCollectionProperty property.
nodeTitlePropertyfalse Object/StringThe nodeTitleProperty property.
nodeIdPropertyfalse Object/StringThe nodeIdProperty property.
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/TreeNode.html b/docs/tags/TreeNode.html deleted file mode 100644 index 40981a43a..000000000 --- a/docs/tags/TreeNode.html +++ /dev/null @@ -1,622 +0,0 @@ - - - -<ww:treenode /> - - - - -

Tag Name: <ww:treenode />

- -

Description

-

- -Render a tree node within a tree widget. - -

- -

- Renders a tree node within a tree widget with AJAX support.

Examples

  <treenode .../>  
Created : Dec 12, 2005 3:53:40 PM -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

labeltrue Object/StringLabel expression used for rendering tree node label.
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/URL.html b/docs/tags/URL.html deleted file mode 100644 index 69879e4cb..000000000 --- a/docs/tags/URL.html +++ /dev/null @@ -1,280 +0,0 @@ - - - -<ww:url /> - - - - -

Tag Name: <ww:url />

- -

Description

-

- -This tag is used to create a URL - -

- -

-

This tag is used to create a URL.

You can use the "param" tag inside the body to provide additional request parameters.

NOTE:

When includeParams is 'all' or 'get', the parameter defined in param tag will take precedence and will not be overriden if they exists in the parameter submitted. For example, in Example 3 below, if there is a id parameter in the url where the page this tag is included like http://://editUser.action?id=3333&name=John the generated url will be http://:/context>/editUser.action?id=22&name=John cause the parameter defined in the param tag will take precedence.

  • action (String) - (value or action choose either one, if both exist value takes precedence) action's name (alias)
  • value (String) - (value or action choose either one, if both exist value takes precedence) the url itself
  • scheme (String) - http scheme (http, https) default to the scheme this request is in
  • namespace - action's namespace
  • method (String) - action's method, default to execute()
  • encode (Boolean) - url encode the generated url. Default is true
  • includeParams (String) - The includeParams attribute may have the value 'none', 'get' or 'all'. Default is 'get'. none - include no parameters in the URL get - include only GET parameters in the URL (default) all - include both GET and POST parameters in the URL
  • includeContext (Boolean) - determine wheather to include the web app context path. Default is true.

Examples

  <-- Example 1 --> <ww:url value="editGadget.action"> <ww:param name="id" value="%{selected}" /> </ww:url> <-- Example 2 --> <ww:url action="editGadget"> <ww:param name="id" value="%{selected}" /> </ww:url> <-- Example 3--> <ww:url includeParams="get" > <:param name="id" value="%{'22'}" /> </ww:url>  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

includeParamsfalsegetObject/StringThe includeParams attribute may have the value 'none', 'get' or 'all'.
schemefalse Object/StringSet scheme attribute
valuefalse Object/StringThe target value to use, if not using action
actionfalse Object/StringThe action generate url for, if not using value
namespacefalse Object/StringThe namespace to use
methodfalse Object/StringThe method of action to use
encodefalsetrueBooleanwhether to encode parameters
includeContextfalsetrueBooleanwhether actual context should be included in url
portletModefalse Object/StringThe resulting portlet mode
windowStatefalse Object/StringThe resulting portlet window state
portletUrlTypefalse Object/StringSpecifies if this should be a portlet render or action url
anchorfalse Object/StringThe anchor for this URL
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/UpDownSelect.html b/docs/tags/UpDownSelect.html deleted file mode 100644 index fc8be7e93..000000000 --- a/docs/tags/UpDownSelect.html +++ /dev/null @@ -1,856 +0,0 @@ - - - -<ww:updownselect /> - - - - -

Tag Name: <ww:updownselect />

- -

Description

-

- -Render a up down select element - -

- -

- Create a Select component with buttons to move the elements in the select component up and down. When the containing form is submited, its elements will be submitted in the order they are arranged (top to bottom).

  <!-- Example 1: simple example --> <ww:updownselect list="#{'england':'England', 'america':'America', 'germany':'Germany'}" name="prioritisedFavouriteCountries" headerKey="-1" headerValue="--- Please Order Them Accordingly ---" emptyOption="true" /> <!-- Example 2: more complex example --> <ww:updownselect list="defaultFavouriteCartoonCharacters" name="prioritisedFavouriteCartoonCharacters" headerKey="-1" headerValue="--- Please Order ---" emptyOption="true" allowMoveUp="true" allowMoveDown="true" allowSelectAll="true" moveUpLabel="Move Up" moveDownLabel="Move Down" selectAllLabel="Select All" />  
-

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

allowMoveUpfalsetrueBooleanWhether move up button should be displayed
allowMoveDownfalsetrueBooleanWhether move down button should be displayed
allowSelectAllfalsetrueBooleanWhether or not select all button should be displayed
moveUpLabelfalse^StringText to display on the move up button
moveDownLabelfalsevStringText to display on the move down button
selectAllLabelfalse*StringText to display on the select all button
emptyOptionfalsefalseBooleanWhether or not to add an empty (--) option after the header option
headerKeyfalse Object/StringKey for first item in list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringValue expression for first item in list
multiplefalsefalseBooleanCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute. Passing a Collection may work too? Haven't tested this.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/WebTable.html b/docs/tags/WebTable.html deleted file mode 100644 index 89fde72fd..000000000 --- a/docs/tags/WebTable.html +++ /dev/null @@ -1,676 +0,0 @@ - - - -<ww:table /> - - - - -

Tag Name: <ww:table />

- -

Description

-

- -Instantiate a JavaBean and place it in the context. - -

- -

- -

- -

Attributes

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

Required

Default

Type

Description

modelNametrue StringThe name of model to use
sortColumnfalse IntegerIndex of column to sort data by
sortOrderfalseNONEStringSet sort order. Allowed values are NONE, ASC and DESC
sortablefalsefalseBooleanWhether the table should be sortable. Requires that model implements com.opensymphony.webwork.components.table.SortableTableModel if set to true.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute
- - -

-

-

Back to Taglib Index
-

- - - diff --git a/docs/tags/index.html b/docs/tags/index.html deleted file mode 100644 index abf0970f7..000000000 --- a/docs/tags/index.html +++ /dev/null @@ -1,611 +0,0 @@ - - -WebWork 2.2.2 Taglib Index - - - - -

WebWork 2.2.2 Taglib Index

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-<head /> - - -Render a chunk of HEAD for your HTML file - -
-<push /> - - -Push value on stack for simplified usage. - -
-<table /> - - -Instantiate a JavaBean and place it in the context. - -
-<component /> - - -Render a custom ui widget - -
-<token /> - - -Stop double-submission of forms - -
-<set /> - - -Assigns a value to a variable in a specified scope - -
-<i18n /> - - -Get a resource bundle and place it on the value stack - -
-<merge /> - - -Merge the values of a list of iterators into one iterator - -
-<password /> - - -Render an HTML input tag of type password - -
-<submit /> - - -Render a submit button - -
-<form /> - - -Renders an input form - -
-<include /> - - -Include a servlet's output (result of servlet or a JSP page) - -
-<div /> - - -Render HTML div providing content from remote call via AJAX - -
-<label /> - - -Render a label that displays read-only information - -
-<action /> - - -Execute an action from within a view - -
-<bean /> - - -Instantiate a JavaBean and place it in the context. - -
-<sort /> - - -Sort a List using a Comparator both passed in as the tag attribute. - -
-<hidden /> - - -Render a hidden input field - -
-<iterator /> - - -Iterate over a iterable value - -
-<actionerror /> - - -Render action errors if they exists - -
-<if /> - - -If tag - -
-<select /> - - -Render a select element - -
-<reset /> - - -Render a reset button - -
-<append /> - - -Append the values of a list of iterators to one iterator - -
-<updownselect /> - - -Render a up down select element - -
-<else /> - - -Else tag - -
-<debug /> - - -Render debug tag - -
-<param /> - - -Parametrize other tags - -
-<optiontransferselect /> - - -Renders an input form - -
-<textfield /> - - -Render an HTML input field of type text - -
-<doubleselect /> - - -Renders two HTML select elements with second one changing displayed values depending on selected entry of first one. - -
-<textarea /> - - -Render HTML textarea tag. - -
-<generator /> - - -Generate an iterator for a iterable source. - -
-<checkbox /> - - -Render a checkbox input field - -
-<date /> - - -Render a formatted date. - -
-<a /> - - -Render a HTML href element that when clicked calls a URL via remote XMLHttpRequest - -
-<file /> - - -Render a file input field - -
-<url /> - - -This tag is used to create a URL - -
-<radio /> - - -Renders a radio button input field - -
-<combobox /> - - -Widget that fills a text box from a select - -
-<checkboxlist /> - - -Render a list of checkboxes - -
-<panel /> - - -Render a panel for tabbedPanel - -
-<actionmessage /> - - -Render action messages if they exists - -
-<tree /> - - -Render a tree widget. - -
-<property /> - - -Print out expression which evaluates against the stack - -
-<tabbedpane /> - - -This tag is deprecated. Use tabbed panel instead. - -
-<tabbedPanel /> - - -Render a tabbedPanel widget. - -
-<treenode /> - - -Render a tree node within a tree widget. - -
-<fielderror /> - - -Render field error (all or partial depending on param tag nested)if they exists - -
-<subset /> - - -Takes an iterator and outputs a subset of it - -
-<elseif /> - - -Elseif tag - -
-<text /> - - -Render a I18n text message. - -
-<datepicker /> - - -Render datepicker - -
-<richtexteditor /> - - -Render a rich text editor element - -
- -

- - - diff --git a/docs/wikidocs/06-01-2005 AJAX.html b/docs/wikidocs/06-01-2005 AJAX.html deleted file mode 100644 index 20449426c..000000000 --- a/docs/wikidocs/06-01-2005 AJAX.html +++ /dev/null @@ -1,377 +0,0 @@ - - - WebWork - - 06-01-2005 AJAX - - - - - - - - - - -
-

Transcript

-
-
	PSquad33	my biggest concerns are making sure we don't bite off more than we can chew and that we keep WebWork... WebWork
-	jcarreira	Have you looked at Cameron's stuff?
-	iroughley	what were your thoughts on Camerons checkins?
-	PSquad33	i'm not interested in becoming a vehicle for distributing dojo
-	iroughley	yes
-	jcarreira	I wanted to talk to him about contributing his stuff back to dojo
-	PSquad33	all the javascript widget stuff sounds like it is getting a little too far away from webwork. but still, it is interesting
-	PSquad33	anyway, i'll be on and off
-	iroughley	I like dojo as the transport, but as soon as you get too far into JS I am concerned abouot browser compatibility
-	jcarreira	I like the idea of making the components dojo widgets, but I want the JSP tags to write out the dojo widgets... that way we can maintain server-side state
-	jcarreira	yeah, that's a good reason to put it in dojo... more people using it = more compatibility testing
-	iroughley	exactly
-	PSquad33	are we going to support dojo entirely, or will this be optional stuff? i just don't want to divert focus
-	PSquad33	maybe we should make an seperate project or something. do my concerns make sense?
-	jcarreira	well, I think we should have an Ajax theme
-	iroughley	I like using it as the transport, and the event stuff is good.
-	jcarreira	I don't know... I think it's important to have rich widgets as part of the framework...
-	PSquad33	sure -- but we can't abandon our base either
-	jcarreira	...and they're going to do drag-n-drop, etc.
-	PSquad33	people still use the plain old XHTML theme
-	PSquad33	i want to keep the goals in sync
-	PSquad33	anyway, my big concern is that I feel a bit left out of the loop -- and if I do, our users defintiely will
-	iroughley	I guess my underlying issue with the code that cameron added, was that it had no dependency with webwork
-	PSquad33	so you guys need to really hold my hand on this if you think this is the right direction to go
-	PSquad33	show me the vision in simple to understand terms
-	PSquad33	ian: exactly
-	PSquad33	ian: that is exactly my concern -- we're going to fragment the user base at this rate
-	jcarreira	yeah.. I don't want to get into the biz of maintaining add-ons to dojo
-	iroughley	it could be used with or without webwork, and then we are developing for someone else
-	jcarreira	I wanted to talk to him about contributing the JS stuff back to dojo, and we just use it
-	jcarreira	I've been trying to think through if we need the server-side events too
-	iroughley	so then move in the direction that I think we are going - tag libs around the attributes for the dojo elements
-	jcarreira	yep
-	iroughley	so that we can link into server side state
-	jcarreira	Should we just maintain UI widget dependencies on the client-side?
-	jcarreira	or should we try to implement a real MVC style where the model changes cause the correct view components to update?
-	iroughley	this is a urious question
-	iroughley	i like loose dependencies on the client, via topics
-	iroughley	so far, for what I am doing it works well
-	jcarreira	so the UI components just know to listen to topics and refresh themselves?
-	iroughley	yes
-	jcarreira	in that case it can just be a UI component theme
-	iroughley	the caveat is that the components have a known grnularity, that is understood by the developer
-	iroughley	yes
-	jcarreira	except for the extra JSP attributes
-	iroughley	and changed per theme
-	jcarreira	what do you mean about the granularity?
-	iroughley	you have to know that a remote div (for example) might get a list from the server, or render a domain object
-	jcarreira	I was thinking the remote div would just get HTML and set its innerHtml
-	iroughley	so when you call that div to refresh itself you are doing work to obtain the information
-	jcarreira	that way it's just like a ww:action tag...
-	iroughley	yes
-	iroughley	the action does the work
-	jcarreira	and if you have it like this:
-	jcarreira	<ww:remotediv action="foo"/>
-	jcarreira	actually...
-	jcarreira	this could just be a theme for the ww:action tag...
-	jcarreira	...except it's not a UI tag
-	iroughley	true
-	jcarreira	but it could wrap a ww:action tag and delegate calls to it
-	jcarreira	but maybe that's limiting its reusability
-	jcarreira	<ww:remotediv href="foo.action"><ww:action name="foo"/></ww:remotediv>
-	jcarreira	the contents of the ww:remotediv would be the original content (no need for a separate call to load the content), then the href would be used when it refreshes
-	iroughley	that's a good idea
-	iroughley	i haven't had a chance to implement the initial content yet (as per your suggestion last week)
-	jcarreira	what are the params to the remotediv tag?
-	iroughley	so, i guess that the UI doesn't need to maintain dependencies on the client, just make calls via remote div's (or other components) and let the actions determine the state
-	jcarreira	yeah
-	jcarreira	but we need things like select boxes which can populate
-	|<--	PSquad33 has left efnet (Read error: Connection reset by peer)
-	iroughley	is, url, updateFreq, loadingText, reloadingText, errortext, showErrorTransportText, topicName
-	jcarreira	for example, if I'm shopping and I select a catalog, it should populate the product categories in a select list automatically
-	jcarreira	...I'd also like to be able to have a lazy-loading tree widget
-	iroughley	i agree
-	jcarreira	the loadingText can go away.. just make it the body enclosed by the tag
-	iroughley	that was my plan
-	jcarreira	we need a way to tell it to load immediately... then the default text would be there while it loads the first time
-	iroughley	:)
-	iroughley	my idea exactly
-	iroughley	monday I hope it will be done
-	jcarreira	cool
-	iroughley	could the select tag and tree tag use topics to refresh state from the server
-	jcarreira	what do you mean?
-	iroughley	then use DWR or dojo to obtain JS to refresh themselves
-	jcarreira	ah
-	-->|	PSquad33 (~PSquad32@c-67-160-147-93.hsd1.or.comcast.net) has joined #webwork
-	PSquad33	back
-	PSquad33	sorry about that
-	PSquad33	you guys still talking about stuff
-	jcarreira	but where do they call to get the stuff to refresh themselves?
-	PSquad33	?
-	jcarreira	yep
-	iroughley	yeah
-	jcarreira	you need to bind something to DWR to populate the list, right?
-	iroughley	the data has to be sourced from somewhere originally, right?
-	iroughley	yep
-	jcarreira	yeah... originally it might be in the action
-	iroughley	exactly
-	PSquad33	let me know when you guys are ready to talk strategy. i don't have much to add technically, but i want to make sure we are absolutely clear on our strategy and market perception.
-	jcarreira	would we want to populate the data on the client?
-	iroughley	what do you mean?
-	jcarreira	pre-populate a data structure and select from there...
-	|<--	PSquad33 has left efnet (Remote host closed the connection)
-	iroughley	personally I wouldn't - if you are using ajax the assumption is that the data may change, and should be refreshed from the server
-	iroughley	that doesn;t mean that we shouldn't have a static tree widget
-	jcarreira	I guess I don't know how DWR works... how do you tell it what to call? Can it load data from the session?
-	iroughley	DWR (i think) makes a call to a method on a serverside object - like a spring BO
-	jcarreira	can it access the session to get its data?
-	iroughley	i would think that you could have it access a WW action, and return the session information from there
-	iroughley	i haven't looked at it lately
-	jcarreira	I'm asking Patrick... he keeps getting kicked off
-	iroughley	do you want to try another IRC server?
-	jcarreira	nah, it's his client
-	jcarreira	he's got a cheesy shareware one for mac
-	iroughley	ok - so if anyone changes the select list they update an element in the session - then the select list uses DWR to call an action with a list name (?) which obtains a refreshed (possibly) list from the session
-	jcarreira	I was using an onChange() call... it uses bind() to call and set something into the session
-	iroughley	that would work
-	jcarreira	we need a way to make it easy for users to bind onChange to a call to the server
-	jcarreira	You shouldn't have to write a JS function everytime
-	-->|	PSquad32_ (~chatzilla@c-67-160-147-93.hsd1.or.comcast.net) has joined #webwork
-	PSquad32_	yo yo
-	PSquad32_	chatzilla to the rescue
-	jcarreira	ok, Patrick was just explaining DWR to me
-	iroughley	but it's more complex than that, as it might not be the same element - it may be a different one
-	iroughley	ok
-	jcarreira	no, it shouldn't change anything client-side
-	PSquad32_	so yeah, lemme know when you are ready to talk strategy. dojo doesn't seem to line up with what webwork is about at all, so i'm a bit worried
-	jcarreira	it should make a call to the server, set some session state, then return and send a client-side topic message
-	iroughley	ok - yes
-	jcarreira	it's maybe a little more chatty, but it's simple to understand and model
-	jcarreira	and very loosely coupled
-	iroughley	could we set up each of the UI tags to define whether they send or update, and then wire it up for the users?
-	iroughley	more chatty, but the calls are going to be very small
-	jcarreira	what do you mean?
-	jcarreira	I think each UI component should be able to be given a URL to hit with the new value onChange()
-	jcarreira	and a topic to publish to
-	iroughley	agreed
-	iroughley	so that call will be small (not alot of data in the URL)
-	jcarreira	and also have a topic to listen to that would load the value... so that would need a url to get the list
-	iroughley	yes
-	iroughley	and that call is going to be returning just the list, and not a complete HTML page - do the data being sent back to the client will be small
-	jcarreira	yep.. but in what form does it return the list?
-	jcarreira	...patrick, we're almost done with the Js stuff....
-	iroughley	innerHTML?
-	jcarreira	what does it mean if you set the innerHtml of a select tag? what do you set it to?
-	iroughley	it's easy and whatever is called on the server to get the data out of the session can format it to html
-	iroughley	I would think that any tag can be gotten by id, and then html set in it
-	iroughley	so <OPTION>one</OPTION> etc.
-	PSquad32_	i'm going to play a game of halo -- be back in a few :)
-	jcarreira	yes, but what do you set into the innerHtml of a select tag to populate it? is it just the <options>?
-	iroughley	i think so
-	iroughley	haven't tried it, but it makes sense
-	jcarreira	ok, so for the tree... it needs to get javascript back, probably, or some data structure... should we support both?
-	Fracture	Hi
-	jcarreira	Hi Fracture...
-	Fracture	i'm going to read the log to catch up
-	iroughley	i think that depends on the core tree widget that we use and augment for the implementation
-	jcarreira	true... I've been playing with dtree for a while... it's pretty easy
-	jcarreira	Fracture, I'm not sure who you are IRL...
-	iroughley	do you think that returning JS or HTML would be easier with dtree?
-	jcarreira	JS
-	iroughley	i think that's fine then - the action/object that obtains the data from the session can modify it to JS to return to the browser
-	jcarreira	This is how I add things to the tree:
-	jcarreira	<ww:iterator value="categories">
-	jcarreira	tree.add(<ww:property value="id"/>,<ww:property value="(parentCategory == null)?0:parentCategory.id"/>,'<ww:property value="name"/>','javascript:changeCategory(<ww:property value="id"/>);','<ww:property value="name"/>','_top','/img/folder.gif','/img/folderopen.gif');
-	jcarreira	</ww:iterator>
-	jcarreira	then you add it to the page like this:
-	jcarreira	document.write(tree);
-	iroughley	cool
-	iroughley	we could even use JS for the select - just an implementation detail, as it will be hidden from teh end user
-	jcarreira	but I think we can get to that later... I'm ok hardwiring this one together for now.. but we should make it easy to create components that send changes to the server to update server state and then send update events on topics
-	Fracture	is Cameron :)
-	jcarreira	ahh.. ok...
-	=-=	Fracture is now known as Cameron-
-	jcarreira	Cameron, let us know when you're caught up
-	Cameron-	shall do .. half way there.
-	iroughley	i would agree with that
-	iroughley	while we are handwiring, we should also start thinking about a naming convention for the topics
-	jcarreira	categoryChange, userChange, etc?
-	iroughley	yes - I have been using topic_{html id}_event - i.e. topic_myRemoteDivId_refresh
-	iroughley	but they can easily change
-	jcarreira	I think we should make it easy to type and remember... users will end up needing to do some wiring themselves at some point
-	iroughley	makes sense
-	iroughley	on some of the elements i added a topic to publish to - perhaps I should go ahead and add this to them all
-	jcarreira	where would we be defining topics?
-	iroughley	at the moment I autowire some, and give the user the option of specifying them on some
-	jcarreira	well, we should talk through that with Patrick... how we're going to position this Ajax stuff... if we're going to add attributes to the taglibs, etc.
-	jcarreira	which are autowired?
-	jcarreira	brb
-	iroughley	from memory I think the autowired ones are - remotediv sends a "refesh", tab header sends a "tab selected"
-	iroughley	remote div can specify a topic to listen to and refrsh itself - i think that might be the only one for now
-	Cameron-	ok - I agree that these dojo widgets that I have created really belong in dojo - or a separate project. I was just demonstrating that rather than us write javascript code (that the ww components use) we write them as dojo widgets, and use the components to bind data to them. When using more interactive client controls - webwork more becomes a controller for marshaling data. I do think that we need to bundle a dojo build with w
-	iroughley	oh - the remote link / <a href> is autowired to send a "refresh"
-	Cameron-	and also allow our users to use a different profile build - if they meet our dependencies
-	PSquad32_	cameron: this whole dependency on dojo widgets is very un-webwork-ish
-	PSquad32_	i _really_ think it is not the right direction
-	Cameron-	we depend on DRW, we depend on XmlHttpRequest..
-	Cameron-	we have to have dependencies
-	PSquad32_	but we're depending on a framework
-	PSquad32_	the others are libraries
-	PSquad32_	dojo is a framework
-	PSquad32_	think about it from user's perspective. when they upgrade to 2.2, what are they going to see?
-	PSquad32_	what is the "webwork message"?
-	PSquad32_	what is our story? we can't have 4 different versions of the same story
-	jcarreira	well, that's where we need to decide if this is a theme
-	jcarreira	I think this is the Ajax theme
-	jcarreira	and it requires dojo
-	jcarreira	I think we bundle a dojo profile with the example app
-	PSquad32_	i think that is fine (a lot of this is marketing more than anything)
-	iroughley	are there cases where you might needs to utilize multiple themes for a single compnent?
-	jcarreira	yes
-	iroughley	i.e. 2 different styles of lists or tabbed controls on the same page
-	iroughley	so each of these would then need to be developed from teh core ajax theme
-	jcarreira	sometimes I end up using the "simple" theme because the layout requires I can't put it in the table
-	jcarreira	what do you mean?
-	iroughley	it's late - i think i just confused myself :)
-	jcarreira	what's our status with JSP 2?
-	jcarreira	with JSP 2 you can just add more attributes without having to put them in the TLD, right?
-	PSquad32_	i am fine iwth requiring jsp 2
-	jcarreira	I don't really know the features of JSP 2 :-)
-	jcarreira	but requiring JSP 2 is requiring J2EE 1.4 and J2SE 1.4, right?
-	jcarreira	which means no WebSphere 4.x or 5.0
-	PSquad32_	websphere 5 is JDK 1.4
-	jcarreira	5.1 is
-	iroughley	if that is the case i would opt not to exclude those markets
-	PSquad32_	that's fine
-	PSquad32_	we don't need JSP 2 features
-	PSquad32_	ww:param works
-	PSquad32_	i have to run
-	PSquad32_	let's keep thinking about what the webwork story is -- how all this fits in
-	PSquad32_	we can't just say the old stuff doens't matter or isn't supported
-	Cameron-	so Pat - what is the wework story ?
-	PSquad32_	well, i think we all need to work on that
-	PSquad32_	i'll draft up some thoughts -- maybe you guys can too
-	jcarreira	ok, so if not JSP2, then we need to pull those attributes out and use ww:param to parameterize the tag for this specific theme
-	PSquad32_	my main concern is that you guys understand what i'm saying :)
-	PSquad32_	anyway, i have to run
-	PSquad32_	see ya
-	jcarreira	later
-	Cameron-	bye
-	iroughley	later
-	jcarreira	so if this is going to be a theme, we can't add theme-specific attributes
-	iroughley	for the remote div that cameron added - right?
-	Cameron-	you can - using ww:param no ?
-	jcarreira	right, I mean attributes to the TLD
-	Cameron-	you could probably add optional ones, and document them as 'only used for xxx theme'
-	jcarreira	Hmm... could be.... as long as it's very clear... I don't want to be answering questions about why the topic isn't being used with the xhtml theme
-	Cameron-	true
-	jcarreira	speaking of which, does anyone know if someone actually build a real XHTML theme using div's and CSS instead of tables?
-	jcarreira	built
-	iroughley	no idea
-	Cameron-	no idea
-	iroughley	a while back i thought cloves and pat were talking about doing it
-	Cameron-	yeah - I rememer hearing that.
-	iroughley	so the plan is to move forward with a dojo/ajax theme?
-	jcarreira	yes
-	jcarreira	who wants to take what?
-	Cameron-	with regards to your 'topics' ... are they for use client side .. or do these events get routed to an action too ?
-	jcarreira	Cameron, you're going to talk to the dojo guys about contributing the remote div, remote link, and remote submit stuff to dojo?
-	jcarreira	they're the dojo.event.Topic stuff that lets you do publish/subscribe in JS
-	Cameron-	yep - i'll do that.
-	iroughley	we will also require theme specific tags then, right?
-	Cameron-	so you use topics for inter widget communication ?
-	iroughley	remote div for example
-	jcarreira	I built it as a wrapper around their event stuff
-	iroughley	yes - mainly for server side refreshes at the moment
-	jcarreira	I think let's keep the theme specific attributes for now
-	jcarreira	the idea is for a component to update its server state then publish a message on a topic
-	Cameron-	so something emits an event, a widget is triggered, which then refreshes itself ?
-	Cameron-	sure
-	jcarreira	yep, the developer specifies with the tags which topic(s) a component listens to to refresh itself
-	iroughley	or parts of itself - like the drop down list elements
-	jcarreira	and which topic a component publishes on when it is changed
-	jcarreira	so they are loosely coupled and the developer specifies which thing listens to the others
-	Cameron-	cool.
-	jcarreira	so about dojo and source
-	iroughley	so - there are 3 parts as i see it - 1. the dojo UI widgets, 2. the events/topics, and 3. the WW tag/component that combines them all
-	Cameron-	yep
-	iroughley	go ahead jason
-	jcarreira	should we just bundle the __package__.js?
-	Cameron-	we also need the other 'non bundled' files.. like html templates, css files and other widget resources (gif/jpg)
-	jcarreira	yeah, the tags generate JS to use the dojo widgets and JS to wire them to topics
-	jcarreira	ok
-	jcarreira	where do those come from?
-	Cameron-	I setup an ant target dojo-profile that causes dojo to build a __package__.js and copy it and other non bundled resources into the os/static/dojo package
-	Cameron-	where do those come from ? dunno what you mean
-	jcarreira	Well, I don't know about bundling the sources to dojo into webwork's CVS
-	jcarreira	I think we should just bundle the final built product, like we do with other libraries
-	iroughley	also, if they are in webwork.static, can the end user override the images easily if they wanted?
-	Cameron-	that depends on how the widet is authored
-	Cameron-	authored
-	jcarreira	how does one specify the images to be used?
-	jcarreira	can it be done so that the template could be edited to change where they come from?
-	Cameron-	the widget can take a img= attribute and use it in the building of the rendered widget.
-	iroughley	ok - so it doesn't need to be in ww.static
-	jcarreira	well, the defaults can be
-	Cameron-	doesn't have to be.. however .. defaults may be packaged there
-	iroughley	ok - makes sense
-	jcarreira	ok, so the order of things:
-	jcarreira	1) Cameron, you're going to try to get this stuff into dojo
-	jcarreira	2) we build a profiles of dojo with the widgets
-	jcarreira	3) we edit the JSP templates to use the dojo widgets
-	jcarreira	sound good?
-	jcarreira	anything i'm missing?
-	iroughley	sounds good
-	Cameron-	with the remote div.. why do we need a jsp template ?
-	jcarreira	because we want to wire it to topics
-	Cameron-	why not have a <dojo:topic> widget ?
-	jcarreira	and it can take the body contents as the default content of the div
-	Cameron-	the body content can be done <dojo:remotediv attribs...><ww:action name='foo'/></dojo:remotediv>
-	jcarreira	what would the dojo:topic do?
-	Cameron-	the dojo:topic would 'install' the topic 'bus' into the page
-	jcarreira	well, I'd like to keep things consistent... using ww: tags and auto-wiring them to topics
-	iroughley	can th edojo:topic tag specify the topic to listen to and the topic to publish to when an event ocurrs?
-	iroughley	it's also going to be more code for developers to type
-	jcarreira	<ww:remotediv listenTopic="itemSelected"> creates JS to wire the div to refresh when it gets a message on that topic
-	jcarreira	yeah, we want to make this dead-simple
-	Cameron-	dojo:remotediv listenTopic='itemSelected'> can do the same thing.. without a jsp template
-	jcarreira	...and it doesn't hurt to wrap dojo in case something else comes along and we replace the JS library
-	Cameron-	I think we only need to use a jsp tag when we need to access action context from the tag
-	jcarreira	I don't want to make users know anything about dojo
-	Cameron-	ok.. well. I think we have two different approaches.
-	iroughley	if we don't wrap it, it won't really be a theme - wil it?
-	jcarreira	yeah, the JSP template can just call the dojo stuff, so you can just use the dojo stuff directly, too
-	iroughley	it will be something else to use with ww
-	Cameron-	ok
-	jcarreira	well... maybe we should just make this a ww:div tag
-	iroughley	makes sense
-	jcarreira	and in the Ajax theme it can become a remote div
-	iroughley	then we also need a <ww:a>
-	iroughley	:)
-	jcarreira	yeah... we should do that
-	jcarreira	it can use the URLTag code
-	Cameron-	sounds good
-	jcarreira	ok, Ian, do you want to take those?
-	iroughley	sure
-	jcarreira	cool
-	iroughley	we also need dojo components for the existing elements - remote div, remote a link, tabbed panel - right?
-	jcarreira	yeah... not sure how hard it is to do the tabbed panel... that's a more complicated one
-	iroughley	tonight we also talked about a select list and tree element
-	iroughley	it might be easy - just use <ww:div> and it will just not update - events will be the only issue
-	jcarreira	...and I still want them to build a nice menuing system :-)
-	iroughley	the only other thing I was thinking about is a paginated list
-	jcarreira	let's get the ones we've got now using the new architecture
-	jcarreira	JSP tag -> template -> dojo widget
-	iroughley	cameron - you up for building the dojo components?
-	Cameron-	yeah
-	jcarreira	ok, I'll fill Patrick in with where we're heading and maybe we can schedule another chat to talk about the WebWork message, etc
-	Cameron-	ok
-	iroughley	ok - then I will start on the remote div tag/template from teh dojo component next monday
-	Cameron-	we need a wiki page to list the ajax theme components
-	Cameron-	(so I know what to build)
-	iroughley	let me know as new ones come down the pipe
-	iroughley	the current tutorial list all the ones i've done - localhost/webwork/tutorial/ajax/...
-
-
- -
- - diff --git a/docs/wikidocs/06-15-2005 Documentation.html b/docs/wikidocs/06-15-2005 Documentation.html deleted file mode 100644 index c0e5399aa..000000000 --- a/docs/wikidocs/06-15-2005 Documentation.html +++ /dev/null @@ -1,418 +0,0 @@ - - - WebWork - - 06-15-2005 Documentation - - - - - - - - - - -
-

Attendees

-
    -
  • Erik Beeson
  • -
  • Simon Stewart
  • -
  • Jason Carriera
  • -
  • Patrick Lightbody
  • -
  • Jay Bose
  • -
  • Vitor Souza
  • -
  • Grégory Joseph
  • -
- - -

Outcome

-
    -
  • Team agrees that the three main guidelines should be: -
      -
    • Documentation and code must be kept in sync
    • -
    • Major sections should be focussed on different types of users: tutorials ("getting started"), reference, cookbook, general docs
    • -
    • WebWork documentation should be core focus, with XWork documentation being included in the WebWork docs where possible.
    • -
    -
  • -
  • Implementation strategies for these guidelines are: -
      -
    • Code/docs sync: utilize the Confluence snippet macro. We may need Atlassian to help get this macro in to shape.
    • -
    • Sections: each person in the meeting will write their own TOC and present it next week - see 06\-15\-2005 TOC Homework
    • -
    • Standaline WebWork docs: we will utilize the {include} macro to include whole XWork pages when possible, but we will avoid linking to the XWork docs.
    • -
    -
  • -
- - -

Transcript

-
-
	Patrick_	hey
-	shs96c	G;day
-	greg--	hi
-	Patrick_	jason should be on soon i imagine -- just saw him get on AIM
-	shs96c	Fair enough.
-	Patrick_	who do we have here? Rainer, Cameron, and who is Greg?
-	shs96c	I'm Simon
-	greg--	i'm sorry guys I was just passing by; badly need some sleep, it's 3 am here.. just saw the thread and thought i'd drop by
-	greg--	I'm Grégory Joseph
-	-->|	jcarreira (~chatzilla@cpe-66-66-7-68.rochester.res.rr.com) has joined #webwork
-	greg--	being noisy on the lists from time to time
-	shs96c	Not a bad thing :)
-	greg--	sent a couple of patches, and overall happy user of ww ;)
-	Patrick_	ok, cool
-	Patrick_	Greg: get some rest -- we'll post the transcript
-	greg--	thanks ;)
-	Patrick_	unfortunately, I wanted to have a rough TOC for the new docs that we could all start with, but I didn't get around to it
-	greg--	am waiting for a maven build to finish... it's moving at its own pace :/
-	jcarreira	serves you right for using maven :-)
-	Patrick_	Jason: could you maybe take lead on this meeting? I want to finish the build refactoring I've been doing all day. Also, are we waiting for Jay, or do you want to get started?
-	shs96c	I'm happy to wait for Jay
-	jcarreira	let's wait a couple more minutes
-	Patrick_	ok. while we're waiting, i have some good news: the XWork build is the first official project to be based on the OpenSymphony Common Build system
-	Patrick_	WebWork is being updated now. Part of that update involves making sub-projects in WW. The first such subproject will be the example web app
-	shs96c	Patrick: What's the "common build system"?
-	shs96c	Is it in CVS yet?
-	Patrick_	http://ivyrep.opensymphony.com/opensymphony/ is where builds that use the OpenSymphony Common Build drop their artifacts. This allows you to keep up to date if you use Ivy
-	Patrick_	yes, it is
-	Patrick_	let me get you a URL
-	Patrick_	https://xwork.dev.java.net/source/browse/xwork/build.xml?rev=1.30&view=auto&content-type=text/vnd.viewcvs-markup
-	Patrick_	and:
-	Patrick_	https://opensymphony.dev.java.net/source/browse/opensymphony/common/osbuild.xml
-	Patrick_	a couple changes came from this:
-	Patrick_	1) you must have ../opensymphony/common available
-	shs96c	I was just about to ask about that
-	Patrick_	(or you can redefine the location via ${common.build}
-	shs96c	Can it be a jar?
-	shs96c	Or is it the full source tree?
-	Patrick_	it is just an ant build file
-	Patrick_	it can't be a jar
-	Patrick_	2) in XWork, I'm not currently building the editor. I can set this up as a sub project, but I'm not sure if it is even worth it. Is the editor still maintained, or should we focus our energy onConductor/EclipseWork/ etc?
-	-->|	vitorsouz (~vitorsouz@201.29.8.92) has joined #webwork
-	shs96c	I've never used the editor, so not too stressed either way
-	vitorsouz	Hi, there. Sorry I'm late.
-	Patrick_	vitor: no worries, we haven't started yet.
-	shs96c	NP
-	Patrick_	Jason: maybe we should start now w/o Jay?
-	vitorsouz	I wasn't sure if Eastern was DST or not. Is it 9:15 or 10:15 there now?
-	Patrick_	it is 9:15 EST
-	shs96c	11:15AM in Sydney. A very civil time to arrange a meeting on IRC for :)
-	vitorsouz	10:15PM in Brazil. Not that different.
-	Patrick_	ok, well let's start
-	Patrick_	i'd like to start off with a couple thoughts, and then i'll open it up
-	jcarreira	oops, back
-	Patrick_	Recently, Matt Raible pointed me to the WebWork 1.0 Release Announcement on TheServerSide
-	Patrick_	more than a couple comments mentioned how good the documentation was
-	jcarreira	LOL
-	shs96c	:)
-	Patrick_	whether it is just PR or reality, the fact is: WebWork suffers from an image of bad documentation
-	shs96c	Agreed
-	Patrick_	the goal should be to fix that for WebWork 2.2
-	jcarreira	yep
-	Patrick_	in order to do that, I think we should establish some general guidelines, and then once we agree on those, put together a TOC and divvy out the work
-	jcarreira	ok
-	vitorsouz	Ok.
-	Patrick_	guidelines might be, for example, that the WebWork docs are "self contained", meaning they don't refer to the XWork docs. Or, they might mean that all example code must be verified to work and reproduced in the example app. Whatever.
-	shs96c	Sounds reasonable
-
-	Patrick_	I think for this meeting, we should establish those guidelines and put together a rough TOC
-	Patrick_	Jason, anything to add? Otherwise, I'm ready to open it up to discussion of guidelines
-	greg--	(you might want to use the snippet macro for confluence, to make sure sample code in docs matches buildable reality - i.e. extract that code in the doc right out of cvs)
-	jcarreira	well, I'd say another guideline should be that tutorials on the example app should be documented in the doc
-	jcarreira	greg, any idea what happens with that when you export that page?
-	Patrick_	ok, sounds like greg and jason are sort of pointing to the same goal: keep the code and docs in sync
-	jcarreira	will it pull the latest code and include it?
-	greg--	jcarreira: i guess like any macro, it just exports whatever is rendered, i.e. the code as it is on cvs at the moment you export/publish
-	jcarreira	I'd also say I think we need to think about who the audience is and have a couple (at least) sets of docs... like a 5 minute quick start vs. tutorials / example app vs. reference
-	greg--	never verified that myself though
-	shs96c	Jason: the most important docs are those aimed at beginners
-	shs96c	Those are the people who need the most support
-	Patrick_	OK, i'm going to keep a list of ideas being posted here. If I don't summarize it properly, let me know.
-	Patrick_	So far:
-	Patrick_	- Keep docs and code in sync
-	jcarreira	shs96c: well, that's one important set, but a complete and up-to-date reference is important for current users (or even me)
-	Patrick_	- Partition the docs properly: getting started, advanced users, etc
-	shs96c	Agreed, but if there were holes in the docos for advanced users it would be understandable
-	vitorsouz	I think that WW docs should read more like a book, starting with the easy stuff and incrementing gradually, showing examples and explaining. This is the best approach for begginners, I guess.
-	vitorsouz	That's what I tried with the tutorial, a long time ago, and then didn't have the time to improve it (*sigh*).
-	jcarreira	vitor, that's important, but I spend a lot of time on the boards pointing people to the reference on the tags
-	jcarreira	Jay IM'd me and he's having a hard time getting into EFNET
-	vitorsouz	Ok. Reference is also desirable, as well as a cookbook: advanced tasks.
-	vitorsouz	Jason: I got into irc.ca.efnet.info with no problem.
-	shs96c	vitorsouz: sounds like how I'd expect the docs to be structured
-	Patrick_	ok, so i'm hearing needs for: reference, tutorials, getting started, and a cookbook (which is just tips and tricks, right?)
-	vitorsouz	Right. Gettint started and tutorial could be the same thing.
-	Patrick_	what about keeping the docs self-contained by not linking out to XWork?
-	shs96c	A reasonable level of self-containment would be good
-	vitorsouz	Self-contained: I think it's a good idea. Referencing to XWork gives an idea of incompleteness.
-	jcarreira	Well, I agree in general... but maybe we could use the Confluence stuff to pull in parts from XWork?
-	shs96c	Allows people commuting and reading offline to get the most out of it
-	greg--	Patrick_ that's a good point, but on the other you don't want to duplicate stuff.. there's currently some duplication and confusion, for instance with the i18n or validation docs that are both in ww and xw
-	Patrick_	Jason: I agree, if we can find ways to re-use, that is great. But I think the final result should be self-contained
-	shs96c	Perhaps a quick glossing over of some of the important XW topics would be beneficial with links to the official XW docs
-	Patrick_	so, related to that question: do you guys think WebWork docs should get the majority of the focus, with XWork as an afterthought?
-	jcarreira	shs, that doesn't help when we export the docs and include them in the distro
-	vitorsouz	Patrick: yes.
-	shs96c	jcarreira: agreed, but it's enough for someone to keep reading
-	vitorsouz	XWork is more targeted to developers, I guess. They can read the source code. ;)
-	shs96c	Not so sure about that.
-	vitorsouz	(just kidding)
-	shs96c	:P
-	Patrick_	ok, any other guidelines? we have three right now:
-	Patrick_	- Keep docs and code in sync
-	greg--	it would maybe hide xwork even more. as of now, it's not obvious what you do with xw WITHOUT ww, and maybe you guys also want to stress that?
-	Patrick_	- Break up in to main sections: tutorials (getting started, etc), reference, cookbook
-	Patrick_	- WebWork docs core focus, XWork docs not important and kept separate
-	jcarreira	well, I'm not sure about that last one
-	shs96c	I'm with Jason on this one
-	Patrick_	ok, what do you suggest?
-	shs96c	I'd like the XW docs to be "the source of truth" for XW things
-	jcarreira	I think we should look at the ability to keep the XWork docs up to date and use Confluence to include them in WebWork
-	vitorsouz	Here's another option: both XWork and WebWork (and maybe future projects derived from XWork) have the same docs.
-	Patrick_	I agree, but not at the expense of the WebWork documentation experience
-	shs96c	I'd be happy to see some high level discussion of how the XW elements affect WW2 in the WW2 docs
-	-->|	nightfal (~nightfal@c-67-180-134-149.hsd1.ca.comcast.net) has joined #webwork
-	-->|	jaybose (~chatzilla@CPE-65-27-76-47.mn.res.rr.com) has joined #webwork
-	jaybose	sorry i'm late
-	vitorsouz	Welcome Jay and nightfal.
-	Patrick_	Jay, Erik, welcome
-	shs96c	We're talking about documentation
-	jcarreira	ok, guidelines so far:
-	Patrick_	read here to catch up: http://wiki.opensymphony.com/display/WW/Temp+chat
-	Patrick_	let's nail down these three guidelines and then move on the TOC
-	jcarreira	- Keep docs and code in sync
-	jcarreira	to do that let's look at the stuff that pulls from CVS
-	jcarreira	- Break up in to main sections: tutorials (getting started, etc), reference, cookbook
-	jcarreira	I think what we have now is mostly reference, but not so well structured
-	nightfal	I agree
-	greg--	jcarreira : http://confluence.atlassian.com/display/CONFEXT/Snippet+Macro+Library
-	jcarreira	Now the one we're not so much in agreement on: - WebWork docs core focus, XWork docs not important and kept separate
-	shs96c	nod
-	jcarreira	greg, cool.. I'll take a look...
-	shs96c	That's the one I'm feeling a little uncomfortable about
-	Patrick_	well, here's my two concerns:
-	jcarreira	I'd like to keep XWork up to date, and I think Confluence can bring it all together
-	nightfal	obviously it gets tricky because *most* of the use that xwork sees is from webwork, so separating them just confuses new webwork users
-	Patrick_	1) I don't want our focus on XWork docs, since 99% of users will never download XWork
-	shs96c	Except as part of WebWork.
-	shs96c	:)
-	Patrick_	2) I want the WebWork docs to always be correctly "versioned" -- meaning that when you download WebWork 2.2 and the docs point out to XWork, they can't point to the wiki
-	Patrick_	because the wiki would be "latest", not necessarily the docs that we meant to link to at the time 2.2 was released
-	jcarreira	right, agreed
-	shs96c	We could always export the XWork and WebWork spaces together for the WebWork docs
-	jcarreira	greg, do you know the macros to pull in pieces of other pages?
-	jaybose	There are things that would better be explained under the XWork section
-	vitorsouz	What about the idea of both sharing the same docs? I got no comments on the idea (maybe because it's very very bad... :)).
-	Patrick_	I don't want users to get fragemented in to thinking about XWork and WebWork. I want them to download WebWork and just use it. That means I don't want them to have to read an XWork Reference and a WebWork Reference
-	Patrick_	vitor: i don't like that for the reasons above
-	shs96c	Then we're heading towards Vitor's idea....
-	nightfal	I agree that separate is poor
-	nightfal	is exporting both sets of docs for the ww dist an option?
-	Patrick_	I'm open to finding a way to include parts of the XWork docs in the WebWork docs via Confluence. But the end result would be *standalone* WebWork docs when exported
-	jcarreira	yeah, I think what makes sense is to pull in the parts of the xwork docs that are needed and add to them in the corresponding webwork docs page
-	Patrick_	is everyone else cool with that?
-	nightfal	I'm stepping away for a minute, I just wanted to lurk
-	nightfal	lurks
-	shs96c	Standalone is fine by me, because I like to read offline
-	Patrick_	ok, speak now or forever hold your peace :)
-	Patrick_	going once... twice...
-	jaybose	so the plan is to just reference parts of the Xwork docs?
-	vitorsouz	Wait...
-	Patrick_	waiting :)
-	jaybose	but to keep sep?
-	greg--	jcarreira : you mean {include} i believe ?
-	vitorsouz	What about not mentioning XWork in the Getting Started (Tutorial) and referencing it in the reference and cookbook.
-	vitorsouz	That way begginners wouldn't feel confused.
-	jaybose	i like that idea
-	jcarreira	yes, I think that's a good idea
-	shs96c	Beginners often think of WW2 and XW as one and the same thing...
-	Patrick_	vitor: i'm fine with referencing it as long as the _content_ that is exported appears as a standalone document. The way we would do that is by using {include} (I think)
-	vitorsouz	Ok. I'm fine with include.
-	Patrick_	So, just so we're all absolutely clear, an example of this in action might be:
-	vitorsouz	I'm more concerned with the end result for the reader, because I don't know Confluence and its features that well.
-	Patrick_	XWork/Documentation/Interceptors/Overview might talk about interceptors in general
-	greg--	i zlso it's better to mention it right away, than letting users discover the existence of xw once they think they're up to speed with ww
-	Patrick_	WebWork/Documentation/Interceptors/Overview might link to WebWork/Documentation/Interceptors/XWorkOverview
-	Patrick_	and then WebWork/Documentation/Interceptors/XWorkOverview would _include_ XWork/Documentation/Interceptors/Overview
-	greg--	mind that {include} includes a complete page, not portions of it
-	vitorsouz	Greg: we could mention it in the begginning of the tutorial, just to let the reader know, but saying they shouldn't worry about it for now.
-	Patrick_	ok. say "wait" in the next 5 seconds or we're moving on
-	greg--	vitorsouz true :)
-	jcarreira	link?
-	vitorsouz	I'm cool with that last resolution.
-	jcarreira	you mean it links now and now we want to make it include?
-	greg--	jcarreira http://docs.codehaus.org/renderer/notationhelp.action?section=confluence ?
-	Patrick_	ok, great. so now the next step is TOC -- or maybe more specifically, how do we implement these gaols.
-	Patrick_	let's start with the first one:
-	Patrick_	KEEP THE CODE AND DOCS IN SYNC
-	Patrick_	it appears that Simon and Jason are on to something that might help
-	Patrick_	what I've been doing is making the example app an actual tutorial, with the tutorials _in_ the app
-	Patrick_	it hasn't turned out too hot so far though :(
-	jcarreira	yes, we need to use the snippet macro... what do we have to do to enable the snippet macro?
-	shs96c	Sounds hard to do nicely
-	jcarreira	well, it just needs the docs written, I think
-	vitorsouz	Patrick: maybe more thought is to be given to which examples are interesting. But that's not the point right now, I guess. The point is the means of syncing, right?
-	jcarreira	the code can't stand alone for someone trying to learn
-	Patrick_	well, wait -- do we need to do te snippet macro? What about just saying that parts of the docs (say, "tutorials") are in the example app and the reference and cookbook are static?
-	Patrick_	or would that fragment things too much b/c then you wouldn't be authoring all the docs in confluence?
-	jcarreira	Hmm... so just do the tutorials completely in the example app?
-	Patrick_	maybe, i'm just tossing out ideas at this point. i don't feel strongly either way
-	vitorsouz	So the tutorial page in confluence would be just a single one, pointing to the example app in the distribution?
-	Patrick_	possibly. would that work?
-	Patrick_	how does {snippet} work?
-	greg--	jcarreira : enabling the snippet macro = dropping the jar in confluence/WEB-INF/lib and praying it works with your confluence version.
-	shs96c	I'm not keen on that idea
-	jaybose	yes, all tutorials via the example app
-	shs96c	Maybe I've grabbed the wrong end of the stick here
-	vitorsouz	I prefer the automatically syncing idea, but not sure it's feasible or easy.
-	shs96c	If we're talking about including snippets from the example app in the tutorials, that's cool
-	jcarreira	the problem there is that to update the tutorial you'd have to be a webwork developer with CVS write access
-	Patrick_	jason: good point
-	greg--	Patrick_ http://confluence.atlassian.com/display/CONFEXT/Snippet+Macro+Library : it grabs contents of your cvs repo through a cvsview, between given markers (like START SNIPPET FOO, END SNIPPET FOO)
-	Patrick_	though, we could provide "Documentation" access to webwork/tutorial in CVS
-	Patrick_	java.net does support that
-	jaybose	is that really necessary?
-	jcarreira	but that only gives access to the /web directory, doesn't it?
-	Patrick_	hmm, the snippet macro looks like it can pull parts of the content. I like it.
-	greg--	Patrick_ it can indeed
-	jaybose	is copy and paste that error-prone?
-	vitorsouz	About the snippet thing: it guarantees automatically updating existing code, but if I write a new code in the example app I have to write a new page for it and use the snippet-tag, is that correct?
-	Patrick_	jason: well, after tonight, webwork/tutorial will have all the source, libs, etc. it'll be it's own project
-	Patrick_	vitor: yes
-	jcarreira	jay, copy and paste doesn't keep things up to date
-	Patrick_	i actually really like the snippet idea
-	Patrick_	what are potential "gotchas" with it?
-	greg--	xml
-	greg--	maybe there's been a new version but last time i tried
-	greg--	few month agos
-	greg--	an xml snippet wouldn't render corretly
-	vitorsouz	I'm thinking that bugs in the snippet tag are the only concern. If it works well, no worries.
-	greg--	i mean, it was readable, but the xml colouring was messed up
-	Patrick_	we could get Atlassian to fix that I bet
-	Patrick_	or even make a copy for ourselves
-	Patrick_	that works :)
-	greg--	hmm it's not maintained by them
-	Patrick_	any other showstoppers? so far i've heard:
-	Patrick_	- new tutorials in CVS will need to have the wiki get updated
-	Patrick_	- snippet macro could be buggy
-	greg--	(mind that maybe with conf1.4 it'd work, they've rewritten the renderer)
-	Patrick_	we're running on 1.4.1
-	greg--	i can't really tell, we're still on 1.3.x at work
-	Patrick_	ok, anything else to say about? any other suggestions? say "wait" in the next 5 seconds or I'll assume we're agreed to use the snippet tag
-	Patrick_	ok, done. (trying to keep this meeting plodding right along)
-	vitorsouz	Right.
-	Patrick_	next up: sections
-	Patrick_	so we've talked about tutorials, reference, and cookbook
-	Patrick_	where would something like the general description of WW's architecture go?
-	jaybose	what goes in the three
-	Patrick_	three?
-	jaybose	we need guidelines for that
-	jaybose	three sections.
-	Patrick_	i'm not following
-	Patrick_	you mean it would be in the cookbook?
-	jaybose	ok, what would go in the cookbook, and not in the tutorials
-	vitorsouz	I think the docs should start with general information and architecture. Then explain the three sections above: Tutorials for new users, Reference for quick ref and Cookbook for advanced users looking for advanced ideas.
-	Patrick_	well, i see tutorials as things like:
-	jcarreira	the tutorials are really 2 sections: getting started and tutorials
-	shs96c	Things like injecting services into validators using Spring....\
-	Patrick_	- Getting Started, Using Validation, etc
-	Patrick_	the cookbook would b emore like:
-	Patrick_	- How to override the default XHTML templates
-	Patrick_	- Writing your own ServletDispatcher
-	Patrick_	etc
-	vitorsouz	I see the tutorials as something that starts with installation and "Hello, World" and slowly increment things until we have a complete but simple example app.
-	jaybose	getting started should be part of the ref manula
-	shs96c	vitorsouz: I like that idea
-	Patrick_	see, i think we're missing something: general documentation
-	jcarreira	yeah
-	Patrick_	i think we need a "setting up webwork" in the general docs
-	Patrick_	and then in the tutorials, a "getting started"
-	Patrick_	there is a difference:
-	jcarreira	ok docs:
-	Patrick_	in "setting up webwork", you're told what configs are needed, files, etc
-	Patrick_	in "getting started", it is a step by step hand-holding guide
-	vitorsouz	Gettint Started is in the tutorials, Setting up WebWork is in the reference.
-	jcarreira	let's start at the top level and then break each one down
-	jcarreira	we need: Getting started (includes a hello world starter app and tutorials)
-	vitorsouz	Just to further explain my point of view, once the user finishes the tutorial he/she could go to the Cookbook and check random advanced ideas, meaning that cookbook "mini-tutorials" do not depend on one another, but depend on know what's in the tutorial.
-	Patrick_	ok, let's look at a couple things:
-	jcarreira	General Documentation: includes architecture guide, what is MVC, reference
-	Patrick_	WebWork 1.x docs: http://www.opensymphony.com/webwork_old/
-	shs96c	Something like: http://wiki.rubyonrails.com/rails/show/UnderstandingRails
-	shs96c	?
-	Patrick_	WebWork 2.x docs: http://www.opensymphony.com/webwork/wikidocs/Documentation.html
-	[ERROR]	Connection to irc://efnet/ (irc://irc.prison.net/) reset.
-	=-=	User mode for Patrick__ is now +i
-	-->|	YOU (Patrick__) have joined #webwork
-	|<--	Patrick_ has left efnet (Read error 54: Connection reset by peer)
-	Patrick__	sorry, got booted
-	=-=	YOU are now known as Patrick_
-	Patrick_	ok, looking at our existing TOC, i think we're not too far from where we want to be
-	Patrick_	I think the real problem is this:
-	vitorsouz	"Understanding Rails" is nice.
-	Patrick_	http://www.opensymphony.com/webwork/wikidocs/Interceptors.html
-	Patrick_	you click on Interceptors
-	Patrick_	but now you can't get any useful info on the "prepare" interceptor, for example
-	Patrick_	http://www.opensymphony.com/webwork/wikidocs/ExecuteAndWaitInterceptor.html is what we need to aim for for every reference page
-	Patrick_	something more detailed
-	Patrick_	notice that XW has more info on some of the items:
-	Patrick_	http://wiki.opensymphony.com//display/XW/Interceptors
-	Patrick_	ok, it's getting late for everyone, I think we should wrap this up rather than letting this go on for another hour. can someone volunteer to write a new TOC that at least shows examples of drilling down to the details needed in the reference?
-	jcarreira	Yes, some of the WebWork pages for interceptors may ONLY have an include of the XWork page
-	vitorsouz	Sorry to return to the XWork/WebWork docs issue, in this case, we would have a XWork Interceptors section including XWork docs and then a WebWork-specific Interceptors section with WW stuff?
-	greg--	i'll be the 1st to leave - darn .. 4pm :d
-	jcarreira	ok, thanks for the help greg!
-	greg--	ur welcome :)
-	Patrick_	vitor: there would be a page, for example, in WebWork called PrepareInterceptor
-	greg--	bye everyone
-	|<--	greg-- has left efnet ()
-	Patrick_	and it may simply just include XWork's PrepareInterceptor page
-	Patrick_	the key is that it includes it rather than linking to it
-	|<--	jaybose has left efnet (Ping timeout: no data for 247 seconds)
-	vitorsouz	Hmmmm... Ok.
-	Patrick_	we have to be careful about links in the XWork docs though
-	-->|	jaybose_ (~chatzilla@CPE-65-27-76-47.mn.res.rr.com) has joined #webwork
-	=-=	jaybose_ is now known as jaybose
-	Patrick_	however, I think that we can sort of think of these things after the initial docs are there
-	Patrick_	Jay, i'll update the chat log
-	vitorsouz	I'd volunteer to write the TOC, but I'm going out of town tomorrow, only returning Sunday. If you guys don't mind waiting for some time next week...
-	jcarreira	Jay, do you have time to work on the TOC?
-	jaybose	yes
-	jcarreira	Ok, you can put it under the WebWork 2.2 page on the wiki... it doesn't have to link to anything yet
-	Patrick_	http://wiki.opensymphony.com/display/WW/Temp+chat
-	vitorsouz	Seems like some people have different ideas in general for the doc structure, how about we schedule the next meeting and everyone writes a TOC exemplifying his own ideas and sends it to Patrick to put online for discussion?
-	Patrick_	vitor: i like that idea. and those who don't write one don't get as much of a say :)
-	jcarreira	:-)
-	vitorsouz	:)
-	shs96c	:)
-	jcarreira	ok, when are you back from your trip Vitor?
-	vitorsouz	Late saturday night. I could work on this sunday.
-	Patrick_	haha, sounds like we have a winner then. Let's schedule the next meeting time and call it a day
-	shs96c	Same time on Sunday?
-	Patrick_	Sunday is too early
-	shs96c	OK
-	Patrick_	i'd opt for sometime after Tuesday next week.
-	jcarreira	next wed?
-	Patrick_	same time next week?
-	nightfal	Same bat time, same bat channel?
-	shs96c	Fine by me
-	vitorsouz	Alright. Wednesday 9PM Eastern.
-	jcarreira	yep, sounds like a plan
-	nightfal	TOC == Table of Contents, yes?
-	Patrick_	yes
-	vitorsouz	Yes.
-	Patrick_	great! good work guys. this was a perfect meeting too -- 60 minutes and done :)
-	Patrick_	so next week we'll nail down the TOC and divide up responsibilities
-	jcarreira	yep
-	vitorsouz	Okidoki.
-	Patrick_	i'll post the final chat log and send out a note in the forums for people interested
-	Patrick_	see ya. good meeting
-	jcarreira	ok, sounds good
-	|<--	jaybose has left efnet (Chatzilla 0.9.68.5 [Netscape 7.2/20040804])
-	vitorsouz	Good idea. Great work, everyone.
-	jcarreira	later
-
-
- -
- - diff --git a/docs/wikidocs/06-15-2005 TOC Homework.html b/docs/wikidocs/06-15-2005 TOC Homework.html deleted file mode 100644 index 474ff9d67..000000000 --- a/docs/wikidocs/06-15-2005 TOC Homework.html +++ /dev/null @@ -1,183 +0,0 @@ - - - WebWork - - 06-15-2005 TOC Homework - - - - - - - - - - -
-

Doc Team Suggestions

- -

Documentation Style

- -

Click here for the suggestions on documentation style.

- - -

Documentation:

- -

One-paragraph description of what is WebWork. And then, an explanation of how the documentation is divided:

- -

If you're new to WebWork, please read the Overview and proceed to the Tutorial to get started. Experienced users can refer to the Cookbook for advanced topics. Use the Reference on an as-needed basis for more specific details. For detailed information about WebWork project, read the section Project Information. Information about many projects related to WebWork can be found in Related Projects

- -

If you have any questions, you can ask them at the user forum/mailing list. Please be sure to read the FAQ before asking any questions.

- -
    -
  1. Overview
  2. -
  3. Project Information
  4. -
  5. FAQ
  6. -
  7. Tutorial
  8. -
  9. Cookbook
  10. -
  11. Reference
  12. -
  13. Related Projects
  14. -
- - -

(details on each of the above follows)

- -

Overview

-
    -
  1. What is WebWork
  2. -
  3. Comparison to Struts (Tapestry, JSF, etc.?) – current material and links to existing articles
  4. -
  5. Articles and press about WebWork
  6. -
  7. Projects using WebWork / Testimonials
  8. -
- - -

Project Information

-
    -
  1. License
  2. -
  3. Deployment notes
  4. -
  5. WebWork versions -
      -
    • Current release
    • -
    • Previous releases
    • -
    • Migrating from WebWork 1.x;
    • -
    -
  6. -
  7. Dependencies
  8. -
  9. WebWork Team
  10. -
  11. WebWork community -
      -
    • Mailing lists / Forum
    • -
    • Bug tracker
    • -
    • Wiki
    • -
    • How to contribute?
    • -
    -
  12. -
- - -

FAQ

-
    -
  1. Category 1
  2. -
  3. Category 2
  4. -
  5. Etc.
  6. -
- - -

The questions included in the FAQ should be extracted from the User Forum/Mailing List. Someone could review recent messages and find out which questions are asked the most. After that, separate the questions into categories to form the subsections.

- -

Tutorial

-
    -
  1. Downloading and installing WebWork
  2. -
  3. Setting up the test environment (to test tutorial source code)
  4. -
  5. Basic configuration and your first action (Hello WebWorld)
  6. -
  7. Understanding actions
  8. -
  9. Understanding results
  10. -
  11. Meet WebWork tag library (would also explain a little bit of OGNL)
  12. -
  13. Evaluating other view options: Velocity
  14. -
  15. Evaluating other view options: FreeMarker
  16. -
  17. Understanding interceptors
  18. -
  19. Performing validation
  20. -
  21. Performing dependency injection (IoC) through components
  22. -
  23. Going i18n (internationalization)
  24. -
  25. Retrieving data without a full request using XHR/Ajax
  26. -
- - -

This should be in conformance to Patrick's example app. Vitor will talk to Patrick to get his opinions on the sequence of lessons suggested above and how to make the tutorial conformant to the example app.

- -

Cookbook

-
    -
  • Tips and tricks on Application Servers (this was in "Overview")
  • -
  • Stuff from the current Cookbook...
  • -
- - -

All the tips in the Cookbook should be revised. Some of them could belong to the tutorial instead (basic stuff). 3rd party integration tips could be separated from the rest. Also, it would be good if all of them also followed the same structure, kind of like a tutorial lesson, but on advanced topics. The differences between the Tutorial and the Cookbook would be:

- - - - - - - - - - - - - - - - - - - - - - -
  Tutorial Cookbook
User level required: Begginner Intermediate
Availability of Source code: In the documentation and in the src folder of the distribution (ready for deploy and test). Only in the documentation, and may not be complete.
Should be read in sequence? Yes. No.
- -

A question that arised in the TOC discussion was: what's the difference between the Cookbook and the FAQ? Well, some of the items in the Cookbook are also FAQs (people ask about them a lot), so they would also be included in the FAQ, with links to the Cookbook. The FAQ should have quick answers or link to longer answers, such as the Cookbook. The Cookbook is tutorial-style, a collection of mini HOW-TOs.

- -

Reference

-
    -
  1. Introduction – This will have parts of Overview in it, rather than forwarding them to Overview altogether.
  2. -
  3. Architecture
  4. -
  5. Configuration
  6. -
  7. Interceptors
  8. -
  9. Action Chaining
  10. -
  11. IOC / Dependency Injection
  12. -
  13. UI Components - JSP, Velocity, Freemarker, JavaScript validation and DWR support
  14. -
  15. Result Types
  16. -
  17. Type Conversion
  18. -
  19. Validation
  20. -
  21. OGNL / Object Graph Navigation Language
  22. -
  23. Internationalization
  24. -
  25. 3rd Party Integration - Sitemesh, Spring, Pico, Hibernate, JUnit, Quartz, etc.
  26. -
- - -

An important thing about the reference is that it should be written in book-style (or hibernate-reference-style) so a PDF version would be generated and people could print it, pass it around the office or read it while working out or relaxing in bed. Therefore, Confluence's PDF features play a big part in this. Some questions that came up during the discussions:

- -
    -
  • The reference could link to other pages in some situations. Links in confluence do not reference URLs, but the page's names. Does Confluence convert them to the URL before writing the PDF? If not, should the Reference not link to any pages outside it?
  • -
- - -
    -
  • Can we select which pages are converted into PDF? If we want to convert only the Reference to PDF, can we do that? How does that work?
  • -
- - -

Related Projects

-
    -
  1. WebFlow (graphical chart tool)
  2. -
  3. EclipseWork (Eclipse Plugin)
  4. -
  5. IDEA Plugin
  6. -
  7. WebWork Optional
  8. -
  9. Etc. ?
  10. -
- - -
- - diff --git a/docs/wikidocs/07-04-2005 Documentation.html b/docs/wikidocs/07-04-2005 Documentation.html deleted file mode 100644 index 6a19e0343..000000000 --- a/docs/wikidocs/07-04-2005 Documentation.html +++ /dev/null @@ -1,431 +0,0 @@ - - - WebWork - - 07-04-2005 Documentation - - - - - - - - - - -
-

Attendees

-
    -
  • Vitor Souza
  • -
  • Jay Bose
  • -
  • Alexandru
  • -
- - -

Outcome

-

Look to this updated page: http://wiki.opensymphony.com/pages/viewpage.action?pageId=4795

- -

Transcript

-
-
[7/4/2005 5:17 PM] <jaybose> forget it, i am.
-[7/4/2005 5:17 PM] <the_mind> what do you mean by recording?
-[7/4/2005 5:17 PM] <jaybose> logging
-[7/4/2005 5:17 PM] <jaybose> so others can view it lat4er
-[7/4/2005 5:18 PM] <the_mind> i thought i can copy and paste it :">
-[7/4/2005 5:18 PM] <jaybose> you can do that too
-[7/4/2005 5:18 PM] <jaybose> :-)
-[7/4/2005 5:18 PM] <jaybose> hey, did you read his page?
-[7/4/2005 5:18 PM] <the_mind> sorry to ask: who are you nightfal?
-[7/4/2005 5:18 PM] <the_mind> whose page?
-[7/4/2005 5:20 PM] <jaybose> Vitor made a page: http://wiki.opensymphony.com/pages/viewpage.action?pageId=4795
-[7/4/2005 5:20 PM] <jaybose> that's what we'll be working off of
-[7/4/2005 5:20 PM] <jaybose> the main purpose of this meeting is to nail down a TOC
-[7/4/2005 5:20 PM] <the_mind> yep... i just wanted to see if anything else comes out
-[7/4/2005 5:20 PM] <jaybose> and then get the dev team in general to clear it
-[7/4/2005 5:21 PM] <jaybose> dev team really meaning Patrick and Jason
-[7/4/2005 5:21 PM] -->| vitor (c91d085c@chat.efnet.org) has joined #webwork
-[7/4/2005 5:21 PM] <jaybose> hey Vitor
-[7/4/2005 5:21 PM] <jaybose> ready to go?
-[7/4/2005 5:22 PM] <the_mind> from my pov yes (... almost falling asleep :-( )
-[7/4/2005 5:22 PM] <jaybose> haha
-[7/4/2005 5:22 PM] <vitor> Hey. Sorry, I'm struggling with this webchat.
-[7/4/2005 5:22 PM] <jaybose> np
-[7/4/2005 5:23 PM] -->| vitorsouz (~vircuser@201.29.8.92) has joined #webwork
-[7/4/2005 5:23 PM] <vitorsouz> This is much better. Using vIRC now.
-[7/4/2005 5:23 PM] |<-- vitor has left efnet (Remote host closed the connection)
-[7/4/2005 5:23 PM] <vitorsouz> Don't know what happened. mIRC couldn't connect. I even got a D-Lined message! ouch!
-[7/4/2005 5:23 PM] <jaybose> hmm
-[7/4/2005 5:23 PM] <vitorsouz> Sorry for this big mess... Ready to go now.
-[7/4/2005 5:24 PM] <jaybose> ok, cool
-[7/4/2005 5:24 PM] <jaybose> umm forst off
-[7/4/2005 5:24 PM] <jaybose> looking at your page
-[7/4/2005 5:24 PM] <jaybose> we want an overview
-[7/4/2005 5:24 PM] <vitorsouz>  Ok. Let me open it here too
-[7/4/2005 5:25 PM] <vitorsouz> Meaning you want me to explain what I'm thinking?
-[7/4/2005 5:25 PM] <jaybose> kind of, what should the overview way about WW?
-[7/4/2005 5:25 PM] <jaybose> say*
-[7/4/2005 5:26 PM] <jaybose> I noted what WW is, and what it is not
-[7/4/2005 5:26 PM] <vitorsouz> Ok.
-[7/4/2005 5:26 PM] <jaybose> so that would mean a MVS web framework built on XWork
-[7/4/2005 5:26 PM] <jaybose> maybe say waht XWork is brielfy
-[7/4/2005 5:26 PM] <jaybose> MVC*
-[7/4/2005 5:27 PM] <vitorsouz> Good.
-[7/4/2005 5:28 PM] <vitorsouz> I think the overview should briefly describe the software and bring other information that's interesting to people that are thinking of evaluating it.
-[7/4/2005 5:28 PM] <jaybose> like?
-[7/4/2005 5:28 PM] <the_mind> i think that articles and press and testimonials is a very good way to introduce WW
-[7/4/2005 5:28 PM] <vitorsouz> So I placed: what is WebWork (could include what it is not), comparison to Struts and others, something about the community, articles and testimonials.
-[7/4/2005 5:29 PM] <jaybose> ok
-[7/4/2005 5:29 PM] <the_mind> a comparison to other solution cannot be very detailed so the user may be lost already
-[7/4/2005 5:29 PM] <vitorsouz> It should not teach WW to anyone. That's the reference and the tutorial's jobs.
-[7/4/2005 5:29 PM] <jaybose> great.
-[7/4/2005 5:29 PM] <vitorsouz> themind: I think the reference is for experienced users only.
-[7/4/2005 5:29 PM] <vitorsouz> I mean, comparison.
-[7/4/2005 5:29 PM] <vitorsouz> The comparison is for experienced users. People that know another framework.
-[7/4/2005 5:30 PM] <the_mind> yep but you want this put into the overview
-[7/4/2005 5:30 PM] <jaybose> evaluators will find a comparison helpful
-[7/4/2005 5:30 PM] <vitorsouz> It's a section of the overview. I don't think the overview is meant for sequential reading.
-[7/4/2005 5:30 PM] <the_mind> if i am a new user i would like to read this from an independent way... so pointing to articles
-[7/4/2005 5:30 PM] <jaybose> and they will definitely look in the overview.
-[7/4/2005 5:31 PM] <vitorsouz> We could call it an "Appendix" of the overview, to stress that it's not essential for the newbie. But I'm not sure this is really needed.
-[7/4/2005 5:32 PM] <the_mind> moreover spending time to do a full cycle comparison - when these are already available is no use... just my 2c
-[7/4/2005 5:32 PM] <vitorsouz> You're right about that: it should be mostly pointers to other people's evaluations, eg. Matt Raible's.
-[7/4/2005 5:32 PM] <jaybose> we already have one
-[7/4/2005 5:32 PM] <jaybose> it
-[7/4/2005 5:32 PM] <jaybose> it's a matter of placement
-[7/4/2005 5:33 PM] <the_mind> excellent vitor
-[7/4/2005 5:33 PM] <vitorsouz> That's another thing: the developers already wrote technical differences between WW and Struts.
-[7/4/2005 5:33 PM] <vitorsouz> So we would place that there and pointers to other articles.
-[7/4/2005 5:33 PM] <the_mind> exactly
-[7/4/2005 5:33 PM] <the_mind> or it can be a part of the FAQ
-[7/4/2005 5:33 PM] <the_mind> i usually see this comparison included in FAQs
-[7/4/2005 5:34 PM] <vitorsouz> Ok. Just so I'm not completely lost in the process here. Are we starting from my suggestions? From Jay's suggestions? How is this discussion working?
-[7/4/2005 5:34 PM] <the_mind> but this is not important for me (the placement)
-[7/4/2005 5:34 PM] <jaybose> I am pulling things from your suggestions
-[7/4/2005 5:34 PM] <vitorsouz> Okay.
-[7/4/2005 5:34 PM] <the_mind> i was reading this http://wiki.opensymphony.com/pages/viewpage.action?pageId=4795
-[7/4/2005 5:35 PM] <the_mind> and commenting around - nothing more :-(
-[7/4/2005 5:35 PM] <vitorsouz> That's alright. Sounds good to me. :)
-[7/4/2005 5:35 PM] <jaybose> Ok, anymore on Overview, or move on to Project Information?
-[7/4/2005 5:35 PM] <vitorsouz> That would be my question, exactly.
-[7/4/2005 5:35 PM] <the_mind> from my pov i can move on
-[7/4/2005 5:36 PM] <jaybose> ok so Prj Info, what do we want in here?
-[7/4/2005 5:36 PM] <vitorsouz> Just to wrap up, then: I'll add "(What WW is not)" to the side of "What is WebWork", just to emphasize.
-[7/4/2005 5:36 PM] <the_mind> quite clear and complete imo
-[7/4/2005 5:37 PM] <jaybose> ehhh
-[7/4/2005 5:37 PM] <jaybose> i'm not for that
-[7/4/2005 5:37 PM] <jaybose> anymore
-[7/4/2005 5:37 PM] <the_mind> go on
-[7/4/2005 5:37 PM] <the_mind> hit it
-[7/4/2005 5:37 PM] <jaybose> let the reader figure it out
-[7/4/2005 5:37 PM] <vitorsouz> Sorry. I'm lost again.
-[7/4/2005 5:37 PM] <vitorsouz> You're not for "What WW is not"?
-[7/4/2005 5:38 PM] <jaybose> by saying it's a web based MVC, that should be enough
-[7/4/2005 5:38 PM] <jaybose> yeah.
-[7/4/2005 5:38 PM] <vitorsouz> Ok.
-[7/4/2005 5:38 PM] <the_mind> i would say about WW what is already said
-[7/4/2005 5:38 PM] <vitorsouz> I'll add a note saying that.
-[7/4/2005 5:38 PM] <the_mind> a MVC based on XWork (a command .... ) and that's it
-[7/4/2005 5:39 PM] <jaybose> I'm taking a bunch of notes, i can add them to the page after the meeting
-[7/4/2005 5:39 PM] <vitorsouz> Ok. That's better than. I won't bother doing it too.
-[7/4/2005 5:39 PM] <jaybose> Project Information: ...
-[7/4/2005 5:39 PM] <vitorsouz> Ok. What would you guys add or remove?
-[7/4/2005 5:39 PM] <jaybose> I'd keep.
-[7/4/2005 5:40 PM] <the_mind> for me it is perfect... already said it
-[7/4/2005 5:40 PM] <jaybose> I assume this is Team members, mailing lists, etc
-[7/4/2005 5:40 PM] <vitorsouz> Mailing lists is included in "WebWork Community" under Overview.
-[7/4/2005 5:40 PM] <the_mind> these are included already in overview
-[7/4/2005 5:40 PM] <vitorsouz> Team is not explicit in the Project Information sections. You could add it there later.
-[7/4/2005 5:41 PM] <jaybose> so what did you think for that section?
-[7/4/2005 5:41 PM] <the_mind> vitor i think it is a good idea to move everything related to ml, team, etc to project information
-[7/4/2005 5:41 PM] <vitorsouz> 1. License; 2. Deployment notes; 3. Versions; 4. Dependencies; 5. WebWork Team.
-[7/4/2005 5:41 PM] <vitorsouz> Do you think it should be removed from Overview, then?
-[7/4/2005 5:41 PM] <the_mind> and leave the Overview as a simple intro to the project
-[7/4/2005 5:41 PM] <jaybose> I agree w/ the_mind, all that should leave Overview and go to Prj Info
-[7/4/2005 5:41 PM] <the_mind> yes that's it
-[7/4/2005 5:41 PM] <vitorsouz> Ok. SO the whole "WebWork Community" section would move to P.Info?
-[7/4/2005 5:42 PM] <the_mind> oke with me +1
-[7/4/2005 5:42 PM] <jaybose> yes
-[7/4/2005 5:42 PM] <vitorsouz> Ok. I agree too. Then it's License, Deployment notes, Versions, Dependencies, WebWork Team and Community.
-[7/4/2005 5:43 PM] <vitorsouz> Not necessarily in this order.
-[7/4/2005 5:43 PM] <jaybose> License, Deployment notes, Versions, Dependencies, WebWork Team, Mailing Lists, Forum
-[7/4/2005 5:43 PM] <the_mind> License, versions, dependencies, www and community, deployment
-[7/4/2005 5:43 PM] <jaybose> When you say community, what does that currently mean?
-[7/4/2005 5:43 PM] <the_mind> i see if license is good for me
-[7/4/2005 5:44 PM] <the_mind> than i choose the version for which i see dependencies
-[7/4/2005 5:44 PM] <the_mind> than i look for community stuff
-[7/4/2005 5:44 PM] <the_mind> and if needed i will go to deployment tricks
-[7/4/2005 5:44 PM] <vitorsouz> It's item number 3 under Overview: Mailing Lists/Forum, Bug Tracker, Wiki, How to Contribute.
-[7/4/2005 5:44 PM] <vitorsouz> The idea now is to move it to Prj. Info
-[7/4/2005 5:44 PM] <the_mind> do not forget team members
-[7/4/2005 5:45 PM] <jaybose> yep
-[7/4/2005 5:45 PM] <the_mind> so let's see the order and move on
-[7/4/2005 5:45 PM] <the_mind> :D
-[7/4/2005 5:45 PM] <jaybose> ok, so Overview should be very light in comparison to what is it now.
-[7/4/2005 5:46 PM] <jaybose> We could hash out the order a little later.
-[7/4/2005 5:46 PM] <vitorsouz> Yes. I'm updating the page so we close this issue...
-[7/4/2005 5:46 PM] <the_mind> oke
-[7/4/2005 5:46 PM] <vitorsouz> Ok. Refresh it and check if it's correct now.
-[7/4/2005 5:46 PM] <the_mind> i will miss the important part :((
-[7/4/2005 5:47 PM] <the_mind> good
-[7/4/2005 5:47 PM] <jaybose> Overview looks great
-[7/4/2005 5:47 PM] <jaybose> FAQ or more on Prj Info?
-[7/4/2005 5:48 PM] <vitorsouz> I think FAQ could have it's own section because we could create subsections, such as "Questions about the project", "Questions on Validators", "Questions on Velocity/Freemarker", etc...
-[7/4/2005 5:48 PM] <the_mind> tutorial or cookbook
-[7/4/2005 5:48 PM] <vitorsouz> Hmmm... I got it now, Jay
-[7/4/2005 5:48 PM] <vitorsouz> Nevermind what I said.
-[7/4/2005 5:48 PM] <vitorsouz> I misunderstood your question :)
-[7/4/2005 5:48 PM] <jaybose> yes, like Caucho does for Resin
-[7/4/2005 5:48 PM] <jaybose> no you did not.
-[7/4/2005 5:49 PM] <the_mind> i would let last the faq as passing through the other stuff it will get more clear what should be in the faq
-[7/4/2005 5:49 PM] <vitorsouz> I thought you meant putting FAQ under Prj. Info. 
-[7/4/2005 5:49 PM] <vitorsouz> Was that what you meant?
-[7/4/2005 5:49 PM] <jaybose> haha, no. I agree on your structure idea
-[7/4/2005 5:49 PM] <vitorsouz> Ok. So are we closed on Overview and Prj. Info?
-[7/4/2005 5:49 PM] <jaybose> yep. 
-[7/4/2005 5:49 PM] <the_mind> yep
-[7/4/2005 5:50 PM] <vitorsouz> All raise your hands. \o_ :P
-[7/4/2005 5:50 PM] <vitorsouz> Just kidding. Moving on to FAQ, then.
-[7/4/2005 5:50 PM] <the_mind> \^/
-[7/4/2005 5:50 PM] <jaybose> :-)
-[7/4/2005 5:50 PM] <jaybose> In terms of FAQ content, does WW have one now?
-[7/4/2005 5:50 PM] <the_mind> i don't think so
-[7/4/2005 5:50 PM] <vitorsouz> Not sure. Let me check.
-[7/4/2005 5:50 PM] <the_mind> that's why i would let the faq be the last
-[7/4/2005 5:51 PM] <jaybose> http://wiki.opensymphony.com/display/WW/FAQ
-[7/4/2005 5:51 PM] <vitorsouz> That's it.
-[7/4/2005 5:51 PM] <jaybose> ok, so first off, we need to order this better, and make it into sections.
-[7/4/2005 5:51 PM] <vitorsouz> Should we bother creating the FAQ sections now?
-[7/4/2005 5:52 PM] <vitorsouz> Maybe we could think about it later.
-[7/4/2005 5:52 PM] <jaybose> i agree, we'll tackle later
-[7/4/2005 5:52 PM] <jaybose> I say skip Tutorial
-[7/4/2005 5:53 PM] <jaybose> that should come based on Patrick's example app
-[7/4/2005 5:53 PM] <vitorsouz> I haven't seen Patrick's example app.
-[7/4/2005 5:53 PM] <jaybose> neither have I, that's why it should wait.
-[7/4/2005 5:53 PM] <the_mind> i have only one comment
-[7/4/2005 5:54 PM] <the_mind> i should not provide an example with scriptlets
-[7/4/2005 5:54 PM] <the_mind> otherwise in terms of evolution of the tutorial it seems oke to me
-[7/4/2005 5:54 PM] <jaybose> scriplets?
-[7/4/2005 5:54 PM] <vitorsouz> Ok. I'll talk to Patrick, then.
-[7/4/2005 5:54 PM] <the_mind> Understanding actions (includes note on displaying data using Scriptlets)
-[7/4/2005 5:54 PM] <jaybose> ok
-[7/4/2005 5:55 PM] <the_mind> let's wait the example app and than we will fix this one
-[7/4/2005 5:55 PM] <jaybose> Moving to Cookbook: what type of docs should go in here?
-[7/4/2005 5:55 PM] <the_mind> is Patrick working on it?
-[7/4/2005 5:55 PM] <the_mind> or should we?
-[7/4/2005 5:55 PM] <jaybose> he is, or is done.
-[7/4/2005 5:55 PM] <the_mind> i have noticed something in cvs but not sure yet
-[7/4/2005 5:56 PM] <vitorsouz> I'll talk to him. If he likes any of my suggestions on the tutorial, I'll help him develop the example app to conform with the tutorial.
-[7/4/2005 5:56 PM] <vitorsouz> And vice-versa.
-[7/4/2005 5:56 PM] <jaybose> Ok. So far you have the following for Cookbook:
-Tips and tricks on Application Servers (this was in "Overview") 
-Accessing application, session and request objects; 
-How to format dates and numbers; 
-Other stuff from the revised Cookbook... 
-[7/4/2005 5:56 PM] <the_mind> yes there is something in cvs
-[7/4/2005 5:57 PM] <the_mind> see webwork-example dir
-[7/4/2005 5:57 PM] <vitorsouz> Yeah, my suggestions on the Cookbook were detailed in the paragraph and table that follows the bulleted list.
-[7/4/2005 5:57 PM] <vitorsouz> I think the lessons in the current cookbook should be revised.
-[7/4/2005 5:58 PM] <vitorsouz> Basic ones should be moved to tutorial.
-[7/4/2005 5:58 PM] <the_mind> i would include in cookbook: alt syntax
-[7/4/2005 5:58 PM] <jaybose> Ok, saw it.
-[7/4/2005 5:58 PM] <the_mind> extensive validation
-[7/4/2005 5:58 PM] <the_mind> custom interceptors
-[7/4/2005 5:58 PM] <jaybose> he's a Q: what should go into the FAQ?
-[7/4/2005 5:58 PM] <the_mind> we should extract teh faq from the ML
-[7/4/2005 5:59 PM] <the_mind> browse a little the forum and identify the most asked questions
-[7/4/2005 5:59 PM] <the_mind> that's what i would like to see in a faq
-[7/4/2005 5:59 PM] <jaybose> I see the diff b/w cookbook and tutorial; but what's the diff b/w these and the FAQ?
-[7/4/2005 5:59 PM] <the_mind> shortcuts
-[7/4/2005 5:59 PM] <jaybose> Maybe level of complexity?
-[7/4/2005 5:59 PM] <vitorsouz> Maybe.
-[7/4/2005 5:59 PM] <jaybose> shortcuts?
-[7/4/2005 5:59 PM] <the_mind> the faq should be a shortcut to forum questions
-[7/4/2005 5:59 PM] <the_mind> and to tricky parts
-[7/4/2005 5:59 PM] <vitorsouz> A cookbook is more detailed than the FAQ.
-[7/4/2005 6:00 PM] <the_mind> absolutely
-[7/4/2005 6:00 PM] <the_mind> a cookbook is offering internals
-[7/4/2005 6:00 PM] <the_mind> a faq: as the name says: frequently asked questions... this is why i would look in the ML for the FAQ points
-[7/4/2005 6:01 PM] <jaybose> Yeah, but we'd enter the Faq questions. They'd be entered after a bunch of ppl as the same question.
-[7/4/2005 6:02 PM] <jaybose> ok, I guess the Faq could also point to Cookbook answers
-[7/4/2005 6:02 PM] <vitorsouz> I think what Jay is trying to say is: "How do I integrate WW with Spring" is a FAQ. A lot of people ask it.
-[7/4/2005 6:02 PM] <the_mind> yes
-[7/4/2005 6:02 PM] <vitorsouz> Exactly: link from the FAQ to the cookbook.
-[7/4/2005 6:02 PM] <the_mind> how do i pass parameters in xwork.xml
-[7/4/2005 6:02 PM] <the_mind> and so on... this can be links to the cookbook or tutorial
-[7/4/2005 6:03 PM] <the_mind> these*
-[7/4/2005 6:03 PM] <vitorsouz> Alright.
-[7/4/2005 6:03 PM] <jaybose> Related Projects: ...
-[7/4/2005 6:03 PM] <vitorsouz> So, do we think about what the Cookbook should have now or just leave the suggestion as it is?
-[7/4/2005 6:03 PM] <jaybose> (skipping ref for a sec)
-[7/4/2005 6:03 PM] <jaybose> the suggestion seems good enough
-[7/4/2005 6:04 PM] <jaybose> it's clear what needs to be done
-[7/4/2005 6:04 PM] <vitorsouz> Ok. Related Projects then.
-[7/4/2005 6:04 PM] <jaybose> the person who takes that section will have to figure it out
-[7/4/2005 6:04 PM] <the_mind> i think the info in cookbook should include almost everything in the wiki right now that will not be covered in the tutorial
-[7/4/2005 6:05 PM] <the_mind> it will be by far the toughest job
-[7/4/2005 6:05 PM] <vitorsouz> Certainly.
-[7/4/2005 6:05 PM] <the_mind> i don't think one single guy can do it
-[7/4/2005 6:05 PM] <vitorsouz> Related Projects include information on other projects, like WebFlow, Plugins, Optional modules, etc.
-[7/4/2005 6:05 PM] <jaybose> Vitor has:
-WebFlow (graphical chart tool) 
-EclipseWork (Eclipse Plugin) 
-IDEA Plugin 
-WebWork Optional
-[7/4/2005 6:05 PM] <the_mind> i think at least 2 should work on it
-[7/4/2005 6:05 PM] <the_mind> even in parallel
-[7/4/2005 6:05 PM] <jaybose> the_mind: that will probably happen.
-[7/4/2005 6:05 PM] <the_mind> why are you orange?
-[7/4/2005 6:06 PM] <the_mind> :-/
-[7/4/2005 6:06 PM] <vitorsouz> So, anything to add or change in the "Related Projects"?
-[7/4/2005 6:06 PM] <jaybose> No, these seem pretty self-explanatory
-[7/4/2005 6:07 PM] <vitorsouz> Ok. Can we start the discussion about the Reference, then?
-[7/4/2005 6:07 PM] <jaybose> yep.
-[7/4/2005 6:07 PM] <jaybose> this is what i had:
-[7/4/2005 6:07 PM] <vitorsouz> Ok. There's your suggestion and there's my comments on it.
-[7/4/2005 6:07 PM] <jaybose> What is Webwork - also explain what Webwork is not. 
-Architecture 
-Getting Started/Deployment Notes 
-Configuration 
-Interceptors 
-Action Chaining 
-IOC 
-JSP & Velocity Tags - this would be the current tag information, combined with the current "JSP Expression Language Comparison with Webwork 1.x" pages 
-Webwork Freemarker Support 
-Result Types 
-Type Conversion 
-Validation 
-OGNL 
-Internationalization 
-Webflow 
-3rd Party Integration 
-[7/4/2005 6:07 PM] <jaybose> I like Jay Bose's reference TOC (below). On top of it, I'd suggest:
-
- Remove "What is WebWork" and "Getting Started/Deployment Notes";
-
- Replace them with "Introduction", in which there would be instructions to read the Overview first and proceed to the tutorial if the reader wants to get started;
-
- Append "/ Dependency Injection" to "IoC", because some people may know it only by the name "Dependency Injection";
-
- Group "JSP & Velocity Tags" with "WebWork Freemarker Support" to create a single section that contains everything related to user interface (in subsections);
-
- "JSP Expression Language Comparison with WebWork 1.x" should be in "Migrating from WebWork 1.x", in the "Project Information" section;
-
- Add to that same UI topic: JavaScript validation and DWR support (is this in 2.2?);
-
- WebFlow would be in "Related Projects";
-
- Have "3rd Party Integration" be links to Cookbook pages that explain how to integrate with SiteMesh, Spring, Pico, Hibernate, JUnit, Quartz, etc.
-
-
-[7/4/2005 6:07 PM] <the_mind> i must go to sleep now... sorry 2am
-[7/4/2005 6:08 PM] <jaybose> goodnight
-[7/4/2005 6:08 PM] <vitorsouz> Ok, the_mind: good night. Thanks for your opinions.
-[7/4/2005 6:08 PM] <the_mind> jay pls send me the log 
-[7/4/2005 6:08 PM] <jaybose> it will be on the forum, i'll send an email
-[7/4/2005 6:08 PM] <the_mind> i will comment on it... but as far as can say you are moving pretty well without me
-[7/4/2005 6:08 PM] <the_mind> :)
-[7/4/2005 6:08 PM] <the_mind> good nite
-[7/4/2005 6:08 PM] <vitorsouz> Night
-[7/4/2005 6:09 PM] <jaybose> Vitor: give me a minute, i'll give a hybrid of your comments on it
-[7/4/2005 6:09 PM] |<-- the_mind has left efnet (http://chat.efnet.org)
-[7/4/2005 6:09 PM] <vitorsouz> Ok. I will hold.
-[7/4/2005 6:10 PM] <vitorsouz> But since I'm not a native english speaker, I don't know what you meant by "give a hybrid of my comments" :)
-[7/4/2005 6:14 PM] <jaybose> i am made changes to my suggestions, based on your comments
-[7/4/2005 6:15 PM] <jaybose> Introduction - which will have parts of Overview in it, rather than forwarding them to Overview altogether.
-Architecture 
-Configuration 
-Interceptors 
-Action Chaining 
-IOC / Dependency Injection
-UI Components - JSP, Velocity, Freemarker, JavaScript validation and DWR support
-Result Types 
-Type Conversion 
-Validation 
-OGNL 
-Internationalization 
-3rd Party Integration - SiteMesh, Spring, Pico, Hibernate, JUnit, Quartz, etc.
-[7/4/2005 6:15 PM] <vitorsouz> Did you update the wiki page?
-[7/4/2005 6:15 PM] <jaybose> now, i did not really chg the 3rd party, and i am trying to add parts of Overview to the Intro
-[7/4/2005 6:15 PM] <jaybose> not yet
-[7/4/2005 6:15 PM] <vitorsouz> Ok, let me take a look at it here then.
-[7/4/2005 6:16 PM] <jaybose> the reason for this is i believe the ref should be a doc that ppl could print on it's own and pass around the office
-[7/4/2005 6:16 PM] <jaybose> wiki is great, but not as simple to handle as a complete product doc in PDF manual
-[7/4/2005 6:16 PM] <jaybose> similar to Spring and Hibernate
-[7/4/2005 6:17 PM] <jaybose> i think WW should move in that direction
-[7/4/2005 6:17 PM] <vitorsouz> Ok. Agreed.
-[7/4/2005 6:17 PM] <vitorsouz> I think the merge is good.
-[7/4/2005 6:18 PM] <vitorsouz> About 3rd party info: it would not be links to the cookbook, then?
-[7/4/2005 6:18 PM] <jaybose> So there could be links to things within the ref, but it should a standalone document. If a user needs more info on a subject, then they should look to the tutorial or cookbook.
-[7/4/2005 6:18 PM] <vitorsouz> Ok.
-[7/4/2005 6:18 PM] <jaybose> no, b/c that is something ppl use a lot
-[7/4/2005 6:19 PM] <vitorsouz> Should we define, then, that the Reference doesn't link to anyone, people link to the reference?
-[7/4/2005 6:19 PM] <jaybose> i know when i was adding Spring to my app, i looked at it's Hibnernate support section constantly
-[7/4/2005 6:19 PM] <jaybose> hmm, maybe
-[7/4/2005 6:19 PM] <vitorsouz> So if "Spring integration in WebWork" is a FAQ and a Cookbook, they all link to the reference, which will be written book-style.
-[7/4/2005 6:19 PM] <jaybose> i think the reference could tell ppl where to find more information: cookbook, tutorial
-[7/4/2005 6:19 PM] <vitorsouz> If not book-style, hibernate-reference-style.
-[7/4/2005 6:19 PM] <jaybose> yes.
-[7/4/2005 6:20 PM] <vitorsouz> But would Confluence convert links to other pages to full URLs?
-[7/4/2005 6:20 PM] <vitorsouz> When generating PDF?
-[7/4/2005 6:21 PM] <vitorsouz> Can we ask Confluence to generate only the Reference as PDF and all of its links to outside be converted?
-[7/4/2005 6:21 PM] <jaybose> Why would not want the links to stay as is?
-[7/4/2005 6:21 PM] <jaybose> Should the links change?
-[7/4/2005 6:21 PM] <vitorsouz> Because if the Cookbook is not generated as PDF to be printed and passed around, we need to change the links to the cookbook to their complete URL.
-[7/4/2005 6:22 PM] <vitorsouz> Or am I missing something?
-[7/4/2005 6:22 PM] <jaybose> ahhhh
-[7/4/2005 6:22 PM] <jaybose> now i understand
-[7/4/2005 6:22 PM] <jaybose> so the links are relative now?
-[7/4/2005 6:23 PM] <jaybose> or you mean, you only see the name w/ an underline
-[7/4/2005 6:23 PM] <vitorsouz> Yes.
-[7/4/2005 6:23 PM] <vitorsouz> But not only that.
-[7/4/2005 6:23 PM] <vitorsouz> When you link from one page to another in Confluence you just have to write the page's name.
-[7/4/2005 6:23 PM] <vitorsouz> For example, the TOC Homework page references my suggestions on syle.
-[7/4/2005 6:24 PM] <vitorsouz> Like this: [Click here|Style Guide]
-[7/4/2005 6:24 PM] <vitorsouz> Click here is the text that will be underlined.
-[7/4/2005 6:24 PM] <vitorsouz> The rest is the name of the page, which serves as URL.
-[7/4/2005 6:24 PM] <jaybose> We can't control that, most references do that. If they need to see what a link would lead to, they have to go back to the pdf and click on the link.
-[7/4/2005 6:24 PM] <jaybose> we need to ask patrick if we can make the links full url's under the name
-[7/4/2005 6:24 PM] <jaybose> i bet not. crap.
-[7/4/2005 6:25 PM] <vitorsouz> Ok. Also we have to ask him how do we organize the sections in a way that we can choose to generate PDF only for the Reference, not the other pages.
-[7/4/2005 6:25 PM] <jaybose> By the way, i hate confluence.
-[7/4/2005 6:25 PM] <jaybose> ok, so we'll need to see what he has to say about this.
-[7/4/2005 6:25 PM] <vitorsouz> Are you going to cross that phrase from the log before publsihing it? haha :)
-[7/4/2005 6:26 PM] <jaybose> haha
-[7/4/2005 6:26 PM] <jaybose> maybe i should... :-J
-[7/4/2005 6:26 PM] <vitorsouz> ;)
-[7/4/2005 6:26 PM] <jaybose> ok, so any other ideas, if we can't convert links?
-[7/4/2005 6:26 PM] <jaybose> just in case?
-[7/4/2005 6:26 PM] <vitorsouz> Not reference anything.
-[7/4/2005 6:27 PM] <vitorsouz> Invesion of Control... Everybody references the Ref, the Ref references no one. :P
-[7/4/2005 6:27 PM] <jaybose> hmm, ok. Maybe just reference sections by name.
-[7/4/2005 6:27 PM] <jaybose> right.
-[7/4/2005 6:27 PM] <vitorsouz> Or that.
-[7/4/2005 6:27 PM] <jaybose> haha
-[7/4/2005 6:27 PM] <jaybose> ok, i think we've made some progress
-[7/4/2005 6:28 PM] <vitorsouz> Definetly.
-[7/4/2005 6:28 PM] <jaybose> I'll the notes i made to the bottom of that Page you made
-[7/4/2005 6:28 PM] <vitorsouz> Ok. Are you doing that now?
-[7/4/2005 6:28 PM] <jaybose> and publish this conversation, and then send out a note
-[7/4/2005 6:28 PM] <jaybose> yep
-[7/4/2005 6:28 PM] <vitorsouz> We could change this "Someone's Suggestions" page to Doc Team Suggestions.
-[7/4/2005 6:29 PM] <jaybose> will do
-[7/4/2005 6:29 PM] <vitorsouz> Move your Reference section instead of mine and add the other notes.
-[7/4/2005 6:29 PM] <jaybose> oh you want me to chg the entire page?
-[7/4/2005 6:29 PM] <jaybose> i was going to append
-[7/4/2005 6:29 PM] <vitorsouz> Yes.
-[7/4/2005 6:30 PM] <vitorsouz> If you want to append I can reorganize it later.
-[7/4/2005 6:30 PM] <vitorsouz> Just let me know when you're done.
-[7/4/2005 6:30 PM] <vitorsouz> Confluence should have support for simultaneous work! :) haha
-[7/4/2005 6:30 PM] <jaybose> :)
-[7/4/2005 6:30 PM] <jaybose> agreed
-[7/4/2005 6:36 PM] <jaybose> Done. Check it out and update as needed. Thanks for the patience.
-[7/4/2005 6:37 PM] <vitorsouz> Ok, checking it now.
-[7/4/2005 6:37 PM] <vitorsouz> This new IRC client that I got (VIRC) doesn't notify on channel messages...
-[7/4/2005 6:38 PM] <vitorsouz> Ok. I will reorganize the page, if you don't mind. Alright?
-[7/4/2005 6:39 PM] <jaybose> Catch you on the forums; see ya.
-[7/4/2005 6:39 PM] <jaybose> np.
-
-
- -
- - diff --git a/docs/wikidocs/2.1 Press Release.html b/docs/wikidocs/2.1 Press Release.html deleted file mode 100644 index 96f130c51..000000000 --- a/docs/wikidocs/2.1 Press Release.html +++ /dev/null @@ -1,65 +0,0 @@ - - - WebWork - - Press Release - - - - - - - - - - -
-

WebWork 2.1 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1. This release marks an important step in the continued development of the WebWork web application framework. The 2.1.x line will continue to be developed to add support to client side validation, stability, and performance. Future major versions of WebWork will be focusing on more client-oriented dynamic features (using DHTML and JavaScript), better tools integration (an IDEA plugin is in the works), and overall developer productivity.

- - - - -

New Features

-

WebWork adds support for client side input validation, beefed up backwards compatibility, increased performance, and a new simplified UI layout theme ("simple"). The biggest addition, however, is in the form of documentation. The WebWork community came together and was able to create a great set of documentation and tutorials that will only get better over time. The OpenSymphony community has proved once again that it is one of the shining stars in the open source arena.

- -

Bug Fixes

-

Many small bug fixes have been address, especially those relating to backwards compatibility with WebWork 1.x. In addition, the upgraded dependency on XWork 1.0.1 has increased performance greatly.

- -

Special Thanks

-

The biggest addition to WebWork has, by far, been the documentation. Without the dedicated work from the community, WebWork would be nothing more than yet another excellent java library that no one but the authors use. Fortunately, the following people dedicated time and effort to making WebWork accessible by writing detailed documentation, examples, and tutorials:

-
    -
  • Vitor Souza
  • -
  • Richard Hallier
  • -
  • Bill Lynch
  • -
  • Casey Moyaert
  • -
  • Michael Campbell
  • -
  • Gabriel Zimmerman
  • -
  • Cuong Tran
  • -
  • Michael Greer
  • -
- - -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.1 Press Release.html b/docs/wikidocs/2.1.1 Press Release.html deleted file mode 100644 index 8001e08ee..000000000 --- a/docs/wikidocs/2.1.1 Press Release.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork - - 2.1.1 Press Release - - - - - - - - - - -
-

WebWork 2.1.1 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.1.

- -

This release mostly fixes bugs that popped up in 2.1 as well as a couple new features. The full list of bug fixes and new features can be found in the release notes.

- - - - -

New Features

-
    -
  • File upload support has been rebuilt to allow for multiple files with the same HTTP parameter name. Besides "cos" and "pell" support, "jakarta" support has been added, utilizing the Commons-FileUpload library. See the release notes for more detail.
  • -
  • Validation now supports short-circuiting. This allows you to stop validation processing when a particular validation fails.
  • -
- - -

Bug Fixes

-
    -
  • You no longer must specify webwork.i18n.encoding in webwork.properties unless you wish to override the default value
  • -
- - -

Special Thanks

-

Special thanks to everyone who contributed bug reports and patches, and a very special thanks to Mark Woon for picking up the slack. Also special thanks to Bruce Ritchie of Jive Software for updating file upload support.

- -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.2 Press Release.html b/docs/wikidocs/2.1.2 Press Release.html deleted file mode 100644 index 06eeb5416..000000000 --- a/docs/wikidocs/2.1.2 Press Release.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork - - 2.1.2 Press Release - - - - - - - - - - -
-

WebWork 2.1.2 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.2.

- - - - - -

Bug Fixes

-
    -
  • WebWork 2.1.2 comes packages with XWork 1.0.3, which fixes a simple but painful bug that many people experienced. It is recommended that all users upgrade to WebWork 2.1.2 and use the libraries that are shipped with it.
  • -
- - - -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.3 Press Release.html b/docs/wikidocs/2.1.3 Press Release.html deleted file mode 100644 index f869d557e..000000000 --- a/docs/wikidocs/2.1.3 Press Release.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork - - 2.1.3 Press Release - - - - - - - - - - -
-

WebWork 2.1.3 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.3.
-This release fixes a critical bug found in WebWork 2.1.2. All users should download this release. No other changes have been made, so upgrading the webwork jar file is all that needs to happen.

- - - - - - -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.4 Press Release.html b/docs/wikidocs/2.1.4 Press Release.html deleted file mode 100644 index 35f807aa2..000000000 --- a/docs/wikidocs/2.1.4 Press Release.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork - - 2.1.4 Press Release - - - - - - - - - - -
-

WebWork 2.1.4 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.4. This release is almost exactly like 2.1.3 except that it introduces a new JSP tag syntax. This syntax is optional and will disabled by default for the entire 2.1.x releases. Please Read the release notes for more information

- - - - - -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.5 Press Release.html b/docs/wikidocs/2.1.5 Press Release.html deleted file mode 100644 index a327954b6..000000000 --- a/docs/wikidocs/2.1.5 Press Release.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - 2.1.5 Press Release - - - - - - - - - - -
-

WebWork 2.1.5 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.5.
-This release adds several key enhancements to the UI tag libraries, including more JavaScript event handlers, XHTML compatibility, and bug fixes.

- - - - -

Special Thanks

-

A very special thanks to Mathias Bogaert for helping out with all the UI tag library enhancements and bug fixes.

- -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.6 Press Release.html b/docs/wikidocs/2.1.6 Press Release.html deleted file mode 100644 index 3df8bc26e..000000000 --- a/docs/wikidocs/2.1.6 Press Release.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork - - 2.1.6 Press Release - - - - - - - - - - -
-

WebWork 2.1.6 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.6.

- - - - - -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/2.1.7 Press Release.html b/docs/wikidocs/2.1.7 Press Release.html deleted file mode 100644 index 158f042d1..000000000 --- a/docs/wikidocs/2.1.7 Press Release.html +++ /dev/null @@ -1,55 +0,0 @@ - - - WebWork - - 2.1.7 Press Release - - - - - - - - - - -
-

WebWork 2.1.7 Released

- -

The OpenSymphony group is proud to announce the release of WebWork 2.1.7. This release is focused on minor improvements around the UI framework, including a new and powerful client-side validation framework currently in prototype phase.

- - - - - -

Special Thanks

-

The WebWork team would like to recognize the following people for their help with bug reports, user support, documentation, and patches:

-
    -
  • Mathias Bogaert for fixing so many JIRA issues
  • -
  • Casey Moyaert for managing most of the documentation and continuing to make it better
  • -
- - -

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/3rd Party Integration.html b/docs/wikidocs/3rd Party Integration.html deleted file mode 100644 index 35988646f..000000000 --- a/docs/wikidocs/3rd Party Integration.html +++ /dev/null @@ -1,30 +0,0 @@ - - - WebWork - - Party Integration - - - - - - - - - - -
-
    -
  1. Sitemesh
  2. -
  3. Spring
  4. -
  5. Pico
  6. -
  7. Hibernate
  8. -
  9. JSTL
  10. -
  11. JUnit
  12. -
  13. Quartz
  14. -
  15. Tiles
  16. -
- - -
- - diff --git a/docs/wikidocs/AJAX Client Side Validation.html b/docs/wikidocs/AJAX Client Side Validation.html deleted file mode 100644 index 377396072..000000000 --- a/docs/wikidocs/AJAX Client Side Validation.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - Client Side Validation - - - - - - - - - - -
-

AJAX-based client side validation improves upon Pure JavaScript Client Side Validation by using a combination of JavaScript, DOM manipulation, and remote server communication via DWR. Unlike the pure client side implementation, AJAX-based validation communicates with the server. This means all your validation rules that worked when submitting a form will still work within the browser.

- -
This validation mode only works with the ajax theme
- -

The validation occurs on each onblur event for each form element. As each user types in some values and moves to the next form element, the value (and all other values previously entered) will be sent to the server for validation. The entire validation stack is run, including visitor validators and your action's validate() method.

- -

If there is an error, like the pure implementation, the HTML and DOM will be updated immediately.

- -

For an example of this, see AJAX Validation.

- -
- - diff --git a/docs/wikidocs/AJAX Validation - points for discussion.html b/docs/wikidocs/AJAX Validation - points for discussion.html deleted file mode 100644 index 2d4ee2ced..000000000 --- a/docs/wikidocs/AJAX Validation - points for discussion.html +++ /dev/null @@ -1,132 +0,0 @@ - - - WebWork - - Validation - points for discussion - - - - - - - - - - -
-

WebWork 2 Ajax Validation

- -

Validation servlet vs Interceptor

-
    -
  • Using a validation servlet requires the app developer to map any servlet filters for any action that is to be validated to the validation servlet as well.
  • -
  • Using a validation interceptor executes the validation within the context of any mapped servlet filters, as well as within the context of the action.
  • -
- - -

Custom Ajax code or Third Party Library

- -
    -
  • The DOJO Toolkit promises to be a very flexible and powerful toolkit, however they are only in the beginning stages. A lot of the code is coming from other dhtml toolkit projects that are very mature.
  • -
  • We only require a fairly simple xmlhttp layer a the moment. Dojo have released their dojo.io.bind package http://dojotoolkit.org/intro_to_dojo_io.html which should be sufficient for us, however I think we can produce our own XmlHTTP code for now.
  • -
  • I have implemented some custom xmlhttp / javascript code http://www.drivelater.com.au - do a search. It works in IE and FireFox.
  • -
- - -

Should webwork provide a static resource loader

-
    -
  • We need to provide a developer friendly way of exposing webwork static resources - primarily javascript files -
      -
    1. User could copy them into a folder -
        -
      • This either requires a separate zip download or packaging these files within the jar
      • -
      • This is a bad idea because it is error prone when the user upgrades
      • -
      -
    2. -
    3. Provide a resource loading servlet that serves the resources from the webwork jar
      -requires a servlet definition and mapping in web.xml -
        -
      • could use a webwork.properties setting for the servlet prefix to allow user to 'mount' the static resources under a different prefix
        -this makes jar upgrades easy and transparent
      • -
      • I have a prototype of this working in one of my apps - however it is restricted to mounting a single package on a single prefix. No support for multiple mappings.
        -
        i.e.  mount com.opensymphony.webwork.static at /webwork 
        -request /webwork/validationAjax.js 
        -loads  com.opensymphony.webwork.static.validationAjax.js
        -
        -
      • -
      -
    4. -
    5. Get the validationServlet to serve the javascript code. Use '/validationServlet/client.js' as the url
    6. -
    7. Any other ideas ?
    8. -
    -
  • -
- - -

Supported Browsers

-
    -
  • We need to define what browsers we will support.
  • -
- - -

JavaScript API

-
    -
  • In webwork CVS /src/webapp/validationServlet.js contains a sample ValidationServlet client javascript class. It handles the communication with the validation servlet, and exposes callbacks for handling the errors. NOTE : I think we can re-work this a bit. I currently have lots of onWhatever callbacks. I think we should just have onErrors, and let the template designer do what they want with the Errors object. -
      -
    • Sample Usage -
      -
      var validation = new ValidationServlet('/validationServlet/client.js');
      -validation.onErrors = function(inputObject, errors) {
      -	// clear old errors
      -	// display new errors
      -}
      -
    • -
    • The errors param for the onErrors callback is a javascript object that has this structure -
      -
      class Errors {
      -	String[] actionErrors;
      -	Map<String, String[]> fieldErrors; // fieldName is the key
      -}
      -
    • -
    -
  • -
- - -
    -
  • See this in action in webwork cvs head -
    -
     
    -/src/java/templates/xhtml/validation.vm
    -/src/webapp/validationServlet.js
    -/src/webapp/javascript-input.jsp
    -
    -
  • -
- - -
    -
  • Cloves' provided example API : -
    -
    function addActionErrors(messages); // should messages be an array?!
    -function addFieldErrors(fieldName, messages); // should messages be an array?!
    -function clearActionErrors();
    -function clearFieldErrors(fieldName);
    -function clearErrors(formName);
    -
  • -
- - -

New WebWork theme

- - - -
- - diff --git a/docs/wikidocs/AJAX Validation.html b/docs/wikidocs/AJAX Validation.html deleted file mode 100644 index 3a6c11363..000000000 --- a/docs/wikidocs/AJAX Validation.html +++ /dev/null @@ -1,152 +0,0 @@ - - - WebWork - - Validation - - - - - - - - - - -
-

Description

-

The following is describes how to do simple ajax validation in webwork.

- -
This requires DWR servlet being setup, dojo and the ajax theme being used.
- -
In the Ajax theme, dwr is used for normal validation while dojo everything else (widgets, XHR, browser JS events etc.)
- -
In order for validation to function properly it is advised to used standard WebWork Tags.
- -

Setup DWR

-

DWR could be setup by having the following dwr configuration (dwr.xml) at /WEB-INF/ directory. If it needs to be in other places, refer to http://getahead.ltd.uk/dwr/ for more information.

-
-
<!DOCTYPE dwr PUBLIC 
-	"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" 
-	"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
-
-<dwr>
-    <allow>
-        <create creator="new" javascript="validator">
-            <param name="class" value="com.opensymphony.webwork.validators.DWRValidator"/>
-        </create>
-        <convert converter="bean" match="com.opensymphony.xwork.ValidationAwareSupport"/>
-    </allow>
-
-    <signatures>
-        <![CDATA[
-        import java.util.Map;
-        import com.opensymphony.webwork.validators.DWRValidator;
-
-        DWRValidator.doPost(String, String, Map<String, String>);
-        ]]>
-    </signatures>
-</dwr>
-
- -

A DWRServlet need to be registered with the web application as well. The following shows a typical web.xml with DWRSerlvet.

-
-
<servlet>
-    <servlet-name>dwr</servlet-name>
-    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
-    <init-param>
-        <param-name>debug</param-name>
-        <param-value>true</param-value>
-    </init-param>
-</servlet>
-
-<servlet-mapping>
-    <servlet-name>dwr</servlet-name>
-    <url-pattern>/dwr/*</url-pattern>
-</servlet-mapping>
-
- - -

Step 1

-

Create the jsp page. Note the <ww:head ...> tag is used to set the theme which will put in necesary dojo sripts etc. See ajax's theme head.ftl for more information.

-
-
<html>
-<head>
-    <title>Validation - Basic</title>
-    <ww:head theme="ajax"/>
-</head>
-
-<body>
-
-<ww:form method="post" validate="true" theme="ajax">
-    <ww:textfield label="Name" name="name"/>
-    <ww:textfield label="Age" name="age"/>
-    <ww:textfield label="Favorite color" name="answer"/>
-    <ww:submit/>
-</ww:form>
-
-</body>
-</html>
-
- - -

Step 2

-

Create the action class

-
-
public class QuizAction extends ActionSupport {
-    String name;
-    int age;
-    String answer;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age = age;
-    }
-
-    public String getAnswer() {
-        return answer;
-    }
-
-    public void setAnswer(String answer) {
-        this.answer = answer;
-    }
-}
-
- - -

Step 3

-

Create the validation.xml

-
-
<!--
-    Add the following DOCTYPE declaration as first line of your XXX-validation.xml file:
-    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
--->
-<validators>
-    <field name="name">
-        <field-validator type="requiredstring">
-            <message>You must enter a name</message>
-        </field-validator>
-    </field>
-    <field name="age">
-        <field-validator type="int">
-            <param name="min">13</param>
-            <param name="max">19</param>
-            <message>Only people ages 13 to 19 may take this quiz</message>
-        </field-validator>
-    </field>
-</validators>
-
- -
- - diff --git a/docs/wikidocs/About.html b/docs/wikidocs/About.html deleted file mode 100644 index 88a1ab8a6..000000000 --- a/docs/wikidocs/About.html +++ /dev/null @@ -1,34 +0,0 @@ - - - WebWork - - About - - - - - - - - - - -
-

About WebWork

-

WebWork is a leading open source Java web application framework. Developed originally by Rickard Oberg (original developer of JBoss and creator of XDoclet, among other accomplishments), WebWork aims to lower the bar for developing web applications by making the more tedious tasks of web development automated. By taking the best features from other web frameworks available today, WebWork represents a best-of-bread solution to web development created by through the feedback of an active OpenSymphony community.

- -

WebWork is built on top of XWork, a generic command pattern framework. WebWork uses the capabilities of XWork to provide the following features:

- -
    -
  • Advanced UI components, allowing you to build complex, reusable UI components, ranging from simple text fields to advanced date pickers.
  • -
  • A robust inversion of control (IoC) container that binds to the native Servlet lifecycles: request, session, and application.
  • -
  • Pluggable configuration, allowing you to develop web "modules" that can easily be integrated together to form complete applications independently.
  • -
  • Complete data mapping from HTTP to Java data objects, enabling you to focus more on application development and less on tedious data conversion.
  • -
  • A complete validation framework, both on the server side and client side. This lets you choose the most optimal way to ensure user input is correct before processing it.
  • -
  • An advanced expression language, based on OGNL, providing the most common operations usually associated with building web-based user interfaces.
  • -
  • Support for integration with many popular open source projects, including: Spring, Pico, OSWorkflow, FreeMarker, Velocity, JasperReports, JFreeChart, and many more.
  • -
- - -
- - diff --git a/docs/wikidocs/Access to Webwork objects from JSP 2.0 EL.html b/docs/wikidocs/Access to Webwork objects from JSP 2.0 EL.html deleted file mode 100644 index 949b4e991..000000000 --- a/docs/wikidocs/Access to Webwork objects from JSP 2.0 EL.html +++ /dev/null @@ -1,139 +0,0 @@ - - - WebWork - - Access to Webwork objects from JSP 2.0 EL - - - - - - - - - - -
-

To access Webwork ValueStack from third party JSP taglibs you have to expose property values to JSP.

- -

You can use Webwork2 tag <ww:set/> to set named parameter in a JSP page, request, session or application scope. Following example, sets a request scoped parameter 'a' to list of integers:

- -
-
<ww:set name="'a'" value="{ 1, 2, 3, 4 }" scope="request"/>
-
- -

After setting parameter, third party JSP taglibs can access variables, or you can use JSP 2.0 EL (Expression Language). This is convenient as short hand EL expression syntax
-$

Unknown macro: {expression}
can be used in a text or inside of tag attributes:

- -
-
a[0] = ${a[0]}
-
-<sample:tag value="${a[1]}"/>
-
- -

In practice, you've got to expose a lot of different variables to make effective use of third party taglibs like displaytag or wurfl. This leads to a lot of <ww:set/> tags what made me investigate how to make access to ValueStack and OGNL more transparent.

- -
Why can't we just replace EL with OGNL?
-

Unfortunately, it isn't that simple. I've tinkered with JSPFactory.setDefault() to wrap around getPageContext() and create ExpressionEvaluator that would use OGNL.

- -

This works in practice, but code generated by Jasper2 doesn't call JSPFactory.getPageContext().getExpressionEvaluator() but goes directly to static method that is hardwired to jakarta commons-el implementation.

- -

Even if it would work it wouldn't be clean as JSPFactory.setDefault() should only be called by JSP implementation.

- -

There is a simple, if not elegant, solution available in JSP 2.0 EL, for exposing ValueStack to OGNL. It is possible to create custom functions that can be called from EL expressions. Functions have to be 'public static' and specified in a TLD file.
-Just import TLD in a JSP file where you've want to use a function.

- -

For example, you could access action properties by evaluating OGNL expression by a function 'vs' (for valuestack) in EL:

- -
-
<%@ taglib uri="/WEB-INF/tld/wwel.tld" prefix="x" %>
-
-a[0] = ${x:vs('a[0]')}
-a[0] * 4 = ${x:vs('a[0] * 4')}
-
-Current action name: ${x:name()}
-Top of ValueStack: ${x:top()}
-
- -

To use this code you've got to add wwel.tld and Functions.java to your webapp project.

- -

I would urge webworkers to define a set of functions that would be usable to wide community and include this in some future Webwork release.

- -
wwel.tld
-
<?xml version="1.0"?>
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-	version="2.0">
-
-<description>
-This taglib enables access to WebWork2 ValueStack 
-from JSP 2.0 Expression Language
-</description>
-
-<tlib-version>1.0</tlib-version>
-
-<short-name>wwel</short-name>
-
-<function>
-	<name>vs</name>
-	<function-class>com.nmote.wwel.Functions</function-class>
-	<function-signature>
-		java.lang.Object findOnValueStack(java.lang.String)
-	</function-signature>
-</function>
-
-<function>
-	<name>name</name>
-	<function-class>com.nmote.wwel.Functions</function-class>
-	<function-signature>
-		java.lang.Object getActionName()
-	</function-signature>
-</function>
-
-<function>
-	<name>top</name>
-	<function-class>com.nmote.wwel.Functions</function-class>
-	<function-signature>
-		java.lang.Object getTopOfValueStack()
-	</function-signature>
-</function>
-
-</taglib>
-
- -
Functions.java
-
package com.nmote.wwel;
-
-import com.opensymphony.xwork.ActionContext;
-
-/**
- * Utility functions for accessing webwork value stack and action context 
- * from JSP 2.0 EL taglibs.
- * 
- * @author Vjekoslav Nesek (vnesek@nmote.com)
- */
-public class Functions {
-
-	public static Object findOnValueStack(String expr) {
-		ActionContext a = ActionContext.getContext();
-		Object value = a.getValueStack().findValue(expr);
-		return value;
-	}
-	
-	public static Object getTopOfValueStack() {
-		ActionContext a = ActionContext.getContext();
-		Object value = a.getValueStack().peek();
-		return value;
-	}
-
-	public static Object getActionName() {
-		ActionContext a = ActionContext.getContext();
-		Object value = a.getName();
-		return value;
-	}	
-}
-
- -
- - diff --git a/docs/wikidocs/Action Chaining.html b/docs/wikidocs/Action Chaining.html deleted file mode 100644 index d05c95c1e..000000000 --- a/docs/wikidocs/Action Chaining.html +++ /dev/null @@ -1,62 +0,0 @@ - - - WebWork - - Action Chaining - - - - - - - - - - -
-

Overview

- -

WebWork provides the ability to chain multiple actions into a defined sequence or workflow. This feature works by applying a Chain Result to a given action, and intercepting its target action's invocation with a ChainingInterceptor.

- -
Warning

-In general, Action Chaining is not recommended. However, there are other options, such as the redirect after post technique.
- -

Chain Result

- -

The Chain Result is a result type that invokes an action with its own interceptor stack and result. This allows an action to forward requests to a target action, while propagating the state of the source action. Below is an example of how to define this sequence.

- -
-
<package name="public" extends="webwork-default">
-    <!-- Chain creatAccount to login, using the default parameter -->
-    <action name="createAccount" class="...">
-        <result type="chain">login</result>
-    </action>
-
-    <action name="login" class="...">
-        <!-- Chain to another namespace -->
-        <result type="chain">
-            <param name="actionName">dashboard</param>
-            <param name="namespace">/secure</param>
-        </result>
-    </action>
-</package>
-
-<package name="secure" extends="webwork-default" namespace="/secure">
-    <action name="dashboard" class="...">
-        <result>dashboard.jsp</result>
-    </action>
-</package>
-
- -

Another action in the same namespace (or the default "" namespace) can be executed after this action (see Configuration Files). An optional "namespace" parameter may also be added to specify an action in a different namespace.

- - - -

Chaining Interceptor

- -

If you need to copy the properties from your previous Actions in the chain to the current action, you should apply the ChainingInterceptor. The interceptor will copy the original parameters from the request, and the ValueStack is passed in to the target action. The source action is remembered by the ValueStack, allowing the target action to access the properties of the preceding action(s) using the ValueStack, and also makes these properties available to the final result of the chain, such as the JSP or Velocity page.

- -

One common use of action chaining is to provide lookup lists (like for a dropdown list of states, etc). Since these actions get put on the ValueStack, these properties will be available in the view. This functionality can also be done using the ActionTag to execute an action from the display page. You may also use the Redirect Action Result to accomplish this.

- -
- - diff --git a/docs/wikidocs/Action configuration.html b/docs/wikidocs/Action configuration.html deleted file mode 100644 index fb758f165..000000000 --- a/docs/wikidocs/Action configuration.html +++ /dev/null @@ -1,89 +0,0 @@ - - - WebWork - - Action configuration - - - - - - - - - - -
-

Actions are the basic "unit-of-work" in WebWork, they define, well, actions. An action will usually be a request, (and usually a button click, or form submit). The main action element (tag is too synonymous with JSP) has two parts, the friendly name (referenced in the URL, i.e. saveForm.action) and the corresponding "handler" class.

- -
-
<action name="formTest" class="com.opensymphony.webwork.example.FormAction" method="processForm">
-
- -

The optional "method" parameter tells WebWork which method to call based upon this action. If you leave the method parameter blank, WebWork will call the method execute() by default. If there is no execute() method and no method specified in the xml file, WebWork will throw an exception.

- -

Also, you can tell WebWork to invoke "doSomething" method in your action by using the pattern "actionName!something" in your form. For example, "formTest!save.action" will invoke the method "save" in FormAction class. The method must be public, take no arguments and also returns a String which indicate the name of the result to be executed:

- -
-
public String save() throws Exception
-  {
-      ...
-      return SUCCESS;
-  }
-
-

 

- -

All the configuration for "actionName" will be used for "actionName!something" (interceptors, result types, etc...)

- - -

Action Support

- -

Action class attribute could be left out such as following

- -
-
<action name="myAction">
-   ....
-</action>
-
- -

In this case, the class will default to com.opensymphony.xwork.ActionSupport which have an execute() method that returns SUCCESS by default.

- - -

Default Action Reference

- -

Since Webwork 2.2.1 you are also able to specify a default action to be executed when no other action is matched in the xwork.xml. This feature is provided mainly to eliminate the need to create an action class and/or element for very simple or similar results.  The default action name can be set inside the package element like below:

-
-
<package name="myPackage" ....>
-
-...
-
-<default-action-ref name="simpleViewResultAction">
-
-<!-- 
-An example of a default action that is just a simple class 
-that has 3 fields: successUrl, errorUrl, and inputUrl.  This action 
-parses the request url to set the result values.  In the normal case 
-it just renders velocity results of the same name as the requested url.
--->
-<action name="simpleViewResultAction" class="SimpleViewResultAction">
-	<result type="velocity">${successUrl}</result>
-	<result name="error" type="velocity">${errorUrl}</result>
-	<result name="input" type="velocity">${inputUrl}</result>
-</action>
-
-... 
-
-</package>
-
-
Caution

-This feature should be configured such that there is only one default action per namespace. Therefore if you have multiple packages declaring a default action with the same namespace, it is not guaranteed which action will be the default.
-
Note
-

Note that the name attribute is left out for the first result, as WebWork will default to "success" if it is left out.

- -

In this case any request to action not defined in this package will automatically trigger action with alias "simpleViewResultAction" to be executed.

- - -

Most of the content here provided by Matt Dowell <matt.dowell@notiva.com>

- -
- - diff --git a/docs/wikidocs/ActionMapper.html b/docs/wikidocs/ActionMapper.html deleted file mode 100644 index 7fc69f64e..000000000 --- a/docs/wikidocs/ActionMapper.html +++ /dev/null @@ -1,128 +0,0 @@ - - - WebWork - - ActionMapper - - - - - - - - - - -
-

ActionMapper

- -

The ActionMapper is responsible for providing a mapping between HTTP requests and action invocation requests and - vice-versa. When given an HttpServletRequest, the ActionMapper may return null if no action invocation request maps, - or it may return an ActionMapping that describes an action invocation that WebWork should attempt to try. The - ActionMapper is not required to guarantee that the ActionMapping returned be a real action or otherwise - ensure a valid request. This means that most ActionMappers do not need to consult WebWork's configuration to - determine if a request should be mapped.

- -

Just as requests can be mapped from HTTP to an action invocation, the opposite is true as well. However, because - HTTP requests (when shown in HTTP responses) must be in String form, a String is returned rather than an actual - request object.

- - - -

DefaultActionMapper

-

By default, the DefaultActionMapper is used:

- - -

Default action mapper implementation, using the standard *.[ext] (where ext usually "action") pattern. The extension - is looked up from the WebWork configuration key webwork.action.exection.

- -

To help with dealing with buttons and other related requirements, this mapper (and other ActionMappers, - we hope) has the ability to name a button with some predefined prefix and have that button name alter the execution - behaviour. The four prefixes are:

- -

    - -

  • Method prefix - method:default
  • - -

  • Action prefix - action:dashboard
  • - -

  • Redirect prefix - redirect:cancel.jsp
  • - -

  • Redirect-action prefix - redirect-action:cancel
  • - -

- -

In addition to these four prefixes, this mapper also understands the action naming pattern of foo!bar in - either the extension form (eg: foo!bar.action) or in the prefix form (eg: action:foo!bar). This syntax tells this mapper - to map to the action named foo and the method bar.

- - -

Method prefix

- -

With method-prefix, instead of calling baz action's execute() method (by default if it isn't overriden in xwork.xml - to be something else), the baz action's anotherMethod() will be called. A very elegant way determine which button is - clicked. Alternatively, one would have submit button set a particular value on the action when clicked, and the - execute() method decides on what to do with the setted value depending on which button is clicked.

- -
-
<ww:form name="baz">
-    <ww:textfield label="Enter your name" name="person.name"/>
-    <ww:submit value="Create person"/>
-    <ww:submit name="method:anotherMethod" value="Cancel"/>
-</ww:form>
-
- -

Action prefix

- -

With action-prefix, instead of executing baz action's execute() method (by default if it isn't overriden in xwork.xml - to be something else), the anotherAction action's execute() method (assuming again if it isn't overriden with - something else in xwork.xml) will be executed.

- -
-
<ww:form name="baz">
-    <ww:textfield label="Enter your name" name="person.name"/>
-    <ww:submit value="Create person"/>
-    <ww:submit name="action:anotherAction" value="Cancel"/>
-</ww:form>
-
- -

Redirect prefix

- -

With redirect-prefix, instead of executing baz action's execute() method (by default it isn't overriden in xwork.xml - to be something else), it will get redirected to, in this case to www.google.com. Internally it uses - ServletRedirectResult to do the task.

- -
-
<ww:form name="baz">
-    <ww:textfield label="Enter your name" name="person.name"/>
-    <ww:submit value="Create person"/>
-    <ww:submit name="redirect:www.google.com" value="Cancel"/>
-</ww:form>
-
- -

Redirect-action prefix

- -

With redirect-action-prefix, instead of executing baz action's execute() method (by default it isn't overriden in - xwork.xml to be something else), it will get redirected to, in this case 'dashboard.action'. Internally it uses - ServletRedirectResult to do the task and read off the extension from the webwork.properties.

- -
-
<ww:form name="baz">
-    <ww:textfield label="Enter your name" name="person.name"/>
-    <ww:submit value="Create person"/>
-    <ww:submit name="redirect-action:dashboard" value="Cancel"/>
-</ww:form>
-
- -

ActionMapperFactory

-

You can define your own ActionMapper by configuring the ActionMapperFactory:

- - -

Factory that creates ActionMappers. This factory looks up the class name of the ActionMapper from - WebWork's configuration using the key webwork.mapper.class.

- - -

Possible uses of the ActionMapper include defining your own, cleaner namespaces, such as URLs like /person/1, which would be similar to a request to /getPerson.action?personID=1 using the DefaultActionMapper.

- -
- - diff --git a/docs/wikidocs/AdminApp.html b/docs/wikidocs/AdminApp.html deleted file mode 100644 index 1c525200f..000000000 --- a/docs/wikidocs/AdminApp.html +++ /dev/null @@ -1,218 +0,0 @@ - - - WebWork - - AdminApp - - - - - - - - - - -
-

TODO: Documenting updated version (currently at http://www.i-tao.com/adminapp.html). IN PROGRESS.

- -

Introduction

-

This page aims at providing some additional information about the Hibernate AdminApp. The Hibernate AdminApp (hereafter referred to as AA) was created by the Hibernate developers to show a possible implementation strategy for Hibernate with Webwork. Although AA can still be used as a starting point for webapplications, most of its libraries become quite aged (WW 2.0 beta, Hibernate 2, XWork 1.0 beta). Therefore, a shiny new fork (AA2) has been created by Ron Chan.

- -

AA2 relies on WW2.2, Hibernate 3.1, and Spring as its IoC container (rather than XWork's, which has been deprecated in WW 2.2). We'll first discuss the original AA. Later on, we'll show the differences with AA2. Ron, if you're reading this, feel free to point out any mistakes/edit this document.

- -

Like we pointed out before, AA shows a possible implementation strategy to use Hibernate in WebWork in combination with a so-called open-session-in-view pattern (more info, even more). This pattern allows maximum flexibility in our view layer by creating a Hibernate Session object that will live till the end of the request (after the view has been rendered). This allows lazy loading of objects in our view, rather than having to preload all objects and their associations in our business layer, and yet ensures the correct disposing of the Session object.

- -

To accomplish this, AA uses XWork's components and interceptors:

- -
    -
  • components: XWork manages the lifecycle of objects in several scopes (application, session, request) and takes care of the IoC through the ..Aware interfaces (so called enablers). Hibernate's expensive-to-create SessionFactory will thus be created in the application scope (meaning it will only be initialised once when the application starts up), while the Session objects, used to load our models, is registered in the request scope (will be created once per request).
  • -
- - -
    -
  • interceptors: AA uses an interceptor (the HibernateInterceptor) to extract the Session from the WebWork action, so it can control the transactions, redirect/rollback on errors and properly dispose the Session after the view is rendered.
  • -
- - -

AdminApp Source Overview

- -

Now, let's properly dissect the AA files:

-
    -
  • /lib: contains the various jars for our application. Nothing special here.
  • -
  • /src/java/org/hibernate/admin/action: lists our WebWork actions. All actions extend an abstract AbstractAction file, which overrides the execute() method from our XWork's ActionSupport. This is where we define a setHibernateSession() method, which is the method we declared in our enabler interface (HibernateSessionAware). This will notify XWork to invoke its IoC magic to set the HibernateSession.
  • -
- - -
org.hibernate.admin.action.AbstractAction
-
public String execute() throws Exception {
-	
-		// We go to INPUT on field and data errors
-		if ( hasErrors() ) {
-			LOG.debug("action not executed, field or action errors");
-			LOG.debug( "Field errors: " + getFieldErrors() );
-			LOG.debug( "Action errors: " + getActionErrors() );
-			return INPUT;
-		}
-
-		LOG.debug("executing action");
-		return go();
-	}
-	
-	protected abstract String go() throws HibernateException;
-
-	public void setHibernateSession(HibernateSession session) {
-		this.session = session;
-	}
-
-	protected Session getSession() throws HibernateException {
-		return session.getSession();
-	}
-
-

In this execute() method we'll simply call a abstract go() method (which is then defined in each of the actions). When we need the Hibernate Session, we use the getSession() method, inherited from our AbstractAction. Don't worry about transactions or saving so called dirty objects (our HibernateInterceptor takes care of all that). As you can see, this totally minimizes the LoC (lines of code) needed to retrieve or manipulated our models).

-
org.hibernate.admin.action.EditUserAction
-
public class EditUserAction extends AbstractAction {
-	//.. ommited for brevity
-	
-	protected String go() throws HibernateException {
-		..
-		getSession().update(user);
-		..
-		return SUCCESS;
-	}
-	
-	//.. getters and setters ommited
-
-}
-
- -

There are 3 more *-validation.xml files in this directory containing the validation logic for the Actions. XWork will validate your request before the action gets executed, so you can decouple your (simple) validation logic from your Action. For example, take a look at the CreateUserAction-validation.xml:

- -
CreateUserAction-validation.xml
-
..
-    <field name="user.name.lastName">
-        <field-validator type="requiredstring">
-            <message>You must enter a last name.</message>
-        </field-validator>
-    </field>
-    <field name="user.email">
-        <field-validator type="email">
-            <message>Please correct the e-mail address.</message>
-        </field-validator>
-        <field-validator type="required">
-            <message>Please enter an e-mail address.</message>
-        </field-validator>
-    </field>
-..
-
- -

Several validator types are available. Here we rely on XWork to validate our Actions, but it's also possible to validate our object Models (see WW Validation). You will mostly use these to validate submitted forms in your webapp.

- -

When a validator fails, you will automatically be returned to the input page with a clear indication which field failed to validate if:

- -

a) actually provided an input type in your xwork.xml file

-
xwork.xml
-
..
-        <result name="input" type="dispatcher">
-		<param name="location">/editUser.jsp</param>
-	</result>
-	..
-
-

b) you enabled the validation interceptor in your xwork.xml

-
xwork.xml
-
..
-	<interceptor-ref name="defaultStack"/>
-	<interceptor-ref name="validation"/>
-	..
-
-

c) you use the WebWork tag library (warning: this is the old syntax):

-
CreateUser.jsp
-
..
-<ww:form name="'createUserForm'" action="'createUser.action'" method="'POST'">
-    <ww:textfield label="'Username'" name="'user.handle'"/>
-..
-
- -

New syntax (since 2.2):

- -
CreateUser.jsp
-
..
-<ww:form name="createUserForm" action="createUser" method="POST">
-    <ww:textfield label="Username" name="user.handle"/>
-..
-
- -
    -
  • /src/java/org/hibernate/admin/component: contains the components and enablers for both the HibernateSessionFactory and the HibernateSession. These components are declared in the /src/java/components.xml file (which will be copied to the root of your compiled classes afterwards):
  • -
- - -
components.xml
-
<components>
-
-    <component>
-        <scope>request</scope>
-        <class>org.hibernate.admin.component.HibernateSession</class>
-        <enabler>org.hibernate.admin.component.HibernateSessionAware</enabler>
-    </component>
-
-    <component>
-        <scope>application</scope>
-        <class>org.hibernate.admin.component.HibernateSessionFactory</class>
-        <enabler>org.hibernate.admin.component.HibernateSessionFactoryAware</enabler>
-    </component>
-
-</components>
-
- -
    -
  • /src/java/org/hibernate/admin/interceptor: contains the Hibernate interceptor. Interceptors are an incredibly powerful feature of WebWork - it allows you to control invocations before and after they excute, manipulate their results, or, as in our case, extract the HibernateSession object and dispose it after the Action has been executed (and the view rendered). Because we use a try/catch/finally block, we're able to catch exceptions and yet make sure our Session gets closed properly (the number one cause of db connection leaks).
  • -
- - -
org.hibernate.admin.interceptor.HibernateInterceptor
-
public String intercept(ActionInvocation invocation) throws Exception {
-		Action action = invocation.getAction();
-		if ( !(action instanceof AbstractAction) ) return invocation.invoke();
-		
-		HibernateSession hs = ( (AbstractAction) action ).getHibernateSession();
-		try {
-			return invocation.invoke();
-		}
-		
-		// Note that all the cleanup is done
-		// after the view is rendered, so we
-		// have an open session in the view
-		
-		catch (Exception e) {	
-			hs.setRollBackOnly(true);
-			if (e instanceof HibernateException) {
-				LOG.error("HibernateException in execute()", e);
-				return Action.ERROR;
-			}
-			else {
-				LOG.error("Exception in execute()", e);
-				throw e;
-			}
-		}
-		
-		finally {
-			try {
-				hs.disposeSession();
-			}
-			catch (HibernateException e) {
-				LOG.error("HibernateException in dispose()", e);
-				return Action.ERROR;
-			}
-		}
-	}
-
- - -

Conclusion

-

In this document, we tried to point out several key features in the Hibernate AdminApp. In part II, we'll have a look at the new AdminApp, which is far more up to date, and uses Spring as its IoC container. No more implements ActionSupport or Aware interfaces, resulting in even cleaner code.

- -

AdminApp is a very good example of how a webapp can be structered, using as many advantages from the various frameworks as possible.

- -
- - diff --git a/docs/wikidocs/After Annotation.html b/docs/wikidocs/After Annotation.html deleted file mode 100644 index 59fbb05f1..000000000 --- a/docs/wikidocs/After Annotation.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork - - After Annotation - - - - - - - - - - -
-

After Annotation

- -

Marks a action method that needs to be called after the main action method and the result was -executed. Return value is ignored.

- -

Usage

- -

The After annotation can be applied at method level.

- - -

Parameters

- - -

no parameters

- - -

Examples

- -
-
public class SampleAction extends ActionSupport {
-
- @After
- public void isValid() throws ValidationException {
-   // validate model object, throw exception if failed
- }
-
- public String execute() {
-    // perform action
-    return SUCCESS;
- }
-}
-
- - -
- - diff --git a/docs/wikidocs/Alias Interceptor.html b/docs/wikidocs/Alias Interceptor.html deleted file mode 100644 index a020391b4..000000000 --- a/docs/wikidocs/Alias Interceptor.html +++ /dev/null @@ -1,59 +0,0 @@ - - - WebWork - - Alias Interceptor - - - - - - - - - - -
- -

The aim of this Interceptor is to alias a named parameter to a different named parameter. By acting as the glue - between actions sharing similiar parameters (but with different names), it can help greatly with action chaining.

- -

Action's alias expressions should be in the form of #{ "name1" : "alias1", "name2" : "alias2" }. This means - that assuming an action (or something else in the stack) has a value for the expression named name1 and the - action this interceptor is applied to has a setter named alias1, alias1 will be set with the value from - name1.

- - -

Parameters

- - -

    - -

  • aliasesKey (optional) - the name of the action parameter to look for the alias map (by default this is - aliases).
  • - -

- - -

Extending the Interceptor

- - -

This interceptor does not have any known extension points.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <!-- The value for the foo parameter will be applied as if it were named bar -->
-    <param name="aliases">#{ 'foo' : 'bar' }</param>
-
-    <!-- note: the alias interceptor is included with the defaultStack in webwork-default.xml -->
-    <interceptor-ref name="alias"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Alt Syntax.html b/docs/wikidocs/Alt Syntax.html deleted file mode 100644 index 0cf535b24..000000000 --- a/docs/wikidocs/Alt Syntax.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork - - Syntax - - - - - - - - - - -
-

The altSyntax is an option that can be defined in webwork.properties. By default it is set to true and it is strongly recommend you do not change that unless you are upgrading from WebWork 2.1.7 or previous versions.

- -
Migration tip
You can also turn on the altSyntax on a per-page basis by using the set tag. Simply set the name useAltSyntax to the value true. From this point on, all tags will use the altSyntax for the rest of the request.
- -

The altSyntax changes the behavior of how tags are interpreted. Instead of evaluating each tag parameter against the value stack and needing single quotes to mark string literals, only marked expressions are evaluated.

- -

Example:

- -

the following code uses the Tag Syntax:

-
-
<ww:iterator value="cart.items">
-   ...
-   <ww:textfield label="'Cart item No.' + #rowstatus.index + ' note'" 
-                 name="'cart.items[' + #rowstatus.index + '].note'" 
-                 value="note" />
-</ww:iterator>
-
- -

this is somewhat counter intuitive to normal HTML tag behaviour, and you get loads of single quotes. Now the same example in altSyntax:

-
-
<ww:iterator value="cart.items">
-   ...
-   <ww:textfield label="Cart item No. %{#rowstatus.index} note" 
-                 name="cart.items[%{#rowstatus.index}].note" 
-                 value="%{note}" />
-</ww:iterator>
-
- -

Only expressions enclosed with %{} are evaluated. The code is shorter and clearer, very similar to JSTL EL usage. Quoting problems, eg. with javascript function calls, are avoided.

- -

In order to fully understand why this option exists and what the differences are, it is best to get a bit of history about WebWork.

- -
If you are not upgrading from WebWork 2.1.7 or previous versions and you don't care about the history of WebWork's evolution, you can skip this section. See the Tag Syntax section for more information on the standard tag syntax support
- -

History

- -

In WebWork 2.1.4, the altSyntax option was introduced. The book, WebWork in Action, while based around WebWork 2.1.7, was entirely written with the assumption that the altSyntax was enabled. As of WebWork 2.2, the altSyntax is turned on by default and eventually the old syntax will no longer be supported and will be removed from the code.

- -
- - diff --git a/docs/wikidocs/AnnotationWorkflowInterceptor.html b/docs/wikidocs/AnnotationWorkflowInterceptor.html deleted file mode 100644 index eb87469df..000000000 --- a/docs/wikidocs/AnnotationWorkflowInterceptor.html +++ /dev/null @@ -1,95 +0,0 @@ - - - WebWork - - AnnotationWorkflowInterceptor - - - - - - - - - - -
-

AnnotationWorkflowInterceptor Interceptor

- -

Invokes any annotated methods on the action. Specifically, it supports the following -annotations: -

    -
  • @Before - will be invoked before the action method. If the returned value is not null, it is -returned as the action result code
  • -
  • @BeforeResult - will be invoked after the action method but before the result execution
  • -
  • @After - will be invoked after the action method and result execution
  • -
-

-

-

There can be multiple methods marked with the same annotations, but the order of their execution -is not guaranteed. However, the annotated methods on the superclass chain are guaranteed to be invoked before the -annotated method in the current class in the case of a Before annotations and after, if the annotations is -After.

- -

Examples

- -
-
public class BaseAnnotatedAction {
- 	protected String log = "";
-
- 	@Before
- 	public String baseBefore() {
- 		log = log + "baseBefore-";
- 		return null;
- 	}
- }
-
- public class AnnotatedAction extends BaseAnnotatedAction {
- 	@Before
- 	public String before() {
- 		log = log + "before";
- 		return null;
- 	}
-
- 	public String execute() {
- 		log = log + "-execute";
- 		return Action.SUCCESS;
- 	}
-
- 	@BeforeResult
- 	public void beforeResult() throws Exception {
- 		log = log +"-beforeResult";
- 	}
-
- 	@After
- 	public void after() {
- 		log = log + "-after";
- 	}
- }
-
- -

Configure a stack in xwork.xml that replaces the PrepareInterceptor with the AnnotationWorkflowInterceptor:

- -
-
<interceptor-stack name="annotatedStack">
-<interceptor-ref name="static-params"/>
-<interceptor-ref name="params"/>
-<interceptor-ref name="conversionError"/>
-<interceptor-ref name="annotationInterceptor"/>
-</interceptor-stack>
-
- -

Given an Action, AnnotatedAction, add a reference to the AnnotationWorkflowInterceptor interceptor.

-
-
<action name="AnnotatedAction" class="com.examples.AnnotatedAction">
-   <interceptor-ref name="annotationInterceptor"/>
-   <result name="success" type="freemarker">good_result.ftl</result>
-</action>
-
- -

With the interceptor applied and the action executed on AnnotatedAction the log -instance variable will contain baseBefore-before-execute-beforeResult-after.

- - -
- - diff --git a/docs/wikidocs/App Servers.html b/docs/wikidocs/App Servers.html deleted file mode 100644 index ac6b1a9da..000000000 --- a/docs/wikidocs/App Servers.html +++ /dev/null @@ -1,34 +0,0 @@ - - - WebWork - - Servers - - - - - - - - - - -
-

The following is a list of application servers WebWork is known to work with, and any potential workarounds necessary for full functionality:

- - - - -
- - diff --git a/docs/wikidocs/Architecture.html b/docs/wikidocs/Architecture.html deleted file mode 100644 index 80c174349..000000000 --- a/docs/wikidocs/Architecture.html +++ /dev/null @@ -1,32 +0,0 @@ - - - WebWork - - Architecture - - - - - - - - - - -
-

The WebWork architecture can best be explained with a diagram:

- -

- -

In the diagram, an initial request goes to the Servlet container (such as Tomcat or Resin), the request goes through the standard filter chain. This includes the (optional) ActionContextCleanUp filter, which is required if you wish to integrate in with technologies such as SiteMesh. Next, the required FilterDispatcher is called, which in turn consults the ActionMapper to determine if the request should invoke an action.

- -

If the ActionMapper determines that an action should be invoked, the FilterDispatcher than delegates to the ActionProxy, which in turn consults the WebWork Configuration Files manager, which finally reads your xwork.xml file. Next, the ActionProxy creates an ActionInvocation, which is responsible for the command pattern implementation. This includes invoking any interceptors (the before() method) before finally invoking the action itself.

- -

Once the action returns, the ActionInvocation is responsible for looking up the proper result associated with the action result code mapped in xwork.xml. The result is then executed, which often (but not always, as is the case for Action Chaining) involves a template written in JSP or FreeMarker to be rendered. While rendering, the templates can utilize the Tags provided by WebWork. Some of those components will work with the ActionMapper to render proper URLs for additional requests.

- -
All objects in this architecture (action, result, interceptor, etc) are created by an ObjectFactory. This ObjectFactory is pluggable and is how frameworks like Spring and Pico integrate. You can also provide your own ObjectFactory for any reason that requires knowing when objects in WebWork are created.
- -

Finally, the interceptors are executed again (in reverse order, calling the after() method) and finally returning back through the filters configured in web.xml. If the ActionContextCleanUp filter is present, the FilterDispatcher will not clean up the ThreadLocal ActionContext. If the ActionContextCleanUp filter is not present, the FilterDispatcher will cleanup all ThreadLocals.

- -
- - diff --git a/docs/wikidocs/Architecture_attachments/arch.doc b/docs/wikidocs/Architecture_attachments/arch.doc deleted file mode 100644 index ca6f76a7d..000000000 Binary files a/docs/wikidocs/Architecture_attachments/arch.doc and /dev/null differ diff --git a/docs/wikidocs/Architecture_attachments/arch.png b/docs/wikidocs/Architecture_attachments/arch.png deleted file mode 100644 index 25239942e..000000000 Binary files a/docs/wikidocs/Architecture_attachments/arch.png and /dev/null differ diff --git a/docs/wikidocs/Articles and press.html b/docs/wikidocs/Articles and press.html deleted file mode 100644 index e600f2d22..000000000 --- a/docs/wikidocs/Articles and press.html +++ /dev/null @@ -1,72 +0,0 @@ - - - WebWork - - Articles and press - - - - - - - - - - -
-

WebWork is a very popular framework and community. As such, there are many articles, presentations, and books about WebWork. Here is just a sample.

- -

Books

- - - - -

Presentations

- - - - -

Articles

- - - - -

Blogs

- -

The official WebWork Blog can be found here.

- -

Additionally, the blogs of the developers of WebWork may provide some useful information:

- - - - -

Blog entries:

- - - - -
- - diff --git a/docs/wikidocs/Articles and press_attachments/AJAX.ppt b/docs/wikidocs/Articles and press_attachments/AJAX.ppt deleted file mode 100644 index 92093f6c9..000000000 Binary files a/docs/wikidocs/Articles and press_attachments/AJAX.ppt and /dev/null differ diff --git a/docs/wikidocs/Articles and press_attachments/PJUG.pdf b/docs/wikidocs/Articles and press_attachments/PJUG.pdf deleted file mode 100644 index 31102d61c..000000000 Binary files a/docs/wikidocs/Articles and press_attachments/PJUG.pdf and /dev/null differ diff --git a/docs/wikidocs/Articles and press_attachments/WWiA.ppt b/docs/wikidocs/Articles and press_attachments/WWiA.ppt deleted file mode 100644 index 2ee47fcfa..000000000 Binary files a/docs/wikidocs/Articles and press_attachments/WWiA.ppt and /dev/null differ diff --git a/docs/wikidocs/Articles and press_attachments/webwork-talk.zip b/docs/wikidocs/Articles and press_attachments/webwork-talk.zip deleted file mode 100644 index 968e584b7..000000000 Binary files a/docs/wikidocs/Articles and press_attachments/webwork-talk.zip and /dev/null differ diff --git a/docs/wikidocs/Asynchronous processing with WebWork - XWork.html b/docs/wikidocs/Asynchronous processing with WebWork - XWork.html deleted file mode 100644 index e33eb9760..000000000 --- a/docs/wikidocs/Asynchronous processing with WebWork - XWork.html +++ /dev/null @@ -1,32 +0,0 @@ - - - WebWork - - Asynchronous processing with WebWork - XWork - - - - - - - - - - -
-

This is from a presentation I gave at TheServerSide Java Symposium in March of 2005. Please don't use these materials for presentations without contacting me.

- -

The Presentation

- -

This presentation (in PowerPoint) covers why we'd want to take web request processing asynchronous, what problems it solves, and two methods for implementing asynchronous processing.

- -

Moving Web Apps From Synchronous to Asynchronous Processing

- -

The Example App

- -

The example app is a simple application showing the use of the "execAndWait" interceptor to provide the user an intermediate "in progress" page as well as a web request which is bridged into a JMS message to be handled asynchronously in a "fire and forget" mode.

- -

Example Application

- -
- - diff --git a/docs/wikidocs/Asynchronous processing with WebWork - XWork_attachments/async-web kt.ppt b/docs/wikidocs/Asynchronous processing with WebWork - XWork_attachments/async-web kt.ppt deleted file mode 100644 index aa51dff8f..000000000 Binary files a/docs/wikidocs/Asynchronous processing with WebWork - XWork_attachments/async-web kt.ppt and /dev/null differ diff --git a/docs/wikidocs/Asynchronous processing with WebWork - XWork_attachments/async.zip b/docs/wikidocs/Asynchronous processing with WebWork - XWork_attachments/async.zip deleted file mode 100644 index 0a63d8d05..000000000 Binary files a/docs/wikidocs/Asynchronous processing with WebWork - XWork_attachments/async.zip and /dev/null differ diff --git a/docs/wikidocs/Basic Validation.html b/docs/wikidocs/Basic Validation.html deleted file mode 100644 index 721f0c002..000000000 --- a/docs/wikidocs/Basic Validation.html +++ /dev/null @@ -1,105 +0,0 @@ - - - WebWork - - Basic Validation - - - - - - - - - - -
-

Description

-

The following are the steps to configure a basic validation using Webwork.

- -

Step 1:

-

Write up a html form.

-
-
<html>
-<head>
-    <title>Validation - Basic</title>
-    <ww:head/>
-</head>
-
-<body>
-
-<b>What is your favorite color?</b>
-<p/>
-
-<ww:form method="post">
-    <ww:textfield label="Name" name="name"/>
-    <ww:textfield label="Age" name="age"/>
-    <ww:textfield label="Favorite color" name="answer"/>
-    <ww:submit/>
-</ww:form>
-
-</body>
-</html>
-
- - -

Step 2:

-

Write up the action class

-
-
public class QuizAction extends ActionSupport {
-    String name;
-    int age;
-    String answer;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age = age;
-    }
-
-    public String getAnswer() {
-        return answer;
-    }
-
-    public void setAnswer(String answer) {
-        this.answer = answer;
-    }
-}
-
- - -

Step3:

-

Write up the validators to be used. The validation.xml format is either <ActionClassName>-validation.xml or <ActionClassName>-<ActionContextName>-validation.xml

-
-
<!--
-    Add the following DOCTYPE declaration as first line of your XXX-validation.xml file:
-    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
--->
-<validators>
-    <field name="name">
-        <field-validator type="requiredstring">
-            <message>You must enter a name</message>
-        </field-validator>
-    </field>
-    <field name="age">
-        <field-validator type="int">
-            <param name="min">13</param>
-            <param name="max">19</param>
-            <message>Only people ages 13 to 19 may take this quiz</message>
-        </field-validator>
-    </field>
-</validators>
-
- -
- - diff --git a/docs/wikidocs/Basic configuration and your first action - Hello WebWorld.html b/docs/wikidocs/Basic configuration and your first action - Hello WebWorld.html deleted file mode 100644 index b3e4c10a9..000000000 --- a/docs/wikidocs/Basic configuration and your first action - Hello WebWorld.html +++ /dev/null @@ -1,112 +0,0 @@ - - - WebWork - - Basic configuration and your first action - Hello WebWorld - - - - - - - - - - -
-

Your first action - Hello WebWorld

- -

An action is a piece of code that is executed when a particular URL is requested. After actions are executed, a result visually displays the outcome of whatever code was executed in the action. A result is generally an HTML page, but it can also be a PDF file, an Excel spreadsheet, or even a Java applet window. In this book, we'll primarily focus on HTML results, because those are most specific to the Web.

- -

When you submit an html form using WebWork, the form is sent to a Java class that you write yourself, not to a JSP page. These classes are called WebWork actions. The html form  typically looks like: <form action="foo.action">.

- -

In a Model-View-Controller approach, the WebWork action is part of the Controller, leaving to JSP pages what they do best: the View. (If you don't know what a Model-View-Controller is, don't worry about this.)

- -

Suppose you want to create a simple "Hello, World" example in which a message is displayed whenever a user goes to a URL such as http://localhost/helloWorld.action. Because you've mapped WebWork's servlet to *.action, you need an action named helloWorld. To create the "Hello, World" example, you need to do three things:

-
    -
  1. Create an action class: HelloWorld.
  2. -
  3. Create a result: hello.jsp.
  4. -
  5. Configure the action and result.
  6. -
- - -

The Code

- -
HelloWorld.java
-
package example.helloworld;
-import com.opensymphony.xwork.Action;
-import java.util.*;
-
-public class HelloWorld implements Action {
-private String message;
-
- public String execute() {
-   message = "Hello, WebWorld!\n";
-   message += "The time is:\n";
-   message += DateFormat.getDateInstance().format(new Date());;
-
-   return SUCCESS;
- }
-
- public String getMessage() {
-   return message;
- }
-
-}
-
-

 

- -

Paste this code into a file webapp/hello.jsp:

-
hello.jsp
-
<%@ taglib prefix="ww" uri="webwork" %>
- <html>
-   <head>
-    <title>Hello Page</title>
-   </head>
-  <body>
-    The message generated by my first action is:
-    <ww:property value="message"/>
-  </body>
- </html>
-
-

 

- -

Edit the xwork.xml file as shown below, adding the helloWorld action and something called an interceptor to the default package. Read more: xwork.xml

-
xwork.xml
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-  <xwork>
-   <include file="webwork-default.xml"/>
-
-   <package name="default" extends="webwork-default">
-     <!-- Include webwork defaults (from WebWork JAR). -->
-     <default-interceptor-ref name="completeStack"/>
-
-      <action name="helloWorld"
-         class="example.helloworld.HelloWorld">
-         <result name="success">hello.jsp</result>
-      </action>
-   </package>
-  </xwork>
-
-

 
Don't forget

-Compile your action to webapp/WEB-INF/classes, and to restart your web application if necessary.

- -

Go ahead and try it now: go to the url http://localhost/helloWorld.action and see what happens. You should see a page that says "Hello, WebWorld!".

- -

How the code works

- -

The above four files work together like this.

-
    -
  • Your browser requests the url http://localhost/helloWorld.action, sending it to your web application server.
  • -
  • The server receives the request for helloWorld.action. Looking in webapp/WEB-INF/web.xml, it sees that all *.action (the default mapping) requests are to be handed off to com.opensymphony.webwork.dispatcher.FilterDispatcher. Essentially, the request is handed to WebWork now.
  • -
  • WebWork looks in xwork.xml for an action named "helloWorld". There it finds that this corresponds to the class "HelloWorld," instantiates it, and calls its execute() method.
  • -
  • execute() returns SUCCESS, and WebWork looks again in xwork.xml to see what page to load if SUCCESS is returned. It finds the page "hello.jsp".
  • -
  • The page hello.jsp is processed (the <ww:property value="message" /> tag calls the getter getMessage() of HelloWorld.java) and sent back to the browser.
  • -
- - -

In conclusion, with WebWork, all html forms are sent to an action. This action returns a constant result-name such as SUCCESS, ERROR or INPUT. Based on the xwork.xml, a given result-name may produce a page (as in this example), another action, or some other web resource (image, pdf). In this example, the form contained no data.

- -
- - diff --git a/docs/wikidocs/Before Annotation.html b/docs/wikidocs/Before Annotation.html deleted file mode 100644 index cd2d42383..000000000 --- a/docs/wikidocs/Before Annotation.html +++ /dev/null @@ -1,51 +0,0 @@ - - - WebWork - - Before Annotation - - - - - - - - - - -
-

Before Annotation

- -

Marks a action method that needs to be executed before the main action method.

- -

Usage

- -

The Before annotation can be applied at method level.

- - -

Parameters

- - -

no parameters

- - -

Examples

- -
-
public class SampleAction extends ActionSupport {
-
- @Before
- public void isAuthorized() throws AuthenticationException {
-   // authorize request, throw exception if failed
- }
-
- public String execute() {
-    // perform secure action
-    return SUCCESS;
- }
-}
-
- - -
- - diff --git a/docs/wikidocs/BeforeResult Annotation.html b/docs/wikidocs/BeforeResult Annotation.html deleted file mode 100644 index 355de431a..000000000 --- a/docs/wikidocs/BeforeResult Annotation.html +++ /dev/null @@ -1,51 +0,0 @@ - - - WebWork - - BeforeResult Annotation - - - - - - - - - - -
-

BeforeResult Annotation

- -

Marks a action method that needs to be executed before the result. Return value is ignored.

- -

Usage

- -

The BeforeResult annotation can be applied at method level.

- - -

Parameters

- - -

no parameters

- - -

Examples

- -
-
public class SampleAction extends ActionSupport {
-
- @BeforeResult
- public void isValid() throws ValidationException {
-   // validate model object, throw exception if failed
- }
-
- public String execute() {
-    // perform action
-    return SUCCESS;
- }
-}
-
- - -
- - diff --git a/docs/wikidocs/Building WebWork.html b/docs/wikidocs/Building WebWork.html deleted file mode 100644 index d7eab702b..000000000 --- a/docs/wikidocs/Building WebWork.html +++ /dev/null @@ -1,81 +0,0 @@ - - - WebWork - - Building WebWork - - - - - - - - - - -
-

Why Building?

- -

In most cases you will not need to build WebWork yourself, since the distribution package contains all you need to get started and productive with WebWork. See Getting Started for more information on how to start working with the distributed binaries. However, there are situations where you want to build WebWork from scratch, for example if you want to try out tweaks and patches, or simply if want to check the head of current development. For the latter, a solution apart from building WebWork from scratch might be to have a look into our Ivy Repository containing continous integration builds ("nightly builds"), containing the latest build of WebWork and XWork jars.

- -

Getting the Sources

- - -

Distribution

- -

The current distribution packages of WebWork contain all sources, as well as all needed libraries for building jars and running. Distribution packages are found here.
-The dependency resolution via Ivy is disabled by default for the build from a distribution package (> Webwork 2.2 Beta 4). If you need to work with the Clover and Ivy-related buildfile tasks, you might want to follow the instructions below.

- -

CVS

- -

The sources are are hosted via CVS on java.net. So getting your sources is quite standard:

-
    -
  1. If you have not already done, login to repository:
    -cvs -d :pserver:guest@cvs.dev.java.net:/cvs login
  2. -
  3. Checkout the the webwork sourcetree:
    -cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout webwork
  4. -
  5. Checkout the the opensymphony common sourcetree:
    -cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout opensymphony/common
  6. -
- - -

If you are a registered user at Java.net, you might use your username instead of anonymous guest account.
-For detailed information on how to setup different clients, visit https://webwork.dev.java.net/servlets/ProjectSource.

- -

Building

- -

We assume that you are familiar with ant as the standard build tool in the Java world.

- -

What is Ivy?

- -

If you checked out the sources from CVS, you might have noticed that the lib directory is empty. Unfortunately this does not mean that webwork has no external dependecies at all. To be honest, as a full featured MVC framework it has lots of dependencies, which in turn means that there has to be some dependency management. This is where Ivy comes to play.
-Ivy is a free java based dependency manager, with powerful features such as transitive dependencies, maven repository compatibility, continuous integration, html reports and many more. Ivy is fully integrated with ant, so you do not have to get into a complicated tool. See http://jayasoft.org/ivy for details.

- -

Installing and using Ivy

- -

The installation is quite trivial: Put a copy of the ivy-1.x.jar found in the common directory of the opensymphony module in your $ANT_HOME/lib directory.
-If you want to test the Ivy functionality, ensure you have an internet connection. Change into the webwork module directory and execute ant init(as you might guess, any other task depends on init). Ivy will now resolv all dependencies and (hopefully) download all required jars and put it into the lib directory.
-See Dependencies for informations on how to integrate Ivy in your own Webwork2 based projects.
Skipping dependency resolution (> Webwork 2.2 Beta 4)
-

The build now knows the property "skip.ivy". This may be specified from build.properties file or from a command line ant execution with -Dskip.ivy=true. If set, dependency resolution via Ivy is omitted and build is done with current jars found in lib directory.
-This behaviour is turned on by default for builds from the distribution package.


- -

 

- -

JUnit and Clover

- -

The full build process will require JUnit and Clover.
-Place a copy of junit.jar (>= 3.8.1) and clover.jar (>= 1.3.9) into your $ANT_HOME/lib directory (if not already exists). If you don't have these jars at hand, look in the lib/build directory of your WebWork module after you called ant init in the step before...
-OpenSymphony Clover license is found in the common directory of the opensymphony module. Place the clover-license.jar into your $ANT_HOME/lib directory as well. Now you are ready to ...

- -

Build

- -

Call ant jar or simply ant to build the WebWork jars. Play around with other targets, as you like.

- -

JDK/JRE Compatibility

- -

WebWork requires JDK 1.4.2+ to build. JDK 5.0 is not required for building.
-WebWork-based applications require JRE 1.4.2+ to run. JRE 5.0 is not required to run unless your application uses the optional xwork-tiger module, which adds some Java 5.0 specific features to XWork/WebWork functionality.

- -
- - diff --git a/docs/wikidocs/Can I access my action's Result.html b/docs/wikidocs/Can I access my action's Result.html deleted file mode 100644 index 22ee6c278..000000000 --- a/docs/wikidocs/Can I access my action's Result.html +++ /dev/null @@ -1,58 +0,0 @@ - - - WebWork - - I access my action's Result - - - - - - - - - - -
-

Yes, that could be done with the help of an interceptor.

- -

+ Method One +

-
-
public class MyInterceptor implements Interceptor {
-  ...
-	public String intercept(ActionInvocation invocation) throws Exception {
-		Map<String, ResultConfig> resultsMap = invocation.getProxy().getConfig().getResults();
-
-                // do something with ResultConfig in map
-
-		return invocation.invoke();
-	}
-  ...
-}
-
- -

+ Method Two +

-
-
public class MyInterceptor implements Interceptor {
-  ...
-        public String intercept(ActionInvocation invocation) throws Exception {
-             invocation.addPreResultListener(new PreResultListener() {
-			public void beforeResult(ActionInvocation invocation, String resultCode) {
-				Map<String, ResultConfig> resultsMap = invocation.getProxy().getConfig().getResults();
-                                ResultConfig finalResultConfig = resultsMap.get(resultCode);
-                                
-                                // do something interesting with the 'to-be' executed result
-			}
-	     });
-
-             return invocation.invoke();
-        }
-
-  ...
-}
-
- -

The difference between Method One and Two is that method two gives one, the final result to be executed.

- -
- - diff --git a/docs/wikidocs/Can I add I18N outside the Action's context.html b/docs/wikidocs/Can I add I18N outside the Action's context.html deleted file mode 100644 index cfb2dc454..000000000 --- a/docs/wikidocs/Can I add I18N outside the Action's context.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - I add I18N outside the Action's context - - - - - - - - - - -
-

Yes, use the <ww:i18n> tag to push a resource bundle on to the stack. Now calls with <ww:text/> or <ww:property value="getText(...)"/> will read from that resource bundle.

- -
- - diff --git a/docs/wikidocs/Can I break up my large XWork.xml file into smaller pieces.html b/docs/wikidocs/Can I break up my large XWork.xml file into smaller pieces.html deleted file mode 100644 index d08020589..000000000 --- a/docs/wikidocs/Can I break up my large XWork.xml file into smaller pieces.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork - - I break up my large XWork.xml file into smaller pieces - - - - - - - - - - -
-

Sure, that's what the <include> element is for. Most xwork.xml files
-already have one:

- -
-
<xwork>
-    <include file="webwork-default.xml"/>
-    <include file="config-browser.xml"/>
-    <package name="default" extends="webwork-default">
-....
-    </package>
-    <include file="other.xml"/>
-</xwork>
-
- -

This tells it to load the webwork-default.xml from the webwork jar file
-to get all of those interceptor and result definitions.

- -

You can put your own <include> in your xwork.xml interchangeably with
-<package> elements... They will be loaded in the same order as it reads
-from top to bottom and adds things as it reads them.

- -

@see com.opensymphony.xwork.config.ConfigurationManager
-@see com.opensymphony.xwork.config.Configuration
-@see com.opensymphony.xwork.config.impl.DefaultConfiguration
-@see com.opensymphony.xwork.config.ConfigurationProvider
-@see com.opensymphony.xwork.config.providers.XmlConfigurationProvider

- -
- - diff --git a/docs/wikidocs/Can I change templateDir on a per-page basis.html b/docs/wikidocs/Can I change templateDir on a per-page basis.html deleted file mode 100644 index 83711e0f3..000000000 --- a/docs/wikidocs/Can I change templateDir on a per-page basis.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - I change templateDir on a per-page basis - - - - - - - - - - -
-

Yes, by using the <ww:set name="templateDir" value="myTemplateDir" scope="page" />.

- -
This will set the attribute 'templateDir' in the page scope, with the value of what that is returned by 'myTemplateDir' in the stack, eg. the action class might have a getMyTheme method that return a String called template, to indicate what the template directory is within the classpath.
- -

Another way would be <ww:set name="templateDir" value="'template'" scope="page" />

- -
This will set the attribute 'templateDir' in the page scope with the value 'template' to indicate what the template directory is within the classpath.
- -

See Template Loading

- -
- - diff --git a/docs/wikidocs/Can I change templateSuffix on a per-page basis.html b/docs/wikidocs/Can I change templateSuffix on a per-page basis.html deleted file mode 100644 index 2a84f8dcc..000000000 --- a/docs/wikidocs/Can I change templateSuffix on a per-page basis.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - I change templateSuffix on a per-page basis - - - - - - - - - - -
-

Yes, by using the <ww:set name="templateSuffix" value="'vm'" /> see Template Loading.

- -
- - diff --git a/docs/wikidocs/Can I change theme on a per-page basis.html b/docs/wikidocs/Can I change theme on a per-page basis.html deleted file mode 100644 index d23915226..000000000 --- a/docs/wikidocs/Can I change theme on a per-page basis.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - I change theme on a per-page basis - - - - - - - - - - -
-

Yes, by using the <ww:set name="theme" value="myTheme" scope="page" />.

- -
This will set the attribute 'theme' in the page scope, with the value of what that is returned by 'myTheme' in the stack, eg. the action class might have a getMyTheme method that return a String called simple, to indicate simple theme.
- -

Another way would be <ww:set name="theme" value="'simple'" scope="page" />

- -
This will set the attribute 'theme' in the page scope with the value 'simple' to indicate a simple theme.
- -

See Selecting Themes

- -
- - diff --git a/docs/wikidocs/Can I enable ww altSyntax on a per-page basis.html b/docs/wikidocs/Can I enable ww altSyntax on a per-page basis.html deleted file mode 100644 index c774e739f..000000000 --- a/docs/wikidocs/Can I enable ww altSyntax on a per-page basis.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - I enable ww altSyntax on a per-page basis - - - - - - - - - - -
-

Yes, by using the <ww:set name="useAltSyntax" value="true" /> see Alt Syntax.

- -
- - diff --git a/docs/wikidocs/Can I have my webwork action tag run another method apart from the default execute method.html b/docs/wikidocs/Can I have my webwork action tag run another method apart from the default execute method.html deleted file mode 100644 index c215ef9a2..000000000 --- a/docs/wikidocs/Can I have my webwork action tag run another method apart from the default execute method.html +++ /dev/null @@ -1,24 +0,0 @@ - - - WebWork - - I have my webwork action tag run another method apart from the default execute method - - - - - - - - - - -
-

Yes that could be done, eg if one like the method to be executed is input(), the following could be applied

- -
-
<ww:action name="myActionAlias!input" .... />
-
- -
- - diff --git a/docs/wikidocs/CeWolf charts using Velocity templates.html b/docs/wikidocs/CeWolf charts using Velocity templates.html deleted file mode 100644 index f18422658..000000000 --- a/docs/wikidocs/CeWolf charts using Velocity templates.html +++ /dev/null @@ -1,119 +0,0 @@ - - - WebWork - - CeWolf charts using Velocity templates - - - - - - - - - - -
-

Setup CeWolf

-

This currently only works with the most recent CVS version of WebWork but should be available in the upcoming 2.0 beta2

-
    -
  1. Go to http://cewolf.sourceforge.net and grab a stable release of CeWolf (at the time of writing, the unstable builds do not work with WebWork).
  2. -
  3. Edit your webwork.properties file and add "de.laures.cewolf.taglib.tags" to the property "webwork.velocity.tag.path"
  4. -
- - -

Lastly add the CeWolf servlet to web.xml:

- -
-
<servlet>
-    <servlet-name>CewolfServlet</servlet-name>
-    <servlet-class>de.laures.cewolf.CewolfRenderer</servlet-class>
-</servlet>
-
-<servlet-mapping>
-    <servlet-name>CewolfServlet</servlet-name>
-    <url-pattern>/cewolf/*</url-pattern>
-</servlet-mapping>
-
-

Create a DatasetProducer

-

This is the default DatasetProducer from the CeWolf tutorial.

- -
-
import java.io.Serializable;
-import java.util.Date;
-import java.util.Map;
-
-import org.jfree.data.DefaultCategoryDataset;
-
-import de.laures.cewolf.DatasetProduceException;
-import de.laures.cewolf.DatasetProducer;
-
-public class PageViewCountData implements DatasetProducer, Serializable {
-
-	// These values would normally not be hard coded but produced by
-	// some kind of data source like a database or a file
-	private final String[] categories =    {"mon", "tue", "wen", "thu", "fri", "sat", "sun"};
-	private final String[] seriesNames =    {"cewolfset.jsp", "tutorial.jsp", "testpage.jsp", "performancetest.jsp"};
-	private final Integer[] [] values = new Integer[OS:seriesNames.length] [OS:categories.length];
-
-	public Object produceDataset(Map params) throws DatasetProduceException {
-		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
-		for (int series = 0; series < seriesNames.length; series ++) {
-			int lastY = (int)(Math.random() * 1000 + 1000);
-			for (int i = 0; i < categories.length; i++) {
-				final int y = lastY + (int)(Math.random() * 200 - 100);
-				lastY = y;
-				dataset.addValue((double)y, seriesNames[OS:series], categories[i]);
-			}
-		}
-		return dataset;
-	}
-
-	public boolean hasExpired(Map params, Date since) {		
-		return (System.currentTimeMillis() - since.getTime())  > 5000;
-	}
-
-	public String getProducerId() {
-		return "PageViewCountData DatasetProducer";
-	}
-}
-
-

Create the Velocity template

-

With the new WebWork refactorings, nested JSP tags with arbitrary parameters can be used, so we convert the CeWolf tutorial JSP script to Velocity.

- -
-
<jsp:useBean id="pageViews" class="de.laures.cewolf.example.PageViewCountData"/>
-<cewolf:chart 
-    id="line" 
-    title="Page View Statistics" 
-    type="line" 
-    xaxislabel="Page" 
-    yaxislabel="Views">
-    <cewolf:data>
-        <cewolf:producer id="pageViews"/>
-    </cewolf:data>
-</cewolf:chart>
-
-<cewolf:img chartid="line" renderer="cewolf" width="400" height="300"/>
-
- -

In Velocity it looks like this:

-
-
#set( $pageViews = $stack.findValue("new com.PageViewCountData()") )
-$req.session.setAttribute("pageViews", $pageViews ) 
-
-#bodytag( SimpleChart "id=line" "title=Page View Statistics" "type=line" "xaxislabel=Page" "yaxslabel=Views" )
-  #bodytag( Data )
-    #tag( Producer "id=pageViews" )
-  #end
-#end
-
-#tag( ChartImg "chartid=line" "renderer=cewolf" "width=400" "height=300" )
-
- -

As you may notice, CeWolf looks up it's DatasetProducer in the request attributes - it has no knowledge of the Velocity context. That's why we call $req.session.setAttribute(). The other attributes (such as the chartid) will be set by CeWolf, so we don't need to care about them.

-

Setup an action to disply the template

-

Now you should be able to fire up an action in the usual way with this template as the result and a nice chart should appear.

- -
- - diff --git a/docs/wikidocs/Chain Result.html b/docs/wikidocs/Chain Result.html deleted file mode 100644 index e92fed429..000000000 --- a/docs/wikidocs/Chain Result.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork - - Chain Result - - - - - - - - - - -
- -

This result invokes an entire other action, complete with it's own interceptor stack and result.

- - -

Parameters

- - -

    - -

  • actionName (default) - the name of the action that will be chained to
  • - -

  • namespace - used to determine which namespace the Action is in that we're chaining. If namespace is null, - this defaults to the current namespace
  • - -

  • method - used to specify another method on target action to be invoked. - If null, this defaults to execute method
  • - -

- - -

Examples

- -
-
<package name="public" extends="webwork-default">
-    <!-- Chain creatAccount to login, using the default parameter -->
-    <action name="createAccount" class="...">
-        <result type="chain">login</result>
-    </action>
-
-    <action name="login" class="...">
-        <!-- Chain to another namespace -->
-        <result type="chain">
-            <param name="actionName">dashboard</param>
-            <param name="namespace">/secure</param>
-        </result>
-    </action>
-</package>
-
-<package name="secure" extends="webwork-default" namespace="/secure">
-    <action name="dashboard" class="...">
-        <result>dashboard.jsp</result>
-    </action>
-</package>
-
- -
- - diff --git a/docs/wikidocs/Chaining Interceptor.html b/docs/wikidocs/Chaining Interceptor.html deleted file mode 100644 index 05da50b39..000000000 --- a/docs/wikidocs/Chaining Interceptor.html +++ /dev/null @@ -1,65 +0,0 @@ - - - WebWork - - Chaining Interceptor - - - - - - - - - - -
- -

An interceptor that copies all the properties of every object in the value stack to the currently executing object, - except for any object that implements Unchainable. A collection of optional includes and - excludes may be provided to control how and which parameters are copied. Only includes or excludes may be - specified. Specifying both results in undefined behavior. See the javadocs for {@link OgnlUtil#copy(Object, Object, - java.util.Map, java.util.Collection, java.util.Collection)} for more information.

- -

It is important to remember that this interceptor does nothing if there are no objects already on the stack. - This means two things: One, you can safely apply it to all your actions without any worry of adverse affects. Two, it - is up to you to ensure an object exists in the stack prior to invoking this action. The most typical way this is done - is through the use of the chain result type, which combines with this interceptor to make up the action - chaining feature.

- - -

Parameters

- - -

    - -

  • excludes (optional) - the list of parameter names to exclude from copying (all others will be included).
  • - -

  • includes (optional) - the list of parameter names to include when copying (all others will be excluded).
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points to this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="basicStack"/>
-    <result name="success" type="chain">otherAction</result>
-</action>
-
-<action name="otherAction" class="com.examples.OtherAction">
-    <interceptor-ref name="chain"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Chaining Interceptor_attachments/HibernateAction.java b/docs/wikidocs/Chaining Interceptor_attachments/HibernateAction.java deleted file mode 100644 index 6ee66c849..000000000 --- a/docs/wikidocs/Chaining Interceptor_attachments/HibernateAction.java +++ /dev/null @@ -1,47 +0,0 @@ -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); - } -} - - diff --git a/docs/wikidocs/Chaining Interceptor_attachments/HibernateUtil.java b/docs/wikidocs/Chaining Interceptor_attachments/HibernateUtil.java deleted file mode 100644 index 02eaeae4e..000000000 --- a/docs/wikidocs/Chaining Interceptor_attachments/HibernateUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -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(); - } - } -} \ No newline at end of file diff --git a/docs/wikidocs/Chat Application.html b/docs/wikidocs/Chat Application.html deleted file mode 100644 index 3c4b773db..000000000 --- a/docs/wikidocs/Chat Application.html +++ /dev/null @@ -1,194 +0,0 @@ - - - WebWork - - Application - - - - - - - - - - -
-

The following is a sample application I did to study how webwork works. Hopefully it'll help other newbies gain footing on this great framework. Having said that, if I have made some mistakes in this example, or if there is a better way of doing things, please feel free to contribute to this wiki.

- -

The application works like a mini-BBS. Users login to the application with a nickname. The user session is saved in a session scoped component. Once logged in, they can leave quips or messages.

- -

-

Basic Application and Environment Setup

-

webwork.properties

-
-
# Nothing here... that's right, it's empty. Using the webwork defaults.
-
- -

-

Action Classes

-

LoginAction extends ActionSupport, which already implements some of the basic action methods. Additionally, it provides some validation support.

- -

The two main methods we are concerned with in ActionSupport are validate() and execute().

- -

(Note : this has changed from an earlier beta which uses doValidation() and doExecute(). )

-

Validation

-

Validation is performed on your Action class if it implements Validatable (ActionSupport does), and your DefaultWorkflowInterceptor is activated on that action.

-

Execution

-

execute() returns a String. This String will be used to determine which result is used.

- -

The framework provides some default return Strings, namely

-
-
Action.SUCCESS = "success"
-Action.INPUT = "input"
-Action.NONE = "none"
-Action.ERROR = "error"
-Action.LOGIN = "login"
-
-

For example, lets take a look at the relevant part of our xwork.xml configuration for LoginAction ...
-xwork.xml

-
-
<action name="login" class="example.LoginAction"> 
-  <result name="success" type="chain"> 
-    <param name="actionName">viewMessages</param> </result>
-  <result name="input" type="chain"> 
-    <param name="actionName">viewMessages</param> </result>
-</action>
-
-

If execute() returns a String of "success", the result with attribute "success" will be used. If doExecute() returns a String of "input", the result with attribute "success" will be used.

- -

You can define your own return results. For example,

-
-
public String doExecute() {
-  return "resetPassword";
-}
-
-
-
<action name="login" class="example.LoginAction"> 
-  <result name="resetPassword" type="chain"> 
-    <param name="actionName">viewResetPassword</param> </result>
-</action>
-
-

Context Variables / Mapping

- -

LoginAction.java

-
-
public class LoginAction extends ActionSupport {
-
-	private String loginName;
-
-	public String getLoginName() {
-		return loginName;
-	}
-
-	public void setLoginName(String loginName) {
-		this.loginName = loginName;
-	}
-}
-
-

If you notice, login has a bean property loginName. This property will be set automatically by webwork from your web forms.

-
-
<form method="POST" action="login.action">
-  <input type="text" name="loginName" size="20">
-  <input type="submit" value="Login">
-</form>
-
-

Also, the bean property is available to your views. In velocity, this accessible via the VelocityContext

-
-
$loginName
-
-

which is mapped to getLoginName() from your Action class.

- -

getLoginName() is mapped to $loginName. You can map any other object you wish. For example, I could have a User object, and thus...

-
-
class User {
-   private Account account;
-   private String name;
-   // with the relevant getX() methods...
-}
-
-

in my action class...

-
-
class MyExampleAction {
-   //...
-   User getUser() {
-      returns user;
-   }
-   //...
-}
-
-

and in my velocity template, have a

-
-
Welcome, $user.name.
-You last logged on at $user.lastLogin.
-You currently have $user.account.balance left in your account.
-
- -

-

Result Types

-

Predefined in webwork-default.xml

-
-
<result-types>
-            <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"/>
-            <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
-            <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
-            <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
-        </result-types>
-
- -

In our example, we have only used the results of <chain> and <velocity>.

- -

-

Interceptors

-

is there an order execution of the interceptors ? Which interceptor is executed first ?

- -

Interceptors are called before the actions are invoked. With interceptors, you can "wrap" your action classes to provide additional services or functions. You can even prevent the execution of the action classes if you wish.

- -

Some interceptors are predefined in webwork-default.xml

-
-
<interceptors>
-            <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
-            <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
-            <interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
-            <interceptor-stack name="defaultStack">
-                <interceptor-ref name="timer"/>
-                <interceptor-ref name="logger"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="params"/>
-            </interceptor-stack>
-        </interceptors>
-
- -

... more info on interceptor-ref

- -

... more info on interceptor-stack

- -

-

Components

-

components.xml

-
-
<components> 
-
-    <component> 
-      <scope>application</scope>
-      <class>example.data.MessageList</class>
-      <enabler>example.data.MessageListAware</enabler>
-    </component>
-
-    <component> 
-      <scope>session</scope>
-      <class>example.web.UserSession</class>
-      <enabler>example.web.UserSessionAware</enabler>
-    </component>
-
-  </components>
-
- -

Two components, one to hold the application scoped chat messages, another to hold the user's session information (login account name, etc.) For all practical purposes, you can replace the application scoped component with a database. i.e. instead of reading/writing to the component, read/write to the database.

- -

-

Comments

-

Feedback welcome. I'm also a newbie, and may have misused the framework, coded some mistakes above. Apologies if that be the case.

- -
- - diff --git a/docs/wikidocs/Chat.html b/docs/wikidocs/Chat.html deleted file mode 100644 index a138a94eb..000000000 --- a/docs/wikidocs/Chat.html +++ /dev/null @@ -1,40 +0,0 @@ - - - WebWork - - Chat - - - - - - - - - - -
-

WebWork Jabber Chat

- -

WebWork has an official chat room on a jabber server, where some of the developers hang out and some important discussions take place. In contrast to the official meetings, which are mostly scheduled, you can always drop by to ask questions or say hi.

- -

Register

- -

In order to connect to the chat server, you need to make an account on the Opensymphony Forums. You'll need that username and password to connect.

-
Watch uppercase/lowercase ! If you have a username with a capital in it, you'll need to make a second account with an all lowercase username (due to a small bug in the chat server)
- -

Clients

- -

If you log in at the forum, you can join the chat using a ajax client (click 'join!' next to the Chatting Now). This is very useful if you don't have a real jabber client at your disposal.

- -
    -
  • Chat server: conference.chat.opensymphony.com
  • -
  • Chat room: webwork-users
  • -
  • Username: your username from the forum
  • -
  • Password: your password from the forum
  • -
  • Handle (optional): your nickname
  • -
- - -
- - diff --git a/docs/wikidocs/Client Side Validation.html b/docs/wikidocs/Client Side Validation.html deleted file mode 100644 index df519a015..000000000 --- a/docs/wikidocs/Client Side Validation.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork - - Client Side Validation - - - - - - - - - - -
-

Description

- -

WebWork adds support for client-side validation on top of XWork's standard validation framework. It can be enabled on a per-form basis by specifying validate="true" in the form tag:

- -
-
<ww:form name="test" action="javascriptValidation" validate="true">
-  ...
-</ww:form>
-
- -
A name for the form can be supplied, else the action name will be used as the form name.
- - -

A correct action and namespace attributes must be provided to the <ww:form> tag. For example, the Action named "submitProfile" is used in the "/user" namespace, the following must be used.

- -
-
<ww:form namespace="/user" action="submitProfile" validate="true">
-  ...
-</ww:form>
-
- -

While the following will "work" in the sense that the form will function correctly, client-side validation will not. That is because WebWork must know the exact namespace and action (rather than a URL) to properly support validation.

- -
-
<ww:form action="/user/submitProfile.action" validate="true">
-  ...
-</ww:form>
-
- - -

All the standard validation configuration steps still apply. Client-side validation uses the same validation rules as server-side validation. If server-side validation doesn't work, then client-side validation won't work either.

- -
-

Note that the required attribute on many WebWork Tags has nothing to do with client-side validation. It is just used by certain theme (like xhtml) to put a '*' on the field marked as required.

- -

Client Side Validation Types

- -

There are two styles of client side validation:

- - - - -
- - diff --git a/docs/wikidocs/Client Validation.html b/docs/wikidocs/Client Validation.html deleted file mode 100644 index 71bec5e39..000000000 --- a/docs/wikidocs/Client Validation.html +++ /dev/null @@ -1,102 +0,0 @@ - - - WebWork - - Client Validation - - - - - - - - - - -
-

Description

-

The following is the step to create a Client-Side validation using webwork. Note the validate attribute is set to true. Note also that not all themes support this feature (client-side validation)

- -

Step 1

-

Create the jsp page. Note the <ww:head > tag being used, it will setup the css in this case (xhtml theme)

-
-
<html>
-<head>
-    <title>Validation - Basic</title>
-    <ww:head/>
-</head>
-
-<body>
-
-<ww:form method="post" validate="true">
-    <ww:textfield label="Name" name="name"/>
-    <ww:textfield label="Age" name="age"/>
-    <ww:textfield label="Favorite color" name="answer"/>
-    <ww:submit/>
-</ww:form>
-
-</body>
-</html>
-
- - -

Step 2

-

Create the action class

-
-
public class QuizAction extends ActionSupport {
-    String name;
-    int age;
-    String answer;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age = age;
-    }
-
-    public String getAnswer() {
-        return answer;
-    }
-
-    public void setAnswer(String answer) {
-        this.answer = answer;
-    }
-}
-
- - -

Step 3

-

Create the validation.xml to configure the validators to be used.

-
-
<!--
-    Add the following DOCTYPE declaration as first line of your XXX-validation.xml file:
-    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
--->
-<validators>
-    <field name="name">
-        <field-validator type="requiredstring">
-            <message>You must enter a name</message>
-        </field-validator>
-    </field>
-    <field name="age">
-        <field-validator type="int">
-            <param name="min">13</param>
-            <param name="max">19</param>
-            <message>Only people ages 13 to 19 may take this quiz</message>
-        </field-validator>
-    </field>
-</validators>
-
- -
- - diff --git a/docs/wikidocs/Comparison to JSF.html b/docs/wikidocs/Comparison to JSF.html deleted file mode 100644 index 9b0980eb4..000000000 --- a/docs/wikidocs/Comparison to JSF.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Comparison to JSF - - - - - - - - - - -
-

TODO: a brief write-up comparing WebWork to JSF

- -
- - diff --git a/docs/wikidocs/Comparison to Ruby on Rails.html b/docs/wikidocs/Comparison to Ruby on Rails.html deleted file mode 100644 index 8b4e61676..000000000 --- a/docs/wikidocs/Comparison to Ruby on Rails.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Comparison to Ruby on Rails - - - - - - - - - - -
-

WebWork's architecture is very similar to Ruby on Rails. The biggest difference between WebWork and Rails is actually more of a difference between Java and Ruby than anything. Using FreeMarker and QuickStart, developers can achieve the same level of productivity as developers who use Rails and the fact that Ruby is a scripting language.

- -
- - diff --git a/docs/wikidocs/Comparison to Spring MVC.html b/docs/wikidocs/Comparison to Spring MVC.html deleted file mode 100644 index ded4e3b7c..000000000 --- a/docs/wikidocs/Comparison to Spring MVC.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Comparison to Spring MVC - - - - - - - - - - -
-

TODO: a brief write-up comparing WebWork to Spring MVC

- -
- - diff --git a/docs/wikidocs/Comparison to Struts.html b/docs/wikidocs/Comparison to Struts.html deleted file mode 100644 index 9d4821a36..000000000 --- a/docs/wikidocs/Comparison to Struts.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork - - Comparison to Struts - - - - - - - - - - -
-
As of December, 2005 the Struts and WebWork teams have agreed to combine their efforts to create Struts Action 2.0. Struts Action 2.0 will be based on WebWork 2.2. Therefore this comparison is less relevant as the two communities cooperate more.
- -

Feature Comparison

- -

Feature

StrutsWebWork 1.xWebWork 2.x
Action classesStruts requires Action classes to extend an Abstract base class. This shows a common problem in Struts of programming to abstract classes instead of interfaces.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.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.
Threading ModelStruts 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.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.ditto
Servlet DependencyStruts Actions have dependencies on Servlets because they get the ServletRequest and ServletResponse (not HttpServletRequest and HttpServletResponse, I'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's not a good fit for JMS, for instance.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.ditto
TestabilityMany 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 (http://strutstestcase.sourceforge.net/)WebWork actions can be tested by instantiating your action, setting the properties, and executing themditto, 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
FormBeansStruts 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 FormBeansWebWork 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 "WW1:Populate Form Bean and access its value"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.
Expression LanguageStruts 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.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 work with JSTLWebWork uses Ognl 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 WW1:Using JSTL seamlessly with WebWork
Binding values into viewsStruts uses the standard JSP mechanism for binding objects into the page context for access, which tightly couples your view to the form beans being renderedWebWork 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.ditto
Type ConversionStruts 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.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.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.
Modular Before & After ProcessingClass 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 WW:Comparison to Struts#1Class hierarchiesWebWork 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.
ValidationStruts calls validate() on the FormBean. Struts users often use Commons Validation for validation. I don't know a lot about this, so I'll put some questions here:

Because FormBean properties are usually Strings, some types of validations must either be duplicated (checking type conversion) or cannot be done?

Can Commons Validation have different validation contexts for the same class? (I've been told yes, so that's a good thing)

Can Commons Validation chain to validations on sub-objects, using the validations defined for that object properties class?
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)WebWork can use the validate() method of WebWork and Struts and / or use the Validation framework, 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.
Control Of Action ExecutionAs 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 wantThe ActionFactory chain controls the order in which an Action is constructed and initialised, but this requires writing a classThe 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.

- -

References

- - - - -

Footnotes

-
    -
  1. Some Stuts users have built the beginnings of an Interceptor framework for Struts (http://struts.sourceforge.net/saif/). It currently has some serious limitations (no "around" processing, just before and after) and is not part of the main Struts project
  2. -
- - -
- - diff --git a/docs/wikidocs/Comparison to Tapestry.html b/docs/wikidocs/Comparison to Tapestry.html deleted file mode 100644 index 2d7f473e8..000000000 --- a/docs/wikidocs/Comparison to Tapestry.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Comparison to Tapestry - - - - - - - - - - -
-

TODO: a brief write-up comparing WebWork to Tapestry

- -
- - diff --git a/docs/wikidocs/Comparison to other web frameworks.html b/docs/wikidocs/Comparison to other web frameworks.html deleted file mode 100644 index 554bea849..000000000 --- a/docs/wikidocs/Comparison to other web frameworks.html +++ /dev/null @@ -1,31 +0,0 @@ - - - WebWork - - Comparison to other web frameworks - - - - - - - - - - -
- - - -

Matt Raible wrote (mid 2005) an interesting whitepaper where he compared various web frameworks. You can view the PDF here:
-https://equinox.dev.java.net/framework-comparison/WebFrameworks.pdf
-http://www.virtuas.com/files/osl-jwf-01.pdf

- -
- - diff --git a/docs/wikidocs/Component Interceptor.html b/docs/wikidocs/Component Interceptor.html deleted file mode 100644 index 47f65c4f9..000000000 --- a/docs/wikidocs/Component Interceptor.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork - - Component Interceptor - - - - - - - - - - -
- -

A simple interceptor that applies the WebWork IOC container ComponentManager against the executing action. Note, WebWork IOC is deprecated and it is highly recommended that you look at alternative solutions, such as Spring.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points to this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="componentStack"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Components.html b/docs/wikidocs/Components.html deleted file mode 100644 index 3bf7bcea3..000000000 --- a/docs/wikidocs/Components.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - Components - - - - - - - - - - -
-
These documents are out of date. As of WebWork 2.2, the WebWork IoC container has been deprecated (though not removed) and the WebWork team recommends you use Spring for all your IoC needs
- -

Overview

- -

WebWork builds on XWork's component implementation by providing lifecycle management of component objects and then making these components available to your action classes (or any other user code for that matter) as required.

- -

Two types of classes in WebWork can use an enabler interface for inversion of control: Actions and Components. In order for an Action class to have its components set, the ComponentInterceptor must be made available for the Action to set those resources. In turn, if those components require other components to be initialized and set for their own use, those initializations take place at the time the ComponentInterceptor intercepts the action as well.

- -

Scopes and Lifecycle

- -

Components can be configured to exist across three different scopes in WebWork:

-
    -
  1. for the duration of a single request,
  2. -
  3. across a user session, or
  4. -
  5. for the entire lifetime of the web application.
  6. -
- - -

WW:WebWork lazy loads components, meaning that components, no matter what scope, are initialized at the time they are used and disposed of at the end of the given lifecycle of that scope. Thus, an application scoped component, for example, will be initialized the first time a user makes a request to an action that implements the enabler interface of that component and will be disposed of at the time the application closes.

- -

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.

- -

All components must be registered in the components.xml file, which is discussed in the Configuration section.

- -

Obtaining a ComponentManager

- -

During any request there are three component managers in existence, one for each scope. They are stored as an attribute called "DefaultComponentManager" in their respective scope objects. So if for example you need to retrieve the ComponentManager object for the request scope, the following code will do the trick:

- -
-
ComponentManager cm = (ComponentManager) request.getAttribute("DefaultComponentManager");
-
- -
- - diff --git a/docs/wikidocs/Config Browser.html b/docs/wikidocs/Config Browser.html deleted file mode 100644 index f555eae2c..000000000 --- a/docs/wikidocs/Config Browser.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - Config Browser - - - - - - - - - - -
-

The config browser is a simple tool to help view your WebWork action configuration at runtime. It is very useful when debugging problems that could be related to configuration. To install it, you need to follow these two steps:

- -
    -
  1. Add the FreeMarker dependencies to your web application
  2. -
  3. Add the following to your xwork.xml: <include file="config-browser.xml"/>
  4. -
- - -

Once you have done this, you can access the tool but going to the action named index in the config-browser namespace. In most cases (if you are using the default ActionMapper), the URL is something like http://localhost:8080/starter/config-browser/index.action.

- -
- - diff --git a/docs/wikidocs/Configuration Files.html b/docs/wikidocs/Configuration Files.html deleted file mode 100644 index 2b4432d5b..000000000 --- a/docs/wikidocs/Configuration Files.html +++ /dev/null @@ -1,76 +0,0 @@ - - - WebWork - - Configuration Files - - - - - - - - - - -
-

Main Configuration Files

- -

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's required and optional configuration files.

- -

Below are all the files that you may need to be aware of. Some of this configuration files can be reloaded dynamically, making development much easier. See Reloading configuration for more information.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileOptionalLocation (relative to webapp)Purpose
web.xmlno/WEB-INF/Web deployment descriptor to include all necessary WebWork components
xwork.xmlno/WEB-INF/classes/Main configuration, contains result/view types, action mappings, interceptors, etc
webwork.propertiesyes/WEB-INF/classes/WebWork properties
webwork\-default.xmlyes/WEB-INF/lib/webwork-x.x.jarDefault configuration that should be included in xwork.xml
velocity.propertiesyes/WEB-INF/classes/Override the default velocity configuration
- -

Static Content

- -

Common static content that is needed by webwork (JavaScript and CSS files, etc.) is server automatically by the FilterDispatcher filter. Any request starting with "/webwork/" denotes that static content is required, and then mapping the value after "/webwork/" to common packages in WebWork and, optionally in your class path.

- -

By default, the following packages are searched:

-
    -
  • com.opensymphony.webwork.static
  • -
  • template
  • -
- - -

Additional packages can be specified by providing a comma seperated list to the configuration parameter named "packages" (configured in web.xml for the FilterDispatcher filter). When specifying additional static content, you should be careful not to expose sensitive configuration information (i.e. database password).

- -
- - diff --git a/docs/wikidocs/Continuations.html b/docs/wikidocs/Continuations.html deleted file mode 100644 index 8adcbdaa6..000000000 --- a/docs/wikidocs/Continuations.html +++ /dev/null @@ -1,136 +0,0 @@ - - - WebWork - - Continuations - - - - - - - - - - -
-

Continuations are a feature in WebWork, borrowed from the RIFE project, that allow for extremely simple state management and wizard-like functionality.

- -
Continuations are currently expiremental, and as such, we cannot recommend they be used for heavy-use production deployments at this time. We will continue to work with the community to stabilize and enhance this feature until we are confidant it can be used in the most extreme site traffic and use-cases.
- -

Setting it Up

- -

Setting up continuation support requires identifying the base package that your classes are in. This is done in webwork.properties using the key webwork.continuations.package. Typically, this can be the root package that your classes are found in, such as com.acme.

- -

Once you've done this, WebWork will analyze your classes and automatically apply continuation support for any class that uses the continuation features - specifically a class that extends ActionSupport that has an execute() method that calls a pause() method.

- -

URL Concerns

- -

Because continuations require the state of your flow be managed by WebWork, it is up to you to make sure your application inform WebWork what the flow's ID is. This is done via a continue parameter that provides a unique ID for every request in the flow. Assuming you are generating your URLs using the URL tag or the Form tag, this is handled for you automatically. If you are not using these tags, continuations will not work.

- -

Interceptor Concerns

- -

Because continuations radically change the way your actions are invoked, it is important to understand how this affects interceptors. The most important think to know is that continuations kick in only when the execute() method is called. This means that on every request (regardless of whether it is a new request or a continuation), the interceptors will be called. This is what makes it possible to apply new request parameters to your action even though the rest of the call stack appears to look the same.

- -

This is generally exactly what you would wante, except some interceptors, namely the Execute and Wait Interceptor and possibly the Token Session Interceptor, have very different expectations about the workflow/lifecycle of the action invocation. In these cases, continuations should not be used.

- -

Example

- -

Getting started with continuations is extremely simple. The biggest thing to get used to is the very different conversational style with application workflow. Typically, you might have used session variables or hidden form fields to pass the state around. Using continuations, you use the Java language to handle that state. See the following body of a Guess class extending ActionSupport:

- -
-
public class Guess extends ActionSupport implements Preparable {
-    int guess;
-
-    public void prepare() throws Exception {
-        // We clear the error message state before the action.
-        // That is because with continuations, the original (or cloned) action is being
-        //  executed, which will still have the old errors and potentially cause problems,
-        //  such as with the workflow interceptor
-        clearErrorsAndMessages();
-    }
-
-    public String execute() throws Exception {
-        int answer = new Random().nextInt(100) + 1;
-        int tries = 5;
-
-        while (answer != guess && tries > 0) {
-            pause(Action.SUCCESS);
-
-            if (guess > answer) {
-                addFieldError("guess", "Too high!");
-            } else if (guess < answer) {
-                addFieldError("guess", "Too low!");
-            }
-
-            tries--;
-        }
-
-        if (answer == guess) {
-            addActionMessage("You got it!");
-        } else {
-            addActionMessage("You ran out of tries, the answer was " + answer);
-        }
-
-        return Action.SUCCESS;
-    }
-
-    public void setGuess(int guess) {
-        this.guess = guess;
-    }
-}
-
- -

Note how the class keeps the state (tries, in this example) as a local variable in the execute() method. WebWork's continuations will automatically pick up the invocation after the pause() method call and will restore all local variables, as if the logical loop is continuing "magically" (read on for more info on how it works).

- -

The view is nothing special, except for that fact that it adheres to the URL concerns and uses the Form tag to render the URL. This makes sure that the continue parameter is included in all requests.

- -
-
<html>
-<head>
-    <title></title>
-</head>
-
-<body>
-<#list actionMessages as msg>
-    ${msg}
-</#list>
-
-<@ww.form action="guess" method="post">
-    <@ww.textfield label="Guess" name="guess"/>
-    <@ww.submit value="Guess"/>
-</@ww.form>
-</body>
-</html>
-
- -

Advanced: How it Works

- -

Continuations are not magic, though sometimes they might seem like they are. In fact, they work by using some very intelligent byte-code manipulation. This means that in order to use continuations, your deployment environment allow for custom class loaders to handle loading your actions. Typically this is not a problem, but it should be called out.

- -

Once the class is requested to be loaded, WebWork will hand off the request to the RIFE/Continuations module, which will then check a few conditions:

- -
    -
  1. Does the class extend ActionSupport?
  2. -
  3. Does the class have an execute() method?
  4. -
  5. In the execute() method, are there any calls to pause()?
  6. -
- - -

If the answer is yes to all three conditions, the class is then instrumented and the execute() method is rewritten with try/catch code, goto statements, and intelligent "state restoration" code. All this happens transparently and does not affect the ability to debug the class or otherwise code it.

- -

See the pause() method JavaDocs in the ActionSupport class for more info:

- -

Stops the action invocation immediately (by throwing a PauseException) and causes the action invocation to return -the specified result, such as #SUCCESS, #INPUT, etc. -

- -

The next time this action is invoked (and using the same continuation ID), the method will resume immediately -after where this method was called, with the entire call stack in the execute method restored. -

- -

Note: this method can only be called within the #execute() method.

- - -
- - diff --git a/docs/wikidocs/Control Tags.html b/docs/wikidocs/Control Tags.html deleted file mode 100644 index 7e67ac564..000000000 --- a/docs/wikidocs/Control Tags.html +++ /dev/null @@ -1,40 +0,0 @@ - - - WebWork - - Control Tags - - - - - - - - - - -
-

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

- -
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- - -
    -
  1. if
  2. -
  3. elseIf / elseif
  4. -
  5. else
  6. -
  7. append
  8. -
  9. generator
  10. -
  11. iterator
  12. -
  13. merge
  14. -
  15. sort
  16. -
  17. subset
  18. -
- - -

@see src/META-INF/taglib.tld

- - - -
- - diff --git a/docs/wikidocs/Conversion Annotation.html b/docs/wikidocs/Conversion Annotation.html deleted file mode 100644 index 2061959a1..000000000 --- a/docs/wikidocs/Conversion Annotation.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork - - Conversion Annotation - - - - - - - - - - -
-

Conversion Annotation

- -

A marker annotation for type conversions at Type level.

- -

Usage

- -

The Conversion annotation must be applied at Type level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - -
ParameterRequiredDefaultDescription
conversionno used for Type Conversions applied at Type level.

- -

Examples

- -
-
@Conversion()
- public class ConversionAction implements Action {
- }
-
- - -
- - diff --git a/docs/wikidocs/Conversion Error Interceptor.html b/docs/wikidocs/Conversion Error Interceptor.html deleted file mode 100644 index d5b02cdc6..000000000 --- a/docs/wikidocs/Conversion Error Interceptor.html +++ /dev/null @@ -1,64 +0,0 @@ - - - WebWork - - Conversion Error Interceptor - - - - - - - - - - -
-

To fully document this interceptor, it is best to look at the JavaDocs for the subclass of the interceptor, ConversionErrorInterceptor:

- - -

This interceptor adds any error found in the ActionContext's conversionErrors map as a field error (provided - that the action implements ValidationAware). In addition, any field that contains a validation error has its - original value saved such that any subsequent requests for that value return the original value rather than the value - in the action. This is important because if the value "abc" is submitted and can't be converted to an int, we want to - display the original string ("abc") again rather than the int value (likely 0, which would make very little sense to - the user).

- - - -

... as well as the JavaDocs for the interceptor itself, WebWorkConversionErrorInterceptor:

- - -

This interceptor extends ConversionErrorInterceptor but only adds conversion errors from the ActionContext to - the field errors of the action if the field value is not null, "", or {""} (a size 1 String array with only an empty - String). See ConversionErrorInterceptor for more information, as well as the Type Conversion documentation.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points for this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="conversionError"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/ConversionErrorFieldValidator Annotation.html b/docs/wikidocs/ConversionErrorFieldValidator Annotation.html deleted file mode 100644 index d5b90e28c..000000000 --- a/docs/wikidocs/ConversionErrorFieldValidator Annotation.html +++ /dev/null @@ -1,75 +0,0 @@ - - - WebWork - - ConversionErrorFieldValidator Annotation - - - - - - - - - - -
-

ConversionErrorFieldValidator Annotation

- -

This validator checks if there are any conversion errors for a field and applies them if they exist. -See Type Conversion Error Handling for details.

- -

Usage

- -

The ConversionErrorFieldValidator annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -
-
@ConversionErrorFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true)
-
- - -
- - diff --git a/docs/wikidocs/Cookbook.html b/docs/wikidocs/Cookbook.html deleted file mode 100644 index 3583da958..000000000 --- a/docs/wikidocs/Cookbook.html +++ /dev/null @@ -1,73 +0,0 @@ - - - WebWork - - Cookbook - - - - - - - - - - -
-

-The cookbook currently contains a lot of information that may be out of date. These pages will be updated over time and this warning will eventually be removed when the WebWork team feels that the content is 100% correct.
-

 

- -

Webwork Cookbook

- -

Welcome to the Webwork Cookbook. This page is geared towards providing an exchange of information for developers. Your welcome to share knowledge and any helpful tips here. Don't forget to check out the Jira (http://jira.opensymphony.com/browse/WW), which contains several contributions for WW which may not be listed here.

- -

Setup

- -

Deployment notes
-App Servers
-Setting up Eclipse with Tomcat
-Using Maven to set up an Eclipse project for Webwork

- -

Interceptors

- -

Interceptor Order
-File Upload Interceptor
-Webwork file upload handling
-Transparent web\-app I18N

- -

Result examples

- -

Redirect After Post Technique
-JFreeChartResult
-GroovyResult
-RomeResult

- -

Validation

- -

How to validate field formats, such as a phone number

- -

Ajax

- - -

Varia

- -

Value Stack Internals
-Using WebWork Components
-OGNL
-Accessing application, session, request objects
-Application, Session, Request objects in jsp
-Application, Session, Request objects in vm
-How to format dates and numbers
-Iterator tag examples
-Tabular inputs with XWorkList
-Exposing webwork objects to JSTL, with a JSTL and DisplayTag Example
-Webwork 2 HTML form buttons Howto
-Using Checkboxes
-Using WebWork and XWork with JSP 2.0 and JSTL 1.1
-Describing a bean in velocity
-How do I populate a form bean and get the value using the taglib
-Webwork 2 skinning

- -
- - diff --git a/docs/wikidocs/Create Session Interceptor.html b/docs/wikidocs/Create Session Interceptor.html deleted file mode 100644 index 7989e6dfd..000000000 --- a/docs/wikidocs/Create Session Interceptor.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork - - Create Session Interceptor - - - - - - - - - - -
- -

This interceptor creates the HttpSession. -

-This is particular usefull when using the <@ww.tokten> tag in freemarker templates. -The tag do require that a HttpSession is already created since freemarker commits -the response to the client immediately.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

    -
  • none
  • -

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="create-session"/>
-    <interceptor-ref name="defaultStack"/>
-    <result name="input">input_with_token_tag.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Create a webapp project structure for your web application.html b/docs/wikidocs/Create a webapp project structure for your web application.html deleted file mode 100644 index fa1fa5ade..000000000 --- a/docs/wikidocs/Create a webapp project structure for your web application.html +++ /dev/null @@ -1,76 +0,0 @@ - - - WebWork - - Create a webapp project structure for your web application - - - - - - - - - - -
-
Starting with a blank web application
-

You can use the webapps/build.xml file to create a project structure to help you get started quickly.
-Just run 'ant new' and follow instructions.

-

 

-
-
new:
-     [echo]
-     [echo]             +=============================================================+
-     [echo]             |              -- Create a new web application  --            |
-     [echo]             +=============================================================+
-     [echo]
-
-    [input] Enter the name of your new application [myapp]? ww-sample
-     [echo] Creating 'ww-sample' web application...
-     [copy] Copying 7 files to /Users/rainerh/projects/webwork/webapps/ww-sample
-     [copy] Copying 1 file to /Users/rainerh/projects/webwork/webapps/ww-sample
-     [echo]
-     [echo]             +=============================================================+
-     [echo]             |    -- Your Web Application was created successfully! --     |
-     [echo]             |                                                             |
-     [echo]             | Now you should be able to cd to your application and run:   |
-     [echo]             | > ant build -Dwebapp=ww-sample                              |
-     [echo]             +=============================================================+
-
-BUILD SUCCESSFUL
-
-
-

 

- -

This task creates a new directory within the webapps dir.

- -

For example, this is the setup for a new webapp project created with 'ant new' webapp name 'ww-sample':

-
-
webapps/
-  ww-sample/
-    src/
-      java/
-         org/apache/struts/action2/example/HomeAction.java -- A simple action example implementation
-      webapp/
-        index.jsp -- redirects to home.action
-        WEB-INF/
-          classes/
-            webwork.properties -- Simple properties to use Spring and run webwork in devMode
-            xwork.xml -- Basic action mapping sample with 1 action mapping
-          pages/
-            home.jsp -- The home.jsp referenced via the HomeAction
-          applicationContext.xml -- blank Spring definition file. Add your Spring beans here.
-          web.xml -- basic web.xml for webwork
-
-
-

 

- -

You can now use the newly created project structure to get your webwork-based project
-running.

- -

You may want to look at the other sample webapp projects, to get some examples of advanced usages.
-Have a look at the showcase, starter, or shopping-cart applications.

- -
- - diff --git a/docs/wikidocs/CreateIfNull Annotation.html b/docs/wikidocs/CreateIfNull Annotation.html deleted file mode 100644 index b38f40f37..000000000 --- a/docs/wikidocs/CreateIfNull Annotation.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork - - CreateIfNull Annotation - - - - - - - - - - -
-

CreateIfNull Annotation

- -

Sets the CreateIfNull for type conversion.

- -

Usage

- -

The CreateIfNull annotation must be applied at field level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - -
ParameterRequiredDefaultDescription
valuenofalseThe CreateIfNull property value.

- -

Examples

- -
-
@CreateIfNull( value = true )
-private List<User> users;
-
- -
- - diff --git a/docs/wikidocs/CustomValidator Annotation.html b/docs/wikidocs/CustomValidator Annotation.html deleted file mode 100644 index 36849516a..000000000 --- a/docs/wikidocs/CustomValidator Annotation.html +++ /dev/null @@ -1,78 +0,0 @@ - - - WebWork - - CustomValidator Annotation - - - - - - - - - - -
-

CustomValidator Annotation

- -

This annotation can be used for custom validators. Use the ValidationParameter annotation to supply additional params.

- -

Usage

- -

The annotation must be applied at method or type level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -
-
@CustomValidator(type ="customValidatorName", fieldName = "myField")
-
- -

Adding Parameters

- -

Use the ValidationParameter annotation to add custom parameter values.

- - -
- - diff --git a/docs/wikidocs/DHTML and XmlHttpRequest References.html b/docs/wikidocs/DHTML and XmlHttpRequest References.html deleted file mode 100644 index 4685676b0..000000000 --- a/docs/wikidocs/DHTML and XmlHttpRequest References.html +++ /dev/null @@ -1,63 +0,0 @@ - - - WebWork - - DHTML and XmlHttpRequest References - - - - - - - - - - -
-

Javascript References

- - - -

Opensource libraries / frameworks

-
    -
  • Dojo Toolkit An ambitious project started by the authors of several previous JS libraries. It aims to provide core utilities for XmlHttpRequest handling, event handling, accessibility / usability with back and forward button handling, etc. in addition to a set of rich UI widgets.
  • -
  • DWR Direct Web Remoting - provides data binding and serialization between Java and Javascript
  • -
  • Javascript Templates - allows you to define a text template much like Velocity, but in Javascript, then pass it the data to generate some text (HTML). Trimpath also has some other very cool stuff, but it's all GPL, whereas the JS Templates has been dual-licensed as Apache 2.0 as well.
  • -
  • JSON-RPC Exposes Java objects for simple XmlHttpRequest remote invocation.
  • -
  • Jsolait An OO framework for Javascript
  • -
  • Tool-man examples - Great examples including drag-n-drop sorting and edit in place.
  • -
- - -

Examples / Sources

- - - - -

Tools and Utilities

- - - -

Web Sites / Articles

- - - -
- - diff --git a/docs/wikidocs/Data Tags.html b/docs/wikidocs/Data Tags.html deleted file mode 100644 index 5f82acfe2..000000000 --- a/docs/wikidocs/Data Tags.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork - - Tags - - - - - - - - - - -
-

Data tags provide various data-related functionality. This ranges from displaying the direct result of an action, to retrieving localized values.

- -
    -
  1. action
  2. -
  3. bean
  4. -
  5. debug
  6. -
  7. i18n
  8. -
  9. include
  10. -
  11. param
  12. -
  13. push
  14. -
  15. set
  16. -
  17. text
  18. -
  19. url
  20. -
  21. property
  22. -
- - - -
- - diff --git a/docs/wikidocs/DateRangeFieldValidator Annotation.html b/docs/wikidocs/DateRangeFieldValidator Annotation.html deleted file mode 100644 index 69c123fd6..000000000 --- a/docs/wikidocs/DateRangeFieldValidator Annotation.html +++ /dev/null @@ -1,88 +0,0 @@ - - - WebWork - - DateRangeFieldValidator Annotation - - - - - - - - - - -
-

DateRangeFieldValidator Annotation

- -

This validator checks that a date field has a value within a specified range.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
min no   Date property. The minimum the date must be.
max no   Date property. The maximum date can be.

- -

If neither min nor max is set, nothing will be done.

- -

Examples

- -
-
@DateRangeFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true, min = "2005/01/01", max = "2005/12/31")
-
- - -
- - diff --git a/docs/wikidocs/Default results.html b/docs/wikidocs/Default results.html deleted file mode 100644 index 2781a4e5e..000000000 --- a/docs/wikidocs/Default results.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork - - Default results - - - - - - - - - - -
-

Description

- -

Webwork has the ability to define a default result type for your actions. Thus, you don't have to specify the result-type for results using the default. If a package extends another package and you don'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.

- -
-
<!-- parts of xwork.xml  -->
-....
-
-<result-types>
- <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
- <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
- <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
-</result-types>
-
-....
-
-<action name="bar" class="myPackage.barAction">
-
-<!-- this result uses dispatcher, so you can omit the type="dispatcher" if you want -->
-  <result name="success">foo.jsp</result>
-
-<!-- this result uses velocity result, so the type needs to be specified -->
-  <result name="error" type="velocity">error.vm</result>
-
-</action>
-
-....
-
- -
- - diff --git a/docs/wikidocs/Dependencies.html b/docs/wikidocs/Dependencies.html deleted file mode 100644 index 37e587b03..000000000 --- a/docs/wikidocs/Dependencies.html +++ /dev/null @@ -1,168 +0,0 @@ - - - WebWork - - Dependencies - - - - - - - - - - -
-

General information on dependencies

- -

As with most modern and robust frameworks, WebWork has a number of external dependencies. However, in the case of WebWork, only a fraction of them are required. You can determine exactly what these dependencies are by looking in the docs/dependencies directory of the distribution, or by clicking here. The required dependencies are all the libraries listed in the default configuration.
IoC Container dependencies

-As of Webwork 2.2, Spring is the recommended IoC container. If you plan to use Spring you will need the jars of the spring configuration. Other IOC containers are supported as well, but we recommend Spring as it is the most active and vibrant community

- -

Below is a brief table of configurations and the functionality each will provide.

- -

Dependency configuration functionalities

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Configuration Required to...
ajax enable AJAX-related features in the UI tags
build build WebWork from source
default run the bare minimum support for WebWork
spring use Spring integration
fileupload support file uploads when the "jakarta" parser is selected in webwork.properties (recommended)
fileupload-cos support file uploads when the "cos" parser is selected in webwork.properties
fileupload-pell support file uploads when the "pell" parser is selected in webwork.properties
jasperreports generate reports using JasperReports
jfree generate reports using JFreeCharts
portlet support for WebWork-enabled porlets
quickstart start your applications using QuickStart
sitemesh use FreeMarker- and Velocity-enabled decorators with SiteMesh
velocity render results in Velocity
xslt render results using XSLT
- -

Dependency resolving in your Webwork based projects

- - -

Manual resolving

- -

As stated previously, a look at the dependency page will provide you with the information on which jars you will need to include in your Webwork-based project.

- -

Integrating Ivy to resolv dependencies

- -

The much easier way for dependency resolving is to integrate Ivy into your project. See Building WebWork for a introduction to Ivy and installation instructions. Here is a sample ivy.xml for a Webwork-based project, requiring the latest release of Webwork 2.2 with freemarker, sitemesh and jasperreports functionality:

-
-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<?xml-stylesheet type="text/xsl" xhref="http://www.jayasoft.fr/org/ivyrep/ivy-doc.xsl"?>
-<ivy-module version="1.0">
-    <info organisation="my.organisation.net" module="myproject"
-          revision="1.0-alpha-1"
-          status="integration"
-          publication="20051022053520">
-        <license name="Apache" url="http://www.apache.org/licenses/LICENSE-2.0.txt"/>
-        <ivyauthor name="Me" url="http://my.organisation.net/"/>
-        <description homepage="http://my.organisation.net/myproject">
-            My first Webwork2 based project.
-            <br/>
-        </description>
-    </info>
-    <configurations>
-        <conf name="build" visibility="private"/>
-        <conf name="default"/>
-    </configurations>
-    <publications>
-        <artifact name="myproject" type="jar" conf="default"/>
-    </publications>
-    <dependencies>
-        <!-- build only dependencies -->
-        <dependency org="junit" name="junit" rev="3.8.1" conf="build->*"/>
-        <dependency org="servletapi" name="servletapi" rev="2.4" conf="build->*"/>
-
-        <!-- runtime (and build) dependencies -->
-        <dependency org="log4j" name="log4j" rev="1.2.9" conf="default->default"/>
-        <dependency org="opensymphony" name="webwork" rev="2.2+" conf="default->default,freemarker,sitemesh,jasperreports"/>
-
-    </dependencies>
-</ivy-module>
-
-

 

- -

The following is a sample repository resolver configuration ivyconf.xml

-
-
<ivyconf>
-    <properties file="ivyconf.properties"/>
-    <conf defaultResolver="default" checkUpToDate="true"/>
-    <resolvers>
-        <ivyrep name="libraries"/>
-        <chain name="default">
-            <url name="opensymphony" checkmodified="true">
-                <ivy pattern="http://ivyrep.opensymphony.com/[organisation]/[module]/ivy-[revision].xml"/>
-                <artifact
-                        pattern="http://ivyrep.opensymphony.com/[organisation]/[module]/[artifact]-[revision].[type]"/>
-            </url>
-            <url name="contegix">
-                <ivy pattern="http://repository.contegix.com/ivyrep/[organisation]/[module]/ivy-[revision].xml"/>
-                <artifact
-                        pattern="http://repository.contegix.com/ivyrep/[organisation]/[module]/[artifact]-[revision].[type]"/>
-            </url>
-            <ivyrep name="ivyrep"/>
-            <ibiblio name="contegix-maven" root="http://repository.contegix.com/maven"/>
-            <url name="maven">
-                <artifact pattern="http://www.ibiblio.org/maven/[organisation]/jars/[module]-[revision].[type]"/>
-            </url>
-        </chain>
-    </resolvers>
-</ivyconf>
-
-

 

- -

After integrating an appropriate Ivy init task into your project build file, Ivy will resolve all dependencies required by your project and download the needed jars. See Ivy documentation for more information on how to integrate Ivy in your own project, or just have a quick look in the Webwork2 build process.

- -
- - diff --git a/docs/wikidocs/Describing a bean in velocity.html b/docs/wikidocs/Describing a bean in velocity.html deleted file mode 100644 index 4502cfdba..000000000 --- a/docs/wikidocs/Describing a bean in velocity.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork - - Describing a bean in velocity - - - - - - - - - - -
-

The follow snippet might be useful during debugging to list the properties inside an
-arbitary bean. Or for handing to a UI developer that use unaware of the getters/setters inside an object.

- -
-
## prints out the property names for a bean
-#macro (describeBean $name) 
-#set($bu = $webwork.bean("com.opensymphony.util.BeanUtils"))
-	#foreach($propName in $bu.getPropertyNames($name))
-		<li>$propName</li>
-	#end
-#end
-
- -

i.e. assuming $obj is a PersonObject that has properties(firstName, lastName, and zip).

-
-
#describeBean($obj)
-
-

would print
-<li>firstName</li>
-<li>lastName</li>
-<li>zip</li>

- -

One might also expand upon this to build a dynamic interface with via reflection. e.g.

-
-
$webwork.evalute("$obj.${propName}")
-
- - - - -
- - diff --git a/docs/wikidocs/Developing WW Ajax Widgets.html b/docs/wikidocs/Developing WW Ajax Widgets.html deleted file mode 100644 index 5c6a4630f..000000000 --- a/docs/wikidocs/Developing WW Ajax Widgets.html +++ /dev/null @@ -1,106 +0,0 @@ - - - WebWork - - Developing WW Ajax Widgets - - - - - - - - - - -
-

This page is intended for WW developer not for WW users. If your a user of WW hopefully you dont need to know these details, but certainly more knowledge is better, so if your hungry eat up!

- -

The WW ajax/dhtml components use the DOJO Toolkit for both javascript event handling and AJAX calls.

- -

To understand the widget framework this page is a must read:
-http://dojotoolkit.org/docs/fast_widget_authoring.html

- -

To understand the dojo event framework which is used extensively by the widget framework read this:
-http://dojotoolkit.org/docs/dojo_event_system.html

- -

OK Great so your smart on DOJO Widgets and DOJO Events lets see how WW uses these.

-

WW Tag Code

-

Lets start with looking at what a user of WW would include in their page, a JSP in this case:

-
SomeFile.jsp
-
<ww:a
-        id="link1"
-        theme="ajax"
-        href="/AjaxRemoteLink.action"
-        showErrorTransportText="true"
-        errorText="An Error ocurred">Update</ww:a>
-
-

This is just a standard WW component. All the attributes defined here must map to a component class thats defined in the taglib.tld. Were not going to go into how the WW componets work in this discussion, just be assured that nothing different happens here.

- -

WW Component Template Code

-

WW via the component system will read in the ajax/a.ftl file to determine how to generate the following html file. Again this is standard WW Component processing so well breeze over this.

- -

WW Generated Code

-

Now lets look at what this snippet of code would generate for us in html:

-
_Generated_SomeFile.html
-
<a dojoType="BindAnchor" evalResult="true" id="link1" href="/ajax/AjaxRemoteLink.action" errorHtml="An Error ocurred" showTransportError="true">Update</a>
-
-

Lets review this file. The dojoType type tells the dojo parser what to do with this tag. This is going to need to correspont to a call in our widge file like:
-dojo.widget.tags.addParseTreeHandler("dojo:BindAnchor");
-All the other attributes are basically passthrough from our component code to our widget code. No real magic happening w/ them.

- -

Dojo Widget File

-

Next up lets look at some snippets of the widget file:

-
BindAnchor.js
-
webwork.widgets.HTMLBindAnchor = function() {
-//lots removed for clarity
-	this.widgetType = "BindAnchor";
-	this.templatePath = dojo.uri.dojoUri("webwork/widgets/BindAnchor.html");
-
-	// the template anchor instance
-	this.anchor = null;
-//lots removed
-		self.anchor.href = "javascript:{}";
-
-		dojo.event.kwConnect({
-			srcObj: self.anchor,
-			srcFunc: "onclick",
-			adviceObj: self,
-			adviceFunc: "bind",
-			adviceType: 'before'
-		});
-		
-//snippet removed		
-    }
-
-}
-
-
-// make it a tag
-dojo.widget.tags.addParseTreeHandler("dojo:BindAnchor");
-
- -

There are three aspects in this code snippet that are worth review. The declaration of the templatePath. This defines to DOJO where the prototype for its component lives. DOJO is going to read this component to determine what event binding needs to happen (TODO: a better description here). Were going to look at this template file in a moment, this file is where the real magic happens. The second aspect of this file is the kwConnect call... this is the ajax call to the remote source. I removed the snippet that happens afterwards but its not important here. And the final aspect worth understanding now is the last line. This tells dojo that this widget is registered as the name BindAchor... recall the dojoType="BindAnchor" in the above HTML snippet.

- -

Dojo Template File

-

Now lets review the template file... BindAnchor.html... Understanding the template files were the big realization moment for me.

-
BindAnchor.html
-
<a dojoAttachPoint="anchor"></a>
-
-

This template simply tells dojo one thing. the dojoAttachPoint. This attribute dojoAttachPoint is the javascript variable in the widget file to attach thid DOM object to. If you review the above widget code you will see a variable declaration called this.anchor = null; Dojo will plug this DOM object into that variable so its availabe in the widget JS. COOL.

- -

OK... lets look at a more complex template file.

- -
BindButton.html
-
<input dojoAttachPoint="attachBtn" dojoAttachEvent="onClick: bind" type="submit" />
-
-

This is the code for the button template. Again its got the dojoAttachPoint attribute, but its also got dojoAttachEvent. This is based on the DOJO event system. the dojoAttachEvent property gives us a mapping between what the DOM Node's event name is (onClick) and what logical action to take as a result (bind). This is how the the dojo widget code itercepts the button click code and calls the bind function.

- -

Ok so now you can see how dojo intercepts calls to the real button click, and calls the bind funciton in your widget code. You could do most anything in this method. But in this case the bind function is defined in Bind.js which is the super JS inherited file to BindButton.js.

- - -

Hopefully this combined with the DOJO references is enough to get you up to speed.

- - -
- - diff --git a/docs/wikidocs/Dispatcher Result.html b/docs/wikidocs/Dispatcher Result.html deleted file mode 100644 index 6ac29d095..000000000 --- a/docs/wikidocs/Dispatcher Result.html +++ /dev/null @@ -1,62 +0,0 @@ - - - WebWork - - Dispatcher Result - - - - - - - - - - -
- -

Includes or forwards to a view (usually a jsp). Behind the scenes WebWork -will use a RequestDispatcher, where the target servlet/JSP receives the same -request/response objects as the original servlet/JSP. Therefore, you can pass -data between them using request.setAttribute() - the WebWork action is -available. -

-There are three possible ways the result can be executed:

- -

    - -

  • If we are in the scope of a JSP (a PageContext is available), PageContext's -{@link PageContext#include(String) include} method is called.
  • - -

  • If there is no PageContext and we're not in any sort of include (there is no -"javax.servlet.include.servlet_path" in the request attributes), then a call to -{@link RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse) forward} -is made.
  • - -

  • Otherwise, {@link RequestDispatcher#include(javax.servlet.ServletRequest, javax.servlet.ServletResponse) include} -is called.
  • - -

- -

Parameters

- - -

    - -

  • location (default) - the location to go to after execution (ex. jsp).
  • - -

  • parse - true by default. If set to false, the location param will not be parsed for Ognl expressions.
  • - -

- - -

Examples

- -
-
<result name="success" type="dispatcher">
-  <param name="location">foo.jsp</param>
-</result>
-
- -
- - diff --git a/docs/wikidocs/Documentation.html b/docs/wikidocs/Documentation.html deleted file mode 100644 index 91493ff31..000000000 --- a/docs/wikidocs/Documentation.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Documentation - - - - - - - - - - -
-

This page has moved here.

- -
- - diff --git a/docs/wikidocs/DoubleRangeFieldValidator Annotation.html b/docs/wikidocs/DoubleRangeFieldValidator Annotation.html deleted file mode 100644 index f666a05c8..000000000 --- a/docs/wikidocs/DoubleRangeFieldValidator Annotation.html +++ /dev/null @@ -1,102 +0,0 @@ - - - WebWork - - DoubleRangeFieldValidator Annotation - - - - - - - - - - -
-

DoubleRangeFieldValidator Annotation

- -

This validator checks that a double field has a value within a specified range. -If neither min nor max is set, nothing will be done.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
minInclusive no   Double property. The inclusive minimum the number must be.
maxInclusive no   Double property. The inclusive maximum number can be.
minExclusive no   Double property. The exclusive minimum the number must be.
maxExclusive no   Double property. The exclusive maximum number can be.

- -

If neither min nor max is set, nothing will be done.

- -

The values for min and max must be inserted as String values so that "0" can be handled as a possible value.

- -

Examples

- -
-
@DoubleRangeFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true, minInclusive = "0.123", maxInclusive = "99.987")
-
- -
- - diff --git a/docs/wikidocs/EclipseWork.html b/docs/wikidocs/EclipseWork.html deleted file mode 100644 index 39a08cc25..000000000 --- a/docs/wikidocs/EclipseWork.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - EclipseWork - - - - - - - - - - -
-

EclipseWork is a third-party project created by Ricardo Lecheta. It is an Eclipse plugin for WebWork. Future plans include abstracting the plugin and providing for a plugin base that can be used to build both the Eclipse plugin and a new IDEA Plugin. For more information, check out the EclipseWork home page.

- -
- - diff --git a/docs/wikidocs/Element Annotation.html b/docs/wikidocs/Element Annotation.html deleted file mode 100644 index 70a2f11ed..000000000 --- a/docs/wikidocs/Element Annotation.html +++ /dev/null @@ -1,58 +0,0 @@ - - - WebWork - - Element Annotation - - - - - - - - - - -
-

Element Annotation

- -

Sets the Element for type conversion.

- -

Usage

- -

The Element annotation must be applied at field level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - -
ParameterRequiredDefaultDescription
valuenojava.lang.Object.classThe element property value.

- -

Examples

- -
-
// The key property for User objects within the users collection is the <code>userName</code> attribute.
-@Element( value = com.acme.User )
-private Map<Long, User> userMap;
-
-@Element( value = com.acme.User )
-public List<User> userList;
-
- -
- - diff --git a/docs/wikidocs/EmailValidator Annotation.html b/docs/wikidocs/EmailValidator Annotation.html deleted file mode 100644 index cd43251f3..000000000 --- a/docs/wikidocs/EmailValidator Annotation.html +++ /dev/null @@ -1,74 +0,0 @@ - - - WebWork - - EmailValidator Annotation - - - - - - - - - - -
-

EmailValidator Annotation

- -

This validator checks that a field is a valid e-mail address if it contains a non-empty String.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -
-
@EmailValidator(message = "Default message", key = "i18n.key", shortCircuit = true)
-
- - -
- - diff --git a/docs/wikidocs/Examples.html b/docs/wikidocs/Examples.html deleted file mode 100644 index cc961e33c..000000000 --- a/docs/wikidocs/Examples.html +++ /dev/null @@ -1,31 +0,0 @@ - - - WebWork - - Examples - - - - - - - - - - -
- - - -
- - diff --git a/docs/wikidocs/Exception Handling.html b/docs/wikidocs/Exception Handling.html deleted file mode 100644 index 4df2927cb..000000000 --- a/docs/wikidocs/Exception Handling.html +++ /dev/null @@ -1,94 +0,0 @@ - - - WebWork - - Exception Handling - - - - - - - - - - -
-

Overview

- -

Exception mappings are a powerful feature for dealing with an Action that throws an exception. The core idea is that exception throwns during the Action method can be caught and mapped to a result, either global or action scoped results. This is especially useful for frameworks, like Hibernate and Acegisecurity, that throw RuntimeExceptions.

- -

As with many other parts of WebWork, an interceptor is needed to activate the exception mapping functionality. Below is a snippet from webwork-default.xml which has exception mapping already activated.

-
snippet of webwork-default.xml
-
...
-<interceptors>
-    ...
-    <interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
-    ...
-</interceptors>
-
-<!-- Basic stack -->
-<interceptor-stack name="basicStack">
-    <interceptor-ref name="exception"/>
-    <interceptor-ref name="servlet-config"/>
-    <interceptor-ref name="prepare"/>
-    <interceptor-ref name="static-params"/>
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="conversionError"/>
-</interceptor-stack>
-...
-
-

 

- -

The next step in exception mapping is to actually map exception to specific results. WebWork provides two ways to declare an exception mapping <exception-mapping/> - globally or for a specific action. The exception mapping element takes two attributes, exception and result.

- -

When declaring an exception mapping, the interceptor will find the closest class inheritance match between the exception thrown and the exception declared. The interceptor will examine all declared mappings applicable to the Action, both Action specific and global mappings. The result (either global or Action scope) is then used.

- -

This follows the same rules as a result returned from an Action. It first looks for the result in the action, and then if not found, it looks for the result as a global result.

- -

Below is an example of global and Action scoped exception mappings.

-
snippet from xwork.xml
-
<xwork>
-    <package name="default">
-        ...
-        <global-results>
-            <result name="login" type="redirect">/login.action</result>
-            <result name="rootException" type="freemarker">/WEB-INF/views/exception.ftl</result>
-        </global-results>
-
-        <global-exception-mappings>
-            <exception-mapping exception="java.sql.SQLException" result="sqlException"/>
-            <exception-mapping exception="java.lang.Exception" result="rootException"/>
-        </global-exception-mappings>
-        ...
-        <action name="myAction" class="...">
-            <interceptor-ref name="exception" />
-            <exception-mapping exception="com.acme.foo.SecurityException" result="login"/>
-            <result name="sqlException" type="chain">sqlExceptionAction</result>
-            <result name="success" type="freemarker">/WEB-INF/views/acme/success.ftl</result>
-        </action>
-        ...
-    </package>
-</xwork>
-
-

 

- -

In the example above, here is what happens based upon each exception:

-
    -
  • A java.sql.SQLException will chain to the sqlExceptionAction
  • -
  • A com.acme.foo.SecurityException will redirect to /login.action
  • -
  • Any other exception that extends java.lang.Exception will execute the FreeMarker result rootException for the page /WEB-INF/views/exception.ftl
  • -
- - -
Exception Values on the ValueStack
- -

By default, the ExceptionMappingInterceptor adds the following values to the Value Stack:

-
    -
  • exception - The exception object itself
  • -
  • exceptionStack - the value from the stack trace
  • -
- - -
- - diff --git a/docs/wikidocs/Exception Interceptor.html b/docs/wikidocs/Exception Interceptor.html deleted file mode 100644 index 26082186c..000000000 --- a/docs/wikidocs/Exception Interceptor.html +++ /dev/null @@ -1,74 +0,0 @@ - - - WebWork - - Exception Interceptor - - - - - - - - - - -
- -

This interceptor forms the core functionality of the exception handling feature. Exception handling allows you to map - an exception to a result code, just as if the action returned a result code instead of throwing an unexpected - exception. When an exception is encountered, it is wrapped with an ExceptionHolder and pushed on the stack, - providing easy access to the exception from within your result.

- -

Note: While you can configure exception mapping in your configuration file at any point, the configuration - will not have any effect if this interceptor is not in the interceptor stack for your actions. It is recommended that - you make this interceptor the first interceptor on the stack, ensuring that it has full access to catch any - exception, even those caused by other interceptors.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

If you want to add custom handling for publishing the Exception, you may override - {@link #publishException(com.opensymphony.xwork.ActionInvocation, ExceptionHolder)}. The default implementation - pushes the given ExceptionHolder on value stack. A custom implementation could add additional logging etc.

- - -

Examples

- -
-
<xwork>
-    <include file="webwork-default.xml"/>
-
-    <package name="default" extends="webwork-default">
-        <global-results>
-            <result name="success" type="freemarker">error.ftl</result>
-        </global-results>
-
-        <global-exception-mappings>
-            <exception-mapping exception="java.lang.Exception" result="error"/>
-        </global-exception-mappings>
-
-        <action name="test">
-            <interceptor-ref name="exception"/>
-            <interceptor-ref name="basicStack"/>
-            <exception-mapping exception="com.acme.CustomException" result="custom_error"/>
-            <result name="custom_error">custom_error.ftl</result>
-            <result name="success" type="freemarker">test.ftl</result>
-        </action>
-    </package>
-</xwork>
-
- -
- - diff --git a/docs/wikidocs/Execute and Wait Interceptor.html b/docs/wikidocs/Execute and Wait Interceptor.html deleted file mode 100644 index f608d110a..000000000 --- a/docs/wikidocs/Execute and Wait Interceptor.html +++ /dev/null @@ -1,134 +0,0 @@ - - - WebWork - - Execute and Wait Interceptor - - - - - - - - - - -
- -

The ExecuteAndWaitInterceptor is great for running long-lived actions in the background while showing the user a nice - progress meter. This also prevents the HTTP request from timing out when the action takes more than 5 or 10 minutes.

- -

Using this interceptor is pretty straight forward. Assuming that you are including webwork-default.xml, this - interceptor is already configured but is not part of any of the default stacks. Because of the nature of this - interceptor, it must be the last interceptor in the stack.

- -

This interceptor works on a per-session basis. That means that the same action name (myLongRunningAction, in the - above example) cannot be run more than once at a time in a given session. On the initial request or any subsequent - requests (before the action has completed), the wait result will be returned. The wait result is - responsible for issuing a subsequent request back to the action, giving the effect of a self-updating progress - meter.

- -

If no "wait" result is found, WebWork will automatically generate a wait result on the fly. This result is - written in FreeMarker and cannot run unless FreeMarker is installed. If you don't wish to deploy with FreeMarker, you - must provide your own wait result. This is generally a good thing to do anyway, as the default wait page is very - plain.

- -

Whenever the wait result is returned, the action that is currently running in the background will be placed on - top of the stack. This allows you to display progress data, such as a count, in the wait page. By making the wait - page automatically reload the request to the action (which will be short-circuited by the interceptor), you can give - the appearance of an automatic progress meter.

- -

This interceptor also supports using an initial wait delay. An initial delay is a time in milliseconds we let the - server wait before the wait page is shown to the user. During the wait this interceptor will wake every 100 millis - to check if the background process is done premature, thus if the job for some reason doesn't take to long the wait - page is not shown to the user. -
This is useful for e.g. search actions that have a wide span of execution time. Using a delay time of 2000 - millis we ensure the user is presented fast search results immediately and for the slow results a wait page is used.

- -

Important: Because the action will be running in a seperate thread, you can't use ActionContext because it - is a ThreadLocal. This means if you need to access, for example, session data, you need to implement SessionAware - rather than calling ActionContext.getSesion().

- -

The thread kicked off by this interceptor will be named in the form actionNameBrackgroundProcess. - For example, the search action would run as a thread named searchBackgroundProcess.

- - -

Parameters

- - -

    - -

  • threadPriority (optional) - the priority to assign the thread. Default is Thread.NORM_PRIORITY.
  • -
  • delay (optional) - an initial delay in millis to wait before the wait page is shown (returning wait as result code). Default is no initial delay.
  • -
  • delaySleepInterval (optional) - only used with delay. Used for waking up at certain intervals to check if the background process is already done. Default is 100 millis.
  • - -

- - -

Extending the Interceptor

- - -

If you wish to make special preparations before and/or after the invocation of the background thread, you can extend - the BackgroundProcess class and implement the beforeInvocation() and afterInvocation() methods. This may be useful - for obtaining and releasing resources that the background process will need to execute successfully. To use your - background process extension, extend ExecuteAndWaitInterceptor and implement the getNewBackgroundProcess() method.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-     <interceptor-ref name="completeStack"/>
-     <interceptor-ref name="execAndWait"/>
-     <result name="wait">longRunningAction-wait.jsp</result>
-     <result name="success">longRunningAction-success.jsp</result>
- </action>
-
- <%@ taglib prefix="ww" uri="/webwork" %>
- <html>
-   <head>
-     <title>Please wait</title>
-     <meta http-equiv="refresh" content="5;url=<ww:url includeParams="all" />"/>
-   </head>
-   <body>
-     Please wait while we process your request.
-     Click <a href="<ww:url includeParams="all" />"></a> if this page does not reload automatically.
-   </body>
- </html>
- </pre>
-
- <p/> <u>Example code2:</u>
- This example will wait 2 second (2000 millis) before the wait page is shown to the user. Therefore
- if the long process didn't last long anyway the user isn't shown a wait page.
-
- <pre>
- <action name="someAction" class="com.examples.SomeAction">
-     <interceptor-ref name="completeStack"/>
-     <interceptor-ref name="execAndWait">
-         <param name="delay">2000<param>
-     <interceptor-ref>
-     <result name="wait">longRunningAction-wait.jsp</result>
-     <result name="success">longRunningAction-success.jsp</result>
- </action>
- </pre>
-
- <p/> <u>Example code3:</u>
- This example will wait 1 second (1000 millis) before the wait page is shown to the user.
- And at every 50 millis this interceptor will check if the background process is done, if so
- it will return before the 1 second has elapsed, and the user isn't shown a wait page.
-
- <pre>
- <action name="someAction" class="com.examples.SomeAction">
-     <interceptor-ref name="completeStack"/>
-     <interceptor-ref name="execAndWait">
-         <param name="delay">1000<param>
-         <param name="delaySleepInterval">50<param>
-     <interceptor-ref>
-     <result name="wait">longRunningAction-wait.jsp</result>
-     <result name="success">longRunningAction-success.jsp</result>
- </action>
- </pre>
-
- -
- - diff --git a/docs/wikidocs/ExpressionValidator Annotation.html b/docs/wikidocs/ExpressionValidator Annotation.html deleted file mode 100644 index dd8abde84..000000000 --- a/docs/wikidocs/ExpressionValidator Annotation.html +++ /dev/null @@ -1,80 +0,0 @@ - - - WebWork - - ExpressionValidator Annotation - - - - - - - - - - -
-

ExpressionValidator Annotation

- -

This non-field level validator validates a supplied regular expression.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
expression yes   An OGNL expression that returns a boolean value.

- -

Examples

- -
-
@ExpressionValidator(message = "Default message", key = "i18n.key", shortCircuit = true, expression = "an OGNL expression" )
-
- - -
- - diff --git a/docs/wikidocs/Extending Themes.html b/docs/wikidocs/Extending Themes.html deleted file mode 100644 index 934df8e3f..000000000 --- a/docs/wikidocs/Extending Themes.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork - - Extending Themes - - - - - - - - - - -
-

Sometimes you may want to simply override a template (see Template Loading) or create an alternative template in an existing theme. However, other times you might want to create your own entire theme, especially if you are planning to build a rich set of unique and reusable templates for your organization.

- -

There are three ways to create new themes:

- -
    -
  • Create a new theme from scratch (hard!)
  • -
  • Extend an existing theme
  • -
  • Wrap an existing theme
  • -
- - -

We don't ever recommend creating a new theme from scratch. Rather, we believe that the simple theme provides enough of the basics for you to either extend or wrap, thereby creating your own unique theme. No matter which method your choose (often you end up using a bit of both methods, as they aren't mutually exclusive), we strongly you unpack the WebWork jar and look at the source templates for all the provided themes. This will give you a good understanding of how to make your own templates and themes.

- -

Wrapping an Existing Theme

- -

Taking a look at the xhtml theme, we can see that the templates there make extensive use of a wrapping technique. For example, a template might look like:

- -
-
<#include "/${parameters.templateDir}/xhtml/controlheader.ftl" />
-<#include "/${parameters.templateDir}/simple/xxx.ftl" />
-<#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />
-
- -

This template is simply wrapping the simple theme's existing template with a header and a footer. This is a great way to add additional behavior around the basic HTML elements provided by the simple theme.

- -

Extending an Existing Theme

- -

The theme infrastructure provided by WebWork also allows themes to extend an existing theme. What this means is that a theme may contain a theme.properties with a parent entry that contains the name of the theme that you would like to extend. For example, the ajax theme extends the xhtml theme in this way.

- -

By extending a theme, you are not required to implement every single template that the Tags use. Rather, you only need to implement templates that you wish to override. All other templates will be loaded from the parent template.

- -
- - diff --git a/docs/wikidocs/FAQ.html b/docs/wikidocs/FAQ.html deleted file mode 100644 index de6cd1f36..000000000 --- a/docs/wikidocs/FAQ.html +++ /dev/null @@ -1,92 +0,0 @@ - - - WebWork - - FAQ - - - - - - - - - - -
-

-Each question should be a new page. Typically answers should link to content in the reference documentation. If the answer isn't in the reference, then it should probably be added there and then linked to from the FAQ. Also note that some of the questions are current'y too verbose and should be broken down given that they have already been categorized (ie: Validation, Internationlization, etc).
-

General

- - - -

Tags

- - - -

Inversion of Control

- - - -

Validation

- - - -

Internationalization

- - - -

Type Conversion

- - - -

Portlet Support (JSR168)

- - - -
- - diff --git a/docs/wikidocs/FieldExpressionValidator Annotation.html b/docs/wikidocs/FieldExpressionValidator Annotation.html deleted file mode 100644 index e9281440a..000000000 --- a/docs/wikidocs/FieldExpressionValidator Annotation.html +++ /dev/null @@ -1,82 +0,0 @@ - - - WebWork - - FieldExpressionValidator Annotation - - - - - - - - - - -
-

FieldExpressionValidator Annotation

- -

This validator uses an OGNL expression to perform its validator. -The error message will be added to the field if the expression returns -false when it is evaluated against the value stack.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
expression yes   An OGNL expression that returns a boolean value.

- -

Examples

- -
-
@FieldExpressionValidator(message = "Default message", key = "i18n.key", shortCircuit = true, expression = "an OGNL expression")
-
- - -
- - diff --git a/docs/wikidocs/File Upload Interceptor.html b/docs/wikidocs/File Upload Interceptor.html deleted file mode 100644 index dd890b630..000000000 --- a/docs/wikidocs/File Upload Interceptor.html +++ /dev/null @@ -1,129 +0,0 @@ - - - WebWork - - Upload Interceptor - - - - - - - - - - -
- -

Interceptor that is based off of MultiPartRequestWrapper, which is automatically applied for any request that - includes a file. It adds the following parameters, where [File Name] is the name given to the file uploaded by the - HTML form:

- -

    - -

  • [File Name] : File - the actual File
  • - -

  • [File Name]ContentType : String - the content type of the file
  • - -

  • [File Name]FileName : String - the actual name of the file uploaded (not the HTML name)
  • - -

- -

You can get access to these files by merely providing setters in your action that correspond to any of the three - patterns above, such as setDocument(File document), setDocumentContentType(String contentType), etc. -
See the example code section.

- -

This interceptor will add several field errors, assuming that the action implements ValidationAware. - These error messages are based on several i18n values stored in webwork-messages.properties, a default i18n file - processed for all i18n requests. You can override the text of these messages by providing text for the following - keys:

- -

    - -

  • webwork.messages.error.uploading - a general error that occurs when the file could not be uploaded
  • - -

  • webwork.messages.error.file.too.large - occurs when the uploaded file is too large
  • - -

  • webwork.messages.error.content.type.not.allowed - occurs when the uploaded file does not match the expected - content types specified
  • - -

- - -

Parameters

- - -

    - -

  • maximumSize (optional) - the maximum size (in bytes) that the interceptor will allow a file reference to be set - on the action. Note, this is not related to the various properties found in webwork.properties. - Default to approximately 2MB.
  • - -

  • allowedTypes (optional) - a comma separated list of content types (ie: text/html) that the interceptor will allow - a file reference to be set on the action. If none is specified allow all types to be uploaded.
  • - -

- - -

Extending the Interceptor

- - -

You can extend this interceptor and override the #acceptFile method to provide more control over which files - are supported and which are not.

- - -

Examples

- -
-
<action name="doUpload" class="com.examples.UploadAction">
-    <interceptor-ref name="fileUpload"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-</pre>
-
-And then you need to set encoding <code>multipart/form-data</code> in the form where the user selects the file to upload.
-<pre>
-  <ww:form action="doUpload" method="post" enctype="multipart/form-data">
-      <ww:file name="upload" label="File"/>
-      <ww:submit/>
-  </ww:form>
-</pre>
-
-And then in your action code you'll have access to the File object if you provide setters according to the
-naming convention documented in the start.
-
-<pre>
-   public com.examples.UploadAction implemements Action {
-      private File file;
-      private String contentType;
-      private String filename;
-
-      public void setUpload(File file) {
-         this.file = file;
-      }
-
-      public void setUploadContentType(String contentType) {
-         this.contentType = contentType;
-      }
-
-      public void setUploadFileName(String filename) {
-         this.filename = filename;
-      }
-
-      ...
- }
-</pre>
-
- -

Setting parameters example:

-
-
<interceptor-ref name="fileUpload">
-  <param name="allowedTypes">
-     image/png,image/gif,image/jpeg
-  </param>
-</interceptor-ref>
-
- -
- - diff --git a/docs/wikidocs/Form Tags.html b/docs/wikidocs/Form Tags.html deleted file mode 100644 index 68f68e4b8..000000000 --- a/docs/wikidocs/Form Tags.html +++ /dev/null @@ -1,589 +0,0 @@ - - - WebWork - - Tags - - - - - - - - - - -
-

Description

- -

Within the form tags, there are two classes of tags: the form tag itself, and all other tags, which make up the individual form elements. This is important as the behavior of the form tag itself is different than that of the elements enclosed within it. Before we go provide a reference for all the form tags, including the form tag itself, we must outline some general characteristics first.
-

Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.

- -

Form Tag Themes

- -

As previously noted in Themes and Templates, the HTML Tags (which includes Form Tags) are all driven by templates. Templates are grouped together to form themes. By default, WebWork provides three themes:

-
    -
  • simple
  • -
  • xhtml, which extends simple (default)
  • -
  • ajax, which extends xhtml
  • -
- - -

Remember: the xhtml theme renders out a two-column table. If you need a different layout, we highly recommend that you do not write your own HTML, but rather create your own theme or utilize the simple theme.

- -

The downside of using the simple theme is that it doesn't support as many of the attributes that the other themes do. For example, the label attribute does nothing in the simple theme. Similarly, the functionality offered by the simple theme is much less than that of the xhtml and ajax themes: the automatic display of error messages is not supported.

- -

Common Attributes

- -

All the form tags extend the UIBean class. This base class generally common attributes, grouped in to three classes: templated-related, javascript-related, and general attributes. We won't document what these attributes do here as that is taken care of in each individual tag's reference. However, it is a good idea to familiarize yourself with the structure of the UI tags and what attributes are available for all tags.

- -

In addition to these attributes, a special attribute exists for all form element tags: form(ie: ${parameters.form}). This represents the parameters used to render the form tag and allows you to provide interaction between your form elements and the form itself. For example, in a template you could access the form's ID by calling ${parameters.form.id}.

- -

Template-Related Attributes

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeThemeData TypesDescription
templateDirn/aStringdefine the template directory
themen/aStringdefine the theme name
templaten/aStringdefine the template name

- - -

Javascript-Related Attributes

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeThemeData TypesDescription
onclicksimpleStringhtml javascript onclick attribute
ondbclicksimpleStringhtml javascript ondbclick attribute
onmousedownsimpleStringhtml javascript onmousedown attribute
onmouseupsimpleStringhtml javascript onmouseup attribute
onmouseoversimpleStringhtml javascript onmouseover attribute
onmouseoutsimpleStringhtml javascript onmouseout attribute
onfocussimpleStringhtml javascript onfocus attribute
onblursimpleStringhtml javascript onblur attribute
onkeypresssimpleStringhtml javascript onkeypress attribute
onkeyupsimpleStringhtml javascript onkeyup attribute
onkeydownsimpleStringhtml javascript onkeydown attribute
onselectsimpleStringhtml javascript onselect attribute
onchangesimpleStringhtml javascript onchange attribute

- - -

Tooltip Related Attributes

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeData TypeDefaultDescription
tooltipStringnoneSet the tooltip of this particular component
tooltipIconString/webwork/static/tooltip/tooltip.gifThe url to the tooltip icon
tooltipAboveMousePointerBooleanfalsePlaces the tooltip above the mousepointer. Additionally applied the tooltipOffseY allows to set the vertical distance from the mousepointer.
tooltipBgColorString#e6ecffBackground color of the tooltip.
tooltipBgImgStringnoneBackground image.
tooltipBorderWidthString1Width of tooltip border.
tooltipBorderColorString#003399Background color of the tooltip
tooltipDelayString500Tooltip shows up after the specified timeout (miliseconds). A behavior similar to that of OS based tooltips.
tooltipFixCoordinateXStringnot specifiedFixes the tooltip to the X co-ordinates specified. Useful for example if combined with tooltipSticky attribute.
tooltipFixCoordinateYStringnot specifiedFixes the tooltip to the Y co-ordinates specified. Useful for example if combined with tooltipSticky attribute.
tooltipFontColorString#000066Font color.
tooltipFontFaceStringarial,helvetica,sans-serifFont face/family eg. verdana,geneva,sans-serif
tooltipFontSizeString11pxFont size + unit eg. 30px
tooltipFontWeightStringnormalFont weight. either normal or bold
tooltipLeftOfMousePointerBooleanfalseTooltip positioned on the left side of the mousepointer
tooltipOffsetXString12Horizontal offset from mouse-pointer.
tooltipOffsetYString15Vertical offset from mouse-pointer.
tooltipOpacityString100Transparency of tooltip. Opacity is the opposite of transparency. Value must be a number between 0 (fully transparent) and 100 (opaque, no transparency). Not (yet) supported by Opera.
tooltipPaddingString3Inner spacing, ie. the spacing between border and content, for instance text or image(s)
tooltipShadowColorString#ccccccCreates shadow with the specified color.
tooltipShadowWidthString5Creates shodow with the specified width (offset).
tooltipStaticBooleanfalseLike OS-based tooltips, the tooltip doesn't follow the movements of the mouse pointer.
tooltipStickyBooleanfalseThe tooltip stays fixed on its inital position until anohter tooltip is activated, or the user clicks on the document.
tooltipStayAppearTimeString0Specifies a time span in miliseconds after which the tooltip disappears, even if the mousepointer is still on the concerned HTML element, with value <=0 it acts as if no time span is defined
tooltipTextAlignStringleftAligns the text of both the title and the body of the tooltip. Either right, left or justify
tooltipTitleStringnonetitle
tooltipTitleColorString#ffffffColor of the title text
tooltipWidthString300Width of tooltip

- - -

General Attributes

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeThemeData TypesDescription
cssClasssimpleStringdefine html class attribute
cssStylesimpleStringdefine html style attribute
titlesimpleStringdefine html title attribute
disabledsimpleStringdefine html disabled attribute
labelxhtmlStringdefine label of form element
labelPositionxhtmlStringdefine label position of form element (top/left), default to left
requiredpositionxhtmlStringdefine required label position of form element (left/right), default to right
namesimpleStringForm Element's field name mapping
requiredxhtmlBooleanadd * to label (true to add false otherwise)
tabIndexsimpleStringdefine html tabindex attribute
valuesimpleObjectdefine value of form element

- - -

When Some Attributes Don't Apply

- -

Note that some tags don't don't have any templates that utilize certain attributes, either because it doesn't make sense or it isn't required. For example, the form tag, while it supports the tabindex attribute, none of the themes render it out. Also, as mentioned, certain themes won't utilize some attributes.

- -

Value/Name Relationship

- -

In many of the tags, except for the form tag, there is a unique relationship between the name and value attributes. The nameattribute is what the form element gets named and eventually submitted as. This effectively is the expression to which you wish to bind the incoming value to. In most cases, it is a simple JavaBean property, such as "firstName". This would eventually call setFirstName().

- -

Similarly, you often wish to also display in your form elements existing data from the same JavaBean property. This time, the attributevalue is used. A value of "%{firstName}" would call getFirstName() and display it in your form, allowing users to edit the value and re-submit it.

- -

You could use the following code, and it would work just fine:

-
-
<@ww.form action="updatePerson">
-    <@ww.textfield label="First name" name="firstName" value="%{firstName}"/>
-    ...
-</@ww.form>
-
-

However, because the relationship between name and value is so often predictable, we automatically do this for you, allowing you to do:

-
-
<@ww.form action="updatePerson">
-    <@ww.textfield label="First name" name="firstName"/>
-    ...
-</@ww.form>
-
-

While most attributes are exposed to the underlying templates as the same key as the attribute (ie: ${parameters.label}), the valueattribute is not. Instead, it can be accessed via the "nameValue" key (ie: ${parameters.nameValue}) to indicate that it may have been generated from the name attribute rather than explicitly defined in the value attribute.

- -

ID Name Assignment

- -

All form tags automatically assign an ID for you. You are free to override this ID if you wish. The ID assignment works as follows:

-
    -
  1. For forms, the ID is the assumed to the action name. In the previous example, the ID would be "updatePerson".
  2. -
  3. For form elements, the ID is assumed to be [form's ID]_[element name]
  4. -
- - -

Required Attribute

- -

The "required" attribute on many WebWork UI tags defaults to true only if you have client side validation enabled and there is a validator associated with that particular field.

- -

Tooltip

- - -

Every Form UI component (in xhtml / css_xhtml or any others that extends of them) could - have tooltip assigned to a them. The Form component's tooltip related attribute once - defined will be applicable to all form UI component that is created under it unless - explicitly overriden by having the Form UI component itself defined that tooltip attribute.

- -

- -

In Example 1, the textfield will inherit the tooltipAboveMousePointer attribte from - its containing form. In other words, although it doesn't defined a tooltipAboveMousePointer - attribute, it will have that attribute defined as true inherited from its containing form.

- -

- -

In Example 2, the the textfield will inherite both the tooltipAboveMousePointer and - tooltipLeftOfMousePointer attribute from its containing form but tooltipLeftOfMousePointer - attribute is overriden at the textfield itself. Hence, the textfield actually will - have tooltipAboveMousePointer defined as true, inherited from its containing form and - tooltipLeftOfMousePointer defined as false, due to overriden at the textfield itself.

- -

- -

Example 3, 4 and 5 shows different way of setting the tooltipConfig attribute.
- Example 3:Set tooltip config through body of param tag
- Example 4:Set tooltip config through value attribute of param tag
- Example 5:Set tooltip config through tooltipConfig attribute of component tag

- -
-
<!-- Example 1: -->
- <ww:form
- 			tooltipConfig="#{'tooltipAboveMousePointer':'true',
-                           'tooltipBgColor='#eeeeee'}" .... >
-   ....
-     <ww:textfield label="Customer Name" tooltip="Enter the customer name" .... />
-   ....
- </ww:form>
-
- <!-- Example 2: -->
- <ww:form
-         tooltipConfig="#{'tooltipAboveMousePointer':'true',
-          				 'tooltipLeftOfMousePointer':'true'}" ... >
-   ....
-     <ww:textfield label="Address"
-          tooltip="Enter your address"
-          tooltipConfig="#{'tooltipLeftOfMousePointer':'false'}" />
-   ....
- </ww:form>
-
-
- <-- Example 3: -->
- <ww:textfield
-        label="Customer Name"
-	      tooltip="One of our customer Details'">
-        <ww:param name="tooltipConfig">
-             tooltipWidth = 150 |
-             tooltipAboveMousePointer = false |
-             tooltipLeftOfMousePointer = false
-        </ww:param>
- </ww:textfield>
-
-
- <-- Example 4: -->
- <ww:textfield
-	        label="Customer Address"
-	        tooltip="Enter The Customer Address" >
-	        <ww:param
-              name="tooltipConfig"
-              value="#{'tooltipStatic':'true',
-                       'tooltipSticky':'true',
-                       'tooltipAboveMousePointer':'false',
-                       'tooltipLeftOfMousePointer':'false'}"  />
- </ww:textfield>
-
-
- <-- Example 5: -->
- <ww:textfield
-          label="Customer Telephone Number"
-          tooltip="Enter customer Telephone Number"
-          tooltipConfig="#{'tooltipBgColor':'#cccccc',
-                           'tooltipFontColor':'#eeeeee',
-                           'tooltipAboveMousePointer':'false',
-                           'tooltipLeftOfMousePointer':'false'}" /<
-
- -

Form Tag Reference

-

-It'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. This means that if you instantiate a bean with the bean tag (<ww:bean name="'br.univap.fcc.sgpw.util.FormattersHelper'">) that bean will be avaliable on the valuestack only until the </ww:bean> tag.
-
    -
  1. checkbox - renders a checkbox input field
  2. -
  3. checkboxlist - renders a list of checkboxes
  4. -
  5. combobox - renders a widget that fills a text box from a select
  6. -
  7. datepicker - renders a date selection widget using JavaScript and DOM
  8. -
  9. doubleselect - renders a double select widget, where the second drop down depends on the first
  10. -
  11. head - renders the HEAD section for specific themes, such as CSS and JavaScript imports
  12. -
  13. file - renders a file input field
  14. -
  15. form - renders an input form
  16. -
  17. hidden - renders a hidden form field
  18. -
  19. label - renders renders a label
  20. -
  21. optiontransferselect- renders an option transfer select component which is basically two select box with buttons in between allowing entries of each select to get transfer between each other.
  22. -
  23. password - renders a password textfield
  24. -
  25. radio - renders a radio button
  26. -
  27. reset - renders a reset form button
  28. -
  29. richtexteditor - renders a rich text editor
  30. -
  31. select - renders a select
  32. -
  33. submit - renders a submit button
  34. -
  35. textarea - renders a textarea
  36. -
  37. textfield - renders a textfield
  38. -
  39. token - renders a hidden field to stop double-submission of containing forms
  40. -
  41. updownselect - renders a select component with buttons to move the elements in the select component up and down
  42. -
- - -
- - diff --git a/docs/wikidocs/FreeMarker Result.html b/docs/wikidocs/FreeMarker Result.html deleted file mode 100644 index 04f426e99..000000000 --- a/docs/wikidocs/FreeMarker Result.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork - - FreeMarker Result - - - - - - - - - - -
- -

Renders a view using the Freemarker template engine. Alternatively, the - {@link com.opensymphony.webwork.dispatcher.ServletDispatcherResult - dispatcher} result type can be used in conjunction Webwork's {@link - FreemarkerServlet}. -

- The FreemarkarManager class configures the template loaders so that the - template location can be either -

- -

    - -

  • relative to the web root folder. eg /WEB-INF/views/home.ftl -
  • - -

  • a classpath resuorce. eg com/company/web/views/home.ftl
  • - -

- - -

Also see WebWork Freemarker Support.

- -

Parameters

- - -

    - -

  • location (default) - the location of the template to process.
  • - -

  • parse - true by default. If set to false, the location param will - not be parsed for Ognl expressions.
  • - -

  • contentType - defaults to "text/html" unless specified.
  • - -

- - -

Examples

- -
-
<result name="success" type="freemarker">foo.ftl</result>
-
- -
- - diff --git a/docs/wikidocs/FreeMarker Tags.html b/docs/wikidocs/FreeMarker Tags.html deleted file mode 100644 index 08ec4d134..000000000 --- a/docs/wikidocs/FreeMarker Tags.html +++ /dev/null @@ -1,105 +0,0 @@ - - - WebWork - - FreeMarker Tags - - - - - - - - - - -
-

FreeMarker tags are extensions of the generic Tags provided by WebWork. You can get started almost immediately by simply knowing the generic structure in which the tags can be accessed: <@ww.xxx> ...</@ww.xxx>, where xxx is any of the tags supported by WebWork.

- -

Syntax

- -

For example, in JSP you might create a form like so:

- -
-
<ww:form action="updatePerson">
-    <ww:textfield label="First name" name="firstName"/>
-    <ww:submit value="Update"/>
-</ww:form>
-
- -

In FreeMarker the same form is built like so:

- -
-
<@ww.form action="updatePerson">
-    <@ww.textfield label="First name" name="firstName"/>
-    <@ww.submit value="Update"/>    
-</@ww.form>
-
- -

While this covers almost all know need to know for for FreeMarker tags, there are a few other advanced features you should read about, specifically with how attributes and parameters work together, and how attribute types (String, List, etc) can affect the tag behavior.

- -

Attributes and Parameters

- -

Unlike older versions of JSP (in which the JSP Tags are based), FreeMarker allows for dynamic attributes, much like JSP 2.0. What this means is that you can supply attributes to the tags that the tag doesn't even support. Those attributes that cannot be applied directly to the tag object will instead be set on the tag's general parameters map.

- -

For example, suppose you have the following code in JSP:

- -
-
<ww:url value="somePage">
-    <ww:param name="personId" value="%{personId}"/>
-</ww:url>
-
- -

In FreeMarker, you can simplify this as:

- -
-
<@ww.url value="somePage" personId="${personId}"/>
-
- -

In addition to being able to replace cases where you might use the param tag, you can also use this functionality when building additional templates or themes for your Form Tags. For example, suppose you created a "three column" theme to replace the typical two column theme (xhtml). You might want an additional parameter to display in the third column called "description". Your form can be:

- -
-
<@ww.form action="updatePerson">
-    <@ww.textfield label="First name" name="firstName" description="..."/>
-    <@ww.submit value="Update"/>    
-</@ww.form>
-
- -

And then in your new template you can refer to the description using ${parameters.description}.

- -
Sometimes you may still wish to use the param tag, such as when you are nesting complex HTML within tags. The param tag has support beyond what FreeMarker can provide as inline attributes: it can take the entire body of the param tag and apply that as the value attribute.
- -

Attribute Types

- -

Remember that all tag attributes must first be set as Strings – they are then later evaluated (using OGNL) to a different type, such as List, int, or boolean. This generally works just fine, but it can be limiting when using FreeMarker which provides more advanced ways to apply attributes. Suppose the following example:

- -
-
<@ww.select label="Foo label - ${foo}" name="${name}" list="%{{1, 2, 3}}"/>
-
- -

What will happen here is that each attribute will be evaluated to a string as best it can. This may involve calling the toString() method on the internal FreeMarker objects in the hash. In this case, all objects will end up being exactly what you would expect. Then, when the tag runs, the list attribute will be converted from a String to a List using OGNL's advanced collection support.

- -

But suppose you wish to use FreeMarker's list or hash support instead? You can do this:

- -
-
<@ww.select label="Foo label - ${foo}" name="${name}" list={1, 2, 3}/>
-
- -

Notice that the list attribute no longer has quotes around it. Now it will come in to the tag as an object that can't easily be converted to a String. Normally, the tag would just call toString(), which would return "[1, 2, 3]" and be unable to be converted back to a List by OGNL. Rather than go through all this back and forth anyway, the FreeMarker tag support within WebWork will recognize collections and not pass them through the normal tag attribute, but instead set them directly in the parameters map, ready to be consumed by the template.

- -

In the end, everything tends to do what you would expect, but it can help to understand the difference of when OGNL is being used and when it isn't, and how attribute types get converted.

- -

JSP Tag Support

- -

While WebWork provides native FreeMarker Tags, you might wish to use other third-party tags that are only available for JSP. Fortunately, FreeMarker has the ability to run JSP tags. To do so, you must include the JspSupportServlet outlined in web.xml 2.1.x compatibility, as this allows the FreeMarker integration to get access to the required objects needed to emulate a JSP taglib container.

- -

Once you've done that, you can simply add something like this in your templates:

- -
-
<#assign cewolf=JspTaglibs["/WEB-INF/cewolf.tld"] />
-...
-<@cewold.xxx ... />
-
- -
- - diff --git a/docs/wikidocs/FreeMarker.html b/docs/wikidocs/FreeMarker.html deleted file mode 100644 index 7a70894f8..000000000 --- a/docs/wikidocs/FreeMarker.html +++ /dev/null @@ -1,180 +0,0 @@ - - - WebWork - - FreeMarker - - - - - - - - - - -
-

FreeMarker is a template Java template language that is a great alternative to JSP. FreeMarker is ideal for situations where your action results can possibly be loaded from outside a Servlet container. For example, if you wished to support plugins in your application, you might wish to use FreeMarker so that the plugins could provide the entire action class and view in a single jar that is loaded from the classloader.

- -

For more information on FreeMarker itself, please visit the FreeMarker website.

-FreeMarker is very similar to Velocity, as both are template languages that can be used outside of a Servlet container. The WebWork team recommends FreeMarker over Velocity simply because FreeMarker has better error reporting, support for JSP tags, and slightly better features. However, both are good alternatives to JSP.

- -

Getting Started

- -

Getting started with FreeMarker is as simple as ensuring all the dependencies are included in your project's classpath. This typically requires simply freemarker.jar. Other than that, webwork\-default.xml already configures the FreeMarker Result needed to map your actions to your templates. You may now try out the following xwork.xml configuration:

-
-
<action name="test" class="com.acme.TestAction">
-    <result name="success" type="freemarker">test-success.ftl</result>
-</action>
-
-

 

- -

Then in test-success.ftl:

-
-
<html>
-<head>
-    <title>Hello</title>
-</head>
-<body>
-
-Hello, ${name}
-
-</body>
-</html>
-
-

 

- -

Where name is a property on your action. That's it! Read the rest of this document for details on how templates are loaded, variables are resolved, and tags can be used.

- -

Template Loading

- -

WebWork looks for FreeMarker templates in two locations (in this order):

-
    -
  1. Web application
  2. -
  3. Class path
  4. -
- - -

This ordering makes it ideal for providing templates inside a fully built jar, but allowing for overrides of those templates to be defined in your web application. In fact, this is how you can override the default UI tags and Form Tags included with WebWork.

- -

In addition, you can specify a location (directory on your file system) thru templatePath context variable (in your web.xml). If variable is specified, the content of the directory it points to will be searched first.

- - -

Variable Resolution

- -

In FreeMarker, variables are looked up in several different places, in this order:

-
    -
  1. The value stack
  2. -
  3. The action context
  4. -
  5. Request scope
  6. -
  7. Session scope
  8. -
  9. Application scope
  10. -
  11. Built-in variables
  12. -
- - -

Note that the action context is looked up after the value stack. This means that you can reference the variable without the typical preceding has marker (#) like you would have to when using the JSP ww:property tag. This is a nice convenience, though be careful because there is a small chance it could trip you up.

-
-
<@ww.url id="url" value="http://www.yahoo.com"/>
-Click <a xhref="${url}">here</a>!
-
-

 

- -

The built-in variables that WebWork-FreeMarker integration provides are:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name Description
stack The value stack itself, useful for calls like ${stack.findString('ognl expr')}
action The action most recently executed
response The HttpServletResponse
res Same as response
request The HttpServletRequest
req Same as request
session The HttpSession
application The ServletContext
base The request's context path
- -

Tag Support

- -

FreeMarker is a great template language because it has complete tag support. See the FreeMarker Tags documentation for information on how to use the generic Tags provided by WebWork. In addition to this, you can use any JSP tag, like so:

-
-
<#assign mytag=JspTaglibs["/WEB-INF/mytag.tld"]>
-<@mytag.tagx attribute1="some ${value}"/>
-
-

 

- -

Where mytag.tld is the JSP Tag Library Definition file for your tag library. Note: in order to use this support in FreeMarker, you must enable the JSPSupportServlet documented in web.xml 2.1.x compatibility.

- -

Tips and Tricks

- -

There are some advanced features that may be useful when building WebWork applications with FreeMarker.

- -

Type Conversion and Locales

- -

FreeMarker has built in support for formatting dates and numbers. The formatting rules are based on the locale associated with the action request, which is by default set in webwork.properties but can be over-ridden using the I18n Interceptor. This is normally perfect for your needs, but it is important to remember that these formatting rules are handled by FreeMarker and not by WebWork's Type Conversion support.

- -

If you want WebWork to handle the formatting according to the Type Conversion you have specified, you shouldn't use the normal ${...} syntax. Instead, you should use the property tag. The difference is that the property tag is specifically designed to take an OGNL expression, evaluate it, and then convert it to a String using any Type Conversionrules you have specified. The normal ${...} syntax will use a FreeMarker expression language, evaluate it, and then convert it to a String using the built in formatting rules. This difference is subtle but important to understand.

- -

Extending

- -

Sometimes you may with to extend the FreeMarker support provided with WebWork. The most common reason for doing this is that you wish to include your own Tags, such as those that you have extended from the built in WebWork Tags.

- -

To do so, write a new class that extends com.opensymphony.webwork.views.freemarker.FreemarkerManager and overrides it as needed. Then add the following to webwork.properties:

-
-
webwork.freemarker.manager.classname = com.yourcompany.YourFreeMarkerManager
-
-

 

- -

ObjectWrapper Settings

- -

Once you get familiar with FreeMarker, you will find certain subtletieswith it that may become frustrating. The most common thing you'll likely run in to is the BeansWrapper provided by FreeMarker. If you don't know what this is, don't worry. However, if you do, know this:

- -

The WebWorkBeanWrapper extends the default FreeMarker BeansWrapper and provides almost no change in functionality, - except for how it handles maps. Normally, FreeMarker has two modes of operation: either support for friendly - map built-ins (?keys, ?values, etc) but only support for String keys; OR no special built-in support (ie: ?keys - returns the methods on the map instead of the keys) but support for String and non-String keys alike. WebWork - provides an alternative implementation that gives us the best of both worlds.

- -

It is possible that this special behavior may be confusing or can cause problems. Therefore, you can set the - webwork.freemarker.wrapper.altMap property in webwork.properties to false, allowing the normal BeansWrapper - logic to take place instead.

- -

 

- -

Syntax Notes

- -

As of FreeMarker 2.3.4, an alternative syntax is supported. This alternative syntax is great if you find that your IDE (especially IntelliJ IDEA) makes it difficult to work with the default syntax. You can read more about this syntax here.

- -
- - diff --git a/docs/wikidocs/Getting Started.html b/docs/wikidocs/Getting Started.html deleted file mode 100644 index df125af62..000000000 --- a/docs/wikidocs/Getting Started.html +++ /dev/null @@ -1,343 +0,0 @@ - - - WebWork - - Getting Started - - - - - - - - - - -
-

Preface

- -

WebWork is a popular, easy-to-use MVC framework.  For more information on the WebWork project, please visit the WebWork Project Home.
-This document will help you to get started with WebWork, enabling you to run the examples and demonstrations provided even if you are not an experienced Java web application developer. Nevertheless, WebWork is geared towards developers that have an understanding towards certain technologies. Before diving deeper into how Webwork works, it is recommended that you review the concepts below:

-
    -
  • Java
  • -
  • Servlets, JSP, and Tag Libraries
  • -
  • JavaBeans
  • -
  • HTML and HTTP
  • -
  • Web Containers (ex. Tomcat)
  • -
  • XML
  • -
- - -

Distribution Download and Information Resources

- - -

Download Webwork Distribution

- -

You can download the full WebWork distribution here. It contains the webwork.jar file as well as full documentation, sources, all required and optional dependent libraries,and examples. For more information on how to build WebWork from source or even from a clean CVS checkout, please refer to Building Webwork.

- -

Online Information and Project Resources

- -

There are many online sources of information, support and project resources around. Here are links to help you find your way:

- - - -

Distribution Quickstart

- - -

Overview

- -

The distribution contains the following directory layout:

-
-
dist/
-docs/
-lib/
-src/
-src/java/template/
-webapps/
-README.txt
-build.properties
-build.xml
-ivy.xml
-osbuild.xml
-pom.xml
-webwork-(VERSION).jar
-webwork-(VERSION).zip
-webwork-(VERSION)-src.jar
-
-
-

 

- -

The docs directory contains the current Javadocs, the full user documentation including the document you are reading, and taglib documentation, as well as Clover, JUnit and dependency reports for the build.

- -

The dist directory contains WebWork files with different packaging:

-
    -
  • webwork-nostatic-<version>.jar: containing only WebWork without the static content
  • -
  • webwork-static-<version>.zip: containing the required WebWork static dependencies
  • -
- - -

The lib directory contains the required as well as optional Dependencies for Webwork, organized in subdirectories to represent different optional configurations:

-
-
lib/
-      ajax
-      bootstrap
-      build
-      cewolf
-      default
-      fileupload
-      fileupload-cos
-      fileupload-pell
-      hibernate
-      jasperreports
-      jfree
-      pico
-      plexus
-      portlet
-      quickstart
-      sitemesh
-      source
-      spring
-      tiger
-      tiles
-      velocity
-      xslt
-
-
-

 

- -

Note that none of the optional packages are required to use Webwork. If you wish to use certain features such as JasperReports or Java 5 (Tiger) generics and annotation support, you must include the optional packages.

- -

Webwork also comes packaged with all the source files and templates for the JSP tags.

- -

Running demos with QuickStart

- -

WebWork provides a quick way to get started called QuickStart. QuickStart is essentially a combination of a few technologies, including the possibility to run web applications such as the provided examples out of the box with a stripped Jetty container.

- -

With that, running the demos is as easy as can be. You just need to call:

-
-
java -jar webwork.jar quickstart:<application-name>
-
-

 

- -

from the distribution's top directory, whereby <application-name> is to be replaced by one of the subdirectory names under webapps/, representing the various supplied demo applications. So if you want to start the shopping cart example, just type on your command line:

-
-
java -jar webwork.jar quickstart:shopping-cart
-
-

 

- -

After starting an example in that way, you will simply need to point your browser to http://localhost:8080/shopping-cart to view the results.

- -

The packaged examples are:

- - - - - - - - - - - - - - - - - - - - - -
blank Not really an example, but a blank web application template for creating your own application
portlet Demonstration of WebWork porlet integration (to be deployed in a Portal Server) - see Portlet Tutorial to read more about that
shopping-cart Nice example application demonstrating various aspects of WebWork
showcase Demonstration of all tag and AJAX features, along with other examples and some best practices
starter Basic web application, meant as an easy starting point for experimenting with WebWork's features - one could call it "playground"
-

Read Quickstart documentation to learn more about how it works and how you can utilize it for your own applications.

- -

See below for a more detailed description of how the blank application helps you to easily create your own WebWork-based applications.

- -

Running Demos with Your Favorite Webcontainer

-
To Quickstart or not to Quickstart?

-The previous section described the Quickstart mechanism for trying the supplied example webapps, but Quickstart is also a handy tool for development of your own WebWork based applications. We recommend you using the said mechanism unless you are familiar with standalone servlet containers and have good reasons to switch, such as preparing a production system etc.
-

 

- -

In order to deploy WebWork applications and demos to your favorite servlet container (also called web container) such as Apache Tomcat or Caucho Resin, you will need to build war files from within the webapps directory. You will find an ant build file there which will provide you with an easy way to accomplish that.

- -

To build a webapp war archive, simply run:

-
-
ant build -Dwebapp=XXX
-
-

 

- -

where XXX is the name of the webapp you want to build. After the build is finished, the fully-built war file can be found in the dist directory. You may deploy this file to any servlet container.

- -

For example:
-ant build -Dwebapp=showcase
-To deploy the built showcase.war to Tomcat, just place it into <TOMCAT_HOME>/webapps/ or use the Tomcat Manager Application to upload and deploy the war. After the war is deployed (and your server is started), point your browser to
-http://SERVER:PORT/APPLICATIONNAME, according to your setup and the application you deployed.

- -

Your first WebWork Application

- - -

Using the Blank Template

- -

As said before, the webapps directory contains a blank web application template. It is meant to be left untouched, and instead, you will want to make a copy of it as a starting point for your own new WebWork-based application. Although you can perform such a copy operation yourself, there is a much easier way around: You will find an build.xml in the webapps directory, which if called with ant new will provide you with a fresh empty webapp with a name you will be prompted for.

- -

Setting up from Scratch

- - -

Structure of your Web Application

- -

The following illustrates how your web application should be set up. Copy the webwork-(VERSION).jar, all the *.jar files in /lib/default and any necessary optional *.jar files in /lib/(optional configuration) to your webapp/lib directory. If you need to customize your own templates (how HTML is rendered from webwork UI tags), copy the /src/java/template directory into your webapp/ directory. Your webapp should look similar to this:

-
-
/mywebapp/
-/mywebapp/template/
-/mywebapp/META-INF/
-/mywebapp/WEB-INF/
-/mywebapp/WEB-INF/classes/
-/mywebapp/WEB-INF/lib/
-/mywebapp/WEB-INF/lib/CORE&OPTIONAL *.jar
-/mywebapp/WEB-INF/web.xml
-
-

 

- -

Minimum Set of Libraries and Config Files

- -

The following files are a minium requirement for your application.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Filename Description
webwork.jar WebWork library itself, found in distribution root directory
xwork.jar XWork library on which WebWork is built
oscore.jar OSCore, a general-utility library from OpenSymphony
ognl.jar Object Graph Navigation Language (OGNL), the expression language used
- throughout WebWork
commons-logging.jar Commons logging, which WebWork uses to support transparently logging to
- either Log4J or JDK 1.4+
freemarker.jar All UI tag templates are written in Freemarker, which is also a good option for your views
rife-continuations by rife for the continuations feature
web.xml J2EE web application configuration file that defines the servlets, JSP tag
- libraries, and so on for your web application
xwork.xml WebWork configuration file that defines the actions, results, and interceptors
- for your application
-

The library files (*.jar) needs to be copied to your /mywebapp/WEB-INF/lib/ directory. If you need optional functionalities requiring dependencies on optional jars, they need to be copied to this directory, too.
Spring as default IoC Container

-Before WebWork 2.2, the builtin Inversion of Control (IoC) container was default. Since Spring has been found to do this job better, the container integrated in WebWork / XWork was deprecated. If you would like to follow our recommendation to use Spring as the default IoC container, please make sure to include all jars found in lib/spring in the WEB-INF/lib directory of your application.

- -

 

- -

web.xml:

- -

Create the following web.xml file in [webapp]/WEB-INF. If you already have a web.xml file, just add the content of the <web-app> tag below to your existing <web-app> tag.

-
-
<?xml version="1.0"?>
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-"http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app>
-  <display-name>My WebWork Application</display-name>
-  <filter>
-    <filter-name>webwork</filter-name>
-    <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
-  </filter>
-
-  <filter-mapping>
-    <filter-name>webwork</filter-name>
-    <url-pattern>/*</url-pattern>
-  </filter-mapping>
-  <!-- As of 2.2, Spring is the preferred IoC container rather than XWork,
-       so you'll have to include the spring jars if you want to use
-       Spring's IoC capabilities in WebWork. (Thanks Hani for commenting)
-       If you want to use deprecated integrated IoC container instead, you may
-       want to omit the following listener configuration.
-  -->
-  <listener>
-    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-  </listener>
-
-  <!-- The following taglib directive would be needed if your servlet container would comply
-       to Servlet Spec <= 2.2
-  <taglib>
-    <taglib-uri>/webwork</taglib-uri>
-    <taglib-location>/WEB-INF/lib/webwork.jar</taglib-location>
-  </taglib>
-  -->
-</web-app>
-
-

 

- -

This registers FilterDispatcher to enable webwork functionality for your requests. The ContextLoaderListener will take care of setting up Spring as your IoC container for WebWork. The taglib entry will help you use Tags in your JSP pages.

- -

Read more: web.xml

- -

xwork.xml:

- -

Create the following file xwork.xml in [webapp]/WEB-INF/classes/.

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN"
-"http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-	</package>
-</xwork>
-
-

 

- -

For now, this xwork.xml does only two things:

-
    -
  • It informs WebWork that it should import the configuration information from webwork-default.xml. (This file is located at the root of the webwork.jar, so it is sure to be found.)
  • -
- - -
    -
  • It defines a default package (with the <package> section) where WebWork elements like actions, results and interceptors are registered.
  • -
- - -

Read more: xwork.xml

- -

Onward to the First lesson or return to the Webwork Start page

- -
- - diff --git a/docs/wikidocs/Global results.html b/docs/wikidocs/Global results.html deleted file mode 100644 index 748408456..000000000 --- a/docs/wikidocs/Global results.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork - - Global results - - - - - - - - - - -
-

Description

- -

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.

- - -

Example

-
-
<package name="default">
-....
-<global-results> 
-    <result name="login" type="dispatcher"> 
-        <param name="location">login.jsp</param> 
-    </result> 
-</global-results> 
-<action name="foo"  class="mypackage.fooAction">
-    <result name="success" type="dispatcher">bar.jsp</result> 
-</action>
-<action name="submitForm"  class="mypackage.submitFormAction">
-    <result name="success" type="dispatcher">submitSuccess.jsp</result> 
-</action>
-...
-</package>
-
-

Same thing

-
-
<package name="default">
-....
-<action name="foo"  class="mypackage.fooAction">
-    <result name="success" type="dispatcher">bar.jsp</result> 
-    <result name="login" type="dispatcher">login.jsp</result> 
-</action>
-<action name="submitForm"  class="mypackage.submitFormAction">
-    <result name="success" type="dispatcher">submitSuccess.jsp</result>
-    <result name="login" type="dispatcher">login.jsp</result>  
-</action>
-...
-</package>
-
- -
- - diff --git a/docs/wikidocs/GroovyResult.html b/docs/wikidocs/GroovyResult.html deleted file mode 100644 index e67f22a51..000000000 --- a/docs/wikidocs/GroovyResult.html +++ /dev/null @@ -1,239 +0,0 @@ - - - WebWork - - GroovyResult - - - - - - - - - - -
-

GroovyResult - Groovy scripts as a view

-

This is an attempt to create a Result type that uses Groovy (http://groovy.codehaus.org) files as a view. It exposes the current ActionContext to a groovy script. This doesn't really have much practical use, but it's fun nonetheless and shows how easy creating Webwork Results is. There is another Result (JFreeChartResult) in the Cookbook

- -

Installation

-

Not much - just make sure you have Groovy in your classpath, and the antlr, asm-* and groovy jars available to your webapp.

- -

Configuration

-

xwork.xml - result-types definitions

-
-
<result-types>
-   <result-type name="groovy" class="myapp.webwork.extensions.GroovyResult"/>
-</result-types>
-
-

xwork.xml - action definitions

-
-
<action name="MyAction" class="myapp.webwork.actions.MyAction"> 
-  <result name="success" type="groovy"> 
-    <param name="file">test.groovy</param>
-  </result>
-</action>
-
-

The result type takes one parameter (for now), namely 'file', which contains the name of the groovy script in our script directory.

- -

Show me the code !

-

Here's the code of the actual GroovyResult. This is a verbose version, with a lot of error checking.
-GroovyResult.java - source code

-
-
public class GroovyResult implements Result {
-
-	public final static String GROOVY_DIR_NAME = "groovy";
-
-	private final static Logger logger = Logger.getLogger(GroovyResult.class);
-	//our groovy source file name
-	private String file;
-	//a groovy shell
-	private GroovyShell shell;
-	//our parsed script
-	private Script script;
-	//the outputstream that will replace the 'out' in our groovy stream
-	private OutputStream out;
-	//directory containing groovy scripts
-	private String scriptDirectory;
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.opensymphony.xwork.Result#execute(com.opensymphony.xwork.ActionInvocation)
-	 */
-	public void execute(ActionInvocation inv) {
-
-		//check the scriptDirectory - if it doesn't exists, use the default one
-		//WEBAPP + Groovy files directory
-		if (scriptDirectory == null) {
-			//not pretty, but this allows us to get the app root directory
-			String base = ServletActionContext.getServletContext().getRealPath(
-					"/");
-			//if for some reason (.war, apache connector, ..) we can't get the
-			// base path
-			if (base == null) {
-				logger
-						.warn("Could not translate the virtual path \"/\" to set the default groovy script directory");
-				return;
-			}
-			scriptDirectory = base + GROOVY_DIR_NAME;
-			//issue a warning that this directory should NOT be world readable
-			// !!
-			logger
-					.warn("Please make sure your script directory is NOT world readable !");
-		}
-
-		// first of all, make sure our groovy file exists, is readable, and is
-		// an actual file
-
-		File groovyFile = new File(scriptDirectory, file);
-		if (!groovyFile.exists()) {
-			//log an error and return
-			logger.warn("Could not find destination groovy file: "
-					+ groovyFile.getAbsolutePath());
-			return;
-		}
-		if (!groovyFile.isFile()) {
-			//log an error and return
-			logger.warn("Destination is not a file: "
-					+ groovyFile.getAbsolutePath());
-			return;
-		}
-		if (!groovyFile.canRead()) {
-			//log an error and return
-			logger.warn("Can not read file: " + groovyFile.getAbsolutePath());
-			return;
-		}
-
-		if (logger.isDebugEnabled())
-			logger.debug("File " + groovyFile.getPath()
-					+ " found, going to parse it ..");
-
-		/*
-		 * Here we create a Binding object which we populate with the webwork
-		 * stack
-		 */
-		Binding binding = new Binding();
-
-		binding.setVariable("context", ActionContext.getContext());
-
-		/*
-		 * We replace the standard OutputStream with our own, in this case the
-		 * OutputStream from our httpResponse
-		 */
-		try {
-			//the out will be stored in an OutputStream
-			out = ServletActionContext.getResponse().getOutputStream();
-		} catch (IOException e1) {
-			logger.error("Could not open outputstream", e1);
-		}
-		if (out != null){
-			binding.setVariable("out", out);
-		}
-		else {
-			logger
-					.warn("OutputStream not available, using default System.out instead");
-			binding.setVariable("out", System.out);
-		}
-
-		//create a new shell to parse and run our groovy file
-		shell = new GroovyShell(binding);
-		try {
-			//try to parse the script - the returned script could be cached for
-			//performance improvent
-			script = shell.parse(groovyFile);
-		} catch (CompilationFailedException e) {
-			logger.error("Could not parse groovy script", e);
-			return;
-		} catch (IOException e) {
-			logger.error("Error reading groovy script", e);
-			return;
-		}
-		//the binding is set, now run the script
-		Object result = script.run();
-
-		if (logger.isDebugEnabled()) {
-			logger.debug("Script " + groovyFile.getName()
-					+ " executed, and returned: " + result);
-		}
-		try {
-			out.flush();
-		} catch (IOException e2) {
-			logger.error("Could not flush the outputstream", e2);
-		}
-	}
-
-	/**
-	 * @return Returns the script.
-	 */
-	public Script getScript() {
-		return script;
-	}
-	/**
-	 * @param file
-	 *            The file to set.
-	 */
-	public void setFile(String file) {
-		this.file = file;
-	}
-	/**
-	 * @param out
-	 *            The out to set.
-	 */
-	public void setOut(OutputStream out) {
-		this.out = out;
-	}
-
- -

Explanation

-

The first part of the result is little more than:

-
    -
  • determining the script directory - defaults to MYWEBAPP/groovy/
  • -
  • checking the file - make sure it exists, is readable, .. -
    Make sure the groovy scripts directory is not world readable !
  • -
- - -

The groovy part starts at:

-
-
Binding binding = new Binding();
-binding.setVariable("context", ActionContext.getContext());
-
-

A Binding object allows us to 'bind' objects to a groovy script, so they can be used as variables. In this case, I took the ActionContext and exposed it as 'context'.

-
-
out = ServletActionContext.getResponse().getOutputStream();
-...
-binding.setVariable("out", out);
-
-

We also bind an OutputStream to the groovy script (as 'out') - it simply serves as a replacement for the standard System.out, so any printing goes directly to the http response outputstream.

- - -
-
shell = new GroovyShell(binding);
-
-

Next step; we create a GroovyShell, and pass our populated Binding to the constructor. Any script ran by this shell will have access to the passed variables (ActionContext and OutputStream).

- - -
-
script = shell.parse(groovyFile);
-
-

Before you can run a groovyFile, you need to parse it. Any syntax errors will be reported here - I also suggest adding a better error reporting in this case if you actually want to use this Result.
-Upon successful parsing, a Script is returned (which could be cached if you want to increase performance) which will be run by our Shell.

-
-
Object result = script.run();
-
- - -

As a test, you might want to create a little 'groovy' script to test our Result.
-test.groovy - a simple groovy script

-
-
for (item in context.contextMap){
-	println "item: ${item}"
-}
-
-

Place the test.groovy file in your groovy scripts directory. You should now see the result when you invoke MyAction.action in your browser.

- -

Possible improvements are binding all objects on the stack so they become available to the groovy script, refactoring to an InputStream instead of a File, etc .. Comments welcome !

- -
- - diff --git a/docs/wikidocs/Handing IoC Components to Interceptors and Validators.html b/docs/wikidocs/Handing IoC Components to Interceptors and Validators.html deleted file mode 100644 index 615611610..000000000 --- a/docs/wikidocs/Handing IoC Components to Interceptors and Validators.html +++ /dev/null @@ -1,195 +0,0 @@ - - - WebWork - - Handing IoC Components to Interceptors and Validators - - - - - - - - - - -
-

Reason for use

- -

I have recently found the need for my Interceptors and Validators to be able to access Components - such as a Validators which is UserAware and checks the UserManager to see if the user exists. Or a Interceptor which is ApplicationAware and asks the ApplicationManager if it is setup yet - if not, then redirecting to a setup action instead.

- -

Currently WebWork (at version 2.1.7) only supports component management of Action, but this can be changed quite easily - if you know where to look.

- -

Extending the Object Factorys

- -

WebWork uses a com.opensymphony.xwork.ObjectFactory object instance to generate the various objects that WebWork utilises - Validators, Interceptors, Actions, and Results for example. This is the object we are going to extend to add some of this functionality.

- -

The methods buildInterceptor and buildValidator do what they say on the tin. I have overriden them to do the following:

- -
-
public Interceptor buildInterceptor(InterceptorConfig ic, Map map) throws ConfigurationException {
-        Interceptor i = super.buildInterceptor(ic, map);
-        cm.initializeObject(i);
-        return i;
-    }
-
-    public Validator buildValidator(String string, Map map) throws Exception {
-        Validator v = super.buildValidator(string, map);
-        cm.initializeObject(v);
-        return v;
-    }
-
- -

Creating a Component Mananger

- -

The variable cm is a ComponentManager. As I am unsure of how to access the ComponentManager that is used in the ComponentInterceptor (or used when initalizing Action objects), we have to create our own. As the ObjectFactory is a singleton the overhead of this is relatively minor, even though not ideal.

- -

The ComponentManager is created in the constructor like this:

- -
-
private static final Log log = LogFactory.getLog(ObjectFactory.class);
-
-    private ComponentConfiguration cc;
-    private ComponentManager cm;
-
-    public ObjectFactory() {
-        super();
-        cm = (ComponentManager) ActionContext.getContext().get( ComponentInterceptor.COMPONENT_MANAGER );
-
-        if (cm == null) {
-            cc = new ComponentConfiguration();
-            InputStream configXml = Thread.currentThread().getContextClassLoader().getResourceAsStream("components.xml");
-            try {
-                cc.loadFromXml(configXml);
-            } catch (Exception e) {
-                log.info("No component.xml found. They test will continue without initializing components.");
-                cc = null;
-            }
-
-            cm = new DefaultComponentManager();
-            if (cc != null) {
-                cc.configure(cm, "session");
-                cc.configure(cm, "application");
-                cc.configure(cm, "request");
-            }
-        }
-    }
-
- -

Using our new ObjectFactory

- -

The ObjectFactory is a singleton which allows you to set the object it hands out. To do this I have chosen to override the init method of the com.opensymphony.webwork.dispatcher.ServletDispatcher class. The method looks something like this:

- -
-
public void init(ServletConfig servletConfig) throws ServletException {
-        ObjectFactory.setObjectFactory( new planb.jobsite.xwork.ObjectFactory() );
-        super.init(servletConfig);
-    }
-
- -

Code Results

- -

The following full files result from this article.

- -

Object Factory

- -
ObjectFactory.java
-
import com.opensymphony.xwork.interceptor.Interceptor;
-import com.opensymphony.xwork.interceptor.component.ComponentManager;
-import com.opensymphony.xwork.interceptor.component.DefaultComponentManager;
-import com.opensymphony.xwork.interceptor.component.ComponentInterceptor;
-import com.opensymphony.xwork.interceptor.component.ComponentConfiguration;
-import com.opensymphony.xwork.config.entities.InterceptorConfig;
-import com.opensymphony.xwork.config.ConfigurationException;
-import com.opensymphony.xwork.validator.Validator;
-import com.opensymphony.xwork.ActionContext;
-
-import java.util.Map;
-import java.io.InputStream;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-public class ObjectFactory extends com.opensymphony.xwork.ObjectFactory {
-
-    private static final Log log = LogFactory.getLog(ObjectFactory.class);
-
-    private ComponentConfiguration cc;
-    private ComponentManager cm;
-
-    public ObjectFactory() {
-        super();
-        cm = (ComponentManager) ActionContext.getContext().get( ComponentInterceptor.COMPONENT_MANAGER );
-
-        if (cm == null) {
-            cc = new ComponentConfiguration();
-            InputStream configXml = Thread.currentThread().getContextClassLoader().getResourceAsStream("components.xml");
-            try {
-                cc.loadFromXml(configXml);
-            } catch (Exception e) {
-                log.info("No component.xml found. They test will continue without initializing components.");
-                cc = null;
-            }
-
-            cm = new DefaultComponentManager();
-            if (cc != null) {
-                cc.configure(cm, "session");
-                cc.configure(cm, "application");
-                cc.configure(cm, "request");
-            }
-        }
-    }
-
-    public Interceptor buildInterceptor(InterceptorConfig ic, Map map) throws ConfigurationException {
-        Interceptor i = super.buildInterceptor(ic, map);
-        cm.initializeObject(i);
-        return i;
-    }
-
-    public Validator buildValidator(String string, Map map) throws Exception {
-        Validator v = super.buildValidator(string, map);
-        cm.initializeObject(v);
-        return v;
-    }
-
-}
-
- -

Servlet Dispatcher

- -
ServletDispatcher.java
-
import com.opensymphony.xwork.ObjectFactory;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-
-public class ServletDispatcher extends com.opensymphony.webwork.dispatcher.ServletDispatcher {
-
-    public void init(ServletConfig servletConfig) throws ServletException {
-        ObjectFactory.setObjectFactory( new planb.jobsite.xwork.ObjectFactory() );
-        super.init(servletConfig);
-    }
-
-}
-
- -

web.xml

- -

Replace the reference to the webwork ServletDispatcher to point to the above ServletDispatcher class.

- -

Important Notes

- -

You should find your Interceptors and Validators are now componentized just like Actions, however there are some important notes to be made.

- -

Lifecycle Issues

- -

Interceptors and Validators are both cached by webwork and reused instead of being reinstanciated - this will mean that you may experiance issues with components outside of the application scope. As all of my Interceptor / Validator required components are in this scope, this isn't an issue to me.

- -

One solution to this constraint would be to investigate how webwork caches its Interceptors and Validators, then check to see if the objects use session / request scoped components and cache accordingly. Maybe a thought for the guys planning the next release of webwork!

- -

Conclusion

- -

For now this concludes this article - feel free to add your ideas!

- -
- - diff --git a/docs/wikidocs/Hibernate.html b/docs/wikidocs/Hibernate.html deleted file mode 100644 index 2bc072a88..000000000 --- a/docs/wikidocs/Hibernate.html +++ /dev/null @@ -1,31 +0,0 @@ - - - WebWork - - Hibernate - - - - - - - - - - -
-

There's nothing more that you have to do use Hibernate with WebWork than with other Web framework. Just setup Hibernate according to the http://www.hibernate.org/5.html. However, there're a number of good patterns that people have used successfully in the following projects:

- - - - - - - -
- - diff --git a/docs/wikidocs/HibernateAndSpringEnabledExecuteAndWaitInterceptor.html b/docs/wikidocs/HibernateAndSpringEnabledExecuteAndWaitInterceptor.html deleted file mode 100644 index 6a10d1536..000000000 --- a/docs/wikidocs/HibernateAndSpringEnabledExecuteAndWaitInterceptor.html +++ /dev/null @@ -1,116 +0,0 @@ - - - WebWork - - HibernateAndSpringEnabledExecuteAndWaitInterceptor - - - - - - - - - - -
-

Find example code below for an extension of the ExecuteAndWaitInterceptor.

- -

The goal of this code is to allow a background process to execute while having access to the same open Hibernate session object.

- -

The SessionFactory dependency is injected into the OpenSessionExecuteAndWaitInterceptor by Spring. You may use other methods of dependency injection if you are more comfortable with them. By overriding the getNewBackgroundProcess() method, this interceptor uses our custom OpenSessionBackgroundProcess instead of the WebWork default.

- -

Overriding the beforeInvocation() and afterInvocation() methods in the OpenSessionBackgroundProcess ensure that the session will stay open throughout the life of the background process, and any Spring transaction management will also be used.

- -

As this code is heavily dependent on Spring and Hibernate, you shouldn't expect to see it packaged with a WebWork distribution. It does, however, serve as a useful example of extending the Execute and Wait Interceptor

- -
OpenSessionExecuteAndWaitInterceptor.java
-
import net.sf.hibernate.SessionFactory;
-
-import com.opensymphony.webwork.interceptor.BackgroundProcess;
-import com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor;
-import com.opensymphony.xwork.ActionInvocation;
-
-
-/**
- * The OpenSessionExecuteAndWaitInterceptor will obtain a Hibernate
- * Session Factory from a Spring.
- * 
- * The session factory will then be passed to the BackgroundProcess,
- * to open a session, enable Spring's transaction management 
- * capabilities, and bind the Session to the background thread.
- * 
- */
-public class OpenSessionExecuteAndWaitInterceptor extends ExecuteAndWaitInterceptor {
-       
-    SessionFactory sessionFactory;
-
-    
-	public SessionFactory getSessionFactory() {
-		return sessionFactory;
-	}
-
-
-	public void setSessionFactory(SessionFactory sessionFactory) {
-		this.sessionFactory = sessionFactory;
-	}
-
-	protected BackgroundProcess getNewBackgroundProcess(String arg0, ActionInvocation arg1, int arg2) {
-		return new OpenSessionBackgroundProcess(arg0, arg1, arg2, sessionFactory);
-	}
-
-}
-
- -
OpenSessionBackgroundProcess.java
-
import net.sf.hibernate.FlushMode;
-import net.sf.hibernate.Session;
-import net.sf.hibernate.SessionFactory;
-
-import org.springframework.orm.hibernate.SessionFactoryUtils;
-import org.springframework.orm.hibernate.SessionHolder;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-import com.opensymphony.webwork.interceptor.BackgroundProcess;
-import com.opensymphony.xwork.ActionInvocation;
-
-/**
- * The OpenSessionBackgroundProcess, when instantiated with a
- * HibernateSessionFactory, will open a session, enable Spring's transaction
- * management capabilities, and bind the Session to the background thread.
- * 
- */
-public class OpenSessionBackgroundProcess extends BackgroundProcess {
-
-	SessionFactory sessionFactory;
-
-	Session openSession;
-
-	public OpenSessionBackgroundProcess(String name,
-			ActionInvocation invocation, int threadPriority,
-			SessionFactory factory) {
-		super(name, invocation, threadPriority);
-		this.sessionFactory = factory;
-	}
-
-	protected void beforeInvocation() throws Exception {
-		openSession = SessionFactoryUtils.getSession(sessionFactory, true);
-		openSession.setFlushMode(FlushMode.NEVER);
-		TransactionSynchronizationManager.bindResource(sessionFactory,
-				new SessionHolder(openSession));
-		super.beforeInvocation();
-	}
-
-	protected void afterInvocation() throws Exception {
-		super.afterInvocation();
-		TransactionSynchronizationManager.unbindResource(sessionFactory);
-		SessionFactoryUtils
-				.closeSessionIfNecessary(openSession, sessionFactory);
-	}
-
-
-}
-
- -
- - diff --git a/docs/wikidocs/How can I display image that are contained as bytes in my action.html b/docs/wikidocs/How can I display image that are contained as bytes in my action.html deleted file mode 100644 index 9283cb4f5..000000000 --- a/docs/wikidocs/How can I display image that are contained as bytes in my action.html +++ /dev/null @@ -1,81 +0,0 @@ - - - WebWork - - can I display image that are contained as bytes in my action - - - - - - - - - - -
-

With the html as follows:

- -
-
<img src="/myWebAppContext/myAction!default.action />
-
- -

xwork.xml could be as follows:

- -
-
<xwork>
-    ...
-    <result-types>
-        <result-type name="myBytesResult" class="foo.bar.MyBytesResult" />
-    </result-types>
-    ...
-
-    <action name="myAction" class="...">
-        <result name="myImageResult" type="myBytesResult">
-            <param name="contentType">${myContentType}</param>
-            <param name="contentDisposition">${myContentDisposition}</param>
-            <param name="contentLength">${myContentLength}</param>
-            <param name="bufferSize">${myBufferSize}</param>
-        <result>
-    </action>
-
-    ...
-</xwork>
-
- -

the action could be as follows:

- -
-
public class MyAction extends ActionSupport {
-   public String doDefault() {
-        return "myImageResult";
-    }
-   public byte[] getMyImageInBytes() { .... }
-
-   public String getMyContentType() { ... }
-   public String getMyContentDisposition() { ... }
-   public int getMyContentLength() { .... }
-   public int getMyBufferSize() { ... }
-}
-
- - -
-
public class MyBytesResult implements Result {
-
-	public void execute(ActionInvocation invocation) throws Exception {
-		MyAction action = (MyAction) invocation.getAction();
-		HttpServletResponse response = ServletActionContext.getResponse();
-		
-                response.setContentType(action.getContentType());
-		response.setContentLength(action.getContentLength());
-		
-		response.getOutputStream().write(action.getImageInBytes());
-		response.getOutputStream().flush();
-	}
-
-}
-
- -
- - diff --git a/docs/wikidocs/How can I get the HttpServletRequest.html b/docs/wikidocs/How can I get the HttpServletRequest.html deleted file mode 100644 index 825e30090..000000000 --- a/docs/wikidocs/How can I get the HttpServletRequest.html +++ /dev/null @@ -1,30 +0,0 @@ - - - WebWork - - can I get the HttpServletRequest - - - - - - - - - - -
-

Method A:
-ServletActionContext.getRequest() (works internally using a ThreadLocal)

- -

Method B:
-Have the action implements ServletRequestAware and the servlet request will be set through setServletRequest(HttpServletRequest) method. This requires the action to have a 'servlet-config' interceptor added.

- -

@see webwork\-default.xml
-@see com.opensymphony.webwork.interceptor.ServletRequestAware
-@see com.opensymphony.webwork.interceptor.ServletConfigInterceptor

- - - -
- - diff --git a/docs/wikidocs/How can I get the HttpServletResponse.html b/docs/wikidocs/How can I get the HttpServletResponse.html deleted file mode 100644 index a4aad3ebb..000000000 --- a/docs/wikidocs/How can I get the HttpServletResponse.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - can I get the HttpServletResponse - - - - - - - - - - -
-

Method A:
-ServletActionContext.getResponse() (works internally using a ThreadLocal)

- -

Method B:
-Have the action implements ResponseAware and the response will be set through setServletResponse(HttpServletResponse). The action needs to have 'servlet-config' interceptor added to it.

- -

@see webwork\-default.xml
-@see com.opensymphony.webwork.interceptor.ServletResponseAware
-@see com.opensymphony.webwork.interceptor.ServletConfigInterceptor

- -
- - diff --git a/docs/wikidocs/How can I integrate WebWork IoC in to an object that is not an action.html b/docs/wikidocs/How can I integrate WebWork IoC in to an object that is not an action.html deleted file mode 100644 index 243302297..000000000 --- a/docs/wikidocs/How can I integrate WebWork IoC in to an object that is not an action.html +++ /dev/null @@ -1,21 +0,0 @@ - - - WebWork - - can I integrate WebWork IoC in to an object that is not an action - - - - - - - - - - -
-

Obtain the ComponentManager from the request: ComponentManager cm = (ComponentManager) ServletActionContext.getRequest().getAttribute("DefaultComponentManager");
-then you need to initialize it using: cm.initializeObject(Object)

- -
- - diff --git a/docs/wikidocs/How can I see all request parameters passed into the action.html b/docs/wikidocs/How can I see all request parameters passed into the action.html deleted file mode 100644 index 7915f6bf4..000000000 --- a/docs/wikidocs/How can I see all request parameters passed into the action.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - can I see all request parameters passed into the action - - - - - - - - - - -
-

Method A:
-ActionContext.getContext().getParameters() (returns Map, works internally using a ThreadLocal)

- -

Method B:
-Have the action implements ParameterAware interface and the parameters will be set through the setParameters(Map) method. This requires that the 'servlet-config' interceptor being added to that particular action.

- -

@see webwork\-default.xml
-@see com.opensymphony.webwork.interceptor.ParameterAware
-@see com.opensymphony.webwork.interceptor.Servlet Config Interceptor

- -
- - diff --git a/docs/wikidocs/How do I change the error message for invalid inputted fields.html b/docs/wikidocs/How do I change the error message for invalid inputted fields.html deleted file mode 100644 index 818686de1..000000000 --- a/docs/wikidocs/How do I change the error message for invalid inputted fields.html +++ /dev/null @@ -1,21 +0,0 @@ - - - WebWork - - do I change the error message for invalid inputted fields - - - - - - - - - - -
-

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):
-invalid.fieldvalue.user.dob=Please enter Date of Birth in the correct format.

- -
- - diff --git a/docs/wikidocs/How do I decouple XWork LocalizedTextUtil global resource bundle loading from serlvets.html b/docs/wikidocs/How do I decouple XWork LocalizedTextUtil global resource bundle loading from serlvets.html deleted file mode 100644 index 07f5df541..000000000 --- a/docs/wikidocs/How do I decouple XWork LocalizedTextUtil global resource bundle loading from serlvets.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - do I decouple XWork LocalizedTextUtil global resource bundle loading from serlvets - - - - - - - - - - -
-

If you'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're running in.

- -
- - diff --git a/docs/wikidocs/How do I get JEE J2EE security info.html b/docs/wikidocs/How do I get JEE J2EE security info.html deleted file mode 100644 index fc3f0a9fc..000000000 --- a/docs/wikidocs/How do I get JEE J2EE security info.html +++ /dev/null @@ -1,40 +0,0 @@ - - - WebWork - - do I get JEE J2EE security info - - - - - - - - - - -
-

Method A:

-
-
HttpServletRequest request = ....   // get HttpServletRequest
-request.getAuthType()               // http or https
-request.getRemoteUser()             // the user principal (in string)
-request.getUserPrincipal()          // get a Principal object
-request.isUserInRole(String)
-
- -

Method B: (Recommended)

-
    -
  • Not tied to Servlet spec
  • -
  • Help in unit testing
  • -
- - -

Have the action implements PrincipalAware and add 'servlet-config' interceptor to it. a PrincipalProxy object will be set to method setPrincipalProxy(PrincipalProxy). With PrincipalProxy, one could have access to methods such as isUserInRole(), getUserPrincipal(), getRemoteUser(), isRequestSecure() etc.

- -

@see com.opensymphony.webwork.interceptor.PrincipalProxy
-@see com.opensymphony.webwork.interceptor.PrincipalAware
-@see com.opensymphony.webwork.interceptor.ServletConfigInterceptor

- -
- - diff --git a/docs/wikidocs/How do I get access to the session.html b/docs/wikidocs/How do I get access to the session.html deleted file mode 100644 index eb783afd3..000000000 --- a/docs/wikidocs/How do I get access to the session.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - do I get access to the session - - - - - - - - - - -
-

Method A:
-ActionContext.getContext().getSession() (returns Map, works internally using a ThreadLocal)

- -

Method B (Recommended):
-Have the action implements SessionAware, and the Session (as a Map) will be set through the setSession(Map) method. This requires that the 'servlet-config' interceptor being included when the particular action is processed.

- -

@see webwork\-default.xml
-@see com.opensymphony.webwork.interceptor.SessionAware
-@see com.opensymphony.webwork.interceptor.Servlet Config Interceptor

- -
- - diff --git a/docs/wikidocs/How do I get static parameters into my action.html b/docs/wikidocs/How do I get static parameters into my action.html deleted file mode 100644 index 19c7a3b23..000000000 --- a/docs/wikidocs/How do I get static parameters into my action.html +++ /dev/null @@ -1,79 +0,0 @@ - - - WebWork - - do I get static parameters into my action - - - - - - - - - - -
-

Static parameters could be defined into an action through xwork.xml like bellow:

- -
-
<action name="myAction" class=" ... ">
-     <param name="myStaticParam1">myStaticValue1</param>
-     <param name="myStaticParam2">myStaticValue2</param>
-     <param name="myStaticParam3">myStaticValue3</param>
-  </action>
-
- -

+ Method A +
-Have the action class itself implements com.opensymphony.xwork.config.entities.Parameterizable and the static parameters will be set into it through the setParams(Map) method. In the example above, the key and value will be as tabulated below:

- - - - - - - - - - - - - - - - - - -
keyvalue
myStaticParam1myStaticValue1
myStaticParam2myStaticValue2
myStaticParam3myStaticValue3
- - -

+ Method B +
-Have the action class itself define getter/setter for the static parameter itself and those static parameter will be set through those setter and getter. In the case above, the action class could be as follows:

- -
-
public class MyAction extends ActionSupport {
-     ...
-     
-     public String getMyStaticParam1() { ....}
-     public void setMyStaticParam1(String myStaticParam1) { ... }
-
-     public String getMyStaticParam2() { ... }
-     public void setMyStaticParam2(String myStaticParam2) { ... }
-  
-     public String getMyStaticParam3() { ... }
-     public void setMyStaticParam3(String myStaticParam3) { ... }
-
-     ...
-  }
-
- -

The getter and setter, will be set appropriately.

- -

NOTE: For this to work, 'static-params' interceptor must be added to the action.

- -

@see com.opensymphony.xwork.interceptor.StaticParametersInterceptor
-@see com.opensymphony.xwork.config.entities.Parameterizable

- - -
- - diff --git a/docs/wikidocs/How do I get the latest version of WebWork.html b/docs/wikidocs/How do I get the latest version of WebWork.html deleted file mode 100644 index 599ca4e22..000000000 --- a/docs/wikidocs/How do I get the latest version of WebWork.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork - - do I get the latest version of WebWork - - - - - - - - - - -
-

Distibution package

- -

The latest distribution packages including official beta versions are found on Java DevNet.

- -

From CVS (The Bleeding Edge)

- -

Short answer:

- -

cvs -d :pserver:guest@cvs.dev.java.net:/cvs login
-(Use an empty password, just hit enter..)
-cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout opensymphony
-cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout webwork

- -

optional:
-cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout xwork

- -

Note: One needs to have ivy in $ANT_HOME/lib, cause WebWork uses ivy to manage its library dependencies.

- -

Long answer:
-See Building Webwork for a detailed description, including information on Ivy and JDK compatibility.

- - - -
- - diff --git a/docs/wikidocs/How do I handle files upload.html b/docs/wikidocs/How do I handle files upload.html deleted file mode 100644 index 7d00a6657..000000000 --- a/docs/wikidocs/How do I handle files upload.html +++ /dev/null @@ -1,76 +0,0 @@ - - - WebWork - - do I handle files upload - - - - - - - - - - -
-

Method A
-MultipartRequestWrapper multipartRequest = ((MultipartRequestWrapper)ServletActionContext.getRequest())

- -

With multipartRequest, one could access methods such as getFiles(...), getFile(...), getContentType(...), hasErrors(), getErrors() etc to handle the file uploaded.

- -

Method B (Recommended)
-Add a 'fileUpload' interceptor to the action. For example, in the following case:

- -
-
<form name="myForm" enctype="multipart/form-data">
-     <input type="file" name="myDoc" value="Browse ..." />
-     <input type="submit" />
-  </form>
-
- -

The action class would requires any (or none, but if none what is the point?) of three methods being defined, in order for the interceptor to populate it with uploaded file information

- -
-
public void setMyDoc(File myDoc) { ...}
-public void setMyDocContentType(String contentType) { .... }
-public void setMyDocFileName(String filename) { .... }
-
- -

with these methods, one could do whatever is needed with the uploaded file. If multiple files are uploaded as in following:

- -
-
<form name="myForm" enctype="multipart/form-data">
-      <input type="file" name="myDoc" value="Browse File A ..." />
-      <input type="file" name="myDoc" value="Browse File B ..." />
-      <input type="file" name="myDoc" value="Browse File C ..." />
-      <input type="submit" />
-   </form>
-
- -

The action class needs only make the corresponding method an array, orders followed such that getMyDoc()0 will have its content type as getMyDoc()0 and its file name as getMyDoc()1.

- -
-
public void setMyDoc(File[] myDocs) { ... }
-public void setMyDocContentType(String[] contentTypes) { ... }
-public void setMyDocFileName(String[] fileNames) { ... }
-
- - -

Extra Information:
-The following properties in webwork.properties affect the file upload.

- -

webwork.multipart.parser (as of WW2.2 its jakarta by default)
-webwork.multipart.saveDir (default to javax.servlet.context.tempdir defined by container)
-webwork.multipart.maxSize (approximately 2M by default)

- - -

@see webwork.properties
-@see com.opensymphony.webwork.dispatcher.FilterDispatcher#doFilter(SerlvetRequest, ServletRepsonse, FilterChain)
-@see com.opensymphony.webwork.dispatcher.DispatcherUtil#wrapRequest(HttpServletRequest, SerlvetContext)
-@see com.opensymphony.webwork.dispatcher.multipart.MultipartRequestWrapper
-@see com.opensymphony.webwork.interceptor.FileUploadInterceptor

- - -
- - diff --git a/docs/wikidocs/How do I populate a form bean and get the value using the taglib.html b/docs/wikidocs/How do I populate a form bean and get the value using the taglib.html deleted file mode 100644 index 8612b86db..000000000 --- a/docs/wikidocs/How do I populate a form bean and get the value using the taglib.html +++ /dev/null @@ -1,60 +0,0 @@ - - - WebWork - - do I populate a form bean and get the value using the taglib - - - - - - - - - - -
-

First off, if you're coming from Struts, you may feel more comfortable using FormBeans instead of using the Action as your form bean. Be aware, though, that in Webwork you DO have the option of having the properties directly in the Action class. If you want to use a FormBean, here's an example:

-
-
public class TestAction extends ActionSupport {
-    private TestBean myBean;
-
-    public TestBean getMyBean() {
-        return myBean;
-    }
-
-    public void setMyBean(TestBean myBean) {
-        this.myBean = myBean;
-    }
-
-    protected String doExecute() throws Exception {
-        myBean = new TestBean();
-        BeanUtil.setProperties(ActionContext.getContext().getParameters(), myBean);
-        return SUCCESS;
-    }
-}
-
- -

Then, in your success.jsp, which is mapped as the success result of TestAction in the views.properties or actions.xml (see the docs for how to configure actions and view mappings), you can do this:

-
-
<!-- This will call getMyBean() on your action and put it on the top of the value stack ->
-<webwork:property value="myBean"> 
-<!- This will call getName() on your TestBean and print it to the page -->
-The name is: <webwork:property value="name"/>
-</webwork:property>
-
-

This is a good way to do it if you have several parameters from the TestBean that you want to display, but, if you have just one, like in this case, it's probably better to do this:

-
-
<webwork:property value="myBean/name"/>
-
- -

NOTE:
-As of WW2.2, the following should be used

-
-
<webwork:property value="myBean.name" />
-
- -

Which will call getMyBean.getName() and print that out to the page.

- -
- - diff --git a/docs/wikidocs/How do I set a global resource bundle.html b/docs/wikidocs/How do I set a global resource bundle.html deleted file mode 100644 index ce8cd4d0e..000000000 --- a/docs/wikidocs/How do I set a global resource bundle.html +++ /dev/null @@ -1,64 +0,0 @@ - - - WebWork - - do I set a global resource bundle - - - - - - - - - - -
-

In webwork.properties(as of Webwork 2.1.1),
-you can now use:

-
-
webwork.custom.i18n.resources=global-messages
-
-

Serveral resource bundles can be specified by comma separating them.
-for example see webwork.properties :
-http://wiki.opensymphony.com/display/WW/webwork.properties

- -

Java class (thanks Drew McAuliffe):

-
-
public class WebworkGlobalMessagesListener implements ServletContextListener {
-    private static Logger log = Logger.getLogger(WebworkGlobalMessagesListener.class);
-    private static final String DEFAULT_RESOURCE = "global-messages";
-
-    /**
-     * Uses the LocalizedTextUtil to load messages from the global
-     message bundle.
-     * @see
-     javax.servlet.ServletContextListener#contextInitialized(javax.servlet.Servle
-     tContextEvent)
-     */
-    public void contextInitialized(ServletContextEvent arg0) {
-        log.info("Loading global messages from " + DEFAULT_RESOURCE);
-        LocalizedTextUtil.addDefaultResourceBundle(DEFAULT_RESOURCE);
-        log.info("Global messages loaded.");
-    }
-
-    /**
-     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
-     */
-    public void contextDestroyed(ServletContextEvent arg0) {
-
-        // do nothing
-    }
-
-}
-
-

web.xml:
-(under listeners section)

-
-
<listener>
-<listener-class>mypackagename.WebworkGlobalMessagesListener</listener-class>
-</listener>
-
- -
- - diff --git a/docs/wikidocs/How do I use messages from within the validator.html b/docs/wikidocs/How do I use messages from within the validator.html deleted file mode 100644 index fdab88e93..000000000 --- a/docs/wikidocs/How do I use messages from within the validator.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - do I use messages from within the validator - - - - - - - - - - -
-
-
<validators>
-    <field name="name">
-        <field-validator type="requiredstring">
-            <message key="template.name.errors.required">A default message in case the key is not found</message>
-        </field-validator>
-    </field>
-</validators>
-
- -
- - diff --git a/docs/wikidocs/How to build the portlet war for a specific portal server.html b/docs/wikidocs/How to build the portlet war for a specific portal server.html deleted file mode 100644 index dc9233611..000000000 --- a/docs/wikidocs/How to build the portlet war for a specific portal server.html +++ /dev/null @@ -1,42 +0,0 @@ - - - WebWork - - to build the portlet war for a specific portal server - - - - - - - - - - -
-

Building the portlet sample webapp for a specific container

- -
Build instructions
-

Some text with a title

-
    -
  • run 'ant' from the webapp project dir
  • -
  • cd to webapps directory
  • -
  • To build a portlet webapp, simply run: ant build-portlet
  • -
- - -
    -
  • You can use the 'container' system property to target a specific container, e.g. '-Dcontainer=exo'.
    - Supported containers are exo, gridsphere, liferay-3.6.1, jboss-portal-2.0, jboss-portal-2.2 and jetspeed2.
    - For IBM WebSphere Portal 5.1, no container property is required.
    - For example:
    - ant build-portlet -Dcontainer=jboss-portal-2.2
  • -
  • Check the etc/yourcontainer directory for a Readme. If available, check for further instructions.
  • -
  • deploy the war to your portal server
  • -
-
- - - -
- - diff --git a/docs/wikidocs/How to escape special chars in resource bundles.html b/docs/wikidocs/How to escape special chars in resource bundles.html deleted file mode 100644 index db36eaf51..000000000 --- a/docs/wikidocs/How to escape special chars in resource bundles.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork - - to escape special chars in resource bundles - - - - - - - - - - -
-

Normal Java resource bundles

- -

In this case the important aspect is the following:
API: java.util.Properties

- The method does not treat a backslash character, \, before a non-valid escape character as an error; the backslash is silently dropped. For example, in a Java string the sequence "\z" would cause a compile time error. In contrast, this method silently drops the backslash. Therefore, this method treats the two character sequence "\b" as equivalent to the single character 'b'.

- -

MessageFormat rules

- -

Extensively describing rules for embedding ' and {. (see javadoc API for MessageFormat)

- -

The special chars ', { and }:

- -
    -
  • escape ' with another ': resulting in '' (double-single quote)
  • -
  • escape \ with another \: resulting in \ \ (double backslash)
  • -
  • enclose } with ': resulting in '}'
  • -
  • enclose { with ': resulting in '{'
  • -
- - -
- - diff --git a/docs/wikidocs/How to format dates and numbers.html b/docs/wikidocs/How to format dates and numbers.html deleted file mode 100644 index efea6fc0a..000000000 --- a/docs/wikidocs/How to format dates and numbers.html +++ /dev/null @@ -1,77 +0,0 @@ - - - WebWork - - to format dates and numbers - - - - - - - - - - -
-

A frequently asked question is how best to display dates and numbers using a specified format. There are a number of approaches for this, the most naive of which would be to add a method to your action class to do the formatting for you. This method would take in a Date (or subclass) object as a parameter, and return a formatted String.

- -

That approach however suffers from a number of flaws. For example, it is not i18n aware. The date format specified is rigid, and will not adapt to different locales easily (assuming you're not using a default formatter that is). It also clutters up your actions with code that has nothing to do with the action itself.

- -

Instead, the recommended approach is to use Java's built-in date formatting features via use of the webwork:text tag.

- -

The webwork:text tag should be used for all i18n values. It will look up the properties file for your action, and from that select the value for the key that you specify. This is best illustrated in an example:

- -
-
<!-- display the number of items in a cart -->
-<webwork:text name="'cart.items'" value0="cartItems" />
-
- -

The above tag will work as follows. value0 will result in a call to getCartItems() on your action class. The cart.items name is escaped, so it is treated as a literal key into the actions' properties file. Your MyAction.properties file will contain the following:

- -

cart.items=You have {0} items in your cart.

- -

Normal Java MessageFormat behaviour will correctly substitute {0} with the value obtained from getCartItems.

- -

Needless to say, this can get a lot more elaborate, with the ability to specify both date and number formatting. Let us consider another example. The goal here is to display a greeting to the user, as well as the date of their last visit.

- -
-
<webwork:text name="'last.visit'" value0="userName" value1="lastVisit(userName)" />
-
- -

MyAction.java contains:

- -
-
public String getUserName() { ... };
-public Date getLastVisit(String userName) { ... };
-
- -

Your MyAction.properties file will then contain:

- -

last.visit=Welcome back {0}, your last visit was at {1,date,HH:mm dd-MM-yyyy}

- -

As you can see, this is a very powerful mechanism and allows you to easily display numbers and dates using any formatting rules that Java allows.

- -
value0 interface deprecated
-

The examples above pass in the values as:

-
-
<webwork:text name="'text.message'" value0="userName"/>
-
-

These values should now (>2.1.7?) be passed as params:

-
-
<webwork:text name="'text.message'"> 
-    <webwork:param value="'userName'"/>
-</webwork:text>
-
- -
Some message format examples
-

Here are some examples of formatting in the properties file:

-
-
format.date = {0,date,MM/dd/yy}
-format.time = {0,date,MM/dd/yy ha}
-format.percent = {0,number,##0.00'%'}
-format.money = {0,number,$##0.00}
-
- -
- - diff --git a/docs/wikidocs/How to reload xwork configuration.html b/docs/wikidocs/How to reload xwork configuration.html deleted file mode 100644 index 6931b7f2f..000000000 --- a/docs/wikidocs/How to reload xwork configuration.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork - - to reload xwork configuration - - - - - - - - - - -
-

If you are finding that the xwork configuration is not reloaded when you redeploy your war. Is there a way to tell webwork to unload its configuration when the context is destroyed.

- -

Try to call

-
com.opensymphony.xwork.config.ConfigurationManager.destroyConfiguration()
-

- -
Useful Information
-

This should destroy the current configuration and perform a config reload on next request. You can use a action for do it.

- -

another tip

-

This is another option that you can use, change for true.

- -
webwork.properties
-
### Configuration reloading
-### This will cause the configuration to reload xwork.xml when it is changed
-webwork.configuration.xml.reload=false
-
- -
- - diff --git a/docs/wikidocs/How to support UTF-8 URIEncoding with Tomcat.html b/docs/wikidocs/How to support UTF-8 URIEncoding with Tomcat.html deleted file mode 100644 index 9d9eb6782..000000000 --- a/docs/wikidocs/How to support UTF-8 URIEncoding with Tomcat.html +++ /dev/null @@ -1,32 +0,0 @@ - - - WebWork - - to support UTF-8 URIEncoding with Tomcat - - - - - - - - - - -
-

If your POST and GET parameters are not UTF-8 encoded when using Tomcat 5.x, try to adjust the Connector configuration in Tomcats server.xml like this:

- -
-
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
-   <Connector port="8080" maxHttpHeaderSize="8192"
-               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
-               enableLookups="false" redirectPort="8443" acceptCount="100"
-               connectionTimeout="20000" disableUploadTimeout="true"
-               URIEncoding="UTF-8"
-   />
-
- - - -
- - diff --git a/docs/wikidocs/HttpHeader Result.html b/docs/wikidocs/HttpHeader Result.html deleted file mode 100644 index 1f8dea990..000000000 --- a/docs/wikidocs/HttpHeader Result.html +++ /dev/null @@ -1,46 +0,0 @@ - - - WebWork - - HttpHeader Result - - - - - - - - - - -
- -

A custom Result type for evaluating HTTP headers against the ValueStack.

- - -

Parameters

- - -

    - -

  • status - the http servlet response status code that should be set on a response.
  • - -

  • parse - true by default. If set to false, the headers param will not be parsed for Ognl expressions.
  • - -

  • headers - header values.
  • - -

- - -

Examples

- -
-
<result name="success" type="httpheader">
-  <param name="status">204</param>
-  <param name="headers.a">a custom header value</param>
-  <param name="headers.b">another custom header value</param>
-</result>
-
- -
- - diff --git a/docs/wikidocs/HttpSession in Action.html b/docs/wikidocs/HttpSession in Action.html deleted file mode 100644 index cf3aa1f00..000000000 --- a/docs/wikidocs/HttpSession in Action.html +++ /dev/null @@ -1,32 +0,0 @@ - - - WebWork - - HttpSession in Action - - - - - - - - - - -
-

Use this if you want to be web agnostic (independent of the servlet API)

-
-
ActionContext.getContext().getSession()
-
- -

The following gives you the same thing as above:

-
-
ServletActionContext.getRequest().getSession()
-
- -

Note: Be sure not to use ActionContext.getContext() in the constructor of your action since the values may not be set up already (returning null for getSession()).

- -

If you really need to get access to the HttpSession, use the ServletConfigInterceptor (see Interceptors).

- -
- - diff --git a/docs/wikidocs/I18n Interceptor.html b/docs/wikidocs/I18n Interceptor.html deleted file mode 100644 index 27c7cda47..000000000 --- a/docs/wikidocs/I18n Interceptor.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork - - Interceptor - - - - - - - - - - -
- -

An interceptor that handles setting the locale specified in a session as the locale for the current action request. - In addition, this interceptor will look for a specific HTTP request parameter and set the locale to whatever value is - provided. This means that this interceptor can be used to allow for your application to dynamically change the locale - for the user's session. This is very useful for applications that require multi-lingual support and want the user to - be able to set his or her language preference at any point. The locale parameter is removed during the execution of - this interceptor, ensuring that properties aren't set on an action (such as request_locale) that have no typical - corresponding setter in your action.

- -

For example, using the default parameter name, a request to foo.action?request_locale=en_US, then the - locale for US English is saved in the user's session and will be used for all future requests.

- - -

Parameters

- - -

    - -

  • parameterName (optional) - the name of the HTTP request parameter that dictates the locale to switch to and save - in the session. By default this is request_locale
  • - -

  • attributeName (optional) - the name of the session key to store the selected locale. By default this is - WW_TRANS_I18N_LOCALE
  • - -

- - -

Extending the Interceptor

- - -

There are no known extensions points for this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="i18n"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/IDEA Plugin.html b/docs/wikidocs/IDEA Plugin.html deleted file mode 100644 index a807603d2..000000000 --- a/docs/wikidocs/IDEA Plugin.html +++ /dev/null @@ -1,34 +0,0 @@ - - - WebWork - - Plugin - - - - - - - - - - -
-
This document is an MRD (Marketing Requirements Document) for the ideal vision of what the WebWork IDEA Plugin will be. At this point, no WebWork IDEA plugin has been created. When it is created, it will be based on EclipseWork.
- -

A key success for WebWork is its ability to provide tools that make developers lives easier. This isn't just some configuration editor, but rather a complex integrated environment where developers can write their code, build JSPs, and have much of the redundant work related to WebWork automated or assisted. WebWork's IDEA integration enables developers to not only write WebWork-based applications faster, but also with much higher quality.

- -

The IDEA Plugin has the following features:

-
    -
  • Configuration browser - you can browse namespaces and see both actions and views as well as their relationships. The browser lets you avoid hunting through xwork.xml and all the included files and instead presents a logical view of all your actions and their associated views. The browser also allows for very quick access to an action if you know it by name (and optional namespace).
  • -
  • Find by usages - finding usages on a field will show you were all the views that use that field are located.
  • -
  • Refactoring support - similar to find by usages, it is very useful to rename a field in an action (or even an object that is someone in the stack/object graph) and know that all the views that reference it have been updated as well
  • -
  • Internationalization support - you can select text in a JSP or other views and automatically extract it in to the a choice of the correct resource bundles (package.properties, Action.properties, etc). Conversely, you can press Ctrl-Q on <ww:text/> tags to see what the actual text for a particular i18n key are.
  • -
  • Error reporting - the plugin is excellent at notifying you of errors before you deploy your application. Since many aspects of WebWork are based around loosely coupled and dynamic interactions, the plugin helps you see when you've had a typo such as "doccument" instead of "document". It highlights errors in OGNL expressions, i18n locations, and configuration mixups automatically for you. When these errors happen the plugin also gives you a choice of possible fixes (Ctrl-Enter).
  • -
  • Code completion - when using WebWork tags such as <ww:select value="..."/> pressing Ctrl-Space pops up a code completion dialog that introspects through all the available properties that are in the value stack, including those in your action.
  • -
  • OGNL expression evaluator - When you're editing a page you should be able to have an OGNL expression evaluator that can execute your action and use its properties to evaluate OGNL expressions to show you what you get.
  • -
- - -
- - diff --git a/docs/wikidocs/Include configuration.html b/docs/wikidocs/Include configuration.html deleted file mode 100644 index 5f9316f0a..000000000 --- a/docs/wikidocs/Include configuration.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork - - Include configuration - - - - - - - - - - -
-

Description

- -

To make it easy to manage large scale development (lots of actions + configuration), WebWork allows you to include other configuration files from xwork.xml :

- -
-
<xwork>
-    <include file="webwork-default.xml"/>
-    <include file="user.xml"/>
-    <include file="shoppingcart.xml"/>
-    <include file="product.xml"/>
-    ....
-</xwork>
-
- -

The included files must be the same format as xwork.xml (with the doctype and everything) and be placed on classpath (usually in /WEB-INF/classes or jar files in /WEB-INF/lib).

- - -

Most of the content here provided by Matt Dowell <matt.dowell@notiva.com>

- -
- - diff --git a/docs/wikidocs/IntRangeFieldValidator Annotation.html b/docs/wikidocs/IntRangeFieldValidator Annotation.html deleted file mode 100644 index 2f1affd62..000000000 --- a/docs/wikidocs/IntRangeFieldValidator Annotation.html +++ /dev/null @@ -1,91 +0,0 @@ - - - WebWork - - IntRangeFieldValidator Annotation - - - - - - - - - - -
-

IntRangeFieldValidator Annotation

- -

This validator checks that a numeric field has a value within a specified range. -If neither min nor max is set, nothing will be done.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
min no   Integer property. The minimum the number must be.
max no   Integer property. The maximum number can be.

- -

If neither min nor max is set, nothing will be done.

- -

The values for min and max must be inserted as String values so that "0" can be handled as a possible value.

- -

Examples

- -
-
@IntRangeFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true, min = "0", max = "42")
-
- - -
- - diff --git a/docs/wikidocs/Interceptor Configuration.html b/docs/wikidocs/Interceptor Configuration.html deleted file mode 100644 index 6e14fb031..000000000 --- a/docs/wikidocs/Interceptor Configuration.html +++ /dev/null @@ -1,55 +0,0 @@ - - - WebWork - - Interceptor Configuration - - - - - - - - - - -
-

Description

- -

Interceptors allow you to define code to be executed before and/or after the execution of an action. Interceptors can be a powerful tool when writing web applications. Some of the most common implementations of an Interceptor might be:

-
    -
  • Security Checking (ensuring the user is logged in)
  • -
  • Trace Logging (logging every action)
  • -
  • Bottleneck Checking (start a timer before and after every action, to check bottlenecks in your application)
    -You can also chain Interceptors together to create an interceptor stack. If you wanted to do a login check, security check, and logging all before an Action call, this could easily be done with an interceptor package.
  • -
- - -

Intercepters must first be defined (to give name them) and can be chained together as a stack:

- -
-
<interceptors>
-  <interceptor name="security" class="com.mycompany.security.SecurityInterceptor"/>
-  <interceptor-stack name="defaultComponentStack">
-    <interceptor-ref name="component"/>
-    <interceptor-ref name="defaultStack"/>
-  </interceptor-stack>
-</interceptors>
-
- -

To use them in your actions:

-
-
<action name="VelocityCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
-   <result name="success">...</result>
-   <interceptor-ref name="defaultComponentStack"/>
-</action>
-
- -

NOTE: Reference name can be either the name of the interceptor or the name of a stack

- -

For more details, see Interceptors reference.

- -

Most of the content here provided by Matt Dowell <matt.dowell@notiva.com>

- -
- - diff --git a/docs/wikidocs/Interceptor Order.html b/docs/wikidocs/Interceptor Order.html deleted file mode 100644 index 3031fa745..000000000 --- a/docs/wikidocs/Interceptor Order.html +++ /dev/null @@ -1,51 +0,0 @@ - - - WebWork - - Interceptor Order - - - - - - - - - - -
-

Interceptors provide an excellent means to wrap before/after processing. The concept reduces code duplication (think AOP).

- -

Order of interceptors...

- -
-
<interceptor-stack name="xaStack"> 
-  <interceptor-ref name="thisWillRunFirstInterceptor"/>
-  <interceptor-ref name="thisWillRunNextInterceptor"/>
-  <interceptor-ref name="followedByThisInterceptor"/>
-  <interceptor-ref name="thisWillRunLastInterceptor"/>
-</interceptor-stack>
-
- - -

Note that some interceptors will interrupt the stack/chain/flow... so the order is very important.

- -

Iterceptors implementing com.opensymphony.xwork.interceptor.PreResultListener will run after the Action executes its action method but before the Result executes

- -
-
thisWillRunFirstInterceptor
-  thisWillRunNextInterceptor
-    followedByThisInterceptor
-      thisWillRunLastInterceptor
-        MyAction1
-        MyAction2 (chain)
-        MyPreResultListener  
-        MyResult (result)
-      thisWillRunLastInterceptor
-    followedByThisInterceptor
-  thisWillRunNextInterceptor
-thisWillRunFirstInterceptor
-
- -
- - diff --git a/docs/wikidocs/Interceptors.html b/docs/wikidocs/Interceptors.html deleted file mode 100644 index 11ebc9fcc..000000000 --- a/docs/wikidocs/Interceptors.html +++ /dev/null @@ -1,293 +0,0 @@ - - - WebWork - - Interceptors - - - - - - - - - - -
-

See Interceptor Configuration for basic information about how interceptors are configured.

- -

Overview

- - -

An interceptor is a stateless class that follows the interceptor pattern, as -found in {@link javax.servlet.Filter} and in AOP languages.

- -

- -

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.

- -

- -

Interceptors must be stateless and not assume that a new instance will be created for each request or Action. -Interceptors may choose to either short-circuit the ActionInvocation execution and return a return code -(such as com.opensymphony.xwork.Action#SUCCESS), or it may choose to do some processing before -and/or after delegating the rest of the procesing using ActionInvocation#invoke().

- -


- -

Webwork & XWork Interceptors

- -

Interceptor classes are also defined using a key-value pair specified in the xwork configuration file. The names specified below come specified in webwork\-default.xml. 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 <interceptors> tag.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Interceptor Name Description
Alias Interceptor alias Converts similar parameters that may be named differently between requests.
Chaining Interceptor chain Makes the previous action's properties available to the current action. Commonly used together with <result type="chain"> (in the previous action).
Component Interceptor component Enables and makes the components available to the Actions. Refer to components.xml
Conversion Error Interceptor conversionError adds conversion errors from the ActionContext to the Action's field errors
Create Session Interceptor createSession create an HttpSession automatically, usefull with certain interceptor (eg. TokenInterceptor) when an HttpSession is required in order to work properly
Execute and Wait Interceptor execAndWait an interceptor that executes the action in the background and then sends the user off to an intermediate waiting page.
Exception Interceptor exception Maps exceptions to a result.
File Upload Interceptor fileUpload an interceptor that adds easy access to file upload support. See the javadoc for more info
I18n Interceptor i18n remembers the locale selected for a user's session
Logger Interceptor logger Outputs the name of the action
Model Driven Interceptor model-driven If the action implements ModelDriven, pushes the getModel() result onto the valuestack.
Parameters Interceptor params Sets the request parameters onto the action.
Prepare Interceptor prepare If the action implements Preparable, calls its prepare() method.
Scope Interceptor scope simple mechanism for storing action state in the session or application scope
Servlet Config Interceptor servlet-config Give access to HttpServletRequest and HttpServletResponse (think twice before using this since this ties you to the Servlet api)
Static Parameters Interceptor static-params Sets the xwork.xml defined parameters onto the action. These are the <param> tags that are direct children of the <action> tag.
Timer Interceptor timer Outputs how long the action (including nested interceptors and view) takes to execute
Token Interceptor token Checks for valid token presence in action, prevents duplicate form submission
Token Session Interceptor token-session Same as above, but storing the submitted data in session when handed an invalid token
Validation Interceptor validation Performs validation using the validators defined in {Action}-validation.xml
Workflow Interceptor workflow Calls the validate method in your action class. If action errors created then it returns the INPUT view.
Parameter Filter Interceptor N/A Removes parameters from the list of those available to actions etc.
- - -

Method Filtering

- - -

An abstract Interceptor that is applied to selectively according -to specified included/excluded method lists.

- -

- -

Setable parameters are as follows:

- -

    -
  • excludeMethods - methods name to be excluded
  • -
  • includeMethods - methods name to be included
  • -

- -

- -

NOTE: If method name are available in both includeMethods and -excludeMethods, it will still be considered as an included method. In short -includeMethods takes precedence over excludeMethods.

- -

- -

Interceptors that extends this capability would be :-

- -

    -
  • TokenInterceptor
  • -
  • TokenSessionStoreInterceptor
  • -
  • DefaultWorkflowInterceptor
  • -
  • ValidationInterceptor
  • -

- - - -

Interceptor Parameter Overriding

- - -

Interceptor's parameter could be overriden through the following ways :-

- -

- -

Method 1: -

-<action name="myAction" class="myActionClass">
-  <interceptor-ref name="exception"/>
-    <interceptor-ref name="alias"/>
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="servlet-config"/>
-    <interceptor-ref name="prepare"/>
-    <interceptor-ref name="i18n"/>
-    <interceptor-ref name="chain"/>
-    <interceptor-ref name="model-driven"/>
-    <interceptor-ref name="fileUpload"/>
-    <interceptor-ref name="static-params"/>
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="conversionError"/>
-    <interceptor-ref name="validation">
-      <param name="excludeMethods">myValidationExcudeMethod</param>
-    </interceptor-ref>
-    <interceptor-ref name="workflow">
-      <param name="excludeMethods">myWorkflowExcludeMethod</param>
-    </interceptor-ref>
-</action>
-

- -

Method 2: -

-<action name="myAction" class="myActionClass">
-  <interceptor-ref name="defaultStack">
-    <param name="validator.excludeMethods">myValidationExcludeMethod</param>
-    <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
-  </interceptor-ref>
-</action>
-

- -

- -

In the first method, the whole default stack is copied and the parameter then -changed accordingly.

- -

- -

In the second method, the refer to an existing -interceptor-stack, namely default-stack in this example, and override the validator -and workflow interceptor excludeMethods typically in this case. Note that in the - tag, the name attribute contains a dot (.) the word before the dot(.) -specifies the interceptor name whose parameter is to be overriden and the word after -the dot (.) specifies the parameter itself. Essetially it is as follows :-

- -

-   <interceptor-name>.<parameter-name>
-

- -

Note also that in this case the name attribute -is used to indicate an interceptor stack which makes sense as if it is refering -to the interceptor itself it would be just using Method 1 describe above.

- - -

Order of Interceptor Execution

- -

Interceptors provide an excellent means to wrap before/after processing. The concept reduces code duplication (think AOP).

-
-
<interceptor-stack name="xaStack">
-  <interceptor-ref name="thisWillRunFirstInterceptor"/>
-  <interceptor-ref name="thisWillRunNextInterceptor"/>
-  <interceptor-ref name="followedByThisInterceptor"/>
-  <interceptor-ref name="thisWillRunLastInterceptor"/>
-</interceptor-stack>
-
-

Note that some interceptors will interrupt the stack/chain/flow... so the order is very important.

- -

Interceptors implementing com.opensymphony.xwork.interceptor.PreResultListener will run after the Action executes its action method but before the Result executes

-
-
thisWillRunFirstInterceptor
-  thisWillRunNextInterceptor
-    followedByThisInterceptor
-      thisWillRunLastInterceptor
-        MyAction1
-        MyAction2 (chain)
-        MyPreResultListener
-        MyResult (result)
-      thisWillRunLastInterceptor
-    followedByThisInterceptor
-  thisWillRunNextInterceptor
-thisWillRunFirstInterceptor
-
- -
- - diff --git a/docs/wikidocs/Internationalization.html b/docs/wikidocs/Internationalization.html deleted file mode 100644 index 8f711c535..000000000 --- a/docs/wikidocs/Internationalization.html +++ /dev/null @@ -1,112 +0,0 @@ - - - WebWork - - Internationalization - - - - - - - - - - -
-

Description

- -

WebWork supports internationalization (in short, i18n) in two different places: the UI tags and the action/field error messages.

- - - -

Resource Bundle Search Order

- -

Resource bundles are searched in the following order:

-

-

    -
  1. ActionClass.properties
  2. -
  3. BaseClass.properties (all the way to Object.properties)
  4. -
  5. Interface.properties (every interface and sub-interface)
  6. -
  7. ModelDriven's model (if implements ModelDriven), for the model object repeat from 1
  8. -
  9. package.properties (of the directory where class is located and every parent directory all the way to the root directory)
  10. -
  11. search up the i18n message key hierarchy itself
  12. -
  13. global resource properties (webwork.custom.i18n.resources) defined in webwork.properties
  14. -
-

- -

For more information, checkout the LocalizedTextUtil class.

- -
Package Hierarchy
-

To clarify #5, while traversing the package hierarchy, WW will look for a file package.properties:

-com/
-  acme/
-    package.properties
-    actions/
-      package.properties
-      FooAction.java
-      FooAction.properties
-

-If FooAction.properties does not exist, com/acme/action/package.properties will be searched for, if -not found com/acme/package.properties, if not found com/package.properties, etc. -

- - -

Examples

- -

Using getText()

- -

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):

-
-
<ww:property value="getText('some.key')" />
-
- - -

Text Tag

- -

You may also use the text tag:

-
-
<ww:text name="some.key" />
-
- - -

I18n Tag

- -

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.

-
-
<ww:i18n name="some.package.bundle" >
-     <ww:text name="some.key" />
-</ww:i18n>
-
- -

 

-Internationalization in SiteMesh decorators is possible, but there are a few quirks about it. Check out the SiteMesh page to learn how to be integrate WebWork and SiteMesh, including integration tips.

- - - -

I18n Interceptor

- -

See I18n Interceptor for more info. It basically pushes a locale into the ActionContext map upon every request. Webwork (components, ActionSupport etc.) honours this and hence every i18n related aspect will used this locale. Its a pretty elegant way of changing locale upon request as well.

- - -

Global resource (webwork.custom.i18n.resources) in webwork.properties

- -

A global resource bundle could be specified through the 'webwork.custom.i18n.resources' property in -webwork.properties. The locale can be siwtched by 'webwork.locale' in the webwork.properties as well. -

- - -

Comparison with Struts

- -

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. WebWork, 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. -

- -
- - diff --git a/docs/wikidocs/Inversion of Control.html b/docs/wikidocs/Inversion of Control.html deleted file mode 100644 index 252efc8b8..000000000 --- a/docs/wikidocs/Inversion of Control.html +++ /dev/null @@ -1,43 +0,0 @@ - - - WebWork - - Inversion of Control - - - - - - - - - - -
-

What is Inversion of Control (IoC)?

- -

Inversion of control is a way to handle dependencies of objects. For an overview of of Inversion of Control (also referred to now as Dependency Injection), please read Martin Fowler's article on IoC.

- - -

Spring as recommended IoC Container

- -

Spring is, among other things, an Inversion of Control framework. As of WebWork 2.2, it is the recommended IoC container. A detailed description how Spring Integration works and how it is configured is found here.
-Besides Spring, there are numerous other containers available for you to use, such as Pico or the (deprecated) integrated XWork IoC container.

- - -

WebWork/XWork integrated IoC Container

- -
As of WebWork 2.2, the WebWork/XWork IoC container has been deprecated (though not removed) and the WebWork team recommends you use Spring for all your IoC needs
- -

In WebWork IoC, objects that are have their dependencies managed are called "components".

- - - - -
- - diff --git a/docs/wikidocs/IoC Configuration.html b/docs/wikidocs/IoC Configuration.html deleted file mode 100644 index 900efaec4..000000000 --- a/docs/wikidocs/IoC Configuration.html +++ /dev/null @@ -1,104 +0,0 @@ - - - WebWork - - Configuration - - - - - - - - - - -
-
These documents are out of date. As of WebWork 2.2, the WebWork IoC container has been deprecated (though not removed) and the WebWork team recommends you use Spring for all your IoC needs
- -

Configuration - web.xml

- -

To configure WebWork's component management, the following lines must be added in the appropriate places to web.xml:

- -
-
<filter>
-    <filter-name>container</filter-name>
-    <filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
-</filter>
-
-<filter-mapping>
-   <filter-name>container</filter-name>
-   <url-pattern>*.action</url-pattern> <!-- modify appropriately -->
-</filter-mapping>
-
-<!-- Optionally you may instead apply the filter to EVERY URI instead of just *.action.  --> 
-<!-- You might want to do this for example:  -->
-<!-- * your page flow goes to a jsp directly (as opposed to only *.action URIs) -->
-<!-- * the jsp has an action in it to be run with the ww:action tag -->
-<!-- * the action in the jsp implements any enabler interfaces to get components served to it -->
-<!-- The reason: (Per Patrick Lightbody) -->
-<!-- "The components work by looking for a ComponentManager in the request -->
-<!-- attributes. It gets placed there by a filter. If it is on *.action and a -->
-<!-- request comes in through a JSP, the filter won't be applied and it will -->
-<!-- never work." -->
-<!-- The overhead in doing this is small, so don't worry overly much about the  -->
-<!-- performance of this. -->
-<!-- <filter-mapping> -->
-<!--    <filter-name>container</filter-name> -->
-<!--    <url-pattern>*</url-pattern>  -->
-<!-- </filter-mapping> -->
-
-<listener>
-    <listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
-</listener>
-
-<listener>
-    <listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
-</listener>
-
- -

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's component management to function correctly.

- -

Configuration - xwork.xml

- -

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 <interceptors> block of xwork.xml as follows:

- -
-
<interceptor name="component"
-        class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
-
- -

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.)
-If you want to apply IoC to objects other than actions or other components, you will need to use the ComponentManager object directly.

- -

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.

- -

Configuration - components.xml

- -

The components.xml file is used to specify the components that are to be available. The components specified here are loaded into XWork'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).
-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:

- -
-
<components>
-    <component>
-        <scope>session</scope>
-        <class>com.opensymphony.webwork.example.counter.Counter</class>
-        <enabler>com.opensymphony.webwork.example.counter.CounterAware</enabler>
-    </component>
-</components>
-
- -

Each component must have the following three attributes:

- -
    -
  • scope: Valid values are application, session and request. This determines the component'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.
  • -
  • class: This specifies the component'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.
  • -
  • enabler: Any actions that are an instanceof the enabler class or interface will be passed an instance of the component.
  • -
- - - -

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.

- -
- - diff --git a/docs/wikidocs/IoC Overview.html b/docs/wikidocs/IoC Overview.html deleted file mode 100644 index c634d7bfe..000000000 --- a/docs/wikidocs/IoC Overview.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork - - Overview - - - - - - - - - - -
-
These documents are out of date. As of WebWork 2.2, the WebWork IoC container has been deprecated (though not removed) and the WebWork team recommends you use Spring for all your IoC needs
- -

Overview

- -

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'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 enabler) rather than said Object's needing to obtain the resource itself.

- -

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 "setComponent(ComponentObject r);" 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 enablers to pass components.

- -

Why IoC?

- -

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.

- -

Traditionally when implementing services you are probably used to following steps similar to these:

-
    -
  1. Write the component (eg an ExchangeRateService)
  2. -
  3. Write the client class (eg an XWork action)
  4. -
  5. Write a registry class that holds the component object (eg Registry)
  6. -
  7. Write code that gives the component object to the registry (eg Registry.registerService(new MyExchangeRateService()))
  8. -
  9. Use the registry to obtain the service from your client class (eg ExchangeRateService ers = Registry.getExchangeRateService())
  10. -
  11. Make calls to the component from the client class (eg String baseCurrencyCode = ers.getBaseCurrency())
  12. -
- - -

Using IoC, the process is reduced to the following:

-
    -
  1. Write the component class (eg an ExchangeRateService)
  2. -
  3. Register the component class with XWork (eg componentManager.addEnabler(MyExchangeRateService, ExchangeRateAware))
  4. -
  5. Write the client class, making sure it implements the enabling interface (eg an XWork action that implements ExchangeRateAware)
  6. -
  7. Access the component instance directly from your client action (eg String baseCurencyCode = ers.getBaseCurrency())
  8. -
- - -

More advantages of Inversion of Control are the following:

-
    -
  1. 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.
  2. -
  3. 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.
  4. -
  5. 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).
  6. -
  7. 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 'just use that one class'.
  8. -
  9. Adheres to Law of Demeter. Some people think this is silly, but in practise I'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.
  10. -
  11. Allows context to be isolated and explicitly passed around. ThreadLocals may be ok in a web-app, but they aren't well suited for high concurrency async applications (such as message driven applications).
  12. -
- - -
- - diff --git a/docs/wikidocs/Iterator tag examples.html b/docs/wikidocs/Iterator tag examples.html deleted file mode 100644 index cfaea1ebf..000000000 --- a/docs/wikidocs/Iterator tag examples.html +++ /dev/null @@ -1,109 +0,0 @@ - - - WebWork - - Iterator tag examples - - - - - - - - - - -
-

This follows on from Iteration Tags which you should read first, but beware of references to '0' and 'that'; what you really want in WW2 is 'top', as illustrated below. (I finally worked this out from the source code - hopefully this page means you won't have to.)

- -

Referencing the current value

- -

The simple examples print out values from the list using the property tag, which uses the value at the top of the stack by default:

- -
-
Days:
-<ul>
-<ww:iterator value="days">
-    <li><ww:property/>
-</ww:iterator>
-</ul>
-
-
- -

But if you're doing anything other than print the value, you probably need to refer to it specifically. Do this:

- -
-
Most days:
-<ul>
-<ww:iterator value="days">
-    <ww:if test="top != 'Monday'">
-        <li><ww:property/>
-    </ww:if>
-</ww:iterator>
-</ul>
-
-
- -

Iterating over a list of objects

- -
-
<ww:iterator value="employees">
-    <ww:property value="name"/> is the <ww:property value="jobTitle"/><br>
-</ww:iterator>
-
-
- -

For 'name' and 'jobTitle' you could be more explicit and write 'top.name' and 'top.jobTitle', as 'top' refers to the object on the top of the stack. It's not necessary here, but it is in the next example.

- -

Iterating over a list of lists

- -
-
<table>
-    <ww:iterator value="grid">
-        <tr>
-        <ww:iterator value="top">
-            <td><ww:property/></td>
-        </ww:iterator>
-        </tr>
-    </ww:iterator>
-</table>
-
-
- -

The trick here is to use 'top' as the value for the inner iterator. This example probably uses a two-dimensional array, but you can use the pattern for any list of lists.

- -

A more complex example

- -

In this example, 'countries' is a list of country objects, each of which has a name and a list of cities. Each city has a name.

- -
-
<ww:iterator value="countries">
-    <ww:iterator value="cities">
-        <ww:property value="name"/>, <ww:property value="[1].name"/><br>
-    </ww:iterator>
-</ww:iterator>
-
-
- -

The output looks like

- -
-
Wellington, New Zealand
-Auckland, New Zealand
-Moscow, Russia
-Glasgow, Scotland
-Edinburgh, Scotland
-Stockholm, Sweden
-
-
- -

Both the country and city objects have a 'name' property. As you'd expect, the reference to 'name' on its own gives you the city name. To access the country name - effectively "hidden" by the city name - we refer to a specific position on the stack: '1'. The top of the stack, position 0, contains the current city, pushed on by the inner iterator; position 1 contains the current country, pushed there by the outer iterator.

- -

Actually, as Patrick points out in his comment on Iteration Tags, the 'n' notation refers to a sub-stack beginning at position n, not just the object at position n. Thus '0' is the whole stack and '1' is everything except the top object. In our example, we could have been more specific about getting the country name and said '1.top.name'.

- - -

Misc

-

If no value is specified, iterator will try to grap object from the 'top' of the stack. If it is not iterable, ClassCastException will be thrown in the process. @see com.opensymphony.webwork.views.jsp.IteratorTag#doStartTag

- -
- - diff --git a/docs/wikidocs/J2SE 5 Support.html b/docs/wikidocs/J2SE 5 Support.html deleted file mode 100644 index bd1471760..000000000 --- a/docs/wikidocs/J2SE 5 Support.html +++ /dev/null @@ -1,208 +0,0 @@ - - - WebWork - - 5 Support - - - - - - - - - - -
-

Using J2SE 5 ("Tiger") support with WebWork

-
Work in progress

-This is a work in progress and not yet finished! More complex examples will follow. For now, have a look at the unit tests within the xwork-tiger project path.
-

To use J2SE 5 support with WebWork, you have to add xwork-tiger.jar to your classpath.
-The xwork-tiger.jar can be obtained via the ivy repository and is located in the lib/tiger directory.

- -

Interceptor Annotations

- -

To use these annotations, you have to specify the AnnotationWorkflowInterceptor to your interceptor stack.

- - - - - - - - - - - - - - - - - -
Annotation Description
After Annotation Marks a action method that needs to be executed before the result.
Before Annotation Marks a action method that needs to be executed before the main action method.
BeforeResult Annotation Marks a action method that needs to be executed before the result.
- -

Validation Annotations

- -

If you want to use annotation based validation, you have to annotate the class or interface with Validation Annotation.

- -

These are the standard validator annotations that come with XWork-tiger:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Annotation Description
ConversionErrorFieldValidator Annotation Checks if there are any conversion errors for a field.
DateRangeFieldValidator Annotation Checks that a date field has a value within a specified range.
DoubleRangeFieldValidator Annotation Checks that a double field has a value within a specified range.
EmailValidator Annotation Checks that a field is a valid e-mail address.
ExpressionValidator Annotation Validates an expression.
FieldExpressionValidator Annotation Uses an OGNL expression to perform its validator.
IntRangeFieldValidator Annotation Checks that a numeric field has a value within a specified range.
RegexFieldValidator Annotation Validates a regular expression for a field.
RequiredFieldValidator Annotation Checks that a field is non-null.
RequiredStringValidator Annotation Checks that a String field is not empty.
StringLengthFieldValidator Annotation Checks that a String field is of the right length.
StringRegexValidator Annotation  
UrlValidator Annotation Checks that a field is a valid URL.
Validation Annotation Marker annotation for validation at Type level.
Validations Annotation Used to group validation annotations.
VisitorFieldValidator Annotation  
CustomValidator Annotation Use this annotation for your custom validator types.
- -

Type Conversion Annotations

- -

If the xwork-tigerjar is added to the classpath, you will directly have type conversion support for Maps and Collections using generics.

- -

In short, instead of specifying the types found in collections and maps as documented in Type Conversion, the collection's generic type is used. This means you most likely don't need any ClassName-conversion.properties files.

- -

If you want to use annotation based type conversion, you have to annotate the class or interface with the Conversion Annotation.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Annotation Description
Conversion Annotation Marker annotation for type conversions at Type level.
CreateIfNull Annotation For Collection and Map types: Create the types within the Collection or Map, if null.
Element Annotation For Generic types: Specify the element type for Collection types and Map values.
Key Annotation For Generic types: Specify the key type for Map keys.
KeyProperty Annotation For Generic types: Specify the key property name value.
TypeConversion Annotation Used for class and application wide conversion rules.
- -

Create ClassName-conversion.properties via "ant apt" target

- -

This is an example for the apt ant target:

-
-
<target name="apt">
-        <mkdir dir="${build}/generated"/>
-
-        <path id="classpath">
-            <pathelement path="${basedir}/build/java"/>
-            <pathelement path="${basedir}/build/test"/>
-            <!-- xwork.jar and xwork-tiger.jar must be in one of the following lib dirs -->
-            <fileset dir="${basedir}/lib/build" includes="*.jar"/>
-            <fileset dir="${basedir}/lib/default" includes="*.jar"/>
-            <fileset dir="${basedir}/lib/spring" includes="*.jar"/>
-        </path>
-
-        <property name="pclasspath" refid="classpath"/>
-
-        <!-- Change the includes attribute value to match your annotated java files -->
-        <fileset id="sources" dir="." includes="src/test/**/*.java" />
-
-        <pathconvert pathsep=" " property="sourcefiles" refid="sources"/>
-
-        <echo>
-
-            CLASSPATH ${pclasspath}
-
-            SOURCES: ${sourcefiles}
-
-        </echo>
-
-        <exec executable="apt" >
-            <arg value="-s"/>
-            <arg value="${build}/generated"/>
-            <arg value="-classpath"/>
-            <arg pathref="classpath"/>
-            <arg value="-nocompile"/>
-            <arg value="-factory"/>
-            <arg value="com.opensymphony.xwork.apt.XWorkProcessorFactory"/>
-            <arg line="${sourcefiles}"/>
-        </exec>
-    </target>
-
- -
- - diff --git a/docs/wikidocs/JFreeChartResult.html b/docs/wikidocs/JFreeChartResult.html deleted file mode 100644 index 3a51ae7a0..000000000 --- a/docs/wikidocs/JFreeChartResult.html +++ /dev/null @@ -1,129 +0,0 @@ - - - WebWork - - JFreeChartResult - - - - - - - - - - -
-

Intro

-

I am rendering a chart to the output stream. Instead of streaming it directly to the response.out, I create a ChartResult, and let webwork do the chaining for me.

- -

I generate the chart in one class, and I render it out in another class, effectively decoupling the view from the actions. You can easily render it out to a file or some view other than a web response.out if you wish.

-

Configuration

-

xwork.xml - result-types definitions

-
-
<result-types>
-   <result-type name="chart" class="myapp.webwork.extensions.ChartResult"/>
-</result-types>
-
-

xwork.xml - action definitions

-
-
<action name="viewModerationChart" class="myapp.webwork.actions.ViewModerationChartAction"> 
-  <result name="success" type="chart"> 
-    <param name="width">400</param>
-    <param name="height">300</param> </result>
-</action>
-
-

Source Codes

-

My result class searches for a "chart" in the ValueStack and renders it out...

-
-
public class ChartResult implements Result {
-
-	private int width;
-	private int height;
-
-	public void execute(ActionInvocation invocation) throws Exception {
-		JFreeChart chart =
-			(JFreeChart) invocation.getStack().findValue("chart");
-		HttpServletResponse response = ServletActionContext.getResponse();
-		OutputStream os = response.getOutputStream();
-		ChartUtilities.writeChartAsPNG(os, chart, width, height);
-		os.flush();
-	}
-
-	public void setHeight(int height) {
-		this.height = height;
-	}
-
-	public void setWidth(int width) {
-		this.width = width;
-	}
-
-}
-
- -

My action class creates the JFreeChart to render...

-
-
public class ViewModerationChartAction extends ActionSupport {
-
-	private JFreeChart chart;
-
-	public String execute() throws Exception {
-		// chart creation logic...
-		XYSeries dataSeries = new XYSeries(new Integer(1)); //pass a key for this serie
-		for (int i = 0; i <= 100; i++) {
-			dataSeries.add(i, RandomUtils.nextInt());
-		}
-		XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries);
-
-		ValueAxis xAxis = new NumberAxis("Raw Marks");
-		ValueAxis yAxis = new NumberAxis("Moderated Marks");
-
-		// set my chart variable
-		chart =
-			new JFreeChart(
-				"Moderation Function",
-				JFreeChart.DEFAULT_TITLE_FONT,
-				new XYPlot(
-					xyDataset,
-					xAxis,
-					yAxis,
-					new StandardXYItemRenderer(StandardXYItemRenderer.LINES)),
-				false);
-		chart.setBackgroundPaint(java.awt.Color.white);
-
-		return super.SUCCESS;
-	}
-
-	public JFreeChart getChart() {
-		return chart;
-	}
-
-}
-
-

Explaination

-
-
public JFreeChart getChart() {
-	return chart;
-}
-
-

makes the chart available on the ValueStack, which the result gets via

-
-
JFreeChart chart = (JFreeChart) invocation.getStack().findValue("chart");
-
- -

From what I can deduce, the webwork pulls in the height and width variables from the xwork.xml definitions for that particular action...

-
-
<param name="width">400</param>
-<param name="height">300</param>
-
-

Suggestions for the next developer...

-

Currently the "chart" property is hardcoded. There should be a better way of transferring data from the Action to the Result, via some externally defined variable or something.

- -

As mentioned by John Patterson (mailing list), the Action is still dependant on a JFreeChart Chart class. This can be improved. The seperation between Action and View can be made cleaner. A chart-agonistic List or Array can be used as the data, and the configuration of the chart details (font, axis, etc...) be done via the result properties in the xwork.xml.

- -

But hey, the above works for now. Any suggestions are welcome.

-

Creating charts via CeWolf directly in Velocity templates

-

See WW:CeWolf charts using Velocity templates.

- -
- - diff --git a/docs/wikidocs/JSP Expression Language Comparison with WebWork 1.x.html b/docs/wikidocs/JSP Expression Language Comparison with WebWork 1.x.html deleted file mode 100644 index 8f90a6d43..000000000 --- a/docs/wikidocs/JSP Expression Language Comparison with WebWork 1.x.html +++ /dev/null @@ -1,78 +0,0 @@ - - - WebWork - - Expression Language Comparison with WebWork 1.x - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SituationPrevious (WW-1.4)Current (WW-2.1)
Referring to an object in the PageContext scope@itemIdOrName#attr['itemIdOrName']
Referring to an object in the Request scopeitemIdOrNameSame, but use #request['itemIdOrName'] if nested in an iteration.
Referring to an object in the Session scope@itemIdOrName#session['itemIdOrName']
Referring to an object in the Application scope@itemIdOrName#application['itemIdOrName']
Property Settersfoo/bar translates to getFoo().setBar()foo.bar translates to getFoo().setBar()
Property Gettersfoo/bar translates to getFoo().getBar()foo.bar translates to getFoo().getBar()
Boolean/boolean Property Gettersfoo/bar translates to getFoo().getBar() if bar is java.lang.Boolean, if primitive bar translates to getFoo().isBar() Same, except uses dot notation instead of a slash (i.e. foo.bar)
Collections as PropertiesN/ACollections (including arrays) are similar to other objects, except they allow indexing: foo.bar[indexOrKeyName] translates to getFoo().getBar().get(indexOrKeyName)
curly braces - {}, evaluates contents of braces first, and use the result as the property to then evaluate. <webwork:property value="{'name'}"/> translates to getName() on the curent object.No longer used.
Reference a static variable@com.fully.qualified.class.name.TheActualClass@STATIC_ATTRIBUTE_NAMEStill in use.
- -

Originally written by Jay Bose and sent to the mailing list

- -
- - diff --git a/docs/wikidocs/JSP Tags.html b/docs/wikidocs/JSP Tags.html deleted file mode 100644 index 2fa86a7c1..000000000 --- a/docs/wikidocs/JSP Tags.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork - - Tags - - - - - - - - - - -
-

JSP tags are extensions of the generic Tags provided by WebWork. You can get started almost immediately by simply knowing the generic structure in which the tags can be accessed: <ww:xxx> ... </ww:xxx>, where xxx is any of the tags supported by WebWork.

- -

Tag Library Definition (TLD)

- -

The JSP TLD is included in webwork.jar, meaning you can define the TLD as explained in the web.xml documentation. Once you've done this, you you can add the following to your JSP:

- -
-
<%@ taglib prefix="ww" uri="webwork" %>
-
- -

Now you can use the tags, like so:

- -
-
<ww:iterator value="people">
-    <ww:property value="lastName"/>, <ww:property value="firstName"/>
-</ww:iterator>
-
- -
- - diff --git a/docs/wikidocs/JSP.html b/docs/wikidocs/JSP.html deleted file mode 100644 index d70699e4d..000000000 --- a/docs/wikidocs/JSP.html +++ /dev/null @@ -1,54 +0,0 @@ - - - WebWork - - JSP - - - - - - - - - - -
-

JSP support in WebWork is very easy: by default webwork\-default.xml configures the Dispatcher Result as the default result (see Result Types). This means any JSP 1.2+ container can work with WebWork immediately.

- -

Getting Started

- -

Because JSP support occurs through the Dispatcher Result, which is the default result type, you don't need to specify the type attribute when configuration xwork.xml:

- -
-
<action name="test" class="com.acme.TestAction">
-    <result name="success">test-success.jsp</result>
-</action>
-
- -

Then in test-success.jsp:

- -
-
<%@ taglib prefix="ww" uri="webwork" %>
-
-<html>
-<head>
-    <title>Hello</title>
-</head>
-<body>
-
-Hello, <ww:property value="name"/>
-
-</body>
-</html>
-
- -

Where name is a property on your action. That's it!

- -

Tag Support

- -

See the JSP Tags documentation for information on how to use the generic Tags provided by WebWork.

- - -
- - diff --git a/docs/wikidocs/JSTL.html b/docs/wikidocs/JSTL.html deleted file mode 100644 index 947eef30f..000000000 --- a/docs/wikidocs/JSTL.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - JSTL - - - - - - - - - - -
-

JSTL integration is built in to WebWork 2.2+ - there are no steps required to enable it. Simply refer to your JSTL expressions just as you would with a normal WebWork JSP tag, such as the property tag. This is accomplished a request wrapper called For more info, see the javadocs of the WebWorkRequestWrapper object:

- - -

All WebWork requests are wrapped with this class, which provides simple JSTL accessibility. This is because JSTL - works with request attributes, so this class delegates to the value stack except for a few cases where required to - prevent infinite loops. Namely, we don't let any attribute name with "#" in it delegate out to the value stack, as it - could potentially cause an infinite loop. For example, an infinite loop would take place if you called: - request.getAttribute("#attr.foo").

- - -
- - diff --git a/docs/wikidocs/JUnit.html b/docs/wikidocs/JUnit.html deleted file mode 100644 index b750cc439..000000000 --- a/docs/wikidocs/JUnit.html +++ /dev/null @@ -1,116 +0,0 @@ - - - WebWork - - JUnit - - - - - - - - - - -
-

There's a number of approaches you can take to unit-test your WebWork actions.

- -

The simplest is to instantiate your actions, call setters then execute(). This allows you to bypass all the complicated container setup.

- -

Taken from Petsoar:

-
-
package org.petsoar.actions.inventory;
-
-import com.mockobjects.constraint.IsEqual;
-import com.mockobjects.dynamic.C;
-import com.mockobjects.dynamic.Mock;
-import com.opensymphony.xwork.Action;
-import junit.framework.TestCase;
-import org.petsoar.pets.Pet;
-import org.petsoar.pets.PetStore;
-
-public class TestViewPet extends TestCase {
-    private Mock mockPetStore;
-    private ViewPet action;
-
-    protected void setUp() throws Exception {
-        mockPetStore = new Mock(PetStore.class);
-        PetStore petStore = (PetStore) mockPetStore.proxy();
-
-        action = new ViewPet();
-        action.setPetStore(petStore);
-    }
-
-    public void testViewPet() throws Exception {
-        Pet existingPet = new Pet();
-        existingPet.setName("harry");
-        existingPet.setId(1);
-
-        Pet expectedPet = new Pet();
-        expectedPet.setName("harry");
-        expectedPet.setId(1);
-
-        mockPetStore.expectAndReturn("getPet", C.args(new IsEqual(new Long(1))), existingPet);
-        action.setId(1);
-
-        String result = action.execute();
-
-        assertEquals(Action.SUCCESS, result);
-        assertEquals(expectedPet, existingPet);
-        mockPetStore.verify();
-    }
-
-    public void testViewPetNoId() throws Exception {
-        mockPetStore.expectAndReturn("getPet", C.ANY_ARGS, null);
-
-        String result = action.execute();
-
-        assertEquals(Action.ERROR, result);
-        assertEquals(1, action.getActionErrors().size());
-        assertEquals("Invalid pet selected.", action.getActionErrors().iterator().next());
-        assertNull(action.getPet());
-        mockPetStore.verify();
-    }
-
-    public void testViewPetInvalidId() throws Exception {
-        action.setId(-1);
-        testViewPetNoId();
-    }
-}
-
- -

Test interceptors and/or result types

- -

Check out the test suites in XWork/WebWork. These are pretty comprehensive and provide a good starting point. For example, this is how the ParametersInterceptor is tested:

- -
-
public void testDoesNotAllowMethodInvocations() {
-    Map params = new HashMap();
-    params.put("@java.lang.System@exit(1).dummy", "dumb value");
-
-    HashMap extraContext = new HashMap();
-    extraContext.put(ActionContext.PARAMETERS, params);
-
-    try {
-        ActionProxy proxy = ActionProxyFactory.getFactory().
-               createActionProxy("", MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, extraContext);
-        assertEquals(Action.SUCCESS, proxy.execute());
-
-        ModelDrivenAction action = (ModelDrivenAction) proxy.getAction();
-        TestBean model = (TestBean) action.getModel();
-
-        String property = System.getProperty("webwork.security.test");
-        assertNull(property);
-    } catch (Exception e) {
-        e.printStackTrace();
-        fail();
-    }
-}
-
- - -

Note: these are not the ONLY ways so make your own judgement.

- -
- - diff --git a/docs/wikidocs/JasperReports Result.html b/docs/wikidocs/JasperReports Result.html deleted file mode 100644 index 1e8e07fe4..000000000 --- a/docs/wikidocs/JasperReports Result.html +++ /dev/null @@ -1,81 +0,0 @@ - - - WebWork - - JasperReports Result - - - - - - - - - - -
- -

Generates a JasperReports report using the specified format or PDF if no - format is specified.

- - -

Parameters

- - -

    - -

  • location (default) - the location where the compiled jasper report -definition is (foo.jasper), relative from current URL.
  • - -

  • dataSource (required) - the Ognl expression used to retrieve the -datasource from the value stack (usually a List).
  • - -

  • parse - true by default. If set to false, the location param will -not be parsed for Ognl expressions.
  • - -

  • format - the format in which the report should be generated. Valid -values can be found in JasperReportConstants. If no format is -specified, PDF will be used.
  • - -

  • contentDisposition - disposition (defaults to "inline", values are -typically filename="document.pdf").
  • - -

  • documentName - name of the document (will generate the http header -Content-disposition = X; filename=X.[format]).
  • - -

  • delimiter - the delimiter used when generating CSV reports. By -default, the character used is ",".
  • - -

  • imageServletUrl - name of the url that, when prefixed with the -context page, can return report images.
  • - -

- -

-This result follows the same rules from WebWorkResultSupport. -Specifically, all parameters will be parsed if the "parse" parameter is not -set to false. -

- -

Examples

- -
-
<result name="success" type="jasper">
-  <param name="location">foo.jasper</param>
-  <param name="dataSource">mySource</param>
-  <param name="format">CSV</param>
-</result>
-
- -

or for pdf:

- -
-
<result name="success" type="jasper">
-  <param name="location">foo.jasper</param>
-  <param name="dataSource">mySource</param>
-</result>
-
- - -
- - diff --git a/docs/wikidocs/JasperReports.html b/docs/wikidocs/JasperReports.html deleted file mode 100644 index ff100be6b..000000000 --- a/docs/wikidocs/JasperReports.html +++ /dev/null @@ -1,364 +0,0 @@ - - - WebWork - - JasperReports - - - - - - - - - - -
-

Introduction

- - -

JasperReports (http://jasperreports.sourceforge.net) is one of the leading open-source java reporting libraries. It compiles .jrxml (XML source) to .jasper (=compiled version) files, which in turn can be transformed to several output types (PDF, CSV, XLS and HTML).

- -

In the following example, we will use Webwork to dynamically create a PDF with a list of persons. Our WW action will be used to create a List with objects, and our JasperReport Result will use this list to fill our template, and return the PDF.

- -

I assume you already have a WW webapp working.

- -
Note: although this is a very simple example, I suggest you read the fine documentation of both WW and JR.
- -
Used versions
-

Webwork 2.2 beta 3 (but should apply to previous versions)
-JasperReports 1.1.0
-JDK 1.4.2

- -

Right, let's begin.

- -

Our Person class

- -

We start by defining a simple POJO class: Person.java

- -
com.mevipro.test.Person.java
-
package com.mevipro.test;
-
-public class Person {
-	
-	private Long id;
-
-	private String name;
-
-	private String lastName;
-
-	public Person() {
-		super();
-	}
-
-	public Person(String name, String lastName) {
-		super();
-		this.name = name;
-		this.lastName = lastName;
-	}
-	
-	
-
-	public Person(Long id, String name, String lastName) {
-		super();
-		this.id = id;
-		this.name = name;
-		this.lastName = lastName;
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * @param id The id to set.
-	 */
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	/**
-	 * @return Returns the lastName.
-	 */
-	public String getLastName() {
-		return lastName;
-	}
-
-	/**
-	 * @param lastName The lastName to set.
-	 */
-	public void setLastName(String lastName) {
-		this.lastName = lastName;
-	}
-
-	/**
-	 * @return Returns the name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param name The name to set.
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-	
-	
-}
-
- -

Nothing special. Just your basic properties, constructor, getters and setters.

- -

JasperReports libraries

- -

Before we can continue, we need to add the JR libraries to our classpath. You can download the JR project here: http://www.sourceforge.net/projects/jasperreports
-Save the jasperreports-X-project.zip to your harddisk, and extract the files.

- -

We need the following files:

-
    -
  • dist/jasperreports-X.jar
  • -
  • lib/commons-*.jar (all the commons - except maybe for commons-logging)
  • -
  • lib/itext-X.jar
  • -
  • lib/jdt-compiler.jar
  • -
- - -

Copy these jars over to your WW_WEBAPP/WEB-INF/lib directory, and add them to your classpath.

- -

Show me the Action

- -
com.mevipro.test.action.JasperAction
-
package com.mevipro.test.action;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.jasperreports.engine.JasperCompileManager;
-
-import com.mevipro.test.Person;
-import com.opensymphony.xwork.ActionSupport;
-
-public class JasperAction extends ActionSupport {
-	
-	//basic List - it will serve as our dataSource later on
-	private List myList;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.opensymphony.xwork.ActionSupport#execute()
-	 */
-	public String execute() throws Exception {
-
-		// create some imaginary persons
-		Person p1 = new Person(new Long(1), "Patrick", "Lightbuddie");
-		Person p2 = new Person(new Long(2), "Jason", "Carrora");
-		Person p3 = new Person(new Long(3), "Alexandru", "Papesco");
-		Person p4 = new Person(new Long(4), "Jay", "Boss");
-
-		/*
-		 * store everything in a list - normally, this should be coming from a
-		 * database but for the sake of simplicity, I left that out
-		 */
-		myList = new ArrayList();
-		myList.add(p1);
-		myList.add(p2);
-		myList.add(p3);
-		myList.add(p4);
-		
-		/*
-		 * Here we compile our xml jasper template to a jasper file.
-		 * Note: this isn't exactly considered 'good practice'.
-		 * You should either use precompiled jasper files (.jasper) or provide some kind of check
-		 * to make sure you're not compiling the file on every request.
-		 * If you don't have to compile the report, you just setup your data source (eg. a List)
-		 */
-		try {
-			JasperCompileManager.compileReportToFile(
-					"WW_WEBAPP/jasper/our_jasper_template.jrxml",
-					"WW_WEBAPP/jasper/our_compiled_template.jasper");
-		} catch (Exception e) {
-			e.printStackTrace();
-			return ERROR;
-		}
-		//if all goes well ..
-		return SUCCESS;
-	}
-
-	/**
-	 * @return Returns the myList.
-	 */
-	public List getMyList() {
-		return myList;
-	}
-
-}
-
- -

Once again - I guess everything is pretty clear. Our JasperAction will create a list of several People. The JasperCompileManager will then compile the jrxml template to a .jasper file.

-
Again, don't use this in production code. You should of course either provide compiled templates, or do some sort of checking to avoid compiling the template on every request. But for our demonstration, or development, this suits our needs just fine.
- -

Our Jasper template

- -

JR uses a special XML page to define templates which will be compiled to .jasper files. These templates will be used to design the resulting report. It's pretty straightforward.
-This is a handwritten version - for more complex versions I seriously suggest taking a look a the various GUI designers.

- -
our_jasper_template.jrxml
-
<?xml version="1.0"?>
-    <!DOCTYPE jasperReport 
-  PUBLIC "-//JasperReports//DTD Report Design//EN" 
-  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
-    <jasperReport name="jasper_test">
-      <!-- our fields -->
-      <field name="name" class="java.lang.String"/>
-      <field name="lastName" class="java.lang.String"/>
-      <title>
-        <band height="50">
-          <staticText>
-            <reportElement x="0" y="0" width="180" height="15"/>
-            <textElement/>
-            <text>
-              <![CDATA[Webwork JasperReports Sample]]>
-            </text>
-          </staticText>
-        </band>
-      </title>
-      <pageHeader>
-        <band></band>
-      </pageHeader>
-      <columnHeader>
-        <band height="20">
-          <staticText>
-            <reportElement x="180" y="0" width="180" height="20"/>
-            <textElement>
-              <font isUnderline="true"/>
-            </textElement>
-            <text>
-              <![CDATA[NAME]]>
-            </text>
-          </staticText>
-          <staticText>
-            <reportElement x="360" y="0" width="180" height="20"/>
-            <textElement>
-              <font isUnderline="true"/>
-            </textElement>
-            <text>
-              <![CDATA[LASTNAME]]>
-            </text>
-          </staticText>
-        </band>
-      </columnHeader>
-      <detail>
-        <band height="20">
-          <textField>
-            <reportElement x="180" y="0" width="180" height="15"/>
-            <textElement/>
-            <textFieldExpression>
-              <![CDATA[$F{name}]]>
-            </textFieldExpression>
-          </textField>
-          <textField>
-            <reportElement x="360" y="0" width="180" height="15"/>
-            <textElement/>
-            <textFieldExpression>
-              <![CDATA[$F{lastName}]]>
-            </textFieldExpression>
-          </textField>
-        </band>
-      </detail>
-      <columnFooter>
-        <band></band>
-      </columnFooter>
-      <pageFooter>
-        <band height="15">
-          <staticText>
-            <reportElement x="0" y="0" width="40" height="15"/>
-            <textElement/>
-            <text>
-              <![CDATA[Page:]]>
-            </text>
-          </staticText>
-          <textField>
-            <reportElement x="40" y="0" width="100" height="15"/>
-            <textElement/>
-            <textFieldExpression class="java.lang.Integer">
-              <![CDATA[$V{PAGE_NUMBER}]]>
-            </textFieldExpression>
-          </textField>
-        </band>
-      </pageFooter>
-      <summary>
-        <band></band>
-      </summary>
-    </jasperReport>
-
- -

Save this file in WW_WEBAPP/jasper/ as 'our_jasper_template.jrxml'.

- -

Most important: we declared the fields name and lastName (not surprisingly, two properties from our Person.class). This means we will now be able to use these fields in our Jasper template.

- -

We define two columnheaders (NAME and LASTNAME), and then add our fields to the detail band (for a better explanation, look at the JR tutorial). This 'detail' band will iterate over our List of People. This is the default behaviour of JR - so if you want to display more information from the Person, add them to this band.

- -

In the detail band we use the

-
$F{name}
-
expression. This means JR will ask WW how to retrieve the field value. WW will happily look up this value in the stack (find the person, and invoke the getName() getter), and return it. Similar for the
-
$F{lastName}
-

- -

The rest is mostly markup to define the layout.

- -
Use a logger (commons-logging, log4j, ..) to watch com.opensymphony.webwork.views.jasperreports in debug mode, if you have any troubles
- -

Register the Action

- -

Alright, time to add the action to our xwork.xml file:

- -
xwork.xml
-
<action name="myJasperTest" class="com.mevipro.test.action.JasperAction">
-	<result name="success" type="jasper">
-		<param name="location">/jasper/our_compiled_template.jasper</param>
-		<param name="dataSource">myList</param>
-		<param name="format">PDF</param>
-	</result>
-</action>
-
- -

Let's explore this a bit further. I assume you are familiar with the xwork notation & schema, if not, check the documentation.

- -
-
<action name="myJasperTest" class="com.mevipro.test.action.JasperAction">
-
-

We simply register our JasperAction with the name 'myJasperTest' - this means that we can execute this Action by sending a request to myJasperTest.action in our browser.

- -
-
<result name="success" type="jasper">
-
-

When our JasperAction executes correctly, we will use the Result type registered with the name 'jasper'. This is already done when you include the webwork-default (

-
<include file="webwork-default.xml"/>
-
). This result type will be configured by our params, which we'll specify below:

- -
-
<param name="location">/jasper/our_compiled_template.jasper</param>
-
-

This parameter defines the location of our compiled jasper file, which will be filled by WW with our dataSource:

-
-
<param name="dataSource">myList</param>
-
-

The name of the dataSource - this is the name of the getter you want to call (this will result in a getMyList() call to your JasperAction). It will be used to fill the template with data.

-
-
<param name="format">PDF</param>
-
-

This specifies the format to which the jasper file will be transformed. Possible values are: PDF, CSV, XLS and HTML.

- -

Conclusion

- -

You should now be able to execute http://localhost:8080/YOUR_WEBAPP/myJasperTest.action - and you should see a nice list of names.
-WW provides probably the most elegant way to deal with JasperReport files; specify the location of the .jasper file, specify what dataSource you want to use, and there you go.

- -
- - diff --git a/docs/wikidocs/Key Annotation.html b/docs/wikidocs/Key Annotation.html deleted file mode 100644 index e1dda0a53..000000000 --- a/docs/wikidocs/Key Annotation.html +++ /dev/null @@ -1,55 +0,0 @@ - - - WebWork - - Annotation - - - - - - - - - - -
-

Key Annotation

- -

Sets the Key for type conversion.

- -

Usage

- -

The Key annotation must be applied at field level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - -
ParameterRequiredDefaultDescription
valuenojava.lang.Object.classThe key property value.

- -

Examples

- -
-
// The key property for User objects within the users collection is the <code>userName</code> attribute.
-@Key( value = java.lang.Long.class )
-private Map<Long, User> userMap;
-
- -
- - diff --git a/docs/wikidocs/KeyProperty Annotation.html b/docs/wikidocs/KeyProperty Annotation.html deleted file mode 100644 index ab2302e16..000000000 --- a/docs/wikidocs/KeyProperty Annotation.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork - - KeyProperty Annotation - - - - - - - - - - -
-

KeyProperty Annotation

- -

Sets the KeyProperty for type conversion.

- -

Usage

- -

The KeyProperty annotation must be applied at field level. -

This annotation should be used with Generic types, if the key property of the key element needs to be specified.

- -

Parameters

- -

- - - - - - - - - - - - - - - - -
ParameterRequiredDefaultDescription
valuenoidThe key property value.

- -

Examples

- -
-
// The key property for User objects within the users collection is the <code>userName</code> attribute.
-@KeyProperty( value = "userName" )
-protected List<User> users = null;
-
- - -
- - diff --git a/docs/wikidocs/Learn WW by example.html b/docs/wikidocs/Learn WW by example.html deleted file mode 100644 index 97399866e..000000000 --- a/docs/wikidocs/Learn WW by example.html +++ /dev/null @@ -1,72 +0,0 @@ - - - WebWork - - Learn WW by example - - - - - - - - - - -
-

Table of contents: Learn WW by example

- -

This guide is not yet ready for public consumption, and not yet linked to from the webwork wiki. Once enough pages have been written for it to become useful, I will link it into the wiki.

- -

If you wish to contact me, please send email to rbondi at gmail d o t com.

- -

/r:b:

- -
    -
  1. Readme (this is a work in progress; symbols)
  2. -
  3. Introduction (target audience; Essential, Simple, Intermediate, and Advanced; examples must work)
  4. -
  5. Set up WW
  6. -
  7. Essential WW by example -
      -
    1. Actions
    2. -
    -
  8. -
  9. Simple WW by example: html forms -
      -
    1. Html forms with WW tags, actions, and validation
    2. -
    -
  10. -
  11. Intermediate WW by example: html forms and pages -
      -
    1. SiteMesh by example
    2. -
    3. Struts tag libraries by example
    4. -
    5. Interceptors and Validators by example
    6. -
    -
  12. -
  13. Advanced WW: if you don't test, it isn't for you -
      -
    1. What is IoC?
    2. -
    3. JUnit by example
    4. -
    5. Mockobjects by example
    6. -
    7. Logging by example
    8. -
    9. Tomcat commons db connection pool by example
    10. -
    11. Hibernate by example
    12. -
    -
  14. -
  15. Contributing to this wiki guide -
      -
    1. How this guide is different from others
    2. -
    3. Rules and conventions
    4. -
    -
  16. -
- - -

Todo

-
    -
  1. how fit in both jsp and velocity in examples/toc?
  2. -
- - -
- - diff --git a/docs/wikidocs/Lesson 1 - Setting up webwork in a web application.html b/docs/wikidocs/Lesson 1 - Setting up webwork in a web application.html deleted file mode 100644 index e80ed50ff..000000000 --- a/docs/wikidocs/Lesson 1 - Setting up webwork in a web application.html +++ /dev/null @@ -1,174 +0,0 @@ - - - WebWork - - Lesson 1 - Setting up webwork in a web application - - - - - - - - - - -
-

Lesson 1: Setting up webwork in a web application

- -

For this lesson, you need to have a Servlet container set up and know how to create a web application. If you don't, we suggest you learn about Apache Tomcat, which is a free Servlet container from the Apache Jakarta Project, or Resin, from Caucho Technology, which is free for noncommercial use.

- -
Notation
-

Throughout these lessons, we'll assume that your web application root is the directory [webapp], and that your Java source files are kept in [src].

- -

To install WebWork in a web application:

- -
    -
  1. Download WebWork. The current version can be found at WebWork's home page. This tutorial is based on version 2.1.7.
  2. -
  3. Set up an empty web application. For example, if you are using Tomcat, this will have something like the following directories (the directory "webwork-lessons" is referred to as [webapp] in these lessons): -
    -
    [the tomcat root directory]
    -\|_webapps
    -  \|_webwork-lessons
    -    \|_WEB-INF
    -      \|_classes
    -      \|_lib
    -
  4. -
  5. Copy the required WebWork libraries to your web application:
  6. -
-
    -
  • copy webwork-2.1.7.jar to [webapp]/WEB-INF/lib ,
  • -
  • copy lib/core/*.jar to [webapp]/WEB-INF/lib (not to [webapp]/WEB-INF/lib/core).
  • -
-
    -
  1. Configure [webapp]/WEB-INF/web.xml, and create [webapp]/WEB-INF/classes/xwork.xml and [webapp]/WEB-INF/classes/validators.xml, as described below.
  2. -
- - -
WebWork jar name
-

If you have a later version of WebWork than 2.1.7, the WebWork jar will not be named webwork-2.1.7.jar. Be sure to replace all occurrences of this jar's name below with the name of the jar you are using.

- -

web.xml:

- -

Create the following web.xml file in [webapp]/WEB-INF. If you already have a web.xml file, just add the content of the <web-app> tag below to your existing <web-app> tag.

- -
-
<?xml version="1.0"?>
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-"http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app>
-	<display-name>My WebWork Application</display-name>
-	<servlet>
-		<servlet-name>webwork</servlet-name>
-		<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
-		<load-on-startup>1</load-on-startup>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>webwork</servlet-name>
-		<url-pattern>*.action</url-pattern>
-	</servlet-mapping>
-	<taglib>
-		<taglib-uri>webwork</taglib-uri>
-		<taglib-location>/WEB-INF/lib/webwork-2.1.7.jar</taglib-location>
-	</taglib>
-</web-app>
-
- -

This registers ServletDispatcher as a servlet, and maps it to the suffix *.action. We will go into this more in the section on Actions in the next lesson. WebWork's taglib descriptor allows WebWork tags to be used (see lesson 4.1).

- -

Read more: web.xml

- -

xwork.xml:

- -

Create the following file xwork.xml in [webapp]/WEB-INF/classes/.

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-	</package>
-</xwork>
-
- -

For now, this xwork.xml does only two things:

- -
    -
  • It informs WebWork that it should import the configuration information from webwork-default.xml. (This file is located at the root of the webwork-2.1.7.jar, so it is sure to be found.)
  • -
- - -
    -
  • It defines a default package (with the <package> section) where WebWork elements like actions, results and interceptors are registered.
  • -
- - -

Read more: xwork.xml

- - -

validators.xml:

- -

Create a file validators.xml in [webapp]/WEB-INF/classes/ with the following content:

- -
-
<validators> 
-	<validator name="required"
-		class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/> 
-	<validator name="requiredstring"
-		class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/> 
-	<validator name="int"
-		class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/> 
-	<validator name="date"
-		class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/> 
-	<validator name="expression"
-		class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/> 
-	<validator name="fieldexpression"
-		class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/> 
-	<validator name="email"
-		class="com.opensymphony.xwork.validator.validators.EmailValidator"/> 
-	<validator name="url"
-		class="com.opensymphony.xwork.validator.validators.URLValidator"/> 
-	<validator name="visitor"
-		class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/> 
-	<validator name="conversion"
-		class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/> 
-</validators>
-
- -

This file defines the validators used, for example, for validating html form fields.

- -

Read more: Validation

- -

All Set Up!

- -

Restart your servlet container (for example, restart Tomcat), and your webapp should be ready for use as a skeleton WebWork application.

- -

To test whether everything is working, create [webapp]/test.jsp:

- -
-
<html>
-<body>
-Hello html world
-<hr/>
-<%
-  out.println("Hello jsp world.");
-%>
-</body>
-</html>
-
- -

If you can load this file in your browser and see the two Hello messages, your web application is working.

- -
- -

Next Lesson

- - -
- - diff --git a/docs/wikidocs/Lesson 2 - An html form with no data.html b/docs/wikidocs/Lesson 2 - An html form with no data.html deleted file mode 100644 index a664c2f64..000000000 --- a/docs/wikidocs/Lesson 2 - An html form with no data.html +++ /dev/null @@ -1,180 +0,0 @@ - - - WebWork - - Lesson 2 - An html form with no data - - - - - - - - - - -
-

Lesson 2: An html form with no data

- -

In this lesson, we are going to create a JSP with a form which, when submitted, loads a different JSP page saying "Hello, WebWorld!". To do that, we are going to write our first WebWork action.

- -

Background: what are actions?

- -

In JSP programming, submitting a form typically loads another JSP page where the form is processed using request.getProperty(). The form html looks like: <form action="foo.jsp">.

- -

When you submit an html form using WebWork, the form is sent to a Java class that you write yourself, not to a JSP page. These classes are called WebWork actions. The form html typically looks like: <form action="foo.action">.

- -

In a Model-View-Controller approach, the WebWork action is part of the Controller, leaving to JSP pages what they do best: the View. (If you don't know what a Model-View-Controller is, don't worry about this.)

- -

The code

- -

These are typical steps for creating a form and its action:

- -
    -
  1. Create a JSP page with a form that calls the action.
  2. -
  3. Create the action class.
  4. -
  5. Register the action in xwork.xml.
  6. -
  7. Create a JSP page that will display the result.
  8. -
  9. Compile the action class. If necessary, restart your webapp.
  10. -
- - -
Watch out for typos!
-

If something doesn't work properly, the first thing you'll want to do in this lesson is check all the files for typos, both in the files themselves as well as in the file names. This is a common source of errors.

- -

1. Create a JSP page with a form that calls the action

- -

Past this code into file called page02.jsp.

- -
-
<html>
-<head>
-	<title>A simple form with no data</title>
-</head>
-<body>
-	<p>Click the button below to activate Form02Action.</p>
-
-	<form action="form02.action" method="post">
-		<p><input type="submit" value="Click me." /></p>
-	</form>
-
-</body>
-</html>
-
- -

This is a form with no entry fields, just a submit button. Notice that the form's action attribute doesn't point to a jsp page, but to something strange called form02.action. We'll soon see why.

- -

2. Create the action class

- -

We are now going to create a Java class that will be part of the Java package "lessons". It doesn't matter where you keep this and other .java files; for example, they could be in these directories (if you are using Windows):

- -
-
c:
-\|_java
-  \|_src
-    \|_lessons
-
- -

In these lessons, the above "src" directory is referred to as [src].

- -

All our Java classes will be compiled to [webapp]/WEB-INF/classes. You'll have to include all the [webapp]/WEB-INF/lib/*.jar files in your CLASSPATH in order to compile these classes.

- -

Paste this code into a file [src]/lessons/Form02Action.java:

- -
-
package lessons; 
-
-import com.opensymphony.xwork.ActionSupport; 
-
-public class Form02Action extends ActionSupport { 
-	String hello; 
-	
-	public String getHello() { 
-		return hello; 
-	}
-	
-
-	public String execute() throws Exception { 
-		hello = "Hello, WebWorld!"; 
-		return SUCCESS; 
-	}
-	
-}
-
- -

3. Register the action in xwork.xml

- -

Edit the xwork.xml file as shown below, adding the form02 action and something called an interceptor to the default package.

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<!-- Default interceptor stack. --> 
-		<default-interceptor-ref name="defaultStack" /> 
-		
-		<!-- 02 --> 
-		<action name="form02" class="lessons.Form02Action"> 
-			<result name="success" type="dispatcher">page02-success.jsp</result> 
-		</action> 
-	</package>
-</xwork>
-
- -

Read more: xwork.xml

- - -

4. Create a JSP page that will display the result

- -

Paste this code into a file [webapp]/page02-success.jsp:

- -
-
<%@ taglib uri="webwork" prefix="ww" %> 
-<html> 
-<head> 
-	<title>Success page for form with no data</title> 
-</head> 
-<body> 
-
-<ww:property value="hello" /> 
-
-</body> 
-</html>
-
- -

Try it

- -

Don't forget to compile your action to [webapp]/WEB-INF/classes, and to restart your web application if necessary.

- -

Go ahead and try it now: click the form submit button on page02.jsp and see what happens. You should see a page that says "Hello, WebWorld!".

- -

How the code works

- -

The above four files work together like this.

- -
    -
  • You click the form submit button on page02.jsp, sending it to your web application server.
  • -
  • The server receives the request for helloWebWebWorld.action. Looking in [webapp]/WEB-INF/web.xml, it sees that all *.action requests are to be handed off to com.opensymphony.webwork.dispatcher.ServletDispatcher. Essentially, the request is handed to WebWork now.
  • -
  • WebWork looks in xwork.xml for an action named "form02". There it finds that this corresponds to the class "lessons/Form02Action," instantiates it, and calls its excute() method.
  • -
  • execute() returns SUCCESS, and WebWork looks again in xwork.xml to see what page to load if SUCCESS is returned. It finds the page "form02-success.jsp".
  • -
  • The page page02.jsp is processed (the <ww:property value="hello" /> tag calls the getter getHello() of Form02Action) and sent back to the browser.
  • -
- - -

To sum up: with WebWork, all html forms are sent to actions. The actions return constants like SUCCESS to specify (via xwork.xml) what page to return.

- -

In this example, the form contained no data. In the next lesson, we'll see how to send form data to an action. Since page02-success.jsp called a getter of the action, you might guess that the form fields are going to call setters. You'd be right.

- -

Previous Lesson | Next Lesson

- - - - -
- - diff --git a/docs/wikidocs/Lesson 3 - An html form with data.html b/docs/wikidocs/Lesson 3 - An html form with data.html deleted file mode 100644 index ae35c4d30..000000000 --- a/docs/wikidocs/Lesson 3 - An html form with data.html +++ /dev/null @@ -1,166 +0,0 @@ - - - WebWork - - Lesson 3 - An html form with data - - - - - - - - - - -
-

Lesson 3: An html form with data

- -

In this lesson, we will create a form in which you can enter your name. For example, if you enter "Bob" and click the submit button,
-you'll get a page saying "Hello, Bob!". If you don't enter a name, you'll get a screen saying: "Hmm, you don't seem to have entered a name. Go back and try again please."

- -

As before, we set everything up in four steps: create the form, create the action, register the action, and create the landing page (or in this case, pages).

- -

1. Create the form

- -

Paste this html into [webapp]/page03.jsp:

- -
-
<html>
-<head>
-	<title>A simple form with data</title>
-</head>
-<body>
-	<p>What is your name?</p>
-
-	<form action="form03.action" method="post">
-		<p><input type="text" name="yourName"></p>
-		<p><input type="submit" value="Submit your name." /></p>
-	</form>
-
-</body>
-</html>
-
- -

2. Create the form action

- -

Paste this code into [src]/lessons/Form03Action.java:

- -
-
package lessons;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class Form03Action extends ActionSupport {
-
-  String yourName;
-
-  public void setYourName(String p_yourName) {
-    yourName = p_yourName;
-  }
-
-  public String getYourName() {
-    return yourName;
-  }
-
-
-  public String execute() throws Exception {
-    if (yourName == null || yourName.length() == 0)
-      return ERROR;
-    else
-      return SUCCESS;
-  }
-
-}
-
- - -

3. Register the action in xwork.xml:

- -

Edit [webapp]/WEB-INF/classes/xwork.xml:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-  <!-- Include webwork defaults (from WebWork JAR). -->
-  <include file="webwork-default.xml" />
-  
-  <!-- Configuration for the default package. -->
-  <package name="default" extends="webwork-default">
-    <!-- Default interceptor stack. --> 
-    <default-interceptor-ref name="defaultStack" /> 
-    
-    <!-- 02 --> 
-    <action name="form02" class="lessons.Form02Action"> 
-      <result name="success" type="dispatcher">page02-success.jsp</result> 
-    </action> 
-
-    <!-- 03 -->
-    <action name="form03" class="lessons.Form03Action">
-      <result name="success" type="dispatcher">page03-success.jsp</result>
-      <result name="error" type="dispatcher">page03-error.jsp</result>
-    </action>
-
-  </package>
-</xwork>
-
- - -

4. Create the success and error pages

- -

Create [webapp]/page03-success.jsp:

- -
-
<%@ taglib uri="webwork" prefix="ww" %>
-<html>
-<head>
-	<title>Success page for form with data</title>
-</head>
-<body>
-
-Hello, <ww:property value="yourName" />!
-
-</body>
-</html>
-
- -

Create [webapp]/page03-error.jsp:

- -
-
<html>
-<head>
-	<title>Error page for form with data</title>
-</head>
-<body>
-
-Hmm, you don't seem to have entered a name. Go back and try again please.
-
-</body>
-</html>
-
- - -

Try it

- -

Don't forget to compile your action to [webapp]/WEB-INF/classes, and to restart your web application if necessary.

- -

Go ahead and try it now: click the form submit button and see what happens. Try it with and without entering a name.

- - -

How the code works

- -

There are only two differences between this example and the previous lesson.

- -
    -
  • When the action is called, its setYourName() setter is called with the contents of the form field named yourName.
  • -
  • After the action has been called (which is when its execute() method returns), WebWork has two options. If ERROR is returned, WebWork will return page03-error.jsp; if SUCCESS, page03-success.jsp. Just as in the last lesson, the <ww:property> tag calls the action's getter (in this case, getYourName()).
  • -
- - -

Lesson 2 \- An html form with no data | Lesson 4 \- An html form with data, without getters or setters

- - -
- - diff --git a/docs/wikidocs/Logger Interceptor.html b/docs/wikidocs/Logger Interceptor.html deleted file mode 100644 index d5bf957af..000000000 --- a/docs/wikidocs/Logger Interceptor.html +++ /dev/null @@ -1,46 +0,0 @@ - - - WebWork - - Logger Interceptor - - - - - - - - - - -
-

This interceptor logs the the start and end of the execution an action (in English-only, not internationalized).

- -

Parameters

- -

There are no parameters for this interceptor.

- -

Extending the Interceptor

- -

There are no obvious extensions to the existing interceptor.

- -

Examples

- -
-
<!-- prints out a message before and after the immediate action execution -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="completeStack"/>
-    <interceptor-ref name="logger"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
-<!-- prints out a message before any more interceptors continue and after they have finished -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="logger"/>
-    <interceptor-ref name="completeStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Meetings Minutes.html b/docs/wikidocs/Meetings Minutes.html deleted file mode 100644 index 68fc6f82b..000000000 --- a/docs/wikidocs/Meetings Minutes.html +++ /dev/null @@ -1,27 +0,0 @@ - - - WebWork - - Meetings Minutes - - - - - - - - - - -
-

This is a central location for the chat logs and minutes for all WebWork-related meetings.

- - - - -
- - diff --git a/docs/wikidocs/Misc.html b/docs/wikidocs/Misc.html deleted file mode 100644 index 9cb99cabd..000000000 --- a/docs/wikidocs/Misc.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Misc - - - - - - - - - - -
-

This is a place for random pages that can't be classified anywhere else. Eventually they will be deleted if they can't be rolled in to a more appropriate location.

- -
- - diff --git a/docs/wikidocs/Model Driven Interceptor.html b/docs/wikidocs/Model Driven Interceptor.html deleted file mode 100644 index 4728fe97c..000000000 --- a/docs/wikidocs/Model Driven Interceptor.html +++ /dev/null @@ -1,51 +0,0 @@ - - - WebWork - - Model Driven Interceptor - - - - - - - - - - -
- -

Watches for ModelDriven actions and adds the action's model on to the value stack.

- -

Note: The ModelDrivenInterceptor must come before the both StaticParametersInterceptor and - ParametersInterceptor if you want the parameters to be applied to the model.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points to this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="model-driven"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Multiple Submit Buttons.html b/docs/wikidocs/Multiple Submit Buttons.html deleted file mode 100644 index 0419cdd49..000000000 --- a/docs/wikidocs/Multiple Submit Buttons.html +++ /dev/null @@ -1,89 +0,0 @@ - - - WebWork - - Multiple Submit Buttons - - - - - - - - - - -
-

Introduction

-

Often, we have multiple submit buttons within a single form. The below is just a simple way of identifying which button was clicked, and which actions to take.

- -

There are, of course, many ways of doing this, including the use of javascript to identify the actions, etc... You're welcome to pick and choose whichever method you find most useful. Webwork is flexible enough.

-

Form

-
-
<button type="submit" value="Submit" name="submit">
-<button type="submit" value="Clear" name="clear">
-
-

Action with boolean properties

-
-
class MyAction extends ActionSupport {
-   private boolean submit;
-   private boolean clear;
-   public void setSubmit(boolean submit) {
-      this.submit = submit;
-   }
-   public void setClear(boolean clear) {
-      this.clear = clear;
-   }
-   public String execute() {
-      if (submit) {
-         doSubmit();
-         return "submitResult";
-      }
-      if (clear) {
-         doClear();
-         return "clearResult";
-      }
-      return super.execute();
-   }
-}
-
-

Explanation

-

The boolean properties 'submit' and 'clear' will be set to 'true' or 'false' according weather the submit or clear form element is present in the submitted form.

- -

In this case, the properties are boolean, therefore the values set would be boolean.

- -

There is another method, using String properties, described below...

-

Form

-
-
<button type="submit" value="Submit" name="buttonName">
-<button type="submit" value="Clear" name="buttonName">
-
-

Action with String properties

-
-
class MyAction extends ActionSupport {
-   private String buttonName;
-   public void setButtonName(String buttonName) {
-      this.buttonName = buttonName;
-   }
-   public String execute() {
-      if ("Submit".equals(buttonName)) {
-         doSubmit();
-         return "submitResult";
-      }
-      if ("Clear".equals(buttonName)) {
-         doClear();
-         return "clearResult";
-      }
-      return super.execute();
-   }
-}
-
-

Explanation

-

In this case, the properties are String, therefore the values set are also String in nature.

- -

I don't really like this method, as it ties in the Action to the Form. (What happens if you want different text to show up on the button ? You would have to change both the form as well as the corresponding action.)

-

Conclusion

-

There are other ways to achieve the same functionality. There are pros and cons to each methods. Feedback welcome.

- -
- - diff --git a/docs/wikidocs/Namespace Configuration.html b/docs/wikidocs/Namespace Configuration.html deleted file mode 100644 index 241274e5d..000000000 --- a/docs/wikidocs/Namespace Configuration.html +++ /dev/null @@ -1,68 +0,0 @@ - - - WebWork - - Namespace Configuration - - - - - - - - - - -
-

Namespaces

- -

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.

- - -

Default Namespace

-

The default namespace, which is "" (an empty string) is used as a "catch-all" 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 "extends" 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.

- - -

Root Namesapce

-

Root namespace, which is "/" is also allowed in WebWork. It will be the namespace when a request directly under the context path is received. As with other namespace, it will fall back to the default namespace if no such action alias is found in it.

- - -

Namespace example

- -
-
<package name="default">
-    <action name="foo" class="mypackage.simpleAction>
-        <result name="success" type="dispatcher">greeting.jsp</result>
-    </action>
-    <action name="bar" class="mypackage.simpleAction"> 
-        <result name="success" type="dispatcher">bar1.jsp</result> 
-    </action> 
-</package>
-
-<package name="mypackage1" namespace="/">
-    <action name="moo" class="mypackage.simpleActtion">
-        <result name="success" type="dispatcher">moo.jsp</result>
-    </action>
-</package>
-
-<package name="mypackage2" namespace="/barspace"> 
-    <action name="bar" class="mypackage.simpleAction"> 
-        <result name="success" type="dispatcher">bar2.jsp</result> 
-    </action> 
-</package>
-
- - -

Explanation

-

If a request for /barspace/bar.action is made, '/barspace' namespace is searched and if it is found the bar action is executed, else it will fall back to the default namespace. In this example bar alias do exists in the '/barspace' namespace, so it will get executed and if success, the request will be forwarded to bar2.jsp.

- -

Note: 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 "". 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.

- -

If a request for /moo.action is made, the root namespace ('/') is searched for 'moo' action alias, if it is not found it will fall back to trying to find it in the default namespace. In this example, moo action alias does exists and hence will be executed. Upon sucess, the request will get forwarded to bar2.jsp.

- -

Note: If a request is made to '/foo.action', '/' namespace will be searched and if it is found it will be execueted, else an attempt to try to find it in the default namespace will occurred. In this example foo action alias does not exist in the '/' namespace, hence it will falled back to the default namespace and execute the foo alias there.

- -

Note: Namespace is only one level. For example if the url '/barspace/myspace/bar.action' is requested, Webwork will try to search for namespace '/barspace/myspace', which does not exist in this case, and will fall back to the default namespace '' and tried the search for action with 'bar' alias. As a result the bar action in the default will be used.

- -
- - diff --git a/docs/wikidocs/Non Form Tags.html b/docs/wikidocs/Non Form Tags.html deleted file mode 100644 index ee47233e4..000000000 --- a/docs/wikidocs/Non Form Tags.html +++ /dev/null @@ -1,35 +0,0 @@ - - - WebWork - - Form Tags - - - - - - - - - - -
-
    -
  1. a - renders an anchor (link)
  2. -
  3. actionerror - renders the error messages if they exists
  4. -
  5. actionmessage - renders the action messages if they exists
  6. -
  7. component - render a very customizable component allowing its template to be specified at the spot through theme, template attribute
  8. -
  9. date - render a date
  10. -
  11. div - render a div section
  12. -
  13. fielderror - render the field error message if they exists
  14. -
  15. panel - render a panel for tabbed panel
  16. -
  17. table - render a table
  18. -
  19. tabbedpane - (deprecated in favour of tabbedPanel)
  20. -
  21. tabbedPanel - render a tabbed panel
  22. -
  23. tree - render a tree widget
  24. -
  25. treenode - render a tree node within a tree widget
  26. -
- - -
- - diff --git a/docs/wikidocs/Non-IoC version of OpenSessionInViewInterceptor.html b/docs/wikidocs/Non-IoC version of OpenSessionInViewInterceptor.html deleted file mode 100644 index 2734a8be2..000000000 --- a/docs/wikidocs/Non-IoC version of OpenSessionInViewInterceptor.html +++ /dev/null @@ -1,91 +0,0 @@ - - - WebWork - - Non-IoC version of OpenSessionInViewInterceptor - - - - - - - - - - -
-

Gary was so kind to provide us a non-IoC Hibernate 'Open Session in View'-interceptor. Rather than having XWork or Spring doing the dependency injection, he sets up the Hibernate Session himself.

- -
-
/*
-  * HibernateOpenSessionInViewInterceptor.java
-  *
-  * Created on March 18, 2006, 3:51 PM
-  *
-  * To change this template, choose Tools | Template Manager
-  * and open the template in the editor.
-  */
- 
-package edu.washington.javawebdevelopment.webwork.interceptor;
- 
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.interceptor.AroundInterceptor;
-import edu.washington.javawebdevelopment.dao.DaoFactoryHibernate;
-import javax.servlet.ServletException;
-import org.hibernate.SessionFactory;
-import org.hibernate.StaleObjectStateException;
- 
-/**
-  *
-  * @author gary
-  */
-public class HibernateOpenSessionInViewInterceptor extends AroundInterceptor {
-     private SessionFactory hibernateSessionFactory;
- 
-     public void init() {
-         System.out.println("Initializing HibernateOpenSessionInViewInterceptor interceptor, obtaining Hibernate SessionFactory from DaoFactoryHibernate");
-         hibernateSessionFactory = DaoFactoryHibernate.getSessionFactory();
-     }
- 
-     public void destroy() {
-     }
- 
-     public void before(ActionInvocation invocation) throws Exception {
-         System.out.println("Starting a database transaction in the HibernateOpenSessionInViewInterceptor");
-         hibernateSessionFactory.getCurrentSession().beginTransaction();
-     }
- 
-     public void after(ActionInvocation invocation, String result) throws Exception {
-         // Commit and cleanup
-         try {
-             System.out.println("Committing the database transaction in the HibernateOpenSessionInViewInterceptor");
-             hibernateSessionFactory.getCurrentSession().getTransaction().commit();
-         } catch (StaleObjectStateException staleEx) {
-             System.err.println("This interceptor does not implement optimistic concurrency control!");
-             System.err.println("Your application will not work until you add compensation actions!");
-             // Rollback, close everything, possibly compensate for any permanent changes
-             // during the conversation, and finally restart business conversation. Maybe
-             // give the user of the application a chance to merge some if his work with
-             // fresh data... what you do here depends on your applications design.
-             throw staleEx;
-         } catch (Throwable ex) {
-             // Rollback only
-             ex.printStackTrace();
-             try {
-                 if (hibernateSessionFactory.getCurrentSession().getTransaction().isActive()) {
-                     System.out.println("Trying to rollback database transaction after exception");
-                     hibernateSessionFactory.getCurrentSession().getTransaction().rollback();
-                 }
-             } catch (Throwable rbEx) {
-                 System.err.println("Could not rollback transaction after exception! - " + rbEx);
-             }
- 
-             // Let others handle it... maybe another interceptor for exceptions?
-             throw new ServletException(ex);
-         }
-     }
-}
-
- -
- - diff --git a/docs/wikidocs/OGNL Basics.html b/docs/wikidocs/OGNL Basics.html deleted file mode 100644 index 28cac8f61..000000000 --- a/docs/wikidocs/OGNL Basics.html +++ /dev/null @@ -1,157 +0,0 @@ - - - WebWork - - Basics - - - - - - - - - - -
-

XWork-specific language features

- -

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 "root", XWork's ValueStack concept requires there be many "roots".

- -

For example, suppose we are using standard OGNL (not using XWork) and there are two objects in the OgnlContext map: "foo" -> foo and "bar" -> bar and that the foo object is also configured to be the single root object. The following code illustrates how OGNL deals with these three situations:

- -
-
#foo.blah // returns foo.getBlah()
-#bar.blah // returns bar.getBlah()
-blah      // returns foo.getBlah() because foo is the root
-
- -

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's talk about how XWork is a little different...

- -
Useful Information
-

In XWork, the entire ValueStack is the root object in the context. 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.

- -

For example, suppose the stack contains two objects: Animal and Person. Both objects have a "name" property, Animal has a "species" property, and Person has a "salary" 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:

- -
-
species    // call to animal.getSpecies()
-salary     // call to person.getSalary()
-name       // call to animal.getName() because animal is on the top
-
- -

In the last example, there was a tie and so the animal'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:

- -
-
[0].name   // call to animal.getName()
-[1].name   // call to person.getName()
-
- -

With expression like [0] ... [3] etc. WebWork will cut the stack and still returned back a CompoundRoot object. To get the top of that particular stack cut, use 0.top

- - - - - - - - - - - - - - -
ognl expressiondescription
[0].top would get the top of the stack cut starting from element 0 in the stack (similar to top in this case)
[1].top would get the top of the stack cut starting from element 1 in the stack
- - - -

Accessing static properties

- -

OGNL supports accessing static properties as well as static methods. As the OGNL docs point out, you can explicitly call statics by doing the following:

- -
-
@some.package.ClassName@FOO_PROPERTY
-@some.package.ClassName@someMethod()
-
- -

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 "vs" prefix:

- -
-
@vs@FOO_PROPERTY
-@vs@someMethod()
-
-@vs1@FOO_PROPERTY
-@vs1@someMethod()
-
-@vs2@BAR_PROPERTY
-@vs2@someOtherMethod()
-
- -

"vs" stands for "value stack". The important thing to note here is that if the class name you specify is just "vs", the class for the object on the top of the stack is used. If you specify a number after the "vs" string, an object's class deeper in the stack is used instead.

- - - -

Differences from the WebWork 1.x EL

- -

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 (/) but with a dot (.). Also, rather than using ".." to traverse down the stack, we now use "[n]" 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 "@foo", but now special variables are accessed using "#foo". However, it is important to note that "#foo" does NOT access the request attributes. Because XWork is not built only for the web, there is no concept of "request attributes", and thus "#foo" is merely a request to another object in the OgnlContext other than the root.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Old Expression New Expression
foo/blah foo.blah
foo/someMethod() foo.someMethod()
../bar/blah [1].bar.blah
@baz not directly supported, but #baz is similar
. top or [0]
- - - -

WebWork-specific named objects

- - - - - - - - - - - - - - - - - - - - - - - - - - -
namevalue
#parameters['foo'] or #parameters.foo request parameter ['foo'] (request.getParameter())
#request['foo'] or #request.foo request attribute ['foo'] (request.getAttribute())
#session['foo'] or #session.foo session attribute 'foo'
#application['foo'] or #application.foo ServletContext attributes 'foo'
#attr['foo'] or #attr.foo Access to PageContext if available, otherwise searches request/session/application respectively
- -
- - diff --git a/docs/wikidocs/OGNL.html b/docs/wikidocs/OGNL.html deleted file mode 100644 index 10971b3dd..000000000 --- a/docs/wikidocs/OGNL.html +++ /dev/null @@ -1,114 +0,0 @@ - - - WebWork - - OGNL - - - - - - - - - - -
-

Overview

- -

OGNL is the Object Graph Navigation Language - see http://www.ognl.org for the full documentation of OGNL. In this document we will only show a few examples of OGNL features that co-exist with Webwork. To review basic concepts, refer to OGNL Basics.

- -

Webwork uses a standard naming context to evaluate OGNL expressions. The top level object dealing with OGNL is a map (usually referred as a context map). OGNL has a concept of a root object (in webwork terms, this is the OGNLValueStack). Along with the root, other objects are placed in the context map (referred as in the context) including your session/application/request/attr maps. These objects have nothing to do with the root, they just exist along side it in the context map. So, to access these objects, the # is used telling ognl not to look in the root object, but within the rest of the context

-
-
                     |--request
-                     |
-                     |--application
-                     |
-       context map---|--OgnlValueStack(root)
-                     |
-                     |--session
-                     |
-                     |--attr
-                     |
-                     |--parameters
-
-
- -

Note that their are other objects in the context map, I'm just referring to a few for this example. Now, your actions instances are placed in the OGNLValueStack so you can refer to your bean properties without the #.

-
-
<ww: property value="myBean.myProperty"/>
-
- -

For sessions,request, and the rest that lie in the context map:

-
-
ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
-
-
-
<ww:property value="#session.mySessionPropKey"/> or
-<ww:property value="#session['mySessionPropKey']"/> or
-<ww:property value="#attr.mySessionPropKey"/>
-
- - - -

Collections (Maps, Lists, Sets)

-

Dealing with collections(maps, lists, and sets) in webwork comes often, so here are a few examples using the select tag:
-Syntax for list: {e1,e2,e3}. This creates a List containing the String "name1", "name2" and "name3". It also selects "name2" as the default value. Notice the use of the Alt Syntax to provide the literal "name2".

-
-
<ww:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" />
-
-

Syntax for map: #{key1:value1,key2:value2}. This creates a map that maps the string "foo" to the string "foovalue" and "bar" to the string "barvalue":

-
-
<ww:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}" />
-
- -

You may need to determine if an element exists in a collection. You can accomplish this with the operations in and not in

-
-
<ww:if test="'foo' in {'foo','bar'}">
-   muhahaha
-</ww:if>
-<ww:else>
-   boo
-</ww:else>
-
-<ww:if test="'foo' not in {'foo','bar'}">
-   muhahaha
-</ww:if>
-<ww:else>
-   boo
-</ww:else>
-
- -

To select a subset of a collection (called projection), you can use a wildcard within the collection.

-
    -
  • ? - All elements matching the selection logic
  • -
  • ^ - Only the first element matching the selection logic
  • -
  • $ - Only the last element matching the selection logic
  • -
- - -

To obtain a subset of just male relatives from the object person:

-
-
person.relatives.{? #this.gender == 'male'}
-
- - - -

Lambda Expressions

-

OGNL supports basic lamba expression syntax enabling you to write simple functions. For example:

- -

For all you math majors who didn't think you would ever see this one again.
-Fibonacci: if n==0 return 0; elseif n==1 return 1; else return fib(n-2)+fib(n-1);
-fib(0) = 0
-fib(1) = 1
-fib(11) = 89

- -
Useful Information
-

The lambda expression is everything inside the brackets. The #this variable holds the argument to the expression, which is initially starts at 11.

- -
-
<ww:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
-
- -
- - diff --git a/docs/wikidocs/Other Spring Integration.html b/docs/wikidocs/Other Spring Integration.html deleted file mode 100644 index 7812dc17f..000000000 --- a/docs/wikidocs/Other Spring Integration.html +++ /dev/null @@ -1,174 +0,0 @@ - - - WebWork - - Other Spring Integration - - - - - - - - - - -
-
This document is provided by the WebWork user community and does not represent the supported Spring integration methods. Please refer to Spring for documentation on the recommended integration.
- -

I started out using the original WebWork documentation to get Spring to initialize Webwork actions, but it appears that a lot has changed since the days of WebWork 1.x. This will be my attempt to clarify some of those changes and to list the steps necessary to get the two to play nicely. Please comment with clarifications or corrections!

-

WebWork 1.x

-

(these are assumptions based on the 1.x WW1:Spring Framework Integration documentation)
-It seems that the way you got Spring to initialize WebWork 1.x action classes was to add this line into your webwork.properties file:

- -
-
webwork.action.factory=webwork.action.factory.SpringActionFactory
-
- -

so that WebWork would know to use Spring's view of the world to create actions. The WebWork action classes would then need to be declared in the Spring applicationContext.xml file so that Spring would know directly of the action objects. Upon invocation of an action, WebWork would know to first use the SpringActionFactory to try and create an instance of the requested action which would ask Spring to create the object using its configuration. If there was no Spring definition of that action object, then WebWork would use it's normal instantiation methods to create that action. Well, things have changed slightly since WebWork 1.x.

-

WebWork 2

-

In WebWork 2 (the functionality actually exists in XWork), you specify relationships from action classes to other objects in XWork's xwork.xml file instead of Spring's applicationContext.xml file. So if you have an action class that utilizes a DAO, instead of having a bean definition like so in applicationContext.xml:

- -
-
<bean id="myAction" class="com.ryandaigle.web.actions.MyAction" singleton="false">
-	<property name="DAO">
-		<ref bean="myDAO"/>
-	</property>
-<bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" />
-
- -

you move the action definition to xwork.xml and keep the DAO definition in applicationContext.xml so that xwork.xml looks like:

- -
-
<action name="myAction" class="com.ryandaigle.web.actions.MyAction">
-	<external-ref name="DAO">myDAO</external-ref>
-	<result name="success" type="dispatcher">
-		<param name="location">/success.jsp</param>
-	</result>
-</action>
-
- -

and applicationContext.xml looks like:

- -
-
<bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" />
-
- -

Notice how there is the external-ref element in the action definition that points to an object that Spring is managing. There are several things that need to be in place for the external-ref to work, but I just wanted to give an overview of what has changed before going into the specific steps.

-

Steps for Configuring Spring/WebWork2 (XWork) Integration:

-

Get the files you need to externally resolve Spring beans. I've bundled them all here: http://www.ryandaigle.com/pebble/images/webwork2-spring.jar . They were originally spread between two JIRA issues filed against XWork 1.0 (see references below). This zip includes the source, the class files (so you can just include it in your classpath) and my example configuration files. Either extract the source files into your application, or put the file onto your classpath. (You may want to take the applicationContext.xml and xwork.xml files out, I don't know if they'll override your files... They're just there as an example configuration).

- -

Now, let's get your XWork configuration file (xwork.xml) to resolve external references. XWork resolves external references (using the external-ref element) by utilizing an external reference resolver per package. You specify your external reference resolver as an attribute of the package element:

- -
-
<package name="default" extends="webwork-default"
-	externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
-
- -

This SpringServletContextReferenceResolver class reference is a class not part of the XWork distribution written as an extensions for XWork/Spring that I got from this JIRA issue filed against XWork addressing this Spring integration effort. (I have bundled it with the rest of the necessary files later on down for your convenience). This class will intercept all external-refs and resolve the references using Spring's context. There is also a SpringApplicationContextReferenceResolver included in the zip file that will allow you to resolve Spring references for applications not executing within the web context. But as this is a WebWork/Spring article, the servlet resolver is what we need to use.

- -

Now we need to add the XWork reference resolver as part of the interceptor stack you're using. This will allow any references to be resolved (using the reference resolver you specified in the externalReferenceResolver attribute). This is how I've added that interceptor:

- -
-
<interceptors>
-	<interceptor name="reference-resolver" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
-	<interceptor-stack name="myDefaultWebStack">
-		<interceptor-ref name="defaultStack"/>
-		<interceptor-ref name="reference-resolver"/>
-	</interceptor-stack>
-</interceptors>
-<default-interceptor-ref name="myDefaultWebStack"/>
-
- -

As I briefly outlined before, you can now reference Spring beans that your action classes need in xwork.xml:

- -
-
<action name="myAction" class="com.ryandaigle.web.actions.MyAction">
-	<external-ref name="DAO">myDAO</external-ref>
-	<result name="success" type="dispatcher">
-		<param name="location">/success.jsp</param>
-	</result>
-</action>
-
- -

And that's all we have to do to xwork.xml to let XWork know how to resolve references to Spring's managed beans.

- -

Now let's setup our web environment to properly notify Spring and our external reference resolver of the web context. We do this by adding two context listeners to your application's web.xml file:

- -
-
<listener>
-	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-</listener>
-<listener>
-	<listener-class>com.atlassian.xwork.ext.ResolverSetupServletContextListener</listener-class>
-</listener>
-
- -

The first listener is Spring's that you would need independent of whether or not you were integrating with WebWork 2. The second listener is our external resolver's that will use the servlet context to retrieve Spring's application context. This is the link between WebWork and Spring.
-At this point, we've set up Spring and our XWork reference resolver to work within a web context, and we've told XWork how to resolve external references to Spring. We're done! Fire it up and let me know if there are some steps I've missed or assumptions I've made that I shouldn't have.

-

References

-
    -
  • Here is my bundled source, class and example configuration files (that contains all the needed referenced files below); http://www.ryandaigle.com/pebble/images/webwork2-spring.jar .
  • -
  • My searching started with the original WebWork 1.x + Spring documentation and comments on the Wiki; WW1:Spring Framework Integration
  • -
  • The Wiki pointed me to the two JIRA issues that contained the source files for the reference resolvers:
  • -
  • http://jira.opensymphony.com/browse/XW-122 The "SpringExternalResolver.zip" attachment is the one needed for externally resolving Spring objects.
  • -
  • http://jira.opensymphony.com/browse/XW-132 The "xwork-springServletImpl.zip" attachment is the one needed for externally resolving Spring objects. It just contains some files missing from the original source. -

    Credits

    -

    Judging by the comments etc... of the JIRA issues filed against XWork, it appears that Ross Mason (of Atlassian?) is the man to thank for the external reference resolver code. And of course we have to thank the people of Spring and WebWork 2 for making this all possible.

  • -
- - -

Using the SpringObjectFactory

- -

Rather than using an external reference resolver with releases of XWork from 1.0.1 and onwards, it's possible to use the SpringObjectFactory from the xwork-optional" package. This uses Spring to wire up the dependencies for an Action before passing it to XWork. Each action should be configured within a Spring application context as a prototype (because XWork assumes a new instance of a class for every action invocation):

- -
-
<bean name="some-action" class="fully.qualified.class.name" singleton="false">
-    <property name="someProperty"><ref bean="someOtherBean"/></property>
-</bean>
-
- -

Within xwork.xml:

- -
-
<action name="myAction" class="some-action">
-    <result name="success">view.jsp</result>
-</action>
-
- -

Notice that the XWork Action's class name is the bean name defined in the Spring application context.

- -

The 1.1.3 release of the Spring/XWork integration library allows the user to configure everything in the xwork.xml file without needing to add extra entries to the applicationContext.xml. This is done by configuring the actions with the fully qualified class name (as if not using the SpringObjectFactory) It also added the ability to make use of constructor-based dependency injection without any further changes. The major caveat when using constructor-based DI is that objects passed in to the constructor must be unambiguous within the applicationContext (as is normally required by Spring) If there is any ambiguity, then you can still configure things the more traditional way, splitting the configuration of the action between xwork.xml and applicationContext.xml as described above.

- -

One other advantage of the SpringObjectFactory approach is that it can also be used to load interceptors using the same sort of logic. If the interceptor is stateless, then it's possible to create the interceptor as a singelton instance, but otherwise it's best to create it as a Spring prototype.

- -

In order to be used, the default ObjectFactory that XWork uses should be replaced with an instance of the SpringObjectFactory. The xwork-optional package ships with a ContextListener that does this, assuming that the Spring application context has already been configured.

- -

ActionAutowiringInterceptor

- -

Another alternative to using the SpringObjectFactory is to use the ActionAutowiringInterceptor. The interceptor will autowire any action class based on the autowire strategy defined. An advantage to using the interceptor over the SpringObjectFactory is that the action classes do not have to defined in the Spring's application context. The following is an example of how it can be configured in xwork.xml:

- -
-
<interceptors>
-  <interceptor name="autowire" class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor">
-    <param name="autowireStrategy">1</param>
-  </interceptor>
-  <interceptor-stack name="autowireDefault">
-    <interceptor-ref name="autowire"/>
-    <interceptor-ref name="defaultStack"/>
-  </interceptor-stack>
-</interceptors>
-
- -

Note the the autowireStrategy parameter is optional. If you do not define it, then the SpringObjectFactory will default to autowiring by name. The interceptor looks for Spring's application context in the XWork's application context. To initialize the application context, add the following listener to your web.xml:

- -
-
<listener>
-  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-</listener>
-
- -

You do not have to configure the SpringObjectFactory seperately unless you plain on instantiating results, interceptors, or validators as Spring beans. As a convenience method to get access to the application context for other uses, it is placed in the ActionContext map under the key ActionAutowiringInterceptor.APPLICATION_CONTEXT for each Action.

- -
- - diff --git a/docs/wikidocs/Package Configuration.html b/docs/wikidocs/Package Configuration.html deleted file mode 100644 index 1a0253893..000000000 --- a/docs/wikidocs/Package Configuration.html +++ /dev/null @@ -1,151 +0,0 @@ - - - WebWork - - Package Configuration - - - - - - - - - - -
-

Overview

- -

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 "sub" packages.

- -

Packages

- -

The package element has one required attribute, "name", which acts as the key for later reference to this package. The "extends" 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 "extends" should be defined above the package which extends it. The "abstract" 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.

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Attribute Required Description
name yes key to for other packages to reference
extends no inherits package behavior of the package it extends
namespace no see Namespace Configuration
abstract no declares package to be abstract (no action configurations required in package)
- -

Sample usage of packages in xwork.xml

- -
-
<xwork>
-
-    <include file="webwork-default.xml"/>
-
-    <include file="config-browser.xml"/>
-
-    <include file="xwork-continuations.xml"/>
-
-    <include file="xwork-tags.xml"/>
-    
-    <include file="xwork-validation.xml" />
-    
-    <include file="xwork-actionchaining.xml" />
-
-    <include file="xwork-ajax.xml" />
-
-    <include file="xwork-fileupload.xml" />
-
-    <include file="xwork-person.xml" />
-
-    <include file="xwork-wait.xml" />
-
-    <include file="xwork-token.xml" />
-    
-    <include file="xwork-model-driven.xml" />
-    
-    <include file="xwork-filedownload.xml" />
-
-    <package name="default" extends="webwork-default">
-        <interceptors>
-            <interceptor-stack name="crudStack">
-                <interceptor-ref name="params" />
-                <interceptor-ref name="defaultStack" />
-            </interceptor-stack>
-        </interceptors>
-		
-		<default-action-ref name="showcase"/>
-		
-        <action name="showcase">
-            <result>showcase.jsp</result>
-        </action>
-
-        <action name="date" class="com.opensymphony.webwork.showcase.DateAction">
-            <result name="success">/date.jsp</result>
-        </action>
-
-    </package>
-
-    <package name="skill" extends="default" namespace="/skill">
-        <default-interceptor-ref name="crudStack"/>
-
-        <action name="list" class="com.opensymphony.webwork.showcase.action.SkillAction" method="list">
-            <result>/empmanager/listSkills.jsp</result>
-            <interceptor-ref name="basicStack"/>
-        </action>
-        <action name="edit" class="com.opensymphony.webwork.showcase.action.SkillAction">
-            <result>/empmanager/editSkill.jsp</result>
-            <interceptor-ref name="params" />
-            <interceptor-ref name="basicStack"/>
-        </action>
-        <action name="save" class="com.opensymphony.webwork.showcase.action.SkillAction" method="save">
-            <result name="input">/empmanager/editSkill.jsp</result>
-            <result type="redirect">edit.action?skillName=${currentSkill.name}</result>
-        </action>
-        <action name="delete" class="com.opensymphony.webwork.showcase.action.SkillAction" method="delete">
-            <result name="error">/empmanager/editSkill.jsp</result>
-            <result type="redirect">edit.action?skillName=${currentSkill.name}</result>
-        </action>
-    </package>
-
-    <package name="employee" extends="default" namespace="/employee">
-        <default-interceptor-ref name="crudStack"/>
-
-        <action name="list" class="com.opensymphony.webwork.showcase.action.EmployeeAction" method="list">
-            <result>/empmanager/listEmployees.jsp</result>
-            <interceptor-ref name="basicStack"/>
-        </action>
-        <action name="edit" class="com.opensymphony.webwork.showcase.action.EmployeeAction">
-            <result>/empmanager/editEmployee.jsp</result>
-            <interceptor-ref name="crudStack"><param name="validation.excludeMethods">execute</param></interceptor-ref>
-        </action>
-        <action name="save" class="com.opensymphony.webwork.showcase.action.EmployeeAction" method="save">
-            <result name="input">/empmanager/editEmployee.jsp</result>
-            <result type="redirect">edit.action?empId=${currentEmployee.empId}</result>
-        </action>
-        <action name="delete" class="com.opensymphony.webwork.showcase.action.EmployeeAction" method="delete">
-            <result name="error">/empmanager/editEmployee.jsp</result>
-            <result type="redirect">edit.action?empId=${currentEmployee.empId}</result>
-        </action>
-    </package>
-
-</xwork>
-
- -
- - diff --git a/docs/wikidocs/Parameter Filter Interceptor.html b/docs/wikidocs/Parameter Filter Interceptor.html deleted file mode 100644 index 3ff35465c..000000000 --- a/docs/wikidocs/Parameter Filter Interceptor.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork - - Parameter Filter Interceptor - - - - - - - - - - -
- -

The Parameter Filter Interceptor blocks parameters from getting -to the rest of the stack or your action. You can use multiple -parameter filter interceptors for a given action, so, for example, -you could use one in your default stack that filtered parameters -you wanted blocked from every action and those you wanted blocked -from an individual action you could add an additional interceptor -for each action.

- - -

Parameters

- - -

    - -

  • allowed - a comma delimited list of parameter prefixes - that are allowed to pass to the action
  • -
  • blocked - a comma delimited list of parameter prefixes -that are not allowed to pass to the action
  • -
  • defaultBlock - boolean (default to false) whether by -default a given parameter is blocked. If true, then a parameter -must have a prefix in the allowed list in order to be able -to pass to the action -

- -

The way parameters are filtered for the least configuration is that -if a string is in the allowed or blocked lists, then any parameter -that is a member of the object represented by the parameter is allowed -or blocked respectively.

- -

For example, if the parameters are: -

    -
  • blocked: person,person.address.createDate,personDao
  • -
  • allowed: person.address
  • -
  • defaultBlock: false
  • -
-
-The parameters person.name, person.phoneNum etc would be blocked -because 'person' is in the blocked list. However, person.address.street -and person.address.city would be allowed because person.address is -in the allowed list (the longer string determines permissions).

- - -
- - diff --git a/docs/wikidocs/Parameters Interceptor.html b/docs/wikidocs/Parameters Interceptor.html deleted file mode 100644 index 6e0182ae9..000000000 --- a/docs/wikidocs/Parameters Interceptor.html +++ /dev/null @@ -1,84 +0,0 @@ - - - WebWork - - Parameters Interceptor - - - - - - - - - - -
- -

This interceptor gets all parameters from ActionContext#getParameters() and sets them on the value stack by - calling {@link OgnlValueStack#setValue(String, Object)}, typically resulting in the values submitted in a form - request being applied to an action in the value stack. Note that the parameter map must contain a String key and - often containers a String[] for the value.

- -

Because parameter names are effectively OGNL statements, it is important that security be taken in to account. - This interceptor will not apply any values in the parameters map if the expression contains an assignment (=), - multiple expressions (,), or references any objects in the context (#). This is all done in the {@link - #acceptableName(String)} method. In addition to this method, if the action being invoked implements the {@link - ParameterNameAware} interface, the action will be consulted to determine if the parameter should be set.

- -

In addition to these restrictions, a flag (XWorkMethodAccessor#DENY_METHOD_EXECUTION) is set such that - no methods are allowed to be invoked. That means that any expression such as person.doSomething() or - person.getName() will be explicitely forbidden. This is needed to make sure that your application is not - exposed to attacks by malicious users.

- -

While this interceptor is being invoked, a flag (InstantiatingNullHandler#CREATE_NULL_OBJECTS) is turned - on to ensure that any null reference is automatically created - if possible. See the type conversion documentation - and the InstantiatingNullHandler javadocs for more information.

- -

Finally, a third flag (XWorkConverter#REPORT_CONVERSION_ERRORS) is set that indicates any errors when - converting the the values to their final data type (String[] -> int) an unrecoverable error occured. With this - flag set, the type conversion errors will be reported in the action context. See the type conversion documentation - and the XWorkConverter javadocs for more information.

- -

If you are looking for detailed logging information about your parameters, turn on DEBUG level logging for this - interceptor. A detailed log of all the parameter keys and values will be reported.

- - -

For more information on ways to restrict the parameter names allowed, see the ParameterNameAware javadocs:

- - -

This interface is implemented by actions that want to declare acceptable parameters. Works in conjunction with {@link - ParametersInterceptor}. For example, actions may want to create a whitelist of parameters they will accept or a - blacklist of paramters they will reject to prevent clients from setting other unexpected (and possibly dangerous) - parameters.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

The best way to add behavior to this interceptor is to utilize the ParameterNameAware interface in your - actions. However, if you wish to apply a global rule that isn't implemented in your action, then you could extend - this interceptor and override the #acceptableName(String) method.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Pico.html b/docs/wikidocs/Pico.html deleted file mode 100644 index e731b919d..000000000 --- a/docs/wikidocs/Pico.html +++ /dev/null @@ -1,22 +0,0 @@ - - - WebWork - - Pico - - - - - - - - - - -
-

Pico is an Inversion of Control container available at http://picocontainer.codehaus.org. There have been several reports of integration between WebWork and Pico. As of WebWork 2.2, Pico integration is built in. To use Pico, you must first install the Pico Dependencies. Then, instead of using the normal filter dispatcher in web.xml that maps to /*, you simply need to use the class com.opensymphony.webwork.pico.PicoFilterDispatcher.

- -

For WebWork versions previous to 2.2, http://www.nanocontainer.org/NanoWar+WebWork contains information on integrating WebWork and Pico/Nano.

- -
- - diff --git a/docs/wikidocs/PlainText Result.html b/docs/wikidocs/PlainText Result.html deleted file mode 100644 index 3345f10e1..000000000 --- a/docs/wikidocs/PlainText Result.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - PlainText Result - - - - - - - - - - -
- -

A result that send the content out as plain text. Usefull typically when needed -to display the raw content of a JSP or Html file for example.

- - -

Parameters

- - -

    -
  • location (default) = location of the file (jsp/html) to be displayed as plain text.
  • -
  • charSet (optional) = character set to be used. This character set will be used to set the - response type (eg. Content-Type=text/plain; charset=UTF-8) and when reading - using a Reader. Some example of charSet would be UTF-8, ISO-8859-1 etc. -

- - -

Examples

- -
-
<action name="displayJspRawContent" >
-  <result type="plaintext">/myJspFile.jsp</result>
-</action>
-
-
-<action name="displayJspRawContent" >
-  <result type="plaintext">
-     <param name="location">/myJspFile.jsp</param>
-     <param name="charSet">UTF-8</param>
-  </result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Portlet Configuration.html b/docs/wikidocs/Portlet Configuration.html deleted file mode 100644 index 673df8406..000000000 --- a/docs/wikidocs/Portlet Configuration.html +++ /dev/null @@ -1,125 +0,0 @@ - - - WebWork - - Portlet Configuration - - - - - - - - - - -
-

XWork configuration

- -

The base package of your application should extend the webwork-portlet-default package, e.g:

-
xwork.xml
-
<include file="webwork-default.xml" />
-
-<package name="view" extends="webwork-portlet-default" namespace="/view">
-
-

 

- -

 

- -

Portlet init parameters

- -

Below is the init-param elements that you can set up in portlet.xml for configuring the portlet mode -> xwork namespace mappings for the portlet. Basically, you can think of the different portlet modes as different sub-applications, so it can be useful to set up the xwork.xml configuration with different namespaces for the different portlets and modes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Key Description Default
portletNamespace The namespace for the portlet in the xwork configuration. This namespace is prepended to all action lookups, and makes it possible to host multiple portlets in the same portlet application. If this parameter is set, the complete namespace will be /portletNamespace/modeNamespace/actionName The default namespace.
viewNamespace The namespace in the xwork config for the view portlet mode. The default namespace.
editNamespace The namespace in the xwork config for the edit portlet mode. The default namespace.
helpNamespace The namespace in the xwork config for the help portlet mode. The default namespace.
defaultViewAction Name of the action to use as default for the view portlet mode, when no action name is present. default
defaultEditAction Name of the action to use as default for the edit portlet mode, when no action name is present. default
defaultHelpAction Name of the action to use as default for the help portlet mode, when no action name is present. default
-

e.g.

-
portlet.xml
-
<init-param>
-    <!-- Portlet namespace -->
-    <name>portletNamespace</name>
-    <value>/portletA</value>
-</init-param>
-<init-param>
-    <!-- The base namespace of the view portlet mode -->
-    <name>viewNamespace</name>
-    <value>/view</value>
-</init-param>
-<init-param>
-    <!-- The default action to invoke in view mode -->
-    <name>defaultViewAction</name>
-    <value>index</value>
-</init-param>
-
-

 

- -

 

- -

This snippet from portlet.xml will set up the portlet with a namespace of /portletA/. This means that all requests to this portlet will get the namespace prepended when looking up the action. In addition, the _view portlet mode will map to the /view namespace, so a request for action myAction will resolve to the namespace and action /portletA/view/myAction. It also means that if no action is requested, the default action of index will be used for the request.

- -

Portlet phases

- -

The portlet specification describes that a portlet request cycle can consist of two phases, an event phase and a render phase. In case of an event in the portlet, it will always execute before the render phase. The event phase is typically for changing the state of the application. In a portlet, this is typically when a form is submitted. The render pahse will then prepare and dispatch to the view. It's recommended that you set up the result from an action that is executed in the event phase to point to another action that is executed in the render phase, which again is responsible for dispatching to the actual view.

- -

Portlet result dispatching

- -

The webwork-portlet-default package defines a special default result type, which is responsible for performing the result logic of an Action execution. Typically, this involves including a JSP for rendering, or preparing a render action if one is configured for the current event action.

- -

This result type has three main modes of execution.

-
    -
  • If the Action is executed in the render phase, it will perform a PortletRequestDispatcher.include(req, res) to the resource specified in the location attribute.
  • -
  • If the Action is executed in the event phase, and the result is an action mapping, it will set a render parameter on the ActionResponse to indicate which Action should be executed in the render phase. This follows good web application design, which promotes the use of a redirect after an event, which in this case means that an Action executed in the event phase will be followed by a redirect to an Action executed in the render phase.
  • -
  • If the Action is executed in the event phase, and the result is not an action mapping, the esult will prepare a special Action called "renderDirect" (specified in the webwork-portlet-default package) whose sole purpose is to render the specified web resource (usually a JSP).
  • -
- - -

The action executed in event mode can pass render parameters to the next action to execute in render mode through a query string in the result configuration:

-
xwork.xml
-
<result name="success">/displayCart.action?userId=${userId}</result>
-
-

 

- -

 

- -

This will set up a render parameter called userId with the value of the userId property of the dispatching action.

- -
- - diff --git a/docs/wikidocs/Portlet Tutorial.html b/docs/wikidocs/Portlet Tutorial.html deleted file mode 100644 index 677f3c642..000000000 --- a/docs/wikidocs/Portlet Tutorial.html +++ /dev/null @@ -1,322 +0,0 @@ - - - WebWork - - Portlet Tutorial - - - - - - - - - - -
-

Index

- -
    -
  1. Introduction
  2. -
  3. Installing Eclipse
  4. -
  5. Installing JBoss Portal 2.2
  6. -
  7. Creating the project
  8. -
  9. Classpath settings
  10. -
  11. portlet.xml
  12. -
  13. web.xml
  14. -
  15. Hello World\!
  16. -
  17. xwork.xml
  18. -
  19. JBoss Portal descriptors
  20. -
  21. Deployment
  22. -
  23. Next step
  24. -
  25. Re-deployment
  26. -
- - - - -

Step-by-Step Tutorial

- - -

Introduction

- -

This tutorial walks you through the process of building a simple portlet application, using Eclipse, JBoss Portal 2.2 and the WebWork Portlet framework.

- -

Installing Eclipse

- -

In the tutorial, we will be using Eclipse 3.1.1 which can be downloaded from http://www.eclipse.org

- -

Installing JBoss Portal 2.2

- -

JBoss Portal 2.2 can be found at http://www.jboss.com/products/jbossportal/downloads.

- -

Creating the project

- -

A Portlet application is basically packaged as a regular web application, but with an additional descriptor; portlet.xml. The first step of the tutorial is to create the project structure in eclipse. First, let's create the Java project itself using the new project wizard. We call the project 'MyPortlet'. Make sure to select the "Create separate source and output folders" radio button, and hit "next". In the next wizard step, set the output folder for the 'src' source folder to 'MyPortlet/webapp/WEB-INF/classes'. This makes sure it will be easy for us to export the application as a WAR file when we're done.

- -

New project wizard

- -

- -

New project wizard, cont

- -

- -

Classpath settings

- -

Before buliding the application itself, we need to add some required jar files to the build classpath and the WEB-INF/lib folder. Firstly, create the WEB-INF/lib folder and download the WebWork 2.2.1 distribution and unzip it to your local harddrive. Locate the jar files shown in the screenshot and and put them in the newly created WEB-INF/lib folder. Select all the jar files, and right click and select "Build Path -> Add to Build Path". Now your local project should look similar to the screenshot.

- -

- -

portlet.xml

- -

Next thing we do is create a portlet.xml file in the WEB-INF folder. In this file, write the following:

-
portlet.xml
-
<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
-  <portlet>
-    <description xml:lang="EN">My very first WebWork Portlet</description>
-    <portlet-name>MyPortlet</portlet-name>
-    <display-name xml:lang="EN">My first WebWork Portlet</display-name>
-
-    <portlet-class>com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
-
-    <init-param>
-      <!-- The view mode namespace. Maps to a namespace in the xwork config file -->
-      <name>viewNamespace</name>
-      <value>/view</value>
-    </init-param>
-    <init-param>
-      <!-- The default action to invoke in view mode -->
-      <name>defaultViewAction</name>
-      <value>index</value>
-    </init-param>
-
-    <expiration-cache>0</expiration-cache>
-
-    <supports>
-      <mime-type>text/html</mime-type>
-    </supports>
-
-    <supported-locale>en</supported-locale>
-
-    <portlet-info>
-      <title>My very own WebWork Portlet</title>
-      <short-title>WWPortlet</short-title>
-      <keywords>webwork,portlet</keywords>
-    </portlet-info>
-  </portlet>
-</portlet-app>
-
-

 

- -

This portlet.xml file sets up the portlet using the com.opensymphony.webwork.portlet.dispatcher.Jsr168Dispatcher Portlet implementation. It also tells the Portlet that it will map the view portlet mode to a /view namespace in the XWork configuration, which we must remember when building our XWork actions. In addition, it tells the portlet that if it does not find an action parameter in the portlet request, the default action to invoke is the "index" action, which
-should reside in the /view namespace in our xwork configuration.

- -

web.xml

- -

The WebWork Portlet support also requires you to include a web.xml descriptor that sets up some special servlets and filters needed to enable support for the WebWork tag libraries and template languages, since it relies on some of the interfaces and classes in the Servlet API. So create a web.xml file in the WEB-INF folder, and add the following:

-
web.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
-<web-app>
-	<filter>
-		<filter-name>webwork</filter-name>
-		<filter-class>
-			com.opensymphony.webwork.dispatcher.FilterDispatcher
-		</filter-class>
-	</filter>
-
-	<filter-mapping>
-		<filter-name>webwork</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-
-	<listener>
-		<listener-class>
-			com.opensymphony.webwork.portlet.context.ServletContextHolderListener
-		</listener-class>
-	</listener>
-
-
-	<servlet>
-		<servlet-name>preparator</servlet-name>
-		<servlet-class>
-			com.opensymphony.webwork.portlet.context.PreparatorServlet
-		</servlet-class>
-	</servlet>
-
-	<taglib>
-		<taglib-uri>/webwork</taglib-uri>
-		<taglib-location>/WEB-INF/lib/webwork-2.2.1.jar</taglib-location>
-	</taglib>
-
-</web-app>
-
-

 

- -

The FilterDispatcher makes sure that URLs to stylesheets and js files within the webwork jar file resolve correctly. The ServletContextHolderListener is a Servlet context listener that stores a reference to the servlet context of the web application. This is needed by some of the initialization procedures used in the WebWork Portlet. The 'preparator' servlet is a special servlet that, before dispatching to a view (like JSP/ftl or velocity) initializes the HttpServletRequest/Response, and other Servlet API classes in the ServletActionContext that is used in many of the JSPs and templates.

- -

Hello World!

- -

With these basic project structure, portlet.xml and web.xml in place, it's time to do the mandatory "Hello World" example, so let's create a place to store our JSP files. Create a WEB-INF/pages/view folder, and within this folder, create the file "helloWorld.jsp". In this file, we simply put:

-
helloWorld.jsp
-
<H2>Hello world!</H2>
-
-

 

- -

xwork.xml

- -

At this point, it's time to prepare the xwork configuration file, xwork.xml. Create an empty file named xwork.xml in the root of the 'src' folder. In this file we put:

-
xwork.xml
-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE xwork PUBLIC
-    "-//OpenSymphony Group//XWork 1.0//EN"
-    "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-<xwork>
-	<include file="webwork-default.xml" />
-
-	<package name="view" extends="webwork-portlet-default"
-		namespace="/view">
-		<action name="index"
-			class="com.opensymphony.xwork.ActionSupport">
-			<result name="success">/WEB-INF/pages/view/helloWorld.jsp</result>
-		</action>
-	</package>
-</xwork>
-
-

 

- -

Some important things to notice are that we create a package with namespace view, and our package extends the webwork-portlet-default package. The webwork-portlet-default package contains some special result types needed to run WebWork/XWork in a portlet container.

- -

JBoss Portal descriptors

- -

In addition to the regular portlet.xml and web.xml descriptors, JBoss Portal 2.2 requires us to add a couple of JBoss specific descriptor files. On of these descriptor files is named according to the name of the context root of our application, which in this case is the name of the exported war file itself. We will later create a war file named MyPortlet.war, so the name of the JBoss descriptor becomes 'MyPortlet-object.xml'. So we create this file in the WEB-INF folder, and insert the following text:

-
MyPortlet-object.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-<deployments>
-	<deployment>
-		<if-exists>overwrite</if-exists>
-		<parent-ref>default</parent-ref>
-		<properties />
-		<page>
-			<page-name>MyPortlet Tutorial</page-name>
-			<properties />
-			<window>
-				<window-name>MyPortletWindow</window-name>
-				<instance-ref>MyPortletInstance</instance-ref>
-				<region>center</region>
-				<height>0</height>
-			</window>
-		</page>
-	</deployment>
-	<deployment>
-		<if-exists>overwrite</if-exists>
-		<instance>
-			<instance-name>MyPortletInstance</instance-name>
-			<component-ref>MyPortlet.MyPortlet</component-ref>
-		</instance>
-	</deployment>
-</deployments>
-
-

 

- -

In addition, we need two other files, jboss-app.xml and jboss-portlet.xml which looks like this:

-
jboss-app.xml
-
<jboss-app>
-   <app-name>MyPortlet</app-name>
-</jboss-app>
-
-

 

-
jboss-portlet.xml
-
<portlet-app>
-   <portlet>
-      <portlet-name>MyPortlet</portlet-name>
-      <security>
-      </security>
-   </portlet>
-</portlet-app>
-
-

 

- -

Deployment

- -

Now we have a project structure that looks like this:

- -

Project structure
-

- -

Now it's time to try our incredible HelloWorld portlet. In a Windows Explorer session, we select the WEB-INF folder and zip it up and name the file 'MyPortlet.war'. Drop this war file in the server/default/deploy folder of JBoss Portal, and start the server. By default, the URL for JBoss portal is http://localhost:8080/portal, so point your browser to this address, and you will get to the front page of the portal, where you should get a "MyPortlet Tutorial" menu entry, as shown in the screenshot below. When pressing this menu link, you will get to our fantastic "Hello World" page!

- -

JBoss Portal front page
-

- -

MyPortlet portlet page
-

- -

Next step

- -

Next, let's do something a bit more interesting, namely create a simple form and display a result page. Let's start by creating our JSP that displays our form. Create a new file, 'helloForm.jsp' in the WEB-INF/pages/view/ folder. We will use the WebWork tag library to build the form on our page. The form itself will ask the user for a first name and last name, something like this:

-
helloForm.jsp
-
<%@ taglib uri="/webwork" prefix="ww" %>
-
-<H2>Hi there! Please enter your name</H2>
-<ww:form action="helloWorld" method="POST">
-	<ww:textfield label="First name" name="firstName" value="%{firstName}"/>
-	<ww:textfield label="Last name" name="lastName" value="%{lastName}"/>
-	<ww:submit value="Say hello!"/>
-</ww:form>
-
-

 

- -

Now we're ready to code some Java, not much, but at least a little bit. We create a new package in our src folder, let's name it com.opensymphony.webwork.portlet.tutorial. In this package, create a HelloWorldAction class. In usual WebWork manners, this class extends the ActionSupport class from the XWork framework, and we'll add a couple of properties that maps to our form in the JSP we just created:

-
HelloWorldAction.java
-
package com.opensymphony.webwork.portlet.tutorial;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class HelloWorldAction extends ActionSupport {
-	private String firstName;
-	private String lastName;
-	public String getFirstName() {
-		return firstName;
-	}
-	public void setFirstName(String firstName) {
-		this.firstName = firstName;
-	}
-	public String getLastName() {
-		return lastName;
-	}
-	public void setLastName(String lastName) {
-		this.lastName = lastName;
-	}
-}
-
-

 

- -

We also need a JSP to display the processed input. We'll just use the old helloWorld.jsp and modify it a bit. As with helloForm.jsp, we import the WebWork tag library, and we use the ww:property tags to display the input from the form:

-
helloWorld.jsp
-
<%@ taglib prefix="ww" uri="/webwork" %>
-
-<H2>Hello <ww:property value="firstName"/> <ww:property value="lastName"/></H2>
-<p/>
-<a xhref="<ww:url action="helloWorldInput"/>">Back to form</a>
-
-

 

- -

Re-deployment

- -

Now we're ready to do a re-deployment of our application, so zip up a new war and drop it in the server/default/deploy folder. The "MyPortlet Tutorial" page will now display:

- -

Hello World form
-

- -

Enter some data, and press the "Say hello!" button, and you will get a nice little personalized "hello" message:

- -

Personalized Hello World

- -

- -
- - diff --git a/docs/wikidocs/Portlet Tutorial_attachments/buildpath.jpg b/docs/wikidocs/Portlet Tutorial_attachments/buildpath.jpg deleted file mode 100644 index 6112ddb0a..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/buildpath.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/hello-world-form-1.jpg b/docs/wikidocs/Portlet Tutorial_attachments/hello-world-form-1.jpg deleted file mode 100644 index f5419af40..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/hello-world-form-1.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/hello-world-result-1.jpg b/docs/wikidocs/Portlet Tutorial_attachments/hello-world-result-1.jpg deleted file mode 100644 index 70d4dcd0b..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/hello-world-result-1.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/jboss-portal-frontpage.jpg b/docs/wikidocs/Portlet Tutorial_attachments/jboss-portal-frontpage.jpg deleted file mode 100644 index 9dc7beef2..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/jboss-portal-frontpage.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/jboss-portal-portlet-page.jpg b/docs/wikidocs/Portlet Tutorial_attachments/jboss-portal-portlet-page.jpg deleted file mode 100644 index 8afba04b7..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/jboss-portal-portlet-page.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/new-project-1.jpg b/docs/wikidocs/Portlet Tutorial_attachments/new-project-1.jpg deleted file mode 100644 index 368462664..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/new-project-1.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/new-project-2.jpg b/docs/wikidocs/Portlet Tutorial_attachments/new-project-2.jpg deleted file mode 100644 index 3ad275ddd..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/new-project-2.jpg and /dev/null differ diff --git a/docs/wikidocs/Portlet Tutorial_attachments/project-structure-hello-world-1.jpg b/docs/wikidocs/Portlet Tutorial_attachments/project-structure-hello-world-1.jpg deleted file mode 100644 index ff64e5d78..000000000 Binary files a/docs/wikidocs/Portlet Tutorial_attachments/project-structure-hello-world-1.jpg and /dev/null differ diff --git a/docs/wikidocs/Prepare Interceptor.html b/docs/wikidocs/Prepare Interceptor.html deleted file mode 100644 index 158452924..000000000 --- a/docs/wikidocs/Prepare Interceptor.html +++ /dev/null @@ -1,59 +0,0 @@ - - - WebWork - - Prepare Interceptor - - - - - - - - - - -
- -

This interceptor calls prepare() on actions which implement Preparable. This interceptor is very useful for - any situation where you need to ensure some logic runs before the actual execute method runs.

- -

A typical use of this is to run some logic to load an object from the database so that when parameters are set - they can be set on this object. For example, suppose you have a User object with two properties: id and - name. Provided that the params interceptor is called twice (once before and once after this interceptor), you - can load the User object using the id property, and then when the second params interceptor is called the parameter - user.name will be set, as desired, on the actual object loaded from the database. See the example for more - info.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points to this interceptor.

- - -

Examples

- -
-
<!-- Calls the params interceptor twice, allowing you to
-     pre-load data for the second time parameters are set -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="prepare"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Press Releases.html b/docs/wikidocs/Press Releases.html deleted file mode 100644 index fb8b06bbb..000000000 --- a/docs/wikidocs/Press Releases.html +++ /dev/null @@ -1,32 +0,0 @@ - - - WebWork - - Press Releases - - - - - - - - - - -
-

Here you will find all the press releases for WebWork. Each press release should include the About page at the top of it, which you don't need to worry about as long as you use the standard Press Release template.

- - - - -
- - diff --git a/docs/wikidocs/Previous releases.html b/docs/wikidocs/Previous releases.html deleted file mode 100644 index 63187ab59..000000000 --- a/docs/wikidocs/Previous releases.html +++ /dev/null @@ -1,59 +0,0 @@ - - - WebWork - - Previous releases - - - - - - - - - - -
- - - -

Old format of release notes and upgrade guides

- - - - -
- - diff --git a/docs/wikidocs/Projects Using WebWork.html b/docs/wikidocs/Projects Using WebWork.html deleted file mode 100644 index a6e811f79..000000000 --- a/docs/wikidocs/Projects Using WebWork.html +++ /dev/null @@ -1,115 +0,0 @@ - - - WebWork - - Projects Using WebWork - - - - - - - - - - -
-
    -
  • Atlassian Confluence - Commercial Wiki and knowledge management system using WebWork 2.0, Hibernate, Spring, and Velocity
  • -
  • Jive Software - With over 1100 customers, Jive Software's Forums and Knowledge Base products both use WebWork 2.1+ and are some of the largest deployments of WebWork
  • -
  • Midwinter - an open source rapid web application develop system using WebWork 2.0, Hibernate, Spring, and Velocity
  • -
- - - - - -
    -
  • DriveNow - last minute Autralian car rentals
  • -
- - -
    -
  • OpenReports - an open source web based reporting application that uses WebWork 2.0, Velocity, and Hibernate
  • -
- - -
    -
  • eSage Group is a consulting company that uses it for all their client engagements. Additionally, its used for their internal systems
  • -
- - - - - -
    -
  • TeraMEDICA - WebWork is used in TeraMEDICA's commercial TI2m product, which performs intelligent image management for the healthcare enterprise. Specifically, WebWork is a key component of the system's management interface.
  • -
- - -
    -
  • EBIA COBRA and 401K Benefits Site provides law reviews for employee benefits like COBRA and 401K. The site moved from all struts to a current architecture of about 50% WebWork and 50% Struts. We are trying to move it all over to WebWork. This site is also a great example of porting from Tiles to SiteMesh.
  • -
- - -
    -
  • Valtira Rolecall - Identity Management Framework that provides single sign-on for J2EE and .NET web applications.
  • -
- - - - - -
    -
  • JavaEye Reporting Tool - An open-source, web-based database reporting tool. It allows you to create reports without any programming (though you'll need SQL knowledge). It's a lightweight reporting environment, the report can be created to quickly share information via web.
  • -
- - -
    -
  • Dating-site - Commercial dating site (BE, dutch) ww2.1.7, hibernate
  • -
- - - - - -
    -
  • Agility Issue and Bug Tracker - Bug tracking software that makes heavy use of WW's Ajax Framework. Take a look at the dashboard for great examples of what can be done with WW.
  • -
- - -
    -
  • JavaBB - phpBB like forum system. Written and used at Javafree brazillian community.
  • -
- - -
    -
  • CRI - A pharmecutical marketing compliance application.
  • -
- - -
    -
  • Logicd.com - A logistics, shipping management, tracking, supply-chain management application.
  • -
- - -
    -
  • Green Array - Green Array empowers managers at every level, in every organization. Green Array's web-hosted software solution is a simple, fast, scalable way to improve visibility, collaboration and to accelerate team performance. Integrated SWT client and WebWork 2.2 html dashboard with Hibernate persistence.
  • -
- - - - - -
- - diff --git a/docs/wikidocs/Pure JavaScript Client Side Validation.html b/docs/wikidocs/Pure JavaScript Client Side Validation.html deleted file mode 100644 index 7940c09e8..000000000 --- a/docs/wikidocs/Pure JavaScript Client Side Validation.html +++ /dev/null @@ -1,43 +0,0 @@ - - - WebWork - - JavaScript Client Side Validation - - - - - - - - - - -
-

Pure JavaScript client side validation is the simplest but least feature-rich type of Client Side Validation. This type of validation uses 100% client-side JavaScript code to try to validate the values entered by the user. Because the validation logic is actually repeated in the JavaScript code, it is important to understand that some values will be considered acceptable by the JavaScript code but will be marked as unacceptable by the server-side Validation.

- -

Only the following validators are supported:

-
    -
  • required validator
  • -
  • requiredstring validator
  • -
  • stringlength validator
  • -
  • regex validator
  • -
  • email validator
  • -
  • url validator
  • -
  • int validator
  • -
  • double validator
  • -
- - -

Error reporting

- -

Because client side validation does not talk to the server, the theme (xhtml theme or css\_xhtml theme) is responsible for properly manipulating the HTML DOM to display the error message inline. The JavaScript that is responsible for doing this logic is validation.js and can be found in each theme.

- -
Errors are reported using the default validation message, not the internationalized version that the server-side might be aware of. This is a known issue. You may want to try the AJAX Client Side Validation for messages that are fully internationalized.
- -

Additional Validator Support

- -

If you wish to add additional validator support beyond those listed, you may override the xhtml theme teamplte form-close-validate.ftl. This file contains the JavaScript that tries to validate each user-entered value from within the browswer. The css\_xhtml theme extends the xhtml theme and therefore doesn't have it's own form-close-validate.ftl template.

- -
- - diff --git a/docs/wikidocs/Quartz.html b/docs/wikidocs/Quartz.html deleted file mode 100644 index 4fca584f3..000000000 --- a/docs/wikidocs/Quartz.html +++ /dev/null @@ -1,91 +0,0 @@ - - - WebWork - - Quartz - - - - - - - - - - -
-

The following class performs the glue between Quartz and WebWork:

- -
-
package com.trantek.sit.action;
-
-import com.opensymphony.xwork.ActionProxy;
-import com.opensymphony.xwork.ActionProxyFactory;
-import com.opensymphony.xwork.interceptor.component.ComponentInterceptor;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import java.util.HashMap;
-
-public class WebWorkJob implements Job
-{
-    public void execute(JobExecutionContext context) throws JobExecutionException
-    {
-        try
-        {
-            HashMap ctx = new HashMap();
-            ctx.put(ActionContext.PARAMETERS, context.getJobDetail().getJobDataMap());
-            ctx.put(ComponentInterceptor.COMPONENT_MANAGER, ???);
-            ctx.put(???, ???)
-            ServletDispatcher.createContextMap()
-            ActionProxy proxy = ActionProxyFactory.getFactory().
-                    createActionProxy("", context.getJobDetail().getName(), ctx);
-
-            proxy.execute();
-        }
-        catch (Exception e)
-        {
-            throw new JobExecutionException(e);
-        }
-    }
-}
-
- -

To schedule webwork actions you simply create a job where

- -
    -
  • the name of your job is the name of the WW action to execute (no ".action" suffix).
  • -
  • all the parameters you want to send to the WW action is contained in the JobDataMap of the JobDetail
  • -
- - - -

(the Quartz scheduler is setup as a servlet according to the javadocs of org.quartz.ee.servlet.QuartzInitializerServlet.)

- -

The following code schedules an e-mail action:

- -
-
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
-
-JobDetail jobDetail = new JobDetail("email.send", 
-                                     scheduler.DEFAULT_GROUP, WebWorkJob.class);
-
-Map m = jobDetail.getJobDataMap();
-m.put("to", "me@bogusdomain.com");
-m.put("subject", "quartz test");
-m.put("body", "This is a quartz test, Hey ho");
-m.put("smtpServer", "smtp.bogusdomain.com");
-m.put("from", "quartz@bogusdomain.com");
-
-SimpleTrigger trigger = new SimpleTrigger("myTrigger", 
-                                          scheduler.DEFAULT_GROUP, 
-                                          new Date(), null, 0, 0L);
-
-scheduler.deleteJob("email.send", scheduler.DEFAULT_GROUP);
-scheduler.scheduleJob(jobDetail, trigger);
-
- -

This example is based on WW1:Integrating Webwork and Quartz

- -
- - diff --git a/docs/wikidocs/QuickStart.html b/docs/wikidocs/QuickStart.html deleted file mode 100644 index 82ee9ce39..000000000 --- a/docs/wikidocs/QuickStart.html +++ /dev/null @@ -1,221 +0,0 @@ - - - WebWork - - QuickStart - - - - - - - - - - -
-

WebWork provides a quick way to get started called QuickStart. QuickStart is essentially a combination of a few technologies and some general conventions for developing web applications. What it lets you do is write applications without the need to even compile your sources, let alone have to deploy and redeploy them after every change. Instead, you can now develop your web applications just like if you were writing perl or PHP - on the fly and as quickly as you can think.

- -

How to Use It

- -

QuickStart is included in the WebWork distribution and can be launched by simply running java -jar webwork.jar quickstart:mywebapp. At this point you can access http://localhost:8080/mywebapp and begin developing your application. At this time, QuickStart requires Java 1.5.
Is Port 8080 really free for use?
-

If you face problems while starting applications via quickstart mechanism, leading to output like

-
-
java.net.BindException: Address already in use
-
-

 

- -

you already have a running container at IP port 8080. This may be the case if you installed a tomcat server distribution for your operating system, with autostart enabled. Please be sure to stop the application bound to port 8080 before trying to use quickstart.


- -

OK, it's a little more work than that, but not much more. QuickStart assumes the following directory structure:

-
    -
  • webwork -
      -
    • lib - all your required libs, usually the ones you would put in WEB-INF/lib
    • -
    • webapps -
        -
      • mywebapp -
          -
        • src -
            -
          • java - your java sources that would normally be compiled to WEB-INF/classes
          • -
          • webapp -
              -
            • WEB-INF -
                -
              • classes - any additional configuration if you'd like
              • -
              • web.xml
              • -
              -
            • -
            -
          • -
          -
        • -
        -
      • -
      -
    • -
    • webwork.jar
    • -
    • launcher.jar
    • -
    -
  • -
- - -

You can quickly get started by copying one of the existing webapps in the WebWork distribution.

- -

Once you have it up and running, you are free to change your classes, JSPs, template files, and other files on the fly - all without compiling or redeploying. Some files, such as web.xml, will require that you restart QuickStart for the changes to take affect. Similarly, some frameworks, such as Hibernate, do not offer the full class-reloading support that WebWork does. Your mileage may vary, but we think no matter what you'll love developing in QuickStart.

- -

Advanced Deployment

- -

Don't have a directory structure like the one laid out? Want to use a port other than 8080? No problem! There are two options for you:

-
    -
  • Apply additional command-line options
  • -
  • Use a quickstart.xml configuration file
  • -
- - -

Additional Command-line Options

- -

While the quickstart:xxx shorthand is nice, it often doesn't work for many people beyond the initial WebWork distribution packaging. So QuickStart allows you to specify three options from the command line:

-
    -
  • Context
  • -
  • Webapp directory
  • -
  • Source directory
  • -
- - -

Suppose your project layout is the following:

-
    -
  • project -
      -
    • lib - all your required libs, usually the ones you would put in WEB-INF/lib -
        -
      • src -
          -
        • java - your java sources that would normally be compiled to WEB-INF/classes
        • -
        • webapp -
            -
          • WEB-INF -
              -
            • classes - any additional configuration if you'd like
            • -
            • web.xml
            • -
            -
          • -
          -
        • -
        -
      • -
      -
    • -
    -
  • -
- - -

You could launch your application using QuickStart by executing the command:

- -

java -jar lib/webwork.jar quickstart /project src/webapp src/java

- -

Using the quickstart.xml File

- -

Sometimes the command line options still aren't enough. For whatever reasons, port 8080 might not be enough, or you may need to extend other configurations. Or perhaps your libs are not in your project but instead are in some other directory (very common if you use Maven to build your project). To help out, QuickStart provides a configuration file that let's you tweak how the deployment happens and how it is configured as much as you'd like. Consider the sample quickstart.xml file:

-
-
<configuration>
-    <!--
-    QuickStart can be used to extend other QuickStart configurations.
-    This is great for applications that have multiple "editions" and
-    extend upon a base webapp or evven just a base set of classes.
-    -->
-    <!--<extendsConfig>../path/to/quickstart.xml</extendsConfig>-->
-
-    <!--
-    QuickStart supports reading your IDEA module configuration and
-    using the libraries there. This is especially useful for maven
-    users who don't have a single directory in their project that
-    contains all the libraries they need.
-    -->
-    <!--<ideaConfig>ShowCase.iml</ideaConfig>-->
-
-    <!-- The context in which to deploy the web application -->
-    <context>/showcase</context>
-
-    <!-- The port in which to deploy the web application -->
-    <port>8080</port>
-
-    <!--
-    The libs directories can be a jar, a directory of jars, or even
-    a directory of directories (searched recursively)
-    -->
-    <libs>
-        <dir>../../lib</dir>
-    </libs>
-
-    <!--
-    Optional: the location where your source files are. If this is
-    not included, the auto-recompiling feature of QuickStart will
-    not be enabled. You may wish to do this anyway, as this feature
-    has been known to cause strange side effects. If you don't
-    specify your sources, you must specify where your classes are by
-    using the classDirs and libs elements
-    -->
-    <sources>
-        <dir>src/java</dir>
-    </sources>
-
-    <!--
-    The classDirs directories can be a jar or a directory of classes
-    -->
-    <classDirs>
-        <dir>src/webapp/WEB-INF/classes</dir>
-    </classDirs>
-
-    <!--
-    You can specify one or more directories where your webapp files
-    are located. This is useful if you have your project split up in
-    unique ways. You can also specify the path that the directory is
-    mapped to, relative to the context.
-    -->
-    <webDirs>
-        <webDir>
-            <path>/</path>
-            <dir>src/webapp</dir>
-        </webDir>
-    </webDirs>
-</configuration>
-
-

 

- -

If you use this deployment technique, you must remember that quickstart.xml must be in the same working directory in which you execute the java -jar webwork.jar quickstart command. You don't need to pass any additional command line arguments to QuickStart, but you must have this file in your working directory.

- -

How It Works

- -

QuickStart works by using the combination of WebWork's "share nothing" (or rather, "share very little") architecture, an embedded Jetty server, some advanced class loading, and the Eclipse Java compiler (don't worry, the Eclipse IDE is not required!)

- -

Running webwork.jar bootstraps the classpath and includes every jar found in the lib directory. It also includes webwork.jar, of course. It then invokes the QuickStart application. This, in turn, starts a Jetty server that is configured to the webapp specified in the quickstart:xxx argument.

- -

The Jetty server's context ClassLoader is specified as a custom ClassLoader that looks at the source files in webapps/xxx/src/java and compiles them on the fly. These classes are also reloaded whenever a change is detected.

- -

Because WebWork creates a new action on every request, reloading the classes works great. You are free to change the entire class schema (methods, fields, inheritance, etc). Because none of the objects are cached or stored in long-term storage, you usually won't run into any problems here.

- -

Running in Your IDE

- -

Running QuickStart from your IDE is no different than running it from the command line. The only difference is that you need to set up the structure and classpath in your IDE properly. It doesn't really matter what is in the classpath as long the WebWork jar is included. Pay close attention to your working directory.

- -

An example of what IntelliJ IDEA looks like when launching QuickStart from within the WebWork project is included for reference (click for a larger view):

- -

- -

Common Pitfalls

- -

While WebWork is pretty good about making class reloading in QuickStart easy, other libraries and code are not. As a general rule of thumb, if any objects have long term state (singleton, session scope, etc), they will not be reloaded. The reloaded classes will only take affect after a new instance has been created with the new keyword or through reflection.

- -

For example, Hibernate has been found to store references to the objects it persists for long periods of time because of it's caching mechanism. It also happens to hold a reference to the Class instance itself. This makes it very difficult, if not impossible, to allow you to change your models on the fly.

-Most problems will manifest themselves through a ClassCastException, or some other weird class-related error. You may even find yourself banging your head against the wall because some Foo instance can't be cast to the Foo class. This is the biggest challenge with using QuickStart and can best be mitigated by using libraries and code that share very little state.

- -

A final word of warning: QuickStart is not meant for production use, or even to be used as the sole environment for application development. Rather, it is meant to help you quickly develop proof-of-concepts and see results quickly. We recommend you always at least test in other applications servers, such as Tomcat, Resin, or even standalone Jetty.

- -
- - diff --git a/docs/wikidocs/QuickStart_attachments/idea.png b/docs/wikidocs/QuickStart_attachments/idea.png deleted file mode 100644 index e6a1f7db3..000000000 Binary files a/docs/wikidocs/QuickStart_attachments/idea.png and /dev/null differ diff --git a/docs/wikidocs/Redirect Action Result.html b/docs/wikidocs/Redirect Action Result.html deleted file mode 100644 index d0d04427d..000000000 --- a/docs/wikidocs/Redirect Action Result.html +++ /dev/null @@ -1,68 +0,0 @@ - - - WebWork - - Redirect Action Result - - - - - - - - - - -
- -

This result uses the ActionMapper provided by the ActionMapperFactory to redirect the browser to a - URL that invokes the specified action and (optional) namespace. This is better than the ServletRedirectResult - because it does not require you to encode the URL patterns processed by the ActionMapper in to your xwork.xml - configuration files. This means you can change your URL patterns at any point and your application will still work. - It is strongly recommended that if you are redirecting to another action, you use this result rather than the - standard redirect result.

- - -
See ActionMapper for more details
- -

Parameters

- - -

    - -

  • actionName (default) - the name of the action that will be redirect to
  • - -

  • namespace - used to determine which namespace the action is in that we're redirecting to . If namespace is - null, this defaults to the current namespace
  • - -

- - -

Examples

- -
-
<package name="public" extends="webwork-default">
-    <action name="login" class="...">
-        <!-- Redirect to another namespace -->
-        <result type="redirect-action">
-            <param name="actionName">dashboard</param>
-            <param name="namespace">/secure</param>
-        </result>
-    </action>
-</package>
-
-<package name="secure" extends="webwork-default" namespace="/secure">
-    <-- Redirect to an action in the same namespace -->
-    <action name="dashboard" class="...">
-        <result>dashboard.jsp</result>
-        <result name="error" type="redirect-action>error</result>
-    </action>
-
-    <action name="error" class="...">
-        <result>error.jsp</result>
-    </action>
-</package>
-
- -
- - diff --git a/docs/wikidocs/Redirect Result.html b/docs/wikidocs/Redirect Result.html deleted file mode 100644 index e846f7656..000000000 --- a/docs/wikidocs/Redirect Result.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork - - Redirect Result - - - - - - - - - - -
- -

Calls the {@link HttpServletResponse#sendRedirect(String) sendRedirect} - method to the location specified. The response is told to redirect the - browser to the specified location (a new request from the client). The - consequence of doing this means that the action (action instance, action - errors, field errors, etc) that was just executed is lost and no longer - available. This is because actions are built on a single-thread model. The - only way to pass data is through the session or with web parameters - (url?name=value) which can be OGNL expressions.

- - -

Parameters

- - -

    - -

  • location (default) - the location to go to after execution.
  • - -

  • parse - true by default. If set to false, the location param will - not be parsed for Ognl expressions.
  • - -

- -

- This result follows the same rules from WebWorkResultSupport. -

- - -

Examples

- -
-
<result name="success" type="redirect">
-  <param name="location">foo.jsp</param>
-  <param name="parse">false</param>
-</result>
-
- - -
- - diff --git a/docs/wikidocs/RegexFieldValidator Annotation.html b/docs/wikidocs/RegexFieldValidator Annotation.html deleted file mode 100644 index 480431f1a..000000000 --- a/docs/wikidocs/RegexFieldValidator Annotation.html +++ /dev/null @@ -1,74 +0,0 @@ - - - WebWork - - RegexFieldValidator Annotation - - - - - - - - - - -
-

RegexFieldValidator Annotation

- -

Validates a string field using a regular expression.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -
-
@RegexFieldValidator( key = "regex.field", expression = "yourregexp")
-
- - -
- - diff --git a/docs/wikidocs/Related Tools.html b/docs/wikidocs/Related Tools.html deleted file mode 100644 index c3a7ff699..000000000 --- a/docs/wikidocs/Related Tools.html +++ /dev/null @@ -1,45 +0,0 @@ - - - WebWork - - Related Tools - - - - - - - - - - -
-

WebWork has several tools that can help when developing WebWork-based applications. Some of these, such as the Config Browser, are used within your web applications. Others, such as those run from in webwork.jar, are used at build-time.

- -

Runtime tools

- -
    -
  1. Config Browser
  2. -
- - -

Build-time tools

- - -

WebWork comes with various related tools included in the webwork jar file. You can access these tools by simply - unpacking the WebWork distribution and running java -jar webwork.jar. WebWork will automatically include all - jars in the same directory as the webwork.jar file as well as all jars in the lib directory. This means you - can invoke these tools either from within the standard directory structure found in the WebWork distribution, or from - within your WEB-INF/lib directory.

- -

You can access the help information for these tools by simply running the jar without any arguments.

- - -
    -
  1. SiteGraph
  2. -
  3. QuickStart
  4. -
- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.1.html b/docs/wikidocs/Release Notes - 2.1.1.html deleted file mode 100644 index aaa6c2c66..000000000 --- a/docs/wikidocs/Release Notes - 2.1.1.html +++ /dev/null @@ -1,541 +0,0 @@ - - - WebWork - - Release Notes - 2.1.1 - - - - - - - - - - -
-

WebWork 2.1.1 Release Notes

- -

Key Changes

-
    -
  • Improved integration with Sitemesh -
      -
    • WebWork taglibs can be used in Sitemesh decorators to access Action properties
    • -
    -
  • -
  • Validator short-circuiting to allow validation to stop on first invalid data
  • -
  • Improved class hierarchy resource bundle searching
  • -
  • File upload support has been rebuilt to allow for multiple files with the same HTTP parameter name. Besides "cos" and "pell" support, "jakarta" support has been added, utilizing the Commons-FileUpload library. Only "jakarta" supports multiple files with the same HTTP parameter name. In future versions "jakarta" may become the default upload library, replacing "pell".
  • -
- - -

Migration Notes

- - - - - - - - - - - - - - - - - - - - -
Version Description Old Code New Code
2.1 There is a new validator DTD: xwork-validator-1.0.2.dtd. You aren't required to use this, but you will need to if you wish to use the new short-circuiting validation N/A N/A
2.1 File upload support has been rebuilt, although we don't see any compatibility problems with 2.1. However, many of the methods in MultiPartRequest have become deprecated in favor of new ones. Please switch to these as soon as possible. N/A N/A
- -

Changelog

-

WebWork 2.1.1

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (25 issues) -
- T - Key - Summary
- Bug - - WW-1078 - - Broken links in Shopping-Cart -
- Bug - - WW-1077 - - setting theme in page, context, or session scope has not effect -
- Task - - WW-1076 - - Move all Velocity templates to archive -
- Task - - WW-1075 - - url validator docs -
- Task - - WW-1074 - - AJAX docs screwed up -
- Task - - WW-1073 - - control tags docs snippets are borken -
- Bug - - WW-1072 - - select.ftl emptyOption evaluation -
- Bug - - WW-1071 - - DoubleSelect's second select does not allow a predefined value to be selected -
- Bug - - WW-1070 - - double select created option with key and value wrongly -
- Improvement - - WW-1069 - - Ability to use freemarker map built-ins (?keys, ?values) as well as plain map methods (.keySet(), get(foo)) -
- Improvement - - WW-1065 - - TestCase for the Property component -
- Task - - WW-1064 - - have a link in tags page to altsyntax page -
- New Feature - - WW-1062 - - Add a OptionTransferSelect component -
- Bug - - WW-1061 - - checkboxlist.ftl does not allow disabled parameter handling in WW2.2beta4 -
- Task - - WW-1059 - - Make the dojo configuration in ww:head hook into the il8n infrastructure -
- Bug - - WW-1058 - - xhtml theme's form-validate.ftl onsubmit javascript is bad -
- Bug - - WW-1057 - - DefaultActionMapper appending extra slash when namespace is "/" -
- Improvement - - WW-1056 - - Change defaultStack order -
- Improvement - - WW-1055 - - Warn when properties are null -
- Task - - WW-1054 - - Include common build in project -
- Task - - WW-1053 - - AJAX Validation Documentation -
- Bug - - WW-1052 - - Always cleanup ActionContext -
- Improvement - - WW-1051 - - Enable tag attribute description to be usable for both javadoc and tagdoclet -
- Task - - WW-1050 - - Add DWR 1.1-beta2 jar to ivy-repository -
- Bug - - WW-1049 - - ChainingInterceptor doesn't accept null of CompoundRoot element -
-

- - -

Xwork 1.0.2

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (15 issues) -
- T - Key - Summary
- Improvement - - XW-210 - - Make default type conversion message a localized text that can be overidden -
- Bug - - XW-205 - - missing xwork 1.0.2 dtd in jar and website and typo in ValidationInterceptor -
- Improvement - - XW-204 - - TextProvider.getText() should look in child property files -
- Improvement - - XW-203 - - Add "trim" parameter to string validators -
- Bug - - XW-202 - - Integer and Float conversion dont work in CVS HEAD -
- Bug - - XW-200 - - i18n broken when the name of the text to find starts with a property exposed by the action -
- Improvement - - XW-195 - - Add interface XWorkStatics which contains XWork-related constants from WebWorkStatics -
- Improvement - - XW-194 - - Patch to help LocalizedTextUtil deal with messages for indexed fields (collections) -
- Improvement - - XW-193 - - InstantiatingNullHandler and Typeconversion fails -
- Improvement - - XW-192 - - Create a version 1.0.2 of the XWork validation DTD with short circuit -
- Improvement - - XW-191 - - Type conversion improvement. -
- Improvement - - XW-190 - - Provide a xwork-default.xml. -
- Improvement - - XW-189 - - Improve ActionValidationManager's short circuit behaviour -
- Improvement - - XW-179 - - Optimise OgnlUtil.copy method -
- New Feature - - XW-172 - - XWorkBasicConverter doesn't care about the current locale -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.2.html b/docs/wikidocs/Release Notes - 2.1.2.html deleted file mode 100644 index 5cd676420..000000000 --- a/docs/wikidocs/Release Notes - 2.1.2.html +++ /dev/null @@ -1,210 +0,0 @@ - - - WebWork - - Release Notes - 2.1.2 - - - - - - - - - - -
-

WebWork 2.1.2 Release Notes

- -

Key Changes

-
    -
  • This version ships with XWork 1.0.3 – we recommend you make sure you are running this version (or later) of XWork.
  • -
  • Minor bug fixes for file upload support with Jakarta
  • -
  • New StreamResult type which allows you to stream content directly back from an action
  • -
  • UI tags may now be written in languages other than Velocity. JSP is supported, though you currently must write your own templates similar to the Velocity templates. Future versions of WebWork will include more languages supported as well as templates shippped out of the box.
  • -
- - -

Migration Notes

- -

Migration should require nothing more than copying over the new libs. Specifically note that XWork 1.0.3 and WebWork 2.1.2 should be copied over.

- -

Changelog

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (14 issues) -
- T - Key - Summary
- Improvement - - WW-642 - - Allow the 'name' attribute of the TextTag to be evaluated at runtime -
- Bug - - WW-639 - - "Could not open template ", possible a bug -
- Improvement - - WW-634 - - File Upload Interceptor stack -
- Bug - - WW-633 - - Jakarta File Upload fails with mixed content (normal and file) -
- New Feature - - WW-630 - - upload newest webwork files to ibiblio -
- Improvement - - WW-629 - - checkboxlist doesn't have a disabled attribute tag -
- Bug - - WW-628 - - Bug with request parameter handling with WebLogic 8.1sp3 -
- Bug - - WW-624 - - If/Else tag do not render body -
- Bug - - WW-622 - - The changelog for WW2.1.1 shows open issues not the closed ones! -
- Bug - - WW-616 - - ww:label and ww:textarea problem with null values -
- Bug - - WW-612 - - WebworkStatistics.SERVLET_DISPATCHER is spelled incorrectly -
- Bug - - WW-611 - - Error in Freemarker docs -
- New Feature - - WW-602 - - Stream Result Type -
- Task - - WW-485 - - Add docs for WebWork2 tags -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.3.html b/docs/wikidocs/Release Notes - 2.1.3.html deleted file mode 100644 index 76f7cec03..000000000 --- a/docs/wikidocs/Release Notes - 2.1.3.html +++ /dev/null @@ -1,68 +0,0 @@ - - - WebWork - - Release Notes - 2.1.3 - - - - - - - - - - -
-

WebWork 2.1.3 Release Notes

- -

Key Changes

-

WebWork version 2.1.3 resolves a critical problem preventing UI tags from working under certain circumstances. It is recommended that all users use 2.1.3 in place of 2.1.1 or 2.1.2

- -

Changelog

- -

- - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (2 issues) -
- T - Key - Summary
- Bug - - WW-659 - - VelocityTemplateEngine broken -
- New Feature - - WW-321 - - ActionMessage as the companion of ActionError -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.4.html b/docs/wikidocs/Release Notes - 2.1.4.html deleted file mode 100644 index 858b490be..000000000 --- a/docs/wikidocs/Release Notes - 2.1.4.html +++ /dev/null @@ -1,73 +0,0 @@ - - - WebWork - - Release Notes - 2.1.4 - - - - - - - - - - -
-

WebWork 2.1.4 Release Notes

- -

Key Changes

-

This release is the first release to include the re-vamped JSP tag support. Specifically, there is an option (off by default) that now lets you use an alternative syntax for JSP tags.

- -

When webwork.tag.altSyntax is set to true in webwork.properties, all attributes in the JSP tags (both UI and non-UI) that evaluate to a String (as opposed to a Boolean, Integer, Collection, or anything else) shall not be evaluated like it normally is.

- -

Rather, the string will be parsed for the pattern "%{...}" and only the text between those braces shall be evaluated. This should make using all the tags, but especially the UI tags, much easier.

- -

The only exception to this rule of parsing String attributes is for the <ww:property/> tag. That is because the usage for <ww:property/> is so commonly used for pulling values from the stack, enforcing the "%{..}" syntax on it would be overly tedious.

- -

Migration Notes

- -

There is nothing to migrate for now. Because this new syntax is optional and turned off by default, you don't need to do anything to migrate as long as you don't plan to use this new syntax. If you DO plan to use this new syntax, you must modify all your tag attributes that previously had the pattern of "'...'" to just be "...". Basically, you must remove single quotes where they once were.

- -

Also, any place where an attribute did not have single quotes, you must check to see if the attribute is expected to be a String attribute. If so, you should replace the pattern of "..." with "%{...}" so that the expression is still being evaluated.

- -

Note that attributes such as disabled, maxlength, etc do not need the new syntax. That is becaus the syntax is only applied to attributes that are expected to be strings. This is very important to remember!

- -

Finally, please note that this release is a preview release for the new syntax. The new syntax will not be finalized and turned on by default until 2.2.0. You are free to use it, but it is not guaranteed to be stable and may change in the coming releases.

- -

Changelog

- -

- - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (1 issues) -
- T - Key - Summary
- Improvement - - WW-581 - - JSP Tags should support better syntax -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.5.html b/docs/wikidocs/Release Notes - 2.1.5.html deleted file mode 100644 index 6a813b8af..000000000 --- a/docs/wikidocs/Release Notes - 2.1.5.html +++ /dev/null @@ -1,268 +0,0 @@ - - - WebWork - - Release Notes - 2.1.5 - - - - - - - - - - -
-

WebWork 2.1.5 Release Notes

- -

Key Changes

-
    -
  • All UI tags now support the complete set of JavaScript event listeners now, such as onChange, onBlur, etc.
  • -
  • ExecuteAndWaitInterceptor is easier to use
  • -
  • Several important bug fixes for Velocity integration
  • -
- - - -

Migration Notes

- - - - - - - - - - - - - - -
Version Description Old Code New Code
2.1.4 and below TLD updated – be sure you are using the latest webwork.tld file N/A N/A
- - -

Changelog

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (18 issues) -
- T - Key - Summary
- Improvement - - WW-666 - - ExecAndWaitInterceptor should put executing action on the stack -
- Bug - - WW-663 - - VelocityResult doesn't initialize VelocityManager -
- Improvement - - WW-660 - - xhtml's checkbox.vm vertical alignment -
- Improvement - - WW-658 - - JSP Tags do not support onFocus, onBlur js handlers -
- Bug - - WW-653 - - url taglib does not support 'page' attribute but the webwork-example.war uses it all over the place. -
- Improvement - - WW-651 - - IfTag does not convert to Boolean -
- Bug - - WW-644 - - Xhtml generated by the ui tags is (still) invalid -
- Improvement - - WW-632 - - Onclick for radiotag -
- Bug - - WW-627 - - select.vm requires htmlEncode for name parameter -
- New Feature - - WW-626 - - Principal Interceptor -
- Bug - - WW-614 - - Cannot set velocity macro autoreloading -
- Bug - - WW-554 - - Bad value for IMAGES_URI in JasperReportsResult.java -
- Bug - - WW-526 - - Velocity using include ignores character encoding -
- Bug - - WW-479 - - getValueClassType() in ComboboxTag returns Boolean.class -
- Improvement - - WW-425 - - Refactoring to decouple the UI Tag dependency on velocity -
- Task - - WW-392 - - Update doubleselect tag -
- Bug - - WW-223 - - Multipart & SaveDir -
- Improvement - - WW-161 - - ServletDispatcher could be a lot simpler to extend -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.6.html b/docs/wikidocs/Release Notes - 2.1.6.html deleted file mode 100644 index 0a661c62d..000000000 --- a/docs/wikidocs/Release Notes - 2.1.6.html +++ /dev/null @@ -1,90 +0,0 @@ - - - WebWork - - Release Notes - 2.1.6 - - - - - - - - - - -
-

WebWork 2.1.6 Release Notes

- -

Key Changes

-

This release includes a few bug fixes for the URL tag, a new base class to make type conversion easier, and better documentation. It also includes the latest XWork release: version 1.0.4

- -

Changelog

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (4 issues) -
- T - Key - Summary
- Improvement - - WW-673 - - Create a WebWorkTypeConverter for extension -
- Improvement - - WW-671 - - URLTag does not include parameters when value is specified -
- New Feature - - WW-664 - - Document WebFlow -
- Improvement - - WW-585 - - ComboBoxTag should sublass TextFieldTag -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes - 2.1.html b/docs/wikidocs/Release Notes - 2.1.html deleted file mode 100644 index 3f1617f25..000000000 --- a/docs/wikidocs/Release Notes - 2.1.html +++ /dev/null @@ -1,376 +0,0 @@ - - - WebWork - - Release Notes - 2.1 - - - - - - - - - - -
-

Key Changes

- -
    -
  • 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
  • -
  • The label attribute in UI tags are no longer required
  • -
  • The themes and templates in UI tags behave like they did in 1.x
  • -
  • A new theme, in addition to the existing "xhtml" one, called "simple" is included that doesn't have any of the labels, error reporting, or table rows that the "xhtml" template has. This is more in line with the tags included with Struts.
  • -
  • New UI tags for CSS styles and classes added: cssStyle and cssClass
  • -
  • Old action!command URL support works again. This means you can invoke a doCommand() method like in 1.x
  • -
  • 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.
  • -
  • UI tags now have access to the FormTag parameter map using the "form" key. This means $parameters.form.name would return the form name, for example. The result is that complex JavaScript-based components can be built.
  • -
- - -

Migration Notes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Version Description Old Code New Code
2.0 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   
2.0 The webwork.ui.templateDir configuration property has been broken into webwork.ui.templateDir and webwork.ui.theme
-
webwork.ui.templateDir= /webwork/mytheme
-
-
webwork.ui.templateDir = /webwork 
-webwork.ui.theme = mytheme
-
2.0 "namespace" attribute of the ww:action tag is now evaluated; those upgrading from 2.0 will need to place single quotes around the attribute value <ww:action namespace="/foo" .../> <ww:action namespace="'/foo'" .../>
2.0, but not 1.x 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 <ww:xxxx theme="/template/foo" template="bar.vm"/> <ww:xxxx theme="'foo'" template="'bar.vm'"/>
1.x, 2.0 label UI tag evaluates the value attribute now instead of the name attribute <ww:label name="'Foo'"/> <ww:label value="'Foo'"/>
- -

Changelog

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (25 issues) -
- T - Key - Summary
- Improvement - - WW-592 - - Upgrade commons-logging -
- Bug - - WW-560 - - SessionMap holds on to requests when it doens't need to -
- New Feature - - WW-546 - - Make the config-browser show validators applied via the XML validation files -
- Bug - - WW-544 - - Velocity result hardcodes contenttype and encoding -
- Improvement - - WW-541 - - Webpage link for download -
- Bug - - WW-537 - - Velocity tag outputs to the response, not the velocity writer -
- Bug - - WW-530 - - Config Browser doesn't work after lates ActionConfig refactoring -
- Bug - - WW-519 - - ActionTag should evaluate namespace attribute -
- Improvement - - WW-518 - - Label attribute shouldn't be required -
- Bug - - WW-517 - - Themes and templates should behave like 1.x -
- Improvement - - WW-516 - - Simple theme that has no tables and xhtml extends from -
- Bug - - WW-515 - - Class attribute is illegal -
- Bug - - WW-514 - - Form tag double evaluates name attribute -
- Bug - - WW-503 - - Fix tag libraries -
- Bug - - WW-502 - - foo!default.action should work -
- New Feature - - WW-501 - - JavaSript-based client side validation -
- Bug - - WW-500 - - ww:param tag fixes -
- New Feature - - WW-499 - - UI tags should have access to form -
- Task - - WW-488 - - Check QuickStart Guide to make sure it works -
- Bug - - WW-487 - - WebWorkConversionErrorInterceptorTest in wrong branch -
- Bug - - WW-484 - - label tag problems -
- Bug - - WW-478 - - URLTag tld entry does not correspond with actual property -
- Improvement - - WW-476 - - WebWork needs a simple changelog for each release -
- Bug - - WW-475 - - Multipart encoding still not fixed -
- Bug - - WW-474 - - Ability to dynamically create array of Objects from a given request -
-

- - -
- - diff --git a/docs/wikidocs/Release Notes.html b/docs/wikidocs/Release Notes.html deleted file mode 100644 index 0f2549d58..000000000 --- a/docs/wikidocs/Release Notes.html +++ /dev/null @@ -1,4067 +0,0 @@ - - - WebWork - - Release Notes - - - - - - - - - - -
-

WebWork 2.2.2 Release Notes

- -

Key Changes

- -

Portlets

-
    -
  • Portlet tests added, logging and url fixed
  • -
  • Added support for Velocity
  • -
- - -

Validation

- - - -

UI and Views

-
    -
  • New and improved components: Submit now supporting image and html button flavours, Reset, RichTextEditor, url, Date, Token
  • -
  • Various components now have tooltip support
  • -
  • Freemarker and Velocity bugfixes
  • -
  • Better integration with SiteMesh for Freemarker and JSTL
  • -
  • Various bug fixes for the xhtml and ajax theme
  • -
  • Added support for using Tiles
  • -
  • Support for new Plaintext Result type
  • -
- - -

Tools

- - - -

Misc

- - - -

Migration Notes

- -

WebWork 2.2.2 is a bugfix release, with minor improvements, mostly related to the view layer(s). Migration from 2.2.2 should be trivial, with one caveat for the Param tag.
-WebWork 2.2.2 is the final release under the Opensymphony umbrella. WebWork is now moving to the Apache group and will serve as basis for the new Struts Action 2.0 which is scheduled for august 2006.

- -

Changelog

- -

For a complete list of all the changes, please refer to the complete changelog

- - -

Known Issues

- -

XSL Result is known to have issues with Java 5.0.

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (113 issues) -
- T - Key - Summary - Assignee - Reporter - Pr - Status - Res - Created - Updated - Due
- Bug - - WW-1264 - - Fix broken calender i18n js scripts - - Rene Gielen - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 22, 2006 - - Mar 22, 2006 - - -
- Bug - - WW-1263 - - config-browser - can not list interceptors correctly - - Rainer Hermanns - - Claus Ibsen - - Major - - ClosedClosed - - FIXED - - Mar 22, 2006 - - Mar 22, 2006 - - -
- Bug - - WW-1262 - - showcase - some issues - - Rene Gielen - - Claus Ibsen - - Minor - - OpenOpen - - UNRESOLVED - - Mar 22, 2006 - - Mar 22, 2006 - - -
- Improvement - - WW-1261 - - add a test directory and a sample test case to webapp "ant new" target - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Mar 22, 2006 - - Mar 22, 2006 - - -
- Improvement - - WW-1258 - - Ignoring ClientDisconnectExceptions in the log file - - Rene Gielen - - Jeroen van Vianen - - Minor - - ClosedClosed - - WON'T FIX - - Mar 20, 2006 - - Mar 21, 2006 - - -
- New Feature - - WW-1256 - - Create a ww:reset component to work along with ww:submit - - Rene Gielen - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 19, 2006 - - Mar 21, 2006 - - -
- Task - - WW-1254 - - zipped distribution should contain a project directory webwork-X.Y.Z - - Alexandru Popescu - - Rainer Hermanns - - Major - - ResolvedResolved - - FIXED - - Mar 19, 2006 - - Mar 19, 2006 - - -
- New Feature - - WW-1253 - - Default Action Support - - Unassigned - - Andres March - - Minor - - ResolvedResolved - - FIXED - - Mar 18, 2006 - - Mar 18, 2006 - - -
- Bug - - WW-1251 - - Running ant new in webapps fails - - Claus Ibsen - - Eric Molitor - - Major - - ClosedClosed - - FIXED - - Mar 18, 2006 - - Mar 21, 2006 - - -
- Bug - - WW-1249 - - FileUploadInterceptor not using internationalized error message - - Don Brown - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Mar 17, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1248 - - DatePickerTag single click not working - - Rene Gielen - - Claus Ibsen - - Minor - - ClosedClosed - - FIXED - - Mar 17, 2006 - - Mar 17, 2006 - - -
- Task - - WW-1247 - - Document interceptor properties overriding on action configuration level - - tm_jee - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 17, 2006 - - Mar 18, 2006 - - -
- Task - - WW-1246 - - Document excludeMethods / includeMethods parameters for validator, token and workflow interceptor - - tm_jee - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 17, 2006 - - Mar 18, 2006 - - -
- Improvement - - WW-1245 - - Add an example for the Date component in showcase app - - Rainer Hermanns - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 16, 2006 - - Mar 20, 2006 - - -
- Bug - - WW-1244 - - Velocity doubleselect tag exmple does not work as expected in showcase application - - Rene Gielen - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 16, 2006 - - Mar 18, 2006 - - -
- Bug - - WW-1243 - - doubleselect tag causes exception, indicating invalid stack constitution assumption - - Rene Gielen - - Rene Gielen - - Minor - - ResolvedResolved - - FIXED - - Mar 16, 2006 - - Mar 18, 2006 - - -
- Bug - - WW-1242 - - action attribute in form ads .action onto value - - Rainer Hermanns - - Ian Roughley - - Major - - ClosedClosed - - FIXED - - Mar 16, 2006 - - Mar 17, 2006 - - -
- Improvement - - WW-1241 - - Have ObjectFactoryDestroyable and ObjectFactoryLifecycle (in addition to the current ObjectFactoryInitlalizable) - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Mar 16, 2006 - - Mar 16, 2006 - - -
- Improvement - - WW-1240 - - Improve component parameter documentation to have real javadoc - - Rene Gielen - - Rene Gielen - - Major - - ClosedClosed - - FIXED - - Mar 15, 2006 - - Mar 18, 2006 - - -
- Bug - - WW-1239 - - MultiPartRequestWrapper uses Class.forName resulting in 500 error - - Rainer Hermanns - - Nick Hill - - Major - - ResolvedResolved - - FIXED - - Mar 14, 2006 - - Mar 15, 2006 - - -
- Improvement - - WW-1238 - - Fix Getting Started Documentation - - Rene Gielen - - Rene Gielen - - Major - - ResolvedResolved - - FIXED - - Mar 13, 2006 - - Mar 22, 2006 - - -
- Improvement - - WW-1237 - - Refine logging - - Nils-Helge Garli - - Nils-Helge Garli - - Minor - - ClosedClosed - - FIXED - - Mar 12, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1236 - - Missing test for null 'action' property in start() of URL component? - - Unassigned - - Nils-Helge Garli - - Major - - ResolvedResolved - - FIXED - - Mar 12, 2006 - - Mar 16, 2006 - - -
- Improvement - - WW-1235 - - JakartaMultiPartRequest - refactor to not used deprecated methods - - Claus Ibsen - - Claus Ibsen - - Minor - - ClosedClosed - - FIXED - - Mar 11, 2006 - - Mar 11, 2006 - - -
- Improvement - - WW-1234 - - replace deprecated way of geting Freemarker's Configuration in FreemarkerManager - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Mar 11, 2006 - - Mar 11, 2006 - - -
- New Feature - - WW-1233 - - Add a Plain Text Result - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Mar 11, 2006 - - Mar 11, 2006 - - -
- Bug - - WW-1231 - - ActionMapper no support for multipart request - - Rainer Hermanns - - yoshihara hidehiko - - Minor - - ResolvedResolved - - FIXED - - Mar 10, 2006 - - Mar 16, 2006 - - -
- Improvement - - WW-1230 - - Improve portal integration unit tests - - Nils-Helge Garli - - Nils-Helge Garli - - Major - - ClosedClosed - - FIXED - - Mar 09, 2006 - - Mar 21, 2006 - - -
- Bug - - WW-1228 - - When deploying portlets that use the new webwork Jsr168Dispatcher class the portlet titles are unavailable in liferay 3.6.1 - - Nils-Helge Garli - - Jason Thorpe - - Major - - ClosedClosed - - FIXED - - Mar 07, 2006 - - Mar 17, 2006 - - -
- Improvement - - WW-1227 - - Showcase - token examples - - Rainer Hermanns - - Claus Ibsen - - Minor - - ClosedClosed - - FIXED - - Mar 05, 2006 - - Mar 05, 2006 - - -
- Bug - - WW-1226 - - Client side JavaScript validation not working when using xwork-tiger - - Rainer Hermanns - - Rainer Hermanns - - Major - - ClosedClosed - - FIXED - - Mar 04, 2006 - - Mar 18, 2006 - - -
- Improvement - - WW-1225 - - Clover report without log debug - - Rainer Hermanns - - Claus Ibsen - - Trivial - - ClosedClosed - - FIXED - - Mar 03, 2006 - - Mar 04, 2006 - - -
- Bug - - WW-1224 - - Portlet URL support doesn't follow JSR-168 spec - - Nils-Helge Garli - - Eric Dalquist - - Critical - - ClosedClosed - - FIXED - - Mar 02, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1223 - - div not working without delay > 0 in ajax theme - - Ian Roughley - - Philip Luppens - - Major - - ClosedClosed - - FIXED - - Mar 02, 2006 - - Mar 16, 2006 - - -
- Improvement - - WW-1221 - - Extending xhtml template - - Rainer Hermanns - - Schava Eugene - - Major - - ClosedClosed - - FIXED - - Mar 01, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1220 - - Some missing javadoc OpenSymphony copyright for recent submitted files - - Rene Gielen - - Claus Ibsen - - Trivial - - ClosedClosed - - FIXED - - Mar 01, 2006 - - Mar 01, 2006 - - -
- New Feature - - WW-1219 - - Create a Button Tag - - Rene Gielen - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 28, 2006 - - Mar 11, 2006 - - -
- New Feature - - WW-1218 - - Support <input type=image ...> style html rendering for <ww:submit /> component - - Rene Gielen - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 28, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1217 - - ww:text tag returns an invalid value for an i18n key that starts with the same name as an action variable - - Rainer Hermanns - - Nick Hill - - Major - - ClosedClosed - - FIXED - - Feb 27, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1216 - - Action specific I18n texts are not resolved for showcase CRUD example - - Rene Gielen - - Rene Gielen - - Minor - - ResolvedResolved - - CANNOT REPRODUCE - - Feb 27, 2006 - - Mar 13, 2006 - - -
- Improvement - - WW-1215 - - ValidationInterceptor - isDebugEnabled() missing - - Rainer Hermanns - - Claus Ibsen - - Trivial - - ClosedClosed - - FIXED - - Feb 26, 2006 - - Feb 26, 2006 - - -
- Improvement - - WW-1214 - - ExecuteAndWaitInterceptor - new features, unit tests, improved javadoc and added examples to showcase - - Rainer Hermanns - - Claus Ibsen - - Minor - - ClosedClosed - - FIXED - - Feb 26, 2006 - - Feb 26, 2006 - - -
- Bug - - WW-1213 - - ExecAndWait interceptor - logging spelling error - - Alexandru Popescu - - Claus Ibsen - - Trivial - - ClosedClosed - - FIXED - - Feb 25, 2006 - - Feb 25, 2006 - - -
- Improvement - - WW-1212 - - Avoid excessive usage of ui attributes - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 25, 2006 - - Feb 27, 2006 - - -
- Improvement - - WW-1211 - - Add sample usage of ww:text tag to showcase example - - Rene Gielen - - Rene Gielen - - Minor - - ClosedClosed - - IMPLEMENTED - - Feb 24, 2006 - - Feb 25, 2006 - - -
- Bug - - WW-1210 - - @ww.radio render the same "label for" in multiple form - - Patrick Lightbody - - Aby Herwendo - - Minor - - ResolvedResolved - - FIXED - - Feb 24, 2006 - - Mar 05, 2006 - - -
- Bug - - WW-1209 - - The validation.js is not sent to the client as text/javascript - - Patrick Lightbody - - Matt Raible - - Major - - ResolvedResolved - - FIXED - - Feb 24, 2006 - - Mar 05, 2006 - - -
- Bug - - WW-1208 - - FieldError doesn't check if fieldError is null before rendering causing freemarker error - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 23, 2006 - - Feb 25, 2006 - - -
- Improvement - - WW-1207 - - Add anchor attribute to the ww:url tag - - Rainer Hermanns - - Philip Luppens - - Minor - - ClosedClosed - - FIXED - - Feb 23, 2006 - - Feb 26, 2006 - - -
- Bug - - WW-1206 - - Request encoding mismatch - - Rene Gielen - - Tobias Järlund - - Major - - ClosedClosed - - FIXED - - Feb 23, 2006 - - Feb 25, 2006 - - -
- Bug - - WW-1205 - - RegexFieldValidator cannot process white space string correctly - - Rene Gielen - - Robbin Fan - - Major - - ResolvedResolved - - FIXED - - Feb 22, 2006 - - Feb 26, 2006 - - -
- Bug - - WW-1204 - - Remove portlet dependancy for Form and URL components - - Rainer Hermanns - - Rainer Hermanns - - Major - - ClosedClosed - - FIXED - - Feb 22, 2006 - - Feb 26, 2006 - - -
- Improvement - - WW-1202 - - Improve portal integration javadocs - - Nils-Helge Garli - - Nils-Helge Garli - - Minor - - ClosedClosed - - FIXED - - Feb 21, 2006 - - Mar 21, 2006 - - -
- Bug - - WW-1201 - - Remote form resultDiv not executing javascript - - Ian Roughley - - Steve Werner - - Major - - ClosedClosed - - FIXED - - Feb 20, 2006 - - Mar 16, 2006 - - -
- Bug - - WW-1200 - - richtexteditor is escaping content in ftl - - Unassigned - - Mike Porter - - Major - - ResolvedResolved - - FIXED - - Feb 20, 2006 - - Feb 20, 2006 - - -
- Improvement - - WW-1199 - - Submit tag should support method and action attributes - - Patrick Lightbody - - Patrick Lightbody - - Major - - ResolvedResolved - - FIXED - - Feb 20, 2006 - - Feb 20, 2006 - - -
- Improvement - - WW-1198 - - Use LinkedHashMap instead of TreeMap - - Patrick Lightbody - - Patrick Lightbody - - Major - - ResolvedResolved - - FIXED - - Feb 20, 2006 - - Feb 20, 2006 - - -
- Bug - - WW-1196 - - DoubleSelect's second select does not allow a predefined value to be selected (WW-1071) - - Patrick Lightbody - - Alberto Ocampo - - Major - - ResolvedResolved - - FIXED - - Feb 20, 2006 - - Mar 05, 2006 - - -
- Bug - - WW-1195 - - labelposition for checkbox-tag does nothing - - Patrick Lightbody - - Peter Westlin - - Minor - - ReopenedReopened - - UNRESOLVED - - Feb 20, 2006 - - Mar 22, 2006 - - -
- Bug - - WW-1194 - - Checkbox-tag without a label generates a Freemarker template error - - Rene Gielen - - Peter Westlin - - Minor - - ClosedClosed - - FIXED - - Feb 20, 2006 - - Feb 26, 2006 - - -
- Bug - - WW-1193 - - bind.js calls onLoad asynchronously - - Mike Porter - - Mike Porter - - Minor - - ResolvedResolved - - FIXED - - Feb 18, 2006 - - Feb 18, 2006 - - -
- Bug - - WW-1192 - - Generic Support in xwork-tiger.jar does not work - - Rainer Hermanns - - Corby Page - - Major - - ClosedClosed - - FIXED - - Feb 18, 2006 - - Mar 21, 2006 - - -
- Bug - - WW-1191 - - JavaScript validation (non-Ajax) doesn't look for an existing message before adding a new validation error - - Rainer Hermanns - - Matt Raible - - Major - - ClosedClosed - - FIXED - - Feb 17, 2006 - - Mar 15, 2006 - - -
- Bug - - WW-1188 - - select-tag with multiple="false" generates the same HTML as multiple="true" - - tm_jee - - Peter Westlin - - Minor - - ResolvedResolved - - FIXED - - Feb 17, 2006 - - Feb 22, 2006 - - -
- Improvement - - WW-1187 - - Allow easy overriding of "excludeMethods" and "includeMethods" of ValidationInterceptor - - Rainer Hermanns - - Matt Raible - - Major - - ResolvedResolved - - FIXED - - Feb 16, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1186 - - WW 2.2 logs excetion if result of an action is null - - Rainer Hermanns - - Alex Shneyderman - - Major - - ResolvedResolved - - FIXED - - Feb 16, 2006 - - Feb 20, 2006 - - -
- Improvement - - WW-1185 - - Add support for using Tiles with WebWork - - Rainer Hermanns - - Matt Raible - - Major - - ClosedClosed - - FIXED - - Feb 16, 2006 - - Feb 17, 2006 - - -
- Improvement - - WW-1183 - - exclude methods for token interceptor - - Alexandru Popescu - - Schava Eugene - - Major - - ResolvedResolved - - FIXED - - Feb 15, 2006 - - Mar 17, 2006 - - -
- Bug - - WW-1182 - - @ww.token does not work with freemarker result - - tm_jee - - Claus Ibsen - - Major - - ResolvedResolved - - FIXED - - Feb 15, 2006 - - Feb 25, 2006 - - -
- Improvement - - WW-1181 - - Sitemesh freemarker handled (FreemarkerPageFilter.java) should be locale aware - - Alexandru Popescu - - Christian Meunier - - Minor - - ResolvedResolved - - FIXED - - Feb 15, 2006 - - Feb 25, 2006 - - -
- Bug - - WW-1177 - - add a debug attribute to ww:head tag - - Rainer Hermanns - - Mike Porter - - Major - - ClosedClosed - - FIXED - - Feb 14, 2006 - - Feb 26, 2006 - - -
- Bug - - WW-1176 - - Ajax elemnts: remote form, remote div,... don't work on weblogic 8.1 - - Alexandru Popescu - - Adam Cuper - - Critical - - ResolvedResolved - - FIXED - - Feb 14, 2006 - - Feb 21, 2006 - - -
- Bug - - WW-1175 - - HTTP Response Code wrong for static convent served up via FilterDispatcher - - Ian Roughley - - Mike Porter - - Major - - ResolvedResolved - - FIXED - - Feb 14, 2006 - - Mar 15, 2006 - - -
- Bug - - WW-1174 - - SessionMap does not clear the attributes in the HttpSession - - Rainer Hermanns - - Dieter van Baarle - - Major - - ClosedClosed - - FIXED - - Feb 13, 2006 - - Feb 20, 2006 - - -
- Bug - - WW-1173 - - Freemarker characterset/locale configuration inconsistent with Webwork - - tm_jee - - Dennis Su - - Major - - ClosedClosed - - FIXED - - Feb 12, 2006 - - Feb 18, 2006 - - -
- Bug - - WW-1172 - - submit didn't include js event - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 11, 2006 - - Feb 12, 2006 - - -
- Bug - - WW-1170 - - Submit button is always rendered in new line - - Alexandru Popescu - - Adam Cuper - - Major - - ResolvedResolved - - NOT A PROBLEM - - Feb 10, 2006 - - Feb 16, 2006 - - -
- Task - - WW-1169 - - migrate to FilterDispatcher - - Rainer Hermanns - - victorsosa - - Trivial - - ClosedClosed - - CANNOT REPRODUCE - - Feb 09, 2006 - - Mar 15, 2006 - - -
- Bug - - WW-1168 - - Template / client side validation related files (such as validate.js and style.css) references not resolvable in resulting html - - Rene Gielen - - Stanley Xu - - Major - - ResolvedResolved - - CANNOT REPRODUCE - - Feb 09, 2006 - - Mar 16, 2006 - - -
- Bug - - WW-1167 - - form's client validation should be executed after user custom submit method - - Rene Gielen - - Robbin Fan - - Minor - - ClosedClosed - - NOT A PROBLEM - - Feb 09, 2006 - - Feb 20, 2006 - - -
- Bug - - WW-1166 - - AJAX submit button with action parameter does not submit with action in the query parameters in Firefox 1.5 - - Ian Roughley - - Jason Jones - - Major - - OpenOpen - - UNRESOLVED - - Feb 08, 2006 - - Mar 15, 2006 - - -
- Bug - - WW-1165 - - Missing setter for TLD declared attribute 'openTemplate' in TreeTag - - Rene Gielen - - Bhakta Koditipalli - - Critical - - ResolvedResolved - - FIXED - - Feb 07, 2006 - - Feb 08, 2006 - - -
- Improvement - - WW-1164 - - Remove taglib definition in web.xml for the sample app - - Nils-Helge Garli - - Nils-Helge Garli - - Minor - - ClosedClosed - - FIXED - - Feb 07, 2006 - - Feb 12, 2006 - - -
- Bug - - WW-1163 - - Ckeckbox tag fails with freemarker error if no label set (for xhtml based themes) - - Rene Gielen - - Rene Gielen - - Major - - ResolvedResolved - - FIXED - - Feb 07, 2006 - - Feb 07, 2006 - - -
- Improvement - - WW-1162 - - Add support for detecting freemarker errors in UI tags tests - - Rene Gielen - - Rene Gielen - - Major - - ResolvedResolved - - FIXED - - Feb 07, 2006 - - Feb 07, 2006 - - -
- Bug - - WW-1159 - - VelocityPageFilter needs to know about freemarker configuration - - Patrick Lightbody - - Rainer Hermanns - - Major - - OpenOpen - - UNRESOLVED - - Feb 07, 2006 - - Mar 16, 2006 - - -
- New Feature - - WW-1158 - - JasperReports View should support parameters for Report - - Rainer Hermanns - - Mariusz Smykula - - Major - - ClosedClosed - - NOT A PROBLEM - - Feb 07, 2006 - - Feb 09, 2006 - - -
- Improvement - - WW-1157 - - Re-name "action" parameter to avoid possible collission with other parameters - - Nils-Helge Garli - - Nils-Helge Garli - - Minor - - ClosedClosed - - IMPLEMENTED - - Feb 07, 2006 - - Feb 07, 2006 - - -
- Improvement - - WW-1156 - - Velocity support - - Nils-Helge Garli - - Nils-Helge Garli - - Major - - ClosedClosed - - IMPLEMENTED - - Feb 07, 2006 - - Feb 07, 2006 - - -
- Bug - - WW-1155 - - DispatcherUtils only reads configuration values for encoding and locale during init - should read from configuration on every request - - Rainer Hermanns - - Bruce Ritchie - - Major - - ClosedClosed - - FIXED - - Feb 06, 2006 - - Feb 18, 2006 - - -
- Bug - - WW-1154 - - Tag ww:text generate Exception related to ww:tree - - Rainer Hermanns - - Mariusz Smykula - - Critical - - ClosedClosed - - DUPLICATE - - Feb 06, 2006 - - Feb 06, 2006 - - -
- Bug - - WW-1153 - - Combinations of theme="simple" form components is breaking in certain instances - - tm_jee - - Ben Rometsch - - Minor - - ResolvedResolved - - FIXED - - Feb 06, 2006 - - Feb 12, 2006 - - -
- Bug - - WW-1152 - - Theme information lost from parent form tag - - tm_jee - - Konrad Kamiński - - Major - - ResolvedResolved - - FIXED - - Feb 06, 2006 - - Mar 03, 2006 - - -
- Bug - - WW-1151 - - Remote Form submit displays result in new window (IE problem) - - Ian Roughley - - Adam Cuper - - Critical - - ResolvedResolved - - FIXED - - Feb 06, 2006 - - Feb 07, 2006 - - -
- Bug - - WW-1150 - - When setting a DatePicker form field as readonly="true" the user can still manipulate the field value - - Rene Gielen - - Ben Rometsch - - Minor - - ResolvedResolved - - FIXED - - Feb 06, 2006 - - Feb 19, 2006 - - -
- Bug - - WW-1149 - - Tree tag is has a wrong name in taglib.tld - - Rainer Hermanns - - Gilles Durys - - Major - - ClosedClosed - - FIXED - - Feb 06, 2006 - - Feb 06, 2006 - - -
- Bug - - WW-1148 - - QuickStart does not work on OS X; throws exception - - Patrick Lightbody - - Stefan Arentz - - Major - - ResolvedResolved - - FIXED - - Feb 05, 2006 - - Mar 05, 2006 - - -
- Improvement - - WW-1147 - - Add tooltip support to components - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 05, 2006 - - Feb 20, 2006 - - -
- New Feature - - WW-1146 - - Add a simple RichTextEditor component to webwork - - tm_jee - - tm_jee - - Major - - ResolvedResolved - - FIXED - - Feb 05, 2006 - - Feb 20, 2006 - - -
- Bug - - WW-1145 - - JSTL support not SiteMesh compatible - - Rainer Hermanns - - Mathias Bogaert - - Major - - ResolvedResolved - - FIXED - - Feb 04, 2006 - - Mar 17, 2006 - - -
- Improvement - - WW-1144 - - redirect-action result cannot be configured with GET parameters in xwork.xml - - Rene Gielen - - Eric Molitor - - Minor - - ClosedClosed - - FIXED - - Feb 03, 2006 - - Mar 13, 2006 - - -
- Bug - - WW-1135 - - When using the action tag and executeResults in a freemarker template on a jsp page the JSPWriter buffer isn't being flushed - - Rainer Hermanns - - Eric Molitor - - Major - - ClosedClosed - - FIXED - - Jan 31, 2006 - - Mar 21, 2006 - - -
- Bug - - WW-1131 - - Request Parameters are Not Being Decoded - - Andres March - - Nicholaus Shupe - - Major - - ClosedClosed - - NOT A PROBLEM - - Jan 28, 2006 - - Feb 17, 2006 - - -
- Bug - - WW-1011 - - Problem with SiteMesh tags and ww:action - - Patrick Lightbody - - Patrick Lightbody - - Major - - ClosedClosed - - FIXED - - Dec 13, 2005 - - Mar 18, 2006 - - -
- Task - - WW-1003 - - ActionCOnfiguration and xwork.xml overlap - - tm_jee - - Patrick Lightbody - - Major - - ResolvedResolved - - FIXED - - Dec 11, 2005 - - Mar 21, 2006 - - -
- Improvement - - WW-959 - - Access to meta properties in freemaker decorators (without sitemesh tags). - - Rainer Hermanns - - Kristoffer Skjutare - - Major - - ClosedClosed - - FIXED - - Nov 16, 2005 - - Mar 16, 2006 - - -
- Task - - WW-924 - - Internationalization documents - - Rene Gielen - - Patrick Lightbody - - Major - - ClosedClosed - - FIXED - - Oct 26, 2005 - - Mar 21, 2006 - - -
- Task - - WW-852 - - Document complete Spring integration - - Rainer Hermanns - - Patrick Lightbody - - Major - - ResolvedResolved - - FIXED - - Oct 07, 2005 - - Mar 15, 2006 - - -
- Bug - - WW-822 - - Setting the character encoding on the request causes all form parameters to be erased on Oracle 9i - - Rene Gielen - - accbank - - Minor - - ClosedClosed - - CANNOT REPRODUCE - - Sep 03, 2005 - - Mar 13, 2006 - - -
- Bug - - WW-808 - - ParamTag does not convert to string - - Claus Ibsen - - John Patterson - - Minor - - ClosedClosed - - FIXED - - Jul 15, 2005 - - Mar 17, 2006 - - -
- New Feature - - WW-805 - - ww:date tag - - Rainer Hermanns - - Patrick Lightbody - - Major - - ClosedClosed - - FIXED - - Jul 11, 2005 - - Mar 21, 2006 - - -
- Bug - - WW-724 - - FileUpload Error [ File Type Tiff , PDF ] or [ network Drive File ] - - Rainer Hermanns - - toshihito nogami - - Major - - ResolvedResolved - - CANNOT REPRODUCE - - Jan 18, 2005 - - Feb 17, 2006 - - -
- Bug - - WW-649 - - Field errors should be displayed in the order they're in the POJO - - tm_jee - - Matt Raible - - Major - - ResolvedResolved - - FIXED - - Sep 28, 2004 - - Mar 02, 2006 - - -
-

- - -
- - diff --git a/docs/wikidocs/Reloading configuration.html b/docs/wikidocs/Reloading configuration.html deleted file mode 100644 index 3900387b5..000000000 --- a/docs/wikidocs/Reloading configuration.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - Reloading configuration - - - - - - - - - - -
-

Webwork allows for dynamic reloading of xml configuration file (ie, reloading actions.xml).

- -

This allows you to reconfigure your action mapping during development. There may be a slight performance penalty, so this is not recommended for production use.

- -

In order to enable this feature, add the following to your webwork.properties file:

- -
-
webwork.configuration.xml.reload=true
-
- -
- - diff --git a/docs/wikidocs/RequiredFieldValidator Annotation.html b/docs/wikidocs/RequiredFieldValidator Annotation.html deleted file mode 100644 index 0a44cbf43..000000000 --- a/docs/wikidocs/RequiredFieldValidator Annotation.html +++ /dev/null @@ -1,74 +0,0 @@ - - - WebWork - - RequiredFieldValidator Annotation - - - - - - - - - - -
-

RequiredFieldValidator Annotation

- -

This validator checks that a field is non-null.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -
-
@RequiredFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true)
-
- - -
- - diff --git a/docs/wikidocs/RequiredStringValidator Annotation.html b/docs/wikidocs/RequiredStringValidator Annotation.html deleted file mode 100644 index 8136a0d19..000000000 --- a/docs/wikidocs/RequiredStringValidator Annotation.html +++ /dev/null @@ -1,80 +0,0 @@ - - - WebWork - - RequiredStringValidator Annotation - - - - - - - - - - -
-

RequiredStringValidator Annotation

- -

This validator checks that a String field is not empty (i.e. non-null with a length > 0).

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
trim no true Boolean property. Determines whether the String is trimmed before performing the length check.

- -

Examples

- -
-
@RequiredStringValidator(message = "Default message", key = "i18n.key", shortCircuit = true, trim = true)
-
- - -
- - diff --git a/docs/wikidocs/Result Configuration.html b/docs/wikidocs/Result Configuration.html deleted file mode 100644 index 241e3ad6c..000000000 --- a/docs/wikidocs/Result Configuration.html +++ /dev/null @@ -1,88 +0,0 @@ - - - WebWork - - Result Configuration - - - - - - - - - - -
-

Description

- -

Results are string constants that Actions return to indicate the status of an Action execution. A standard set of Results are defined by default: error, input, login, none and success. Developers are, of course, free to create their own Results to indicate more application specific cases. Results are mapped to defined Result Types using a name-value pair structure.

- - - -

Result tags

- -

Result tags tell WebWork what to do next after the action has been called. There are a standard set of result codes built-in to WebWork, (in the Action interface) they include:

-
-
String SUCCESS = "success";
-String NONE    = "none";
-String ERROR   = "error";
-String INPUT   = "input";
-String LOGIN   = "login";
-
- -

You can extend these as you see fit. Most of the time you will have either SUCCESS or ERROR, with SUCCESS moving on to the next page in your application;

-
-
<result name="success" type="dispatcher">
-    <param name="location">/thank_you.jsp</param>
-</result>
-
- -

...and ERROR moving on to an error page, or the preceding page;

-
-
<result name="error" type="dispatcher">
-    <param name="location">/error.jsp</param>
-</result>
-
- -

Results are specified in a xwork xml config file(xwork.xml) nested inside <action>. If the location param is the only param being specified in the result tag, you can simplify it as follows:

- -
-
<action name="bar" class="myPackage.barAction">
-  <result name="success" type="dispatcher">
-    <param name="location">foo.jsp</param>
-  </result>
-</action>
-
- -

or simplified

- -
-
<action name="bar" class="myPackage.barAction">
-  <result name="success" type="dispatcher">foo.jsp</result>
-</action>
-
- -

or even simplified further

- -
-
<action name="bar" class="myPackage.barAction">
-   <result>foo.jsp</result>
-</action>
-
- - -
Default Action Class
-

If the class attribute is not specified in the action tag, it will default to WebWork's ActionSupport.

- -
Default Location Parameter
-

If no param tag eg. <param name="location"> ,,, </param> is given as child of the <result ..> tag, WebWork will assume the text enclosed within the <result> </result> tags to be the location.

- -
Default Result Type
-

If no type attribute is specified in the <result ...> tag, WebWork assume the type to be dispatcher. (Analogus to Servlet's Specs. SerlvetDispatcher's forward).

- -
- - diff --git a/docs/wikidocs/Result Types.html b/docs/wikidocs/Result Types.html deleted file mode 100644 index 71bf133a2..000000000 --- a/docs/wikidocs/Result Types.html +++ /dev/null @@ -1,111 +0,0 @@ - - - WebWork - - Result Types - - - - - - - - - - -
-

See Result Configuration for basic information about how results are configuration.

- -

Overview

- -

Result Types are classes that determine what happens after an Action executes and a Result is returned. Developers are free to create their own Result Types according to the needs of their application or environment. In WebWork 2 for example, Servlet and Velocity Result Types have been created to handle rendering views in web applications.

- -

Note: All built in webwork result types implement the com.opensymphony.xwork.Result interface, which represents a generic interface for all action execution results, whether that be displaying a webpage, generating an email, sending a JMS message, etc.

- -

Result types define classes and map them to names to be referred in the action configuration results. This serves as a shorthand name-value pair for these classes.

-
snippet of webwork-default.xml
-
...
-<result-types>
-    <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
-    <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
-    <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
-    <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
-    <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
-    <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
-    <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
-    <result-type name="httpheader" class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
-    <result-type name="stream" class="com.opensymphony.webwork.dispatcher.StreamResult"/>
-    <result-type name="plaintext" class="com.opensymphony.webwork.dispatcher.PlainTextResult" />
-</result-types>
-...
-
- -
snippet of your xwork.xml
-
<include file="webwork-default.xml"/>
-
-<package name="myPackage" extends="default">
-  <action name="bar" class="myPackage.barAction">
-    <!-- default result type is "dispatcher" -->
-    <!-- default result name is "success" -->
-    <result>foo.jsp</result>
-    <result name="error">error.jsp</result>
-    </result>
-  </action>
-</package>
-
- -

Result Types

- -

Webwork provides several implementations of the com.opensymphony.xwork.Result interface to make web-based interactions with your actions simple. These result types include:

- - - - -

Results are specified in a xwork xml config file(xwork.xml) nested inside <action>. If the location param is the only param being specified in the result tag, you can simplify it as follows:

- -
-
<action name="bar" class="myPackage.barAction">
-  <result name="success" type="dispatcher">
-    <param name="location">foo.jsp</param>
-  </result>
-</action>
-
- -

or simplified

- -
-
<action name="bar" class="myPackage.barAction">
-  <result name="success" type="dispatcher">foo.jsp</result>
-</action>
-
- -

if you are extending webwork-default.xml, then the default result type is "dispatcher". Also, if you don't specify the name of a result, it is assumed to be "success". This means you can simply the result down to

- -
-
<action name="bar" class="myPackage.barAction">
-  <result>foo.jsp</result>
-</action>
-
- -

NOTE: The Parse attribute enables the location element to be parsed for expressions. An example of how this could be useful:

-
-
<result name="success" type="redirect">/displayCart.action?userId=${userId}</result>
-
- -

NOTE: You can also specify global-results to use with multiple actions. This can save time from having to add the same result to many different actions. For more information on result tags and global-results, see Result Configuration section.

- - -
- - diff --git a/docs/wikidocs/RomeResult.html b/docs/wikidocs/RomeResult.html deleted file mode 100644 index 8faf48461..000000000 --- a/docs/wikidocs/RomeResult.html +++ /dev/null @@ -1,155 +0,0 @@ - - - WebWork - - RomeResult - - - - - - - - - - -
-

Introduction

- -

A couple of days ago I quickly had to create a WW result type that would transform a Rome (https://rome.dev.java.net/) SyndFeed to several news feeds. WW makes this very, very easy.

-
Used versions
-

WebWork 2.2 beta 4
-Rome 0.7 beta

- -

The code

- -
com.acme.result.RomeResult.java
-
/**
- * 
- */
-package com.acme.result;
-
-import java.io.Writer;
-
-import org.apache.log4j.Logger;
-
-import com.opensymphony.webwork.ServletActionContext;
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.Result;
-import com.sun.syndication.feed.synd.SyndFeed;
-import com.sun.syndication.io.SyndFeedOutput;
-
-/**
- * A simple Result to output a Rome SyndFeed object into a newsfeed.
- * @author Philip Luppens
- * 
- */
-public class RomeResult implements Result {
-
-	private String feedName;
-
-	private String feedType;
-
-	private final static Logger logger = Logger.getLogger(RomeResult.class);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.opensymphony.xwork.Result#execute(com.opensymphony.xwork.ActionInvocation)
-	 */
-	public void execute(ActionInvocation ai) throws Exception {
-		if (feedName == null) {
-			// ack, we need this to find the feed on the stack
-			logger
-					.error("Required parameter 'feedName' not found. "
-							+ "Make sure you have the param tag set and "
-							+ "the static-parameters interceptor enabled in your interceptor stack.");
-			// no point in continuing ..
-			return;
-		}
-
-		// don't forget to set the content to the correct mimetype
-		ServletActionContext.getResponse().setContentType("text/xml");
-		// get the feed from the stack that can be found by the feedName
-		SyndFeed feed = (SyndFeed) ai.getStack().findValue(feedName);
-
-		if (logger.isDebugEnabled()) {
-			logger.debug("Found object on stack with name '" + feedName + "': "
-					+ feed);
-		}
-		if (feed != null) {
-
-			if (feedType != null) {
-				// Accepted types are: rss_0.90 - rss_2.0 and atom_0.3
-				// There is a bug though in the rss 2.0 generator when it checks
-				// for the type attribute in the description element. It's has a
-				// big 'FIXME' next to it (v. 0.7beta).
-				feed.setFeedType(feedType);
-			}
-			SyndFeedOutput output = new SyndFeedOutput();
-			//we'll need the writer since Rome doesn't support writing to an outputStream yet
-			Writer out = null;
-			try {
-				out = ServletActionContext.getResponse().getWriter();
-				output.output(feed, out);
-			} catch (Exception e) {
-				// Woops, couldn't write the feed ?
-				logger.error("Could not write the feed", e);
-			} finally {
-				//close the output writer (will flush automatically)
-				if (out != null) {
-					out.close();
-				}
-			}
-
-		} else {
-			// woops .. no object found on the stack with that name ?
-			logger.error("Did not find object on stack with name '" + feedName
-					+ "'");
-		}
-	}
-
-	public void setFeedName(String feedName) {
-		this.feedName = feedName;
-	}
-
-	public void setFeedType(String feedType) {
-		this.feedType = feedType;
-	}
-
-}
-
- -

Code Explanation

- -

Easy enough. We try to find the SyndFeed object on the WW stack. If we can find it, we will set the feed type (rss v0.9 +, atom 0.3) if it has been specified in the result parameters (see below). Then we use a SyndFeedOutput to write our newsfeed to our PrintWriter from our response.

- -

XWork configuration

- -

Before you can use this result, you will need to register it in your xwork.xml:

-
-
<package name="default" extends="webwork-default">
-	<result-types>
-		<result-type name="feed" class="com.acme.result.RomeResult"/>
-	</result-types>
-	<interceptors>
-..
-
- -

You can now use this result type. So, create an Action that will create and populate the Rome SyndFeed, and make sure you provide a getter for your populated SyndFeed. The actual creation of your feed is beyond this recipe, but you can find plenty of examples in the Rome Wiki (http://wiki.java.net/bin/view/Javawsxml/Rome05Tutorials).

- -
-
<action name="feed" class="com.acme.action.CreateFeedAction">
-	<result name="success" type="feed">
-		<param name="feedName">feed</param>
-		<param name="feedType">rss_1.0</param>
-	</result>
-</action>
-
- -

Concluding thoughts

- -

This is a simple feed result using Rome as a news feed generator. You might want to make sure you don't generate your feed on every request, but there are lots of ways to deal with such problems. You can also provide additional setters in the Result to set your feed title, url, etc, but this should suffice for a quickstart.

- -
- - diff --git a/docs/wikidocs/Scope Interceptor.html b/docs/wikidocs/Scope Interceptor.html deleted file mode 100644 index 8f4b6a147..000000000 --- a/docs/wikidocs/Scope Interceptor.html +++ /dev/null @@ -1,106 +0,0 @@ - - - WebWork - - Scope Interceptor - - - - - - - - - - -
- -

This is designed to solve a few simple issues related to wizard-like functionality in WebWork. One of those issues is - that some applications have a application-wide parameters commonly used, such pageLen (used for records per - page). Rather than requiring that each action check if such parameters are supplied, this interceptor can look for - specified parameters and pull them out of the session.

- -

This works by setting listed properties at action start with values from session/application attributes keyed - after the action's class, the action's name, or any supplied key. After action is executed all the listed properties - are taken back and put in session or application context.

- -

To make sure that each execution of the action is consistent it makes use of session-level locking. This way it - guarantees that each action execution is atomic at the session level. It doesn't guarantee application level - consistency however there has yet to be enough reasons to do so. Application level consistency would also be a big - performance overkill.

- -

Note that this interceptor takes a snapshot of action properties just before result is presented (using a {@link - PreResultListener}), rather than after action is invoked. There is a reason for that: At this moment we know that - action's state is "complete" as it's values may depend on the rest of the stack and specifically - on the values of - nested interceptors.

- - -

Parameters

- - -

    - -

  • session - a list of action properties to be bound to session scope
  • - -

  • application - a list of action properties to be bound to application scope
  • - -

  • key - a session/application attribute key prefix, can contain following values:
  • - -

      - -

    • CLASS - that creates a unique key prefix based on action namespace and action class, it's a default value
    • - -

    • ACTION - creates a unique key prefix based on action namespace and action name
    • - -

    • any other value is taken literally as key prefix
    • - -

    - -

  • type - with one of the following
  • - -

      - -

    • start - means it's a start action of the wizard-like action sequence and all session scoped properties are reset - to their defaults
    • - -

    • end - means that session scoped properties are removed from session after action is run
    • - -

    • any other value or no value means that it's in-the-middle action that is set with session properties before it's - executed, and it's properties are put back to session after execution
    • - -

    - -

  • sessionReset - boolean value causing all session values to be reset to action's default values or application - scope values, note that it is similliar to type="start" and in fact it does the same, but in our team it is sometimes - semantically preferred. We use session scope in two patterns - sometimes there are wizzard-like action sequences that - have start and end, and sometimes we just want simply reset current session values.
  • - -

- - -

Extending the Interceptor

- - -

There are no know extension points for this interceptor.

- - -

Examples

- -
-
<!-- As the filter and orderBy parameters are common for all my browse-type actions,
-     you can move control to the scope interceptor. In the session parameter you can list
-     action properties that are going to be automatically managed over session. You can
-     do the same for application-scoped variables-->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="basicStack"/>
-    <interceptor-ref name="hibernate"/>
-    <interceptor-ref name="scope">
-        <param name="session">filter,orderBy</param>
-        <param name="autoCreateSession">true</param>
-    </interceptor-ref>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Selecting Themes.html b/docs/wikidocs/Selecting Themes.html deleted file mode 100644 index 4b92e3500..000000000 --- a/docs/wikidocs/Selecting Themes.html +++ /dev/null @@ -1,40 +0,0 @@ - - - WebWork - - Selecting Themes - - - - - - - - - - -
-

Themes can be selected using several different rules, in this order:

- -
    -
  1. The theme attribute on the specific tag
  2. -
  3. The theme attribute on a tag's surrounding form tag
  4. -
  5. The page-scoped attribute named theme
  6. -
  7. The request-scoped attribute named theme
  8. -
  9. The session-scoped attribute named theme
  10. -
  11. The application-scoped attribute named theme
  12. -
  13. The webwork.ui.theme property in webwork.properties (defaults to xhtml)
  14. -
- - -

A few important concepts come from this order:

- -
    -
  • You can override an entire form's theme by only changing the theme attribute for the forum. This makes it easy to use the ajax theme in just a few select places.
  • -
  • You can change the theme for a user's session. This might be useful if users can customize their look and feel.
  • -
  • If you want to change the theme for the entire application, adjust your webwork.properties.
  • -
- - -
- - diff --git a/docs/wikidocs/Servlet Config Interceptor.html b/docs/wikidocs/Servlet Config Interceptor.html deleted file mode 100644 index 5108b3817..000000000 --- a/docs/wikidocs/Servlet Config Interceptor.html +++ /dev/null @@ -1,70 +0,0 @@ - - - WebWork - - Servlet Config Interceptor - - - - - - - - - - -
- -

An interceptor which sets action properties based on the interfaces an action implements. For example, if the action - implements ParameterAware then the action context's parameter map will be set on it.

- -

This interceptor is designed to set all properties an action needs if it's aware of servlet parameters, the - servlet context, the session, etc. Interfaces that it supports are:

- -

    - -

  • ServletContextAware
  • - -

  • ServletRequestAware
  • - -

  • ServletResponseAware
  • - -

  • ParameterAware
  • - -

  • SessionAware
  • - -

  • ApplicationAware
  • - -

  • PrincipalAware
  • - -

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points for this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="servlet-config"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Setting up Eclipse with Tomcat.html b/docs/wikidocs/Setting up Eclipse with Tomcat.html deleted file mode 100644 index fb6fb7f3f..000000000 --- a/docs/wikidocs/Setting up Eclipse with Tomcat.html +++ /dev/null @@ -1,312 +0,0 @@ - - - WebWork - - Setting up Eclipse with Tomcat - - - - - - - - - - -
-

Setting up Eclipse with Tomcat

- - -

Introduction

- -

When I started using WebWork I went through the trouble of setting up my development environment to cater for web development. What I wanted was a fast turn around time, i.e. if I changed a .jsp file I could just refresh the web browser to see the changes. Also changes in WebWork related configurations will have immediate effect. And finally minor java changes from within Eclipse is also hot replaced.

- -

I will document how to setup Eclipse and install a tomcat plugin so all is integrated within Eclipse and you can easily start, stop, restart Tomcat, see output in the Eclipse console, debug, make code changes on the fly, etc. etc. so development is a joy.

- -

If you are fortunate enough to use the JetBrains IDEA editor then all this is already setup for you.

- -

Preface

- -

I used these tools 

- -

Windows XP
-Eclipse 3.11
-Tomcat 5.5.x
-Sysdeo Tomcat Plugin Launcher 0.80

- -

Install Tomcat Plugin 

- -

There are several Tomcat plugins to Eclipse, and I tried several versions. I found that Sysdeo was the best one for my needs.

- -

There is a good Eclipse plugin homepage at http://www.eclipse-plugins.info

- -

Download the Sysdeo plugin from it's homepage at http://www.sysdeo.com/eclipse/tomcatplugin

- -

Unzip the downloaded file to <ECLIPSE_HOME>\plugins

- -

Installing Tomcat

- -

If you don't have Tomcat installed then download it from http://tomcat.apache.org

- -

Configure Tomcat Plugin in Eclipse

- -

 Restart/Start Eclips so the plugin is loaded.

- -

If the plugin is working you will immediately notice 3 new icons in the Eclipse toolbar
-These icons are for starting, stopping and restarting Tomcat.
-Now you need to configure the plugin Windows -> Preference. And the select the Tomcat tab.
-Here you select the Tomcat version to 5.x and enter the <TOMCAT_HOME> folder. You leave Context decleration mode to Server.xml.
-Leave the advanced tab as default. JVM Settings should have a JRE selected. And the source path should have ticked Automatically compute source path.

- -

Create a new Project

- -

When you create a new project in Eclipse you folders follow a certain structure standard to make this work.

- -

I have this folder structure

- -

<project_home>
-+ src
-   + java
-+ webapp
-   + WEB-INF
-      + lib

- -

 In the lib folder copy your needed .jar files. I have these files:

-
-

commons-logging.jar
-dwr.jar
-freemarker.jar
-javamail.jar
-log4j-1.2.9.jar
-ognl.jar
-oscore.jar
-rife-continuations.jar
-servletapi.jar
-spring.jar
-webwork-2.2.1.jar
-xwork.jar 

-
-

 

- -

And in WEB-INF your should have web.xml and the Spring configuration file. And if you use Spring log4j ConfigListener you could also store log4j.properties here. I have these 3 files:
-applicationContext.xml
-log4j.properties
-web.xml

- -

The spring configuration file is basically empty to start with ApplicationContext.xml

-
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<beans default-autowire="autodetect">
-</beans>
-
-

 

- -

And the web.xml

-
-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
-<web-app>
-
-	<context-param>
-		<param-name>log4jConfigLocation</param-name>
-		<param-value>/WEB-INF/log4j.properties</param-value>
-	</context-param>
-
-	<filter>
-		<filter-name>webwork</filter-name>
-		<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
-	</filter>
-
-	<filter-mapping>
-		<filter-name>webwork</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-
-	<listener>
-		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-	</listener>
-
-	<listener>
-		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
-	</listener>
-
-	<servlet>
-		<servlet-name>freemarker</servlet-name>
-		<servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>
-	</servlet>
-
-	<servlet-mapping>
-		<servlet-name>freemarker</servlet-name>
-		<url-pattern>*.ftl</url-pattern>
-	</servlet-mapping>
-
-	<welcome-file-list>
-		<welcome-file>index.jsp</welcome-file>
-		<welcome-file>index.html</welcome-file>
-	</welcome-file-list>
-
-</web-app>
-
-

 

- -

And my log4j.properties

-
-
log4j.rootLogger=INFO, console
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} %-5p %c - %m%n
-
-#log4j.category.org.springframework=DEBUG
-#log4j.category.com.opensymphony.webwork=DEBUG
-#log4j.category.com.opensymphony.xwork=DEBUG
-
-

 

- -

Now the tricky part is that we still need some configuration files for WebWork that usually resides in the classpath folder. These files we must store outside the webapp folder due Eclipse hot java code deployer. So these files:
-   webwork.properties
-   xwork.xml
-Is stored in the src/java folder.

- -

This is my webwork.properties that is setup for development 

-
-
webwork.objectFactory = spring
-webwork.devMode = true
-webwork.configuration.xml.reload = true
-webwork.url.http.port = 8080
-
-

 

- -

And then the xwork.xml where we configure our action

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
-<xwork>
-<include file="webwork-default.xml"/>
-<package name="default" extends="webwork-default">
-</package>
-</xwork>
-
-

 

- -

Now we are nearly ready. We must tell Eclipse to output the compiled source files to webapp/WEB-INF/classes. This is done by Project -> Properties. Then select the Java Build Path tab. Then type "<project_name>webapp/WEB-INF/classes" in the default output folder. Then Eclipse would put the compiled source files to our web app classes folder AND also copy all other configuration files within the src/java folder, and thus also our webwork.properties and xwork.xml is copied.

- -

It is important to put webwork.properties and xwork.xml in the src/java folder as Eclipse will automatically clean the build source folder when it compiles. So if we put webwork.properties and xwork.xml in the WEB-INF/classes folder Eclipse will delete them. That is why we put the files in src/java instead.

- -

Now we are done configuring and setup our development environment in Eclipse. Now let's test it.

- -

Now let's make the famous Hello World and se code changes on the fly

- -

In the webapp folder we could create a welcome page to see if tomcat works. So we create a index.html file

-
-
<html>
-<body>
-<h1>Hello World</h1>
-<p/>
-</body>
-</html>
-
-

 

- -

Now we are readt to start Tomcat so click the icon Start Tomcat. If everyting works you will se Tomcat startup and output in the console panel in Eclipse. Now point your webbrowser to the url http://localhost:8080. And the welcome page should be displayed.

- -

Next we create a simple action named HelloAction

-
-
package dk.claus;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class HelloAction extends ActionSupport {
-
-	private String world;
-
-	public String getWorld() {
-		return world;
-	}
-
-	public void setWorld(String world) {
-		this.world = world;
-	}
-
-	public String execute() throws Exception {
-		world = "Hello World from your Action";
-		return SUCCESS;
-	}
-
-}
-
-

 

- -

So we must change our xwork.properties to know this action

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
-
-<xwork>
-    <include file="webwork-default.xml"/>
-
-    <package name="default" extends="webwork-default">
-
-    	<action name="hello" class="dk.claus.HelloAction">
-    		<result name="success">hello.jsp</result>
-    	</action>
-
-    </package>
-
-</xwork>
-
-

 

- -

And then we need to have a link on our welcome page, so we change it:

-
-
<html>
-<body>
-<h1>Hello World</h1>
-<p/>
-
-<a xhref="hello.action">Hello World Action</a>
-
-</body>
-</html>
-
-

 

- -

And finally we must make a result page for the action, so we create a hello.jsp page.

-
-
<%@ taglib uri="/webwork" prefix="ww"%>
-
-<html>
-<body>
-  <h1>This is hello world action</h1>
-  <p/>
-  What did the action say? <ww:property value="world"/>
-
-</body>
-</html>
-
-

 

- -

Now save all these files and refresh your browser. The welcome page should now contain the link. Clicking the link would execute your action and show the result page.

- -

Now change the code in the action by changing the world text to something different. Save the file and refresh the browser. Isn't this great  

- -

Hope this guide can help you setup a development environment that is trouly a joy to work with.

- -

Stopping Tomcat

- -

You must remember to use the 'Stop Tomcat' toolbar button. If you kill the application using the red terminate button in Eclipse you could potentially have Eclipse stop responding. This happened for me twice.  

- -

Hot code replace failed

- -

If you add, rename or delete methods Eclipse can't replace the code and you will get a warning dialog. Here you should remember to click 'Continue' and then click the Stop Tomcat button (or Restart Tomcat button). This ensure that Tomcat is properly shutdown.

- -

Debugging

- -

Not a problem at all. Just set a breakpoint in your code and you are off to go. That is truly a joy and that can't be easiler.
-

- -

The end

- -

I hope this guide added something to the table. I decided I wanted to create this guide on this wiki site to contribute something back to this great web framework.

- -
- - diff --git a/docs/wikidocs/Setting up Eclipse with Tomcat_attachments/sysdeo_eclipse_plugin_debug.PNG b/docs/wikidocs/Setting up Eclipse with Tomcat_attachments/sysdeo_eclipse_plugin_debug.PNG deleted file mode 100644 index 988c5c9ca..000000000 Binary files a/docs/wikidocs/Setting up Eclipse with Tomcat_attachments/sysdeo_eclipse_plugin_debug.PNG and /dev/null differ diff --git a/docs/wikidocs/Setting up Eclipse with Tomcat_attachments/sysdeo_eclipse_plugin_toolbar.PNG b/docs/wikidocs/Setting up Eclipse with Tomcat_attachments/sysdeo_eclipse_plugin_toolbar.PNG deleted file mode 100644 index 22dd0d0da..000000000 Binary files a/docs/wikidocs/Setting up Eclipse with Tomcat_attachments/sysdeo_eclipse_plugin_toolbar.PNG and /dev/null differ diff --git a/docs/wikidocs/SimpleLogin with Session.html b/docs/wikidocs/SimpleLogin with Session.html deleted file mode 100644 index b41da7f24..000000000 --- a/docs/wikidocs/SimpleLogin with Session.html +++ /dev/null @@ -1,198 +0,0 @@ - - - WebWork - - SimpleLogin with Session - - - - - - - - - - -
-

I wrote this simple application to demostrate how to use webwork in a login/logout.

- -

/Login.jsp

-
-
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Insert title here</title>
-</head><body>
-<form action="login.action" method="post">
-User id<input type="text" name="userId" /> <br/>
-Password <input type="password" name="passwd" /> <br />
-<input type="submit" value="Login"/>
-</form>
-</body>
-
-</html>
-
-

 

- -

 

- -

/pages/welcome.jsp

- -

 

-
-
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
-    pageEncoding="ISO-8859-1"%>
-<%@ taglib prefix="ww" uri="/webwork" %>
-<jsp:include page="WEB-INF/inc/loginCheck.jsp" />
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Welcome</title>
-</head>
-
-<body>Welcome, you have logined. <br />
-The attribute of 'context' in session is
-<ww:property value="#session.context" />
-<br /><br /><br />
-<a xhref="<%= request.getContextPath() %>/logout.action">Logout</a>
-<br />
-<a xhref="<%= request.getContextPath() %>/logout2.action">Logout2</a>
-</body>
-</html>
-
-

 

- -

 

- -

/WEB-INF/inc/loginCheck.jsp

-
-

 <%@ taglib="/webwork" prefix="ww" %>
-<ww:if test="#session.login != 'true'">
-<jsp:forward page="<%= request.getContextPath() %>/login.jsp" />
-</ww:if>

-
-

 

- -

 

- -

 

- -

simple.LoginAction.java

-
-
package simple;
-import java.util.Date;import java.util.Map;
-
-import javax.servlet.http.HttpSession;
-
-import com.opensymphony.webwork.ServletActionContext;
-import com.opensymphony.xwork.ActionSupport;
-
-public class LoginAction extends ActionSupport {
-
-    private String userId;
-    private String passwd;
-
-    public String execute() throws Exception {
-        if ("admin".equals(userId) && "password".equals(passwd)) {
-//            HttpSession session = ServletActionContext.getRequest().getSession();
-//            session.setAttribute("logined","true");
-//            session.setAttribute("context", new Date());
-// Better is using ActionContext 
-  Map session = ActionContext.getContext().getSession();
-session.put("logined","true");
-            session.put("context", new Date());
-            return SUCCESS;
-        }
-        return ERROR;
-    }
-
-    public String logout() throws Exception {
-//        HttpSession session = ServletActionContext.getRequest().getSession();
-//        session.removeAttribute("logined");
-//        session.removeAttribute("context"); 
- Map session = ActionContext.getContext().getSession();
- session.remove("logined");
-        session.remove("context");
-        return SUCCESS;
-    }
-
-    public String getPasswd() {
-        return passwd;
-    }
-
-    public void setPasswd(String passwd) {
-        this.passwd = passwd;
-    }
-
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-}
-
-

 

- -

 

- -

 simple.LogoutAction.java

-
-
package simple;
-import java.util.Map;
-import javax.servlet.http.HttpSession;
-
-import com.opensymphony.webwork.ServletActionContext;
-import com.opensymphony.xwork.ActionSupport;
-
-public class LogoutAction extends ActionSupport {
-
-    public String execute() throws Exception { 
-     Map session = ActionContext.getContext().getSession();
-session.remove("logined"); 
-session.remove("context");
-        return SUCCESS;
-    }
-
-}
-
-

 

- -

 

- -

 /WEB-INF/classes/xwork.xml

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
-
-<xwork>
-    <include file="webwork-default.xml"/>
-
-    <package name="default" extends="webwork-default">
-        <!-- Add your actions here -->
-        <action name="login" class="simple.LoginAction" >
-            <result name="success" type="dispatcher">/pages/welcome.jsp</result>
-            <result name="error" type="redirect">/login.jsp</result>
-        </action>
-
-        <action name="logout2" class="simple.LoginAction" method="logout" >
-            <result name="success" type="redirect">/login.jsp</result>
-        </action>
-
-        <action name="logout" class="simple.LogoutAction" >
-            <result name="success" type="redirect">/login.jsp</result>
-        </action>
-    </package>
-</xwork>
-
-

 

- -

 

- -

 

- -
- - diff --git a/docs/wikidocs/SiteGraph.html b/docs/wikidocs/SiteGraph.html deleted file mode 100644 index 9179102b8..000000000 --- a/docs/wikidocs/SiteGraph.html +++ /dev/null @@ -1,112 +0,0 @@ - - - WebWork - - SiteGraph - - - - - - - - - - -
-

Introduction

- -

WebWork comes with a utility called SiteGraph. SiteGraph is used to generate graphical diagrams representing the flow of your web application. It does this by parsing your configuration files, action classes, and view (JSP, Velocity, and FreeMarker) files. An example of a typical output of SiteGraph is provided (for the full size, click here):

- -

- -

Additional information can be found in the JavaDocs:

-

SiteGraph is a tool that renders out GraphViz-generated images depicting your -WebWork-powered web application's flow. SiteGraph requires GraphViz be installed -and that the "dot" executable be in your command path. You can find GraphViz -at http://www.graphviz.org.

- -

Understanding the Output

- -

There are several key things to notice when looking at the output from SiteGraph:

-
    -
  • Boxes: those shaded red indicate an action; those shaded green indicate a view file (JSP, etc).
  • -
  • Links: arrows colored green imply that no new HTTP request is being made; black arrows indicate a new HTTP request.
  • -
  • Link labels: labels may sometimes contain additional useful information. For example, a label of href means that the link behavior is that of a hyper-text reference. The complete label behaviors are provided: -
      -
    • href - a view file references an action by name (typically ending with the extension ".action")
    • -
    • action - a view file makes a call to the Action tag
    • -
    • form - a view file is linked to an action using the Form tag
    • -
    • redirect - an action is redirecting to another view or action
    • -
    • ! notation - a link to an action overrides the method to invoke
    • -
    -
  • -
- - -

Requirements

-

SiteGraph requires that your view files be structured in a very specific way. Because it has to read these files, only certain styles are supported. The requirements are:

-
    -
  • The JSP tags must use the "ww" namespace. -
      -
    • In JSP: <ww:xxx/>
    • -
    • In FreeMarker: <@ww.xxx/>
    • -
    • In Velocity: N/A
    • -
    -
  • -
  • Use of the Form tag and Action tag must be linking directly to the action name (and optional namespace). This means that <ww:form action="foo"/> is OK, but <ww:form action="foo.action"/> is not.
  • -
  • All code is expected to be using the Alt Syntax.
  • -
- - -

Setting up

- -

SiteGraph is built in to WebWork, so if you're up and running with WebWork, you don't need to do anything additional java packages. However, SiteGraph does require the "dot" package by GraphViz.

- -

You'll need to download the latest version of GraphViz and make sure that the dot executable (dot.exe in Windows) is in your command path. In Windows the GraphViz installer typically automatically adds dot.exe to your path. However, you may need to do this by hand depending on your system configuration.

- -

Usage

- -

You can use SiteGraph with the following command:

- -
-
java -cp ... -jar webwork.jar 
-     sitegraph
-     -config CONFIG_DIR 
-     -views VIEWS_DIRS 
-     -output OUTPUT 
-     [-ns NAMESPACE]
-
- -

Where:

-
-
Usage: -config CONFIG_DIR -views VIEWS_DIRS -output OUTPUT [-ns NAMESPACE]
-       CONFIG_DIR => a directory containing xwork.xml
-       VIEWS_DIRS => comma seperated list of dirs containing JSPs, VMs, etc
-       OUPUT      => the directory where the output should go
-       NAMESPACE  => the namespace path restriction (/, /foo, etc)
-
- -
You must supply the correct classpath when invoking the SiteGraph tool. Specifically, the XWork, WebWork, and their dependencies must be included in the classpath. Futhermore, you must also include your action class files referenced in xwork.xml. Without the proper class path entries, SiteGraph will not function properly.
- -

Once you have run SiteGraph, check the directory specified in the "output" argument (OUTPUT). In there you will find two files: out.dot and out.gif. You may immediately open up out.gif and view the web application flow. However, you may also wish to either run the out.dot file through a different GraphVis layout engine (neato, twopi, etc), so the original dot file is provided as well. You may also wish to edit the dot file before rendering the final flow diagram.

- -

Automatic Execution

- -

Some advanced users may wish to execute SiteGraph from within their application – this could be required if you are developing an application that supports WebWork plugin capabilities. This can easily be done. See the JavaDocs for more info:

- -

If you wish to use SiteGraph through its API rather than through the command line, -you can do that as well. All you need to do is create a new SiteGraph instance, -optionally specify a Writer to output the dot content to, and then call -#prepare().

- -

The command line version of SiteGraph does exactly this (except for overriding the Writer):

- -
-
SiteGraph siteGraph = new SiteGraph(configDir, views, output, namespace);
-siteGraph.prepare();
-siteGraph.render();
-
- -
- - diff --git a/docs/wikidocs/SiteGraph_attachments/example.gif b/docs/wikidocs/SiteGraph_attachments/example.gif deleted file mode 100644 index 779fbcf16..000000000 Binary files a/docs/wikidocs/SiteGraph_attachments/example.gif and /dev/null differ diff --git a/docs/wikidocs/SiteMesh.html b/docs/wikidocs/SiteMesh.html deleted file mode 100644 index e4194b273..000000000 --- a/docs/wikidocs/SiteMesh.html +++ /dev/null @@ -1,119 +0,0 @@ - - - WebWork - - SiteMesh - - - - - - - - - - -
-

Overview

- -

SiteMesh is a web-page layout and decoration framework and web- application integration framework to aid in creating large sites consisting of many pages for which a consistent look/feel, navigation and layout scheme is required.

- -

Integrating WebWork with SiteMesh is amazingly simple: you don't have to do anything in fact. WebWork stores all its value stack information in the request attributes, meaning that if you wish to display data that is in the stack (or even the ActionContext) you can do so by using the normal tag libraries that come with WebWork. That's it!

- -

ActionContextCleanUp

- -

In WebWork's Architecture, the standard filter-chain optionally starts with the ActionContextCleanUp filter, followed by other desired filters. Lastly, the FilterDispatcher handles the request, usually passing it on to the ActionMapper. The primary purpose of the ActionContextCleanUp is for SiteMesh integration. This tells the FilterDispatcher when exactly, to clean-up the request. Otherwise, the ActionContext may be removed before the decorator attempts to access it.

- -
Warning
If ActionContext access is required within the decorators, the ActionContextCleanUp filter must be placed at the beginning of the filter-chain.
- -

For more information, see the javadocs of the ActionContextCleanUp filter:

- -

Special filter designed to work with the FilterDispatcher and allow -for easier integration with SiteMesh. Normally, ordering your filters to have -SiteMesh go first, and then FilterDispatcher go second is perfectly fine. -However, sometimes you may wish to access WebWork-features, including the -value stack, from within your SiteMesh decorators. Because FilterDispatcher -cleans up the ActionContext, your decorator won't have access to the -date you want. -

-

-By adding this filter, the FilterDispatcher will know to not clean up and -instead defer cleanup to this filter. The ordering of the filters should then be: -

-

    -
  • this filter
  • -
  • SiteMesh filter
  • -
  • FilterDispatcher
  • -

- -

Velocity and FreeMarker Decorators

- -

WebWork provides extension of the SiteMesh PageFilter that assist with integration with Velocity and FreeMarker. We strongly recommend using these filters, instead of the support provided by SiteMesh, because they also will provide the standard variables and Tags that you are used to when created views in your favoriate template language.

- -

Velocity

- -

If you are using Velocity for your SiteMesh decorators, we recommend using the VelocityPageFilter. This is an extension of the SiteMesh PageFilter, which should be placed in the web.xml in between the ActionContextCleanUp and the FilterDispatcher. Now the Velocity decorators will have access to WebWork variables such as $stack and $request.

- -
-
<filter>
-    <filter-name>webwork-cleanup</filter-name>
-    <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class>
-</filter>
-<filter>
-    <filter-name>sitemesh</filter-name>
-    <filter-class>com.opensymphony.webwork.sitemesh.VelocityPageFilter</filter-class>
-</filter>
-<filter>
-    <filter-name>webwork</filter-name>
-    <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
-</filter>
-
-<filter-mapping>
-    <filter-name>webwork-cleanup</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-<filter-mapping>
-    <filter-name>sitemesh</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-<filter-mapping>
-    <filter-name>webwork</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-
- - -

FreeMarker

- -

If you are using FreeMarker for your SiteMesh decorators, we recommend using the FreeMarkerPageFilter. This is an extension of the SiteMesh PageFilter, which should be placed in the web.xml in between the ActionContextCleanUp and the FilterDispatcher. Now the FreeMarker decorators will have access to WebWork variables such as ${stack} and ${request}.

- -
-
<filter>
-    <filter-name>webwork-cleanup</filter-name>
-    <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class>
-</filter>
-<filter>
-    <filter-name>sitemesh</filter-name>
-    <filter-class>com.opensymphony.webwork.sitemesh.FreeMarkerPageFilter</filter-class>
-</filter>
-<filter>
-    <filter-name>webwork</filter-name>
-    <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
-</filter>
-
-<filter-mapping>
-    <filter-name>webwork-cleanup</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-<filter-mapping>
-    <filter-name>sitemesh</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-<filter-mapping>
-    <filter-name>webwork</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-
- -
- - diff --git a/docs/wikidocs/Spring Session Components Workarounds.html b/docs/wikidocs/Spring Session Components Workarounds.html deleted file mode 100644 index ce97c6cff..000000000 --- a/docs/wikidocs/Spring Session Components Workarounds.html +++ /dev/null @@ -1,487 +0,0 @@ - - - WebWork - - Spring Session Components Workarounds - - - - - - - - - - -
-

Motivation

- -

Spring currently does not support session scoped beans/components out of the box. You can decide between singleton or prototype lifecycle, but you cannot have your beans bound to the session lifecycle of web applications. There are plans for integrating such a feature in the Spring 2.0 release.
-We will try to point out some possible workarounds for your WebWork based applications. First we look at the general solutions found among the Spring community, dealing with HTTPSession and all that. After that we will discuss the special conditions and requirements found in XWork/WebWork and how that might affect possible solutions. We will show some XWork/WebWork specific solutions for the given problem.

- -
-

The first milestone of Spring 2.0 (formerly 1.3) will be released the second week of December 2005. It is confirmed that it does contain Session Scope components using the Proxy (CGLIB or JDK) approach.

- -

General Solutions for Webapplications

- -

The Spring 2.0 Way

-

Interface21 added support for session (and request) scoped beans in Spring 2.0. This approach creates a CGLIB or JDK Dynamic proxy of the session scoped bean using the org.springframework.aop.target.scope.ScopedProxyFactoryBean and setting the scopeMap to org.springframework.web.context.scope.SessionScopeMap.

- -

Since the jars are backwards compatible simply build Spring and replace the jars shipped with WebWork. (Spring 2.0 M1 should be out by the time you read this.).

- -

There are 2 ways to set this up depending upon whether or not XML simplification is used. The first method uses the traditional bean definitions and is useful to understand what is happening under the covers.

- -

A modified applicationContext.xml for the shopping cart example using the traditional XML DTD is below.

- -
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-
-<beans>
-    <bean id="shoppingCart" class="org.springframework.aop.target.scope.ScopedProxyFactoryBean"
-            singleton="false">
-        <property name="scopeKey" value="shoppingCart"/>
-        <property name="targetBeanName" value="__shoppingCart"/>
-        <property name="scopeMap">
-            <bean class="org.springframework.web.context.scope.SessionScopeMap"/>
-        </property>
-    </bean>
-
-    <bean id="__shoppingCart" class="com.opensymphony.webwork.example.ajax.cart.DefaultCart"
-            singleton="false"/>
-
-</beans>
-
- -

A modified applicationContext.xml for the shopping cart example using the XML simplification is below.

- -
-
<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:aop="http://www.springframework.org/schema/aop"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
-
-    <bean id="catalog" class="com.opensymphony.webwork.example.ajax.catalog.TestCatalog"
-          singleton="true"/>
-
-    <bean id="shoppingCart" class="com.opensymphony.webwork.example.ajax.cart.DefaultCart"
-          singleton="true">
-        <aop:scope type="session"/>
-    </bean>
-
-</beans>
-
- -

You will also need to modify the web.xml to include the following filter.

-
-
<filter>
-    <filter-name>springFilter</filter-name>
-    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
-</filter>
-<filter-mapping>
-    <filter-name>springFilter</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-
- -

Custom TargetSource with a ServletFilter

-

A quite "clean" solution for web applications in general can be found at JA-SIG. The solution is well documented and can be found here. Below you will find a WebWork adoption of this solution.

- - - -

XWork/WebWork specific solutions

- -

Preface

-

WebWork is based on XWork, and XWork is not tied to the web layer. So when dealing with session scoped objects, WW users might want to use XWork's session abstraction features to keep their application independent from the web context. This is why we will discuss some XW/WW specific solutions below.

- - -

Custom TargetSource, the WebWork way

- -

Here is a modified version of the TargetSource solution pointed out above that integrates with the existing WebWork session and doesn't require an additional filter or listener. Usage is pretty much the same, create an interface for your object and make sure that you always use that interface and not the underlying implementation or autowiring will fail. You can find more information on how to make this work by looking at the WebWorkTargetSource Shopping Cart Example.

- -
WebWorkTargetSource.java
-
package org.tuxbot.webwork.spring;
-
-/* Portions Copyright 2005 The JA-SIG Collaborative.  All rights reserved.
- *  See license distributed with this file and
- *  available online at http://www.uportal.org/license.html
- */
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.aop.target.AbstractPrototypeBasedTargetSource;
-import org.springframework.beans.factory.DisposableBean;
-import com.opensymphony.xwork.ActionContext;
-
-import java.util.Map;
-
-/**
- * This target source is to be used in collaberation with WebWork.
- * The target source binds the target bean to the Session retrieved from
- * WebWork. By default the bean is bound to the session
- * using the name of the target bean as part of the key. This can be overridden by setting
- * the <code>sessionKey</code> property to a not null value.
- *
- * @author Eric Dalquist <a href="mailto:edalquist@unicon.net">edalquist@unicon.net</a>
- * @author Eric Molitor <a href="mailto:eric@tuxbot.com">eric@tuxbot.com</a>
- * @version 1.0
- */
-public class WebWorkTargetSource extends AbstractPrototypeBasedTargetSource implements DisposableBean {
-    private final static Log LOG = LogFactory.getLog(WebWorkTargetSource.class);
-
-    private transient Object noSessionInstance = null;
-    private String sessionKey = null;
-    private String compiledSessionKey = null;
-
-    public WebWorkTargetSource() {
-        this.updateBeanKey();
-    }
-
-    /**
-     * @return Returns the sessionKey.
-     */
-    public String getSessionKey() {
-        return this.sessionKey;
-    }
-    /**
-     * @param sessionKey The sessionKey to set.
-     */
-    public void setSessionKey(String sessionKey) {
-        this.sessionKey = sessionKey;
-        this.updateBeanKey();
-    }
-    /**
-     * @see org.springframework.aop.target.AbstractBeanFactoryBasedTargetSource#setTargetBeanName(java.lang.String)
-     */
-    public void setTargetBeanName(String targetBeanName) {
-        super.setTargetBeanName(targetBeanName);
-        this.updateBeanKey();
-    }
-
-    /**
-     * @see org.springframework.aop.TargetSource#getTarget()
-     */
-    public Object getTarget() throws Exception {
-        final Map session = ActionContext.getContext().getSession();
-
-        if (session == null) {
-            LOG.warn("No Session found for thread '" + Thread.currentThread().getName() + "'");
-
-            if (this.noSessionInstance == null) {
-                this.noSessionInstance = this.newPrototypeInstance();
-
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Created instance of '" + this.getTargetBeanName() + "', not bound to any webWorkSession.");
-                }
-            }
-            else {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Found instance of '" + this.getTargetBeanName() + "', not bound to any webWorkSession.");
-                }
-            }
-
-            return this.noSessionInstance;
-        }
-        else {
-            String beanKey = this.compiledSessionKey;
-
-            Object instance = session.get(beanKey);
-            if (instance == null) {
-                instance = this.newPrototypeInstance();
-                session.put(beanKey, instance);
-
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Created instance of '" + this.getTargetBeanName() + "', bound to webWorkSession for '" 
-                       + Thread.currentThread().getName() + "' using key '" + beanKey + "'.");
-                }
-            }
-            else if (LOG.isDebugEnabled()) {
-                LOG.debug("Found instance of '" + this.getTargetBeanName() + "', bound to webWorkSession for '" 
-                       + Thread.currentThread().getName() + "' using key '" + beanKey + "'.");
-            }
-
-            return instance;
-        }
-    }
-
-    /**
-     * @see org.springframework.beans.factory.DisposableBean#destroy()
-     */
-    public void destroy() throws Exception {
-        if (this.noSessionInstance != null && this.noSessionInstance instanceof DisposableBean) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Destroying sessionless bean instance '" + this.noSessionInstance + "'");
-            }
-
-            ((DisposableBean)this.noSessionInstance).destroy();
-        }
-    }
-
-    /**
-     * Generates the key to store the bean in the session with.
-     */
-    private void updateBeanKey() {
-        if (this.sessionKey == null) {
-            final StringBuffer buff = new StringBuffer();
-
-            buff.append(this.getClass().getName());
-            buff.append("_");
-            buff.append(this.getTargetBeanName());
-
-            this.compiledSessionKey = buff.toString();
-        }
-        else {
-            this.compiledSessionKey = this.sessionKey;
-        }
-    }
-}
-
- - -

Customized ApplicationContext Implementation

-

TODO: Document

- -

Customized WW/XW ObjectFactory

-

TODO: Document

- -

Session backed Bean Factory

-

The idea is to simply create a retrieve-or-create bean factory:

- -
SessionBackedBeanFactory.java
-
package net.itneering.core.spring.session;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-
-import com.opensymphony.xwork.ActionContext;
-
-import java.util.Map;
-import java.io.Serializable;
-
-/**
- * SessionBackedBeanFactory tries to lookup beans by name in XWork session. If not found,
- * it tries to instantiate new bean and attaches it to said session.
- *
- * @author <a href="mailto:gielen@it-neering.net">Rene Gielen</a>
- */
-
-public class SessionBackedBeanFactory implements Serializable, BeanFactoryAware {
-
-    BeanFactory beanFactory = null;
-
-    /**
-     * Find a component by name in session scoped storage implementation. If not found, try to instantiate new one by
-     * {@link org.springframework.beans.factory.BeanFactory#getBean(String)}. Then found component will be attached
-     * to session store implementation.
-     *
-     * @param componentName
-     * @return The requested component, if found.
-     */
-    public Object getSessionComponent( String componentName ) {
-        Object result = getSession().get(componentName);
-        if ( result == null ) {
-            result = beanFactory.getBean(componentName);
-            storeComponent(componentName, result);
-        }
-        return result;
-    }
-
-    public void storeComponent(String componentName, Object component ) {
-        getSession().put(componentName, component);
-    }
-
-    /**
-     * Actual implementation of the session scoped storage Map.
-     * Lookup {@link com.opensymphony.xwork.ActionContext#getSession()}.
-     *
-     * @return The Map for keeping session objects.
-     */
-    public Map getSession() {
-        return ActionContext.getContext().getSession();
-    }
-
-    /**
-     * Callback that supplies the owning factory to a bean instance.
-     * <p>Invoked after population of normal bean properties but before an init
-     * callback like InitializingBean's afterPropertiesSet or a custom init-method.
-     *
-     * @param beanFactory owning BeanFactory (may not be null).
-     *                    The bean can immediately call methods on the factory.
-     *
-     * @throws org.springframework.beans.BeansException
-     *          in case of initialization errors
-     * @see org.springframework.beans.factory.BeanInitializationException
-     */
-    public void setBeanFactory( BeanFactory beanFactory ) throws BeansException {
-        this.beanFactory = beanFactory;
-    }
-}
-
- -

Example applicationContext setup (note that the session scoped bean has to be setup with singleton="false"):

-
applicationContext.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<beans default-autowire="byName">
-    <bean id="sessionBeanProxy" class="net.itneering.core.spring.session.SessionBackedBeanFactory" singleton="true"/>
-    <bean id="securityContextComponent" class="net.itneering.security.component.DefaultSecurityContextComponent" singleton="false" />
-</beans>
-
- -

Example action use:

-
SecurityAwareAction.java
-
package net.itneering.xwork.action;
-
-import com.opensymphony.xwork.ActionSupport;
-import net.itneering.core.spring.session.SessionBackedBeanFactory;
-import net.itneering.security.component.DefaultSecurityContextComponent;
-
-/**
- * Simple sessionBeanProxy aware action.
- *
- * @author <a href="mailto:gielen@it-neering.net">Rene Gielen</a>
- * @version $Revision: 1.10 $
- */
-
-public class SecurityAwareAction extends ActionSupport implements PrincipalAware {
-
-    private static final Logger log = Logger.getLogger(SecurityAwareAction.class);
-
-    protected SessionBackedBeanFactory sessionBeanProxy;
-
-    /**
-     * For Spring wiring usage.
-     *
-     * @param sessionBeanProxy The sessionBeanProxyto use.
-     */
-    public void setSessionBeanProxy( SessionBackedBeanFactory sessionBeanProxy ) {
-        this.sessionBeanProxy = sessionBeanProxy;
-    }
-
-    /**
-     * Getter for actions security context.
-     *
-     * @return The securityContextComponent set by IoC.
-     */
-    public SecurityContextComponent getSecurityContextComponent() {
-        return sessionBeanProxy!= null ? sessionBeanProxy.getSessionComponent("securityContextComponent") : null;
-    }
-
-    /**
-     * Get the current User Principal for this session.
-     *
-     * @return The User Principal.
-     */
-    public UserEntity getPrincipal() {
-        try {
-            return getSecurityContextComponent().getPrincipal();
-        } catch ( NullPointerException e ) {
-            return null;
-        }
-    }
-    ...
-}
-
- -

For well known session scoped components, you might get more convenience by subclassing SessionBackedBeanFactory:

-
SecurityAwareSessionBeanProxy.java
-
package net.itneering.security.component;
-
-import net.itneering.core.spring.session.SessionBackedBeanFactory;
-
-/**
- * SecurityAwareSessionBeanProxy.
- *
- * @author <a href="mailto:gielen@it-neering.net">Rene Gielen</a>
- */
-
-public class SecurityAwareSessionBeanProxy extends SessionBackedBeanFactory {
-
-    String securityContextComponentName = "securityContextComponent";
-
-    /**
-     * Make component name configurable by spring setup
-     */
-    public void setSecurityContextComponentName( String securityContextComponentName ) {
-        this.securityContextComponentName = securityContextComponentName;
-    }
-
-    public SecurityContextComponent getSecurityContextComponent() {
-        return (SecurityContextComponent) getSessionComponent(securityContextComponentName);
-    }
-
-}
-
- -

Again example applicationContext setup:

-
applicationContext2.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<beans default-autowire="byName">
-    <bean id="mySecurityContextComponent" class="net.itneering.security.component.DefaultSecurityContextComponent" singleton="false" />
-    <bean id="sessionBeanProxy" class="net.itneering.security.component.SecurityAwareSessionBeanProxy" singleton="true">
-        <property name="securityContextComponentName" value="mySecurityContextComponent" />
-    </bean>
-</beans>
-
- -

Example action use:

-
SecurityAwareAction2.java
-
package net.itneering.xwork.action;
-
-import com.opensymphony.xwork.ActionSupport;
-import net.itneering.security.component.SecurityAwareSessionBeanProxy;
-import net.itneering.security.component.DefaultSecurityContextComponent;
-
-/**
- * Simple sessionBeanProxy aware action.
- *
- * @author <a href="mailto:gielen@it-neering.net">Rene Gielen</a>
- * @version $Revision: 1.10 $
- */
-
-public class SecurityAwareAction extends ActionSupport implements PrincipalAware {
-
-    private static final Logger log = Logger.getLogger(SecurityAwareAction.class);
-
-    protected SecurityAwareSessionBeanProxy sessionBeanProxy;
-
-    /**
-     * For Spring wiring usage.
-     *
-     * @param sessionBeanProxy The sessionBeanProxy to use.
-     */
-    public void setSessionBeanProxy( SecurityAwareSessionBeanProxy sessionBeanProxy ) {
-        this.sessionBeanProxy = sessionBeanProxy;
-    }
-
-    /**
-     * Get the current User Principal for this session.
-     *
-     * @return The User Principal.
-     */
-    public UserEntity getPrincipal() {
-        try {
-            return sessionBeanProxy.getSecurityContextComponent().getPrincipal();
-        } catch ( NullPointerException e ) {
-            return null;
-        }
-    }
-    ...
-}
-
- -

As said, the solution is very simple. You will get no ties to web layer, and the configuration is really simple, there is no need for proxy definitions in applicationContext.xml etc.
-The main disadvantage is that you will not be able to wire session scoped beans directly into your actions, you will have to use the indirection via the session backed bean factory. And, as always when dealing with XWork session abstraction, you have to take care for a action context to be setup.

- -

Auto proxied Session backed Component Factory

-

Does anyone have an implementation of this? (Eric Molitor)
-The intention was a bit different for this one, so I tried to clarify headings. Nice idea, though ... (Rene Gielen).
-The theory here is to create a custom Pointcut class that utilizes the ComponentConfiguration retrieved from the DefaultComponentManager (which loads the Component list from components.xml). The getClassFilter() matches anything that implements one of the Components in the ComponentConfiguration. The Pointcut is then registered as an advisor for all beans (AutoProxy via Springs DefaultAdvisorAutoProxyCreator). The Advice implementation looks at which Component is implmented and fetches the apporiate value out of the Session and calls the Components setter method.
-TODO: Document, create example

- -
- - diff --git a/docs/wikidocs/Spring.html b/docs/wikidocs/Spring.html deleted file mode 100644 index 3ae07221a..000000000 --- a/docs/wikidocs/Spring.html +++ /dev/null @@ -1,152 +0,0 @@ - - - WebWork - - Spring - - - - - - - - - - -
-

Spring is, among other things, an Inversion of Control framework. As of WebWork 2.2, it is the recommended IoC container. You can find out more about Spring at http://www.springframework.org.

- -
This section covers the only supported Spring integration technique. However, there are many other ways to tie in to Spring with WebWork. Please see Other Spring Integration for more info. Note that none of the other methods are currently supported and could change at any time!
- -

Enabling Spring Integration

- -

Turning on Spring support in WebWork is simply a matter of installing the latest Spring jars in to your classpath and then adding the following entry to webwork.properties:

- -
-
webwork.objectFactory = spring
-
- -

If you want to change from the default autowiring mode, which is to auto-wire by name (i.e. to look for beans defined in Spring with the same name as your bean property), then you'll also need a setting for this in your webwork.properties:

- -
-
webwork.objectFactory.spring.autoWire = type
-
- -

Options for this setting are:

- - - - - - - - - - - - - - - - - - -
name Auto-wire by matching the name of the bean in Spring with the name of the property in your action. This is the default
type Auto-wire by looking for a bean registered with Spring of the same type as the property in your action. This requires you to have only one bean of this type registered with Spring
auto Spring will attempt to auto-detect the best method for auto-wiring your action
constructor Spring will auto-wire the parameters of the bean's constructor
- -

At this point, all objects will at least try to get created by Spring. If they cannot be created by Spring, then WebWork will create the object itself. Next, you'll need to turn on the Spring listener in web.xml:

- -
-
<listener>
-    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-</listener>
-
- -
More ApplicationContext configuration files needed?
-

Since the Spring integration uses a standard Listener, it can be configured to support configuration files other than applicationContext.xml.
-Adding the following to your web.xml will cause Spring's ApplicationContext to be inititalized from all files matching the given pattern:

-
-
<!-- Context Configuration locations for Spring XML files -->
-<context-param>
-    <param-name>contextConfigLocation</param-name>
-    <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
-</context-param>
-
-

See the Spring documentation for a full description of this parameter.

-
- -

Sample Spring Configuration

- -

At this point, you can add the standard Spring configuration at WEB-INF/applicationContext.xml. An example of this configuration is:

- -
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<beans default-autowire="autodetect">
-    <bean id="personManager" class="com.acme.PersonManager"/>
-    ...
-</beans>
-
- -

Switching from Builtin IoC to Spring

- -

Switching is quite easy. Spring setup is done as described above. To complete migration, you will have to

-
    -
  1. transfer your configured components from components.xml to applicationContext.xml appropriately. You can safely delete components.xml afterwards.
  2. -
  3. remove the Component Interceptor from your interceptor stack in xwork.xml. Although it does not hurt to leave it there, it is simply redundant from now on.
  4. -
- - -
Session Scope & Spring
-

Spring <= 1.3 does not support session scoped components. Spring 2.0 release will add support for this, and tests with Spring 2.0M3 (beta) are reported to work quite well. Please refer to Spring Session Components Workarounds to read more about this topic.

- -

Initializing Actions from Spring

- -

Normally, in xwork.xml you specify the class for each action. When using the SpringObjectFactory (configured as shown above) WebWork will ask Spring to create the action and wire up dependencies as specified by the default auto-wire behavior. The SpringObjectFactory will also apply all bean post processors to do things like proxy your action for transactions, security, etc. which Spring can automatically determine without explicit configuration. For most usages, this should be all you need for configuring your actions to have services and dependencies applied.

- -
We strongly recommend that you find declarative ways of letting Spring know what to provide for your actions. This includes making your beans able to be autowired by either naming your dependent properties on your action the same as the bean defined in Spring which should be provided (to allow for name-based autowiring), or using autowire-by-type and only having one of the required type registered with Spring. It also can include using JDK5 annotations to declare transactional and security requirements rather than having to explicitly set up proxies in your Spring configuration. If you can find ways to let Spring know what it needs to do for your action without needing any explicit configuration in the Spring applicationContext.xml, then you won't have to maintain this configuration in both places.
- -

However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do is configure the bean in your Spring applicationContext.xml and then change the class attribute from your WebWork action in the xwork.xml to use the bean name defined in Spring instead of the class name.

- -

Your xwork.xml file would then have the action class attributes changed, leaving it like this:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.1.dtd">
-
-<xwork>
-    <include file="webwork-default.xml"/>
-
-    <package name="default" extends="webwork-default">
-        <action name="foo" class="com.acme.Foo">
-            <result>foo.ftl</result>
-        </action>
-    </package>
-
-    <package name="secure" namespace="/secure" extends="default">
-        <action name="bar" class="bar">
-            <result>bar.ftl</result>
-        </action>
-    </package>
-</xwork>
-
- -

Where you have a Spring bean defined in your applicationContext.xml named "bar". Note that the com.acme.Foo action did not need to be changed, because it can be autowired.

- -

A typical spring configuration for bar could look as following.

- -
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-<beans default-autowire="autodetect">
-    <bean id="bar" class="com.my.BarClass" singleton="false"/>
-    ...
-</beans>
-
- -
-

Note the id attribute in the spring configuration corresponds to the class attribute in the xwork configuration. Also note that in the spring configuration, the singleton attribute is set to false. This would generally be the case that is desired as Webwork creates a new action class upon each request. Hence when Spring integration is used, this would be the desired behaviour. Making Springs singleton attribute false would allow this.

- - -

Remember: this is not required. This is only needed if you wish to override the default behavior when the action is created in WebWork by decorating it with Spring-enabled interceptors and IoC that cannot be automatically determined by Spring. Keep in mind that WebWork's Spring integration will do standard IoC, using whatever auto-wiring you specify, even if you don't explicitely map each action in Spring. So typically you don't need to do this, but it is good to know how this can be done if you need to.

- -
- - diff --git a/docs/wikidocs/Static Parameters Interceptor.html b/docs/wikidocs/Static Parameters Interceptor.html deleted file mode 100644 index 06270fbce..000000000 --- a/docs/wikidocs/Static Parameters Interceptor.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork - - Static Parameters Interceptor - - - - - - - - - - -
- -

This interceptor populates the action with the static parameters defined in the action configuration. If the action - implements Parameterizable, a map of the static parameters will be also be passed directly to the action.

- -

Parameters are typically defined with <param> elements within xwork.xml.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no extension points to this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="static-params">
-         <param name="parse">true</param>
-    </interceptor-ref>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Stream Result.html b/docs/wikidocs/Stream Result.html deleted file mode 100644 index 8bad4f849..000000000 --- a/docs/wikidocs/Stream Result.html +++ /dev/null @@ -1,58 +0,0 @@ - - - WebWork - - Stream Result - - - - - - - - - - -
- -

A custom Result type for send raw data (via an InputStream) directly to the - HttpServletResponse. Very useful for allowing users to download content.

- - -

Parameters

- - -

    - -

  • contentType - the stream mime-type as sent to the web browser - (default = text/plain).
  • - -

  • contentLength - the stream length in bytes (the browser displays a - progress bar).
  • - -

  • contentDispostion - the content disposition header value for - specifing the file name (default = inline, values are typically - filename="document.pdf".
  • - -

  • inputName - the name of the InputStream property from the chained - action (default = inputStream).
  • - -

  • bufferSize - the size of the buffer to copy from input to output - (default = 1024).
  • - -

- - -

Examples

- -
-
<result name="success" type="stream">
-  <param name="contentType">image/jpeg</param>
-  <param name="inputName">imageStream</param>
-  <param name="contentDisposition">filename="document.pdf"</param>
-  <param name="bufferSize">1024</param>
-</result>
-
- -
- - diff --git a/docs/wikidocs/StringLengthFieldValidator Annotation.html b/docs/wikidocs/StringLengthFieldValidator Annotation.html deleted file mode 100644 index d39adf495..000000000 --- a/docs/wikidocs/StringLengthFieldValidator Annotation.html +++ /dev/null @@ -1,96 +0,0 @@ - - - WebWork - - StringLengthFieldValidator Annotation - - - - - - - - - - -
-

StringLengthFieldValidator Annotation

- -

This validator checks that a String field is of the right length. It assumes that the field is a String. -If neither minLength nor maxLength is set, nothing will be done.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
trim no true Boolean property. Determines whether the String is trimmed before performing the length check.
minLength no   Integer property. The minimum length the String must be.
maxLength no   Integer property. The maximum length the String can be.

- -

If neither minLength nor maxLength is set, nothing will be done.

- - -

Examples

- -
-
@StringLengthFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true, trim = true, minLength = "5",  maxLength = "12")
-
- - -
- - diff --git a/docs/wikidocs/StringRegexValidator Annotation.html b/docs/wikidocs/StringRegexValidator Annotation.html deleted file mode 100644 index 79e47808f..000000000 --- a/docs/wikidocs/StringRegexValidator Annotation.html +++ /dev/null @@ -1,87 +0,0 @@ - - - WebWork - - StringRegexValidator Annotation - - - - - - - - - - -
-

StringRegexValidator Annotation

- -

StringRegexValidator checks that a given String field, if not empty, -matches the configured regular expression.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
regex yes "." String property. The Regular Expression for which to check a match.
caseSensitive no true Whether the matching of alpha characters in the expression should be done case-sensitively.

- -

Examples

- -
-
@StringRegexValidator(message = "Default message", key = "i18n.key", shortCircuit = true, regex = "a regular expression", caseSensitive = true)
-
- - -
- - diff --git a/docs/wikidocs/Struts Action 2.0 Information.html b/docs/wikidocs/Struts Action 2.0 Information.html deleted file mode 100644 index 90b3bc9a2..000000000 --- a/docs/wikidocs/Struts Action 2.0 Information.html +++ /dev/null @@ -1,22 +0,0 @@ - - - WebWork - - Struts Action 2.0 Information - - - - - - - - - - -
-

After the release of WebWork 2.2.2, the WebWork and Struts communities will begin a merge that will eventually produce Struts Action 2.0. You can find out more about this merger, as well as the latest status, by visiting the project home page:

- -

http://incubator.apache.org/projects/webwork2.html

- -
- - diff --git a/docs/wikidocs/Strutting the OpenSymphony way.html b/docs/wikidocs/Strutting the OpenSymphony way.html deleted file mode 100644 index 9b6e4fe30..000000000 --- a/docs/wikidocs/Strutting the OpenSymphony way.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - Strutting the OpenSymphony way - - - - - - - - - - -
-

WebWork: Strutting the OpenSymphony way - Mike Cannon-Brookes

- - - - -

WebWork is a pull-based MVC framework focused on componentization and code reuse. It is currently in beta, but is being used by several opensource projects and a few commercial projects in development. This is the second generation of WebWork, which was originally developed by Rickard Oberg, and in this release, what was WebWork has been broken into two projects, XW:XWork and WebWork.

- -

XWork is a generic command pattern implementation with absolutely NO ties to the web. XWork provides many core services, including interceptors, meta-data based validation, type conversion, a very powerful expression language (OGNL - the Object Graph Notation Language) and an Inversion of Control (IoC) container implementation.

- -

WebWork provides a layer on top of XWork to do HTTP request / response handling. It includes a ServletDispatcher to turn HTTP requests into calls to an Action, session and application scope mapping, request parameter mapping, view integration with various web view technologies (JSP, Velocity, FreeMarker, JasperReports), and user interface components in the form of JSP tags and Velocity macros wrapped around reusable UI components.

- -

An Action is the basic unit of work in WebWork. It is a simple command object that implements the Action Interface, which has only one method: execute(). Action implementers can extend the ActionSupport class, which provides i18n localization of messages (with one ResourceBundle per Action class and searching up the inheritance tree) and error message handling including class level and field level messages.

- -

Actions can be developed in one of two styles: Model driven or field driven. Model driven Actions expose a model class via a get method, and the form fields refer directly to the model properties using expressions like "pet.name". XWork uses Ognl (the Object Graph Notation Language) as its expression language, and when rendering the page, this expression will translate to getPet().getName(). When setting properties, this will translate to getPet().setName(). This style of development allows for a great deal of model reuse and can allow you to directly edit your domain objects in your web pages, rather than needing a translation layer to form beans. Field driven Actions have their own properties which are used in the view. The action's execute() method collates the properties and interacts with the model. This can be very useful when your form and model are not parallel. Even in this case, the powerful expression language in WebWork can allow you to compose your form fields into aggregate beans, such as an address bean, which you can reuse to simplify your action classes.

- -

WebWork allows you to build your own reusable UI components by simply defining a Velocity template. This is how the pre-built components of WebWork are built for common components such as text fields, buttons, forms, etc. and made available from any view type (either JSP or Velocity at the moment). These components are skinnable by defining multiple templates for the same component in different paths. If your components include the default header and footer templates that are used in the pre-built templates, then they will inherit the ability to automatically handle displaying error messages beside the problem form field. These custom UI components are especially handy for reusing templates which handle your custom model types or for things like date pickers, which Mike showed as an example.

- -

Interceptors in XWork allow common code to be applied around (before and/or after) action execution. This is what Mike calls "Practical AOP". Interceptors help to decouple and componentized your code. Interceptors can be organized into stacks, which are lists of interceptors to be applied in sequence, and can be applied to actions or whole packages. Much of the core functionality of XWork and WebWork is implemented as Interceptors. The common basic examples of Interceptors are timing and logging, and these are built in with XWork. Mike went through an example of an interceptor to identify users of events via email. This interceptor has its own external configuration file which specifies which users are interested in which events, and it compares this configuration with the action invocations passing through it to determine if any messages should be sent.

- -

XWork's validation framework allows for decoupled validation of action properties. It is implemented as an Interceptor and reads external XML files which define the validations to be applied to the Action. Error messages are loaded from the Action's localized messages and flow through to the UI. Validator classes can be plugged in to add to the set of bundled validators. The bundled validators include required field and required String validators, range validators for Dates and numbers, and email and URL validators. XWork also includes expression validators at both the Action and field level which allow you to use any Ognl expression as the validation.

- -

Inversion of Control (IoC) removes the burden of managing components from your code and puts it on the container. The container takes care of managing component lifecycle and dependencies. EJB is an example of IoC, but with limited services. IoC promotes simplicity and decoupling of your components and encourages your classes to be smaller and more focused. Unit testing is also simplified, as you can just supply MockObject instances of the services your code depends upon during testing. XWork and WebWork provide a web-native IoC container which manages component dependencies. In WebWork IoC is implemented as lifecycle managers (SessionLifecycleListener, etc) and an Interceptor. There are 4 component scopes in WebWork IoC: Application, HTTP Session, HTTP Request, and Action invocation. IoC in XWork / WebWork is purely optional, so you can use it if you want it.

- -

XWork / WebWork allows for sets of Actions and their views to be bundled as a jar file and reused. Your main xwork.xml file can include the xml configuration file of the jar file because they are included from the classpath. Similarly, if your views are Velocity templates, you can bundle your views in the jar file and they will be loaded from the classpath when rendering. This allows for componentization of your application and reuse of bundled Actions across applications.

- -

I have to admit, when Mike mentioned this feature, I thought he was crazy. I didn't say anything at the session, but asked him about it later, and he said "didn't you write the package include stuff?" I'll take it as a good sign that things can be used in a different way than was imagined.

- -

Mike finished up with a comparison of WebWork vs. Struts . Struts is obviously the 500 lb gorilla in the web MVC space, so why use WebWork? WebWork's pros include being a smaller, simpler framework, not having to build ActionForm beans, making it very simple to test your Actions, having multiple well-supported view technologies, simpler views with less JSP tags and a more powerful expression language, not having to make your Actions thread-safe, not having your Actions tied to the web, and not being part of Jakarta . WebWork also adds many new features such as Interceptors, packages, IoC, etc. WebWork's cons include being a smaller project with fewer books and less tool support, having less standards support for specs like JSTL and JSF, and not being part of Jakarta .

- -
- - diff --git a/docs/wikidocs/Style Guide.html b/docs/wikidocs/Style Guide.html deleted file mode 100644 index 8b4b6188a..000000000 --- a/docs/wikidocs/Style Guide.html +++ /dev/null @@ -1,293 +0,0 @@ - - - WebWork - - Style Guide - - - - - - - - - - -
-

This page contains my suggestions on documentation style. I will try to demonstrate my suggestions by writing a document that justifies them. I'm an advocate of learning by example. As Mark Twain said, "Few things are harder to put up with than the annoyance of a good example" (Samuel Langhornne Clemens (1835-1910)).

- -

Pulling content from CVS

- -

A large part of the WebWork 2.2 documentation effort is to make documentation easier to handle in the future. At on the onset of this effort, everyone agreed that pulling as much source code, examples, and documentation from source control would help greatly. As such, we've installed a modified version of the snippet macro in the OpenSymphony wiki.

- -
Important!
Whenever you write documentation, ask yourself if you can somehow have this documentation checked in to source control in the form of example code or JavaDocs. This will make the documentation much more likely to be useful for years to come.
- -

The standard way to use it is to do the following:

- -

{snippet:id=description|javadoc=true|url=com.opensymphony.xwork.interceptor.LoggingInterceptor}

- -

or

- -

{snippet:id=example|javadoc=true|lang=xml|url=com.opensymphony.xwork.interceptor.LoggingInterceptor}

- -

or

- -

{snippet:id=sitegraph-usage|lang=none|url=webwork/src/java/org/apache/struts/action2/sitegraph/sitegraph-usage.txt}

- -

or

- -

{snippet:id=ajax-validation-example|lang=xml|url=webwork/webapps/ajax/src/webapp/lesson1/example.jsp}

- -

Where:

- -
    -
  • id is the name of the snippet (*required).
  • -
  • url is the URL where the snippet can be found (required).
  • -
  • lang is the language that the code block should be required as. If this snippet is simply text, don't include this parameter and the content will be printed outside of a code block.
  • -
  • javadoc indicates if the content is within a JavaDoc block. If this is set to true, then the preceeding "* " (asterisk-space) characters will be stripped before printing the content out. Also, the content is assumed to the HTML escaped already and therefore won't be escaped again.
  • -
- - -

All snippets are marked off by the pattern START SNIPPET: XXX and END SNIPPET: XXX where XXX is the name of the snippet that is assigned in the id attribute of the macro. The URL is typically a location that points to the project's source control contents.

- -

A note about URLs

- -

As you probably noticed in the examples, there are several formats that the URL patterns can be in. A fully-qualified URL is always allowed, though that is often not practical. We've customized the macro to be a bit more intelligent with the URL attribute:

- -
    -
  • If the URL appears to be a class, we assume it lives in src/java, convert all the dots to slashes, and then append .java to it.
  • -
  • If the URL doesn't start with "http", then it is assumed to start with _https://opensymphony.dev.java.net/source/browse/*checkout*/_, as you saw in the third example.
  • -
- - -

Note that the short-hand class notation will only work for top-level projects (WebWork, OSWorkflow, etc) and not any sub-projects within the projects, such as example webapps in WebWork. If you wish to include content from a class in a sub-project, you'll need to list out the full path, like in the fourth example.

- -

A note about snippet markers

- -

All snippet markers should be commented out if possible. How they are commented out depends on where the snippet is. If the snippet is for HTML or XML, you can do:

- -
-
<!-- START SNIPPET: xxx -->
-...
-<!-- END SNIPPET: xxx -->
-
- -

If the snippet is in Java code, you can do:

- -
-
if (true != false) {
-    // START SNIPPET: xxx
-    System.out.println("This is some silly code!");
-    // END SNIPPET: xxx
-}
-
- -

If the snippet is found in JavaDocs, you should use HTML comments as they won't render in the JavaDocs. For XML examples in JavaDocs (see Timer Interceptor for an example), it can be a bit tricky. This is because in your JavaDocs you want to use the <pre> tag, but you don't want the wiki to display it. A good technique is to embed the snippet markers inside the <pre> tag:

- -
-
* <pre>
- * <!-- START SNIPPET: example -->
- * &lt;!-- records only the action's execution time --&gt;
- * &lt;action name="someAction" class="com.examples.SomeAction"&gt;
- *     &lt;interceptor-ref name="completeStack"/&gt;
- *     &lt;interceptor-ref name="timer"/&gt;
- *     &lt;result name="success"&gt;good_result.ftl&lt;/result&gt;
- * &lt;/action&gt;
- * <!-- END SNIPPET: example -->
-
- -

About Headings

- -

This section refers to: Notation Guide >> Headings.

- -

Headings should definetly be used. This sections tries to justify why.

- -

First rule: don't use "h1" at the top of each page. The page title serves as the "top level header" already, so there is no need to duplicate that information again. Also, when the docs end up the website, SiteMesh will place a top level "h1" element using the page title.

- -

Document sections

- -

Headings can help you divide your document in sections, subsections, sub-subsections and so forth.

- -

Advantages

- -

Your document becomes more organized.

- -

Disadvantages

- -

If you exaggerate you could fragment your text too much.

- -
Warning
-

This is definetly an example of this, since this whole "Headings" section has such few paragraphs that it really should have been written in just one section.

- -

Aren't warning boxes neat?

- - -

Headings capitalization

- -

I think headers h1 and h2 should have all words capitalized (such as "Vitor's Suggestions on Documentation Style" and "About Headings"), but h3 and smaller would have just the first word (such as "Headings capitalization"). Except, of course, for words that are always capitalized (eg. "Understanding WebWork's importance to OpenSymphony and its community"). This gives even more importance to bigger headings.

- - -

Avoid skipping headers

- -

I mean, avoid going from a h1 directly to a h3 without using h2 before. This would be like havin a section 1.1.1 directly below section 1, without the existance of section 1.1.

- -
Handy Hint
-

One thing that I like to do is leave five blank lines before h1 headings, three before h2's and two before h3's. Also, in Portuguese (I'm Brazilian), we write small numbers using their names instead of numeric representation (five instead of 5). I don't know if this is also a good practice in written english.

- -

Aren't tip boxes neat?

- -
Be Careful
-

If you find yourself writting too many h1 headings in a single page, consider breaking the page into child pages and linking to them.

- -

Aren't note boxes neat?

- - - -

More on Text Effects

- -

This section refers to: Notation Guide >> Text Effects.

- -

Text effects should be largely used, although I have some questions on some of them. Strong, emphasis, and inserted can be used to denote importante parts of a sentence. But I really think inserted should have been called underline in the notation guide. I don't see the point of using deleted, since when someone changes a page and deletes stuff, Confluence keeps the old versions in history.

- -

I can't think of a situation in WebWork's doc for superscript and subscript, but it doesn't hurt to mention them. I can't say anything about %span% because I frankly don't know what it does. Monospaced is heavily used, for instance, to refer to webwork-default.xml file or items in source code examples: <xmltag />, JavaClass or javaVariable.

- -
Boxes vs. Block Quotes
-

I think boxes and block quotes do the same job, but boxes are better. Therefore, I suggest we don't use block quotes.

- -

Aren't info boxes neat? Aren't them all neat? By now you may have realized I think we should definetly use them...

- -

Colors should be used in very specific cases, or else each documentation writers would color his/her pages the way he/she thinks it's better, and it would look like a mess. One such specific case in which colors can help is when you want them to work as tags or captions. For (a lame) example, in this paragraph, guidelines are in red and justifications are in blue. Yes, it's a really really lame example, I know.

- - - -

Text Breaks

- -

This section refers to: Notation Guide >> Text Breaks.

- -

Text breaks shouldn't be used. If you'd like paragraphs or headings to have more spacing (before or after), the style sheet should be changed, not the contents. Patrick explained this a long time ago. Other stuff in this section (paragraphs, horizontal ruler, — symbol and – symbol) can be used when necessary.

- - - -

Links

- -

This section refers to: Notation Guide >> Links.

- -

All types of links can and should be used. I already used a few in this document. Just watch out for links to non-existing pages when writing on the official documentation.

- - - -

Lists

- -

This section refers to: Notation Guide >> Lists.

- -

Lists can be used for many purposes. Every time we list some things that are in order, ordered lists are used. If they don't have a specific order, unordered lists are the case. List should be nested if needed for a better organization. Unordered lists should be created only with the * (star) notation only, so all pages use the same style of bullet.

- -
    -
  • This is an unordered list in star notation;
  • -
  • Items can have sub-items -
      -
    • That can have sub-items -
        -
      • That can have sub-items... -
          -
        • What is the limit?
        • -
        -
      • -
      -
    • -
    -
  • -
  • Mixing ordered and unordered lists is possible: -
      -
    1. One;
    2. -
    3. Two;
    4. -
    5. Three.
    6. -
    -
  • -
- - -
List indentation
-

Use tabs to indent nested lists. This way your page's markup is more readable and easier to maintain.

- - - -

Images and Icons

- -

This section refers to: Notation Guide >> Images and Notation Guide >> Misc.

- -

External images should be used only when strictly necessary (meaning, don't use images as list bullets or box icons). Also, try to use only images that are very unlikely to be removed from its current URL, to reduce document maintenance. Pay attention on copyright issues too! Attached images are less prone to become missing links, however, we should not clutter the documentation with unnecessary attachments and copyrights are also a issue here.

- -

Example: Cannot resolve external resource into attachment.

- -

Icons are cool in a number of situations. Some of them, such as , , or can make the documentation look professional, but some others, such as and may give a feeling of amateurship and I wouldn't advise them for pages that are exported to form the official documentation.

- - - -

Tables

- -

This section refers to: Notation Guide >> Tables.

- -

Tables are very useful when lists just don't do it. Meaning: don't write a table when a list suffices. Tables are more organized, because you can align the text in columns. Since the markup text for tables in confluence is not very easy to read, remember complex and big tables are very hard to maintain.

- -

The table below was copied from a reference page on WebWork's configuration (just the first two lines were copied). This is an example where tables are good: a list wouldn't be as organized as this table to display these files and their properties.

- - - - - - - - - - - - - - - - - - - - -
FileOptionalLocation (relative to webapp)Purpose
web.xmlno/WEB-INF/Web deployment descriptor to include all necessary WebWork components
xwork.xmlno/WEB-INF/classes/Main configuration, contains result/view types, action mappings, interceptors, etc
- - - -

Advanced Formatting

- -

This section refers to: Notation Guide >> Advanced Formatting.

- -

I've already made my point about info, warning, tip and note boxes. Other interesting markups are noformat and code. The former can be used for general purpose text while the latter is used to display example source code, be it HTML, XML, Java or anything that is part of a software solution. When displaying something that has a name, use a title, as the example below demonstrates.

- -
HelloWorld.java
-
/** Hello World class. */
-public class HelloWorld {
-  /** Main method. */
-  public static void main(String[] args) {
-    System.out.println("Hello, World!");
-  }
-}
-
- -

A typical example of noformat would be the command line statements to compile and run the code above. We should also standardize terminal notation ({$} for command prompt).

- -
-
$ javac HelloWorld.java
-
-$ java HelloWorld
-Hello, World!
-
-
- -

Do not use tabs inside noformat and code, use two spaces instead. This way your code is indented but keeps lines short. Large lines should be splitted as to fit in a 800x600 resolution screen without horizontal scroll bars.

- - - -

Your Comments Please

- -

Please contribute to this page. Let me know if you have a different opinion on something (please justify it). Please warn me if I wrote something wrong or if this proposed Style Guide is missing something. Feel free to correct my english, since I'm not a native speaker.

- -
- - diff --git a/docs/wikidocs/SunOne 7.0.html b/docs/wikidocs/SunOne 7.0.html deleted file mode 100644 index 0b4918d46..000000000 --- a/docs/wikidocs/SunOne 7.0.html +++ /dev/null @@ -1,43 +0,0 @@ - - - WebWork - - SunOne 7.0 - - - - - - - - - - -
-

You need to grant permissions to WebWork:

- -
-
grant {
-	permission java.security.AllPermission;
-};
-
- -

or more specifically,

- -
    -
  • Give Write Permissions to java.util.PropertyPermission.
  • -
  • Add java.lang.reflect.ReflectPermission "suppressAccessChecks"
  • -
  • OgnlInvoke Permission
  • -
- - -
-
grant {
-	permission java.util.PropertyPermission "*", "read, write";
-	permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
-	permission ognl.OgnlInvokePermission "*";
-};
-
- -
- - diff --git a/docs/wikidocs/Tabular inputs with HashMap.html b/docs/wikidocs/Tabular inputs with HashMap.html deleted file mode 100644 index 0fe571a6a..000000000 --- a/docs/wikidocs/Tabular inputs with HashMap.html +++ /dev/null @@ -1,126 +0,0 @@ - - - WebWork - - Tabular inputs with HashMap - - - - - - - - - - -
-

Intro

- -

I have a need to enter tabular data, like marks from a list of examination candidates.

- -

This is how it's done :

- -

the mark.vm file..

-
-
#foreach ( $candidate in $candidateList )
-  #tag( TextField "label=" "name=marks['$candidate.id']" "value='$candidate.mark'" "size=3" )
-#end
-
- -

the SaveMarksAction

-
-
public class SaveMarksAction extends ActionSupport {
-	private Map marks = new HashMap();
-
-	public Map getMarks() {
-		return marks;
-	}
-
-
-	public String execute() throws Exception {
-		// get list of candidate IDs
-		List candidateIds = marks.keySet();
-
-		for (Iterator iter = candidateIds.iterator(); iter.hasNext();) {
-			String candidateId = (String) iter.next();
-			String mark = parseMap(marks.get(candidateId));
-
-			// process candidates and marks...
-		}
-
-	}
-
-	// helper function to parse the map of entries....
-	private static String parseMap(String[] map) {
-		if (map == null) {
-			return null;
-		}
-		if (map.length != 1) {
-			return null;
-		}
-		return map[0];
-	}
-
-
-}
-
-

Explanation

- -

The resulting vm file is rendered as

- -
-
<input type="text" name="marks[OS:'candidateId1']" value="4" size="3"/>
-<input type="text" name="marks[OS:'candidateId2']" value="5" size="3"/>
-<input type="text" name="marks[OS:'candidateId3']" value="6" size="3"/>
-<input type="text" name="marks[OS:'candidateId4']" value="7" size="3"/>
-
- -

Webwork will populate the marks into the Map marks via

- -
-
private Map marks = new HashMap();
-
-public Map getMarks() {
-	return marks;
-}
-
- -

whereby you can get the list of candidateIds via

- -
-
List candidateIds = marks.keySet();
-
- -

and the individual marks via

- -
-
for (Iterator iter = candidateIds.iterator(); iter.hasNext();) {
-	String candidateId = (String) iter.next();
-	String mark = parseMap(marks.get(candidateId));
-}
-
- -

Possible enhancements

- -

Couple tabular inputs with some sortable table component (javascript, client side)

- - - -

or

- -

DisplayTag (server side)

- - - -

I believe there's some discussion on the mailing list about using Ognl to handle it automatically. I didn't follow it in detail, but from what I know, (do correct me if I'm wrong) the Ognl method is not available yet. The above works for now.

-

Conclusion

- -

Feedback, comments and suggestions on better methods to perform the same function are welcome. If there's a simpler way, or a customised component to handle this tabular input automatically, I believe it'll be very useful.

- -
- - diff --git a/docs/wikidocs/Tabular inputs with XWorkList.html b/docs/wikidocs/Tabular inputs with XWorkList.html deleted file mode 100644 index 84bffd217..000000000 --- a/docs/wikidocs/Tabular inputs with XWorkList.html +++ /dev/null @@ -1,141 +0,0 @@ - - - WebWork - - Tabular inputs with XWorkList - - - - - - - - - - -
-

Sometimes you need a way to enter tabular data such as list of quantity for products in a shopping cart, marks from a list of examination candiates, etc. If you just have one input value per line item, you can use a HashMap to store the value. This can be expanded to support multiple input values by having multiple HashMap. This describes a number of alternatives using some of more advanced features of WebWork. Assume you want to capture the quantity and a gift note for a list of products in a shopping cart (i.e Amazon).

- -

1. When the number of line items is known

- -

If you are using JSP:
-the cart.jsp file in altSyntax

- -
-
<ww:iterator value="cart.items">
-  <ww:hidden name="cart.items[%{#rowstatus.index}].productId" value="%{productId}">
-  <ww:textfield name="cart.items[%{#rowstatus.index}].qty" value="%{qty}" />
-  <ww:textfield name="cart.items[%{#rowstatus.index}].note" value="%{note}" />
-</ww:iterator>
-
- -

the cart.jsp file (non altSyntax)

- -
-
<ww:iterator value="cart.items">
-  <ww:hidden name="'cart.items[' + #rowstatus.index + '].productId'" value="productId">
-  <ww:textfield name="'cart.items[' + #rowstatus.index + '].qty'" value="qty" />
-  <ww:textfield name="'cart.items[' + #rowstatus.index + '].note'" value="note" />
-</ww:iterator>
-
- -

Alternatively, if you use Velocity as your view technology of choice:
-the cart.vm file

- -
-
#foreach ( $item in $cart.items )
-  #set($index = $velocityCount - 1)
-  <input type="hidden" name="cart.items[$index].productId" value="$item.productId">
-  <input type="text" name="cart.items[$index].qty" value="$item.qty">
-  <input type="text" name="cart.items[$index].note" value="$item.note">
-#end
-
- -

the UpdateCartAction.class

- -
-
public class UpdateCartAction extends ActionSupport {
-
-	public Cart getCart() {
-                // Lazy initialization
-                Cart result = ActionContext.getContext().getSession.get("cart.key");
-                if ( result == null ) {
-                        result = new Cart();
-                        ActionContext.getContext().getSession.put("cart.key", result);
-                }
-		return result;
-	}
-
-	public String execute() throws Exception {
-                // Just ensuring our cart is initialized...
-		Cart cart = getCart();
-
-		// loop through a
-	}
-}
-
- -

the Cart.class

- -
-
public class Cart implements Serializable {
-  private List items = new ArrayList();
-
-  public List getItems() {
-    return items;
-  } 
-
-  public void addItem(CartItem item) {
-      ...
-  }
-}
-
- -

the CartItem.class

- -
-
public class CartItem implements Serializable {
-  private int qty;
-  private int productId;
-  private String note;
-
-  // getters/setters...
-}
-
- - -

Explanation

- -

The resulting html code is rendered as

- -
-
<input type="hidden" name="cart.items[0].productId" value="1">
-<input type="text" name="cart.items[0].qty" value="2">
-<input type="text" name="cart.items[0].note" value="This is a fun book!">
-
-<input type="hidden" name="cart.items[1].productId" value="2">
-<input type="text" name="cart.items[1].qty" value="2">
-<input type="text" name="cart.items[1].note" value="You love this one">
-
-<input type="hidden" name="cart.items[2].productId" value="3">
-<input type="text" name="cart.items[2].qty" value="$item.qty">
-<input type="text" name="cart.items[2].note" value="">
-
- -

Webwork will populate all the entries in Cart with the correct values.
-In depth, the ParametersInterceptor would apply the form results to our model, leading to the call similar like

-
-
((CartItem) updateCartAction.getCart().getItems().get(0)).setProductId(1);
-
-

for the first shown line in the rendered result.

- -

2. When the number of line items is unknown

- -

For example, you want to allow the user to enter any number of ISBN, quanty and a note. You can replace ArrayList with XWorkList, which will automatically create new items if the index is greater than the size of the list.

- -

3. Use Type Conversion

- -

If you want more advanced way to do this, check out Type Conversion documentation.

- -
- - diff --git a/docs/wikidocs/Tag Syntax.html b/docs/wikidocs/Tag Syntax.html deleted file mode 100644 index f23ffad3e..000000000 --- a/docs/wikidocs/Tag Syntax.html +++ /dev/null @@ -1,75 +0,0 @@ - - - WebWork - - Syntax - - - - - - - - - - -
-

The tag syntax in WebWork is extremely easy to understand. To quickly get started, all you need to know is that all attributes are applied as Strings initially. They are then parsed for the syntax %{ ... }, and anything in between the braces is evaluated against the value stack.

- -
Upgrade note!
The tag syntax was not always this easy – if you are upgrading from WebWork 2.1.7 or previous versions, you may wish to read about the Alt Syntax.
- -

Like most things in life, it turns out that this isn't quite that simple. Specifically, there are actually three rules to be aware of:

- -
    -
  1. All String attribute types are parsed for the %{ ... } characters.
  2. -
  3. All non-String attribute types are not parsed, but instead evaluated directly as an OGNL expression
  4. -
  5. The exception to rule #2 is that if the non-String attribute starts with %{ and ends with }, those characters are cut off before evaluating the expression.
  6. -
- - -

The best way to understand these rules is by looking at some examples.

- -
We recognize that these rules can be confusing. Generally, you should not need to know them at all, as 99.9% of the time everything will "just work". However, as we see in the examples, there are some tricky situations that require understanding of these rules. In future versions of WebWork, will be trying to make the tag syntax even simpler
- -

Some Examples

- -

The most basic example explaining how the tag syntax works is as follows. This example shows off rule #1 only:

- -
-
<ww:textfield label="%{getText("state.label")}" name="state"/>
-
- -

In this example, the label is dynamically evaluated and set to the outcome of the OGNL expression getText("state.label"), which will in turn invoke the Internationalization system are retrieve the value of the i18n key state.label. The name, being a String attribute, is simply set to the string state.

- -

The next example shows off rule #2:

- -
-
<ww:select label="%{getText("state.label")}" name="state" multiple="true"/>
-
- -

While this looks very similar to the last example, the key thing to recognize is that the multiple attribute is of type Boolean, which means it falls under rule #2. Generally you won't even notice this, because true as an OGNL expression evaluated to true, which is what you want.

- -

Now let's suppose we want to extend this example to show off rule #3 by making the multiple attribute dynamic:

- -
-
<ww:select label="%{getText("state.label")}" name="state" multiple="%{allowMultiple}"/>
-
- -

Because the attribute is of type Boolean and starts and ends with the correct characters from rule #3, it is reduced to the expression allowMultiple, which is evaluated against the value stack, returning a true of false value, just like in the previous example.

- -

There is one trick example to keep an eye on, however. For example, the following is probably incorrect:

- -
-
<ww:textfield label="%{getText("state.label")}" name="state" value="CA"/>
-
- -

This example will only work if the expression CA can result in something, meaning that your action has a method getCA(), which is probably not what you expected. This is because the value attribute is of type Object and therefore rule #2 applies. If the desire is to set a static String as the initial value, you would need to supply an OGNL expression that returns a String. For example, this is the correct way to do it:

- -
-
<ww:textfield label="%{getText("state.label")}" name="state" value="%{'CA'}"/>
-
- -

While you could set the value attribute as just "'CA'", we recommend the parsed expressions so that, in the future when WebWork supports parsed attributes for all types, your code will still work.

- -
- - diff --git a/docs/wikidocs/Tags.html b/docs/wikidocs/Tags.html deleted file mode 100644 index 945357958..000000000 --- a/docs/wikidocs/Tags.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork - - Tags - - - - - - - - - - -
-

Webwork provides a tag library decoupled from the view technology. In this section, we describe each tag in general terms, such as the attributes it supports, what the behaviors are, etc. Most tags are supported in all template languages (see JSP Tags, Velocity Tags, and FreeMarker Tags), but some are currently only specific to one language. Whenever a tag doesn't have complete support for every langauge, it will be noted in the reference documents.

- -

The types of tags can be broken in to two types: general and HTML. Besides function and responsibility, the biggest difference between the general tags and the HTML tags is the fact that the HTML tags support templates and themes. In addition to the general tag reference, we also provide examples for using these generic tags in each of the support languages.

- -
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

General Tags

-

General tags are used for controlling the execution flow when your pages render. They also allow for data extraction from places other than your action or the value stack, such as Internationalization, JavaBeans, and including additional URLs or action executions.

- -
    -
  1. Control Tags provide control flow, such as if, else, and iterator.
  2. -
  3. Data Tags allow for data manipulation or creation, such as bean, push, and i18n.
  4. -
- - -

HTML Tags

-

Unlike the general tags, the HTML tags do not provide much control structure or logic. Rather, they are focussed on using data, either from your action/value stack or from the Data Tags, and displaying it in rich and reusable HTML. All HTML tags have a unique behavior that they are driven by templates and themes. While the general tags simply output some content directly from the tag (if there is any content to output), the HTML tags defer to a template, often grouped together as a theme, to do the actual rendering.

- -

This unique template support allows for you to use the HTML tags to build a rich set of reusable UI components that fit your exact requirements. Please read the Themes and Templates guide for more information on this powerful feature.

- -
    -
  1. Themes and Templates: a must-read explanation of how themes and templates are uses when rendering HTML tags.
  2. -
  3. Form Tags provide all form-related HTML output, such as form, textfield, and select.
  4. -
  5. Non Form Tags provide all non-form-related HTML output, such as a, div, and tabbedPanel.
  6. -
- - -

Language Specific Tag Support

-

WebWork strives to support whatever environment you are most comfortable working in. That is why WebWork does not require a single template language, but instead allows for almost any common language to be used and even provides hooks for new languages. By default, almost every single tag is supported in JSP, Velocity, and FreeMarker. In each of these sections, you'll find examples and techniques for applying the generic tag reference toward your specific language or template choice.

- -
As of WebWork 2.2, FreeMarker has become the "standard" template language recommended by the WebWork team. There are many reasons for this decision, which can be found in various forums archives, but it pretty much boils down to this: FreeMarker provides a richer set of features than Velocity and is also more developer-friendly when errors occur (ie: the error reports are more accurate). JSP, while still used, is much more difficult for applications that demand a more modular approach, such as changing the templates at runtime or uploading packaged "modules" of WebWork actions and template files.
- -
    -
  1. JSP Tags
  2. -
  3. Velocity Tags
  4. -
  5. FreeMarker Tags
  6. -
- - -
- - diff --git a/docs/wikidocs/Template Loading.html b/docs/wikidocs/Template Loading.html deleted file mode 100644 index a06111381..000000000 --- a/docs/wikidocs/Template Loading.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork - - Template Loading - - - - - - - - - - -
-

Unless you have some advanced or unusual requirements, template loading is very straight forward. The simple description is this:

- -

Templates, by default, are always FreeMarker templates and are loaded the same way other FreeMarker templates (such as your results) are: by first searching the web application and then the classpath.

- -

Template and Themes

- -

Templates are loaded based on the theme (see Selecting Themes) and the template directory. The template directory is defined by the webwork.ui.templateDir property in webwork.properties (defaults to template). This means, by default, if a tag is using the ajax theme, the following two locations will be searched (in this order):

- -
    -
  1. In the web app: /template/ajax/template.ftl
  2. -
  3. In the classpath: /template/ajax/template.ftl
  4. -
- - -

Overriding Templates

- -

Because most of the templates you will need are included in the WebWork jar (the classpath), you may find a few situations where you need to override a particular template to provide behavior that is unique to your application. For example, you might wish to change how select tags render. Rather than creating a brand new template and changing every tag to use that template, you can override the built in select.ftl template by copying the file from in the jar over to a new /template/xhtml/select.ftl directory.

- -

Altering Template Loading Behavior

- -

Sometimes it may be important to load templates from elsewhere other than the classpath and web app. For example, you might wish to load templates from the file system or a URL. This is useful for not only HTML Tags, but also for any result your write.

- -

You can do this by consulting the FreeMarker documentation and extending the FreeMarkerManager.

- -

Alternative Template Engines

- -

WebWork provides for template rendering engines other than FreeMarker. We almost never recommend using anything other than FreeMarker templates, if only because WebWork provides templates already written in FreeMarker and not in JSP or Velocity. However, some users, especially advanced users of older versions of WebWork (pre-2.2) may find it necessary to use a different template engine.

- -
Alternative template engines are for advanced users. Please use with care!
- -

WebWork supports three template engines, which can be controlled by the webwork.ui.templateSuffix in webwork.properties:

- -
    -
  • ftl (default) - FreeMarker-based template engine
  • -
  • vm - Velocity-based template engine
  • -
  • jsp - JSP-based template engine
  • -
- - -

If you choose to use vm or jsp, you must implement your own templates and themes entirely, which is a large amount of work.

- -
Just because your views aren't written in FreeMarker doesn't mean you can't use the FreeMarker template engine. Again, we strongly discourage you from writing your own templates from scratch. Rather, we recommend you learn a small bit of FreeMarker and extend existing templates
- -
- - diff --git a/docs/wikidocs/Testimonials.html b/docs/wikidocs/Testimonials.html deleted file mode 100644 index be8214da9..000000000 --- a/docs/wikidocs/Testimonials.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork - - Testimonials - - - - - - - - - - -
-

WebWork rocks! We use it for our Bug Tracking and for several of our clients. We have moved several sites from Struts to WebWork. I love it. Another site we work with for Survey Software is also moving off of Struts to WebWork. Everything is easier in WW, especially with the power of Interceptors!!!

- -

Again... another site in 1 week with Site Mesh and WebWork. Its a blog community site. The one I manage... being a cyclist is the Cycling Community

- -

Mike Porter, Architect, eSage Group
-http://www.esagegroup.com

- -
- -

Two years ago we dediced to use WebWork instead of Struts because of it's technical superiority and it proved to be an excellent decision. WebWork is successfully used by productive customer applications running with WebLogic and Tomcat. A major project will be migrated to the newest XWork/WebWork versions in the next 6 months. Besides it's technical advantages, XWork/WebWork has a smart and extremely skilled developer team and a healthy community.

- -

Lars Fischer, Project Manager, Compudata AG Switzerland
-http://www.compudata.ch

- -
- -

WebWork is a very versatile web framework. After using solutions ranging from home-grown to Struts, WebWork is truly a breath of fresh air. XWork/WebWork not only used advanced techniques and technology, but brought concepts to the table that actually made development easier. These include built-in IOC, easy to use Spring integration, and null-property handling, and of course, type conversion.

- -

I'm definitely looking forward to utilizing the newest features in my future projects. Keep up the good work!

- -

Jay Bose, Sr. Engineer, Notiva Corporation
-http://www.notiva.com

- -
- - diff --git a/docs/wikidocs/The Vault.html b/docs/wikidocs/The Vault.html deleted file mode 100644 index 055e8d578..000000000 --- a/docs/wikidocs/The Vault.html +++ /dev/null @@ -1,208 +0,0 @@ - - - WebWork - - Vault - - - - - - - - - - -
-

The Vault

- -

What is the vault ?

- -

The vault contains lots of unsorted problems, snippets, remarks and ideas, mostly found in posts in the WebWork Forum. You can think of this page as a place to store content before it is analyzed and put in the official docs, cookbook or FAQ. It's raw, unpolished, and can contain typos. If you can't find it in the docs, you can take a look in here (or use the search in the forum). It also gives an idea of what problems ww users encounter in their search for the holy grail.

- -

Feel free to 'take' issues from this page and move them to an appropriate page.

- -
Under construction
Tryout - if this is a bad idea, feel free to tell me so. It would be great if we could have some sort of notifier in the forum to inform us when an interesting post arrives.
- -

Migration to 2.2

- -

Note about upgrading your WW tags to 2.2

- - - -

Just a quick fyi that caused issues for us... In 2.2 when extending UIBean evaluateExtraParams() no longer takes parameters. (Our parameters were not working until we realized that evaluateExtraParams was not being invoked due to the change.) In 2.1 evaluateExtraParams was passed the stack IIRC.

- -

Not sure if this is documented anywhere but it caused us quite a headache when migrating from 2.1 to 2.2.

- -

Where did the velocity templates go ?

- - - -

checking cvs log, it seems that Pat has removed it with comment as follows:

- -

removing velocity macro implementations - they are so old and out of date now it will cause more harm than good keeping them around

- -

Best practices

- -

Should I make an action or rather link to a .jsp page ?

- - - -

If you put an action configuration in your xwork.xml but don't put an action
-class attribute, it will default to using the ActionSupport class, which
-just returns SUCCESS.

- -

Type conversion

- -

Type conversion for a static inner class ?

- - - -

Collection_inner property name = your.package.ClassName$StaticInnerClassName (notice the dollar sign between the fully qualified Class name and the static inner class)

- -

Migration to Spring IoC

- -

How can we migrate ServletRequestAware, ServletResponseAware and ValidationAware to Spring bean definitions?

- - - -

I tink just the normal way would work. The action will now be created by spring, and if the ServletConfigInterceptor is in the stack and the action implementation implement those interface, webwork should set the appropriate methods.

- -

Freemarker, Velocity, JSP

- -

How to disable Velocity template caching ?

- - - -

The "wwclass" was the resource loader I need to change.
-Here's the lines from Velocity.props:

-
-
wwfile.resource.loader.cache=false
-wwclass.resource.loader.cache=false
-
-

(http://jroller.com/page/gigix?entry=velocity_performance_issue_solved)

- -

How to catch Freemarker exceptions (the ugly big yellow pages)

- - - -

FreeMarker delegates exception handling to so-called TemplateExceptionHandlers. By default the HTML_DEBUG_HANDLER is used (this one generates the yellow error page), but you can easily specify a different exception handler by using the setTemplateExceptionHandler method of your configuration object. FM provides some simple handlers you can use, in your case I recommend the RETHROW_HANDLER (
-http://freemarker.org/docs/api/freemarker/template/TemplateExceptionHandler.html).

- -

My ww:include actions aren't processed

- - - -

Did you declare the ww tag library in your includes ? If I'm not mistaken, jsp includes work different from ww includes (ww process the pages before including them).

- -

I'm using ww:urlHelper in combination with the c:out tag, but it won't work !

- - - -

if the url with &amp is used in the value attribute it will not work properly unless the escapeXml is set to false.

- -

Validation

- -

How to disable validation on the first page load (to show a in input form)?

- - - -

If you define your own stack you can exclude methods from validation by adding the excludeMethods param to both Validation and Workflow. Assuming you are using the defaultStack the the methods input, back and cancel will be ignored. Change default to action!input and declare the input method to return INPUT.

- -

When using clientside validation, DWR states it gets No Data From Server

- - - -

When using firefox if a user has focus on an input control and then clicks the submit button i get a DWR error stating that there was no data from the server.
-I searched around on this group and did not see a solution. Via the DWR mailing list I found a post fromi Joe Walker stating that a workaround was to register a custom DWR error handler ..
-http://getahead.ltd.uk/dwr/browser/engine/errors

- -

Why can't I use && (=and) in my validation rules ? || (=or) does work !

- - - -

You can't use && directly since the validation files have to be wellformed xml. The correct syntax would be &amp ;&amp ; (without the spaces)

- -

Ajax, Javascript

- -

Datepicker i18n problems

- - - -

DatePicker might have some problems in certain localised enviroments, because some of the language files included in DHTML / JavaScript Calendar are not valid (don't have some variables, for example WEEKEND definition).

- -

Is simple solution to overide files like:
-http://localhost:8080/showcase/webwork/jscalendar/lang/calendar-(your language).js

- -

The only way to fix that, is correct calendar-(your language).js...

- -

Already fixed for 2.2.1, available via CVS HEAD:

-
    -
  • sv
  • -
  • pl
  • -
  • cn
  • -
- - -

Application servers

- -

WebWork hot-redeployment problem with Tomcat 5.5

- - - -

Try to adjust your Tomcat context settings...

-
-
<Context docBase="${catalina.home}/webapps/YOURWEBAPP"
-         antiResourceLocking="true" antiJARLocking="true">
-...
-</Context>
-
- -

Deploying WebWork on Glassfish

- - - -

One of my co-workers was deploying a forum application that uses WebWork code. He ran into some deployment and execution issues, related to the sercurity policy. If you want to deploy WebWork apps on GlassFish, you may want to read http://blogs.sun.com/roller/page/paulsen?entry=configuring_the_security_manager_in

- -

Browser

- -

Different version of a browser co-existing together

- - - -
- - diff --git a/docs/wikidocs/Themes and Templates.html b/docs/wikidocs/Themes and Templates.html deleted file mode 100644 index db21f6cf2..000000000 --- a/docs/wikidocs/Themes and Templates.html +++ /dev/null @@ -1,44 +0,0 @@ - - - WebWork - - Themes and Templates - - - - - - - - - - -
-

At the core of the HTML Tags provided by WebWork are themes and templates. We'll first start off with a simple definition of three key terms:

- -
    -
  • tag - a small piece of code executed from within JSP, FreeMarker, or Velocity.
  • -
  • template - a bit of code, usually written in FreeMarker, that can be rendered by certain tags (HTML tags)
  • -
  • theme - a collection of templates packaged together to provide common functionality
  • -
- - -

Tags are covered in the Tags section, so we won't discuss them much here other than their relationship to themes and templates already stated. Instead, we'll focus on several important topics:

- -
    -
  • Template Loading - how templates are loaded by WebWork
  • -
  • Selecting Themes - how you can pick a theme when writing your results
  • -
  • Extending Themes - how to create your own themes based on already existing themes
  • -
  • Themes - a detailed overview of each theme included with WebWork - -
  • -
- - -
- - diff --git a/docs/wikidocs/Tiles Use.html b/docs/wikidocs/Tiles Use.html deleted file mode 100644 index 2319e9329..000000000 --- a/docs/wikidocs/Tiles Use.html +++ /dev/null @@ -1,76 +0,0 @@ - - - WebWork - - Tiles Use - - - - - - - - - - -
-

Here is a simple example of tiles use with spring's TilesConfigurer. There is really no need for spring but tiles definitions must somehow be initialized. If you do not use Spring you could use the following context listener that is exatcly how Spring configures tiles definitions:

- -
-
package com.opensymphony.webwork.views.tiles;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.apache.struts.tiles.DefinitionsFactoryConfig;
-import org.apache.struts.tiles.DefinitionsFactoryException;
-import org.apache.struts.tiles.TilesUtil;
-import org.apache.struts.tiles.xmlDefinition.I18nFactorySet;
-
-/*
-* Modified from spring's source
-*
-* here's how a smaple web xml should look like:
-* <web-app>
-*   <context-param>
-*     <param-name>tilesDefinitions</param-name>
-*     <param-value>/WEB-INF/tiles.xml</param-value>
-*   </context-param>
-*  
-*   <listener>
-*      <listener-class>com.opensymphony.webwork.views.tiles.TilesConfigurer</listener-class>
-*   </listener>
-* </web-app>
-*
-* To use the definitions specified you would use a dispatcher result (since
-* tiles jsp is just another jsp) to render tiles view.
-*/
-public class TilesConfigurer implements ServletContextListener {
-
-    private boolean initialized = false;
-   
-    public void contextInitialized (ServletContextEvent evt) {
-       
-        if (!initialized) {
-            DefinitionsFactoryConfig factoryConfig = new DefinitionsFactoryConfig();
-            factoryConfig.setFactoryClassname(I18nFactorySet.class.getName());
-            factoryConfig.setParserValidate(true);
-            factoryConfig.setDefinitionConfigFiles(evt.getServletContext().getInitParameter("tilesDefinitions"));
-            try {
-                TilesUtil.createDefinitionsFactory(evt.getServletContext(), factoryConfig);
-            } catch (DefinitionsFactoryException e) {
-                e.printStackTrace();
-            }
-            initialized = true;
-        }
-       
-    }
-
-    public void contextDestroyed (ServletContextEvent evt) {
-    }
-   
-}
-
- -
- - diff --git a/docs/wikidocs/Tiles Use_attachments/testproj-src.zip b/docs/wikidocs/Tiles Use_attachments/testproj-src.zip deleted file mode 100644 index dc855201b..000000000 Binary files a/docs/wikidocs/Tiles Use_attachments/testproj-src.zip and /dev/null differ diff --git a/docs/wikidocs/Tiles Use_attachments/war-expanded.zip b/docs/wikidocs/Tiles Use_attachments/war-expanded.zip deleted file mode 100644 index 070df6a80..000000000 Binary files a/docs/wikidocs/Tiles Use_attachments/war-expanded.zip and /dev/null differ diff --git a/docs/wikidocs/Tiles.html b/docs/wikidocs/Tiles.html deleted file mode 100644 index 324f5c8b9..000000000 --- a/docs/wikidocs/Tiles.html +++ /dev/null @@ -1,32 +0,0 @@ - - - WebWork - - Tiles - - - - - - - - - - -
-

Using Tiles with WebWork

- -
This page is under construction. Thank you for your patience.
- -

Per blogpost by Matt Raible, the idea was launched to integrate Tiles with WebWork.

- -

Several approaches are possible:

-
    -
  • Use the TilesResult
  • -
  • Use Tiles configured by Spring (example)
  • -
- - - -
- - diff --git a/docs/wikidocs/Timer Interceptor.html b/docs/wikidocs/Timer Interceptor.html deleted file mode 100644 index cdbb34e3d..000000000 --- a/docs/wikidocs/Timer Interceptor.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - Timer Interceptor - - - - - - - - - - -
-

This interceptor logs the amount of time in milliseconds. In order for this interceptor to work properly, the -logging framework must be set to at least the -INFO level. -This interceptor relies on the -Commons Logging API to report its execution-time value.

- -

Parameters

- -

TODO: Describe the paramters for this Interceptor.

- -

Extending the Interceptor

- -

TODO: Discuss some possible extension of the Interceptor.

- -

Examples

- -
-
<!-- records only the action's execution time -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="completeStack"/>
-    <interceptor-ref name="timer"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
-<!-- records action's execution time as well as other interceptors-->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="timer"/>
-    <interceptor-ref name="completeStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Token Interceptor.html b/docs/wikidocs/Token Interceptor.html deleted file mode 100644 index cffc698fe..000000000 --- a/docs/wikidocs/Token Interceptor.html +++ /dev/null @@ -1,86 +0,0 @@ - - - WebWork - - Token Interceptor - - - - - - - - - - -
- -

Ensures that only one request per token is processed. This interceptor can make sure that back buttons and double - clicks don't cause un-intended side affects. For example, you can use this to prevent careless users who might double - click on a "checkout" button at an online store. This interceptor uses a fairly primitive technique for when an - invalid token is found: it returns the result invalid.token, which can be mapped in your action configuration. - A more complex implementation, TokenSessionStoreInterceptor, can provide much better logic for when invalid - tokens are found.

- -

- -

Note: To set a token in your form, you should use the token tag. This tag is required and must be used - in the forms that submit to actions protected by this interceptor. Any request that does not provide a token (using - the token tag) will be processed as a request with an invalid token.

- -

- -

Internationalization Note: The following key could be used to internationalized the action errors generated - by this token interceptor

- -

    -
  • webwork.messages.invalid.token
  • -

- -

- -

NOTE: As this method extends off MethodFilterInterceptor, it is capable of - deciding if it is applicable only to selective methods in the action class. See - MethodFilterInterceptor for more info.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

While not very common for users to extend, this interceptor is extended by the TokenSessionStoreInterceptor. - The #handleInvalidToken and #handleValidToken methods are protected and available for more - interesting logic, such as done with the token session interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="token"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
-<-- In this case, myMethod of the action class will not 
-       get checked for invalidity of token -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="token">
-    	  <param name="excludeMethods">myMethod</param>
-    </interceptor-ref name="token"/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Token Session Interceptor.html b/docs/wikidocs/Token Session Interceptor.html deleted file mode 100644 index b752bcac7..000000000 --- a/docs/wikidocs/Token Session Interceptor.html +++ /dev/null @@ -1,69 +0,0 @@ - - - WebWork - - Token Session Interceptor - - - - - - - - - - -
- -

This interceptor builds off of the TokenInterceptor, providing advanced logic for handling invalid tokens. - Unlike the normal token interceptor, this interceptor will attempt to provide intelligent fail-over in the event of - multiple requests using the same session. That is, it will block subsequent requests until the first request is - complete, and then instead of returning the invalid.token code, it will attempt to display the same response - that the original, valid action invocation would have displayed if no multiple requests were submitted in the first - place.

- -

- -

NOTE: As this method extends off MethodFilterInterceptor, it is capable of - deciding if it is applicable only to selective methods in the action class. See - MethodFilterInterceptor for more info.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points for this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="token-session/>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
-<-- In this case, myMethod of the action class will not 
-       get checked for invalidity of token -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="token-session>
-        <param name="excludeMethods">myMethod</param>
-    </interceptor-ref name="token-session>
-    <interceptor-ref name="basicStack"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Transparent web-app I18N.html b/docs/wikidocs/Transparent web-app I18N.html deleted file mode 100644 index 4093de70a..000000000 --- a/docs/wikidocs/Transparent web-app I18N.html +++ /dev/null @@ -1,173 +0,0 @@ - - - WebWork - - Transparent web-app I18N - - - - - - - - - - -
-
As of WebWork 2.2, this interceptor is included with the normal distribution as the I18n Interceptor
- -

Consider adding transparent i18 with simple on-the-fly locale switching to your appliction via I18NInterceptor.

- -

The main idea:
-Interceptor could track locale switch requests, persist selection in current session and set locale for all (or appropriate) actions invoked.

- -
-
package neuro.util.xwork;
-
-import com.opensymphony.xwork.ActionSupport;
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.interceptor.Interceptor;
-
-import java.util.Locale;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * I18nInterceptor
- * @author Aleksei Gopachenko
- */
-public class I18nInterceptor implements Interceptor
-{
-    protected static final Log log = LogFactory.getLog(I18nInterceptor.class);
-
-    public static final String DEFAULT_SESSION_ATTRIBUTE = "WW_TRANS_I18N_LOCALE";
-    public static final String DEFAULT_PARAMETER = "request_locale";
-
-    protected String parameterName = DEFAULT_PARAMETER;
-    protected String attributeName = DEFAULT_SESSION_ATTRIBUTE;
-
-    /**
-     */
-    public I18nInterceptor()
-    {
-        if(log.isDebugEnabled()) log.debug("new I18nInterceptor()");
-    }
-
-    public void setParameterName(String parameterName) {
-        this.parameterName = parameterName;
-    }
-
-    public void setAttributeName(String attributeName) {
-        this.attributeName = attributeName;
-    }
-
-    /**
-     */
-    public void init() {
-        if(log.isDebugEnabled()) log.debug("init()");
-    }
-
-    /**
-     */
-    public void destroy() {
-        if(log.isDebugEnabled()) log.debug("destroy()");
-    }
-
-    /**
-     */
-    public String intercept(ActionInvocation invocation) throws Exception {
-        if(log.isDebugEnabled()) log.debug("intercept '"
-            +invocation.getProxy().getNamespace()+"/"
-            +invocation.getProxy().getActionName()+"' { ");
-
-        //get requested locale
-        Object requested_locale = invocation.getInvocationContext().getParameters().get(parameterName);
-        if(requested_locale!=null && requested_locale.getClass().isArray() && ((Object[])requested_locale).length==1) {
-            requested_locale=((Object[])requested_locale)[0];
-        }
-        if(log.isDebugEnabled()) log.debug("requested_locale="+requested_locale);
-        //save it in session
-        if (requested_locale!=null) {
-            Locale locale = (requested_locale instanceof Locale)? 
-              (Locale) requested_locale : localeFromString(requested_locale.toString());
-            if(log.isDebugEnabled()) log.debug("store locale="+locale);
-            if(locale!=null)invocation.getInvocationContext().getSession().put(attributeName,locale);
-        }
-        //set locale for action
-        Object locale = invocation.getInvocationContext().getSession().get(attributeName);
-        if (locale!=null && locale instanceof Locale) {
-            if(log.isDebugEnabled()) log.debug("apply locale="+locale);
-            invocation.getInvocationContext().setLocale((Locale)locale);
-        }
-
-        if(log.isDebugEnabled()) log.debug("before Locale="+((ActionSupport)invocation.getAction()).getLocale());
-        final String result = invocation.invoke();
-        if(log.isDebugEnabled()) log.debug("after Locale="+((ActionSupport)invocation.getAction()).getLocale());
-
-        if(log.isDebugEnabled()) log.debug("intercept } ");
-        return result;
-    }
-
-    Locale localeFromString(String localeStr) {
-        if ((localeStr == null) || (localeStr.trim().length() == 0) || (localeStr.equals("_"))) {
-            return Locale.getDefault();
-        }
-        int index = localeStr.indexOf('_');
-        if (index < 0) {
-            return new Locale(localeStr);
-        }
-        String language = localeStr.substring(0,index);
-        if (index == localeStr.length()) {
-            return new Locale(language);
-        }
-        localeStr = localeStr.substring(index +1);
-        index = localeStr.indexOf('_');
-        if (index < 0) {
-            return new Locale(language,localeStr);
-        }
-        String country = localeStr.substring(0,index);
-        if (index == localeStr.length()) {
-            return new Locale(language,country);
-        }
-        localeStr = localeStr.substring(index +1);
-        return new Locale(language,country,localeStr);
-    }
-
-}
-
-

Can be enabled for whole package via something like:

-
-
<interceptor name="i18n" class="neuro.util.xwork.I18nInterceptor">
-    <!-- on which request parameter we should react, optional, defaults to "request_locale" ->
-    <param name="parameterName">set_locale</param>
-    <!- under which session attribute locale should be stored, optional, defaults to "WW_TRANS_I18N_LOCALE" ->
-    <param name="attributeName">ww_locale</param>
-</interceptor>
-
-<interceptor-stack name="i18nStack">
-    <interceptor-ref name="i18n"/>
-    <interceptor-ref name="defaultStack"/>
-</interceptor-stack>
-
-<default-interceptor-ref name="i18nStack"/>
-
-

...and invoked in web-app just by adding few links to menu:

-
-
<a href="?set_locale=en">EN</a>
-<a href="?set_locale=ru">RU</a>
-<!- etc -->
-
-

Of course you still need to move all explisitly defined messages or labels to appropriate ResourceBundles and make translations. Be sure to check out your

-
    -
  • Actions - to use getText(...)
  • -
  • *-validation.xml files - to use <message key=...>
  • -
  • results/views - to use WW i18n services by <webwork:text ...> tag, or directly by evaluating getText(...) OGNL expression on current stack.
  • -
- - - -

If this Interceptor is generally useful, may be it should go into codebase?

- -
- - diff --git a/docs/wikidocs/Tutorial.html b/docs/wikidocs/Tutorial.html deleted file mode 100644 index 4723dc5b5..000000000 --- a/docs/wikidocs/Tutorial.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork - - Tutorial - - - - - - - - - - -
-
In Progress
This is a work in progress. Thank you for your patience.
- - -
    -
  1. Getting Started
  2. -
  3. Create a webapp project structure for your web application
  4. -
  5. Lesson 1: Your first Action
  6. -
  7. Lesson 2: Putting some data in your Action
  8. -
  9. Understanding results
  10. -
  11. Understanding interceptors
  12. -
  13. Understanding IoC
  14. -
  15. Understanding validation
  16. -
  17. Understanding tag libraries
  18. -
  19. Portlet Tutorial
  20. -
- - -

Extra:

-
    -
  1. Setting up Eclipse with Tomcat
  2. -
- - -

Old tutorials (these are out of date, but the concepts remain):

-
    -
  1. Lesson 1 \- Setting up webwork in a web application
  2. -
  3. Lesson 2 \- An html form with no data
  4. -
  5. Lesson 3 \- An html form with data
  6. -
  7. Lesson 4 \- An html form with data, without getters or setters
  8. -
  9. Lesson 5 - Views (JSP, Velocity, Freemarker)
  10. -
  11. Lesson 6 - Interceptors
  12. -
- - -
- - diff --git a/docs/wikidocs/TutorialLesson04-01-01.html b/docs/wikidocs/TutorialLesson04-01-01.html deleted file mode 100644 index eb94f4906..000000000 --- a/docs/wikidocs/TutorialLesson04-01-01.html +++ /dev/null @@ -1,691 +0,0 @@ - - - WebWork - - TutorialLesson04-01-01 - - - - - - - - - - -
-

Lesson 4.1.1: WebWork UI Tags

- -

In WebWork, the UI tags wrap generic HTML controls while providing tight integration with the core framework. The tags have been designed to minimize the amount of logic in compiled code and delegate the actual rendering of HTML to a template system. The UI tags attempt to cover the most common scenarios, while providing a Component Tag for creating custom components. The UI tags also provide built-in support for displaying inline error messages.

- -

This lesson tries to explain how to take advantage of the UI tags to build forms and other graphical controls and, by explaining how the template system works, teaches you how to change the look of existing components and create your own UI components.

- - -

Building forms:

- -

WebWork comes with ready-to-use tags to construct forms. Some of these tags relate directly to HTML tags that are used to make forms and you probably can figure them out by their names: <ww:checkbox />, <ww:file />, <ww:form />, <ww:hidden />, <ww:label />, <ww:password />, <ww:radio />, <ww:select />, <ww:submit />, <ww:textarea /> and <ww:textfield />.

- -

To build forms with these tags, place them in your page as you would do with the HTML tags. The only difference is that the parameters should be enclosed in double quotes and single quotes (key="'value'"). That's because names that are not single-quoted are evaluated against the Value Stack.

- -

Let's check out an example:

- -

ex01-index.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %>
-<html>
-<head>
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 1</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<style type="text/css">
-	.errorMessage { color: red; }
-</style>
-</head>
-
-<body>
-
-<p>UI Form Tags Example:</p>
-
-<ww:form action="'formProcessing.action'" method="'post'">
-	<ww:checkbox name="'checkbox'" label="'A checkbox'" fieldValue="'checkbox_value'" />
-	<ww:file name="'file'" label="'A file field'" />
-	<ww:hidden name="'hidden'" value="'hidden_value'" />
-	<ww:label label="'A label'" />
-	<ww:password name="'password'" label="'A password field'" />
-	<ww:radio name="'radio'" label="'Radio buttons'" list="{'One', 'Two', 'Three'}" />
-	<ww:select name="'select'" label="'A select list'" list="{'One', 'Two', 'Three'}" 
-		emptyOption="true" />
-	<ww:textarea name="'textarea'" label="'A text area'" rows="'3'" cols="'40'" />
-	<ww:textfield name="'textfield'" label="'A text field'" />
-	<ww:submit value="'Send Form'" />
-</ww:form>
-
-</body>
-</html>
-
- -

HTML result after processing ex01-index.jsp:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 1</title>
-<style type="text/css"> 
-  .errorMessage { color: red; } 
-</style>   
-</head> 
-
-<body> 
-
-<p>UI Form Tags Example:</p> 
-
-<table> 
-<form 
-action="formProcessing.action" method="post" > 
-
-   
-
-
-<tr> 
-<td valign="top" colspan="2"> 
-
-<table width="100%" border="0" cellpadding="0" cellspacing="0"> 
-<tr><td valign="top"> 
-<input type="checkbox" 
-name="checkbox" 
-value="checkbox_value" 
-/> 
-</td> 
-<td width="100%" valign="top"> 
-<span class="checkboxLabel"> 
-A checkbox 
-</span> 
-</td> 
-</tr> 
-</table> 
-</td> 
-</tr> 
-
-   
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-A file field: 
-</span> 
-</td> 
-
-<td> 
-
-<input type="file" 
-name="file" 
-/> 
-
-</td> 
-</tr> 
-
-  <input 
-type="hidden" 
-name="hidden" value="hidden_value" /> 
-   
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-A label: 
-</span> 
-</td> 
-
-<td> 
-<label> </label> 
-</td> 
-</tr> 
-
-   
-
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-A password field: 
-</span> 
-</td> 
-
-<td> 
-
-<input type="password" 
-name="password" 
-
-
-/> 
-
-</td> 
-</tr> 
-
-   
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-Radio buttons: 
-</span> 
-</td> 
-
-<td> 
-
-
-
-
-
-<input 
-type="radio" 
-name="radio" 
-id="radioOne" 
-value="One" /> 
-<label for="radioOne">One</label> 
-
-
-
-
-
-<input 
-type="radio" 
-name="radio" 
-id="radioTwo" 
-value="Two" /> 
-<label for="radioTwo">Two</label> 
-
-
-
-
-
-<input 
-type="radio" 
-name="radio" 
-id="radioThree" 
-value="Three" /> 
-<label for="radioThree">Three</label> 
-
-
-</td> 
-</tr> 
-
-   
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-A select list: 
-</span> 
-</td> 
-
-<td> 
-
-<select name="select" 
-> 
-
-
-<option value=""></option> 
-
-
-
-
-
-<option value="One" 
->One</option> 
-
-
-
-
-
-<option value="Two" 
->Two</option> 
-
-
-
-
-
-<option value="Three" 
->Three</option> 
-
-
-</select> 
-
-</td> 
-</tr> 
-
-   
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-A text area: 
-</span> 
-</td> 
-
-<td> 
-
-<textarea name="textarea" 
-cols="40" 
-rows="3" 
-></textarea> 
-
-</td> 
-</tr> 
-
-   
-
-
-
-<tr> 
-<td align="right" valign="top"> 
-
-<span class="label"> 
-
-A text field: 
-</span> 
-</td> 
-
-<td> 
-
-<input type="text" 
-name="textfield" 
-/> 
-
-</td> 
-</tr> 
-
-  <tr> 
-<td colspan="2"><div 
-align="right" ><input 
-type="submit" 
-value="Send Form" /></div> 
-</td> 
-</tr> 
-
-</form> 
-</table> 
-
-
-</body> 
-</html>
-
- -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<action name="formProcessing" class="lesson04_01_01.FormProcessingAction">
-			<result name="input" type="dispatcher">ex01-index.jsp</result>
-			<result name="success" type="dispatcher">ex01-success.jsp</result>
-			<interceptor-ref name="validationWorkflowStack" />
-		</action>
-	</package>
-</xwork>
-
- -

FormProcessingAction.java:

-
-
package lesson04_01_01;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class FormProcessingAction extends ActionSupport {
-	private String checkbox;
-	private String file;
-	private String hidden;
-	private String password;
-	private String radio;
-	private String select;
-	private String textarea;
-	private String textfield;
-	
-	public String getCheckbox() { return checkbox; }
-	public String getFile() { return file; }
-	public String getHidden() { return hidden; }
-	public String getPassword() { return password; }
-	public String getRadio() { return radio; }
-	public String getSelect() { return select; }
-	public String getTextarea() { return textarea; }
-	public String getTextfield() { return textfield; }
-	
-	public void setCheckbox(String checkbox) { this.checkbox = checkbox; }
-	public void setFile(String file) { this.file = file; }
-	public void setHidden(String hidden) { this.hidden = hidden; }
-	public void setPassword(String password) { this.password = password; }
-	public void setRadio(String radio) { this.radio = radio; }
-	public void setSelect(String select) { this.select = select; }
-	public void setTextarea(String textarea) { this.textarea = textarea; }
-	public void setTextfield(String textfield) { this.textfield = textfield; }
-	
-	public String execute() throws Exception {
-		return SUCCESS;
-	}
-}
-
- -

FormProcessingAction-validation.xml:

-
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
-"http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
-
-<validators>
-  <field name="checkbox">
-    <field-validator type="requiredstring">
-      <message>Please, check the checkbox.</message>
-    </field-validator>
-  </field>
-
-  <field name="file">
-    <field-validator type="requiredstring">
-      <message>Please select a file.</message>
-    </field-validator>
-  </field>
-
-  <field name="password">
-    <field-validator type="requiredstring">
-      <message>Please type something in the password field.</message>
-    </field-validator>
-  </field>
-
-  <field name="radio">
-    <field-validator type="requiredstring">
-      <message>Please select a radio button.</message>
-    </field-validator>
-  </field>
-
-  <field name="select">
-    <field-validator type="requiredstring">
-      <message>Please select an option from the list.</message>
-    </field-validator>
-  </field>
-
-  <field name="textarea">
-    <field-validator type="requiredstring">
-      <message>Please type something in the text area.</message>
-    </field-validator>
-  </field>
-
-  <field name="textfield">
-    <field-validator type="requiredstring">
-      <message>Please type something in the text field.</message>
-    </field-validator>
-  </field>
-</validators>
-
- -

ex01-success.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %>
-<html>
-<head>
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 1</title>
-</head>
-
-<body>
-
-<p>UI Form Tags Example result:</p>
-
-<ul>
-  <li>checkbox: <ww:property value="checkbox" /></li>
-  <li>file: <ww:property value="file" /></li>
-  <li>hidden: <ww:property value="hidden" /></li>
-  <li>password: <ww:property value="password" /></li>
-  <li>radio: <ww:property value="radio" /></li>
-  <li>select: <ww:property value="select" /></li>
-  <li>textarea: <ww:property value="textarea" /></li>
-  <li>textfield: <ww:property value="textfield" /></li>
-</ul>
-
-</body>
-</html>
-
- -

Notice how much cleaner ex01-index.jsp is, compared to its HTML result. The default layout of the form components is a table layout, with the label on the left column and the field to the right. You can learn how to create your own layouts when we explain the template system, below.

- -

Another thing to notice is the reference to the validationWorkflowStack in the action's configuration. This makes WebWork validate the parameters that are sent to our actions according to a configuration file we place in the same location as the action class – in our case, FormProcessingAction-validation.xml (see Validation). In case something is not valid, it prevents the action from executing and dispatches the request to the input result with error messages attached to each field (using the method addFieldError(String fieldName, String errorMessage)).

- -

But don't worry about how the validation framework works for now. Run the example and try leaving some fields blank. You will see that the UI tags provide error messages that integrate with the validation framework and that's what we want do demonstrate here. This separation of concerns can help programmers and designers concentrate more on their part of the work.

- -

Try the example!

- - -

Other UI Controls:

- -

Besides the standard form controls that HTML designers are already familiar with, WebWork provides some other controls and also the ability to create a custom control. Let's take a look at the custom controls that are already provided by WebWork:

- - - - - - - - - - - - - - - - - - -
<ww:checkboxlist />Works just like the <ww:radio /> tag, but with check boxes instead of radio buttons. It gets the keys and values from a collection and creates a list of checkboxes, all with the same name.
<ww:combobox />Simulates a combo box, which is a control that mixes a selection list with a text field. It does this by placing a text field with a <select /> list right below it and a JavaScript code that fills the text field with the selection of the list every time it changes.
<ww:tabbedpane />Help needed here.
<ww:token />Help needed here.
- -

The Template System:

- -

WebWork uses the Velocity template system to render the actual HTML output for all UI tags. A default implementation of all templates has been included with the core distribution allowing users to use WebWork's UI tags "out of the box". Templates can be edited individually or replaced entirely allowing for complete customization of the resulting HTML output. In addition, the default template can be overridden on a per tag basis allowing for a very fine level of control. The default templates are located in the webwork-2.1.1.jar file under /template/xhtml.

- -

If you unpack webwork-2.1.1.jar and look under the /template/xhtml directory you will see a bunch of velocity templates. Most of them correspond to a specific UI Tag, and those have the name of the tag they render. If you're familiar with Velocity, I recommend you analyse the template files to see what you're capable of doing with them. Since version 2.1, there's also a /template/simple directory, which is a simpler version of the HTML form controls (just the control, no table or label).

- -

If you want do display your UI components in a different layout than the one that comes with WebWork, you can:

- -
    -
  • Edit and replace the files in /template/xhtml (repack the JAR or create the same directory structure somewhere else and make sure your container looks that path before the JAR);
  • -
- - -
    -
  • Change the location of the templates by editing the webwork.ui.theme property in webwork.properties (file that should be placed in the root of your classpath);
  • -
- - -
    -
  • Specifying the location of the templates for each tag individually using the theme or the template property. The former allows you to specify the directory where all templates are (thus, WebWork looks for templates with the same name as the ones in /template/xhtml), while the latter allows you to indicate the exact template to be used for that component.
  • -
- - -

Read more: Themes and Templates

- -

The third approach is demonstrated in the example below. Note that, by default, the specified theme directory should be under /template and the specified template file should be under /template/xhtml.

- -

ex02.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %> 
-<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 2</title> 
-</head> 
-
-<body> 
-
-<p>Template Change Example:</p> 
-
-<p><ww:checkbox name="'checkbox'" label="'A checkbox'" fieldValue="'checkbox_value'" theme="'mytheme'" /></p> 
-
-<p><ww:textfield name="'textfield'" label="'A text field'" template="mytextfield.vm" /></p> 
-
-</body> 
-</html>
-
- -

/template/mytheme/checkbox.vm:

-
-
<div align="center"> 
-	<input type="checkbox" 
-		name="$!webwork.htmlEncode($parameters.name)" 
-		value="$!webwork.htmlEncode($parameters.fieldValue)" 
-	#if ($parameters.nameValue) checked="checked" #end 
-	#if ($parameters.disabled == true) disabled="disabled" #end 
-	#if ($parameters.tabindex) tabindex="$!webwork.htmlEncode($parameters.tabindex)" #end 
-	#if ($parameters.onchange) onchange="$!webwork.htmlEncode($parameters.onchange)" #end 
-	#if ($parameters.id) id="$!webwork.htmlEncode($parameters.id)" #end 
-	/><br /> 
-	$!webwork.htmlEncode($parameters.label) 
-</div>
-
- -

/template/xhtml/mytextfield.vm:

-
-
<div align="center"> 
-	<input type="text" 
-		name="$!webwork.htmlEncode($parameters.name)" 
-	#if ($parameters.size) size="$!webwork.htmlEncode($parameters.size)" #end 
-	#if ($parameters.maxlength) maxlength="$!webwork.htmlEncode($parameters.maxlength)" #end 
-	#if ($parameters.nameValue) value="$!webwork.htmlEncode($parameters.nameValue)" #end 
-	#if ($parameters.disabled == true) disabled="disabled" #end 
-	#if ($parameters.readonly) readonly="readonly" #end 
-	#if ($parameters.onkeyup) onkeyup="$!webwork.htmlEncode($parameters.onkeyup)" #end 
-	#if ($parameters.tabindex) tabindex="$!webwork.htmlEncode($parameters.tabindex)" #end 
-	#if ($parameters.onchange) onchange="$!webwork.htmlEncode($parameters.onchange)" #end 
-	#if ($parameters.id) id="$!webwork.htmlEncode($parameters.id)" #end 
-	/><br /> 
-	$!webwork.htmlEncode($parameters.label) 
-</div>
-
- -

HTML result after processing ex02.jsp:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 2</title> 
-</head> 
-
-<body> 
-
-<p>Template Change Example:</p> 
-
-<p><div align="center"> 
-  <input type="checkbox" 
-         name="checkbox" 
-         value="checkbox_value" 
-            /><br /> 
-  A checkbox 
-</div></p> 
-
-<p><div align="center"> 
-  <input type="text" 
-                                     name="textfield" 
-                    /><br /> 
-  A text field 
-</div></p> 
-
-</body> 
-</html>
-
- -

Try the example!

- - -

Building Customized UI Components:

- -

There are some situations in which none of the UI Components that come bundled with WebWork fit your requirements. In this case, the recommended approach would be to create your own custom component. In this way, you keep your web page clean of layout and error-checking issues and also promote component reuse.

- -

To create a custom component, just create a Velocity template for it, just like the ones that already exist. To place it in a web page, use the <ww:component /> tag and specify the location of the template in its template parameter.

- -

To pass parameters to be used by your template, use the <ww:param /> tag (see lesson 4.1). The example below demonstrates the creation of a custom date field.

- -

ex03.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %> 
-<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 3</title> 
-</head> 
-
-<body> 
-<p>Custom Component Example:</p> 
-
-<p> 
-<ww:component template="datefield.vm"> 
-	<ww:param name="'label'" value="'Date'" /> 
-	<ww:param name="'name'" value="'mydatefield'" /> 
-	<ww:param name="'size'" value="3" /> 
-</ww:component> 
-</p> 
-
-</body> 
-</html>
-
- -

/template/xhtml/datefield.vm:

-
-
#set ($name = $parameters.get('name')) 
-#set ($size = $parameters.get('size')) 
-#set ($yearSize = $size * 2) 
-
-$parameters.get('label'): 
-<input type="text" name="${name}.day" size="$size" /> / 
-<input type="text" name="${name}.month" size="$size" /> / 
-<input type="text" name="${name}.year" size="$yearSize" /> (dd/mm/yyyy)
-
- -

HTML result after processing ex03.jsp:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.1.1 - Example 3</title> 
-</head> 
-<body> 
-<p>Custom Component Example:</p> 
-
-<p> 
-Date: 
-<input type="text" name="mydatefield.day" size="3" /> / 
-<input type="text" name="mydatefield.month" size="3" /> / 
-<input type="text" name="mydatefield.year" size="6" /> (dd/mm/yyyy) 
-</p> 
-
-</body> 
-</html>
-
- -

Try the example!

- -
- -

Previous Lesson | Next Lesson

- - -
- - diff --git a/docs/wikidocs/TutorialLesson04-01.html b/docs/wikidocs/TutorialLesson04-01.html deleted file mode 100644 index 440ace645..000000000 --- a/docs/wikidocs/TutorialLesson04-01.html +++ /dev/null @@ -1,221 +0,0 @@ - - - WebWork - - TutorialLesson04-01 - - - - - - - - - - -
-

Lesson 4.1: Using JSP as the View

- -

When using JSP to render the views, you can choose to access the action's data using scriptlets or tags. Tags are the recommended approach.

- - -

Accessing Action Data through Scriplets:

- -

Action data can be accessed through an object called Value Stack. The example below does the same thing as the result page of lesson 3's second example (Supplying Data to the Action), but using scriptlets:

- -
-
<%@ page import="com.opensymphony.xwork.util.OgnlValueStack" %>
-<html>
-<head>
-<title>WebWork Tutorial - Lesson 4.1 - Lesson 3's example modified</title>
-</head>
-<body>
-
-<%
-OgnlValueStack stack = (OgnlValueStack)request.getAttribute("webwork.valueStack");
-out.write("Hello, " + stack.findValue("person"));
-%>
-
-</body>
-</html>
-
- -

WebWork tags, however, are recommended over scriptlets. For instance, <ww:property /> tags do exactly what the scriptlet above does, with a cleaner syntax and also handles the case where the Value Stack doesn't exist.

- - -

WebWork Tag Library:

- -

We've already showed in lesson 3's example how to access an action's property using tags. This section describes and exemplifies the use of the WebWork Tag Library, which can be divided in seven categories:

- -
    -
  • Common tags: the most frequently used, basic tags;
  • -
  • Componentisation tags: foster componentisation within your views;
  • -
  • Flow control tags: govern the flow of control within the JSP page;
  • -
  • Iteration tags: iterate over elements and manipulate iterable objects;
  • -
  • UI tags: generate HTML form fields and controls;
  • -
  • VUI tags: volunteers needed to write this part;
  • -
  • Internationalisation tags: internationalise your views.
  • -
- - - -

Common tags

- - - - - - - - - - - - - - - - - - - - - - -
<ww:property />Gets the value of a result attribute. If the value isn't given, the top of the stack will be returned.
<ww:push />Pushes a value onto the Value Stack.
<ww:param />Sets a parent tag's parameter. This tag is used only inside another tag to set the value of some property of the parent tag.
<ww:set />Sets the value of an object in the Value Stack 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 "webwork" is used.
<ww:url />Builds an encoded URL.
- -
-
EXAMPLE NEEDED.
-
- -

Componentisation tags

- - - - - - - - - - - - - - -
<ww:action />Executes an Action from within the context of a taglib. The body of the tag is used to display the results of the action invocation.
<ww:bean />Creates a JavaBean, instantiate its properties and place it in the ActionContext for later use.
<ww:include />Includes another page or action.
- -
-
EXAMPLE NEEDED.
-
- - -

Flow control tags

- -

This if-else set of tags works just like if-else scriptlets.

- - - - - - - - - - - - - - -
<ww:if />Conditional execution path. That is, evaluates the tag body if a boolean expression is true.
<ww:else />Negative execution path for the if tag. That is, if the preceeding conditional tag's boolean expression evaluated to false, then evaluate this tag's body.
<ww:elseif />Negative conditional execution path for the if tag. That is, if the preceeding conditional tag's boolean expression evaluated to false and if this tag's boolean expression evaluates to true, then evaluate this tag's body.
- -
-
EXAMPLE NEEDED.
-
- - -

Iteration tags

- - - - - - - - - - - - - - - - - - - - - - - - - - -
<ww:iterator />Iterates over a collection.
<ww:generator />Generates iterators.
<ww:append />Appends several iterators.
<ww:subset />Gets a subset of an iterator.
<ww:merge />Merges several iterators into one.
<ww:sort />Sorts an iterator.
- -
-
EXAMPLE NEEDED.
-
- -

UI tags

- -

The UI tags wrap generic HTML controls while providing tight integration with the core framework. The tags have been designed to minimize the amount of logic in compiled code and delegate the actual rendering of HTML to a template system. The UI tags attempt to cover the most common scenarios, while providing a Component Tag for creating custom components. The UI tags also provide built-in support for displaying inline error messages.

- -

There is a separate lesson about WebWork UI Tags which explains in detail how they work, how you could cusomize their appearance through the use of templates, how to create custom components, etc.

- -

Go to WebWork UI Tags Lesson.

- - -

VUI(Voice UI) tags

- - - - - - - - - - - - - - - - - -
<ww:audio />???
<ww:prompt />???
<ww:filled />???
<ww:log />???
- -

Volunteers needed to write this part.

- - -

Internationalisation tags

- - - - - - - - - - -
<ww:text />Prints out an internationalized string.
<ww:i18n />Places a resource bundle on the Value Stack, for access by the text tag.
- -
- -

Previous Lesson | Next Lesson

- - -
- - diff --git a/docs/wikidocs/TutorialLesson04-02.html b/docs/wikidocs/TutorialLesson04-02.html deleted file mode 100644 index 1594d99f0..000000000 --- a/docs/wikidocs/TutorialLesson04-02.html +++ /dev/null @@ -1,400 +0,0 @@ - - - WebWork - - TutorialLesson04-02 - - - - - - - - - - -
-

Lesson 4.2: Using Velocity with WebWork

- -

There are two ways of using Velocity as the view.

- -
    -
  • Using the velocity result-type to render velocity templates;
  • -
  • Registering WebWorkVelocityServlet in your web.xml file to render Velocity templates accessed directly through browser requests.
  • -
- - -

To use the second approach, we have to modify web.xml and add a servlet and a servlet mapping for WebWorkVelocityServlet, as demonstrated below:

- -
-
<servlet> 
-	<servlet-name>velocity</servlet-name> 
-	<servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class> 
-	<load-on-startup>1</load-on-startup> 
-</servlet> 
-
-<servlet-mapping> 
-	<servlet-name>velocity</servlet-name> 
-	<url-pattern>*.vm</url-pattern> 
-</servlet-mapping>
-
- -

Read more: xwork.xml

- -

Using velocity result-type means that Velocity templates can only be rendered through an action, i.e., request to .vm pages will not render the file and it will be returned as plain text. If you choose this approach, it's recommended that you place your Velocity files under WEB-INF so they become unaccessible.

- -

Using WebWorkVelocityServlet means that Velocity templates can be rendered through requests to .vm pages. That also means that you should implement security checks in your templates so an user doesn't access it directly witout going through an action first (if that is required).

- -

No matter which approach you choose (and you can choose to use both at the same time), not only all the features from Velocity are available to you when you're writing templates, but also some other functionalities, specific of WebWork, are available. It is supposed that you are already familiar with Velocity, so we will focus only in the WebWork-specific features. If that's not the case, please get started with Velocity before continuing.

- -

The main feature of it is to provide easy access to objects that are on the Value Stack, which contains some things that WebWork provides to you automatically, because you may find them useful at some point. These are some of the things that are available in the value stack:

- -
    -
  • The current HttpServletRequest;
  • -
  • The current HttpServletResponse;
  • -
  • The current OgnlValueStack;
  • -
  • An instance of OgnlTool;
  • -
  • All the properties of the current action class.
  • -
- - -

To access the objects in the value stack, all you have to do is use appropriate Velocity references:

- -
    -
  • $req = HttpServletRequest;
  • -
  • $res = HttpServletResponse;
  • -
  • $stack = OgnlValueStack;
  • -
  • $ognl = OgnlTool;
  • -
  • $name-of-property = property of the current action class.
  • -
- - -

The example below does the same thing as the Hello example from lesson 3, but now, using a Velocity template as the result. Notice that the <property value="person" /> tag was replaced by the $person reference, which returns the same thing: a property from the action class. In this example we chose to use the velocity result-type approach.

- -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<!-- Default interceptor stack. --> 
-		<default-interceptor-ref name="defaultStack" /> 
-		
-		<!-- Action: Lesson 4.2: HelloAction using Velocity as result. -->
-		<action name="helloVelocity" class="lesson03.HelloAction">
-			<result name="error" type="dispatcher">ex01-index.jsp</result>
-			<result name="success" type="velocity">ex01-success.vm</result>
-		</action>
-	</package>
-</xwork>
-
- -

HelloAction.java (same as lesson 3):

-
-
package lesson03;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class HelloAction extends ActionSupport {
-	String person;
-	public String getPerson() {
-		return person;
-	}
-	public void setPerson(String person) {
-		this.person = person;
-	}
-	public String execute() throws Exception {
-		if ((person == null) || (person.length() == 0)) return ERROR;
-		else return SUCCESS;
-	}
-}
-
- -

ex01-index.jsp (same as lesson 3):

-
-
<html>
-<head>
-<title>WebWork Tutorial - Lesson 3 - Example 2</title>
-</head>
-
-<body>
-
-<p>What's your name?</p>
-
-<form action="helloVelocity.action" method="post">
-<p><input type="text" name="person" /><input type="submit" /></p>
-</form>
-
-</body>
-</html>
-
- -

ex01-success.vm:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.2 - Example 1</title> 
-</head> 
-<body> 
-
-Hello, $person 
-
-</body> 
-</html>
-
- -

Try the example!

- - -

Using WebWork Tags from Velocity:

- -

As you already know, when you switch from JSP to Velocity you lose the ability of using JSP Tags. But WebWork's Velocity Servlet provides a way of doing this through the use of #tag, #bodytag and #param velocimacros. The general syntax is:

- -
-
#tag (name-of-tag list-of-attributes)
-
- -

– or –

- -
-
#bodytag (name-of-tag list-of-attributes)
-	#param (key value)
-	#param (key value)
-...
-#end
-
- -

Let's revisit lesson 4.1.1's form example to demonstrate the usage of the UI tags from velocity:

- -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<!-- Default interceptor stack. --> 
-		<default-interceptor-ref name="defaultStack" /> 
-		
-		<!-- Actions: Lesson 4.2: FormProcessingAction using Velocity. --> 
-		<action name="formProcessingVelocityIndex" class="lesson04_02.FormProcessingIndexAction">
-			<result name="success" type="velocity">ex02-index.vm</result>
-		</action>
-		<action name="formProcessingVelocity" class="lesson04_01_01.FormProcessingAction"> 
-			<result name="input" type="velocity">ex02-index.vm</result> 
-			<result name="success" type="velocity">ex02-success.vm</result> 
-			<interceptor-ref name="validationWorkflowStack" /> 
-		</action> 
-	</package>
-</xwork>
-
- -

ex02-index.vm:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.2 - Example 2</title> 
-<style type="text/css"> 
-  .errorMessage { color: red; } 
-</style>   
-</head> 
-
-<body> 
-
-<p>UI Form Tags Example using Velocity:</p> 
-
-#bodytag (Form "action='formProcessingVelocity.action'" "method='post'") 
-	#tag (Checkbox "name='checkbox'" "label='A checkbox'" "fieldValue='checkbox_value'") 
-	#tag (File "name='file'" "label='A file field'") 
-	#tag (Hidden "name='hidden'" "value='hidden_value'") 
-	#tag (Label "label='A label'") 
-	#tag (Password "name='password'" "label='A password field'") 
-	#tag (Radio "name='radio'" "label='Radio buttons'" "list={'One', 'Two', 'Three'}") 
-	#tag (Select "name='select'" "label='A select list'" "list={'One', 'Two', 'Three'}" 
-		"emptyOption=true") 
-	#tag (Textarea "name='textarea'" "label='A text area'" "rows='3'" "cols='40'") 
-	#tag (TextField "name='textfield'" "label='A text field'") 
-	#tag (Submit "value='Send Form'") 
-#end 
-
-</body> 
-</html>
-
- -

ex02-success.vm:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial Lesson 4.2 - Example 2</title> 
-</head> 
-
-<body> 
-
-<p>UI Form Tags Example result using Velocity:</p> 
-
-<ul> 
-	<li>checkbox: $!checkbox</li> 
-	<li>file: $!file</li> 
-	<li>hidden: $!hidden</li> 
-	<li>password: $!password</li> 
-	<li>radio: $!radio</li> 
-	<li>select: $!select</li> 
-	<li>textarea: $!textarea</li> 
-	<li>textfield: $!textfield</li> 
-</ul> 
-
-</body> 
-</html>
-
- -

FormProcessingAction.java (same as lesson 4.1.1):

-
-
package lesson04_01_01;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class FormProcessingAction extends ActionSupport {
-	private String checkbox;
-	private String file;
-	private String hidden;
-	private String password;
-	private String radio;
-	private String select;
-	private String textarea;
-	private String textfield;
-	
-	public String getCheckbox() { return checkbox; }
-	public String getFile() { return file; }
-	public String getHidden() { return hidden; }
-	public String getPassword() { return password; }
-	public String getRadio() { return radio; }
-	public String getSelect() { return select; }
-	public String getTextarea() { return textarea; }
-	public String getTextfield() { return textfield; }
-	
-	public void setCheckbox(String checkbox) { this.checkbox = checkbox; }
-	public void setFile(String file) { this.file = file; }
-	public void setHidden(String hidden) { this.hidden = hidden; }
-	public void setPassword(String password) { this.password = password; }
-	public void setRadio(String radio) { this.radio = radio; }
-	public void setSelect(String select) { this.select = select; }
-	public void setTextarea(String textarea) { this.textarea = textarea; }
-	public void setTextfield(String textfield) { this.textfield = textfield; }
-	
-	public String execute() throws Exception {
-		return SUCCESS;
-	}
-}
-
- -

FormProcessingAction-validation.xml (same as lesson 4.1.1):

-
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 
-1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
-
-<validators>
-  <field name="checkbox">
-    <field-validator type="requiredstring">
-      <message>Please, check the checkbox.</message>
-    </field-validator>
-  </field>
-
-  <field name="file">
-    <field-validator type="requiredstring">
-      <message>Please select a file.</message>
-    </field-validator>
-  </field>
-
-  <field name="password">
-    <field-validator type="requiredstring">
-      <message>Please type something in the password field.</message>
-    </field-validator>
-  </field>
-
-  <field name="radio">
-    <field-validator type="requiredstring">
-      <message>Please select a radio button.</message>
-    </field-validator>
-  </field>
-
-  <field name="select">
-    <field-validator type="requiredstring">
-      <message>Please select an option from the list.</message>
-    </field-validator>
-  </field>
-
-  <field name="textarea">
-    <field-validator type="requiredstring">
-      <message>Please type something in the text area.</message>
-    </field-validator>
-  </field>
-
-  <field name="textfield">
-    <field-validator type="requiredstring">
-      <message>Please type something in the text field.</message>
-    </field-validator>
-  </field>
-</validators>
-
- -

Try the example!

- -

- -

The example above does not use the #param tag. So, let's revisit another example from lesson 4.1.1 - custom components:

- -

ex03.vm:

-
-
<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.2 - Example 3</title> 
-</head> 
-
-<body> 
-
-<p>Custom Component Example:</p> 
-
-<p> 
-#bodytag (Component "template=datefield.vm") 
-	#param ("label" "Date") 
-	#param ("name" "mydatefield") 
-	#param ("size" "3") 
-#end 
-</p> 
-
-</body> 
-</html>
-
- -

/template/xhtml/datefield.vm (same as lesson 4.1.1):

-
-
#set ($name = $parameters.get('name')) 
-#set ($size = $parameters.get('size')) 
-#set ($yearSize = $size * 2) 
-
-$parameters.get('label'): 
-<input type="text" name="${name}.day" size="$size" /> / 
-<input type="text" name="${name}.month" size="$size" /> / 
-<input type="text" name="${name}.year" size="$yearSize" /> (dd/mm/yyyy)
-
- -

Notice that, this time, we did not enclose Date and mydatefield with single quotes, as we had to do when we used the JSP tag.

- -

Try the example!

- -
- -

Previous Lesson | Next Lesson

- - -
- - diff --git a/docs/wikidocs/TutorialLesson04-03.html b/docs/wikidocs/TutorialLesson04-03.html deleted file mode 100644 index b214aafc6..000000000 --- a/docs/wikidocs/TutorialLesson04-03.html +++ /dev/null @@ -1,203 +0,0 @@ - - - WebWork - - TutorialLesson04-03 - - - - - - - - - - -
-

Lesson 4.3: Using Freemarker with WebWork

- -

Freemarker is a powerfull template engine that competes with Velocity. You can learn more about it in the project's homepage: http://freemarker.sourceforge.net.

- -

First of all, to use Freemarker with Webwork, you have to place the freemarker.jar in your WEB-INF\lib folder. You can download the distribution here.

- -

After that, just configure web.xml and start writing your templates, as explained below.

- - -

web.xml:

- -

To use Freemarker as the view, you need to modify web.xml and add a servlet and a servlet mapping for FreemarkerServlet, as demonstrated below:

- -
-
<servlet>
-	<servlet-name>freemarker</servlet-name>
-	<servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>
-		<!-- FreemarkerServlet settings: -->
-		<init-param>
-			<param-name>TemplatePath</param-name>
-			<param-value>/</param-value>
-		</init-param>
-		<init-param>
-			<param-name>NoCache</param-name>
-			<param-value>true</param-value>
-		</init-param>
-		<init-param>
-			<param-name>ContentType</param-name>
-			<param-value>text/html</param-value>
-		</init-param>
-		<init-param>
-			<param-name>default_encoding</param-name>
-			<param-value>ISO-8859-1</param-value>
-		</init-param>
-		<init-param>
-			<param-name>number_format</param-name>
-			<param-value>0.##########</param-value>
-		</init-param>
-	<load-on-startup>1</load-on-startup>
-</servlet>
-
-<servlet-mapping> 
-	<servlet-name>freemarker</servlet-name> 
-	<url-pattern>*.ftl</url-pattern> 
-</servlet-mapping>
-
- -

The configuration above means that Freemarker templates can be rendered through requests to .ftl pages. That also means that you should implement security checks in your templates so an user doesn't access it directly without going through an action first (if that is required). But you can always place your Freemarker files under WEB-INF so they become unaccessible to direct requests. We will use the latter approach in our examples.

- -

Inside a Freemarker template, you will have access to every object managed by WebWork with the following syntax:

- -
    -
  • $stack = OgnlValueStack;
  • -
  • $webwork = FreemarkerWebWorkUtil, a toolbox providing services like formatting url, accessing the value stack, etc;
  • -
  • $name-of-property = property retrieved from the value stack. If that fails, it looks up an attribute with that name in the HttpServletRequest, HttpSession and ServletContext, in that order;
  • -
  • $Request = HttpServletRequest;
  • -
  • $Session = HttpServletResponse;
  • -
  • $Application = OgnlValueStack.
  • -
- - -

The example below does the same thing as example 2 from lesson 3, but now, using Freemarker templates.

- - -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<!-- Default interceptor stack. --> 
-		<default-interceptor-ref name="defaultStack" /> 
-		
-		<!-- Action: Lesson 4.3: HelloAction. -->
-		<action name="indexFreemarker" class="com.opensymphony.xwork.ActionSupport">
-			<result name="success" type="dispatcher">/WEB-INF/ftl/lesson3/index.ftl</result>
-		</action>
-
-		<action name="helloFreemarker" class="lesson03.HelloAction">
-			<result name="error" type="dispatcher">/WEB-INF/ftl/lesson3/index.ftl</result>
-			<result name="success" type="dispatcher">/WEB-INF/ftl/lesson3/success.ftl</result>
-		</action>
-	</package>
-</xwork>
-
- - -

HelloAction.java (same as lesson 3):

-
-
package lesson03;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class HelloAction extends ActionSupport {
-	String person;
-	public String getPerson() {
-		return person;
-	}
-	public void setPerson(String person) {
-		this.person = person;
-	}
-	public String execute() throws Exception {
-		if ((person == null) || (person.length() == 0)) return ERROR;
-		else return SUCCESS;
-	}
-}
-
- - -

ex02-index.ftl

-
-
<#assign ww=JspTaglibs["/WEB-INF/lib/webwork.tld"] />
-
-<html>
-<head>
-<title>WebWork Tutorial - Lesson 4.3 - Example 1</title>
-</head>
-
-<body>
-
-<p>Click <a href="${wwUtil.buildUrl('indexFreemarker.action')}">here</a> to reload this page.</p>
-
-<@ww.form name="'nameForm'" action="'helloFreemarker.action'" method="'POST'">
-	<@ww.textfield label="'What is your name ?'" name="'person'" value="person" size="20"/>
-	<@ww.submit name="'submit'" value="'Submit'"/>
-</@ww.form>
-
-</body>
-</html>
-
- -

If you don't want to use WebWork's UI Tags, you could do it like this:

- -

ex02-index-notags.ftl

-
-
<html>
-<head>
-<title>WebWork Tutorial - Lesson 4.3 - Example 1</title>
-</head>
-
-<body>
-
-<p>Click <a href="${wwUtil.buildUrl('indexFreemarker.action')}">here</a> to reload this page.</p>
-
-<form name="nameForm" action="${wwUtil.buildUrl('helloFreemarker.action')}" method="POST">
-	What is your name ? 
-	<input type="text" name="person" value="${person}" size="20">
-	<input type="submit" name="submit" value="Submit">
-</form>
-</body>
-</html>
-
- -

However, if you choose no to use tags, it's recommended that you use Freemarker Macros to write the form elements.

- - -

ex02-success.ftl:

-
-
<#assign ww=JspTaglibs["/WEB-INF/lib/webwork.tld"] />
-
-<html> 
-<head> 
-<title>WebWork Tutorial - Lesson 4.3 - Example 1</title> 
-</head> 
-<body> 
-
-Come from the property WW tag (taglibs support) : <@ww.property value="person"/> <br>
-Come from the Freemarker lookup in the WW stack : ${person}
-
-</body> 
-</html>
-
- -

You can use either WebWork property tag or the Freemarker $person reference. Both of them return the same thing: a property from the action class.

- -
- -

Previous Lesson | Next Lesson

- - -
- - diff --git a/docs/wikidocs/TutorialLesson05.html b/docs/wikidocs/TutorialLesson05.html deleted file mode 100644 index 29ca6730e..000000000 --- a/docs/wikidocs/TutorialLesson05.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork - - TutorialLesson05 - - - - - - - - - - -
-

Lesson 5: Views

- -

There are some different technologies that you could use as the view, i.e., to construct the user interface:

- - -

Lesson 5.1 - Java Server Pages

- -

JSP is the common choice, because most Java web developers are already familiar with the technology. This lesson assumes you already have experience with Java Server Pages and demonstrates how you can use the WebWork features in JSP, mostly by using WebWork tags.

- -

Go to lesson 4.1 (Currently named 4.x while documentation is being rewritten.)

- - -

Lesson 5.2 - Velocity

- -

Velocity is a Java-based template engine that provides a simple, but powerful, template language that replaces JSP and allows for separation of concerns. This lesson assumes that you are already familiar with Velocity and teaches you how to use WebWork features from it.

- -

Go to lesson 4.2 (Currently named 4.x while documentation is being rewritten.)

- - -

Lesson 5.3 - Freemarker

- -

Designed for MVC pattern, Freemarker is another Java-based template engine that provides a powerful template language that replaces JSP, but can remain JSP-compatible with a JSP taglib support. This lesson teaches you how to use WebWork and Freemarker together.

- -

Go to lesson 5.3 (Currently named 4.x while documentation is being rewritten.)

- -
- -

Previous Lesson | Next Lesson

- - -
- - diff --git a/docs/wikidocs/TutorialLesson06.html b/docs/wikidocs/TutorialLesson06.html deleted file mode 100644 index ebddeb603..000000000 --- a/docs/wikidocs/TutorialLesson06.html +++ /dev/null @@ -1,253 +0,0 @@ - - - WebWork - - TutorialLesson06 - - - - - - - - - - -
-

Lesson 5: Interceptors

- -

Interceptors allow arbitrary code to be included in the call stack for your action before and/or after processing the action, which can vastly simplify your code itself and provide excellent opportunities for code reuse. Many of the features of XWork and WebWork are implemented as interceptors and can be applied via external configuration along with your own Interceptors in whatever order you specify for any set of actions you define.

- -

In other words, when you access a *.action URL, WebWork's ServletDispatcher proceeds to the invocation of the an action object. Before it is executed, however, the invocation can be intercepted by another object, that is hence called interceptor. To have an interceptor executed before (or after) a given action, just configure xwork.xml properly, like the example below, taken from lesson 4.1.1:

- -

Interceptor configuration from lesson 4.1.1:

-
-
<action name="formProcessing" class="lesson04_01_01.FormProcessingAction"> 
-	<result name="input" type="dispatcher">ex01-index.jsp</result> 
-	<result name="success" type="dispatcher">ex01-success.jsp</result> 
-	<interceptor-ref name="validationWorkflowStack" /> 
-</action>
-
- -

As you can see, lesson 4.1.1's formProcessing Action uses the validationWorkflowStack. That is an interceptor stack, which organizes a bunch of interceptors in the order in which they are to be executed. That stack is configured in webwork-default.xml, so all we have to do to use it is declare a <interceptor-ref /> under the action configuration or a <default-interceptor-ref />, under package configuration, as seen in lesson 3's first example:

- -

Interceptor configuration from lesson 3.1:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<!-- Default interceptor stack. --> 
-		<default-interceptor-ref name="defaultStack" /> 
-		
-		<!-- Action: Lesson 03: HelloWebWorldAction. --> 
-		<action name="helloWebWorld" class="lesson03.HelloWebWorldAction"> 
-			<result name="success" type="dispatcher">ex01-success.jsp</result> 
-		</action> 
-	</package>
-</xwork>
-
- -

But let's see how it works from scracth:

- -
    -
  1. Create an interceptor class, which is a class that implements the com.opensymphony.xwork.interceptor.Interceptor interface (bundled in xwork-1.0.jar);
  2. -
  3. Declare the class in your XML configuration file (xwork.xml) using the element <interceptor /> nested within <interceptors />;
  4. -
  5. Create stacks of interceptors, using the <interceptor-stack /> element (optional);
  6. -
  7. Determine which interceptors are used by which action, using <interceptor-ref /> or <default-interceptor-ref />. The former defines the interceptors to be used in a specific action, while the latter determines the default interceptor stack to be used by all actions that do not specify their own <interceptor-ref />.
  8. -
- - -

Looking inside webwork-default.xml we can see how it's done:

- -

webwork-default.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<package name="webwork-default">
-		<result-types>
-			<result-type name="dispatcher" default="true"
-				class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"/>
-			<result-type name="redirect" 
-				class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
-			<result-type name="velocity" 
-				class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
-			<result-type name="chain" 
-				class="com.opensymphony.xwork.ActionChainResult"/>
-			<result-type name="xslt" 
-				class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
-		</result-types>
-	
-		<interceptors>
-			<interceptor name="timer" 
-				class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
-			<interceptor name="logger" 
-				class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
-			<interceptor name="chain" 
-				class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
-			<interceptor name="static-params" 
-				class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
-			<interceptor name="params" 
-				class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
-			<interceptor name="model-driven" 
-				class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
-			<interceptor name="component" 
-				class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
-			<interceptor name="token" 
-				class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
-			<interceptor name="token-session" 
-				class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
-			<interceptor name="validation" 
-				class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
-			<interceptor name="workflow" 
-				class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
-			<interceptor name="servlet-config" 
-				class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
-			<interceptor name="prepare" 
-				class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
-			<interceptor name="conversionError" 
-				class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
-			<interceptor-stack name="defaultStack">
-				<interceptor-ref name="static-params"/>
-				<interceptor-ref name="params"/>
-				<interceptor-ref name="conversionError"/>
-			</interceptor-stack>
-			<interceptor-stack name="validationWorkflowStack">
-				<interceptor-ref name="defaultStack"/>
-				<interceptor-ref name="validation"/>
-				<interceptor-ref name="workflow"/>
-			</interceptor-stack>
-		</interceptors>
-	</package>
-</xwork>
-
- -

Since we included webwork-default.xml in our xwork.xml, all the interceptors and stacks above are available for us to use in our actions. Here's what these interceptors do:

- -
    -
  • timer: clocks how long the action (including nested interceptors and view) takes to execute;
  • -
  • logger: logs the action being executed;
  • -
  • chain: makes the previous action's properties available to the current action. Used to make action chaining (reference: Result Types);
  • -
  • static-params: sets the parameters defined in xwork.xml onto the action. These are the <param /> tags that are direct children of the <action /> tag;
  • -
  • params: sets the request (POST and GET) parameters onto the action class. We have seen an example of this in lesson 3;
  • -
  • model-driven: if the action implements ModelDriven, pushes the getModel() result onto the Value Stack;
  • -
  • component: enables and makes registered components available to the actions. (reference: IoC & Components);
  • -
  • token: checks for valid token presence in action, prevents duplicate form submission;
  • -
  • token-session: same as above, but storing the submitted data in session when handed an invalid token;
  • -
  • validation: performs validation using the validators defined in {Action}-validation.xml (reference: Validation). We've seen an example of this in lesson 4.1.1;
  • -
  • workflow: calls the validate method in your action class. If action errors created then it returns the INPUT view. Good to use together with the validation interceptor (reference: Validation);
  • -
  • servlet-config: give access to HttpServletRequest and HttpServletResponse (think twice before using this since this ties you to the Servlet API);
  • -
  • prepare: allows you to programmatic access to your Action class before the parameters are set on it.;
  • -
  • conversionError: help needed here.
  • -
- - - -

Building your own Interceptor

- -

If none of the above interceptors suit your particular need, you will have to implement your own interceptor. Fortunately, this is an easy task to accomplish. Suppose we need an interceptor that places a greeting in the Session according to the time of the day (morning, afternoon or evening). Here's how we could implement it:

- -

GreetingInterceptor.java:

-
-
package lesson05;
-
-import java.util.Calendar;
-import com.opensymphony.xwork.interceptor.Interceptor;
-import com.opensymphony.xwork.ActionInvocation;
-
-public class GreetingInterceptor implements Interceptor {
-	public void init() { }
-	public void destroy() { }
-	public String intercept(ActionInvocation invocation) throws Exception {
-		Calendar calendar = Calendar.getInstance();
-		int hour = calendar.get(Calendar.HOUR_OF_DAY);
-		String greeting = (hour < 6) ? "Good evening" : 
-			((hour < 12) ? "Good morning": 
-			((hour < 18) ? "Good afternoon": "Good evening"));
-
-		invocation.getInvocationContext().getSession().put("greeting", greeting);
-
-		String result = invocation.invoke();
-
-		return result;
-	}
-}
-
- -

xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-	
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<interceptors> 
-			<interceptor name="greeting" class="section02.lesson05.GreetingInterceptor" /> 
-		</interceptors> 
-		
-		<!-- Action: Lesson 5: GreetingInterceptor. --> 
-		<action name="greetingAction" class="lesson05.GreetingAction"> 
-			<result name="success" type="velocity">ex01-result.vm</result> 
-			<interceptor-ref name="greeting" /> 
-		</action> 
-	</package>
-</xwork>
-
- -

GreetingAction.java:

-
-
package lesson05;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class GreetingAction extends ActionSupport {
-	public String execute() throws Exception {
-		return SUCCESS;
-	}
-}
-
- -

ex01-result.vm:

-
-
<html>
-<head>
-<title>WebWork Tutorial - Lesson 5 - Example 1</title>
-</head>
-<body>
-
-#set ($ses = $req.getSession())
-<p><b>${ses.getAttribute('greeting')}!</b></p>
-
-</body>
-</html>
-
- -

Let's take a look at our interceptor class first. As explained before, the interceptor must implement com.opensymphony.xwork.interceptor.Interceptor's methods: init(), called during interceptor initialization, destroy(), called during destruction, and most importantly, intercept(ActionInvocation invocation), which is where we place the code that does the work.

- -

Notice that our interceptor returns the result from invocation.invoke() which is the method responsible for executing the next interceptor in the stack or, if this is the last one, the action. This means that the interceptor has the power of short-circuiting the action invocation and return a result string without executing the action at all! Use this with caution, though.

- -

One other thing that interceptors can do is execute code after the action has executed. To do that, just place code after the invocation.invoke() call. WebWork provides an abstract class that already implements this kind of behaviour: com.opensymphony.xwork.interceptor.AroundInterceptor. Just extend it and implement the methods before(ActionInvocation invocation) and after(ActionInvocation dispatcher, String result).

- -

The xwork.xml configuration, the action class and the result page are pretty straightforward and require no further explanation.

- -

Try the example!

- - -
- -

Previous Lesson | End of Tutorial

- - -
- - diff --git a/docs/wikidocs/Type Conversion.html b/docs/wikidocs/Type Conversion.html deleted file mode 100644 index e6d9d3be7..000000000 --- a/docs/wikidocs/Type Conversion.html +++ /dev/null @@ -1,318 +0,0 @@ - - - WebWork - - Conversion - - - - - - - - - - -
-

WebWork has one of the most advanced type conversion abilities in any web-based framework in any Java language. Generally, you don't need to do anything to take advantage of it, other than name your HTML inputs (form elements and other GET/POST parameters) names that are valid OGNL expressions.

- -

A Simple Example

- - -

Type conversion is great for situations where you need to turn a String in to a more complex object. Because the web - is type-agnostic (everything is a string in HTTP), WebWork's type conversion features are very useful. For instance, - if you were prompting a user to enter in coordinates in the form of a string (such as "3, 22"), you could have - WebWork do the conversion both from String to Point and from Point to String.

- -

Using this "point" example, if your action (or another compound object in which you are setting properties on) - has a corresponding ClassName-conversion.properties file, WebWork will use the configured type converters for - conversion to and from strings. So turning "3, 22" in to new Point(3, 22) is done by merely adding the following - entry to ClassName-conversion.properties (Note that the PointConverter should impl the ognl.TypeConverter - interface):

- -

point = com.acme.PointConverter

- -

Your type converter should be sure to check what class type it is being requested to convert. Because it is used - for both to and from strings, you will need to split the conversion method in to two parts: one that turns Strings in - to Points, and one that turns Points in to Strings.

- -

After this is done, you can now reference your point (using <ww:property value="post"/> in JSP or ${point} - in FreeMarker) and it will be printed as "3, 22" again. As such, if you submit this back to an action, it will be - converted back to a Point once again.

- -

In some situations you may wish to apply a type converter globally. This can be done by editing the file - xwork-conversion.properties in the root of your class path (typically WEB-INF/classes) and providing a - property in the form of the class name of the object you wish to convert on the left hand side and the class name of - the type converter on the right hand side. For example, providing a type converter for all Point objects would mean - adding the following entry:

- -

com.acme.Point = com.acme.PointConverter

- - -
-

Type conversion should not be used as a substitute for i18n. It is not recommended to use this feature to print out - properly formatted dates. Rather, you should use the i18n features of WebWork (and consult the JavaDocs for JDK's - MessageFormat object) to see how a properly formatted date should be displayed.

-
- -

WebWork ships with a helper base class that makes converting to and from Strings very easy. The class is com.opensymphony.webwork.util.WebWorkTypeConverter. This class makes it very easy for you to write type converters that handle converting objects to Strings as well as from Strings. From the JavaDocs for this class:

- - -

Base class for type converters used in WebWork. This class provides two abstract methods that are used to convert - both to and from strings – the critical functionality that is core to WebWork's type coversion system.

- -

Type converters do not have to use this class. It is merely a helper base class, although it is recommended that - you use this class as it provides the common type conversion contract required for all web-based type conversion.

- -

There's a hook (fall back method) called performFallbackConversion of which - could be used to perform some fallback conversion if convertValue method of this - failed. By default it just ask its super class (Ognl's DefaultTypeConverter) to do the conversion.

- - -

Built in Type Conversion Support

- -

-WebWork will automatically handle the most common type conversion for you. This includes support for converting to -and from Strings for each of the following: -

-

    -

    -

  • String
  • -

    -

  • boolean / Boolean
  • -

    -

  • char / Character
  • -

    -

  • int / Integer, float / Float, long / Long, double / Double
  • -

    -

  • dates - uses the SHORT format for the Locale associated with the current request
  • -

    -

  • arrays - assuming the individual strings can be coverted to the individual items
  • -

    -

  • collections - if not object type can be determined, it is assumed to be a String and a new ArrayList is -created
  • -

    -

-

-

Note that with arrays the type conversion will defer to the type of the array elements and try to convert each -item individually. As with any other type conversion, if the conversion can't be performed the standard type -conversion error reporting is used to indicate a problem occured while processing the type conversion. -

- -

Relationship to Parameter Names

- -

The best way to take advantage of WebWork's type conversion is to utilize complete objects (ideally your domain objects directly), rather than submitting form values on to intermediate primitives and strings in your action and then converting those values to full objects in the execute() method. Some tips for achieving this are:

- -
    -
  • Use complex OGNL expressions - WebWork will automatically take care of creating the actual objects for you.
  • -
  • Use JavaBeans! WebWork can only create objects for you if your objects obey the JavaBean specification and provide no-arg constructions, as well as getters and setters where appropriate.
  • -
  • Remember that person.name will call getPerson().setName(), but if you are expecting WebWork to create the Person object for you, a setPerson() must also exist.
  • -
  • For lists and maps, use index notation, such as people[0].name or friends['patrick'].name. Often these HTML form elements are being rendered inside a loop, so you can use the iterator tag's status attribute if you're using JSP Tags or the ${foo_index} special property if you're using FreeMarker Tags.
  • -
  • FOr multiple select boxes, you obviously can't name each individual item using index notation. Instead, name your element simply people.name and WebWork will understand that it should create a new Person object for each selected item and set it's name accordingly.
  • -
- - -

Advanced Type Conversion

- -

WebWork also has some very advanced, yet easy-to-use, type conversion features. Null property handling will automatically create objects where null references are found. Collection and map support provides intelligent null handling and type conversion for Java Collections. Type conversion error handling provides an easy way to distinguish the difference between an input validation problem from an input type conversion problem.

- -

Null Property Handling

- - -

Provided that the key #CREATE_NULL_OBJECTS is in the action context with a value of true (this key is set - only during the execution of the com.opensymphony.xwork.interceptor.ParametersInterceptor), OGNL expressions - that have caused a NullPointerException will be temporarily stopped for evaluation while the system automatically - tries to solve the null references by automatically creating the object.

- -

The following rules are used when handling null references:

- -

    - -

  • If the property is declared exactly as a Collection or List, then an ArrayList shall be - returned and assigned to the null references.
  • - -

  • If the property is declared as a Map, then a HashMap will be returned and assigned to the null - references.
  • - -

  • If the null property is a simple bean with a no-arg constructor, it will simply be created using the {@link - ObjectFactory#buildBean(java.lang.Class, java.util.Map)} method.
  • - -

- - -

For example, if a form element has a text field named person.name and the expression person evaluates - to null, then this class will be invoked. Because the person expression evaluates to a Person class, a - new Person is created and assigned to the null reference. Finally, the name is set on that object and the overall - effect is that the system automatically created a Person object for you, set it by calling setPerson() and then - finally called getPerson().setName() as you would typically expect.

- - -

Collection and Map Support

- -

WebWork supports ways to determine the object type found in collections. This is done via an ObjectTypeDeterminer. The default implementation is provided. The JavaDocs explain how map and colelction support is determined in the DefaultObjectTypeDeterminer:

- - -

This ObjectTypeDeterminer looks at the Class-conversion.properties for entries that indicated what - objects are contained within Maps and Collections. For Collections, such as Lists, the element is specified using the - pattern Element_xxx, where xxx is the field name of the collection property in your action or object. For - Maps, both the key and the value may be specified by using the pattern Key_xxx and Element_xxx, - respectively.

- -

From WebWork 2.1.x, the Collection_xxx format is still supported and honored, although it is deprecated - and will be removed eventually.

- - -

Additionally, you can create your own custom ObjectTypeDeterminer by implementing the ObjectTypeDeterminer interface. There is also an optional ObjectTypeDeterminer that utilizes Java 5 generics. See the J2SE 5 Support page for more information.

- -

Indexing a collection by a property of that collection

- -

It is also possible using webwork to get a unique element of a collection, by passing the value of a given property of that element. By default, the property of the element of the collection is determined in Class-conversion.properties using KeyProperty_xxx=yyy where xxx is the property of the bean 'Class' that returns the collection and yyy is the property of the collection element that we want to index on. Here is an example with the following two classes:

- -
MyAction.java
-
/**
- * @return a Collection of Foo objects
- */
-public Collection getFooCollection()
-{
-    return foo;
-}
-
- -
Foo.java
-
/**
- * @return a unique identifier
- */
-public Long getId()
-{
-    return id;
-}
-
- -

Then put KeyProperty_fooCollection=id in my MyAction-conversion.properties file. This would allow to the use of fooCollection(someIdValue) to get the Foo object with value someIdValue in the Set fooCollection. For example, fooCollection(22) would return the Foo object in the fooCollection collection whose id property value was 22.

- -

This is useful, because it ties a collection element directly to its unique identifier and therefore does not force you to use an index and thus allows you to edit the elements of a collection associated to a bean without any additional code. For example, parameter name fooCollection(22).name and value Phil would set name the Foo object in the fooCollection collection whose id property value was 22 to be Phil.

- -

Webwork automatically converts the type of the parameter sent in to the type of the key property using type conversion.

- -

Unlike Map and List element properties, if fooCollection(22) does not exist it will not be created. To do that, use the notation fooCollection.makeNew[index] where index is an integer 0, 1, and so on. Thus, parameter value pairs fooCollection.makeNew[0]=Phil and fooCollection.makeNew[1]=John would add two new Foo objects to fooCollection one with name property value Phil and the other with name property value Bar. Note, however, that in the case of a Set, the equals and hashCode methods should be defined such that they don't only include the id property. That will cause one element of the null id propertied Foos to be removed from the Set.

- -

An advanced example for indexed Lists and Maps

- -

Here is the model bean used within the list.
-The KeyProperty for this bean is the id attribute.

- -
MyBean.java
-
public class MyBean implements Serializable {
-
-    private Long id;
-    private String name;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-    public String toString() {
-        return "MyBean{" +
-                "id=" + id +
-                ", name='" + name + '\'' +
-                '}';
-    }
-}
-
- -

The action has a beanList attribute initialized with an empty ArrayList.

- -
MyBeanAction.java
-
ublic class MyBeanAction implements Action {
-
-    private List beanList = new ArrayList();
-    private Map beanMap = new HashMap();
-
-    public List getBeanList() {
-        return beanList;
-    }
-
-    public void setBeanList(List beanList) {
-        this.beanList = beanList;
-    }
-
-    public Map getBeanMap() {
-        return beanMap;
-    }
-
-    public void setBeanMap(Map beanMap) {
-        this.beanMap = beanMap;
-    }
-
-    public String execute() throws Exception {
-        return SUCCESS;
-    }
-}
-
- -

These conversion.properties tell the TypeConverter to use MyBean instances as elements of the List.

- -
MyBeanAction-conversion.properties
-
KeyProperty_beanList=id
-Element_beanList=MyBean
-CreateIfNull_beanList=true
-
- -

When submitting this via a form, the (id) value is used as KeyProperty for the MyBean instances in the beanList.
-Notice the () notation! Do not use [] notation, this is for Maps only!
-The value for name will be set to the MyBean instance with this special id.
-The List does no longer have null values added for unavailable id values.
-This avoids the risk of OutOfMemoryErrors!

- -
MyBeanAction.jsp
-
<ww:iterator value="beanList" id="bean">
-  <ww:textfield name="beanList(%{bean.id}).name" />
-</ww:iterator>
-
- -

Type Conversion Error Handling

- - -

Any error that occurs during type conversion may or may not wish to be reported. For example, reporting that the - input "abc" could not be converted to a number might be important. On the other hand, reporting that an empty string, - "", cannot be converted to a number might not be important - especially in a web environment where it is hard to - distinguish between a user not entering a value vs. entering a blank value.

- -

By default, all conversion errors are reported using the generic i18n key xwork.default.invalid.fieldvalue, - which you can override (the default text is Invalid field value for field "xxx", where xxx is the field name) - in your global i18n resource bundle.

- -

However, sometimes you may wish to override this message on a per-field basis. You can do this by adding an i18n - key associated with just your action (Action.properties) using the pattern invalid.fieldvalue.xxx, where xxx - is the field name.

- -

It is important to know that none of these errors are actually reported directly. Rather, they are added to a map - called conversionErrors in the ActionContext. There are several ways this map can then be accessed and the - errors can be reported accordingly.

- - -

There are two ways the error reporting can occur:

- -
    -
  1. globally, using the Conversion Error Interceptor
  2. -
  3. on a per-field basis, using the conversion validator
  4. -
- - -

By default, the conversion interceptor is included in webwork\-default.xml in the default stack, so if you don't want conversion errors reporting globally, you'll need to change the interceptor stack and add additional validation rules.

- -
- - diff --git a/docs/wikidocs/TypeConversion Annotation.html b/docs/wikidocs/TypeConversion Annotation.html deleted file mode 100644 index 3c71d2076..000000000 --- a/docs/wikidocs/TypeConversion Annotation.html +++ /dev/null @@ -1,124 +0,0 @@ - - - WebWork - - TypeConversion Annotation - - - - - - - - - - -
-

TypeConversion Annotation

- -

This annotation is used for class and application wide conversion rules. -

-Class wide conversion:
-The conversion rules will be assembled in a file called XXXAction-conversion.properties -within the same package as the related action class. -Set type to: type = ConversionType.CLASS -

-

-Allication wide conversion:
-The conversion rules will be assembled within the xwork-conversion.properties file within the classpath root. -Set type to: type = ConversionType.APPLICATION -

- -

Usage

- -

The TypeConversion annotation can be applied at property and method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterRequiredDefaultDescription
keynoThe annotated property/key nameThe optional property name mostly used within TYPE level annotations.
typenoConversionType.CLASSEnum value of ConversionType. Determines whether the conversion should be applied at application or class level.
rulenoConversionRule.PROPERTYEnum value of ConversionRule. The ConversionRule can be a property, a Collection or a Map.
convertereither this or value The class name of the TypeConverter to be used as converter.
valueeither converter or this The value to set for ConversionRule.KEY_PROPERTY.

- - -

Examples

- -
-
@Conversion()
-public class ConversionAction implements Action {
-
-  private String convertInt;
-
-  private String convertDouble;
-  private List users = null;
-
-  private HashMap keyValues = null;
-
-  @TypeConversion(type = ConversionType.APPLICATION, converter = "com.opensymphony.xwork.util.XWorkBasicConverter")
-  public void setConvertInt( String convertInt ) {
-      this.convertInt = convertInt;
-  }
-
-  @TypeConversion(converter = "com.opensymphony.xwork.util.XWorkBasicConverter")
-  public void setConvertDouble( String convertDouble ) {
-      this.convertDouble = convertDouble;
-  }
-
-  @TypeConversion(rule = ConversionRule.COLLECTION, converter = "java.util.String")
-  public void setUsers( List users ) {
-      this.users = users;
-  }
-
-  @TypeConversion(rule = ConversionRule.MAP, converter = "java.math.BigInteger")
-  public void setKeyValues( HashMap keyValues ) {
-      this.keyValues = keyValues;
-  }
-
-  @TypeConversion(type = ConversionType.APPLICATION, property = "java.util.Date", converter = "com.opensymphony.xwork.util.XWorkBasicConverter")
-  public String execute() throws Exception {
-      return SUCCESS;
-  }
-}
-
- - -
- - diff --git a/docs/wikidocs/Understanding actions.html b/docs/wikidocs/Understanding actions.html deleted file mode 100644 index 080c00663..000000000 --- a/docs/wikidocs/Understanding actions.html +++ /dev/null @@ -1,288 +0,0 @@ - - - WebWork - - Understanding actions - - - - - - - - - - -
-

Actions

- -

we will create a form in which you can enter your name. For example, if you enter "Bob" and click the submit button,
-you'll get a page saying "Hello, Bob!". If you don't enter a name, you'll get a screen saying: "Hmm, you don't seem to have entered a name. Go back and try again please."

- -

As before, we set everything up in four steps: create the form, create the action, register the action, and create the landing page (or in this case, pages).

- -

1. Create the form

- -

Paste this html into webapp/page03.jsp:

-
-
<html>
-<head>
-	<title>A simple form with data</title>
-</head>
-<body>
-	<p>What is your name?</p>
-
-	<form action="form03.action" method="post">
-		<p><input type="text" name="yourName"></p>
-		<p><input type="submit" value="Submit your name." /></p>
-	</form>
-
-</body>
-</html>
-
-

 

- -

2. Create the form action

- -

Paste this code into src/lessons/Form03Action.java:

-
-
package lessons;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class Form03Action extends ActionSupport {
-
-  String yourName;
-
-  public void setYourName(String p_yourName) {
-    yourName = p_yourName;
-  }
-
-  public String getYourName() {
-    return yourName;
-  }
-
-
-  public String execute() throws Exception {
-    if (yourName == null || yourName.length() == 0)
-      return ERROR;
-    else
-      return SUCCESS;
-  }
-
-}
-
-

 

- -

3. Register the action in xwork.xml:

- -

Edit webapp/WEB-INF/classes/xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-  <!-- Include webwork defaults (from WebWork JAR). -->
-  <include file="webwork-default.xml" />
-
-  <!-- Configuration for the default package. -->
-  <package name="default" extends="webwork-default">
-    <!-- Default interceptor stack. -->
-    <default-interceptor-ref name="defaultStack" />
-
-    <!-- 02 -->
-    <action name="form02" class="lessons.Form02Action">
-      <result name="success" type="dispatcher">page02-success.jsp</result>
-    </action>
-
-    <!-- 03 -->
-    <action name="form03" class="lessons.Form03Action">
-      <result name="success" type="dispatcher">page03-success.jsp</result>
-      <result name="error" type="dispatcher">page03-error.jsp</result>
-    </action>
-
-  </package>
-</xwork>
-
-

 

- -

4. Create the success and error pages

- -

Create webapp/page03-success.jsp:

-
-
<%@ taglib uri="webwork" prefix="ww" %>
-<html>
-<head>
-	<title>Success page for form with data</title>
-</head>
-<body>
-
-Hello, <ww:property value="yourName" />!
-
-</body>
-</html>
-
-

 

- -

Create webapp/page03-error.jsp:

-
-
<html>
-<head>
-	<title>Error page for form with data</title>
-</head>
-<body>
-
-Hmm, you don't seem to have entered a name. Go back and try again please.
-
-</body>
-</html>
-
-

 

- -

Try it

- -

Don't forget to compile your action to webapp/WEB-INF/classes, and to restart your web application if necessary.

- -

Go ahead and try it now: click the form submit button and see what happens. Try it with and without entering a name.

- -

How the code works

- -

There are only two differences between this example and the previous lesson.

-
    -
  • When the action is called, its setYourName() setter method is called with the contents of the form field named yourName.
  • -
  • After the action has been called (which is when its execute() method returns), WebWork has two options. If ERROR is returned, WebWork will return page03-error.jsp; if SUCCESS, page03-success.jsp. Just as in the last lesson, the <ww:property> tag calls the action's getter (in this case, getYourName()).
  • -
- - -

An html form with data, without getters or setters

- -

For the form field named "yourName" in the previous lesson, we also had to create the getters and setters getYourName() and setYourName() in the action, as well as the private variable yourName. With dozens of forms and hundreds of form fields, you'll be typing thousands of getters and setters. That can get old fast. In this lesson, we'll repeat the last lesson, but without any of that extra typing.

- -

1. Create the html form

- -

Use the same JSP form from the previous lesson, but change the form action to page04.action:

-
-
<html>
-<head>
-	<title>A simple form with data</title>
-</head>
-<body>
-	<p>What is your name?</p>
-
-	<form action="form04.action" method="post">
-		<p><input type="text" name="yourName"></p>
-		<p><input type="submit" value="Submit your name." /></p>
-	</form>
-
-</body>
-</html>
-
-

 

- -

2. Create the form action

- -

Paste this code into src/lessons/Form04Action.java:

-
-
package lessons;
-
-import com.opensymphony.xwork.ActionSupport;
-import com.opensymphony.webwork.interceptor.ParameterAware;
-
-import java.util.Map;
-
-public class Form04Action extends ActionSupport implements ParameterAware {
-
-  Map parameters;
-
-  public Map getParameters() {
-    return parameters;
-  }
-
-  public void setParameters(Map parameters) {
-    this.parameters = parameters;
-  }
-
-  public String execute() {
-    String[] yourName = (String[]) parameters.get("yourName");
-    if(yourName == null || yourName[0] == null || yourName[0].length() == 0)
-      return ERROR;
-    else
-      return SUCCESS;
-  }
-}
-
-

 

- -

Register the action in xwork.xml:

- -

Edit webapp/WEB-INF/classes/xwork.xml:

-
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-  <!-- Include webwork defaults (from WebWork JAR). -->
-  <include file="webwork-default.xml" />
-
-  <!-- Configuration for the default package. -->
-  <package name="default" extends="webwork-default">
-    <!-- Default interceptor stack. -->
-    <default-interceptor-ref name="defaultStack" />
-
-    <!-- 02 -->
-    <action name="form02" class="lessons.Form02Action">
-      <result name="success" type="dispatcher">page02-success.jsp</result>
-    </action>
-
-    <!-- 03 -->
-    <action name="form03" class="lessons.Form03Action">
-      <result name="success" type="dispatcher">page03-success.jsp</result>
-      <result name="error" type="dispatcher">page03-error.jsp</result>
-    </action>
-
-    <!-- 04 -->
-    <action name="form04" class="lessons.Form04Action">
-      <result name="success" type="dispatcher">page04-success.jsp</result>
-      <result name="error" type="dispatcher">page03-error.jsp</result>
-      <interceptor-ref name="servlet-config"/>
-    </action>
-
-  </package>
-</xwork>
-
-

 

- -

Create the success and error pages

- -

We'll use the same error page, but create a slightly different success page page04-success.jsp. The only difference is the <ww:property> tag.

-
-
<%@ taglib uri="webwork" prefix="ww" %>
-<html>
-<head>
-	<title>Success page for form with data</title>
-</head>
-<body>
-
-Hello, <ww:property value="parameters.yourName" />!
-
-</body>
-</html>
-
-

 

- -

Try it

- -

Don't forget to compile your action to webapp/WEB-INF/classes, and to restart your web application if necessary.

- -

Go ahead and try it now. Load page04.jsp, enter "Bob" in the text field, and click the form submit button. You should see page04-success.jsp saying "Hello, Bob!"

- -

How the code works

- -

You've probably figured out what is going on just from looking at the code.

- -

Instead of a setter setYourName() setting a private variable yourName in the action, setParameters() magically extracts everything from the JSP request object and puts into a private local Map parameters. Then execute(), instead of looking for a yourName variable, is able to get the value of the "yourName" field from parameters. So far so good .

- -

Back on the page04-success.jsp page, <ww:property value="yourName" /> isn't going to work any more, because there is no getYourName() getter in the action. Instead, <ww:property value="parameters.yourName" /> calls the getParameters() getter, and is able to get the value of the "yourName" field. Pretty neat!

- -

We haven't covered how to handle radio buttons, checkboxes, and other strange html form fields. That involves dealing with the fact that every entry in the parameters Map is a String[]. We'll cover this in a later lesson.

- -
- - diff --git a/docs/wikidocs/Understanding interceptors.html b/docs/wikidocs/Understanding interceptors.html deleted file mode 100644 index 3137cbe0c..000000000 --- a/docs/wikidocs/Understanding interceptors.html +++ /dev/null @@ -1,358 +0,0 @@ - - - WebWork - - Understanding interceptors - - - - - - - - - - -
-
TODO

- Update the info about the new interceptors
-

 

- -

Interceptors

- -

Interceptors allow arbitrary code to be included in the call stack for your action before and/or after processing the action, which can vastly simplify your code itself and provide excellent opportunities for code reuse. Many of the features of XWork and WebWork are implemented as interceptors and can be applied via external configuration along with your own Interceptors in whatever order you specify for any set of actions you define.

- -

In other words, when you access a *.action URL, WebWork's ServletDispatcher proceeds to the invocation of the an action object. Before it is executed, however, the invocation can be intercepted by another object, that is hence called interceptor. To have an interceptor executed before (or after) a given action,

- -

!overview.png!
Be Careful

-Note that some interceptors will interrupt the stack/chain/flow... so the order is very important.

- -

Interceptor configuration:

- -
-
<package name="default" extends="webwork-default">
-   <interceptors>
-       <interceptor name="timer" class=".."/>
-       <interceptor name="logger" class=".."/>
-   </interceptors>
-
-   <action name="login"
-      class="org.hibernate.auction.web.actions.users.Login">
-        <interceptor-ref name="timer"/>
-        <interceptor-ref name="logger"/>
-         <result name="input">login.jsp</result>
-         <result name="success"
-            type="redirect">/secure/dashboard.action</result>
-   </action>
-</package>
-
-

 

- -

Grouping interceptors as stacks

- -

With most web applications, you'll find yourself wanting to apply the same interceptors over and over. Rather than declare numerous interceptor-refs for each action, you can bundle these interceptors together using an interceptor stack.

-
-
<package name="default" extends="webwork-default">
-   <interceptors>
-        <interceptor name="timer" class=".."/>
-        <interceptor name="logger" class=".."/>
-        <interceptor-stack name="myStack">
-           <interceptor-ref name="timer"/>
-           <interceptor-ref name="logger"/>
-        </interceptor-stack>
-    </interceptors>
-
-<action name="login"
-     class="org.hibernate.auction.web.actions.users.Login">
-         <interceptor-ref name="myStack"/>
-         <result name="input">login.jsp</result>
-         <result name="success"
-             type="redirect">/secure/dashboard.action</result>
-</action>
-</package>
-
-

 

- -

Looking inside webwork-default.xml we can see how it's done:

- -

webwork-default.xml:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.1.dtd">
-
-<!-- // START SNIPPET: webwork-default -->
-<xwork>
-    <package name="webwork-default">
-        <result-types>
-            <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
-            <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"
-                         default="true"/>
-            <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
-            <result-type name="httpheader" class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
-            <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
-            <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
-            <result-type name="redirect-action"
-                         class="com.opensymphony.webwork.dispatcher.ServletActionRedirectResult"/>
-            <result-type name="stream" class="com.opensymphony.webwork.dispatcher.StreamResult"/>
-            <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
-            <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
-        </result-types>
-
-        <interceptors>
-            <interceptor name="alias" class="com.opensymphony.xwork.interceptor.AliasInterceptor"/>
-            <interceptor name="autowiring"
-                         class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor"/>
-            <interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
-            <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
-            <interceptor name="conversionError"
-                         class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
-            <interceptor name="external-ref" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
-            <interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>
-            <interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
-            <interceptor name="fileUpload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>
-            <interceptor name="i18n" class="com.opensymphony.xwork.interceptor.I18nInterceptor"/>
-            <interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
-            <interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
-            <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
-            <interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
-            <interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
-            <interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
-            <interceptor name="sessionAutowiring"
-                         class="com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringInterceptor"/>
-            <interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
-            <interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
-            <interceptor name="token-session"
-                         class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
-            <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
-            <interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
-
-            <!-- Basic stack -->
-            <interceptor-stack name="basicStack">
-                <interceptor-ref name="exception"/>
-                <interceptor-ref name="servlet-config"/>
-                <interceptor-ref name="prepare"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="conversionError"/>
-            </interceptor-stack>
-
-            <!-- Sample validation and workflow stack -->
-            <interceptor-stack name="validationWorkflowStack">
-                <interceptor-ref name="basicStack"/>
-                <interceptor-ref name="validation"/>
-                <interceptor-ref name="workflow"/>
-            </interceptor-stack>
-
-            <!-- Sample file upload stack -->
-            <interceptor-stack name="fileUploadStack">
-                <interceptor-ref name="fileUpload"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample WebWork Inversion of Control stack
-                 Note: WebWork's IoC is deprecated - please
-                 look at alternatives such as Sprint -->
-            <interceptor-stack name="componentStack">
-                <interceptor-ref name="component"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample model-driven stack  -->
-            <interceptor-stack name="modelDrivenStack">
-                <interceptor-ref name="model-driven"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample action chaining stack -->
-            <interceptor-stack name="chainStack">
-                <interceptor-ref name="chain"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample i18n stack -->
-            <interceptor-stack name="chainStack">
-                <interceptor-ref name="i18n"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample execute and wait stack.
-                 Note: execAndWait should always be the *last* interceptor. -->
-            <interceptor-stack name="executeAndWaitStack">
-                <interceptor-ref name="basicStack"/>
-                <interceptor-ref name="execAndWait"/>
-            </interceptor-stack>
-
-            <!-- A complete stack with all the common interceptors in place.
-                 Generally, this stack should be the one you use, though it
-                 may process additional stuff you don't need, which could
-                 lead to some performance problems. Also, the ordering can be
-                 switched around (ex: if you wish to have your components
-                 before prepare() is called, you'd need to move the component
-                 interceptor up -->
-            <interceptor-stack name="defaultStack">
-                <interceptor-ref name="exception"/>
-                <interceptor-ref name="alias"/>
-                <interceptor-ref name="prepare"/>
-                <interceptor-ref name="servlet-config"/>
-                <interceptor-ref name="i18n"/>
-                <interceptor-ref name="chain"/>
-                <interceptor-ref name="model-driven"/>
-                <interceptor-ref name="fileUpload"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="conversionError"/>
-                <interceptor-ref name="validation"/>
-                <interceptor-ref name="workflow"/>
-            </interceptor-stack>
-
-            <!-- The completeStack is here for backwards compatibility for
-                 applications that still refer to the defaultStack by the
-                 old name -->
-            <interceptor-stack name="completeStack">
-                <interceptor-ref name="defaultStack"/>
-            </interceptor-stack>
-        </interceptors>
-
-        <default-interceptor-ref name="defaultStack"/>
-    </package>
-</xwork>
-<!-- // END SNIPPET: webwork-default -->
-
-

 

- -

Since we included webwork-default.xml in our xwork.xml, all the interceptors and stacks above are available for us to use in our actions. Here's what these interceptors do:

-
    -
  • timer: clocks how long the action (including nested interceptors and view) takes to execute;
  • -
  • logger: logs the action being executed;
  • -
  • chain: makes the previous action's properties available to the current action. Used to make action chaining (reference: Result Types);
  • -
  • static-params: sets the parameters defined in xwork.xml onto the action. These are the <param /> tags that are direct children of the <action /> tag;
  • -
  • params: sets the request (POST and GET) parameters onto the action class. We have seen an example of this in TODO;
  • -
  • model-driven: if the action implements ModelDriven, pushes the getModel() result onto the Value Stack;
  • -
  • component: enables and makes registered components available to the actions. (reference: IoC & Components);
  • -
  • token: checks for valid token presence in action, prevents duplicate form submission;
  • -
  • token-session: same as above, but storing the submitted data in session when handed an invalid token;
  • -
  • validation: performs validation using the validators defined in {Action}-validation.xml (reference: Validation).;
  • -
  • workflow: calls the validate method in your action class. If action errors created then it returns the INPUT view. Good to use together with the validation interceptor (reference: Validation);
  • -
  • servlet-config: give access to HttpServletRequest and HttpServletResponse (think twice before using this since this ties you to the Servlet API);
  • -
  • prepare: allows you to programmatic access to your Action class before the parameters are set on it.;
  • -
  • conversionError: Adds field errors if any type-conversion errors occurred.
  • -
  • execAndWait: Spawns a separate thread to execute the action
  • -
  • fileUpload: Sets uploaded files as action files (File objects)
  • -
- - -

In addition to the prepackaged interceptors, webwork-default.xml includes prepackaged
-combinations of these interceptors in named interceptor stacks.

- -

Building your own Interceptor

- -

If none of the above interceptors suit your particular need, you will have to implement your own interceptor. Fortunately, this is an easy task to accomplish. Suppose we need an interceptor that places a greeting in the Session according to the time of the day (morning, afternoon or evening). Here's how we could implement it:

-
    -
  1. Create an interceptor class, which is a class that implements the com.opensymphony.xwork.interceptor.Interceptor interface (bundled in xwork-1.1.jar);
  2. -
  3. Declare the class in your XML configuration file (xwork.xml) using the element <interceptor /> nested within <interceptors />;
  4. -
  5. Create stacks of interceptors, using the <interceptor-stack /> element (optional);
  6. -
  7. Determine which interceptors are used by which action, using <interceptor-ref /> or <default-interceptor-ref />. The former defines the interceptors to be used in a specific action, while the latter determines the default interceptor stack to be used by all actions that do not specify their own <interceptor-ref />.
  8. -
- - -

GreetingInterceptor.java:

- -
-
package lesson05;
-
-import java.util.Calendar;
-import com.opensymphony.xwork.interceptor.Interceptor;
-import com.opensymphony.xwork.ActionInvocation;
-
-public class GreetingInterceptor implements Interceptor {
-	public void init() { }
-	public void destroy() { }
-	public String intercept(ActionInvocation invocation) throws Exception {
-		Calendar calendar = Calendar.getInstance();
-		int hour = calendar.get(Calendar.HOUR_OF_DAY);
-		String greeting = (hour < 6) ? "Good evening" :
-			((hour < 12) ? "Good morning":
-			((hour < 18) ? "Good afternoon": "Good evening"));
-
-		invocation.getInvocationContext().getSession().put("greeting", greeting);
-
-		String result = invocation.invoke();
-
-		return result;
-	}
-}
-
-

 

- -

xwork.xml:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
-"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-	<!-- Include webwork defaults (from WebWork JAR). -->
-	<include file="webwork-default.xml" />
-
-	<!-- Configuration for the default package. -->
-	<package name="default" extends="webwork-default">
-		<interceptors>
-			<interceptor name="greeting" class="section02.lesson05.GreetingInterceptor" />
-		</interceptors>
-
-		<!-- Action: Lesson 5: GreetingInterceptor. -->
-		<action name="greetingAction" class="lesson05.GreetingAction">
-			<result name="success" type="velocity">ex01-result.vm</result>
-			<interceptor-ref name="greeting" />
-		</action>
-	</package>
-</xwork>
-
-

 

- -

GreetingAction.java:

- -
-
package lesson05;
-
-import com.opensymphony.xwork.ActionSupport;
-
-public class GreetingAction extends ActionSupport {
-	public String execute() throws Exception {
-		return SUCCESS;
-	}
-}
-
-

 

- -

ex01-result.vm:

- -
-
<html>
-<head>
-<title>WebWork Tutorial - Lesson 5 - Example 1</title>
-</head>
-<body>
-
-#set ($ses = $req.getSession())
-<p><b>${ses.getAttribute('greeting')}!</b></p>
-
-</body>
-</html>
-
-

 

- -

Let's take a look at our interceptor class first. As explained before, the interceptor must implement com.opensymphony.xwork.interceptor.Interceptor's methods: init(), called during interceptor initialization, destroy(), called during destruction, and most importantly, intercept(ActionInvocation invocation), which is where we place the code that does the work.

- -

Notice that our interceptor returns the result from invocation.invoke() which is the method responsible for executing the next interceptor in the stack or, if this is the last one, the action. This means that the interceptor has the power of short-circuiting the action invocation and return a result string without executing the action at all! Use this with caution, though.

- -

One other thing that interceptors can do is execute code after the action has executed. To do that, just place code after the invocation.invoke() call. WebWork provides an abstract class that already implements this kind of behaviour: com.opensymphony.xwork.interceptor.AroundInterceptor. Just extend it and implement the methods before(ActionInvocation invocation) and after(ActionInvocation dispatcher, String result).

- -

The xwork.xml configuration, the action class and the result page are pretty straightforward and require no further explanation.

-

Try the example\!

- -
- -
- - diff --git a/docs/wikidocs/Understanding interceptors_attachments/overview.png b/docs/wikidocs/Understanding interceptors_attachments/overview.png deleted file mode 100644 index a116c7b2b..000000000 Binary files a/docs/wikidocs/Understanding interceptors_attachments/overview.png and /dev/null differ diff --git a/docs/wikidocs/Understanding results.html b/docs/wikidocs/Understanding results.html deleted file mode 100644 index 60a3b5ef8..000000000 --- a/docs/wikidocs/Understanding results.html +++ /dev/null @@ -1,72 +0,0 @@ - - - WebWork - - Understanding results - - - - - - - - - - -
-

A result is a piece of code that is executed after your action has already completed and returned a value such as success or error. But WebWork comes with most of the result you'll need, for example: such as "servlet dispatcher," used for JSPs, and Velocity as well as alternative results such as FreeMarker and Jasper Reports (in PDF, XML, and HTML).

-
-
<action name="form03" class="lessons.Form03Action">
-      <result name="success" type="dispatcher">page03-success.jsp</result>
-      <result name="error" type="dispatcher">page03-error.jsp</result>
-</action>
-
-

 

- -

As you can see, that result configuration is made up of two parts: result mappings, which you've already seen associated with an action mapping, and result types.

- -

Configuring result types

- -

Every package in WebWork can be associated with one or more result types.

-
-
<xwork>
-   <include name="webwork-default.xml"/>
-   <package name="default" extends="webwork-default">
-
-      <result-types>
-        <result-type name="dispatcher" class="..." default="true"/>
-        <result-type name="redirect" class="..."/>
-      </result-types>
-
-      <default-interceptor-ref name="defaultStack"/>
-
-      <action name="login"
-           class="org.hibernate.auction.web.actions.users.Login">
-        <result name="input">login.jsp</result>
-        <result name="success"
-           type="redirect">/secure/dashboard.action</result>
-     </action>
-   </package>
-</xwork>
-
-

 

- -

Reducing configuration duplication with global result mappings

- -

Another way to reduce the amount of configuration in xwork.xml is through the use of global result mappings. Web applications often have a common set of results that are used across many actions. Common results include redirects to login actions and permission-denied pages. Rather than define each of these results in every action mapping, WebWork lets you centralize the definitions for the common pages.

-
-
<package name="default" extends="webwork-default">
-   <global-results>
-      <result name="login"
-         type="redirect">/login!default.action</result>
-      <result name="unauthorized">/unauthorized.jsp</result>
-   </global-results>
-   <!-- other package declarations -->
-</package>
-
-

 
Be Careful

-Because global reseults are searched after local results, you can override any global result mapping by creating a local result mapping for a specific action. Recall that results can point to locations using relative or absolute paths. Because you may not know the context in which they're being invoked, it's best to use absolute paths for global results.

- -
- - diff --git a/docs/wikidocs/Understanding validation.html b/docs/wikidocs/Understanding validation.html deleted file mode 100644 index b8a920d70..000000000 --- a/docs/wikidocs/Understanding validation.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Understanding validation - - - - - - - - - - -
-

In absence of product documentation in this area, you can have a look at excellent article entitled Webwork Validation on java.net.

- -
- - diff --git a/docs/wikidocs/Upgrading from 1.4.html b/docs/wikidocs/Upgrading from 1.4.html deleted file mode 100644 index 52f3cb15b..000000000 --- a/docs/wikidocs/Upgrading from 1.4.html +++ /dev/null @@ -1,232 +0,0 @@ - - - WebWork - - Upgrading from 1.4 - - - - - - - - - - -
-

Package changes

-

Webwork1.x was seperated into two projects, XWork and Webwork. From this, several classes have been moved to different package names.

-
    -
  • ActionSupport has moved from webwork.ActionSupport to com.opensymphony.xwork.ActionSupport -
      -
    • doExecute() no longer exists, override execute()
    • -
    • the methods addError and addErrorMessage are now addFieldError and addActionError respectively
    • -
    -
  • -
- - -

Configuration changes

- -
    -
  • actions.xml/views.properties needs to be converted to xwork.xml
    -If you're using an actions.xml file to configure your webwork 1, you can use the attached XSLT to convert the actions.xml file to a vanilla xwork.xml file.
    -To apply this XSLT, you'll need to do the following:
    -Get a copy of the XSLT. You can find the latest version in CVS in webwork/src/etc/actions.xsl . Next, find yourself an XSLT rendering engine. Xalan is a good choice and can be found at http://xml.apache.org/xalan-j/index.html
    -Finally, do the conversion.
  • -
- - -
-
java org.apache.xalan.xslt.Process -IN actions.xml -XSL actions.xsl -OUT xwork.xml
-
- -

Remember that you'll need to Xalan libraries in your classpath to run the above command.
-If you want to look at these pages directly in your browser, I recommend user Internet Explorer as it automagically formats XML documents reasonably. There one caveat though. WW1 had a way to shorten the declaration of actions by allowing you to specify a package prefix in webwork.properties file. Since this information is outside the actions.xml file, the XSLT is unable to take advantage of it. Consequently, you might need to edit the xwork.xml file to update the class names.

- - -

WebWork 1.x configuration used a pull paradigm to load action configurations when they are asked for, whereas WebWork2 builds the configuration up-front to make the configuration queryable. The webwork.MigrationConfiguration must therefore act as an adapter between these two paradigms. It does this by returning a custom RuntimeConfiguration which first tries the default XWork Configuration (which, by default, loads configuration information from a file named "xwork.xml" in the root of the classpath) and then attempts to load action configuration using the Configuration classes from WebWork 1.x. In this way, an application can be slowly converted over to WebWork2 while reusing the configuration and Actions from a WebWork 1.x application. One caveat in this is that your migrated application MUST be rebuilt against the WebWork2 and migration jar files, as the classloader will rightly recognize that the webwork.Action and webwork.ActionSupport in WebWork 1.x are not the same as those provided by the migration jar files. Other than that, it should be seamless (and let us know if it isn't).

- -

If the webwork.MigrationRuntimeConfiguration does not find the action configuration using the RuntimeConfiguration from the supplied RuntimeConfiguration (which is acquried from the Xwork DefaultConfiguration and will load configurations from all of the sources configured for XWork / WebWork2), it will build an ActionConfiguration by instantiating an Action using the ActionFactories from WebWork 1.x. The ActionFactory stack used is a subset of the default ActionFactory stack used in WebWork 1.x:

- -
-
factory = new JavaActionFactory();
-        factory = new ScriptActionFactoryProxy(factory);
-        factory = new XMLActionFactoryProxy(factory);
-        factory = new PrefixActionFactoryProxy(factory);
-        factory = new JspActionFactoryProxy(factory);
-        factory = new CommandActionFactoryProxy(factory);
-        factory = new AliasingActionFactoryProxy(factory);
-        factory = new CommandActionFactoryProxy(factory);
-        factory = new ContextActionFactoryProxy(factory);
-
- -

Some of the ActionFactory classes have been left out as they are handled by Interceptors in WebWork2. If the Action instance is created (meaning that the configuration has been found in the webwork.properties or actions.xml files used by the WebWork 1.x configuration classes) a parameter Map is created by introspecting the Action instance. A Map is needed for results and, again, WebWork 1.x used a pull paradigm to find results when they were needed, so a LazyResultMap is created which extends HashMap and overrides get() to look up the Result configuration if it has not previously been loaded. If the result ends in the Action suffix (defaulting to ".action"), then a ChainingResult is created, otherwise a ServletDispatcherResult is created. Using the Action class of the instantiated Action, the Map of parameters introspected from the Action instance, and the LazyResultMap, a new ActionConfig is created. The ActionConfig is saved into a special Package, "webwork-migration", so that it will pick up the default Interceptor stack defined for that package. The "webwork-migration" package is defined in a webwork-migration.xml file which is included in the migration jar file and which is automatically added to the Xwork configuration providers when the MigrationConfiguration is used:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
-
-<xwork>
-    <include file="webwork-default.xml"/>
-    <package name="webwork-migration" abstract="true" extends="webwork-default">
-        <interceptors>
-            <interceptor-stack name="migrationStack">
-                <interceptor-ref name="timer"/>
-                <interceptor-ref name="logger"/>
-                <interceptor-ref name="chain"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="prepare"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="workflow"/>
-            </interceptor-stack>
-        </interceptors>
-        <default-interceptor-ref name="migrationStack"/>
-    </package>
-</xwork>
-
- -

Here we can see that a number of the functions previously performed by ActionFactories in WebWork 1.x are now replaced by Interceptors in WebWork2, including the parameters, the chaining, calling prepare(), and the workflow (which was formerly implemented in ActionSupport in WebWork 1.x).

- -

By creating and saving the ActionConfig in the PackageConfig for the "webwork-migration" package, the ActionConfig for the migrated Action is available for future calls, obviating the need to re-parse the old configuration files and making the configuration for the Action available for querying via the configuration API for tools such as the configuration browser.

- - -

Tag Changes

-

The biggest change is the use of OGNL for accessing object properties. Properties are no longer accessed with a forward slash "/" but with a dot "." Also, rather than using ".." to traverse down the stack, we now use "[n]" 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 "@foo", but now special variables are accessed using "#foo". However, it is important to note that "#foo" does NOT access the request attributes. "#foo" is merely a request to another object in the OgnlContext other than the root. See OGNL reference for more details.

- -

Also see JSP Expression Language Comparison with WebWork 1.x for a table of the expression language changes.

- -

property tag

- -

The property tag is now only used to print out values from the stack. In WW1, it was also used to set a variable in the scope, and to push properties to the top of the stack. These functions are now performed by the set and push tags.

- -

action tag

- -

The action tag does not evaluate the body section any more and does not push the executed action onto the ValueStack. Instead, use the "id" attribute to assign a name to the action and reference it as "#id".

- -

Examples

- -

Lets enumerate some examples of differences between code snips using WW:WebWork and WW:WebWork.

- -
    -
  • New JSP syntax
  • -
- - -

There are numerous changes in syntax. First of all there are new tags and secondly there is a new expression language. Here's a small example:

- -

Webwork 1

-
-
<ww:property value="a/b">
-  <ww:property value="foo" />
-</ww:property>
-
-

Webwork 2

-
-
<ww:push value="a.b">
-  <ww:property value="foo" />
-</ww:push>
-
- -

One can note that the "push" tag doesn't just push it pops too at the end of the tag. Surprise! Also note the "." instead of the "/" for traversing object properties.

- -
    -
  • List errors posted by an Action
    -Webwork 1 -
    -
    <webwork:if test="hasErrorMessages == true">
    -  ERROR:<br />
    -  <font color="red">
    -    <webwork:iterator value="errorMessages">
    -      <webwork:property/><br />
    -    </webwork:iterator>
    -  </font>
    -</webwork:if>
    -
    -

    Webwork 2

    -
    -
    <webwork:if test="hasErrors()">
    -  ERROR:<br />
    -  <font color="red">
    -    <webwork:iterator value="actionErrors">
    -      <webwork:property/><br />
    -    </webwork:iterator>
    -  </font>
    -</webwork:if>
    -
  • -
- - - -

Update your web.xml file

-
    -
  • If you're using Velocity for views, you'll need to make sure you have the following snippet. Specifically note that the <load-on-startup> tag is now required so that the servlet can initialize some important Velocity properties. -
    -
    <servlet>
    -    <servlet-name>velocity</servlet-name>
    -    <servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class>
    -    <load-on-startup>1</load-on-startup>
    -</servlet>
    -
  • -
- - -
    -
  • Set the property webwork.velocity.configfile in your _webwork.properties_. For example: -
    -
    webwork.velocity.configfile=velocity.properties
    -
  • -
- - -

WebWork will use this file to initialize the Velocity engine. The search path for the file is:

-
    -
  1. context root (web root)
  2. -
  3. WEB-INF/
  4. -
  5. classpath
  6. -
- - - -
    -
  • Additional Steps:
  • -
-
    -
  1. If you used the <ww:action taglib in 1.3... you used to refernece the java Action classname. In 2.x this reference is now the action name not the class. you will need to change all your old references in your view.
  2. -
- - -

ResultException doesn't exist anymore

- -

It might be possible to copy WW1's ResultException, and write an Interceptor that catches the ResultExceptions and add the result of getMessage() to the actionErrors of the
-executed Action and return ResultException.getResult().

- -

Maybe it would be possible to include ResultException in WW2 too to make migration easier?!

-

DateFormatter doesn't exist anymore

-

It can be replaced by directly using java.text.DateFormat

-

addError(String, String) in webwork.action.ActionSupport has been removed

- -

The new method to use is addFieldError(String, String).

-

addErrorMessage(String) in webwork.action.ActionSupport has been removed

- -

The new method is now addActionError(String).

-

webwork.util.ValueStack has been removed

- -

The ValueStack is com.opensymphony.xwork.util.OgnlValueStack

- -

The old methods pushValue and popValue are renamed to simply push and
-pop.

- -

An instance of the ValueStack can be obtained by using ActionContext.getContext().getValueStack instead of the old ValueStack.getStack().

-

*Aware-Interfaces have been removed

- -

Instead of implementing ServletRequestAware etc the
-[Servlet]ActionContext.getXXX-methods can be used to obtain application-map, request, response etc.

-

CommandDriven interface removed

- -

The CommandDriven interface is removed. It is not neccesary to implement a special interface when working with commands anymore. Use the method attribute in your action-Element in xwork.xml to tell xwork which method to invoke on your action.

-

isCommand(String) method has been removed

- -

You can see which alias you're accessing by doing this: ActionContext.getContext().getActionInvocation().getProxy().getActionName()

- -
- - diff --git a/docs/wikidocs/Upgrading from 2.0.html b/docs/wikidocs/Upgrading from 2.0.html deleted file mode 100644 index 799dad5b0..000000000 --- a/docs/wikidocs/Upgrading from 2.0.html +++ /dev/null @@ -1,26 +0,0 @@ - - - WebWork - - Upgrading from 2.0 - - - - - - - - - - -
-

Upgrading from Webwork 2.0 is rather trivial. This version of webwork adds enhancements and bug fixes with hardly any configuration or syntax changes. Follow these two simple steps and you should be on your way with the latest and greatest from the OS crew.

- -
    -
  1. Update/Replace your current binaries with the new binaries located in the distribution download under the lib/core. You may also want to grab any related jars from the lib/optional folder. Don't forget the webwork binary webwork-2.1.jar in the base directory of the distribution download. Review the Dependencies for Webwork.
  2. -
  3. Check out the Release Notes \- 2.1 to see if any of changes need to be applied to your code base.
  4. -
- - -
- - diff --git a/docs/wikidocs/Upgrading from 2.1.1.html b/docs/wikidocs/Upgrading from 2.1.1.html deleted file mode 100644 index d00eb616b..000000000 --- a/docs/wikidocs/Upgrading from 2.1.1.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Upgrading from 2.1.1 - - - - - - - - - - -
-

Upgrading from 2.1.1 to 2.1.2 is very easy. Simply copy over the new webwork.jar file and make sure you are running all the correct Dependencies – especially make sure you are using XWork 1.0.3.

- -
- - diff --git a/docs/wikidocs/Upgrading from 2.1.2.html b/docs/wikidocs/Upgrading from 2.1.2.html deleted file mode 100644 index c4456869e..000000000 --- a/docs/wikidocs/Upgrading from 2.1.2.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Upgrading from 2.1.2 - - - - - - - - - - -
-

Upgrading from 2.1.2 to 2.1.3 is very easy. Simply copy over the new webwork.jar. There have been no new dependencies.

- -
- - diff --git a/docs/wikidocs/Upgrading from 2.1.3.html b/docs/wikidocs/Upgrading from 2.1.3.html deleted file mode 100644 index 9830a1f08..000000000 --- a/docs/wikidocs/Upgrading from 2.1.3.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Upgrading from 2.1.3 - - - - - - - - - - -
-

Since this release is merely a preview release of the new tag syntax (see Release Notes \- 2.1.4) and no other changes have been made, simply copying over the new webwork jar file is all that is needed to upgrade. No other libraries have changed.

- -
- - diff --git a/docs/wikidocs/Upgrading from 2.1.4.html b/docs/wikidocs/Upgrading from 2.1.4.html deleted file mode 100644 index b619e7193..000000000 --- a/docs/wikidocs/Upgrading from 2.1.4.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Upgrading from 2.1.4 - - - - - - - - - - -
-

Upgrading from 2.1.4 is pretty easy as no new libraries have been introduced. However, the TLD (taglib definition file) has been modified to support more JavaScript events, such as onBlur, onChange, etc. Be sure to check that you are using the latest TLD. This is automatic if you point web.xml to /WEB-INF/webwork.jar.

- -
- - diff --git a/docs/wikidocs/Upgrading from 2.1.5.html b/docs/wikidocs/Upgrading from 2.1.5.html deleted file mode 100644 index d8b6a4284..000000000 --- a/docs/wikidocs/Upgrading from 2.1.5.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Upgrading from 2.1.5 - - - - - - - - - - -
-

Upgrading from 2.1.5 to 2.1.6 requires that you copy over the new webwork-2.1.6.jar and xwork-1.0.4.jar. Note that WebWork 2.1.6 includes a new version of XWork, version 1.0.4.

- -
- - diff --git a/docs/wikidocs/Upgrading from 2.1.html b/docs/wikidocs/Upgrading from 2.1.html deleted file mode 100644 index 1f42036ba..000000000 --- a/docs/wikidocs/Upgrading from 2.1.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - Upgrading from 2.1 - - - - - - - - - - -
-

Upgrading from 2.1 to 2.1.1 is very easy. Simply copy over the new webwork.jar file and make sure you are running all the correct Dependencies.

- -
- - diff --git a/docs/wikidocs/UrlValidator Annotation.html b/docs/wikidocs/UrlValidator Annotation.html deleted file mode 100644 index 5e65c9f14..000000000 --- a/docs/wikidocs/UrlValidator Annotation.html +++ /dev/null @@ -1,74 +0,0 @@ - - - WebWork - - UrlValidator Annotation - - - - - - - - - - -
-

UrlValidator Annotation

- -

This validator checks that a field is a valid URL.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -
-
@UrlValidator(message = "Default message", key = "i18n.key", shortCircuit = true)
-
- - -
- - diff --git a/docs/wikidocs/Using Checkboxes - EditAction.java.html b/docs/wikidocs/Using Checkboxes - EditAction.java.html deleted file mode 100644 index e0d2481ce..000000000 --- a/docs/wikidocs/Using Checkboxes - EditAction.java.html +++ /dev/null @@ -1,77 +0,0 @@ - - - WebWork - - Using Checkboxes - EditAction.java - - - - - - - - - - -
-
-
package cash.action;
-
-import org.apache.log4j.Logger;
-
-import cash.config.ConfigManager;
-import cash.model.User;
-import cash.util.HibernateUtil;
-import cash.validator.PasswordFormatValidator;
-
-import net.sf.hibernate.LockMode;
-
-/**
- * Edit a user
- * @author Joel Hockey
- * @version $Id: Using\040Checkboxes\040-\040EditAction.java.html,v 1.14 2006/03/23 21:05:25 rgielen Exp $
- */
-public class EditAction extends HibernateAction {
-    private static final Logger LOG = Logger.getLogger(EditAction.class);
-
-    private User m_user = new User();
-    private String m_repeatPassword;
-
-    /** return user to be edited. */
-    public User getUser() { return m_user; }
-
-    /** @param pwd repeat of password */
-    public void setRepeatPassword(String pwd) { m_repeatPassword = pwd; }
-    /** @return repeat password */
-    public String getRepeatPassword() { return m_repeatPassword; }
-
-    /** override super */
-    public String execute() throws Exception {
-        LOG.debug("EditAction started");
-
-        // get original user from session, check that password is valid, update and save.
-        User u = (User)get("user");
-        HibernateUtil.currentSession().lock(u, LockMode.NONE);
-
-        // check that password has actually changed before updating
-        if (!PasswordFormatValidator.PASSWORD_MASK.equals(m_user.getPassword())) {
-            if (!u.changePassword(m_user.getPassword())) {
-                addFieldError("user.password", "password must be different to previous "
-                    + ConfigManager.getConfig().getUser().getNoRepeatHistory() + " passwords");
-                return INPUT;
-            }
-        }
-
-        m_user.copy(u);
-        HibernateUtil.currentSession().save(u);
-        User loginUser = (User)get(LoginAction.LOGIN_USER);
-        if (u.getId() == loginUser.getId()) {
-            set(LoginAction.LOGIN_USER, u);
-        }
-        return SUCCESS;
-    }
-}
-
- -
- - diff --git a/docs/wikidocs/Using Checkboxes - User.java.html b/docs/wikidocs/Using Checkboxes - User.java.html deleted file mode 100644 index 0c3e34f00..000000000 --- a/docs/wikidocs/Using Checkboxes - User.java.html +++ /dev/null @@ -1,624 +0,0 @@ - - - WebWork - - Using Checkboxes - User.java - - - - - - - - - - -
-
-
package cash.model;
-
-import net.sf.hibernate.HibernateException;
-
-import org.apache.log4j.Logger;
-
-import java.security.GeneralSecurityException;
-import java.security.MessageDigest;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TimeZone;
-import java.util.TreeSet;
-
-import cash.config.ConfigManager;
-import cash.util.Hex;
-import cash.util.HibernateUtil;
-import cash.util.UtcDate;
-import cash.validator.PasswordFormatValidator;
-
-/**
- * Represents a User object.  Clients of this class should instantiate a User object with the
- * multi-arg constructor rather than using setters.
- *
- * @author Joel Hockey
- * @version $Id: Using\040Checkboxes\040-\040User.java.html,v 1.14 2006/03/23 21:05:25 rgielen Exp $
- * @hibernate.class
- *      table="user"
- *      dynamic-update="true"
- *      optimistic-lock="version"
- */
-public class User implements java.io.Serializable {
-    private static final Logger LOG = Logger.getLogger(User.class);
-
-    private static MessageDigest s_md5;
-    private static SecureRandom s_random;
-
-    private static final int MAX_LOGIN_FAILURE_COUNT = 20;
-    private static final boolean RESET_LOCKED_OUT_AFTER_TIME = true;
-    private static final long RESET_LOCKED_OUT_TIME = 1 * 60 * 60 * 1000; // 1 hour
-
-    private int m_id;
-    private int m_version;
-    private String m_username;
-    private String m_password;
-    private Date m_passwordChangeDate;
-    private String m_hashedPassword;
-    private SortedSet m_passwordHistory = new TreeSet();
-    private String m_salt;
-    private byte[] m_saltBytes;
-    private Date m_createDate;
-    private String m_email;
-    private Locale m_locale;
-    private TimeZone m_timeZone;
-    private String m_telephone;
-    private Date m_lastSuccessfulLogin;
-    private String m_lastSuccessfulLoginIp;
-    private Date m_lastFailedLogin;
-    private String m_lastFailedLoginIp;
-    private int m_loginFailureCount;
-    private int m_maxLoginFailureCount = MAX_LOGIN_FAILURE_COUNT;
-    private boolean m_resetLockedOutAfterTime = RESET_LOCKED_OUT_AFTER_TIME;
-    private long m_resetLockedOutTime = RESET_LOCKED_OUT_TIME;
-    private boolean m_lockedOut = false;
-    private boolean m_disabled = false;
-    private boolean m_isSuperUser = false;
-    private boolean m_passwordNeverExpires = false;
-    private Set m_privileges = new HashSet();
-
-    static {
-        try {
-            s_md5 = MessageDigest.getInstance("MD5");
-            s_random = SecureRandom.getInstance("SHA1PRNG");
-        } catch (GeneralSecurityException gse) {
-            // shouldn't happen
-            LOG.error("Error creating MD5 or SHA1PRNG", gse);
-            throw new RuntimeException("Error creating MD5 or SHA1PRNG");
-        }
-    }
-
-    /** default constructor for Hibernate */
-    public User() { }
-
-    /**
-     * Create a User.
-     *
-     * @param username The username for logging in
-     * @param password The user's password
-     * @param email The user's email
-     * @throws InvalidPasswordException if password is invalid.
-     */
-    public User(String username, String password, String email) throws InvalidPasswordException {
-
-        m_username = username;
-
-        // password
-        initSalt();
-        if (!PasswordFormatValidator.checkPasswordFormat(password)) {
-            throw new InvalidPasswordException();
-        }
-        m_hashedPassword = hashPassword(password);
-
-        m_createDate = UtcDate.createUtcDate();
-        m_email = email;
-        m_locale = Locale.getDefault();
-        m_timeZone = TimeZone.getDefault();
-    }
-
-    /** @param id The id to set */
-    public void setId(int id) { m_id = id; }
-
-    /**
-     * @return unique id of this User.  Generated by DB.
-     * @hibernate.id
-     *      generator-class="native"
-     */
-    public int getId() { return m_id; }
-
-    /** @param version The version of this object */
-    public void setVersion(int version) { m_version = version; }
-
-    /**
-     * @return version of this object
-     * @hibernate.version
-     */
-    public int getVersion() { return m_version; }
-
-    /** @param username The username to set */
-    public void setUsername(String username) { m_username = username; }
-
-    /**
-     * @return username
-     * @hibernate.property
-     *      length="32"
-     *      unique="true"
-     *      not-null="true"
-     */
-    public String getUsername() { return m_username; }
-
-    /**
-     * Set's the user's password without updating history or checking validity.
-     * This should only be used at User creation time, and password validity
-     * should be checked externally to this method.
-     * Do not use to update password, see {@link #changePassword(String)}
-     * @param password user's password
-     */
-    public void setPassword(String password) {
-        m_password = password;
-        if (m_salt == null) {
-            initSalt();
-        }
-        m_hashedPassword = hashPassword(password);
-        m_passwordChangeDate = UtcDate.createUtcDate();
-    }
-
-    /**
-     * This method is provided to help at User creation time.  It will only return
-     * valid values if {@link #setPassword(String)} has already been called.
-     * @return plaintext password.
-     */
-    public String getPassword() { return m_password; }
-
-    /** @param time Date (UTC) user last changed password. */
-    public void setPasswordChangeDate(Date time) { m_passwordChangeDate = time; }
-
-    /**
-     * @return UTC date of last password change
-     * @hibernate.property
-     *      type="cash.model.TimestampType"
-     *      length="23"
-     */
-    public Date getPasswordChangeDate() { return m_passwordChangeDate; }
-
-    /**
-     * Sets the user's hashed password.  This method is provided only for the use
-     * of hibernate.  Users of this class should not call this method.
-     * Use the {@link #setPassword(String)} method to set the plaintext password.
-     * @param hash The hashed password to set
-     */
-    public void setHashedPassword(String hash) {
-        m_hashedPassword = hash;
-    }
-
-    /**
-     * @return hashed password
-     * @hibernate.property
-     *      column="pwd"
-     *      length="32"
-     *      not-null="true"
-     */
-    public String getHashedPassword() { return m_hashedPassword; }
-
-    /**
-     * @param oldPasswords The last n passwords, where n
-     * is defined as noRepeatHistory in User configuration.  Passwords are ordered
-     * in descending order of creation.
-     */
-    public void setPasswordHistory(SortedSet oldPasswords) { m_passwordHistory = oldPasswords; }
-
-    /**
-     * @return Password history
-     * @hibernate.set
-     *      lazy="true"
-     *      sort="cash.model.PasswordHistory"
-     *      inverse="true"
-     *      cascade="all"
-     * @hibernate.collection-key
-     *      column="userId"
-     * @hibernate.collection-one-to-many
-     *      class="cash.model.PasswordHistory"
-     */
-    public SortedSet getPasswordHistory() { return m_passwordHistory; }
-
-    /** @param random The random salt to be used with password */
-    public void setSalt(String random) {
-        m_salt = random;
-        m_saltBytes = Hex.fromString(random);
-    }
-
-    /**
-     * @return random salt used with password
-     * @hibernate.property
-     *      length="32"
-     *      not-null="true"
-     */
-    public String getSalt() { return m_salt; }
-
-    /** @param time create date */
-    public void setCreateDate(Date time) { m_createDate = time; }
-
-    /**
-     * @return Date in UTC user was created.
-     * @hibernate.property
-     *      update="false"
-     *      not-null="true"
-     *      type="cash.model.TimestampType"
-     *      length="23"
-     */
-    public Date getCreateDate() { return m_createDate; }
-
-    /** @param email User's email */
-    public void setEmail(String email) { m_email = email; }
-
-    /**
-     * @return User's email
-     * @hibernate.property
-     *      length="255"
-     *      not-null="true"
-     */
-    public String getEmail() { return m_email; }
-
-    /** @param locale The User's locale.  This should be a 2 character field. */
-    public void setLocale(Locale locale) { m_locale = locale; }
-
-    /**
-     * @return User's locale.  Uses 2 character ISO-something value.
-     * @hibernate.property
-     *      not-null="true"
-     */
-    public Locale getLocale() { return m_locale; }
-
-    /** @param timeZone User's time zone */
-    public void setTimeZone(TimeZone timeZone) { m_timeZone = timeZone; }
-
-    /**
-     * @return User's timezone
-     * @hibernate.property
-     *      not-null="true"
-     */
-    public TimeZone getTimeZone() { return m_timeZone; }
-
-    /** @param telephone User's telephone */
-    public void setTelephone(String telephone) { m_telephone = telephone; }
-
-    /**
-     * @return Telephone of user
-     * @hibernate.property
-     *      length="16"
-     */
-    public String getTelephone() { return m_telephone; }
-
-    /** @param time user's last successful login date in UTC. */
-    public void setLastSuccessfulLogin(Date time) { m_lastSuccessfulLogin = time; }
-
-    /**
-     * @return UTC date of last successful login
-     * @hibernate.property
-     *      type="cash.model.TimestampType"
-     *      length="23"
-     */
-    public Date getLastSuccessfulLogin() { return m_lastSuccessfulLogin; }
-
-    /** @param ip IP address used for user's last successful login. */
-    public void setLastSuccessfulLoginIp(String ip) { m_lastSuccessfulLoginIp = ip; }
-
-    /**
-     * @return IP address used for last successful login
-     * @hibernate.property
-     */
-    public String getLastSuccessfulLoginIp() { return m_lastSuccessfulLoginIp; }
-
-    /** @param time user's last failed login date in UTC. */
-    public void setLastFailedLogin(Date time) { m_lastFailedLogin = time; }
-
-    /**
-     * @return UTC date of last failed login
-     * @hibernate.property
-     *      type="cash.model.TimestampType"
-     *      length="23"
-     */
-    public Date getLastFailedLogin() { return m_lastFailedLogin; }
-
-    /** @param ip IP address used for user's last failed login. */
-    public void setLastFailedLoginIp(String ip) { m_lastFailedLoginIp = ip; }
-
-    /**
-     * @return IP address used for last failed login
-     * @hibernate.property
-     */
-    public String getLastFailedLoginIp() { return m_lastFailedLoginIp; }
-
-    /**
-     * Sets the number of times that a user has failed when attempting to login.
-     * This value is reset when a user logs in successfully, or their account is reset.
-     * @param count the value to set.
-     */
-    public void setLoginFailureCount(int count) { m_loginFailureCount = count; }
-
-    /**
-     * @return The number of times that a user has failed when attempting to login.
-     *  This value is reset when a user logs on successfully, or their account is reset.
-     * @hibernate.property
-     */
-    public int getLoginFailureCount() { return m_loginFailureCount; }
-
-    /**
-     * @param count The maximum number of times that a user may fail to login before
-     * their account is locked out
-     */
-    public void setMaxLoginFailureCount(int count) { m_maxLoginFailureCount = count; }
-
-    /**
-     * @return The maximum number of times that a user may fail to login before their account
-     * is locked out.
-     * @hibernate.property
-     */
-    public int getMaxLoginFailureCount() { return m_maxLoginFailureCount; }
-
-    /**
-     * @param reset Whether this user's account will be unlocked after a specified time when it is locked
-     * due to login failure.
-     * @see #setResetLockedOutAfterTime(boolean) setResetLockedOutAfterTime
-     */
-    public void setResetLockedOutAfterTime(boolean reset) { m_resetLockedOutAfterTime = reset; }
-
-    /**
-     * @return Whether this user's account will be unlocked after a specified time when it
-     * is locked out due to login failure.
-     * @see #getResetLockedOutAfterTime getResetLockedOutAfterTime
-     * @hibernate.property
-     */
-    public boolean getResetLockedOutAfterTime() { return m_resetLockedOutAfterTime; }
-
-    /**
-     * @param time The time in millis between login attempts before login failure count is reset.  Login failure
-     * count will only be reset if the Reset Locked Out After Time boolean is set to true.
-     */
-    public void setResetLockedOutTime(long time) { m_resetLockedOutTime = time; }
-
-    /**
-     * @return Time in milliseconds before account is auto-reset after login lockout.
-     * @hibernate.property
-     */
-    public long getResetLockedOutTime() { return m_resetLockedOutTime; }
-
-    /** @param lockedOut User's locked out status. */
-    public void setLockedOut(boolean lockedOut) { m_lockedOut = lockedOut; }
-
-    /**
-     * @return Whether this user's account is locked out
-     * @hibernate.property
-     */
-    public boolean isLockedOut() { return m_lockedOut; }
-
-    /** @param disabled User's disabled status. */
-    public void setDisabled(boolean disabled) { m_disabled = disabled; }
-
-    /**
-     * @return Whether this user's account disabled
-     * @hibernate.property
-     */
-    public boolean isDisabled() { return m_disabled; }
-
-    /** @param superUser True if user is super user */
-    public void setSuperUser(boolean superUser) { m_isSuperUser = superUser; }
-
-    /**
-     * @return Whether this user is a super user
-     * @hibernate.property
-     */
-    public boolean isSuperUser() { return m_isSuperUser; }
-
-    /** @param expires True if user's password never expires */
-    public void setPasswordNeverExpires(boolean expires) { m_passwordNeverExpires = expires; }
-
-    /**
-     * @return Whether this user's password ever expires
-     * @hibernate.property
-     */
-    public boolean getPasswordNeverExpires() { return m_passwordNeverExpires; }
-
-    /** @param privs Set of privileges for this user  */
-    public void setPrivileges(Set privs) { m_privileges = privs; }
-
-    /**
-     * @return Set of Privileges for this User.
-     * @hibernate.set
-     *      table="user_priv"
-     *      lazy="true"
-     *      cascade="all"
-     * @hibernate.collection-key
-     *      column="userId"
-     * @hibernate.collection-element
-     *      column="priv"
-     *      type="string"
-     */
-    public Set getPrivileges() { return m_privileges; }
-
-    /** convenience method of OGNL */
-    public void setPriv(String[] privs) {
-        for (int i = 0; i < privs.length; i++) {
-            m_privileges.add(privs[i]);
-        }
-    }
-
-
-// other methods
-
-    /**
-     * Changes the user's password.  Password must meet criteria
-     * defined in configuration.  The user's password will be appended to
-     * a random 20 byte salt and then hashed using MD5 to create the
-     * value that will be stored in the DB.  The current Hibernate Session
-     * will be used to update pwd history.
-     *
-     * @param password The password to set
-     * @return true if password is changed, false if password was not changed
-     * because it did not meet password requirements.
-     * @throws HibernateException if error updating password history
-     */
-    public boolean changePassword(String password) throws HibernateException {
-        // check format
-        if (!PasswordFormatValidator.checkPasswordFormat(password)) {
-            return false;
-        }
-
-        // check history
-        // first check current password
-        String hashedPwd = hashPassword(password);
-        LOG.debug("checking if password is same as current");
-        if (hashedPwd.equals(m_hashedPassword)) {
-            LOG.info("password is same as current password");
-            return false;
-        }
-
-        LOG.debug("checking if password exists in history.  History size is " + m_passwordHistory.size());
-        for (Iterator i = getPasswordHistory().iterator(); i.hasNext(); ) {
-            PasswordHistory ph = (PasswordHistory)i.next();
-            if (hashedPwd.equals(ph.getHashedPassword())) {
-                LOG.info("password already used as one of last "
-                    + ConfigManager.getConfig().getUser().getNoRepeatHistory());
-                return false;
-            }
-        }
-
-        // add current pwd to history and truncate history if it is too long now
-        PasswordHistory ph = new PasswordHistory(this, m_hashedPassword);
-        m_passwordHistory.add(ph);
-        LOG.debug("saving old password into password history");
-        HibernateUtil.currentSession().save(ph);
-        // compare to (noRepeat - 1) because we are checking current as part of history
-        if (m_passwordHistory.size() > ConfigManager.getConfig().getUser().getNoRepeatHistory() - 1) {
-            PasswordHistory toRemove = (PasswordHistory)m_passwordHistory.first();
-            LOG.info("Removing password history object for user " + m_username
-                    + " created: " + toRemove.getCreateDate());
-            m_passwordHistory.remove(toRemove);
-            HibernateUtil.currentSession().delete(toRemove);
-        }
-
-        // now set password and date
-        m_hashedPassword = hashedPwd;
-        m_passwordChangeDate = UtcDate.createUtcDate();
-        return true;
-    }
-
-    /**
-     * Hashes input pwd to see if it equals stored pwd hash value.
-     * @param pwd Password to check
-     * @return true if passwords are equal.
-     */
-
-    public boolean passwordEquals(String pwd) {
-        String hash = hashPassword(pwd);
-        return m_hashedPassword.equalsIgnoreCase(hash);
-    }
-
-    /**
-     * Hashes salt and password to produce hashed password.
-     * @param pwd Password to hash
-     * @return Hex encoding of MD5 hash of salt and pwd
-     */
-    private String hashPassword(String pwd) {
-        byte[] pwdBytes = pwd.getBytes();  //TODO:  should an encoding be specified here?
-        byte[] in = new byte[OS:m_saltBytes.length + pwdBytes.length];
-        System.arraycopy(m_saltBytes, 0, in, 0, m_saltBytes.length);
-        System.arraycopy(pwdBytes, 0, in, m_saltBytes.length, pwdBytes.length);
-        byte[] out = s_md5.digest(in);
-        return Hex.toString(out);
-    }
-
-    /** initialises salt */
-    private void initSalt() {
-        m_saltBytes = new byte[OS:16];
-        s_random.nextBytes(m_saltBytes);
-        m_salt = Hex.toString(m_saltBytes);
-    }
-
-    /** @return String representation of User */
-    public String toString() {
-        StringBuffer sb = new StringBuffer(500);
-        sb.append("[").append("ID:").append(m_id)
-        .append(",version:").append(m_version)
-        .append(",hashedPassword:").append(m_hashedPassword)
-        .append(",salt:").append(m_salt)
-        .append(",createDate:").append(m_createDate)
-        .append(",email:").append(m_email)
-        .append(",locale:").append(m_locale)
-        .append(",timeZone:").append(m_timeZone)
-        .append(",telephone:").append(m_telephone)
-        .append(",lastSuccessfulLogin:").append(m_lastSuccessfulLogin)
-        .append(",lastSuccessfulLoginIp:").append(m_lastSuccessfulLoginIp)
-        .append(",lastFailedLogin:").append(m_lastFailedLogin)
-        .append(",lastFailedLoginIp:").append(m_lastFailedLoginIp)
-        .append(",loginFailureCount:").append(m_loginFailureCount)
-        .append(",maxLoginFailureCount:").append(m_maxLoginFailureCount)
-        .append(",resetLockedOutAfterTime:").append(m_resetLockedOutAfterTime)
-        .append(",resetLockedOutTime:").append(m_resetLockedOutTime)
-        .append(",lockedOut:").append(m_lockedOut)
-        .append(",disabled:").append(m_disabled)
-        .append(",isSuperUser:").append(m_isSuperUser)
-        .append(",passwordNeverExpires:").append(m_passwordNeverExpires)
-        .append(",passwordChangeDate:").append(m_passwordChangeDate)
-        .append(",privs:").append(m_privileges);
-        return sb.toString();
-    }
-
-    /**
-     * Copies editable data from this object to User object provided.  This is used
-     * in Edit actions.  Not all fields are copied, only those that are editable
-     * @param user Object to copy to
-     */
-    public void copy(User user) {
-        user.setUsername(m_username);
-        user.setEmail(m_email);
-        user.setLocale(m_locale);
-        user.setTimeZone(m_timeZone);
-        user.setTelephone(m_telephone);
-        user.setLockedOut(m_lockedOut);
-        user.setDisabled(m_disabled);
-        user.setPasswordNeverExpires(m_passwordNeverExpires);
-
-        // do some smarts for privs removal.  Clear all if more than half are removed
-        if (m_privileges.size() <= user.getPrivileges().size() / 2) {
-            LOG.debug("detected that many privs are removed, clearing all");
-            user.setPrivileges(m_privileges);
-        } else {
-            // find which ones should be removed
-            List toRemove = new ArrayList();
-            for (Iterator i = user.getPrivileges().iterator(); i.hasNext(); ) {
-                String priv = (String)i.next();
-                if (!m_privileges.contains(priv)) {
-                    toRemove.add(priv);
-                }
-            }
-
-            // remove them
-            for (int i = 0; i < toRemove.size(); i++) {
-                user.getPrivileges().remove(toRemove.get(i));
-            }
-
-            // add all new privs
-            for (Iterator i = m_privileges.iterator(); i.hasNext(); ) {
-                user.getPrivileges().add(i.next());
-            }
-        }
-    }
-}
-
- -
- - diff --git a/docs/wikidocs/Using Checkboxes - Velocity and HTML.html b/docs/wikidocs/Using Checkboxes - Velocity and HTML.html deleted file mode 100644 index 7a41f39fc..000000000 --- a/docs/wikidocs/Using Checkboxes - Velocity and HTML.html +++ /dev/null @@ -1,139 +0,0 @@ - - - WebWork - - Using Checkboxes - Velocity and HTML - - - - - - - - - - -
-

Velocity View - edit.vm:

-
-
<html>
-<body onload="document.forms[0].elements[0].focus()">
-
-<a href="home.vm">Home</a><br/>
-
-#if ($fieldErrors)
-  #foreach ($error in $fieldErrors)
-    $error<br>
-  #end
-#end
-#if ($actionErrors)
-  #foreach ($error in $actionErrors)
-    $error<br>
-  #end
-#end
-
-<form name="edit" action="edit.action" method="post">
-<table>
-<tr><td>Name</td><td>$user.username</td></tr>
-#formRowText("Password" "user.password" $stack.findValue("@cash.validator.PasswordFormatValidator@PASSWORD_MASK"))
-#formRowText("Repeat Password" "repeatPassword" $stack.findValue("@cash.validator.PasswordFormatValidator@PASSWORD_MASK"))
-#formRowText("Email" "user.email" $!user.email)
-#formRowSelect("Language" "user.locale" $stack.findValue("@cash.util.Html@getInstance()").getLocales($locale) $!user.locale.toString())
-#formRowSelect("Time Zone" "user.timeZone" $stack.findValue("@cash.util.Html@getInstance()").getTimeZones($locale) $!user.timeZone.ID)
-#formRowText("Telephone" "user.telephone" $!user.telephone)
-#formRowCheckbox("Locked Out" "user.lockedOut" "true" $user.lockedOut)
-#formRowCheckbox("Disabled" "user.disabled" "true" $user.disabled)
-
-
-#set ($privs = [OS:"boss", "admin", "early", "late", "train"])
-
-#foreach ($priv in $privs)
-  #set ($checked = $user.privileges.contains($priv))
-  #formRowCheckbox($priv "user.priv" $priv $checked)
-#end
-<tr><td>&nbsp;</td><td><input type="submit" name="submit" value="submit"></td></tr>
-</table>
-
-<input type="hidden" name="user.username" value="$user.username">
-</form>
-
-</body>
-</html>
-
- -

Velocity Macros - macros.vm:

-
-
#macro (formRowText $label $name $value)
-  <tr><td><label for="$name">$label</label></td><td><input id="$name" type="text" name="$name" value="$!value"></td></tr>
-#end
-
-#macro (formRowSelect $label $name $options $selectedValue)
-  <tr><td><label for="$name">$label</label></td><td><select id="$name" name="$name">
-#foreach ($option in $options)
-<option#if ($option.get(0).equals($selectedValue)) selected#end value="$option.get(0)">$option.get(1)</option>
-#end
-</select></td></tr>
-#end
-
-#macro (formRowCheckbox $label $name $value $checked)
-  <tr><td><label for="$name.$value">$label</label></td><td><input id="$name.$value" type="checkbox" name="$name" value="$value"#if ($checked) checked#end ></td></tr>
-#end
-
- -

Note that I don't use the webwork UI tags. (The HTML that comes out of them looks like vomit.)

- -

The HTML generated from above looks like:

-
-
<html>
-<body onload="document.forms[0].elements[0].focus()">
-
-<a href="home.vm">Home</a><br/>
-
-    
-<form name="edit" action="edit.action" method="post">
-<table>
-<tr><td>Name</td><td>user</td></tr>
-  <tr><td><label for="user.password">Password</label></td><td><input id="user.password" type="text" name="user.password" value="********"></td></tr>
-  <tr><td><label for="repeatPassword">Repeat Password</label></td><td><input id="repeatPassword" type="text" name="repeatPassword" value="********"></td></tr>
-
-  <tr><td><label for="user.email">Email</label></td><td><input id="user.email" type="text" name="user.email" value="user@example.com"></td></tr>
-  <tr><td><label for="user.locale">Language</label></td><td><select id="user.locale" name="user.locale">
-<option value="en">English</option>
-<option selected value="en_AU">English (Australia)</option>
-<option value="en_US">English (United States)</option>
-<option value="en_GB">English (United Kingdom)</option>
-<option value="es">Spanish</option>
-<option value="fr">French</option>
-
-<option value="de">German</option>
-</select></td></tr>
-  <tr><td><label for="user.timeZone">Time Zone</label></td><td><select id="user.timeZone" name="user.timeZone">
-<option selected value="America/Los_Angeles">(GMT-08:00) Los Angeles</option>
-<option value="Europe/London">(GMT+00:00) London</option>
-<option value="Australia/Brisbane">(GMT+10:00) Brisbane</option>
-</select></td></tr>
-  <tr><td><label for="user.telephone">Telephone</label></td><td><input id="user.telephone" type="text" name="user.telephone" value="134"></td></tr>
-  <tr><td><label for="user.lockedOut.true">Locked Out</label></td><td><input id="user.lockedOut.true" type="checkbox" name="user.lockedOut" value="true" ></td></tr>
-
-  <tr><td><label for="user.disabled.true">Disabled</label></td><td><input id="user.disabled.true" type="checkbox" name="user.disabled" value="true" ></td></tr>
-
-
-
-    <tr><td><label for="user.priv.boss">boss</label></td><td><input id="user.priv.boss" type="checkbox" name="user.priv" value="boss" ></td></tr>
-    <tr><td><label for="user.priv.admin">admin</label></td><td><input id="user.priv.admin" type="checkbox" name="user.priv" value="admin" ></td></tr>
-    <tr><td><label for="user.priv.early">early</label></td><td><input id="user.priv.early" type="checkbox" name="user.priv" value="early" ></td></tr>
-    <tr><td><label for="user.priv.late">late</label></td><td><input id="user.priv.late" type="checkbox" name="user.priv" value="late" ></td></tr>
-
-    <tr><td><label for="user.priv.train">train</label></td><td><input id="user.priv.train" type="checkbox" name="user.priv" value="train" ></td></tr>
-<tr><td>&nbsp;</td><td><input type="submit" name="submit" value="submit"></td></tr>
-</table>
-
-<input type="hidden" name="user.username" value="user">
-</form>
-
-</body>
-</html>
-
- -
- - diff --git a/docs/wikidocs/Using Checkboxes.html b/docs/wikidocs/Using Checkboxes.html deleted file mode 100644 index 005b1cdfa..000000000 --- a/docs/wikidocs/Using Checkboxes.html +++ /dev/null @@ -1,68 +0,0 @@ - - - WebWork - - Using Checkboxes - - - - - - - - - - -
-

Using Checkboxes (General)

-

The biggest gotcha for newbies is that you must set the 'value' attribute in the html <input> field to use Checkboxes with WW. By default your browser will set this to some value. Firefox uses "on" - not sure what IE or others use. You must make this a sensible value for whatever property you are setting.

-

Using Checkboxes to set boolean fields

-

HTML:

-
-
<input type="checkbox" name="user.lockedOut" value="true"/>
-
- -

If the user checks this box, the browser will send "user.lockedOut=true" in the QueryString and action.getUser().setLockedOut(true) will be called. If the user does not check the box, the browser will not send anything, so make sure that you have initialised lockedOut to false to start with.

- -
-
private boolean m_lockedOut = false;
-
-    public void setLockedOut(boolean lockedOut) { m_lockedOut = lockedOut; }
-
-

Using Checkboxes to set a collection

-

Our user has a number of priviliges that are stored as a Set of strings. To use checkboxes for these, we have HTML that looks like:

- -
-
<input type="checkbox" name="user.priv" value="boss"/>
-<input type="checkbox" name="user.priv" value="admin"/>
-<input type="checkbox" name="user.priv" value="manager"/>
-
- -

Say a user checks the first 2; the browser will send the query string: user.priv=boss&user.priv=admin.

- -

OGNL will end up calling

-
action.getUser().setPriv(String[] {"boss", "admin"})
-

- -

You can write this method like:

-
-
Set m_privileges = new HashSet();
-
-    public void setPriv(String[] privs) {
-        for (int i = 0; i < privs.length; i++) {
-            m_privileges.add(privs[i]);
-        }
-    }
-
-

Full Detailed example:

-

This example uses a kind-of model-driven action (see Model Driven Interceptor). The action returns a single getter for the User object whose values are populated.

- - - - -
- - diff --git a/docs/wikidocs/Using Field Validators.html b/docs/wikidocs/Using Field Validators.html deleted file mode 100644 index acda744be..000000000 --- a/docs/wikidocs/Using Field Validators.html +++ /dev/null @@ -1,201 +0,0 @@ - - - WebWork - - Using Field Validators - - - - - - - - - - -
-

Description

-

The followings show a simple example using Webwork's Field Validators

- -

Step 1

-

Create the jsp page

-
-
<h3>All Field Errors Will Appear Here</h3>
-<ww:fielderror />
-<hr/>
-
-<h3>Field Error due to 'Required String Validator Field' Will Appear Here</h3>
-<ww:fielderror>
-	<ww:param value="%{'requiredStringValidatorField'}" />
-</ww:fielderror>
-<hr/>
-
-<h3>Field Error due to 'String Length Validator Field' Will Appear Here</h3>
-<ww:fielderror>
-	<ww:param>stringLengthValidatorField</ww:param>
-</ww:fielderror>
-<hr/>
-	
-<ww:form action="submitFieldValidatorsExamples" namespace="/validation" method="POST" theme="xhtml">
-	<ww:textfield label="Required Validator Field" name="requiredValidatorField" />
-	<ww:textfield label="Required String Validator Field" name="requiredStringValidatorField" />
-	<ww:textfield label="Integer Validator Field" name="integerValidatorField" />
-	<ww:textfield label="Date Validator Field" name="dateValidatorField" />
-	<ww:textfield label="Email Validator Field" name="emailValidatorField" />
-	<ww:textfield label="URL Validator Field" name="urlValidatorField" />
-	<ww:textfield label="String Length Validator Field" name="stringLengthValidatorField" />
-	<ww:textfield label="Regex Validator Field" name="regexValidatorField"/>
-	<ww:textfield label="Field Expression Validator Field" name="fieldExpressionValidatorField" />
-	<ww:submit label="Submit" />
-</ww:form>
-
- - -

Step 2

-

Create the actoin class

-
-
public class FieldValidatorsExampleAction extends AbstractValidationActionSupport {
-	
-	private String requiredValidatorField = null;
-	private String requiredStringValidatorField = null;
-	private Integer integerValidatorField = null;
-	private Date dateValidatorField = null;
-	private String emailValidatorField = null;
-	private String urlValidatorField = null;
-	private String stringLengthValidatorField = null;
-	private String regexValidatorField = null;
-	private String fieldExpressionValidatorField = null;
-	
-	
-	private String randomNumber = null;
-	
-	
-	public Date getDateValidatorField() {
-		return dateValidatorField;
-	}
-	public void setDateValidatorField(Date dateValidatorField) {
-		this.dateValidatorField = dateValidatorField;
-	}
-	public String getEmailValidatorField() {
-		return emailValidatorField;
-	}
-	public void setEmailValidatorField(String emailValidatorField) {
-		this.emailValidatorField = emailValidatorField;
-	}
-	public Integer getIntegerValidatorField() {
-		return integerValidatorField;
-	}
-	public void setIntegerValidatorField(Integer integerValidatorField) {
-		this.integerValidatorField = integerValidatorField;
-	}
-	public String getRegexValidatorField() {
-		return regexValidatorField;
-	}
-	public void setRegexValidatorField(String regexValidatorField) {
-		this.regexValidatorField = regexValidatorField;
-	}
-	public String getRequiredStringValidatorField() {
-		return requiredStringValidatorField;
-	}
-	public void setRequiredStringValidatorField(String requiredStringValidatorField) {
-		this.requiredStringValidatorField = requiredStringValidatorField;
-	}
-	public String getRequiredValidatorField() {
-		return requiredValidatorField;
-	}
-	public void setRequiredValidatorField(String requiredValidatorField) {
-		this.requiredValidatorField = requiredValidatorField;
-	}
-	public String getStringLengthValidatorField() {
-		return stringLengthValidatorField;
-	}
-	public void setStringLengthValidatorField(String stringLengthValidatorField) {
-		this.stringLengthValidatorField = stringLengthValidatorField;
-	}
-	public String getFieldExpressionValidatorField() {
-		return fieldExpressionValidatorField;
-	}
-	public void setFieldExpressionValidatorField(
-			String fieldExpressionValidatorField) {
-		this.fieldExpressionValidatorField = fieldExpressionValidatorField;
-	}
-
-    public String getUrlValidatorField() {
-        return urlValidatorField;
-    }
-
-    public void setUrlValidatorField(String urlValidatorField) {
-        this.urlValidatorField = urlValidatorField;
-    }
-}
-
- - -

Step 3

-

Create the validator.xml.

-
-
<validators>
-	<field name="requiredValidatorField">
-		<field-validator type="required">
-			<message><![CDATA[ required ]]></message>
-		</field-validator>
-	</field>
-	<field name="requiredStringValidatorField">
-		<field-validator type="requiredstring">
-			<param name="trim">true</param>
-			<message><![CDATA[ required and must be string ]]></message>
-		</field-validator>
-	</field>
-	<field name="integerValidatorField">
-		<field-validator type="int">
-			<param name="min">1</param>
-			<param name="max">10</param>
-			<message><![CDATA[ must be integer min 1 max 10 if supplied ]]></message>
-		</field-validator>
-	</field>
-	<field name="dateValidatorField">
-		<field-validator type="date">
-			<param name="min">01/01/1990</param>
-			<param name="max">01/01/2000</param>
-			<message><![CDATA[ must be a min 01-01-1990 max 01-01-2000 if supplied ]]></message>
-		</field-validator>
-	</field>
-	<field name="emailValidatorField">
-		<field-validator type="email">
-			<message><![CDATA[ must be a valid email if supplied ]]></message>
-		</field-validator>
-	</field>
-	<field name="urlValidatorField">
-		<field-validator type="url">
-			<message><![CDATA[ must be a valid url if supplied ]]></message>
-		</field-validator>
-	</field>
-	<field name="stringLengthValidatorField">
-		<field-validator type="stringlength">
-			<param name="maxLength">4</param>
-			<param name="minLength">2</param>
-			<param name="trim">true</param>
-			<message><![CDATA[ must be a String of a specific greater than 1 less than 5 if specified ]]></message>
-		</field-validator>
-	</field>
-	<field name="regexValidatorField">
-		<field-validator type="regex">
-			<param name="expression">.*\.txt</param>
-			<message><![CDATA[ regexValidatorField must match a regexp (.*\.txt) if specified ]]></message>
-		</field-validator>
-	</field>
-	<field name="fieldExpressionValidatorField">
-		<field-validator type="fieldexpression">
-			<param name="expression">(fieldExpressionValidatorField == requiredValidatorField)</param>
-			<message><![CDATA[ must be the same as the Required Validator Field if specified ]]></message>
-		</field-validator>
-	</field>
-</validators>
-
- - - - - -
- - diff --git a/docs/wikidocs/Using Maven to set up an Eclipse project for Webwork.html b/docs/wikidocs/Using Maven to set up an Eclipse project for Webwork.html deleted file mode 100644 index fb9c100a7..000000000 --- a/docs/wikidocs/Using Maven to set up an Eclipse project for Webwork.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork - - Using Maven to set up an Eclipse project for Webwork - - - - - - - - - - -
-

Because WebWork is under active development, these instructions are likely to be out-of-date in specifics.  Hopefully the basic strategies will still apply.

- -

First, if xwork is not available from a Maven repo (for example, if it has moved to a SNAPSHOT dependency), then check it out from the CVS repository and run "mvn install" - this gives you the snapshot of XWork as well as the POM for resolving transitive dependencies like oscore.  This may apply to other dependencies which are not on ibiblio, but when I first tried this, xwork was the one with enough transitive dependencies to be hard to manage any other way.

- -

For other dependencies which are not on ibiblio, from the webwork CVS checkout (sandbox), run "ant common.jar". This will cause Ivy to fetch the other dependencies you need.

- -

Then, for each of the missing dependencies, install using "mvn install:install-file" Below are examples, but of course the path to your ".ivy-cache" directory will differ, and the versions are likely to change for lots of reason, but especially if the dependency is a SNAPSHOT with a timestamp in the filename.

-
-
mvn install:install-file -DartifactId=dwr -DgroupId=dwr -Dpackaging=jar -Dversion=1.1.3-beta \
-    -Dfile=/Users/germuska/.ivy-cache/dwr/dwr/jars/dwr-1.1-beta-3.jar
-
-mvn install:install-file -DartifactId=plexus-container-default -DgroupId=org.codehaus.plexus \
-    -Dpackaging=jar -Dversion=1.0-alpha-10-SNAPSHOT \
-    -Dfile=/Users/germuska/.ivy-cache/org.codehaus.plexus/plexus-container-default/jars/plexus-container-default-1.0-alpha-10-20060215.222714-5.jar
-
-

If you, like me, are not running Java 5.0, then you will also need to install the dom3 APIs.  As far as I can tell, the compiled JAR is not on any Maven repository. the source for dom3 can be found here: http://ibiblio.org/maven2/xerces/dom3-xml-apis/1.0/dom3-xml-apis-1.0-sources.jar&nbsp; You can build a jar from it and then put it in your own repository.  After that, I had to edit webwork's pom.xml to point to the dependency -- webwork has a comment in the <profiles> section acknowledging the need for this, but presumably it will not be changed until dom3 gets officially loaded as a compiled JAR to some maven repository.  I believe there should be a way to use Maven2's settings.xml file to do this locally without editing pom.xml, but I have not had a chance to investigate this yet.

- - -

These steps worked for me a week or so ago; the pom has changed since then and I haven't yet had time to rebuild, but this kind of approach should work. 

- -
- - diff --git a/docs/wikidocs/Using Non Field Validators.html b/docs/wikidocs/Using Non Field Validators.html deleted file mode 100644 index 45240bd2c..000000000 --- a/docs/wikidocs/Using Non Field Validators.html +++ /dev/null @@ -1,79 +0,0 @@ - - - WebWork - - Using Non Field Validators - - - - - - - - - - -
-

Description

-

The followings show a simple example using Webwork's Non Field Validators

- -

Step 1

-

Create the jsp page

-
-
<ww:actionerror />
-	
-<ww:form method="POST" action="submitNonFieldValidatorsExamples" namespace="/validation">
-	<ww:textfield name="someText" label="Some Text" />
-	<ww:textfield name="someTextRetype" label="Retype Some Text" />  
-	<ww:textfield name="someTextRetypeAgain" label="Retype Some Text Again" />
-	<ww:submit label="Submit" />
-</ww:form>
-
- - -

Step 2

-

Create the action class

-
-
public class NonFieldValidatorsExampleAction extends AbstractValidationActionSupport {
-	
-	private String someText;
-	private String someTextRetype;
-	private String someTextRetypeAgain;
-	
-	public String getSomeText() {
-		return someText;
-	}
-	public void setSomeText(String someText) {
-		this.someText = someText;
-	}
-	public String getSomeTextRetype() {
-		return someTextRetype;
-	}
-	public void setSomeTextRetype(String someTextRetype) {
-		this.someTextRetype = someTextRetype;
-	}
-	public String getSomeTextRetypeAgain() {
-		return someTextRetypeAgain;
-	}
-	public void setSomeTextRetypeAgain(String someTextRetypeAgain) {
-		this.someTextRetypeAgain = someTextRetypeAgain;
-	}
-}
-
- - -

Step 3

-

Create the validator.xml.

-
-
<validators>
-	<validator type="expression">
-		<param name="expression"><![CDATA[ ( (someText == someTextRetype) && (someTextRetype == someTextRetypeAgain) ) ]]></param>
-		<message><![CDATA[ all three text must be exactly the same ]]></message>
-	</validator>
-</validators>
-
- - - -
- - diff --git a/docs/wikidocs/Using Visitor Field Validator.html b/docs/wikidocs/Using Visitor Field Validator.html deleted file mode 100644 index c2e3fed49..000000000 --- a/docs/wikidocs/Using Visitor Field Validator.html +++ /dev/null @@ -1,69 +0,0 @@ - - - WebWork - - Using Visitor Field Validator - - - - - - - - - - -
-

Description

-

The followings show a simple example using Webwork's Field Validators

- -

Step 1

-

Create the jsp page

-
-
<ww:fielderror />
-
-<ww:form method="POST" action="submitVisitorValidatorsExamples" namespace="/validation">
-	<ww:textfield name="user.name" label="User Name" />
-	<ww:textfield name="user.age" label="User Age" />
-	<ww:textfield name="user.birthday" label="Birthday" />
-	<ww:submit label="Submit" />
-</ww:form>
-
- - -

Step 2

-

Create the actoin class

-
-
public class VisitorValidatorsExampleAction extends AbstractValidationActionSupport {
-
-	private User user;
-	
-	public User getUser() {
-		return user;
-	}
-	
-	public void setUser(User user) {
-		this.user = user;
-	}
-}
-
- - -

Step 3

-

Create the validator.xml.

-
-
<validators>
-	<field name="user">
-		<field-validator type="visitor">
-			<param name="context">userContext</param>
-			<param name="appendPrefix">true</param>
-			<message>User:</message>
-		</field-validator>
-	</field>
-</validators>
-
- - - -
- - diff --git a/docs/wikidocs/Using WebWork Components.html b/docs/wikidocs/Using WebWork Components.html deleted file mode 100644 index 443e051fc..000000000 --- a/docs/wikidocs/Using WebWork Components.html +++ /dev/null @@ -1,55 +0,0 @@ - - - WebWork - - Using WebWork Components - - - - - - - - - - -
-

A simple example of using WebWork components is available in the webwork-example.war that comes with the WebWork 2.0 Beta 1 distribution. You can download the distribution from https://webwork.dev.java.net/servlets/ProjectDocumentList .

- -

Components are defined _/WEB-INF/classes/components.xml_.

- -

The example consists of one component, which is defined by

- -
-
<component>
-  <scope>session</scope>
-  <class>com.opensymphony.webwork.example.counter.Counter</class>
-  <enabler>com.opensymphony.webwork.example.counter.CounterAware</enabler>
-</component>
-
- -

com.opensymphony.webwork.example.counter.Counter is just a POJO.

- -

com.opensymphony.webwork.example.counter.CounterAware is an interface which your *Action classes have to implement.

- -
-
public interface CounterAware {
-    public void setCounter(Counter counter);
-}
-
- -

Additionally, you need to tag your actions with the intercepter, for example,

- -
-
<action name="SimpleCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
-  <result name="success" type="dispatcher">
-    <param name="location">/success.jsp</param>
-  </result>
-  <interceptor-ref name="defaultComponentStack"/>
-</action>
-
- -

WebWork will call the interface and set the Counter bean . The Counter bean would then be subsequently be available to be used by your *Action classes.

- -
- - diff --git a/docs/wikidocs/Using WebWork and XWork with JSP 2.0 and JSTL 1.1.html b/docs/wikidocs/Using WebWork and XWork with JSP 2.0 and JSTL 1.1.html deleted file mode 100644 index dfe01dd35..000000000 --- a/docs/wikidocs/Using WebWork and XWork with JSP 2.0 and JSTL 1.1.html +++ /dev/null @@ -1,191 +0,0 @@ - - - WebWork - - Using WebWork and XWork with JSP 2.0 and JSTL 1.1 - - - - - - - - - - -
-

WW2/WX1 and its taglib is oriented towards OGNL, which is using a value stack
-for all action properties. These values are not direct available for the
-expression language of JSP2/JSTL1.1.

- -

However, it's easy to populate the request
-attribute set, with all gettable properties of an action object. You need to provide
-an interceptor that does the job, by register a PreResultListener which is
-invoked after the return of Action.execute() but before the rendering of the result .

- -

The interceptor below is using Jakarta BeanUtils. It first extracts all getters
-of the current action, invokes them one at the time and stores the values into a map.
-Then it iterates over the map and populates the request attribute set.
-The double iteration is not needed, it's just there for clarity.

-

class ActionPropertyExportInterceptor

-
-
package com.whatever.interceptors;
-
-import com.opensymphony.webwork.WebWorkStatics;
-import com.opensymphony.xwork.Action;
-import com.opensymphony.xwork.ActionInvocation;
-import com.opensymphony.xwork.interceptor.AroundInterceptor;
-import com.opensymphony.xwork.interceptor.PreResultListener;
-import org.apache.commons.beanutils.PropertyUtils;
-import javax.servlet.http.HttpServletRequest;
-import java.beans.PropertyDescriptor;
-import java.util.*;
-
-/**
- * Populates HTTP Request Attributes with all gettable properties of the current action.
- */
-public class ActionPropertyExportInterceptor extends AroundInterceptor {
-    protected void before(ActionInvocation invocation) throws Exception {
-        invocation.addPreResultListener( new PropertyExporter() );
-    }
-    protected void after(ActionInvocation dispatcher, String result) throws Exception { }
-
-    public static class PropertyExporter implements PreResultListener {
-        private static final List   ignore = Arrays.asList(new String[] {"class", "texts"}); //skip getClass,...
-
-        //Invoked after Action.execute() but before Result
-        //Calls all getters of the action and insert the values into the request
-        public void beforeResult(ActionInvocation invocation, String resultCode) {
-            Map                 props   = extractGetterPropertyValues( invocation.getAction() );
-            HttpServletRequest  request = getRequest(invocation);
-            for (Iterator it = props.entrySet().iterator(); it.hasNext();) {
-                Map.Entry   e = (Map.Entry) it.next();
-                request.setAttribute((String) e.getKey(), e.getValue());
-            }
-        }
-
-        public Map extractGetterPropertyValues(Object bean) {
-            PropertyDescriptor[]  descr = PropertyUtils.getPropertyDescriptors(bean);
-            Map                   props = new HashMap();
-            for (int i = 0; i < descr.length; i++) {
-                PropertyDescriptor d = descr[i];
-                if (d.getReadMethod() == null) continue;
-                if (ignore.contains(d.getName())) continue;
-
-                try {
-                    props.put(d.getName(), PropertyUtils.getProperty(bean, d.getName()));
-                } catch (Exception e) { }
-            }
-            return props;
-        }
-
-        public HttpServletRequest getRequest(ActionInvocation invocation) {
-            return (HttpServletRequest) invocation.getInvocationContext().get(WebWorkStatics.HTTP_REQUEST);
-        }
-    }
-}
-
- -

Don't forget to declare the interceptor in your xwork.xml file and insert it
-into your interceptor stack.

-

xwork.xml snippet

-
-
<interceptor name="export" class="com.whatever.interceptors.ActionPropertyExportInterceptor" />
-. . .
-<interceptor-stack name="standard-interceptors">
-    <interceptor-ref name="timer" />
-    <interceptor-ref name="logger" />
-    <interceptor-ref name="params" />
-*    <interceptor-ref name="export"/>*
-    <interceptor-ref name="validateParams"/>
-    <interceptor-ref name="awarePlugger" />
-</interceptor-stack>
-
- -

Your action need to provide getters for all properties that should be exported into the
-request attribute set.

-

class ViewUser

-
-
public class ViewUser extends ActionSupport {
-    private int                         id;
-    private User                        user;
-
-    public String execute() throws Exception {
-        user = findUser( getId() );
-        return Action.SUCCESS;
-    }
-
-    public  int   getId()          {return id;}
-    public  void  setId(int id)    {this.id = id;}
-*    public  User  getUser()        {return user;}*
-
-    private User  findUser(int id) {...}
-}
-
- -

The User class might look like this

-

class User

-
-
import java.util.Date;
-public class User {
-    private int     id;
-    private String  firstName, lastName, email;
-    private String  street, zip, city;
-    private Date    date;
-    
-    public String  getFirstName() {return firstName;}
-    //..._getters and setters_...
-}
-
- -

Finally, using the samples above you can write your JSP2 page like this.

-

ViewUser.jsp

-
-
<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %>
-<html>
-<head>
-    <title>Info about ${user.firstName}</title>
-</head>
-<body>
-    <h1>Info about ${user.firstName} ${user.lastName} [OS:ID=${user.id}]</h1>
-    <table border="1" cellspacing="0" cellpadding="2" width="90%" >
-    <tr>
-        <th>Name</th> <td>${user.firstName} ${user.lastName}</td>
-    </tr>
-    <tr>
-        <th>Created</th> <td><fmt:formatDate value="${user.date}" pattern="yyyy-MM-dd HH:mm"/></td>
-    </tr>
-    <tr>
-        <th>Email</th> <td>${user.email}</td>
-    </tr>
-    <tr>
-        <th>Address</th> <td>${user.street} ${user.zip} ${fn:toUpperCase(user.city)}</td>
-    </tr>
-    </table>
-</body>
-</html>
-
- -

Displaying validation errors with JSTL

- -
-
<c:if test="${!empty fieldErrors || !empty actionErrors}">
-  <div class="red">
-    <ul>
-      <c:forEach items="${fieldErrors}" var="fieldError">
-        <c:forEach items="${fieldError.value}" var="error">
-          <li>${error}</li>
-        </c:forEach>
-      </c:forEach>
-      <c:forEach items="${actionErrors}" var="actionError">
-        <li>${actionError}</li>
-      </c:forEach>
-    </ul>
-  </div>
-</c:if>
-
- -
- - diff --git a/docs/wikidocs/Validation Annotation.html b/docs/wikidocs/Validation Annotation.html deleted file mode 100644 index da93c852f..000000000 --- a/docs/wikidocs/Validation Annotation.html +++ /dev/null @@ -1,139 +0,0 @@ - - - WebWork - - Validation Annotation - - - - - - - - - - -
-

Validation Annotation

- -

If you want to use annotation based validation, you have to annotate the class or interface with Validation Annotation.

- -

Usage

- -

The Validation annotation must be applied at Type level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.

- -

Examples

- -

An Annotated Interface

-
    -
  • Mark the interface with @Validation()
  • -
  • Apply standard or custom annoations at method level
  • -
- - -
-
@Validation()
-public interface AnnotationDataAware {
-
-    void setBarObj(Bar b);
-
-    Bar getBarObj();
-
-    @RequiredFieldValidator(message = "You must enter a value for data.")
-    @RequiredStringValidator(message = "You must enter a value for data.")
-    void setData(String data);
-
-    String getData();
-}
-
- -

An Annotated Class

- -
-
@Validation()
- public class SimpleAnnotationAction extends ActionSupport {
-
-     @RequiredFieldValidator(type = ValidatorType.FIELD, message = "You must enter a value for bar.")
-     @IntRangeFieldValidator(type = ValidatorType.FIELD, min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")
-     public void setBar(int bar) {
-         this.bar = bar;
-     }
-
-     public int getBar() {
-         return bar;
-     }
-
-     @Validations(
-             requiredFields =
-                     {@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "customfield", message = "You must enter a value for field.")},
-             requiredStrings =
-                     {@RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "stringisrequired", message = "You must enter a value for string.")},
-             emails =
-                     { @EmailValidator(type = ValidatorType.SIMPLE, fieldName = "emailaddress", message = "You must enter a value for email.")},
-             urls =
-                     { @UrlValidator(type = ValidatorType.SIMPLE, fieldName = "hreflocation", message = "You must enter a value for email.")},
-             stringLengthFields =
-                     {@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true, minLength="10" , maxLength = "12", fieldName = "needstringlength", message = "You must enter a stringlength.")},
-             intRangeFields =
-                     { @IntRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
-             dateRangeFields =
-                     {@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "datefield", min = "-1", max = "99", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
-             expressions = {
-                 @ExpressionValidator(expression = "foo > 1", message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."),
-                 @ExpressionValidator(expression = "foo > 2", message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar = ${bar}."),
-                 @ExpressionValidator(expression = "foo > 3", message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar = ${bar}."),
-                 @ExpressionValidator(expression = "foo > 4", message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar = ${bar}."),
-                 @ExpressionValidator(expression = "foo > 5", message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar = ${bar}.")
-     }
-     )
-     public String execute() throws Exception {
-         return SUCCESS;
-     }
- }
-
- - - -
- - diff --git a/docs/wikidocs/Validation Interceptor.html b/docs/wikidocs/Validation Interceptor.html deleted file mode 100644 index e0a558b61..000000000 --- a/docs/wikidocs/Validation Interceptor.html +++ /dev/null @@ -1,79 +0,0 @@ - - - WebWork - - Validation Interceptor - - - - - - - - - - -
- -

This interceptor runs the action through the standard validation framework, which in turn checks the action against - any validation rules (found in files such as ActionClass-validation.xml) and adds field-level and action-level - error messages (provided that the action implements com.opensymphony.xwork.ValidationAware). This interceptor - is often one of the last (or second to last) interceptors applied in a stack, as it assumes that all values have - already been set on the action.

- -

This interceptor does nothing if the name of the method being invoked is specified in the excludeMethods - parameter. excludeMethods accepts a comma-delimited list of method names. For example, requests to - foo!input.action and foo!back.action will be skipped by this interceptor if you set the - excludeMethods parameter to "input, back".

- -

Note that this has nothing to do with the com.opensymphony.xwork.Validateable interface and simply adds - error messages to the action. The workflow of the action request does not change due to this interceptor. Rather, - this interceptor is often used in conjuction with the workflow interceptor.

- -

- -

NOTE: As this method extends off MethodFilterInterceptor, it is capable of - deciding if it is applicable only to selective methods in the action class. See - MethodFilterInterceptor for more info.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points for this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="validation"/>
-    <interceptor-ref name="workflow"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
-<-- in the following case myMethod of the action class will not
-       get validated -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="validation">
-        <param name="excludeMethods">myMethod</param>
-    </interceptor-ref>
-    <interceptor-ref name="workflow"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/Validation.html b/docs/wikidocs/Validation.html deleted file mode 100644 index 9e73ee5d5..000000000 --- a/docs/wikidocs/Validation.html +++ /dev/null @@ -1,519 +0,0 @@ - - - WebWork - - Validation - - - - - - - - - - -
-

WebWork relies on XWork validation framework to enable the application of input validation rules to your Actions before they are executed. This section only provides the bare minimum to get you started and focuses on WebWork's extension of the XWork validators to support client-side validation.

-There is also an option for Client Side (Javascript and/or AJAX) based validation, please see Client Side Validation for more information.

- -

 

- -

Examples

- -
    -
  1. Basic Validation
  2. -
  3. Client Validation
  4. -
  5. AJAX Validation
  6. -
  7. Using Field Validators
  8. -
  9. Using Non Field Validators
  10. -
  11. Using Visitor Field Validator
  12. -
- - -

Validators available in WebWork

-
Note

-When using a Field Validator, Field Validator Syntax is ALWAYS preferable than using the Plain Validator Syntax as it facilitates grouping of field-validators according to fields. This is very handy especially if a field needs to have many field-validators which is almost always the case. Examples: validatortypes
-

 

-
    -
  1. required validator
  2. -
  3. requiredstring validator
  4. -
  5. int validator
  6. -
  7. date validator
  8. -
  9. expression validator
  10. -
  11. fieldexpression validator
  12. -
  13. email validator
  14. -
  15. url validator
  16. -
  17. visitor validator
  18. -
  19. conversion validator
  20. -
  21. stringlength validator
  22. -
  23. regex validator
  24. -
- - -

Registering Validators

- -

Validation rules are handled by validators, which must be registered with -the ValidatorFactory (using the registerValidator method). The simplest way to do so is to add a file name -validators.xml in the root of the classpath (/WEB-INF/classes) that declares -all the validators you intend to use.

-

 

- -

This list declares all the validators that comes with WebWork.

-
-
<validators>
-    <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
-    <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
-    <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
-    <validator name="double" class="com.opensymphony.xwork.validator.validators.DoubleRangeFieldValidator"/>
-    <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
-    <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
-    <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
-    <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
-    <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
-    <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
-    <validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
-    <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
-    <validator name="regex" class="com.opensymphony.xwork.validator.validators.RegexFieldValidator"/>
-</validators>
-
-

 
Note
-

validators.xml if being defined should be available in the classpath. However -this is not necessary, if no custom validator is needed. Webwork will automatically -picked up a predefined sets of validators defined in -com/opensymphony/xwork/validator/validators/default.xml packaged together -in xwork jar file that comes with webwork distribution. See ValidatorFactory -static block for details.

-

 


Warning
-

If custom validator is being defined and a validators.xml is created and -place in the classpath, do remember to copy all the other pre-defined validators -that is needed into the validators.xml as if not they will not be registered. -Once a validators.xml is detected in the classpath, the default one -(com/opensymphony/xwork/validator/validators/default.xml) will not be loaded. -It is only loaded when a custom validators.xml cannot be found in the classpath. - Be careful.

-

 


- -

Turning on Validation

- -

The default validationWorkflowStack already includes this.
-All that is required to enable validation for an Action is to put the -ValidationInterceptor in the interceptor refs of the action (see xwork.xml) like so:

-

 

-
-
<interceptor name="validator" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
-
-

 

- -

Note: The default validationWorkflowStack already includes this.

- -

Validator Scopes

- -

Field validators, as the name indicate, act on single fields accessible through an action. -A validator, in contrast, is more generic and can do validations in the full action context, -involving more than one field (or even no field at all) in validation rule. -Most validations can be defined on per field basis. This should be preferred over -non-field validation whereever possible, as field validator messages are bound to the -related field and will be presented next to the corresponding input element in the -respecting view.

-

 

-

Non-field validators only add action level messages. Non-field validators -are mostly domain specific and therefore often custom implementations. -The most important standard non-field validator provided by XWork/WebWork -is ExpressionValidator.

-

 

- -

Notes

- -

Non-field validators takes precedence over field validators -regardless of the order they are defined in *-validation.xml. If a non-field -validator is short-circuited, it will causes its non-field validator to not -being executed. See validation framework documentation for more info.

-

 

- -

Defining Validation Rules

- -

Validation rules can be specified: -

    -
  1. Per Action class: in a file named ActionName-validation.xml
  2. -
  3. Per Action alias: in a file named ActionName-alias-validation.xml
  4. -
  5. Inheritance hierarchy and interfaces implemented by Action class: - WebWork searches up the inheritance tree of the action to find default - validations for parent classes of the Action and interfaces implemented
  6. -
-Here is an example for SimpleAction-validation.xml:

-

 

-
-
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
-       "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
-  <field name="bar">
-      <field-validator type="required">
-          <message>You must enter a value for bar.</message>
-      </field-validator>
-      <field-validator type="int">
-          <param name="min">6</param>
-          <param name="max">10</param>
-          <message>bar must be between ${min} and ${max}, current value is ${bar}.</message>
-      </field-validator>
-  </field>
-  <field name="bar2">
-      <field-validator type="regex">
-          <param name="regex">[0-9],[0-9]</param>
-          <message>The value of bar2 must be in the format "x, y", where x and y are between 0 and 9</message>
-     </field-validator>
-  </field>
-  <field name="date">
-      <field-validator type="date">
-          <param name="min">12/22/2002</param>
-          <param name="max">12/25/2002</param>
-          <message>The date must be between 12-22-2002 and 12-25-2002.</message>
-      </field-validator>
-  </field>
-  <field name="foo">
-      <field-validator type="int">
-          <param name="min">0</param>
-          <param name="max">100</param>
-          <message key="foo.range">Could not find foo.range!</message>
-      </field-validator>
-  </field>
-  <validator type="expression">
-      <param name="expression"<foo < bar</param>
-      <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>
-  </validator>
-</validators>
-
-

 

-

Here we can see the configuration of validators for the SimpleAction class. -Validators (and field-validators) must have a type attribute, which refers -to a name of an Validator registered with the ValidatorFactory as above. -Validator elements may also have <param> elements with name and value attributes -to set arbitrary parameters into the Validator instance. See below for discussion -of the message element.

-

 

-

Each Validator or Field-Validator element must define one message element inside -the validator element body. The message element has 1 attributes, key which is not -required. The body of the message tag is taken as the default message which should -be added to the Action if the validator fails.Key gives a message key to look up -in the Action's ResourceBundles using getText() from LocaleAware if the Action -implements that interface (as ActionSupport does). This provides for Localized -messages based on the Locale of the user making the request (or whatever Locale -you've set into the LocaleAware Action). After either retrieving the message from -the ResourceBundle using the Key value, or using the Default message, the current -Validator is pushed onto the ValueStack, then the message is parsed for \${...} -sections which are replaced with the evaluated value of the string between the -\${ and }. This allows you to parameterize your messages with values from the -Validator, the Action, or both.

- - -

If the validator fails, the validator is pushed onto the ValueStack and the -message ��� either the default or the locale-specific one if the key attribute is -defined (and such a message exists) ��� is parsed for ${...} sections which are -replaced with the evaluated value of the string between the ${ and }. This -allows you to parameterize your messages with values from the validator, the -Action, or both.

- -

NOTE:Since validation rules are in an XML file, you must make sure -you escape special characters. For example, notice that in the expression -validator rule above we use ">" instead of ">". Consult a resource on XML -for the full list of characters that must be escaped. The most commonly used -characters that must be escaped are: & (use &), > (user >), and < (use <).

- -

Here is an example of a parameterized message:

-

This will pull the min and max parameters from the IntRangeFieldValidator and -the value of bar from the Action.

-

 

-
-
bar must be between ${min} and ${max}, current value is ${bar}.
-
-

 

-

To define validation rules for an Action, create a file named ActionName-validation.xml -in the same package as the Action. You may also create alias-specific validation rules which -add to the default validation rules defined in ActionName-validation.xml by creating -another file in the same directory named ActionName-aliasName-validation.xml. In both -cases, ActionName is the name of the Action class, and aliasName is the name of the -Action alias defined in the xwork.xml configuration for the Action.

- -

The framework will also search up the inheritance tree of the Action to -find validation rules for directly implemented interfaces and parent classes of the Action. -This is particularly powerful when combined with ModelDriven Actions and the VisitorFieldValidator. -Here's an example of how validation rules are discovered. Given the following class structure:

- -

    -
  • interface Animal;
  • -
  • interface Quadraped extends Animal;
  • -
  • class AnimalImpl implements Animal;
  • -
  • class QuadrapedImpl extends AnimalImpl implements Quadraped;
  • -
  • class Dog extends QuadrapedImpl;
  • -

- -

The framework method will look for the following config files if Dog is to be validated:

- -

    -
  • Animal
  • -
  • Animal-aliasname
  • -
  • AnimalImpl
  • -
  • AnimalImpl-aliasname
  • -
  • Quadraped
  • -
  • Quadraped-aliasname
  • -
  • QuadrapedImpl
  • -
  • QuadrapedImpl-aliasname
  • -
  • Dog
  • -
  • Dog-aliasname
  • -

- -

While this process is similar to what the XW:Localization framework does -when finding messages, there are some subtle differences. The most important -difference is that validation rules are discovered from the parent downwards. -

- -

NOTE:Child's *-validation.xml will override parent's *-validation.xml -according to the class hierarchi defined above.

-

 

- -

Validator Flavour

- -

The validators supplied by the Xwork distribution (and any validators you -might write yourself) come in two different flavors:

- -

    -
  1. Plain Validators / Non-Field validators
  2. -
  3. FieldValidators
  4. -

- -

Plain Validators (such as the ExpressionValidator) perform validation checks -that are not inherently tied to a single specified field. When you declare a -plain Validator in your -validation.xml file you do not associate a fieldname -attribute with it. (You should avoid using plain Validators within the - syntax described below.)

- -

FieldValidators (such as the EmailValidator) are designed to perform -validation checks on a single field. They require that you specify a fieldname -attribute in your -validation.xml file. There are two different (but equivalent) -XML syntaxes you can use to declare FieldValidators (see " vs. - syntax" below).

- -

There are two places where the differences between the two validator flavors -are important to keep in mind:

- -

    -
  1. when choosing the xml syntax used for declaring a validator - (either or )
  2. -
  3. when using the short-circuit capability
  4. -

- -

NOTE:Note that you do not declare what "flavor" of validator you are -using in your -validation.xml file, you just declare the name of the validator -to use and WebWork will know whether it's a "plain Validator" or a "FieldValidator" -by looking at the validation class that the validator's programmer chose -to implement.

-

 

- -

Non-Field Validator Vs Field-Validator

- -

There are two ways you can define validators in your -validation.xml file:

-
    -
  1. <validator>
  2. -
  3. <field-validator>
  4. -
-

Keep the following in mind when using either syntax:

- -

Non-Field-Validator -The <validator> element allows you to declare both types of validators -(either a plain Validator a field-specific FieldValidator).

-

 

-
-
<!-- Declaring a plain Validator using the <validator> syntax: -->
-
-   <validator type="expression>
-         <param name="expression">foo gt bar</param>
-         <message>foo must be great than bar.</message>
-   </validator>
-
-

 

-
-
<!-- Declaring a field validator using the <validator> syntax; -->
-
-   <validator type="required">
-        <param name="fieldName">bar</param>
-        <message>You must enter a value for bar.</message>
-   &lt/validator>
-
-

 

-

field-validator -The <field-validator> elements are basically the same as the <validator> elements -except that they inherit the fieldName attribute from the enclosing <field> element. -FieldValidators defined within a <field-validator> element will have their fieldName -automatically filled with the value of the parent <field> element's fieldName -attribute. The reason for this structure is to conveniently group the validators -for a particular field under one element, otherwise the fieldName attribute -would have to be repeated, over and over, for each individual <validator>.

- -

HINT: -It is always better to defined field-validator inside a <field> tag instead of -using a <validator> tag and supplying fieldName as its param as the xml code itself -is clearer (grouping of field is clearer)

- -

NOTE: -Note that you should only use FieldValidators (not plain Validators) within a - block. A plain Validator inside a <field> will not be -allowed and would generate error when parsing the xml, as it is not allowed in -the defined dtd (xwork-validator-1.0.2.dtd)

-

 

-
-
Declaring a FieldValidator using the <field-validator> syntax:
-
-<field name="email_address">
-  <field-validator type="required">
-      <message>You cannot leave the email address field empty.</message>
-  </field-validator>
-  <field-validator type="email">
-      <message>The email address you entered is not valid.</message>
-  </field-validator>
-</field>
-
-

 

-

The choice is yours. It's perfectly legal to only use elements -without the elements and set the fieldName attribute for each of them. -The following are effectively equal:

-

 

-
-
<field name="email_address">
-  <field-validator type="required">
-      <message>You cannot leave the email address field empty.</message>
-  </field-validator>
-  <field-validator type="email">
-      <message>The email address you entered is not valid.</message>
-  </field-validator>
-</field>
-
-
-<validator type="required">
-  <param name="fieldName">email_address</param>
-  <message>You cannot leave the email address field empty.</message>
-</validator>
-<validator type="email">
-  <param name="fieldName">email_address</param>
-  <message>The email address you entered is not valid.</message>
-</validator>
-
-

 

- -

Short-Curcuiting Validator

- -

Beginning with XWork 1.0.1 (bundled with WebWork 2.1), it is possible -to short-circuit a stack of validators. Here is another sample config file -containing validation rules from the Xwork test cases: Notice that some of the -<field-validator> and <validator> elements have the short-circuit -attribute set to true.

-

 

-
-
<!DOCTYPE validators PUBLIC 
-        "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
-        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
-  <!-- Field Validators for email field -->
-  <field name="email">
-      <field-validator type="required" short-circuit="true">
-          <message>You must enter a value for email.</message>
-      </field-validator>
-      <field-validator type="email" short-circuit="true">
-          <message>Not a valid e-mail.</message>
-      </field-validator>
-  </field>
-  <!-- Field Validators for email2 field -->
-  <field name="email2">
-     <field-validator type="required">
-          <message>You must enter a value for email2.</message>
-      </field-validator>
-     <field-validator type="email">
-          <message>Not a valid e-mail2.</message>
-      </field-validator>
-  </field>
-  <!-- Plain Validator 1 -->
-  <validator type="expression">
-      <param name="expression">email.equals(email2)</param>
-      <message>Email not the same as email2</message>
-  </validator>
-  <!-- Plain Validator 2 -->
-  <validator type="expression" short-circuit="true">
-      <param name="expression">email.startsWith('mark')</param>
-      <message>Email does not start with mark</message>
-  </validator>
-</validators>
-
-

 

-

short-circuiting and Validator flavors

-

Plain validator takes precedence over field-validator. They get validated -first in the order they are defined and then the field-validator in the order -they are defined. Failure of a particular validator marked as short-circuit -will prevent the evaluation of subsequent validators and an error (action -error or field error depending on the type of validator) will be added to -the ValidationContext of the object being validated.

- -

In the example above, the actual execution of validator would be as follows:

- -

    -
  1. Plain Validator 1
  2. -
  3. Plain Validator 2
  4. -
  5. Field Validators for email field
  6. -
  7. Field Validators for email2 field
  8. -

- -

Since Field Validator 2 is short-circuited, if its validation failed, -it will causes Field validators for email field and Field validators for email2 -field to not be validated as well.

- -

Usefull Information: -More complecated validation should probably be done in the validate() -method on the action itself (assuming the action implements Validatable -interface which ActionSupport already does).

- -

-A plain Validator (non FieldValidator) that gets short-circuited will -completely break out of the validation stack ��� no other validators will be -evaluated and plain validator takes precedence over field validator meaning -that they get evaluated in the order they are defined before field validator -gets a chance to be evaludated again according to their order defined. -

-

 

-

Short cuircuiting and validator flavours

-

A FieldValidator that gets short-circuited will only prevent other -FieldValidators for the same field from being evaluated. Note that this -"same field" behavior applies regardless of whether the or - syntax was used to declare the validation rule. -By way of example, given this -validation.xml file:

-

 

-
-
<validator type="required" short-circuit="true">
-  <param name="fieldName">bar</param>
-  <message>You must enter a value for bar.</message>
-</validator>
-
-<validator type="expression">
-  <param name="expression">foo gt bar</param>
-  <message>foo must be great than bar.</message>
-</validator>
-
-

 

-

both validators will be run, even if the "required" validator short-circuits. -"required" validators are FieldValidator's and will not short-circuit the plain -ExpressionValidator because FieldValidators only short-circuit other checks on -that same field. Since the plain Validator is not field specific, it is -not short-circuited.

-

 

- -

How Validators of an Action are Found

- -

As mentioned above, the framework will also search up the inheritance tree -of the action to find default validations for interfaces and parent classes of -the Action. If you are using the short-circuit attribute and relying on -default validators higher up in the inheritance tree, make sure you don't -accidentally short-circuit things higher in the tree that you really want!

-

 

- -
- - diff --git a/docs/wikidocs/ValidationParameter annotation.html b/docs/wikidocs/ValidationParameter annotation.html deleted file mode 100644 index 732a3d72d..000000000 --- a/docs/wikidocs/ValidationParameter annotation.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork - - ValidationParameter annotation - - - - - - - - - - -
-

ValidationParameter Annotation

- -

The ValidationParameter annotation is used as a parameter for CustomValidators.

- -

Usage

- -

The annotation must embedded into CustomValidator annotations as a parameter.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
nameyes parameter name.
valueyes parameter value.

- -

Examples

- -
-
@CustomValidator(
-  type ="customValidatorName",
-  fieldName = "myField",
-  parameters = { @ValidationParameter( name = "paramName", value = "paramValue" ) }
-)
-
- - - -
- - diff --git a/docs/wikidocs/Validations Annotation.html b/docs/wikidocs/Validations Annotation.html deleted file mode 100644 index d91154dd5..000000000 --- a/docs/wikidocs/Validations Annotation.html +++ /dev/null @@ -1,147 +0,0 @@ - - - WebWork - - Validations Annotation - - - - - - - - - - -
-

Validations Annotation

- -

If you want to use several annotations of the same type, these annotation must be nested within the @Validations() annotation.

- -

Usage

- -

Used at METHOD level.

- -

Parameters

- -

- -

- - - - - - -

- -

- - - - - - - -

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- -

- - - - - - - - - - - - -
Parameter Required Notes
requiredFields no Add list of RequiredFieldValidators
customValidators no Add list of CustomValidators
conversionErrorFields no Add list of ConversionErrorFieldValidators
dateRangeFields no Add list of DateRangeFieldValidators
emails no Add list of EmailValidators
fieldExpressions no Add list of FieldExpressionValidators
intRangeFields no Add list of IntRangeFieldValidators
requiredFields no Add list of RequiredFieldValidators
requiredStrings no Add list of RequiredStringValidators
stringLengthFields no Add list of StringLengthFieldValidators
urls no Add list of UrlValidators
visitorFields no Add list of VisitorFieldValidators
stringRegexs no Add list of StringRegexValidator
regexFields no Add list of RegexFieldValidator
expressions no Add list of ExpressionValidator

- -

Examples

- -
-
@Validations(
-          requiredFields =
-                  {@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "customfield", message = "You must enter a value for field.")},
-          requiredStrings =
-                  {@RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "stringisrequired", message = "You must enter a value for string.")},
-          emails =
-                  { @EmailValidator(type = ValidatorType.SIMPLE, fieldName = "emailaddress", message = "You must enter a value for email.")},
-          urls =
-                  { @UrlValidator(type = ValidatorType.SIMPLE, fieldName = "hreflocation", message = "You must enter a value for email.")},
-          stringLengthFields =
-                  {@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true, minLength="10" , maxLength = "12", fieldName = "needstringlength", message = "You must enter a stringlength.")},
-          intRangeFields =
-                  { @IntRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
-          dateRangeFields =
-                  {@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "datefield", min = "-1", max = "99", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
-          expressions = {
-              @ExpressionValidator(expression = "foo > 1", message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."),
-              @ExpressionValidator(expression = "foo > 2", message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar = ${bar}."),
-              @ExpressionValidator(expression = "foo > 3", message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar = ${bar}."),
-              @ExpressionValidator(expression = "foo > 4", message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar = ${bar}."),
-              @ExpressionValidator(expression = "foo > 5", message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar = ${bar}.")
-  }
-  )
-  public String execute() throws Exception {
-      return SUCCESS;
-  }
-
- - -
- - diff --git a/docs/wikidocs/Value Stack Internals.html b/docs/wikidocs/Value Stack Internals.html deleted file mode 100644 index 403c38a5d..000000000 --- a/docs/wikidocs/Value Stack Internals.html +++ /dev/null @@ -1,105 +0,0 @@ - - - WebWork - - Value Stack Internals - - - - - - - - - - -
-

As Matt Ho explained on the mailing list:

- -

A value stack is essentially a List. Calling [1] on the stack,
- returns a substack beginning with the element at index 1. It's only
- when you call methods on the stack that your actual objects will be
- called.

- -

Said another way, let's say I have a value stack that consists of a
- model and an action as follows:

- -

[ model, action ]

- -

here's how the following ognl would resolve:

- -

[0] - a CompoundRoot object that contains our stack, [model, action]

- -

[1] - another CompoundRoot that contains only [action]

- -

[0].toString() - calls toString() on the first object in the value
- stack (excluding the CompoundRoot) that supports the toString() method

- -

[1].foo - call getFoo() on the first object in the value stack
- starting from [OS:action] and excluding the CompoundRoot that supports a
- getFoo() method

- -

I hope this doesn't sound too confusing :\

- -

If you're using Velocity, this can most easily be written as:

- -

$stack.findValue("[0]").peek()

- -

Unfortunately, <ww:property value="[0].peek()"/> won't work as this
- would translate into "starting at the top of the value stack (and
- excluding the CompoundRoot), find the first object that has a method
- called peek()"

- -

--------thanks Matt!

- -

here is the com.opensymphony.xwork.util.CompoundRoot class which Matt mentions:

- -
-
public class CompoundRoot extends ArrayList {
-    //~ Constructors ///////////////////////////////////////////////////////////
-
-    public CompoundRoot() {
-    }
-
-    public CompoundRoot(List list) {
-        super(list);
-    }
-
-    //~ Methods ////////////////////////////////////////////////////////////////
-
-    public CompoundRoot cutStack(int index) {
-        return new CompoundRoot(subList(index, size()));
-    }
-
-    public Object peek() {
-        return get(0);
-    }
-
-    public Object pop() {
-        return remove(0);
-    }
-
-    public void push(Object o) {
-        add(0, o);
-    }
-}
-
-

What's on the stack?

- -

NOTE: When rendering Freemarker / Velocity templates or result,
-WebWork2 contains the following items by default in the ValueStack:

- -
    -
  • req - the current HttpServletRequest
  • -
  • res - the current HttpServletResponse
  • -
  • stack - the current OgnlValueStack
  • -
  • ognl - an instance of OgnlTool
  • -
  • ui - a (now deprecated) instance of a ui tag renderer
  • -
- - -

@See com.opensymphony.webwork.views.util.ContextUtil

- - -
- - diff --git a/docs/wikidocs/Velocity Result.html b/docs/wikidocs/Velocity Result.html deleted file mode 100644 index 5167efe90..000000000 --- a/docs/wikidocs/Velocity Result.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork - - Velocity Result - - - - - - - - - - -
- -

Using the Servlet container's JspFactory, this result mocks a JSP - execution environment and then displays a Velocity template that will be - streamed directly to the servlet output.

- - -

Parameters

- - -

    - -

  • location (default) - the location of the template to process.
  • - -

  • parse - true by default. If set to false, the location param will - not be parsed for Ognl expressions.
  • - -

-

- This result follows the same rules from WebWorkResultSupport. -

- - -

Examples

- -
-
<result name="success" type="velocity">
-  <param name="location">foo.vm</param>
-</result>
-
- -
- - diff --git a/docs/wikidocs/Velocity Tags.html b/docs/wikidocs/Velocity Tags.html deleted file mode 100644 index 882f98d2b..000000000 --- a/docs/wikidocs/Velocity Tags.html +++ /dev/null @@ -1,46 +0,0 @@ - - - WebWork - - Velocity Tags - - - - - - - - - - -
-

Velocity tags are extensions of the generic Tags provided by WebWork. You can get started almost immediately by simply knowing the structure in which the tags can be accessed: #wwxxx (...) ... #end, where xxx is any of the Tags supported by WebWork.

- -
As of WebWork 2.2, the use of Velocity for templating internal WebWork UI Tags have been removed. The new and legacy 2.2 UI tags have been implemented in FreeMarker. However, support for the Velocity result type as well as the Velocity directives shown below will continue to be supported and developed. By default, WebWork's TemplateEngine will call the FreeMarker UI Tags using the Velocity syntax noted below (through Velocity directives). See Template Loading for more information.
- -

Syntax

- -

For example, in JSP you might create a form like so:

- -
-
<ww:form action="updatePerson">
-    <ww:textfield label="First name" name="firstName"/>
-    <ww:submit value="Update"/>
-</ww:form>
-
- -

In Velocity the same form is built like so:

- -
-
#wwform ("action=updatePerson")
-    #wwtextfield ("label=First name" "name=firstName")
-    #wwsubmit ("value=Update")
-#end
-
- -

Block and Inline Tags

- -

You may notice that some tags require an #end statement, while others do not. Due to a limitation in Velocity, tags must declare if they are a block or inline tag up front. As such, by default all tags are inline except for a few key ones, such as the form tag. We strongly encourage you to look at FreeMarker, which provides much better flexibility in this area as well as others.

- -
- - diff --git a/docs/wikidocs/Velocity.html b/docs/wikidocs/Velocity.html deleted file mode 100644 index 545cc316d..000000000 --- a/docs/wikidocs/Velocity.html +++ /dev/null @@ -1,148 +0,0 @@ - - - WebWork - - Velocity - - - - - - - - - - -
-

Velocity is a template Java template language.

- -

For more information on Velocity itself, please visit the Velocity website.

- -
Velocity is very similar to FreeMarker, as both are template languages that can be used outside of a Servlet container. The WebWork team recommends FreeMarker over Velocity simply because FreeMarker has better error reporting, support for JSP tags, and slightly better features. However, both are good alternatives to JSP.
- -

Getting Started

- -

Getting started with Velocity is as simple as ensuring all the dependencies are included in your project's classpath. Other than that, webwork\-default.xml already configures the Velocity Result needed to map your actions to your templates. You may now try out the following xwork.xml configuration:

- -
-
<action name="test" class="com.acme.TestAction">
-    <result name="success" type="velocity">test-success.vm</result>
-</action>
-
- -

Then in test-success.vm:

- -
-
<html>
-<head>
-    <title>Hello</title>
-</head>
-<body>
-
-Hello, ${name}
-
-</body>
-</html>
-
- -

Where name is a property on your action. That's it! Read the rest of this document for details on how templates are loaded, variables are resolved, and tags can be used.

- -

Template Loading

- -

WebWork looks for Velocity templates in two locations (in this order):

- -
    -
  1. Web application
  2. -
  3. Class path
  4. -
- - -

This ordering makes it ideal for providing templates inside a fully built jar, but allowing for overrides of those templates to be defined in your web application. In fact, this is how you can override the default UI tags and Form Tags included with WebWork.

- -

Variable Resolution

- -

In Velocity, variables are looked up in several different places, in this order:

- -
    -
  1. The value stack
  2. -
  3. The action context
  4. -
  5. Built-in variables
  6. -
- - -

Note that the action context is looked up after the value stack. This means that you can reference the variable without the typical preceding has marker (#) like you would have to when using the JSP ww:property tag. This is a nice convenience, though be careful because there is a small chance it could trip you up.

- -
-
#wwurl "id=url "value=http://www.yahoo.com"
-Click <a href="${url}">here</a>!
-
- -

The built-in variables that WebWork-Velocity integration provides are:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name Description
stack The value stack itself, useful for calls like ${stack.findString('ognl expr')}
action The action most recently executed
response The HttpServletResponse
res Same as response
request The HttpServletRequest
req Same as request
session The HttpSession
application The ServletContext
base The request's context path
- -

Tag Support

- -

See the Velocity Tags documentation for information on how to use the generic Tags provided by WebWork.

- -

Tips and Tricks

- -

There are some advanced features that may be useful when building WebWork applications with Velocity.

- -

Extending

- -

Sometimes you may with to extend the Velocity support provided with WebWork. The most common reason for doing this is that you wish to include your own Tags, such as those that you have extended from the built in WebWork Tags.

- -

To do so, write a new class that extends com.opensymphony.webwork.views.velocity.VelocityManager and overrides it as needed. Then add the following to webwork.properties:

- -
-
webwork.velocity.manager.classname = com.yourcompany.YourVelocityManager
-
- -

Configuring

- -

You can configure Velocity by placing configuration items in velocity.properties.

- -
- - diff --git a/docs/wikidocs/Views.html b/docs/wikidocs/Views.html deleted file mode 100644 index aef5b1c59..000000000 --- a/docs/wikidocs/Views.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - Views - - - - - - - - - - -
-

Description

- -

WebWork supports JSP and Velocity for your application presentation layer. For this example we will use a JSP file. Webwork comes packaged with a tag library (taglibs). You can use these taglibs as components in your JSP file. Here is an section of our form.jsp page:

- -
-
<%@ taglib prefix="ww" uri="webwork" %>
-<html>
-<head><title>Webwork Form Example</title></head>
-<body>
-   <ww:form name="myForm" action="'formTest'" namespace="/" method="POST">
-  <table>
-    <ww:textfield label="First Name" name="'formBean.firstName'" value="formBean.firstName"/>
-    <ww:textfield label="Last Name" name="'formBean.lastName'" value="formBean.lastName"/>
-    <ww:submit value="Save Form"/>
-  </table>
-</ww:form>
-</body>
-
- -

The process of events will go as follows:

- -
    -
  1. WebWork will take notice since the URI ends in .action (defined in web.xml files)
  2. -
  3. WebWork will look up the action formTest in its action hierarchy and call any Interceptors that might have been defined.
  4. -
  5. WebWork will translate formTest and decide to call the method processForm in the class com.opensymphony.webwork.example.FormAction as defined in xwork.xml file.
  6. -
  7. The method will process successfully and give WebWork the SUCCESS return parameter.
  8. -
  9. WebWork will translate the SUCCESS return parameter into the location formSuccess.jsp (as defined in xwork.xml) and redirect accordingly.
  10. -
- - -

Most of the content here provided by Matt Dowell <matt.dowell@notiva.com>

- -
- - diff --git a/docs/wikidocs/VisitorFieldValidator Annotation.html b/docs/wikidocs/VisitorFieldValidator Annotation.html deleted file mode 100644 index 690285b74..000000000 --- a/docs/wikidocs/VisitorFieldValidator Annotation.html +++ /dev/null @@ -1,93 +0,0 @@ - - - WebWork - - VisitorFieldValidator Annotation - - - - - - - - - - -
-

VisitorFieldValidator Annotation

- -

The validator allows you to forward validator to object properties of your action -using the objects own validator files. This allows you to use the ModelDriven development -pattern and manage your validations for your models in one place, where they belong, next to -your model classes.

- -

The VisitorFieldValidator can handle either simple Object properties, Collections of Objects, or Arrays. -The error message for the VisitorFieldValidator will be appended in front of validator messages added -by the validations for the Object message.

- -

Usage

- -

The annotation must be applied at method level.

- -

Parameters

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Parameter Required Default Notes
messageyes field error message
keyno i18n key from language specific properties file.
fieldNameno  
shortCircuitnofalseIf this validator should be used as shortCircuit.
typeyesValidatorType.FIELDEnum value from ValidatorType. Either FIELD or SIMPLE can be used here.
context no action alias Determines the context to use for validating the Object property. If not defined, the context of the Action validation is propogated to the Object property validation. In the case of Action validation, this context is the Action alias.
appendPrefix no true Determines whether the field name of this field validator should be prepended to the field name of the visited field to determine the full field name when an error occurs. For example, suppose that the bean being validated has a "name" property. If appendPrefix is true, then the field error will be stored under the field "bean.name". If appendPrefix is false, then the field error will be stored under the field "name".
If you are using the VisitorFieldValidator to validate the model from a ModelDriven Action, you should set appendPrefix to false unless you are using "model.name" to reference the properties on your model.

- -

Examples

- -
-
@VisitorFieldValidator(message = "Default message", key = "i18n.key", shortCircuit = true, context = "action alias", appendPrefix = true)
-
- - -
- - diff --git a/docs/wikidocs/WebLogic 6.1.html b/docs/wikidocs/WebLogic 6.1.html deleted file mode 100644 index c3beed09e..000000000 --- a/docs/wikidocs/WebLogic 6.1.html +++ /dev/null @@ -1,112 +0,0 @@ - - - WebWork - - WebLogic 6.1 - - - - - - - - - - -
-

Running WebWork 2 on Weblogic Server 6.1

- -

This document describes why WebWork 2 doesn't work "as-is" on Weblogic Server 6.1 and shows how to build an additional JAR that will fix the problems.

- -

Note: the service pack of Weblogic Server 6.1 used is SP4.

- -

The first part of this document describes the technical problems and the theoretical solution.

- -

Why WebWork Doesn't Work

- -

Weblogic 6.1 was published just prior to the finalization of the Servlet 2.3 specification. The incompatibility is that servlet filters and listeners in Weblogic 6.1 do not work with the 2.3 spec primarily because the servlet context is not retrieved in the same way. This causes virtually all filter initialization operations to fail with an AbstractMethodError exception.

- -

How WebWork Is Modified

- -

In Servlet 2.3, the servlet context is available from the session object; this is not true for Weblogic Server 6.1. Hence, filters and listeners must be modified to retrieve the servlet context from a different source; this is accomplished by retrieving the servlet context from the FilterConfig passed to the servlet filters during initialzation.

- -

However, the WebWork code cannot be modifed to do this, because this will break the Servlet 2.3 specification. The goal is to leave the "original" WebWork modified so that it is still Servlet 2.3 compatible, and then to add an additional JAR that "breaks" WebWork to work on Weblogic Server 6.1.

- -

Hence, if you want to run WebWork under Servlet 2.3, the default, then simply build WebWork as usual.

- -

But if you want to run WebWork under Servlet 2.3, you need to build the additional JAR and put it into your WAR file, and then modify your web.xml to use the new classes instead of the standard ones.

- -

The standard WebWork has already been modified slightly to make the above effort possible:

- -
    -
  1. RequestLifecycleFilter is modified to retrieve its servlet context from the method getServletContext(). This method, getServletContext(), is then implemented to return the servlet context from where it is available in Servlet 2.3: the session object. The logical operation is unchanged, but now subclasses can override getServletContext() to retrieve the servlet context from a different location as we'll see below.
  2. -
  3. SessionLifecycleListener is modified in the same way as RequestLifecycleFilter. The method, getServletContext(), is implemented to return the servlet context, in this case also from the session object. Again, subclasses can override the getServletContext() method to restore the servlet context from a different source. Again, this class's functionality is unchanged.
  4. -
- - -

Now, in a separate project, the following classes are added and compiled into a separate JAR:

- -

RequestLifecycleFilterCompatWeblogic61

- -

This subclass of RequestLifecycleFilter simply overrides getServletContext() to retrieve the servlet context from the filter config, creates a singleton class, SessionContextSingleton, and assigns the servlet context to the singleton so that the listeners will have the ability to retrieve it.

- -

SessionLifecycleListenerCompatWeblogic61

- -

This subclass of SessionLifecycleListener simply overrides getServletContext() to retrieve the servlet context from the singleton created above.

- -

FilterDispatcherCompatWeblogic61

- -

Although the superclass of this class, FilterDispatcher, is commented out, this subclass retrieves the servlet context in the same way as RequestLifecycleFilterCompatWeblogic61 in case it is ever resurrected. At this time, this class is unnecessary.

- -

ServletContextSingleton

- -

A singleton class whose sole purpose is to hold the servlet context so that listener classes have access to it.

- -

Setting Up WebWork 2 to Run on Weblogic 6.1

- -

Building Your Own Project

- -

In the web.xml file, make the following class name substitutions:

- - - - - - - - - - - - - - - - - - -
Old Class Name New Class Name
RequestLifecycleFilter RequestLifecycleFilterCompatWeblogic61
SessionLifecycleListener SessionLifecycleListenerCompatWeblogic61
FilterDispatcher FilterDispatcherCompatWeblogic61
- -

FAQ

- -

I still get the AbstractMethodError Exception when Weblogic Server starts up. What am I doing wrong?

- -
    -
  1. Check to see if a webwork-example.war is still lingering in your mydomain/applications folder and delete it if it is there.
  2. -
  3. See next FAQ question.
  4. -
- - -

The server behavior seems like it is from a previous source code base; I can't debug it. What's the clue?

- -

Sometimes BEA Weblogic Server doesn't "rebuild" its temporary files. Do the following to force the temporary files to rebuild:

- -
    -
  1. Stop the server.
  2. -
  3. Delete the .wlnotdelete folder in mydomain/applications.
  4. -
  5. Restart the server.
  6. -
- - -
- - diff --git a/docs/wikidocs/WebLogic.html b/docs/wikidocs/WebLogic.html deleted file mode 100644 index 9a207da97..000000000 --- a/docs/wikidocs/WebLogic.html +++ /dev/null @@ -1,62 +0,0 @@ - - - WebWork - - WebLogic - - - - - - - - - - -
-
-

> The classloaders of WLS seem not to play nice with velocity when
-> deploying this way.
->
-> If you haven't already tried, do the following, it makes it all work
-> for us:
->
-> 1) In the webwork.properties file (which should be in your
-> WEB-INF/classes directory) put a line like this:
->
-> webwork.velocity.configfile = my-velocity.properties
->
-> 2) create a "my-velocity.properties" file under WEB-INF/classes and
-> put into it the contents of the velocity.properties file that is in
-> webwork's velocity-dep.jar
->
-> 3) in your new "my-velocity.properties" file, find the section titled
-> "T E M P L A T E L O A D E R S", and change this section to look like
-> this:
->
-> ===========================================
-> resource.loader = class
->
-> file.resource.loader.description = Velocity File Resource Loader
-> file.resource.loader.class =
-> org.apache.velocity.runtime.resource.loader.FileResourceLoader
-> file.resource.loader.path = .
-> file.resource.loader.cache = false
-> file.resource.loader.modificationCheckInterval = 2
->
-> class.resource.loader.class =
-> org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
-> class.resource.loader.cache = true
-> ===========================================
->
-> ... which straightens out the class resource loading problems (for us
-> at least).
->
-> hope this helps,
-> james

-
- -

Note: The "when deploying this way" comment above refers to deploying a war file (not expanded) into the deployment directory of WebLogic; with WL 8.x, this is typically at <bea_home>/user_projects/domains/mydomain/.

- -
- - diff --git a/docs/wikidocs/WebWork 2.1.7.html b/docs/wikidocs/WebWork 2.1.7.html deleted file mode 100644 index a04d62516..000000000 --- a/docs/wikidocs/WebWork 2.1.7.html +++ /dev/null @@ -1,391 +0,0 @@ - - - WebWork - - WebWork 2.1.7 - - - - - - - - - - -
-

WebWork 2.1.7 release notes

- -

Key changes

-
    -
  • XWork upgraded to 1.0.5 -
      -
    • Using i18n, especially the ww:text tag, is now possible in SiteMesh decorators. See SiteMesh.
    • -
    • Issues where the ActionContext wasn't properly cleaned up (after ww:include and ww:action) have been resolved.
    • -
    • Configuration -
        -
      • If the action class is not specified, it now defaults to com.opensymphony.xwork.ActionSupport.
      • -
      • If the result name is not specified, it is assumed to be "success".
      • -
      -
    • -
    -
  • -
  • Non-UI tags -
      -
    • ww:text and ww:url have an id attribute that, when specified, causes the tag not to print out the localized text but rather store the result in the ActionContext to be referenced later. See SiteMesh, URL tag, and Text tag.
    • -
    -
  • -
  • UI tags -
      -
    • ww:form has an added target attribute.
    • -
    • ww:form exposes "namespace" in the parameters Map in templates.
    • -
    • ww:form tag defaults the id and name attribute to the action name that it is submitting to.
    • -
    • Form elements default the id attribute to "[formId]_[elementName]".
    • -
    • Form elements default the "required" attribute to true if there is any validator associated with that field and the form's validate attribute is enabled.
    • -
    • ww:textarea has an added "wrap" attribute.
    • -
    • XHTML theme: added a parameter called "after" and that will add text to the right of the form element.
    • -
    -
  • -
  • Replaced old prototype client-side validation with XmlHttpRequest-based solution (STILL IN PROTOTYPE PHASE, works in XHTML theme only).
  • -
  • Interceptors -
      -
    • ServletConfigInterceptor now checks for actions implementing PrincipalAware and adds a Principal that ties in to the HttpServletRequest's Principal.
    • -
    • Minor bug fixes in the ExecuteAndWaitInterceptor and FileUploadInterceptor.
    • -
    -
  • -
  • Results -
      -
    • JasperReportsResult and StreamResult both support the Content-disposition header.
    • -
    • JasperReports integration has been upgraded to 0.6.3.
    • -
    • WebWorkResultSupport has a simple conditionalParse() method making support for ${} notation in your results easier (it will parse only if the parse attribute is true).
    • -
    -
  • -
- - -

Upgrade steps

-
    -
  1. Copy over the new webwork.jar and xwork.jar files.
  2. -
  3. If you are using JasperReports, you will need to upgrade to the latest JasperReports jars of 0.6.3 because the package name has changed.
  4. -
  5. Read the migration notes for anything that you should be aware of.
  6. -
- - -

Migration notes

-
    -
  • If you were using the old client-side validation code, it is still possible to keep using it but you will likely need to modify form-close.vm and controlheader.vm in the XHTML theme and form.vm in the simple theme. We recommend supporting the new prototype as it is a lot easier to use and doesn't require special validators.
  • -
  • It is possible, though very unlikely, that the default ids for the UI tags and the default name for the form tag might cause you some trouble. Please be aware of this change.
  • -
- - -

Changelog

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (26 issues) -
- T - Key - Summary
- Bug - - WW-1067 - - Error undeploying webapps on Tomcat -
- Improvement - - WW-706 - - Text tag and URL tag should have option to store contents to context -
- Improvement - - WW-704 - - Integrate PrincipalInterceptor with ServletConfigInterceptor -
- Improvement - - WW-703 - - Add wrap attribute to textarea -
- Improvement - - WW-702 - - Required (*) should be on by default if a validator exists -
- Improvement - - WW-701 - - UI tags should have default ids and names -
- Bug - - WW-698 - - webwork.i18n.encoding does not get set by the ServletDispatcher -
- Improvement - - WW-696 - - StreamResult should accept file option -
- Bug - - WW-695 - - JSP Form Tags does not have a target attribute -
- Bug - - WW-694 - - ExecuteAndWaitInterceptor can return null results -
- Bug - - WW-693 - - FileUploadInterceptor don't check the allowed files's Enumeration whitch is null. -
- Improvement - - WW-692 - - Webwork package of jasper reports packaged as dori.jasper. Latest release of Jasper Reports packaged as net.sf.jasperreports -
- Improvement - - WW-691 - - JasperReports 0.6.3 support -
- Improvement - - WW-687 - - Freemarker - add method buildUrl to FreemakerWebworkUtil -
- Improvement - - WW-686 - - JasperReport result - Content-Disposition management -
- Improvement - - WW-684 - - Default action class and result name. -
- Bug - - WW-681 - - getText() doesn't work in Sitemesh filters -
- Bug - - WW-677 - - ww:include replaces existing value stack with new one -
- Bug - - WW-676 - - Freemarker Support:TemplatePath in web.xml has no effect -
- Improvement - - WW-668 - - Externalise the JavaScript validation support from the JSP taglibs -
- Bug - - WW-638 - - Freemarker result encoding error -
- Improvement - - WW-637 - - textarea does not have maxlength attribute -
- Bug - - WW-617 - - Stale Action Invocation left in Stack Context -
- Bug - - WW-490 - - Is WW ignoring webwork.locale setting? -
- Improvement - - WW-455 - - Select tag template does not work properly for Object like BigDecima -
- Improvement - - WW-351 - - Forwarding unknown tag attributes -
-

- - -
- - diff --git a/docs/wikidocs/WebWork 2.2 Migration Notes.html b/docs/wikidocs/WebWork 2.2 Migration Notes.html deleted file mode 100644 index 7b65c605d..000000000 --- a/docs/wikidocs/WebWork 2.2 Migration Notes.html +++ /dev/null @@ -1,145 +0,0 @@ - - - WebWork - - WebWork 2.2 Migration Notes - - - - - - - - - - -
-

This document covers a step-by-step guide for upgrading to WebWork 2.2 from 2.1.x, as well as a list of the key individual changes for reference.

- -

Upgrade Guide

- -
    -
  1. Get the latest 2.2 release
  2. -
  3. Check out the dependencies to see what the required libraries are. One change of note is the dependency on Rife-Continuations. Click through the tabs for the dependencies for different usage profiles. If you use FreeMarker for instance, click on that tab to see those dependencies. Note that if you use the JSP tags you are now using FreeMarker by default for the UI component templates.
  4. -
  5. Check the Individual Changes section below to see if any of those changes affect your code
  6. -
  7. Update to use the FilterDispatcher instead of the ServletDispatcher. Check out the web.xml 2.1.x compatibility page for some compatibility discussions, and see web.xml for what needs to go in the web.xml file.
  8. -
- - -

Deprecated Items

- -
    -
  • The ServletDispatcher is now deprecated, please use the FilterDispatcher if possible. See web.xml 2.1.x compatibility for more information about potential problems you might have when switching to FilterDispatcher.
  • -
  • The Velocity and FreeMarker servlets are no longer supported. We highly recommend you don't use these servlets but rather the FreeMarker Result or Velocity Result directly.
  • -
  • If you were using JSP tags within Velocity, this is no longer supported and will soon be removed. You can use the instructions explained in web.xml 2.1.x compatibility to get along for now, but we highly recommend using the new native Velocity tag support provided by WebWork.
  • -
  • The table tag is now considered deprecated. We may undeprecate it in the future if more time can be invested, but we recommend that you look at alternative options such as Display Tag.
  • -
  • All support for including actions (using the include tag or jsp:include) is no longer available when using the FilterDispatcher. We recommend you use the action tag instead.
  • -
  • The cos and pell file upload parsers are no longer actively maintained and will be deleted soon. We highly recommend you use the Jakarta file upload parser, which is now the default parser.
  • -
- - -

Deleted Items

- -
    -
  • All VoiceXML tags have been removed from WebWork.
  • -
  • The Velocity-based Tags have been removed. If you were using or extending these tags (advanced users typically), you can copy them from the /template/archive directory in the webwork jar.
  • -
- - -

Individual Changes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Version Description Old Code New Code
2.1.x If you implemented your own ObjectFactory or ActionInvocation classes, you will notice that there have been some minor changes to make an "extraContext" Map available for the build* methods. This allows, for instance, access to the Session map during object creation, even before the ActionContext ThreadLocal has been set. ObjectFactory.getObjectFactory().buildBean(clazz); ObjectFactory.getObjectFactory().buildBean(clazz, extraContext);
2.0+ If you've used the WebWork base classes for building templated tags, you'll run into the refactoring of the UI tags to use common Component classes as the templated back-end. The tags now use these Component classes, as do Velocity and FreeMarker. This allows Velocity and FreeMarker to use the same UI components directly, without pretending to be a JSP page, but it also means you need to refactor your custom tags to use the new API's ...your code.. See the existing UI tags in the 2.2 source
2.1.x If you were not using the Alt Syntax, it is now enabled by default. You can either upgrade or change the Tag Syntax <ww:url value="'http://www.yahoo.com'"/> <ww:url value="http://www.yahoo.com"/>
2.1.x If you are using FreeMarker and your code uses psuedo properties on collections and maps, you need to modify the code to call methods instead. ${parameters?size} / ${parameters.size?html} ${parameters.size()} / ${parameters.get("size")?html}
2.1.x The defaultStack has been renamed to the basicStack. <interceptor-ref name="defaultStack"/> <interceptor-ref name="basicStack"/>
2.1.x The completeStack has been renamed to the defaultStack. <interceptor-ref name="completeStack"/> <interceptor-ref name="defaultStack"/>
2.1.x The defaultStack (previously the completeStack) is now the default interceptor stack in webwork-default.xml. In addition, this stack now configures the Workflow Interceptor and the Validation Interceptor to not run if the method names are input, back, or cancel N/A N/A
2.1.x The component interceptor has been deprecated (along with all WebWork IOC features) and has been removed from the basicStack and completeStack. You'll need to add it back by hand if you wish to use this deprecated feature. N/A N/A
2.0+ The include tag's page attribute has been deprecated since 1.x and is now removed from 2.2. Please use the value attribute. <ww:include page="..."/> <ww:include value="..."/>
2.0+ The text tag's value0, value1, value2, and value 3attributes have been deprecated since 1.x and are now removed from 2.2. Please use the param tag instead. <ww:text value0="...""/> <ww:text><ww:param value="someValue">...</ww:param></ww:text>
2.0+ The session map wrapper (found in ActionContext) has been changed to no longer create sessions for every request. If your application depends on sessions being automatically created, WebWork 2.2 no longer does that. Instead, you must create the session yourself or the session will be created as soon as a value is put in the session Map. N/A N/A
2.0+ The VUI tags have been removed from WebWork. They haven't been actively worked on in over 4 years and are not used in the community. N/A N/A
2.0+ The URI of the WebWork TLD was change from webwork to /webwork. If you were already using the packaged TLD from webwork.jar, you will have to adjust URI in your JSPs <%@ taglib uri="webwork" prefix="ww" %> <%@ taglib uri="/webwork" prefix="ww" %>
2.0+ The default encoding has changed from ISO-8859-1 to UTF-8. If you wish to continue to use ISO-8859-1, you must change your webwork.properties. N/A webwork.i18n.encoding=ISO-8859-1
- -
- - diff --git a/docs/wikidocs/WebWork 2.2.1.html b/docs/wikidocs/WebWork 2.2.1.html deleted file mode 100644 index 0cac648d3..000000000 --- a/docs/wikidocs/WebWork 2.2.1.html +++ /dev/null @@ -1,858 +0,0 @@ - - - WebWork - - WebWork 2.2.1 - - - - - - - - - - -
-

WebWork 2.2.1 Release Notes

- -

Key Changes

- -

Portlet Integration

-
    -
  • JSR-168 portlet integration support Which portal servers are supported
  • -
  • Improved webwork-portlet sample application
  • -
  • Added deployment descriptors for various portal servers
  • -
- - -

Validation

- - - -

UI Tags

- - - -

Tools

-
    -
  • Quickstart improvement
  • -
  • Maven support through pom.xml
  • -
- - -

Misc

- - - - -

Migration Notes

- -

WebWork 2.2.1 is a bugfix release for the 2.2 release a month ago.
-If you have used the previous portlet integration code, you should check the portlet-webapp for an example.

- -

The DTD public IDs in xwork.dtd were incorrect in the 1.1. release.
-Make sure your DOCTYPE definitions for xwork.xml files look like this:

- -

For xwork 1.1:

-
-
<!DOCTYPE xwork PUBLIC 
-	"-//OpenSymphony Group//XWork 1.1//EN" 
-	"http://www.opensymphony.com/xwork/xwork-1.1.dtd">
-
- -

For xwork 1.1.1:

- -
-
<!DOCTYPE xwork PUBLIC 
-	"-//OpenSymphony Group//XWork 1.1.1//EN"
-	"http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
-
- -

Changelog

- -

For a complete list of all the changes, please refer to the complete changelog

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (68 issues) -
- T - Key - Summary
- Bug - - WW-1203 - - wrong tag for freemarker result (ww.optiontransferselect, ww.actionerror, ww.actionmessage) -
- Task - - WW-1143 - - Create blank webapp application with an ant target to create a getting started webapp -
- Task - - WW-1142 - - Move starter webapp samples to showcase webapp -
- Task - - WW-1141 - - Update ivy for 2.2.1 release -
- Bug - - WW-1140 - - Version of Xwork DTD -
- Task - - WW-1139 - - Document advanced features of Collection and Map type conversion -
- Bug - - WW-1138 - - Included XWork librarys ....xwork.ObjectFactory.getClassInstance calls ....util.ClassLoaderUtil which actually exists with an s at the end -
- Bug - - WW-1137 - - Dist target does not copy osbuild.xml to dist dir -
- New Feature - - WW-1136 - - Add a UpDownSelect component -
- Bug - - WW-1134 - - Extension should not be limited for action mapper -
- Bug - - WW-1132 - - webwork looking for /template/xhtml/a-close.ftl -
- Improvement - - WW-1130 - - ability to programmatically set velocity properties -
- Bug - - WW-1129 - - Debug tag not exposed to VelocityManager, DebugDirective missing -
- Bug - - WW-1128 - - Sitemesh Velocity Integration renders uneval'd templates -
- Bug - - WW-1127 - - DevMode impacts pageflow logic -
- Bug - - WW-1126 - - Quickstart won't work with Java 5 code -
- Improvement - - WW-1125 - - optiontransferselect tag should add its respective entries when the form it is included is submitted -
- Improvement - - WW-1124 - - optiontrasferselect tag uses capitals for html tag. -
- Bug - - WW-1121 - - Freemarker error if "name" parameter is missing -
- Improvement - - WW-1120 - - Allow setting templateSuffix on a per Page basis (With patch and UntiTests) -
- Task - - WW-1118 - - Improve portlet sample webapp -
- Bug - - WW-1117 - - int validator in javascript throws exception if only min or max are set -
- Bug - - WW-1116 - - ww:select tag works only with string variables -
- Task - - WW-1115 - - Refactor portlet implementation -
- Sub-task - - WW-1114 - - Stack overflow bug fix implemented incorrectly? -
- Bug - - WW-1112 - - XML Field Validation Required not working on Integer or Long values -
- Task - - WW-1111 - - Debug component should be moved into c.o.w.components package -
- Bug - - WW-1110 - - Debug Tag not working with FTL -
- Bug - - WW-1109 - - the javascript in the DHTML response from remove DIV has not yet be evaluated -
- Bug - - WW-1108 - - ognl.OgnlException: templateDir [java.lang.StackOverflowError] -
- New Feature - - WW-1107 - - Client-side javascript for basic validators -
- Bug - - WW-1106 - - More Config Browser issues -
- Bug - - WW-1105 - - javadoc typo in TokenInterceptor -
- Task - - WW-1104 - - UITag tests need improvements -
- Bug - - WW-1103 - - jsessionid params appended to css and js includes -
- Bug - - WW-1102 - - Multipart requests are not cleaned up correctly -
- Bug - - WW-1101 - - jsp view cannot generate onsubmit html tag correctly. -
- Bug - - WW-1099 - - ScopeInterceptor has hardcoded dependencies on HttpServletRequest, etc -
- Task - - WW-1098 - - Maven Repository at ibiblio does not contain required dependencies for WW/XW -
- Bug - - WW-1096 - - datapicker tag cannot display calendar correctly when browser's locale is zh_CN. -
- Improvement - - WW-1093 - - Method Specification for Validation -
- Bug - - WW-1092 - - Fix validation regexps for url and email in xhtml theme -
- Bug - - WW-1091 - - WebWorkModels attribute names should be named as in TLD -
- Bug - - WW-1090 - - debug.ftl template is broken -
- Task - - WW-1089 - - Update ivy descriptor for 2.2.1 -
- Bug - - WW-1088 - - the prefixs in DefaultActionMapper will cause ParametersInterceptor problem(OGNL parse error) -
- Improvement - - WW-1087 - - make includeParams of URL don't override explicit params -
- Bug - - WW-1086 - - Various 2.2 issues from Eugene -
- Bug - - WW-1085 - - Datepicker i18n related javascript errors -
- Bug - - WW-1084 - - quickstart CRUD skill example attempt to save/update result in error 500 -
- Bug - - WW-1083 - - Stack overflow in <ww:form> tag getTheme(), getAncestor(), when 2 forms on a page -
- Bug - - WW-1082 - - ServletRedirectResult computes wrong URL when the root namespace is used -
- Bug - - WW-1081 - - Some error for template\xhtml\form-close-validate.ftl -
- Bug - - WW-1080 - - JSTL support not functioning correctly -
- Task - - WW-1079 - - Test portlet integration against the eXo platform -
- New Feature - - WW-1068 - - Property "title" to jsp tags -
- Improvement - - WW-1060 - - add tr attribute to ui tag component -
- Improvement - - WW-1027 - - ValidationInterceptor and DefaultWorkflowInterceptor Improvements for forwarding to another action when meeting validation error -
- Bug - - WW-958 - - Config-Browser don't respect webwork.action.extension = jspx -
- Task - - WW-908 - - Client side validation? -
- Bug - - WW-906 - - href class has issues w/ altSyntax == false -
- Task - - WW-874 - - Document Portlet stuff -
- New Feature - - WW-838 - - Create a new ww:css tag -
- Improvement - - WW-830 - - PROTOTYPE: Add configuration options for flexibility -
- Bug - - WW-818 - - URLEncoder.encode,ignore the charset -
- Bug - - WW-795 - - Can't override default webwork messages -
- Bug - - WW-793 - - Message with key "webwork.internal.invalid.token" is never used -
- Improvement - - WW-688 - - Refactor TokenInterceptor and TokenHelper (and affected classes) -
-

- - -
- - diff --git a/docs/wikidocs/WebWork 2.2.html b/docs/wikidocs/WebWork 2.2.html deleted file mode 100644 index adda55df0..000000000 --- a/docs/wikidocs/WebWork 2.2.html +++ /dev/null @@ -1,3749 +0,0 @@ - - - WebWork - - WebWork 2.2 - - - - - - - - - - -
-

WebWork 2.2 Release Notes

- -

Key Changes

- -

Productivity enhancements

- -

Tools

-
    -
  • Fully functional WebFlow support for JSP, FreeMarker, and Velocity
  • -
  • QuickStart: simple embedded application server for getting started immediately
  • -
- - -

Documentation

-
    -
  • Improved documentation, including detailed information for every interceptor
  • -
  • Totally new example application: now the example application is a set of tutorials and only teaches best practices of WebWork, rather than every single feature.
  • -
- - -

Enhanced framework feedback

-
    -
  • Better and more intelligent error reporting
  • -
  • "Developer" mode where inline errors are displayed when possible
  • -
  • Common interceptor stack issues, such as validation+workflow with no "input" result, are now reported in a more obvious way
  • -
- - -

Other

-
    -
  • Deprecated WebWork IoC container in favor of Spring
  • -
  • Built-in support for Spring
  • -
  • Official support for wizards/workflows using the Scope Interceptor and a pre-release of Continuations
  • -
  • Removed support for WebWork 1.x migration jar
  • -
- - -

User interface improvements

- -

UI tag overhaul

-
    -
  • FreeMarker is now the default UI tag implementation
  • -
  • Refactored UI tag base classes such that they are no longer tied to JSP
  • -
  • New native Velocity and FreeMarker UI tag support, built on top of new base classes
  • -
  • UI tags now use "altSyntax" (available since 2.1.4) as the default syntax (the 2.0 - 2.1 syntax is deprecated but still available)
  • -
  • New Head tag that links the correct CSS and JavaScript files for each theme
  • -
- - -

Velocity Support Improvements

-
    -
  • Upgraded support to velocity 1.4
  • -
  • webwork.velocity.contexts now chains contexts on each request, i.e. contexts do not need to be thread-safe
  • -
- - -

AJAX support

-
    -
  • Official support for client side validation using DWR
  • -
  • New tabbed panel widget
  • -
  • Built in support for Dojo wdigets
  • -
- - -

Result changes

-
    -
  • Velocity and FreeMarker Servlets are now deprecated in favor of direct results
  • -
- - -

Other

-
    -
  • Easy way to invoke different action name or command, making forms with multiple buttons easy to use
  • -
  • Initial JSR168 integration
  • -
- - -

Core API changes

- -

Type conversion

-
    -
  • Typing support in Maps, Sets, and Lists is now supported even when the collection is not null
  • -
  • Map type conversion support for keys and values
  • -
  • Support for Java 5 generics and annotations for Collections and enums
  • -
- - -

Other

-
    -
  • Improved exception handling, with support for exception-to-result mapping in xwork.xml
  • -
  • Parameters interceptor updated to let you include and/or exclude certain parameters, thereby providing a simple way to secure what data can be changed from the web
  • -
- - -

Migration Notes

- -

WebWork 2.2 is the most significant release since the 2.0 release two years ago. There are some significant changes, deprecated items, and various issues to be aware of when upgrading or if you're just curious what is new. Please see the WebWork 2.2 Migration Notes for more info.

- -

Changelog

- -

For a complete list of all the changes, please refer to the complete changelog

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - OpenSymphony JIRA - (328 issues) -
- T - Key - Summary
- Bug - - WW-1078 - - Broken links in Shopping-Cart -
- Bug - - WW-1077 - - setting theme in page, context, or session scope has not effect -
- Task - - WW-1076 - - Move all Velocity templates to archive -
- Task - - WW-1075 - - url validator docs -
- Task - - WW-1074 - - AJAX docs screwed up -
- Task - - WW-1073 - - control tags docs snippets are borken -
- Bug - - WW-1072 - - select.ftl emptyOption evaluation -
- Bug - - WW-1071 - - DoubleSelect's second select does not allow a predefined value to be selected -
- Bug - - WW-1070 - - double select created option with key and value wrongly -
- Improvement - - WW-1069 - - Ability to use freemarker map built-ins (?keys, ?values) as well as plain map methods (.keySet(), get(foo)) -
- Improvement - - WW-1065 - - TestCase for the Property component -
- Task - - WW-1064 - - have a link in tags page to altsyntax page -
- New Feature - - WW-1062 - - Add a OptionTransferSelect component -
- Bug - - WW-1061 - - checkboxlist.ftl does not allow disabled parameter handling in WW2.2beta4 -
- Task - - WW-1059 - - Make the dojo configuration in ww:head hook into the il8n infrastructure -
- Bug - - WW-1058 - - xhtml theme's form-validate.ftl onsubmit javascript is bad -
- Bug - - WW-1057 - - DefaultActionMapper appending extra slash when namespace is "/" -
- Improvement - - WW-1056 - - Change defaultStack order -
- Improvement - - WW-1055 - - Warn when properties are null -
- Task - - WW-1054 - - Include common build in project -
- Task - - WW-1053 - - AJAX Validation Documentation -
- Bug - - WW-1052 - - Always cleanup ActionContext -
- Improvement - - WW-1051 - - Enable tag attribute description to be usable for both javadoc and tagdoclet -
- Task - - WW-1050 - - Add DWR 1.1-beta2 jar to ivy-repository -
- Bug - - WW-1049 - - ChainingInterceptor doesn't accept null of CompoundRoot element -
- Bug - - WW-1048 - - RemoteCallUIBean uses UrlHelper to build url for href attribute breaks <ww:a /> tag -
- Bug - - WW-1047 - - Fix broken locale files of jscalendar -
- Bug - - WW-1046 - - DefaultActionMapper ignores the root ("/") namespace -
- Improvement - - WW-1045 - - Include datepicker css in new ww:head tag -
- New Feature - - WW-1044 - - Add a fielderror tag to display field errors if exist -
- Bug - - WW-1043 - - Validation Errors with DWR (AJAX Tutorial) -
- Bug - - WW-1041 - - Showcase - Edit Employee form broken -
- Improvement - - WW-1036 - - Include datepicker css in new ww:head tag -
- New Feature - - WW-1035 - - Add a actionerror tag that will display action error if they exist -
- Improvement - - WW-1034 - - Datepicker uses wrong date format for en locales -
- Improvement - - WW-1033 - - Generate tld attribute descriptions from property javadoc -
- Task - - WW-1032 - - Document new head tag -
- Bug - - WW-1031 - - Remote forms don't work with new dojo -
- Improvement - - WW-1030 - - Loading Freemarker templates with the ActionContext's Locale -
- Bug - - WW-1025 - - Showcase example: Spring throws strange exception while wiring action instance -
- Bug - - WW-1024 - - dist build target is broken, webapps are not longer packaged -
- Bug - - WW-1023 - - Item keys should use findValue -
- Bug - - WW-1022 - - A tag doesn't work with params -
- Bug - - WW-1021 - - VelocityTools 1.2 ToolboxManager implementation causes NPE in VelocityManager -
- Improvement - - WW-1020 - - Consolidate ww:a and ww:href tag into ww:a -
- New Feature - - WW-1019 - - Pico/nano integration -
- Task - - WW-1017 - - Update DOJO to release 0.20 -
- Improvement - - WW-1016 - - Merge Quick Start Guide into Getting Started document -
- Bug - - WW-1015 - - Cannot create Portlet instance com.opensymphony.webwork.portlet.WebWorkPortlet for Portlet Application webwork -
- Bug - - WW-1014 - - i18n reloading in Tomcat -
- Bug - - WW-1013 - - Typo! -
- Bug - - WW-1012 - - tabbedpanel-close.ftl is broken due to iterator refactoring -
- Bug - - WW-1010 - - AbstractListTag no longer allows nulls for the list attribute -
- Task - - WW-1009 - - AJAX tutorial broken -
- Bug - - WW-1008 - - Iterator tag throwing NullPointer -
- Task - - WW-1007 - - SiteMesh docs out of date -
- Task - - WW-1006 - - Java 5 support -
- Task - - WW-1005 - - Action chaining docs -
- Task - - WW-1004 - - OGNL docs need new examples -
- Task - - WW-1002 - - I18n docs out of date -
- Task - - WW-1001 - - Client side validation -
- Task - - WW-1000 - - Validation examples outdated -
- Task - - WW-999 - - Make all result types based on snippets -
- Task - - WW-998 - - Document Exception Handling -
- Task - - WW-997 - - document for each validators type its usage, parameter and example using snippet -
- Bug - - WW-996 - - Type conversion not working for map -
- Task - - WW-995 - - Please update documentation for the FileUploadInterceptor - allowedTypes parameter. -
- Bug - - WW-994 - - Component based IteratorTag never prints out is body -
- Task - - WW-993 - - Add Exception Mappings to Config Browser -
- Bug - - WW-991 - - FilterDispatcher setup and cleanup non-webwork request -
- Bug - - WW-990 - - is extremely unhelpful for new people a exception thrown message -
- Bug - - WW-989 - - WW Action Tag does not go through ActionMapper -
- Improvement - - WW-987 - - org.opensymphony used in text constants instead of com.opensymphony -
- Improvement - - WW-986 - - Re-add uri declaration in WW 2.2 tld -
- Bug - - WW-985 - - New FM templates don't support booleans very well -
- Task - - WW-984 - - Please define the scope interceptor in webwork-default.xml -
- Bug - - WW-983 - - option values are locale specific formatted - should only be HTML escaped. -
- Bug - - WW-982 - - Quickstart broken on OS X -
- Improvement - - WW-981 - - Calls made to Configuration instances are not centralized constants. -
- Task - - WW-979 - - Verify on WebLogic 9.0 -
- Bug - - WW-977 - - Input and Output streams not closed in StreamResult -
- Bug - - WW-976 - - WW Portlets can't be deployed in Liferay or JBoss Portal -
- Bug - - WW-975 - - Snippet macro doing weird things with text tag -
- Bug - - WW-974 - - set useAltSyntax problem -
- Improvement - - WW-973 - - Make datepicker locale aware -
- Bug - - WW-972 - - ww:property tag does not recognize alt-syntax -
- Improvement - - WW-971 - - Setup XDoclet to build tag documentation and tld from component sources -
- Bug - - WW-969 - - Fix Subset Tag -
- Bug - - WW-968 - - Fix Append Tag -
- Bug - - WW-967 - - Fix Merge Tag -
- Bug - - WW-966 - - i18n issue, locale is randomly switched -
- Bug - - WW-965 - - Fix WW Generator Tag -
- Improvement - - WW-964 - - Support for JasperReports 1.1.0 -
- Improvement - - WW-963 - - Add overridable publishException method to ExceptionMappingInterceptor -
- Bug - - WW-961 - - chainStack defined twice in webwork-defaults.xml -
- Bug - - WW-960 - - Action tag does not do include properly -
- Bug - - WW-957 - - TabbedPaneTag doesn't have openTemplate setter -
- Bug - - WW-956 - - UIBean NPE with ww.submit tag -
- Improvement - - WW-955 - - Switch to using [ and ] in Freemarker templates -
- Bug - - WW-954 - - Freemarker does not handle map correctly, cant lookup value -
- Bug - - WW-953 - - Very bad performance using new WW 2.2 tags -
- Bug - - WW-952 - - Superflous logging with config-browser -
- Bug - - WW-951 - - Config browser problem -
- Bug - - WW-950 - - config-browser showConfig.action not work -
- Improvement - - WW-949 - - UI Form element should support theme attribute -
- Improvement - - WW-948 - - Make build from distribution package self-contained -
- Bug - - WW-947 - - Sample webapps build process is broken in the distribution -
- Task - - WW-946 - - File interceptor should allow all files unless otherwise specified -
- Bug - - WW-944 - - Disabled namespace attribute when not using AJAX validation -
- Bug - - WW-943 - - AJAX validation and devMode don't play nice -
- Bug - - WW-941 - - Cleanup and SiteMesh problems -
- Bug - - WW-940 - - Dates cause problem with UI tags in FM -
- Improvement - - WW-939 - - Clean-up the Release Notes -
- Bug - - WW-938 - - WW:Sort Tag is not working -
- Bug - - WW-937 - - theme css_xhtml is missing form-close.ftl -
- Bug - - WW-936 - - problem with ww:form tag -
- New Feature - - WW-933 - - Add a page to test all UI components -
- Task - - WW-931 - - Add dojo Color-Chooser functionality. -
- Bug - - WW-930 - - ClassCastException in WW2 label tag rendering when value expression evaluates to a non-String type -
- Bug - - WW-929 - - Freemarker rendering of input tags should not apply locale formatting -
- Bug - - WW-928 - - Seems like download page gives wrong file of ww 2.2 beta 2 -
- Bug - - WW-927 - - ww 2.2 beta binaries is available for downloading, but xwork 1.1 is not -
- Bug - - WW-926 - - Type conversion fails with ModelDriven actions -
- Task - - WW-925 - - Document the config-browser in Related Tools -
- Task - - WW-923 - - Fix up validation documentation -
- Bug - - WW-921 - - Defect in com.opensymphony.webwork.views.util.ResourceUtil -
- Bug - - WW-920 - - Missing attribute for ww:form tag -
- Bug - - WW-919 - - Bug in DefaultActionMapper (could be Weblogic specific) -
- Bug - - WW-918 - - Setting webwork locale or Action locale has no effect on JasperReports result -
- Bug - - WW-917 - - HttpServletRequest locale/encoding problem -
- Task - - WW-916 - - Complete Architecture section of Documentation -
- Task - - WW-915 - - Complete Introduction section of Documentation -
- New Feature - - WW-914 - - Create new ww:errors tag -
- New Feature - - WW-913 - - Alt Syntax Migration - Page Specific altSyntax Change -
- New Feature - - WW-912 - - ww:a support for preInvokeJS -
- Task - - WW-911 - - Fix velocity code bug -
- Task - - WW-910 - - Update the IOC section to reflect Spring intergration. -
- Bug - - WW-909 - - Document FreeMarker simple map change -
- Bug - - WW-907 - - ww:a does not support nested param tags -
- Sub-task - - WW-905 - - Update Scope Interceptor Documentation -
- Sub-task - - WW-904 - - Update Execute and Wait Interceptor Documentation -
- Sub-task - - WW-903 - - Update File Upload Interceptor Documentation -
- Sub-task - - WW-902 - - Update Chaining Interceptor Documentation -
- Sub-task - - WW-901 - - Complete Conversion Error Interceptor Documentation -
- Sub-task - - WW-900 - - Complete Prepare Interceptor Documentation -
- Sub-task - - WW-899 - - Complete Servlet Config Interceptor Documentation -
- Sub-task - - WW-898 - - Complete Workflow Interceptor Documentation -
- Sub-task - - WW-897 - - Complete Validation Interceptor Documentation -
- Sub-task - - WW-896 - - Complete Token Session Interceptor Documentation -
- Sub-task - - WW-895 - - Complete Token Interceptor Documentation -
- Sub-task - - WW-894 - - Complete Component Interceptor Documentation -
- Sub-task - - WW-893 - - Complete Model Driven Interceptor Documentation -
- Sub-task - - WW-892 - - Complete Parameters Interceptor Documentation -
- Sub-task - - WW-891 - - Complete Static Parameters Interceptor Documentation -
- Sub-task - - WW-890 - - Complete I18n Interceptor Documentation -
- Task - - WW-889 - - Complete Interceptor Documentation -
- Task - - WW-887 - - Clean up FAQ -
- Task - - WW-885 - - Document how validation picks up a default validators.xml now -
- Task - - WW-884 - - Document new type conversion/collection stuff -
- Task - - WW-883 - - Document general FM result integration (very basics) -
- Task - - WW-882 - - Document general jsp result integration (very basics) -
- Task - - WW-881 - - Document general velocity result integration (very basics) -
- Task - - WW-880 - - Rename Prototype to QuickStart -
- Task - - WW-879 - - Rename WebFlow to SiteGraph -
- Task - - WW-878 - - Document ivy build process and how dependencies are handled -
- Task - - WW-877 - - Start new, clean "best practices" section -
- Task - - WW-876 - - Document how to launch "WebFlow" (SiteGraph?) -
- Task - - WW-875 - - Document changes to the Session Map impl -
- Task - - WW-873 - - Document how static content is served -
- Task - - WW-872 - - Document date picker tag -
- Task - - WW-871 - - Document altSyntax and TagSyntax -
- Task - - WW-870 - - Document JSP-only tags -
- Task - - WW-869 - - Document JSP tag syntax (like Velocity and FM) -
- Task - - WW-868 - - Document each generic tag -
- Task - - WW-867 - - Document new webwork.properties settings -
- Task - - WW-866 - - Document ActionMapper feature -
- Task - - WW-865 - - Document ParameterNameAware feature -
- Task - - WW-864 - - Document new redirect-action result type -
- Task - - WW-863 - - Document special button names (action:, etc) -
- Task - - WW-862 - - Document themes and new theme extension feature -
- Task - - WW-861 - - Pure client side validation -
- Task - - WW-860 - - Document deleted/deprecated items -
- Task - - WW-859 - - Document AJAX features -
- Task - - WW-858 - - Document prototype/launcher info -
- Task - - WW-857 - - Document execAndWait changes -
- Task - - WW-856 - - Document file upload interceptor/file upload -
- Task - - WW-855 - - Document i18n interceptor -
- Task - - WW-854 - - Document continuations -
- Task - - WW-853 - - Document XWork IOC deprecation -
- Bug - - WW-851 - - webwork.components.Form small bug: -
- Bug - - WW-850 - - taglib.tld form tag missing afterLoading attrobite -
- Bug - - WW-849 - - reloadingText attribute not on PanelTag -
- Bug - - WW-848 - - example webapp starter throws NullPointerException in com.acme.CreatePerson.execute( ) -
- Bug - - WW-847 - - WW2.2 Tag Syntax Issues -
- Bug - - WW-846 - - css_xhtml validation.js addError IE bug fix -
- Bug - - WW-845 - - css_xhtml/submit.ftl remove controlfooter include -
- Bug - - WW-844 - - JspTaglibs in freemarker isn´t working -
- Bug - - WW-842 - - datepicker always set the value in the last field -
- Bug - - WW-841 - - Illegal flush with URL Tag and Sitemesh Tags -
- Bug - - WW-840 - - Shopping cart add to cart not working -
- New Feature - - WW-839 - - css_xhtml theme -
- Bug - - WW-836 - - DispatcherUtils not JDK 1.3 compliant -
- Improvement - - WW-835 - - FileUploadInterceptor should use a deny-all policy instead of both a allow and disallow. -
- Bug - - WW-834 - - Freemarker CallbackWriter does not properly write out content if usesBody() is true -
- Bug - - WW-833 - - DWRValidator not populating entire context -
- Bug - - WW-832 - - Shoping-Cart Example Has Several Issues -
- Bug - - WW-831 - - Incorrect wrap attribute of the TextArea UI component -
- Bug - - WW-829 - - VelocityResult does not always call OutputStreamWriter flush() method -
- Bug - - WW-828 - - maxlength is broken -
- Bug - - WW-825 - - The onsubmit attribute in the form tag is missing -
- Bug - - WW-824 - - redundant ServletDispatcher error handling complicates filters -
- Bug - - WW-823 - - Displaytag still doesn't work -
- Bug - - WW-821 - - FileUploadInterceptor Error When not set parameter,and should save message in properties -
- Task - - WW-820 - - Reconcile dojo with the newest release -
- Bug - - WW-819 - - Orionserver filter request doesn't contain action name in getServletPath() -
- Bug - - WW-817 - - Sitemesh decorator not finding actions when using FilterDispatcher -
- New Feature - - WW-815 - - Ability to Specify ObjectFactory -
- Improvement - - WW-813 - - Make ExecuteAndWaitInterceptor easier to extend -
- Bug - - WW-812 - - JasperReports: support for delimeter -
- Bug - - WW-811 - - StreamResult doesn't close InputStream -
- Bug - - WW-810 - - Iterator Sort tag fails -
- Improvement - - WW-806 - - Better logging of parameters interceptor -
- Bug - - WW-804 - - Not clear where ww2 looks for webwork.velocity.configfile -
- Bug - - WW-800 - - ACTION_NAME is never put on the stack -
- Bug - - WW-798 - - JakartaMultiPartRequest does not set the header encoding, so the filename can not be parsed correctly when using a UTF-8 encoding in request. -
- Bug - - WW-792 - - ActionTag does not replace old stack on exception -
- Bug - - WW-791 - - Configuration browser does not work with velocity 1.4 -
- Bug - - WW-790 - - WebWork does not refresh ressource bundle when told to do so -
- Bug - - WW-787 - - support for onclick scripting event missing in checkboxlist tag -
- Improvement - - WW-786 - - Add contains to ComponentTag -
- Bug - - WW-784 - - ww:property does not escape HTML by default -
- Improvement - - WW-783 - - Checkboxlist.vm in xhtml should point to Checkboxlist.vm under simple template dir -
- Bug - - WW-781 - - Velocity contexts are shared between threads -
- Bug - - WW-780 - - Manifest problem with dependency commons-logging -
- Bug - - WW-779 - - WebWorkTagSupport.translateVariables() doesn't work with lists or maps -
- Bug - - WW-778 - - WW2: IfTag does not always return true or false -
- Bug - - WW-776 - - MultipartRequestWrapper swallows errors coming from a parser -
- Bug - - WW-775 - - ww:if/else expression bug -
- Bug - - WW-774 - - WW framework creates extraneous Session objects -
- Bug - - WW-773 - - UrlHelper SHOULD use &amp; entity instead of & to add GET parameters -
- Bug - - WW-768 - - The label.vm template uses attribute "id" instead of "for" -
- Bug - - WW-767 - - 2.1.7 AbstractListTag throw NullPointerException in method evaluateExtraParams -
- Improvement - - WW-763 - - True velocity macros for UI tags -
- Bug - - WW-761 - - FileUploadInterceptor does not use parameters defined in JavaDocs. -
- Bug - - WW-760 - - white space issue with webwork.custom.i18n.resources webwork.properties property -
- Bug - - WW-759 - - LogFactory.releaseAll() should be called at application end -
- Improvement - - WW-758 - - Use Introspector.flushCashes() to deal with memory leaks on application reload -
- Bug - - WW-756 - - broken link in wikidoc -
- New Feature - - WW-755 - - XMLHttpRequest component to replace DOM node with new HTML -
- Bug - - WW-754 - - Infinite Loop in XSLTResult's DOM adapter -
- Bug - - WW-753 - - Website 404s -
- Bug - - WW-751 - - xslt view support needs to implement additional methods to support 1.5 -
- Bug - - WW-748 - - StreamResult should be close inputStream -
- Bug - - WW-747 - - URLHelper class does not use charset for encoding -
- Bug - - WW-745 - - no scripting attributes on the submit tag -
- Bug - - WW-744 - - Tutorial needs to have latest jar -
- Bug - - WW-743 - - execAndWait Interceptor Override Default Action Method -
- Bug - - WW-742 - - wrap attribute in textarea.vm in 'simple' template -
- Improvement - - WW-740 - - UI tag checkboxlist should have html scripting events attribute -
- Bug - - WW-739 - - Action tag TLD missing ignoreContextParams -
- Improvement - - WW-738 - - Use ObjectFactory in velocityManager for setting webwork.velocity.contexts -
- Improvement - - WW-737 - - JasperReports examples in the webwork-example app not working -
- Bug - - WW-736 - - XmlHttpRequest validation breaks on IE -
- Bug - - WW-735 - - $webwork.evaluate() throws NPE -
- Bug - - WW-730 - - 2.1.7 text taglib is not compatible with old version -
- Bug - - WW-729 - - UrlTag always includes parameters unless includeParams is explicitly set to false -
- Bug - - WW-725 - - The include tag doesn't cleanup after itself -
- Bug - - WW-721 - - <ww:subset/> problem -
- Improvement - - WW-720 - - Add content-length to StreamResult -
- Improvement - - WW-719 - - Session object not auto-shared with Velocity context -
- Bug - - WW-717 - - The "label" tags is missing the "for" attribute -
- Bug - - WW-713 - - The <ww:url> tag does not correctly construct the URL when the scheme attribute is set and the scheme changes. -
- Improvement - - WW-712 - - Update config browser to work with the new syntax -
- Improvement - - WW-709 - - Allow specifying a text for empty option on the select tag -
- Bug - - WW-708 - - AbstractListTag classes throw NPE for null value -
- Bug - - WW-707 - - Velocity templates in UTF-8 still do not work -
- Bug - - WW-700 - - Validation lacking logging of missing field. -
- New Feature - - WW-697 - - Regex Field Validator -
- Bug - - WW-682 - - change webwork.ui.templateDir=otherDir, tag class, doEndTag: Unable to find resource '/template/simple/scripting-events.vm' error. -
- New Feature - - WW-679 - - The "Component" UI tag can't be used as part of a Velocity #bodytag directive -
- Bug - - WW-672 - - URLTag does not reset between invocations -
- Bug - - WW-654 - - Error occurs with Page Context when having request dispatcher code in the Action code -
- Bug - - WW-650 - - CoolUriServletDispatcher throws StringIndexOutOfBoundsException -
- Bug - - WW-648 - - Client-side validation doesn't allow cancelling -
- Improvement - - WW-636 - - Improve URL-Tag to support value stack and namespaces -
- Bug - - WW-621 - - Lesson 2 web.xml refers to webwork-2.1.jar file -
- Improvement - - WW-609 - - Velocity context available in Sitemesh 2.1 and WebWork use different keys for the request and response -
- New Feature - - WW-603 - - Create a NumericFieldValidator using JavaScript -
- Bug - - WW-596 - - IllegalArgumentException when setting an indexed property -
- Bug - - WW-591 - - Wrong output when using nesting #bodytags (with a custom tag) -
- Improvement - - WW-589 - - Printer-friendly of all documentatioon -
- Bug - - WW-588 - - Unexpected behaviour of SessionMap.clear() -
- Bug - - WW-572 - - Lesson 2 incorrectly references the xwork-validator-1.0.dtd for validators.xml -
- Bug - - WW-570 - - Table tag parameters and sorting -
- New Feature - - WW-558 - - Exception Handler Interceptor and Exception Action -
- Bug - - WW-557 - - Generator Tag doesn't work properly -
- Improvement - - WW-556 - - Allow ComponentManager scopes to be independant -
- New Feature - - WW-540 - - Add a ServletFilter to clean up the ActionContext, allowing Sitemesh decorators to use the ActionContext with the taglib -
- Bug - - WW-536 - - Lost the session on OC4J 9.0.4 using WebWork2 -
- Bug - - WW-533 - - Add support for Velocity 1.4 - Changes WebWork directives -
- Improvement - - WW-528 - - Switch to using VelocityViewServlet from VelocityTools -
- Bug - - WW-520 - - Wrong &amp; management in XML based output (WML and XHTML) -
- Bug - - WW-513 - - IOC Application and Session scopes do not work in Tomcat 5 -
- Bug - - WW-507 - - "command" parameter isn't honored for command driven actions -
- Bug - - WW-505 - - Re-opened WW-430 (double action tag bug) -
- Improvement - - WW-491 - - Spring/Xwork Action configuration -
- Bug - - WW-489 - - Setting of pageContext in directive (tag) -
- Improvement - - WW-477 - - WebWork needs a simple "Hello World" demo app -
- New Feature - - WW-463 - - ww:error tag -
- Improvement - - WW-452 - - Pell Multipart library dies if content type is too long -
- Bug - - WW-447 - - CoolUriServletDispatcher errors related to getServletPath() -
- New Feature - - WW-439 - - Simple wizard framework -
- Bug - - WW-436 - - ParamTag inconsistently evaluates the 'name' attribute -
- Improvement - - WW-416 - - Reload resourcebundle from filesystem during runtime -
- Bug - - WW-405 - - Escaping text in form fields from velocity tags not working. -
- Bug - - WW-395 - - urltag doesnt show the exact url used -
- Improvement - - WW-394 - - ServletDispatcher to use requestURI instead of servletPath -
- New Feature - - WW-341 - - ScopeInterceptor -
- New Feature - - WW-337 - - Text formatting support from tag library -
- New Feature - - WW-329 - - Date picker component -
- New Feature - - WW-304 - - client-side validations based on validation framework declared validations -
- Bug - - WW-291 - - Too sophisticated exception handling in servlet dispatcher -
- Improvement - - WW-270 - - Component UI tag should allow body content manipulation -
- Bug - - WW-220 - - Velocity template for ui:textarea needs improvement -
- New Feature - - WW-159 - - ServletRedirectResult should be aware of context paths -
- New Feature - - WW-157 - - Better JSTL Support -
- Task - - WW-16 - - More velocity macros, etc -
- New Feature - - WW-6 - - Support for Portlet API -
-

- - -
- - diff --git a/docs/wikidocs/WebWork Freemarker Support.html b/docs/wikidocs/WebWork Freemarker Support.html deleted file mode 100644 index 21ba97937..000000000 --- a/docs/wikidocs/WebWork Freemarker Support.html +++ /dev/null @@ -1,158 +0,0 @@ - - - WebWork - - WebWork Freemarker Support - - - - - - - - - - -
-

Freemarker Support in WebWork

- -

Freemarker views can be rendered either via the webwork result type freemarker, or by using the dispatcher result type in conjunction Webwork's FreemarkerServlet.

- -

This document will focus on using the freemarker result since it is the recommended approach. An section follows to show how to use the FreemarkerServlet.

- -

Configure your action to use the freemarker result type

- -

The freemarker result type is defined in webwork-default.xml, so normally you just include it, and define your resutls to use type="freemarker".

- -
-
<include file="webwork-default.xml"/>
-...
-<action name="test" class="package.Test">
-  <result name="success" type="freemarker">/WEB-INF/views/testView.ftl</result>
-</action>
-...
-
- - - -

Property Resoloution

- -

Your action properties are automatically resolved - just like in a velocity view.

- -

for example ${name} will result in stack.findValue("name"), which generaly results in action.getName() being executed.

- -

A search process is used to resolve the variable, searching the following scopes in order, until a value is found :

-
    -
  • freemarker variables
  • -
  • value stack
  • -
  • request attributes
  • -
  • session attributes
  • -
  • servlet context attributes
  • -
- - -

Objects in the Context

- -

The following variables exist in the freemarer views

- -
    -
  • req - the current HttpServletRequest
  • -
  • res - the current HttpServletResponse
  • -
  • stack - the current OgnlValueStack
  • -
  • ognl - the OgnlTool instance -
      -
    • This class contains useful methods to execute OGNL expressions against arbitary objects, and a method to generate a select list using the <ww:select> pattern. (i.e. taking the name of the list property, a listKey and listValue)
    • -
    -
  • -
  • webwork - an instance of FreemarkerWebWorkUtil
  • -
  • action - the current WebWork action
  • -
  • exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view
  • -
- - - - -

FreeMarker configuration with recent (post 2.1) releases

- -

To configure the freemarker engine that webwork uses, just add a file freemarker.properties to the classpath. The supported properties are those that the freemarker Configuration object expects - see the freemarker documentation for these. These properties are used for both the freemarker result type, and the webwork provided FreemarkerServlet.

- -
-
default_encoding=ISO-8859-1
-template_update_delay=5
-locale=no_NO
-
- - -

Using webwork UI tags - or any JSP Tag Library

- -

Freemarker has builtin support for using any JSP taglib. You can use JSP taglibs in FreeMarker even if
-a) your servlet container has no support for JSP, or
-b) you didn't specify the taglib in your web.xml - note how in the example below we refer to the taglib by its webapp-absolute URL, so no configuration in web.xml is needed.

- -
-
<#assign ww=JspTaglibs["/WEB-INF/webwork.tld"] />
-
-<@ww.form method="'post'" name="'inputform'" action="'save.action'" >
-    <@ww.hidden name="'id'" />
-    <@ww.textarea label="'Details'" name="'details'" rows=5 cols=40 />
-    <@ww.submit value="'Save'" align="center" />
-</@ww.form>
-
- -

NOTE : numeric properties for tags MUST be numbers, not strings. as in the rows and cols properties above. if you use cols="40" you will receive an exception. Other than that, the freemarker tag container behaves as you would expect.

- - - - - - -

Using the FreemarkerServlet

- -

The FreemarkerServlet provided in the freemarker.jar will work out of the box however it won't provide any webwork specific functionality such as the context variables, property resoloution etc. Therefore webwork provides its own servlet to provide this integration.

- -

Register the FreemarkerServlet in web.xml

- -

To use freemarker as a view engine, the webwork2 FreemarkerServlet needs to be configured, and mapped to the file extension that you use for your templates.

- -
-
<servlet>
-  <servlet-name>freemarker</servlet-name>
-  <servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>
-</servlet>
-
-<servlet-mapping>
-  <servlet-name>freemarker</servlet-name>
-  <url-pattern>*.ftl</url-pattern>
-</servlet-mapping>
-
- -

Configure Actions to use this servlet (xwork.xml configuration)

- -

To use the freemarker view, just use the dispatcher result type, and specify the location to the template file.

- -
-
<action name="test" class="package.Test">
-  <result name="success" type="dispatcher">/WEB-INF/views/testView.ftl</result>
-</action>
-
- -

Extending the servlet

- -

NOTE: these docs need to be revised, since the FreemarkerServlet has changed since they were written.

- -

Please refer to the freemarker site for details about the base freemarker servlet.

- -

Be carfeul when subclassing com.opensymphony.webwork.views.freemarker.FreemarkerServlet when overriding

- -
-
protected TemplateModel createModel(
-    ObjectWrapper wrapper, 
-    ServletContext servletContext, 
-    HttpServletRequest request, 
-    HttpServletResponse response)
-
- -

Please call super.createModel(...) and wrap it with a new model to avoid problems with action property resoloution.

- -
- - diff --git a/docs/wikidocs/WebWork Overview.html b/docs/wikidocs/WebWork Overview.html deleted file mode 100644 index c624b5894..000000000 --- a/docs/wikidocs/WebWork Overview.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork - - WebWork Overview - - - - - - - - - - -
-

WebWork is a powerful web-based MVC framework built on top of a command pattern framework API called XWork. The true power of Webwork is its underlying concept of simplicity and interoperability. Using WebWork will help minimize code and allow developers to concentrate more on business logic and modeling, rather than the plumbing often required when building web-based applications.

- -

Features

- -
    -
  • A flexible Validation framework allowing you to decouple validation rules from your action code.
  • -
  • Type Conversion allowing you to easily convert objects from one class to another, solving one of the most tedious efforts when creating web apps.
  • -
  • A powerful Expression Language based on OGNL allowing dynamic object graph traversal and method execution and transparent access to properties from multiple beans using a ValueStack. Webwork also has the ability to use JSTL.
  • -
  • Inversion of Control integration that manages component lifecycle and dependencies without the need to build registry classes that clients must call to obtain a component instance. WebWork recommends Spring for IoC.
  • -
  • Reusable Tags that allow for easy and reusable component-oriented web development using Themes and Templates
  • -
  • Advanced Interceptors that provide for various rich functionality, including preventing multiple form submissions and executing long running queries in the background.
  • -
  • Hierarchical and pluggable support for Internationalization.
  • -
  • Easy integration with third party software including Hibernate, Spring, Sitemesh, and JSTL.
  • -
  • Support for many view technologies such as JSP, FreeMarker, and JasperReports.
  • -
  • Modular Configuration Files using packages and namespaces to manage hundreds of actions.
  • -
  • Advanced AJAX features provided by the ajax theme.
  • -
- - -
- - diff --git a/docs/wikidocs/WebWork.html b/docs/wikidocs/WebWork.html deleted file mode 100644 index ee9d18267..000000000 --- a/docs/wikidocs/WebWork.html +++ /dev/null @@ -1,140 +0,0 @@ - - - WebWork - - WebWork - - - - - - - - - - -
-

Welcome to the WebWork wiki. WebWork's official homepage is http://www.opensymphony.com/webwork/. There you can find documentation for the latest released version of WebWork. This wiki is used for additional information as well as documentation for the latest developing version.

- -

About WebWork

- - - - -

Getting Started

- - - - -

Reference

- - - - -

Users

- - - - -

Developers & Contributors

- - - - -

Integration, Tools, IDE

- - - - -

Help

- - - - -
- - diff --git a/docs/wikidocs/WebWorkTargetSource Shopping Cart Example.html b/docs/wikidocs/WebWorkTargetSource Shopping Cart Example.html deleted file mode 100644 index a05da7a87..000000000 --- a/docs/wikidocs/WebWorkTargetSource Shopping Cart Example.html +++ /dev/null @@ -1,169 +0,0 @@ - - - WebWork - - WebWorkTargetSource Shopping Cart Example - - - - - - - - - - -
-

WebWorkTargetSource Shopping Cart Example

- -

Here is a modified version of the shopping cart example which uses the WebWorkTargetSource. Its a quick hack to show how the WebWorkTargetSource and not as a complete solution or template for usage. If my documentation is unclear (probable) or none of this makes sense (quite possible too) then just replace the existing versions of DefaultCart.java and applicationContext.xml with these versions and fire up the example.

- -

DefaultCart Modifications

- -

Two modifications to DefaultCart.java are necessary in order to make the autowiring work. When spring goes to look for beans to autowire it will see two ShoppingCarts and barf as for autowiring to work it needs to see only one. To avoid this the DefaultCart has been modified to not implement the ShoppingCart interface. However there is a fun inner class and inner interface that makes this change a bit more complex. In order to make the DefaultCart compile (and still work) all references to CartEntry need to be changed to ShoppingCart.CartEntry.

- - -
DefaultCart.java
-
package com.opensymphony.webwork.example.ajax.cart;
-
-import com.opensymphony.webwork.example.ajax.catalog.Product;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import sun.reflect.Reflection;
-
-/**
- * DefaultCart - Poorly Modified by Eric Molitor <eric@tuxbot.com>
- *
- * @author Jason Carreira <jcarreira@eplus.com>
- */
-public class DefaultCart {
-    Map contents = new HashMap();
-
-    public static DefaultCart getCart() {
-        return new DefaultCart();
-    }
-
-    public void addToCart(int quantity, Product product) {
-        ShoppingCart.CartEntry entry = (ShoppingCart.CartEntry) contents.get(product);
-        if (entry == null) {
-            entry = new DefaultCartEntry(quantity, product);
-            contents.put(product, entry);
-        } else {
-            entry.setQuantity(entry.getQuantity() + quantity);
-        }
-    }
-
-    public void setQuantity(int quantity, Product product) {
-        if (quantity <= 0) {
-            contents.remove(product);
-            return;
-        }
-        ShoppingCart.CartEntry entry = (ShoppingCart.CartEntry ) contents.get(product);
-        if (entry == null) {
-            entry = new DefaultCartEntry(quantity, product);
-            contents.put(product, entry);
-        } else {
-            entry.setQuantity(quantity+entry.getQuantity());
-        }
-    }
-
-    public void removeFromCart(Product product) {
-        contents.remove(product);
-    }
-
-    public Set getContents() {
-        return new HashSet(contents.values());
-    }
-
-    public int getQuantityForProduct(Product product) {
-        ShoppingCart.CartEntry entry = (ShoppingCart.CartEntry) contents.get(product);
-        if (entry == null) {
-            return 0;
-        }
-        return entry.getQuantity();
-    }
-
-    public String toString() {
-        return "DefaultCart{" +
-                "contents=" + contents +
-                "}";
-    }
-
-    public static Object getBean() {
-
-       System.out.println("!!!!!!!!!!!! Parent is:" + Reflection.getCallerClass(1));
-        new Exception("poo").printStackTrace();
-       return new DefaultCart();
-    }
-
-    class DefaultCartEntry implements ShoppingCart.CartEntry {
-        private int quantity;
-        private Product product;
-
-        public DefaultCartEntry(int quantity, Product product) {
-            this.quantity = quantity;
-            this.product = product;
-        }
-
-        public int getQuantity() {
-            return quantity;
-        }
-
-        public void setQuantity(int quantity) {
-            this.quantity = quantity;
-        }
-
-        public Product getProduct() {
-            return product;
-        }
-    }
-}
-
- - -

applicationContext.xml Modifications

- -

In order to get a session specific shopping cart we need to modify the actionContext to call our WebWorkTargetSource. We do this by using a ProxyFactory which creates an object based on our interface (ShoppingCart) and uses the targetSource to invoke our custom TargetSource (WebWorkTargetSource). WebWorkTargetSource however needs to know the underlying implementation in order to fetch and create new instances. We pass a reference to the new shoppingCartTarget bean definition which just references our new DefaultCart. In order to keep things from getting confused we're set both beans to autowire by name.

-
-
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-
-<beans default-autowire="autodetect">
-
-    <bean id="catalog"
-          singleton="true"
-          class="com.opensymphony.webwork.example.ajax.catalog.TestCatalog"/>
-
-    <bean id="shoppingCart" class="org.springframework.aop.framework.ProxyFactoryBean" autowire="byName">
-
-        <property name="proxyTargetClass">
-            <value>true</value>
-        </property>
-        <property name="proxyInterfaces">
-            <list>
-                <value>com.opensymphony.webwork.example.ajax.cart.ShoppingCart</value>
-            </list>
-        </property>
-        <property name="targetSource">
-            <bean class="org.tuxbot.webwork.spring.WebWorkTargetSource">
-                <property name="targetBeanName">
-                    <value>shoppingCartTarget</value>
-                </property>
-            </bean>
-        </property>
-    </bean>
-
-    <bean id="shoppingCartTarget"
-          class="com.opensymphony.webwork.example.ajax.cart.DefaultCart"
-          singleton="false" autowire="byName">
-    </bean>
-
-</beans>
-
- -
- - diff --git a/docs/wikidocs/WebWork_attachments/webworka [Converted].eps b/docs/wikidocs/WebWork_attachments/webworka [Converted].eps deleted file mode 100644 index 1624a3836..000000000 --- a/docs/wikidocs/WebWork_attachments/webworka [Converted].eps +++ /dev/null @@ -1,52 +0,0 @@ -%!PS-Adobe-3.1 EPSF-3.0 %%Title: webworka [Converted].eps %%Creator: Adobe Illustrator(R) 11 %%AI8_CreatorVersion: 11.0.0 %AI9_PrintingDataBegin %%For: H %%CreationDate: 3/30/04 %%BoundingBox: 0 0 619 576 %%HiResBoundingBox: 0 0 618.3335 576 %%CropBox: 0 0 618.3335 576 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0) %%+ procset Adobe_CoolType_Utility_T42 (1.0 0) %%+ procset Adobe_CoolType_Utility_MAKEOCF (1.19 0) %%+ procset Adobe_CoolType_Core (2.23 0) %%+ procset Adobe_AGM_Core (2.0 0) %%+ procset Adobe_AGM_Utils (1.0 0) %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 128 120 8 %%BeginData: 6480 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD7FFFA8A8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD %FCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD34FFA87EFD09FF7EA9 %FD08FFA8A8A8FD66FF7E28000000A2FD05FF5300000053A8FD04FFA92800 %002253FD32FFA8FD31FF7D00007D5328F87EFFFFFF53F84D7D5300285353 %527D0000537E280053FD63FF2800FFFFFFA82828FFFFA90053CFCFCF7E00 %0100010022A8FFFFFF2801A8FD30FFA8FD31FF0053FD04FF5300A8FF7700 %A8A77BA6A82822FFA82228FD04FF7E007EFD62FF2252FD04FF77007EA84C %00A8A7A0A0FF0053FFFF2828FD04FF7D007EFD30FFA8FD31FF28007EFFFF %A8FD060028CFA7CF52007DFFFF7DF87DFFFFA82200FD64FF000028530028 %7EA87DA977000053280028FD04FF28004D520100A8FD31FFA8FD33FF4C01 %0053A8FD05FF7D28002853FD05FFA953002228A8FDB2FFA8FDACFFCFFD2C %FFA8A8FD0AFFA8537D5377537753A9FD11FFA8FD23FFCAFFFFFFCAFFFFFF %A0A7FFFFCAFFFFFFCAFFFFFFA8FD05FFA9FD05FFA8FFFFFFA8A9A8A8A8A9 %A8FD05FFA8FFA8FFA8FF2853FD06FFA9FFFFFF7D53537DFD045300A8FD23 %FFA0FD04FFCFA0FD05FFA0FFA8A7A0A7A0A7A0A7A0A6CACA7CA7A0A7A0A7 %A0A6A6FF5353FD04FF7D28FD04FFA828A8A8002800282228002853FF7D28 %0128002822287E5353FD05FFA828A8FD05FFA8FFA8FF7E01A8FD10FFA8FD %11FFA8A6A8FFFFFFA7A0A8FFFFFFA8A6A8A6A1FFA8FFA8FFCAA77CFFA7A7 %A8FFA8FFA8FFA8A6A75328FD04FF7E00FD04FFA900A80053FFFFA8FFA8FF %7D007E2828FFFD05A8FF282828532853282800FFFFFF7D28285328532828 %53FD24FFA0CFFFFFFFCFA0FD05FFA0CFA0CFFD06FFA7CFFFC9A7FD07FFA0 %CF5328FD04FF5301A8FFFFFF7E22A8287DFD06FFA900A800A8FD07FF5301 %534C5352532828A8FFFF4D53FD18FFA8FD12FFA7A0A7A0A7A0A67CA7A0A7 %7CA7FFA87CA7A0A7A0A7A0A7A0CFA7A0A0A7A0A7A0A7A0A0CAA900282228 %280100282828222228FF53012228222828280053A8007DFD07FF2853FD05 %FFA8007E7EFF2828284C2853284C28A8FD25FFCACFA8FFFFCFA8CFCACFFD %04FFA8CFCACFA8CFCACFCFFFCACFA8CFCACFA8CFCFFFFFFF7EA87EA8A8FF %7EA87EA87EFFFFFFA8A87EA87EA87EA8FFFFA8FD08FFA8A8FD06FFA8A8FF %FFA97EA87EA87EA87EA8A8FD10FFA8FD5BFFA8FD48FFA87EA9A8A8FF7DFF %FFCBA8FF7DFF7EFFA8FFA8FF7DFFA8FFA8A8A9FFA8A8FFA8FFFFA8A8A97E %FFA8FFA87EFF7DFF7EA8FF7EFFA8A8A97EFD24FFA8FD25FF53FF7EA8A87E %FFFFA8A2A87EFFA8A8A9A8A8A87EA8A87EFFA8FFA8A87EFF7DFFFFA8A8FF %7DFF7DFF7E7EA87EFF7E7DFF77FF7DA8A8A8FDA4FFA8FDFCFFFFFFFFA8FD %FCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFF %FFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD37FFA953 %287EFFA8282877A87D2828A8FD72FF7D53FF28FF537DA7282828A8A928FD %3AFFA8FD37FF5353A828222852A128FF4C7E7D53FD73FF534D7EFFA85328 %A8FFA92853A8FD3AFFA8FDACFFCFFFCFFFFFFFCFCFA8CFCACAA7FFA8CFA8 %FFFFA9FFFFA8A87DA87EA9A87E7EA853A9FFFFA8FD2EFFA8FD2BFFA8A7FF %A7A7FFA0A7A7CFFD04A7A8CFA7527DFF28A8A828287D7D7E28287DA8A853 %287D2853FD5BFFA7CFA7CAA7CFCFCFA7CFCACFA7CFA7CFA87D537D537DA2 %A8537E7DA27DFFFFFF7EA9FFA97DFD2EFFA8FD31FFA8A9A8A9A9A9A8A9A8 %FFA8CBA8FFA8FFA8FFA8A9A8A9A8A9A8FD68FFA8FFA9FFA8FFCBFFA8FFA9 %FFA8FFFFFFA8FFA9FFA8FFA9FFA8FD34FFA8FDFCFFFFFFFFA8FDFCFFFFFF %FFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8FDFCFFFFFFFFA8 %FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD2BFFA0A7A0A07CA77CA6A0A67CA67C %A67CA07CA67CA07CA67CA67CA67CA07CA67CA07CA67CA67CA6A7FD58FFA7 %C9CACFA0FFCFCFA7CFA7A7A0A7A0A7A7C9A7C9FD04A7A0A7A0A7A6C9A7A7 %A6C9A7CAA0A7A0A6CAFD2CFFA8FD2AFFA6A7CAA8CFA8FFA7CAA7CAA7A7A8 %A7A8CFA7CFA8CFA7CFA8A7A7CAA7CFA7CAA8CAA0A7A8A7A8A77BCAFD57FF %A7A6A7A7A0A7A7A6A6CAA0A6A7A7A0A7A0A7A0A7A6A7A0A7A7A7A0A7A0A7 %A0A7A0A07CA7A0A6A0A7FD2DFFA8FD2BFFA8A7A7CAA7A7A7CAA7A8A7CAA7 %A7A7CAA7A7A7CAA7A7A7CAA7A7A7CAA7A7A7CAA7A8A7CAA7A8A8FDADFFA8 %FDFCFFFFFFFFA8FDFCFFFFFFFFA8FD2BFFA87D7D7E537E7D7E537E7D7E7D %7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7DA8FD59FF7D22 %5328005328282853FD090001FD070001FD07002800000053FD2DFFA8FD2A %FF28537D7D53A8A97E7E537728284C00287D2853777E285353282828227D %5253537728537D535328007EFD57FF28537DA87EA8A82877A852537DA853 %7E7D7E7DA87D7D7D7E537E777E7D7E53A85301287E287E2800A8FD2CFFA8 %FD2AFFA82852002228280028282200280028002828280028282800282228 %00282828002800220022002853FD5AFFA9FFA9FFFFFFA9FFFFFFA9FFFFFF %A9FFFFFFA9FFFFFFA9FFFFFFA9FFFFFFA9FD34FFA8FDFCFFFFFFFFA8FDFC %FFFFFFFFA8FDACFF7EA8A8A87EA8A8A87EA8A8A8A2A8A8A8A2A8A8A8A2A8 %A8A8A2A8A8A8A2A8A8A8A2FD04A8FD2EFFA8FD2AFFA80028000127280028 %27000001FD07000100000001FD0B0001000028FD58FF2852527627A07C7C %52764B280053002853534C7D7D4C525300280028535328535253537E0053 %22007EFD2CFFA8FD2AFF2827525176757C2752514C527D7E7D7DA853A87E %7E537E7D7D7D7E537E7D7E7E7D00287D4C7D53007EFD57FF7E282728004C %270100520022FD04280028282800282822FD042800282828002200220022 %0053FD2DFFA8FD2BFFA8A87EA87EA87EA87EA87EA87EA87EA87EA87EA87E %A87EA87EA87EA87EA87EA87EA87EA87EA8FDAEFFA8FDFCFFFFFFFFA8FFFF %7D527DFD04527DA852527D7D527D527D52FD6EFFFD0BA8FFFD05A8FD6CFF %A8FFFFA87DA87DA8527DA8FD78FFA8A87DA87DFD08A8FD70FFA8FFFFA852 %7D7D7D527D7D7D527D527DFD73FFA8A87DA8A8A87DFFA8A87DFD72FFA8FF %FFA852A852FD047DA87D7DA8FDFCFFFDF4FFA8A8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 68 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /bdict { mark }bdf /edict { counttomark 2 idiv dup dict begin {def} repeat pop currentdict end }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /agm_sethalftone { dup begin /_Data load /Thresholds xdf end level3 { sethalftone }{ dup /HalftoneType get 3 eq { sethalftone } {pop} ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource {AGMUTIL_imagefile imbuf readstring pop} put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height { pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get dup type dup /filetype eq { exch flushbuffer readstring pop pop }if /arraytype eq { exec pop }if }for }for end } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 div mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if /arraytype eq { 1 1 Height { pop DataSource pop } for }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp AGMCORE_tmp 1 add ddf dup type /dicttype eq { AGMCORE_tmp exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { AGMCORE_tmp exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup AGMCORE_tmp 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { /CSD known }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 216 dict dup begin put /nd{ null def }bind def /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSA_cache 0 dict def /AGMCORE_CSD_cache 0 dict def /AGMCORE_pattern_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_ovp nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_gradientcache 32 dict def /AGMCORE_in_pattern false def /knockout_unitsq nd /AGMCORE_CRD_cache where{ pop }{ /AGMCORE_CRD_cache 0 dict def }ifelse /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /add_grad { AGMCORE_gradientcache 3 1 roll put }bdf /exec_grad { AGMCORE_gradientcache exch get exec }bdf /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def level2 not{ /xput{ dup load dup length exch maxlength eq{ dup dup load dup length dup 0 eq {pop 1} if 2 mul dict copy def }if load begin def end }def }{ /xput{ load 3 1 roll put }def }ifelse /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core exch /AGMCORE_gstackptr xpt AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if Adobe_AGM_Core exch /AGMCORE_gstackptr xpt }def /grestoreall { AGMCORE_&grestoreall Adobe_AGM_Core /AGMCORE_gstackptr AGMCORE_gstacksaveptr put }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core begin /AGMCORE_gstackptr exch def /AGMCORE_gstacksaveptr AGMCORE_gstackptr def end AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&usrshfill /shfill load def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /LeaveColorUnchanged eq }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ Adobe_AGM_Core/AGMCORE_name xddf false Adobe_AGM_Core/AGMCORE_in_pattern known {Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not currentpagedevice/OverrideSeparations known and { currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]setcolorspace false currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def level3 { /AGMCORE_IsCurrentColor { gsave false setoverprint 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq grestore }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { clonedict AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def currentdict end exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def /level2ScreenFreq{ begin 60 HalftoneType 1 eq{ pop Frequency }if HalftoneType 2 eq{ pop GrayFrequency }if HalftoneType 5 eq{ pop Default level2ScreenFreq }if end }def /currentScreenFreq{ currenthalftone level2ScreenFreq }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa dup /MappedCSA xdf /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /currentScreenFreq{ currentscreen pop pop }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /currentpagedevice currentpagedevice def /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq { indx get } if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq { sep } { ColorSpaceFamily /DeviceN eq { devn } { setcolor }ifelse }ifelse } bind def /sssetbackground { aload pop setcolor } bind def /RadialShade { 40 dict begin /ColorSpaceFamily exch def /background exch def /ext1 exch def /ext0 exch def /BBox exch def /r2 exch def /c2y exch def /c2x exch def /r1 exch def /c1y exch def /c1x exch def /rampdict exch def /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bind def /min { 2 copy lt { pop } {exch pop} ifelse } bind def rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def /theta AA 1 AA dup mul sub sqrt div 1 atan def /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires exch def hires mul /numpix exch def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def /theta AA 1 AA dup mul sub sqrt div 1 atan def /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bind def /GenStrips { 40 dict begin /ColorSpaceFamily exch def /background exch def /ext1 exch def /ext0 exch def /BBox exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /rampdict exch def /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix exch def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bind def }def /page_trailer { end }def /doc_trailer{ }def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA map_csa setcolorspace_opt set_crd end } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc /setcolor ldf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 6 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } for AliasedColorants { dup begin /Names new_names def /AliasedColorants true def /LookupTables new_LookupTables def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if currentdict /NComponents known not { /NComponents TintMethod /Subtractive eq {4}{3}ifelse def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def Names { AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse AvoidAliasedColorants { currentspotalias set_spot_alias } if /names_index names_index 1 add def } forall painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 () /findcmykcustomcolor cvx 0 /setcustomcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ /setcolor ldf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSD known { CSD get_csd /Names known { CSD get_csd begin currentdict devncs AGMCORE_host_sep{ 4 dict begin /devnCompCnt Names length def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { devnCompCnt tableIndex map_index }{ exec } ifelse setdevicencolor currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed MappedCSA HiVal [ Lookup dup type /stringtype eq {/exch cvx CSD get_csd /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx ]cvx ]setcolorspace_opt }ifelse } ifelse end }{ } ifelse set_crd } { /MappedCSA CSA map_csa def AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSD known { begin CSD get_csd begin map_indexed_devn devn end end }{ AGMCORE_gget/Lookup get 4 3 -1 roll map_index pop setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSD known and { /indexed_colorspace_dict AGMCORE_gget /CSD get get_csd begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_csa { Adobe_AGM_Core begin /AGMCORE_CSA_cache xput end }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ Adobe_AGM_Core begin 1 dict begin /name xdf AGMCORE_CSA_cache { 0 get name eq { exit }{ pop } ifelse }forall end end }{ pop } ifelse }def /map_csa { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get }if }def /add_csd { Adobe_AGM_Core begin /AGMCORE_CSD_cache xput end }def /get_csd { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get }if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /add_pattern { Adobe_AGM_Core begin /AGMCORE_pattern_cache xput end }def /get_pattern { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get dup wrap_paintproc }if }def /wrap_paintproc { statusdict /currentfilenameextend known{ begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/Intent known{ currentcolorrendering/Intent get }{ null }ifelse Intent ne{ false Intent AGMCORE_CRD_cache { exch pop begin dup Intent eq{ currentdict setcolorrendering_opt end exch pop true exch exit }if end } forall pop not{ systemdict /findcolorrendering known{ Intent findcolorrendering pop /ColorRendering findresource dup length dict copy setcolorrendering_opt }if }if }if } def /add_crd { AGMCORE_CRD_cache 3 1 roll put }def /set_crd { AGMCORE_host_sep not level2 and{ currentdict/CRD known{ AGMCORE_CRD_cache CRD get dup null ne{ setcolorrendering_opt }{ pop }ifelse }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /path_rez { dup 0 ne{ AGMCORE_deviceDPI exch div dup 1 lt{ pop 1 }if setflat }{ pop }ifelse }def /set_spot_alias_ary { /AGMCORE_SpotAliasAry where{ pop pop }{ Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf true set_spot_alias }ifelse }def /set_spot_alias { /AGMCORE_SpotAliasAry where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry{ dup/Name get AGMCORE_name eq{ save exch /Adobe_AGM_Core currentdict def /CSD get get_csd exch restore exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput Adobe_AGM_Core begin /setcustomcolor { dup /customcolor_tint exch AGMCORE_gput current_spot_alias{ 1 index 4 get map_alias{ mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop }{ AGMCORE_&setcustomcolor }ifelse }{ AGMCORE_&setcustomcolor }ifelse }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.23 0 %%Copyright: Copyright 1997-2003 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.23 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.23 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking /@_SaveStackLevels { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 2 sub 1 index lt { pop count 1 sub } if dup /argCount exch def dup 0 gt { exch 1 index 2 add 1 roll args exch 0 exch getinterval astore pop } { pop } ifelse count 1 sub /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get /args get exch get end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup begin mark { (*) { pop stop } 128 string /Category resourceforall } stopped cleartomark currentdict eq dup { end } if not } { false } ifelse def /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end userdict /Adobe_CoolType_Data 10 dict dup begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end put } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. %%Version: 1.19 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 25 add dict copy } { 25 dict } ifelse put Adobe_CoolType_Utility begin /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } } { { eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { currentcolorspace 0 get dup /DeviceCMYK eq { pop 4 } { /DeviceRGB eq { pop 3 }{ 1 } ifelse } ifelse } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /srcDataStrs xdf /dstDataStr xdf /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /samplesNeedDecoding 0 0 1 origDecode length 1 sub { origDecode exch get add } for origDecode length 2 div div dup 1 eq { /decodeDivisor 2 origBitsPerComponent exp 1 sub def } if 2 origBitsPerComponent exp 1 sub ne def [ 0 1 dsCnt 1 sub [ currentdict /origMultipleDataSources get { dup currentdict /origDataSource get exch get dup type }{ currentdict /origDataSource get dup type } ifelse dup /filetype eq { pop currentdict /srcDataStrs get 3 -1 /roll cvx /get cvx /readstring cvx /pop cvx }{ /stringtype ne { /exec cvx } if currentdict /srcDataStrs get /exch cvx 3 -1 /roll cvx /xpt cvx } ifelse ] cvx /for cvx currentdict /srcDataStrs get 0 /get cvx /length cvx 0 /ne cvx [ 0 1 Width 1 sub [ Adobe_AGM_Utils /AGMUTIL_ndx /xddf cvx currentdict /origMultipleDataSources get { 0 1 dsCnt 1 sub [ Adobe_AGM_Utils /AGMUTIL_ndx1 /xddf cvx currentdict /srcDataStrs get /AGMUTIL_ndx1 /load cvx /get cvx /AGMUTIL_ndx /load cvx /get cvx samplesNeedDecoding { currentdict /decodeDivisor known { currentdict /decodeDivisor get /div cvx }{ currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvxs BitsPerComponent /decode_image_sample load /exec cvx } ifelse } if ] cvx /for cvx }{ Adobe_AGM_Utils /AGMUTIL_ndx1 0 /ddf cvx currentdict /srcDataStrs get 0 /get cvx /AGMUTIL_ndx /load cvx currentdict /origDecode get length 2 idiv dup 3 1 /roll cvx /mul cvx /exch cvx /getinterval cvx [ samplesNeedDecoding { currentdict /decodeDivisor known { currentdict /decodeDivisor get /div cvx }{ currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvx BitsPerComponent /decode_image_sample load /exec cvx Adobe_AGM_Utils /AGMUTIL_ndx1 /AGMUTIL_ndx1 /load cvx 1 /add cvx /ddf cvx } ifelse } if ] cvx /forall cvx } ifelse currentdict /convProc get /exec cvx currentdict /origcolorSpaceElemCnt get 1 sub -1 0 [ currentdict /dstDataStr get 3 1 /roll cvx /AGMUTIL_ndx /load cvx currentdict /origcolorSpaceElemCnt get /mul cvx /add cvx /exch cvx currentdict /convProc get /filter_indexed_devn load ne { 255 /mul cvx /cvi cvx } if /put cvx ] cvx /for cvx ] cvx /for cvx currentdict /dstDataStr get ] cvx /if cvx ] cvx bind end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def 2 dict begin dup dup /dstDataStr exch /Width get colorSpaceElemCnt mul string def /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA map_csa 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA map_csa 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get map_csa }{ /CSD get get_csd /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin CSD get_csd begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA map_csa 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget bdict /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] edict setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put dup 4 get map_alias{ /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (webworka [Converted].eps) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 - - - - Adobe PDF library 4.800 - - - - - - - - - - 2004-03-31T05:29:33Z - 2001-12-11T00:25:08-08:00 - Adobe Illustrator 9.0.1 - - - - JPEG - 256 - 240 - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9QW9vbm3iJiSvBf2R4Yq qfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/AjFXfVrf/AH0n /AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/AjFXfVrf/ AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/AjFXf Vrf/AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/A jFXfVrf/AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/3 0n/AjFXfVrf/AH0n/AjFVO4t7cW8pESV4N+yPDFVS2/3ni/1F/ViqrirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUrn/AHnl/wBRv1Yq62/3ni/1 F/ViqrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVUrn/AHnl/wBRv1Yq62/3ni/1F/ViqrirsVdirsVdirsVdirsVdirsVdirHfPnnvy/wCSPLs2 u65KyW0bCOKKMBpZpWqVijUkVY0J67AEnLMWMzNBXix/5yf88tbnXY/y7uz5UHxG/wCU9PTB/vPX EHpAU+iv7WZn5OPLi9SLez+QPP3l/wA8+XYtc0SRmgZjFPBIAssMygFopFBI5AMDsaEGuYeXEYGi lh/5qfn1pPknVIfL+nadL5g80XAUjTbdiojEg/d82VZGLvWqoqkkdaVFbsOmMxZNRVjWjf8AOTV9 Yaxbab+YnlS78rR3m0F/IsojFSN3jljjbgKjkylqeGWS0YIuB4kW9PX81vyza6NovmrSjOCRwF5B 1HavKlfpzG8CfcUvLdR/5ya1nVdVurP8vPJ135ktLJqTagBKVYDusUUblQ1PhLNU/wAuZI0YAucq RbLfyo/PXRvPV7caLdWEuh+ZrMM02l3B5cgho/puVjbkh+0jKCPfelWfTGAvmEvT8xldirsVdirs VdirsVdirsVdirsVUrn/AHnl/wBRv1Yq62/3ni/1F/ViqrirsVdirsVdirsVdirsVdirsVdir55/ 5y1CLc+RJ9QV28ux6hMNVAqVIJgIBA/aMSy0+nM/Q/xVzpBe8C90U6L9cE1v+hfq/qevyT6t9W4V 5cvsenw+imYVG/NL5L/Jz85PI3kLzZ5zWVbpfLeqXbS6LHbRBwkUMs3pAqzqVLRSKB8t82mo08px j3jmhF/k95r0rzH+b3nLWkYx6zrKTP5bNyVSURNOOUK/EwE31YBRxboGpmN2jjyDT8MOYZ464t2V /ng8Ft+VGqQeYqrdXE1v+gYbj+/+tLKpleJW+IKIOYc9KGnUjNZ2HDKJm74fNtzmPRJ7v8gvKkf/ ADj7/iNdLkXzeumJqb3JnmqBQTOphLentDXbhWubkaqXi1fpunHem/8AOMl15cl/KXTIdHMYuYGk GrxrT1RdNIxLS9/iTjxJ/ZoO2Y2sB8Q2kMG86TWN3/zld5WHlwo+o20aLrjwbgFBMZRIVI+MWxAN fYe2XY7GA3y6IfSGa9LsVdirsVdirsVdirsVdirsVdiqlc/7zy/6jfqxV1t/vPF/qL+rFVXFXYq7 FXYq7FXYq7FXYq7FXYq7FUm83eUNA826FcaHrtsLmwuKEipV0dd1kjYbqynofoO1Rk8eQwNhXiv/ AEKNbCtivnPUh5dL8/0V6Y8a15ep6XL39HMz8914RaKes6F+V/kLRdBtdEttFtJ7K0qUN3DHcSM7 fbkd5FNXbufoG1BmLLNMm7Sx38yvyC8l+d0t5qNo2qWcYitb2xVVAjUkqjxUCsqkmlOJ98sw6qUP MKxnyz/zir5es9Zg1XzPrd15ne1IMFtcJ6cJ4mqLKGeZnUfy8gD3FNssnrSRURSKe4MiMhRlDIw4 lSKgg7UpmEl4b5g/5xU0KbV5tR8q6/eeWBckme1gX1YgGNWWPjJAyL/klmA+W2ZsdaaqQ4kUzD8r PyR8p/l4JrqyaW/1q5X07jVLmnPgSCUiRdkUkAnqT3PTKs2olk58kvRMx1dirsVdirsVdirsVdir sVdirsVUrn/eeX/Ub9WKutv954v9Rf1Yqq4q7FXYql2vav8AonTzeel61GVeHLh9r3o2UajN4ceK rZwhxGkfG3NFalOQBp88uBYJdpes/Xr/AFC09H0/qDqnPly58iwrSgp9nKcWfjlKNfSzlCgD3r9c 1X9F6dJe+l63AqPT5ca8iB1o3j4Yc+Xw48VWiEeI0gbrzPMLtLOxsWvboxLNKiuECBgDQsQfEZTP VHi4Yx4jVsxj2smmv055j/6sLf8ASQn/ADTj4+X+Z9q8Ee9Th80aidVt9OuNKMEs5B/vg5VO7EKv QUyMdXLjETGifNJxirtB6VrevCa/SKyfUUS6kVZDME4AHZAGByvDnyXKo8Xq72UoR23pMP055j/6 sLf9JCf805d4+X+Z9rDgj3pbrn5gvo+ha3qF1pjLeaPZyX31JpQBKsa8uIlCtxr/AKpy3S5vEyeG RwyROFCwbCZ+RPNH+KvKGl+Yvq31P9JwCf6rz9X06kjjz4x8un8ozKyQ4ZEdzWk2s/mV+jfzU0Dy F+jvV/TlrNdfpL1uPpejHM/H0fTbnX0KV5jr7ZOOG4Gd8lZldT+hazT8eXpIz8a0rxBNK5UArx4/ 85GRP5E0DXrfy/JPrnma7nsdJ0GK4Dlngk9MsZjGm3Jk6J+19OZf5T1EXsOqEaPPf/OQBFf+VYw/ 9xmz/wCasj4WL+f9iUv1j86/zJ8qQxan51/L5tO0EyLFcX1rqFvdvGXNFJSPl+JHzyUdPCW0Zb+5 CceaPzqvbXzefKnk/wAszebNUhtY768MN1HaxRRTKrJ8bpJUlZEO9PtDrkIacGPFI8ISh/8AlaH5 y/8Alp5/+4xbf9UcPg4/5/2Kxn8z/wAx/PFtp3kvUtUtJ/JLza8sGpWYvFmV7NPTZnlljWNeBBaq kdstw4okyA9WyHpv/K5Pyq/6mzS/+kmP+uY35fJ3FKTSfnl5evPPmg+U/LKw+Yf0v6rXl9aXI4Wi RKW5MojdXqqsac1p9OT/ACxETKW1Kj/zim8tW/luC58w+Z9U8r2cVyoiudGneC5nlZGCw/BHKzgi rcQO1cjp+K9gJe9Xk/reQP8Ay4H5kf8AIy+/7JMyqn/Nh9n60IzyZqerJ+Zvl+08na75q1/Q5xOf Mn+I1ne3iiEZ9Jkkmii4Nyr0G54iu5GDIBwHiEQelK+iM16XYq7FVK5/3nl/1G/Virrb/eeL/UX9 WKquKuxV2KoLWdLi1TT5bORuAehWQCpVgag02yrNiGSJiWUJcJtK49M83RxrGuqQlUAVSYQTQbCu 2Y4xZwK4h8mfFDuQ9r5Z1+znmurbVE+sXR5XXKIcS1SQR18fAZCGlyRJIlueezI5InYhUu/L/mDU IxbahqcbWhYNIscQDHjuBXbJT0+WYqUtvcgTiNwFe98vXq6l+kNJu1tJXjWKVHTmpVQADvXsoyU9 NLj4oGjSBkFUQ19Q84f9XOD/AJEj+mPh5/5w+S8UO5bZaJrsOpi9mu4HZyBcMsQDsgp8PKm3TBDB kE+IkeeymcaqlK30DzDZzXJsr+KKK4meYq0fI1Y+JHhkY6fLEnhkNzfJJnE8wr/UPOH/AFc4P+RI /pk/Dz/zh8kcUO5CXHkn9KW2qw67ci6Gq2kljL6ahOMUq8WI/wArw2yenwyhk8SRuSJzBFBgGg/l f+eHlnS4dD0Hz1Zfoey5JYrc6ejSLGWLcSSJDsSafEfuzayzYpGzHf3tSBvPyR/NzUPNFp5yvPPV t/ifTFEOmslgvoLCQ6upAKr8Qlev7s1r16UkNRjEeER9J81Ti88k/wDOQ95aTWk3nvTkhuEaKVo9 PRXCOOLcTw2NDkBkwj+E/NKnqP8Azj0kfk3yvpWg621hr3lG4lvNN1iSESK807iWTnCWIAaRUp9q gFKHEar1EkbSQiv8Kf8AORn/AFPOl/8AcOT/AJowceH+afmlLNf/ACh/N7zhZpo3m7ztay6A8qS3 cFnYpHLJ6Z5KoaiU3Hj70OSjnxwNxjv70Mq8tflhPon5ra95yjuov0bqtjbWNrYKrepELeKCIcmO xH+j5XPNxYxHqEvQsx1ee/m3+V8vn1vLqC4hitdIv1u7yCdC6zw/CHioP5gCN8yMGbgvzCph/wAq b/Kr/qU9L/6Ro/6ZH8xk7yrG9S/InSYPzA8t+afKkdnoMWkGQ39tBEyfWAwou0ZVdgzBvEbZYNSe Axlvaoz8wvy483+Z7DyrJb6xZx675dulvpLya2b0JZ0UcWEAZ6fEK0rkcWWMSdtiql+gP+chP+pr 0X/uHv8A1w8WLuPzVHaFov51w6vay615j0q70pHBu7eCyeOV0p0RydjkZSx1sDavQcoV2KuxVSuf 955f9Rv1Yq62/wB54v8AUX9WKquKuxV2KuxV2KuxV2KuxVJ9R8uC91uy1X9J6hbCzFG0+3uDHaT0 PJfXioeVCf2SK9GqNsmJ0KoKgpvJCy2N1afp3WY/rWpNqhuEvCJoyzBvqkT8TwtRSgiHbD4m/Icq /HmqbaxpT6lDBEt9dWHoTxXBks3VGf0m5CJyyvWNjTmv7Q2O1QYxlSoGbymkp1cnVtTX9MGItwu3 X6sIv2bOg/cB/wBvjucPHy2GyoqfRGliuIhqN7GlxZCx+CUBoyA4+sRuVLrP+8+3XsNtsAl5Koy+ Wy99ql4uq6hG+pwegIVn/c21ECepaxsrLHJty5UO5w8ew2GyqsOgpG1s7X17LNbWZsjI9w1JAeP7 +WNeMTTDjtJwrufoHEqnF5cEeopffpPUHKaeNO+rPcEwGjcvrJjpT6z29Tww8e1UOaqun6J9T0M6 T9fvLmqyp9fuJud3+9Zm5erQbpzom2wAwGVm6VDW/lWO3u9IuI9V1MppEUkItpLp5YroSLx53fqc 3mdftKxbY4TPnsN1Q8/kyWbSbbTj5h1iNra7a8N9HcRrcy8+fKCVxFRof3povH4aLxI4jCMm90FV rrymtxLrUv6X1SFta9D4YrplWzNsoUGyWhEPqU5SdeZ64BPlsNvxurUXlIRy6LJ+mdUc6KsoKtdE remYAM16vGkpUrVKUC1NABQB4+ew3/GyrI/JvCARfpzVmpqX6U5tdVc7U+qFuP8AvL/xX+OHxPIc q/HmrIsrV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ov6sVVcVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqlc/7zy/6jfqxV1t/vPF/qL+r FVXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY qpXP+88v+o36sVdbf7zxf6i/qxVVxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ov6sVVcVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqlc/7zy/6jfqxV1t/vPF/qL+r FVXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXiOt/mZ5zWDzb5otNZ0+w0vylqM2nJ5bubcNLdi3Kh mlnMgkR5jy9HgtKda75mxwx9MaNyHNCnqX5t6r5z80vpXkHzFBpem2FjFeXN79Vju5ppZmIaMpMy okUC09RhuCfDcVZIDFASlEyJNbMoi0HYfmv+bGvaT5ZQJpWgW3ma7lsIfNKFrlUktBJ6jLbyhI63 DQn0eTkHp7i44McSeZroxei/lr5j8yX9/wCZNC125t9Tm8u3cVrFrVpH6KXIlgWUq8as6LLFypIF NATSmUZoAAEbX0SznKFdirsVdirsVdirsVdirsVdirsVdirsVUrn/eeX/Ub9WKutv954v9Rf1Yqq 4q7FXYq7FXYq7FXYq7FXYq7FUI2p2wt7u4PLhZFxNsK1jUMab+ByvxRRP81lwnbzWX+s2VhHFJcF gkwZlKiuyIXNfoGRyZ4wAJ6rGBKnPrXoRGWWyuVQUFeMZNSaAUD16nBLPQsxP4+KRC+rGX8peR9W 14+ZLvypFc6zFI0YvjHFJyaFuCuQzKGccBRitR2OTx62ZjQEqtTCurWo6Z+W3nTXf0Pq2iQ32o6X Al8PrMKgok080PDkDyP7y3Yuv2Tt1y/Dmlw8UTQuvkxlGlHXdS/LfUvy0mvdT0lLrynZTParYCBB we2u2sB6KKyhKSA8SrA8fuyyImJ0D6vwULPKHmfy5Z6Ikfk7yhqA0H1JBBLY29pFDM0bGJ5QHnjk Ykx/adeRw5IEn1SFqiNI/N3RdbZl0HStU1Vooo5bsW8MS+gZSwWOX1pYvj/dtULXBLAY8yAqifzk 0Gz8yXOi6/byaD6VnBdwvesDK5mkljKGOATKvH0Q1fUNeXQY/lyRY3VkXlPzroXmuG+uNFkee1sL o2UlyV4o8qxpK3p1+IqBKBUgb5XPGY81T7IK7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/e eL/UX9WKquKuxV2KuxV2KuxV2KuxV2KuxVBT6NpNxMZp7OGWVqcnZFJNNhWo3yqWCEjZAtkJkdUP NoVrGn+461tIZWZVlaWHmphJHqqArJuUrTenjhjgxj+EKZnvQcHloiIie105pecNGS3dV4Dj64oX Y8j8XDfbate4OmxfzU+JLvd/hydwzTQ6bJcOKtILZ1BkKxciQZWNC/qnr0KjfiSxOnxE3wo45d6X a1+Xek60iHVdI0W9lt43jsmnsjJw5KSoqXrx9U8mUdvffMjFLwxUbA8mJNoaH8pPKNs8V1Z+XdBg 1G3kaSGYaeOK8K+gQA4IdTxLNXftTqJ+PI8yfmqne/lF5XvLye6m8vaA807SSSSPYFmaR2lIZiHW poYuXiQ/8w4ozyA5n5qnWieWJtFZv0ZbaVYpL6KXAtLR4eccPoqq0WSg4p64Xw5J/K3KEp3ztU7j 0zT49Qm1JLeNb+4jSGe6CgSPHEWKIzdSFLtT55CzVKstdG0m0vbq+tbSKG8vWD3dwigPKwVVq7Dc /Cij6MTIkUqNwK7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/eeL/UX9WKquKuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuf955f9Rv1Yq6 2/3ni/1F/ViqrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVUrn/eeX/Ub9WKutv954v9Rf1Yqq4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/eeL/UX9WKquKuxV2KuxV2Ku xV2KuxV2KtMyqpZiFVRVmOwAHc4kqkz+cvLaMVN6CRsaJIw+8KRmKdbiHX72zwpdzX+NPLP/AC2f 8k5f+aMH57F3/YV8GXc7/Gnln/ls/wCScv8AzRj+exd/2FfBl3O/xp5Z/wCWz/knL/zRj+exd/2F fBl3O/xp5Z/5bP8AknL/AM0Y/nsXf9hXwZdzv8aeWf8Als/5Jy/80Y/nsXf9hXwZdzv8aeWf+Wz/ AJJy/wDNGP57F3/YV8GXc7/Gnln/AJbP+Scv/NGP57F3/YV8GXc7/Gnln/ls/wCScv8AzRj+exd/ 2FfBl3IrT/MGj6hIYrS5WSQb8CGRiPYOFr9GW49RCZqJRKBHNMcuYOxV2KuxV2KuxV2KuxV2KuxV Suf955f9Rv1Yq62/3ni/1F/ViqrirsVdirsVdirsVdirsVdiqB1uzmvNJurWA8ZZYyE7VPWn09Mq zwMoEDmygaNsRb6wtoltPpN7OqCIfVRFSKN4QOTJIFct6lPi27nfNab4aMJHltW23n5uR1uwiL7U byaa3KaPdSRqWMry23J1DCi+lyD04n4tqCo6ZPJlkSPRL/S/ciMR3hLL62uLq5rJpd/Kn1cQm5eF hM0gcP6h2K9Ph+WY+SJkd4yO3Ot/f+hnE0OYaWxjScyjQr2QMqJ6TxsFXjxq4ov2m49Pc4jGAb4J fJeLzCtBEYgf9wl07MGUubYCisjLsAtDuwO/hkoiv4JfJBPmFF7IPEYzot4S1R6ywcGXp0CrQ9O+ RMLFcEvkm/MLU0+OORZBol9IAqIYnjYKeJXk1QtasFP34BjAN8EvkvF5hf8AVWCN/uDuZXIPplrc oFbiQpPBfiHIioOHg/oH5Lfmh47bVPqk8M2iyu0jxshWB4wAnKteIB35DICM+EgwPyTYvmj9D0S+ l121uo7GWwt4Apl9QFRyVaNx5fEeZy7BgkcgIiYgMJzHDV29AzcuK7FXYq7FXYq7FXYq7FXYq7FV K5/3nl/1G/Virrb/AHni/wBRf1Yqq4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/AHni/wBRf1Yqq4q7FXYq7FXYq7FXYq7F XYqk3nDzRYeVfLGo+Yb9We106EzPGn23NQqItdqsxC75PHAykAFeI3357/m6ulrqtloOiyJI1oW0 hbiWfULaPUeP1JrhFaMATeovEjxFQMzBpsd0Sf0bc0Jtqf5jfn/YtDTQfL1zHIGaSaO6kjWMRr6j lvrEsDOqx1flEHXiCQSBkRixHrJWJ6//AM5K/mpo0lW0TRr+za0XUI9RsjczWz2rzi2EofmpAE59 M8gCG2y2OkgepVDW/wDzk9+cFzfvp9v5RtJb6OKK4ktkiumkWG49P0pCokqFf146H/KGE6PGBfEt plY/n9+el6ZPQ8nWPGJJJHdhOq/uoXnK8jNTkY4XKr1NNsidLiH8SoG7/wCcl/zltLOS9ufJ9pHa RAmW4MdyY1AIB5MJSB9sZIaTGduJVC0/5yk/Nu8vEsrTynZz3csUU8dvHFdM7RTlFicKJKkOZUC+ NRidFjG9raOT/nIn88ZDSLyTbSnlxPpxXL0PFm+LjKabITv4YPyuL+cq7/oYf87f0dc6h/g+yMFp JDFMFW4Z+VwJDHRFlLEfuWqabfTj+VxXXEqc/lz/AM5K69qvnaz8qecNBj0m41LgtpNF6sbI8qep CJYpSzUlBHFge42puIZdIBHiibpX0BmAl2KuxV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ ov6sVVcVdirsVdirsVdirsVdirsVSvzP5d03zJ5fv9C1NS1jqMLQTcDRgG6MpNaMrUZfcZKEzEgh XlUf5FefrW2jttM/MQ2CRRx263UOkQJeyQQDjBFPdpMk0oiTZamntmV+ZgecftVT1T8hfP8Aqd9p 19c/mIq3GlvLLaejotvEnqzrxmkkjSdUlaVdm5qaio6E4x1MACOHn5oQt3/zjn5xudX/AEo/n6NZ xaLpyQJolutqtmjB0t1tRP6Hpq6hgvD7Qr1yQ1cQK4ftVWk/IDz88hl/5WMI5mCK8sWi20UjpFx4 Ru8cys8a8FpGxK7DbYYPzUP5v2q3F/zj/wCeoYxFB+YEMMXJmMUWgWUaMXieF+arIA3KORlIbscf zUf5v2lVIf8AOO/nVV4R+f4ooTXnbxaFaRwyV2/exJKsclKbc1NO2P5qP837VXyf84+ee3KsPzEE UiekEmh0S2hkCwOrxIJI5lfgjRrRK8dhtj+aj/N+1VKT/nHPzm1tPbJ5/jt4LqOSC5S20K0t/Uim ieF0cwzRlgUlYUPTqN8P5uP837VSrTf+cTNd0yyurLTvzAmtLa9eKS6SHT+BdrcOIiWW7DfD6r7A 98kdcCbMft/YtMn8mf8AOOo0jzjY+avMXmSXzHf6ZGkdgHtltqGJPTiaV/UmeX01+zU9hUnK8mru PCBVpey5hq7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/Virrb/eeL/UX9WKquKuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuf955f9Rv1Yq62/3n i/1F/ViqrirsVdirsVdirsVdirsVdirGfzK80XXlXyJrXmC0hFxd6fbNJbxEEr6hIRWcChKqW5N7 DLMMOKQCvmSTzd+cWo2YurbzfqC37paXExMMNvYNHegN/o8q0Q+gG+MUHQ06ZL81jjKjEcPqHO5e nvHn0bPD2Ruraz+ZVnc2UA8/6nFLdtLHFBLCjSytAnNvSCGlSNgrH7VBXfKcOuEgT4Y2rrsL7/xy ZHFXVJbnzT+elxfPa6J5k1S6uRpqaqulyJ/uQKNcJbmJYIVlLSD1PVpt+7BOxFM2GmninEkiO0uG xy5Xz+z3tU40mMKf85PNqkljca/eWMaQ20q6hdLPFayPdGEC3ikNuTJcRm4o8SryqjgVIobv3NXT FMtM0z/nIq6SSW584XtpGFmWFXstSSWSaK1muURIp7O3d1b6vxJj5MCRRWO2RJwj+H7v1qlt1/0M tDYvcxeY764mUOY9PFvfwXcxTjyEEF1ZwPLQPU8KgAGtNqyHg3y+79aqdu//ADlA97DbXOtX+nxT Q2sovrxZobZXu5Iolt2laCgmRp6OnUcW6kYnwK5BUQV/5yLS3nubjzjPZ21ssks819BqVkoihhkn kdfrVjCZOEcLErHyf/Jwfuf5v3frVKLPzj+bV95e1PVtP/MdLx9NntIGhEv1SMi7E5q0+oJZKCv1 fZVDVr2pvM48YIBjz/HS1ZN+W35o/mzov5n6J5Y8z6kNcsNcW3Y8eE6hLuESxywXKKof0+Q58GZN mAr1yrNhxmBlEVSvqrNYl2KuxV2KuxV2KuxV2KuxV2KqVz/vPL/qN+rFXW3+88X+ov6sVVcVdirs VdirsVdirsVdirsVUbyztb20ms7uFLi0uY2iuIJAGR43HFlZTsQQaHCDW6vK7z/nGD8qbn4Pq99F bKxaG0S8mMMfLrwVy5H35kDVTBva/cqnL/zi3+VkzI8q6jI0QCxs95IxUL0CkjYDEaqQ5V8lWzf8 4rflRPK0s0d/LK+7SPduzH5kiuGOsmBQr5Ks/wChUPyi/wCWe9/6Sm/ph/O5Fp3/AEKh+UX/ACz3 v/SU39MfzuRad/0Kh+UX/LPe/wDSU39MfzuRad/0Kh+UX/LPe/8ASU39MfzuRad/0Kh+UX/LPe/9 JTf0x/O5Fp3/AEKh+UX/ACz3v/SU39MfzuRaZJ5H/Iz8uPJep/pXR9PZtTUFYbu5laZ4gw4t6YPw qSDQmlabVpleTUzmKJ2Vn+UK7FXYq7FXYq7FXYq7FXYq7FVK5/3nl/1G/ViqXa3cXFt5Vvrm2uBa XFvZSyw3RiM4jeOIsrmEbyAEbqNz0GKvOTr3ndpLeOPztp6CQss88mnlow8fqF1VgI1T4Yjx5k1+ E7hhVVGeUPNHmHXZ7q0sfM9tqF2sbvHE1lJEIvSmhjf1HMUQciki7KteVaDjsqn9npX5mqJRd63a PyCekUhUMpEkRep9MBv3ayD7IrX9n9lVQfRPzWaONR5jtEb0gHYWyGkgG5NY/jqe44j/ACe4VZTo tpqlrYCLU746jec3LXJjSIFSx4AJGFAotPHfviqPxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxVSuf955f9Rv1YqgNYeRPLF68cksMi2UpSa3XnMhERIaJe7jqo8c VeTWF9eS20Nx+nfNUy38FLS6FjNRWmrJyaNGZRRCBVh8jzxVXs5daNi8UvmDzNDKYnVJHsGc7BiQ pHPi5CfDzYnkR8XH4Qqmeg6L5j1ya6MHmXWbGOKSKSRbu1lgDqzF+EXqTswpxIPbpUMNiq9TxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuf8AeeX/AFG/ ViqyCZVhjVlcMqgEcH6gfLFV/wBYj8H/AOAf+mKu+sR+D/8AAP8A0xV31iPwf/gH/pirvrEfg/8A wD/0xV31iPwf/gH/AKYq76xH4P8A8A/9MVd9Yj8H/wCAf+mKu+sR+D/8A/8ATFXfWI/B/wDgH/pi rvrEfg//AAD/ANMVd9Yj8H/4B/6Yq76xH4P/AMA/9MVd9Yj8H/4B/wCmKu+sR+D/APAP/TFXfWI/ B/8AgH/pirvrEfg//AP/AExV31iPwf8A4B/6Yq76xH4P/wAA/wDTFXfWI/B/+Af+mKu+sR+D/wDA P/TFXfWI/B/+Af8ApirvrEfg/wDwD/0xV31iPwf/AIB/6Yq76xH4P/wD/wBMVd9Yj8H/AOAf+mKu +sR+D/8AAP8A0xV31iPwf/gH/pirvrEfg/8AwD/0xV31iPwf/gH/AKYq76xH4P8A8A/9MVWTzK0M iqrlmUgDg/Uj5Yq//9k= - - - - - - - uuid:dce97bfe-82d3-11d8-9b09-000a95b0d6d2 - - - - application/postscript - - - webwork - - - - - - - % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -576 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 576 li 618.334 576 li 618.334 0 li clp [1 0 0 1 0 0 ] concat 617.834 575.5 mo 0.5 575.5 li 0.5 0.5 li 617.834 0.5 li 617.834 575.5 li false sop /0 [/DeviceCMYK] add_csa 0 0 0 0 cmyk f 1 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 617.834 575.5 mo 0.5 575.5 li 0.5 0.5 li 617.834 0.5 li 617.834 575.5 li cp 0.188236 0.129412 0.101961 0.0117648 cmyk @ 363.461 98.4517 mo 360.123 98.4517 357.089 97.2378 354.812 94.9605 cv 352.537 92.6885 351.171 89.4981 351.171 86.3126 cv 351.171 82.9732 352.537 79.9395 354.812 77.6636 cv 357.089 75.3863 360.123 74.024 363.461 74.024 cv 366.647 74.024 369.681 75.3863 372.11 77.6636 cv 374.387 79.9395 375.601 82.9732 375.601 86.3126 cv 375.601 92.9898 370.138 98.4517 363.461 98.4517 cv cp 312.175 98.4517 mo 310.297 98.4517 308.445 97.9834 306.752 97.169 cv 305.636 96.5801 304.585 95.8692 303.681 94.9649 cv 301.407 92.6885 300.041 89.6553 300.041 86.3174 cv 300.041 83.1304 301.407 79.9395 303.681 77.6685 cv 305.958 75.3912 308.992 74.1768 312.331 74.1768 cv 315.648 74.1768 318.664 75.5298 320.86 77.7081 cv 323.111 79.9795 324.466 82.9927 324.466 86.3126 cv 324.466 92.9898 318.853 98.4517 312.175 98.4517 cv cp 269.694 94.9649 mo 267.418 97.2422 264.383 98.605 261.045 98.605 cv 257.858 98.605 254.672 97.2422 252.396 94.9649 cv 250.121 92.6885 248.906 89.6553 248.906 86.3174 cv 248.906 83.1304 250.121 79.9395 252.396 77.6685 cv 254.672 75.3912 257.858 74.1768 261.045 74.1768 cv 267.721 74.1768 273.335 79.6392 273.335 86.3174 cv 273.335 89.6553 271.97 92.6885 269.694 94.9649 cv cp 377.269 72.5069 mo 373.476 68.8658 368.62 66.8916 363.461 66.8916 cv 356.179 66.8916 349.957 70.8374 346.619 76.6016 cv 343.889 75.0855 340.701 74.3243 337.515 74.3243 cv 334.512 74.3243 331.513 75.0757 328.95 76.2657 cv 328.154 74.9131 327.221 73.6382 326.138 72.5069 cv 324.284 70.7334 322.073 69.3165 319.67 68.3428 cv 319.588 68.3135 319.5 68.2891 319.418 68.254 cv 318.906 68.0567 318.393 67.8692 317.863 67.7164 cv 317.822 67.7012 317.781 67.6963 317.741 67.6812 cv 315.991 67.1729 314.172 66.8916 312.331 66.8916 cv 312.304 66.8916 312.28 66.896 312.254 66.896 cv 312.228 66.896 312.202 66.8916 312.175 66.8916 cv 301.402 66.8916 292.753 75.5391 292.753 86.3126 cv 292.753 87.2505 292.841 88.1792 292.972 89.0918 cv 291.019 90.2725 288.776 91.0191 286.385 91.0191 cv 284.259 91.0191 282.136 90.4112 280.164 89.502 cv 280.314 88.4405 280.467 87.379 280.467 86.3174 cv 280.467 81.1553 278.495 76.148 274.853 72.5069 cv 271.211 69.0201 266.205 66.8916 261.045 66.8916 cv 255.887 66.8916 251.029 69.0201 247.237 72.5069 cv 243.595 76.3003 241.624 81.1553 241.624 86.3174 cv 241.624 97.0894 250.271 105.737 261.045 105.737 cv 266.205 105.737 271.211 103.763 274.853 100.122 cv 275.915 98.9073 276.977 97.6968 277.735 96.3282 cv 280.314 97.544 283.35 98.3047 286.385 98.3047 cv 289.525 98.3047 292.661 97.5577 295.365 96.0821 cv 296.187 97.524 297.179 98.8829 298.367 100.122 cv 300.858 102.415 303.814 104.103 307.008 105.002 cv 307.09 105.027 307.174 105.042 307.258 105.066 cv 307.98 105.259 308.714 105.412 309.457 105.517 cv 309.561 105.536 309.666 105.55 309.77 105.565 cv 310.565 105.668 311.365 105.737 312.175 105.737 cv 312.205 105.737 312.234 105.733 312.264 105.733 cv 312.286 105.733 312.308 105.737 312.331 105.737 cv 317.489 105.737 322.345 103.763 326.138 100.122 cv 329.628 96.4815 331.753 91.6265 331.753 86.3174 cv 331.753 85.2212 331.639 84.1334 331.452 83.063 cv 333.38 82.1924 335.445 81.6094 337.515 81.6094 cv 339.941 81.6094 342.219 82.3711 344.19 83.5801 cv 344.04 84.4942 344.04 85.2505 344.04 86.3126 cv 344.04 91.4737 346.012 96.3282 349.653 100.122 cv 353.296 103.61 358.15 105.737 363.461 105.737 cv 368.62 105.737 373.626 103.61 377.269 100.122 cv 380.759 96.4815 382.883 91.4737 382.883 86.3126 cv 382.883 81.002 380.759 76.148 377.269 72.5069 cv 0.960785 0.94902 0.29804 0.184314 cmyk f 312.251 78.7261 mo 308.062 78.7261 304.666 82.1231 304.666 86.3126 cv 304.666 90.5049 308.062 93.898 312.251 93.898 cv 316.442 93.898 319.841 90.5049 319.841 86.3126 cv 319.841 82.1231 316.442 78.7261 312.251 78.7261 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 188.062 161.73 mo 187.075 161.73 li 185.904 158.708 li 184.732 161.73 li 183.746 161.73 li 182.028 157.47 li 183.104 157.47 li 184.264 160.471 li 185.413 157.47 li 186.389 157.47 li 187.542 160.471 li 188.703 157.47 li 189.779 157.47 li 188.062 161.73 li 0.960785 0.94902 0.29804 0.184314 cmyk f 196.104 161.73 mo 196.104 157.47 li 200.242 157.47 li 200.242 158.291 li 197.113 158.291 li 197.113 159.188 li 199.6 159.188 li 199.6 159.953 li 197.113 159.953 li 197.113 160.912 li 200.286 160.912 li 200.286 161.73 li 196.104 161.73 li f 210.274 160.253 mo 209.616 159.874 li 207.781 159.874 li 207.781 160.967 li 210.274 160.967 li 210.274 160.253 li cp 210.23 158.234 mo 207.781 158.234 li 207.781 159.216 li 209.616 159.216 li 210.23 158.831 li 210.23 158.234 li cp 210.898 161.73 mo 206.772 161.73 li 206.772 157.47 li 210.859 157.47 li 211.094 157.47 211.24 157.627 211.24 157.872 cv 211.24 158.848 li 211.24 159.026 211.172 159.132 211.015 159.216 cv 210.43 159.551 li 211.055 159.885 li 211.211 159.963 211.283 160.053 211.283 160.243 cv 211.283 161.33 li 211.283 161.575 211.133 161.73 210.898 161.73 cv f 227.791 158.358 mo 226.943 160.22 li 228.644 160.22 li 227.791 158.358 li cp 229.331 161.73 mo 228.99 160.973 li 226.597 160.973 li 226.246 161.73 li 225.204 161.73 li 225.204 161.72 li 227.261 157.47 li 228.326 157.47 li 230.384 161.72 li 230.384 161.73 li 229.331 161.73 li f 240.009 158.268 mo 237.706 158.268 li 237.706 159.601 li 240.009 159.601 li 240.009 158.268 li cp 240.634 160.376 mo 237.706 160.376 li 237.706 161.73 li 236.696 161.73 li 236.696 157.47 li 240.64 157.47 li 240.874 157.47 241.013 157.627 241.013 157.872 cv 241.013 159.974 li 241.013 160.22 240.869 160.376 240.634 160.376 cv f 250.912 158.268 mo 248.609 158.268 li 248.609 159.601 li 250.912 159.601 li 250.912 158.268 li cp 251.537 160.376 mo 248.609 160.376 li 248.609 161.73 li 247.599 161.73 li 247.599 157.47 li 251.542 157.47 li 251.777 157.47 251.916 157.627 251.916 157.872 cv 251.916 159.974 li 251.916 160.22 251.771 160.376 251.537 160.376 cv f 258.501 161.73 mo 258.501 157.47 li 259.512 157.47 li 259.512 160.912 li 262.372 160.912 li 262.372 161.73 li 258.501 161.73 li f 268.708 161.73 mo 268.708 157.47 li 269.717 157.47 li 269.717 161.73 li 268.708 161.73 li f 280.619 161.73 mo 276.788 161.73 li 276.554 161.73 276.414 161.575 276.414 161.33 cv 276.414 157.872 li 276.414 157.627 276.554 157.47 276.788 157.47 cv 280.619 157.47 li 280.854 157.47 281.004 157.627 281.004 157.872 cv 281.004 159.038 li 279.995 159.038 li 279.995 158.268 li 277.424 158.268 li 277.424 160.935 li 279.995 160.935 li 279.995 160.12 li 281.004 160.12 li 281.004 161.33 li 281.004 161.575 280.854 161.73 280.619 161.73 cv f 289.836 158.358 mo 288.989 160.22 li 290.691 160.22 li 289.836 158.358 li cp 291.376 161.73 mo 291.037 160.973 li 288.644 160.973 li 288.293 161.73 li 287.25 161.73 li 287.25 161.72 li 289.308 157.47 li 290.373 157.47 li 292.431 161.72 li 292.431 161.73 li 291.376 161.73 li f 300.685 158.291 mo 300.685 161.73 li 299.68 161.73 li 299.68 158.291 li 297.874 158.291 li 297.874 157.47 li 302.491 157.47 li 302.491 158.291 li 300.685 158.291 li f 308.855 161.73 mo 308.855 157.47 li 309.863 157.47 li 309.863 161.73 li 308.855 161.73 li f 320.203 158.268 mo 317.57 158.268 li 317.57 160.935 li 320.203 160.935 li 320.203 158.268 li cp 320.839 161.73 mo 316.935 161.73 li 316.701 161.73 316.562 161.575 316.562 161.33 cv 316.562 157.872 li 316.562 157.627 316.701 157.47 316.935 157.47 cv 320.839 157.47 li 321.066 157.47 321.212 157.627 321.212 157.872 cv 321.212 161.33 li 321.212 161.575 321.066 161.73 320.839 161.73 cv f 331.507 161.73 mo 328.925 158.803 li 328.925 161.73 li 327.915 161.73 li 327.915 157.47 li 328.908 157.47 li 331.49 160.314 li 331.49 157.47 li 332.505 157.47 li 332.505 161.73 li 331.507 161.73 li f 347.819 158.291 mo 347.819 159.205 li 350.245 159.205 li 350.245 159.968 li 347.819 159.968 li 347.819 161.73 li 346.81 161.73 li 346.81 157.47 li 350.848 157.47 li 350.848 158.291 li 347.819 158.291 li f 360.617 161.73 mo 358.677 160.014 li 358.677 159.506 li 360.551 159.506 li 360.551 158.268 li 358.197 158.268 li 358.197 161.73 li 357.188 161.73 li 357.188 157.47 li 361.177 157.47 li 361.404 157.47 361.554 157.627 361.554 157.872 cv 361.554 159.83 li 361.554 160.07 361.404 160.22 361.177 160.22 cv 360.105 160.22 li 361.844 161.692 li 361.844 161.73 li 360.617 161.73 li f 370.389 158.358 mo 369.539 160.22 li 371.239 160.22 li 370.389 158.358 li cp 371.927 161.73 mo 371.587 160.973 li 369.194 160.973 li 368.844 161.73 li 367.801 161.73 li 367.801 161.72 li 369.857 157.47 li 370.924 157.47 li 372.981 161.72 li 372.981 161.73 li 371.927 161.73 li f 383.733 161.73 mo 383.733 159.126 li 382.473 161.73 li 381.554 161.73 li 380.287 159.126 li 380.287 161.73 li 379.294 161.73 li 379.294 157.47 li 380.42 157.47 li 382.004 160.688 li 382.017 160.688 li 383.605 157.47 li 384.721 157.47 li 384.721 161.73 li 383.733 161.73 li f 391.424 161.73 mo 391.424 157.47 li 395.562 157.47 li 395.562 158.291 li 392.435 158.291 li 392.435 159.188 li 394.921 159.188 li 394.921 159.953 li 392.435 159.953 li 392.435 160.912 li 395.606 160.912 li 395.606 161.73 li 391.424 161.73 li f 407.748 161.73 mo 406.76 161.73 li 405.589 158.708 li 404.418 161.73 li 403.431 161.73 li 401.713 157.47 li 402.79 157.47 li 403.947 160.471 li 405.097 157.47 li 406.073 157.47 li 407.229 160.471 li 408.389 157.47 li 409.464 157.47 li 407.748 161.73 li f 419.39 158.268 mo 416.759 158.268 li 416.759 160.935 li 419.39 160.935 li 419.39 158.268 li cp 420.026 161.73 mo 416.122 161.73 li 415.889 161.73 415.748 161.575 415.748 161.33 cv 415.748 157.872 li 415.748 157.627 415.889 157.47 416.122 157.47 cv 420.026 157.47 li 420.256 157.47 420.4 157.627 420.4 157.872 cv 420.4 161.33 li 420.4 161.575 420.256 161.73 420.026 161.73 cv f 430.533 161.73 mo 428.592 160.014 li 428.592 159.506 li 430.467 159.506 li 430.467 158.268 li 428.114 158.268 li 428.114 161.73 li 427.104 161.73 li 427.104 157.47 li 431.09 157.47 li 431.319 157.47 431.471 157.627 431.471 157.872 cv 431.471 159.83 li 431.471 160.07 431.319 160.22 431.09 160.22 cv 430.02 160.22 li 431.76 161.692 li 431.76 161.73 li 430.533 161.73 li f 441.134 161.73 mo 439.115 159.98 li 439.115 161.73 li 438.106 161.73 li 438.106 157.47 li 439.115 157.47 li 439.115 159.122 li 440.882 157.47 li 442.167 157.47 li 442.167 157.504 li 439.94 159.511 li 442.479 161.698 li 442.479 161.73 li 441.134 161.73 li f 328.594 270.938 mo 327.068 270.938 325.682 270.383 324.641 269.342 cv 323.602 268.304 322.978 266.846 322.978 265.39 cv 322.978 263.864 323.602 262.478 324.641 261.438 cv 325.682 260.397 327.068 259.775 328.594 259.775 cv 330.05 259.775 331.436 260.397 332.546 261.438 cv 333.586 262.478 334.141 263.864 334.141 265.39 cv 334.141 268.441 331.645 270.938 328.594 270.938 cv cp 305.157 270.938 mo 304.3 270.938 303.453 270.724 302.68 270.352 cv 302.169 270.082 301.689 269.757 301.276 269.344 cv 300.236 268.304 299.612 266.918 299.612 265.393 cv 299.612 263.936 300.236 262.478 301.276 261.44 cv 302.316 260.399 303.703 259.845 305.229 259.845 cv 306.744 259.845 308.122 260.463 309.126 261.458 cv 310.155 262.496 310.773 263.873 310.773 265.39 cv 310.773 268.441 308.209 270.938 305.157 270.938 cv cp 285.745 269.344 mo 284.705 270.385 283.318 271.008 281.793 271.008 cv 280.336 271.008 278.88 270.385 277.84 269.344 cv 276.8 268.304 276.246 266.918 276.246 265.393 cv 276.246 263.936 276.8 262.478 277.84 261.44 cv 278.88 260.399 280.336 259.845 281.793 259.845 cv 284.843 259.845 287.409 262.341 287.409 265.393 cv 287.409 266.918 286.785 268.304 285.745 269.344 cv cp 334.903 259.082 mo 333.17 257.418 330.951 256.516 328.594 256.516 cv 325.266 256.516 322.423 258.319 320.897 260.953 cv 319.649 260.26 318.192 259.912 316.736 259.912 cv 315.364 259.912 313.994 260.255 312.823 260.799 cv 312.459 260.181 312.032 259.599 311.538 259.082 cv 310.69 258.271 309.681 257.624 308.582 257.179 cv 308.545 257.166 308.505 257.154 308.467 257.138 cv 308.233 257.048 307.998 256.962 307.757 256.893 cv 307.738 256.886 307.719 256.883 307.701 256.876 cv 306.901 256.644 306.069 256.516 305.229 256.516 cv 305.217 256.516 305.205 256.518 305.193 256.518 cv 305.182 256.518 305.17 256.516 305.157 256.516 cv 300.234 256.516 296.282 260.467 296.282 265.39 cv 296.282 265.819 296.322 266.243 296.382 266.66 cv 295.489 267.2 294.465 267.541 293.372 267.541 cv 292.401 267.541 291.431 267.263 290.529 266.848 cv 290.598 266.363 290.668 265.877 290.668 265.393 cv 290.668 263.034 289.767 260.746 288.102 259.082 cv 286.438 257.488 284.15 256.516 281.793 256.516 cv 279.436 256.516 277.216 257.488 275.482 259.082 cv 273.818 260.815 272.918 263.034 272.918 265.393 cv 272.918 270.315 276.869 274.267 281.793 274.267 cv 284.15 274.267 286.438 273.364 288.102 271.701 cv 288.588 271.146 289.073 270.593 289.419 269.967 cv 290.598 270.523 291.985 270.871 293.372 270.871 cv 294.807 270.871 296.24 270.529 297.476 269.854 cv 297.852 270.514 298.305 271.135 298.848 271.701 cv 299.986 272.748 301.337 273.52 302.796 273.931 cv 302.834 273.942 302.872 273.949 302.911 273.96 cv 303.24 274.048 303.576 274.118 303.915 274.166 cv 303.963 274.174 304.011 274.181 304.059 274.188 cv 304.422 274.235 304.787 274.267 305.157 274.267 cv 305.171 274.267 305.185 274.265 305.198 274.265 cv 305.208 274.265 305.218 274.267 305.229 274.267 cv 307.586 274.267 309.805 273.364 311.538 271.701 cv 313.133 270.037 314.104 267.819 314.104 265.393 cv 314.104 264.892 314.052 264.395 313.966 263.905 cv 314.847 263.508 315.791 263.241 316.736 263.241 cv 317.846 263.241 318.887 263.589 319.787 264.142 cv 319.719 264.56 319.719 264.905 319.719 265.39 cv 319.719 267.749 320.619 269.967 322.283 271.701 cv 323.948 273.294 326.167 274.267 328.594 274.267 cv 330.951 274.267 333.238 273.294 334.903 271.701 cv 336.498 270.037 337.469 267.749 337.469 265.39 cv 337.469 262.963 336.498 260.746 334.903 259.082 cv f 305.192 261.924 mo 303.278 261.924 301.726 263.476 301.726 265.39 cv 301.726 267.306 303.278 268.856 305.192 268.856 cv 307.107 268.856 308.66 267.306 308.66 265.39 cv 308.66 263.476 307.107 261.924 305.192 261.924 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 248.441 299.854 mo 247.99 299.854 li 247.456 298.473 li 246.92 299.854 li 246.469 299.854 li 245.684 297.907 li 246.176 297.907 li 246.706 299.278 li 247.23 297.907 li 247.677 297.907 li 248.204 299.278 li 248.734 297.907 li 249.226 297.907 li 248.441 299.854 li 0.960785 0.94902 0.29804 0.184314 cmyk f 252.116 299.854 mo 252.116 297.907 li 254.007 297.907 li 254.007 298.282 li 252.577 298.282 li 252.577 298.692 li 253.714 298.692 li 253.714 299.042 li 252.577 299.042 li 252.577 299.479 li 254.027 299.479 li 254.027 299.854 li 252.116 299.854 li f 258.592 299.178 mo 258.291 299.006 li 257.452 299.006 li 257.452 299.504 li 258.592 299.504 li 258.592 299.178 li cp 258.571 298.256 mo 257.452 298.256 li 257.452 298.706 li 258.291 298.706 li 258.571 298.529 li 258.571 298.256 li cp 258.877 299.854 mo 256.991 299.854 li 256.991 297.907 li 258.859 297.907 li 258.966 297.907 259.033 297.979 259.033 298.09 cv 259.033 298.537 li 259.033 298.618 259.002 298.666 258.93 298.706 cv 258.663 298.858 li 258.949 299.01 li 259.02 299.046 259.053 299.086 259.053 299.174 cv 259.053 299.67 li 259.053 299.784 258.984 299.854 258.877 299.854 cv f 266.596 298.313 mo 266.209 299.164 li 266.986 299.164 li 266.596 298.313 li cp 267.3 299.854 mo 267.144 299.507 li 266.051 299.507 li 265.89 299.854 li 265.414 299.854 li 265.414 299.849 li 266.354 297.907 li 266.841 297.907 li 267.781 299.849 li 267.781 299.854 li 267.3 299.854 li f 272.18 298.271 mo 271.127 298.271 li 271.127 298.881 li 272.18 298.881 li 272.18 298.271 li cp 272.465 299.235 mo 271.127 299.235 li 271.127 299.854 li 270.666 299.854 li 270.666 297.907 li 272.468 297.907 li 272.575 297.907 272.638 297.979 272.638 298.09 cv 272.638 299.051 li 272.638 299.164 272.572 299.235 272.465 299.235 cv f 277.162 298.271 mo 276.11 298.271 li 276.11 298.881 li 277.162 298.881 li 277.162 298.271 li cp 277.447 299.235 mo 276.11 299.235 li 276.11 299.854 li 275.648 299.854 li 275.648 297.907 li 277.45 297.907 li 277.557 297.907 277.621 297.979 277.621 298.09 cv 277.621 299.051 li 277.621 299.164 277.554 299.235 277.447 299.235 cv f 280.63 299.854 mo 280.63 297.907 li 281.092 297.907 li 281.092 299.479 li 282.398 299.479 li 282.398 299.854 li 280.63 299.854 li f 285.294 299.854 mo 285.294 297.907 li 285.755 297.907 li 285.755 299.854 li 285.294 299.854 li f 290.737 299.854 mo 288.986 299.854 li 288.879 299.854 288.815 299.784 288.815 299.67 cv 288.815 298.09 li 288.815 297.979 288.879 297.907 288.986 297.907 cv 290.737 297.907 li 290.844 297.907 290.913 297.979 290.913 298.09 cv 290.913 298.624 li 290.452 298.624 li 290.452 298.271 li 289.277 298.271 li 289.277 299.491 li 290.452 299.491 li 290.452 299.118 li 290.913 299.118 li 290.913 299.67 li 290.913 299.784 290.844 299.854 290.737 299.854 cv f 294.949 298.313 mo 294.562 299.164 li 295.34 299.164 li 294.949 298.313 li cp 295.653 299.854 mo 295.498 299.507 li 294.404 299.507 li 294.244 299.854 li 293.767 299.854 li 293.767 299.849 li 294.708 297.907 li 295.194 297.907 li 296.135 299.849 li 296.135 299.854 li 295.653 299.854 li f 299.906 298.282 mo 299.906 299.854 li 299.447 299.854 li 299.447 298.282 li 298.622 298.282 li 298.622 297.907 li 300.732 297.907 li 300.732 298.282 li 299.906 298.282 li f 303.641 299.854 mo 303.641 297.907 li 304.101 297.907 li 304.101 299.854 li 303.641 299.854 li f 308.826 298.271 mo 307.623 298.271 li 307.623 299.491 li 308.826 299.491 li 308.826 298.271 li cp 309.116 299.854 mo 307.332 299.854 li 307.226 299.854 307.162 299.784 307.162 299.67 cv 307.162 298.09 li 307.162 297.979 307.226 297.907 307.332 297.907 cv 309.116 297.907 li 309.221 297.907 309.287 297.979 309.287 298.09 cv 309.287 299.67 li 309.287 299.784 309.221 299.854 309.116 299.854 cv f 313.991 299.854 mo 312.812 298.516 li 312.812 299.854 li 312.35 299.854 li 312.35 297.907 li 312.804 297.907 li 313.983 299.207 li 313.983 297.907 li 314.447 297.907 li 314.447 299.854 li 313.991 299.854 li f 321.445 298.282 mo 321.445 298.7 li 322.554 298.7 li 322.554 299.048 li 321.445 299.048 li 321.445 299.854 li 320.984 299.854 li 320.984 297.907 li 322.829 297.907 li 322.829 298.282 li 321.445 298.282 li f 327.294 299.854 mo 326.407 299.069 li 326.407 298.837 li 327.264 298.837 li 327.264 298.271 li 326.188 298.271 li 326.188 299.854 li 325.727 299.854 li 325.727 297.907 li 327.55 297.907 li 327.653 297.907 327.722 297.979 327.722 298.09 cv 327.722 298.985 li 327.722 299.094 327.653 299.164 327.55 299.164 cv 327.06 299.164 li 327.854 299.836 li 327.854 299.854 li 327.294 299.854 li f 331.759 298.313 mo 331.371 299.164 li 332.147 299.164 li 331.759 298.313 li cp 332.462 299.854 mo 332.307 299.507 li 331.213 299.507 li 331.053 299.854 li 330.576 299.854 li 330.576 299.849 li 331.517 297.907 li 332.004 297.907 li 332.944 299.849 li 332.944 299.854 li 332.462 299.854 li f 337.857 299.854 mo 337.857 298.665 li 337.281 299.854 li 336.861 299.854 li 336.282 298.665 li 336.282 299.854 li 335.828 299.854 li 335.828 297.907 li 336.343 297.907 li 337.066 299.377 li 337.072 299.377 li 337.799 297.907 li 338.309 297.907 li 338.309 299.854 li 337.857 299.854 li f 341.371 299.854 mo 341.371 297.907 li 343.263 297.907 li 343.263 298.282 li 341.833 298.282 li 341.833 298.692 li 342.97 298.692 li 342.97 299.042 li 341.833 299.042 li 341.833 299.479 li 343.283 299.479 li 343.283 299.854 li 341.371 299.854 li f 348.831 299.854 mo 348.38 299.854 li 347.845 298.473 li 347.31 299.854 li 346.858 299.854 li 346.073 297.907 li 346.565 297.907 li 347.095 299.278 li 347.619 297.907 li 348.065 297.907 li 348.594 299.278 li 349.124 297.907 li 349.615 297.907 li 348.831 299.854 li f 354.151 298.271 mo 352.949 298.271 li 352.949 299.491 li 354.151 299.491 li 354.151 298.271 li cp 354.442 299.854 mo 352.658 299.854 li 352.551 299.854 352.487 299.784 352.487 299.67 cv 352.487 298.09 li 352.487 297.979 352.551 297.907 352.658 297.907 cv 354.442 297.907 li 354.547 297.907 354.613 297.979 354.613 298.09 cv 354.613 299.67 li 354.613 299.784 354.547 299.854 354.442 299.854 cv f 359.243 299.854 mo 358.356 299.069 li 358.356 298.837 li 359.213 298.837 li 359.213 298.271 li 358.138 298.271 li 358.138 299.854 li 357.676 299.854 li 357.676 297.907 li 359.498 297.907 li 359.603 297.907 359.672 297.979 359.672 298.09 cv 359.672 298.985 li 359.672 299.094 359.603 299.164 359.498 299.164 cv 359.009 299.164 li 359.804 299.836 li 359.804 299.854 li 359.243 299.854 li f 364.087 299.854 mo 363.165 299.053 li 363.165 299.854 li 362.704 299.854 li 362.704 297.907 li 363.165 297.907 li 363.165 298.662 li 363.973 297.907 li 364.56 297.907 li 364.56 297.922 li 363.542 298.84 li 364.702 299.838 li 364.702 299.854 li 364.087 299.854 li f 245.891 288.889 mo 245.891 289.898 245.555 290.764 244.785 291.534 cv 244.063 292.256 243.197 292.592 242.139 292.641 cv 233.266 292.641 li 232.352 292.641 231.582 292.352 230.86 291.774 cv 230.187 292.352 229.37 292.641 228.408 292.641 cv 220.249 292.641 li 219.24 292.641 218.373 292.305 217.604 291.534 cv 216.883 290.811 216.545 289.948 216.497 288.889 cv 216.497 283.357 li 219.191 283.357 li 219.191 288.696 li 219.191 289.177 219.335 289.562 219.72 289.948 cv 220.057 290.235 220.441 290.378 220.97 290.428 cv 227.734 290.428 li 228.215 290.428 228.6 290.284 228.937 289.948 cv 229.273 289.608 229.417 289.225 229.465 288.696 cv 229.465 283.357 li 232.208 283.357 li 232.208 288.696 li 232.208 289.177 232.352 289.562 232.688 289.948 cv 233.025 290.235 233.409 290.378 233.938 290.428 cv 241.466 290.428 li 241.946 290.428 242.332 290.284 242.668 289.948 cv 243.005 289.608 243.149 289.225 243.197 288.696 cv 243.197 283.357 li 245.891 283.357 li 245.891 288.889 li 0.196079 0.219608 0.505883 0.0470589 cmyk f 270.398 292.641 mo 251.663 292.641 li 250.653 292.641 249.788 292.305 249.017 291.534 cv 248.296 290.811 247.959 289.948 247.911 288.889 cv 247.911 287.158 li 247.911 286.147 248.248 285.28 249.017 284.511 cv 249.739 283.79 250.604 283.452 251.663 283.405 cv 270.398 283.405 li 270.398 285.617 li 267.8 289.177 li 265.106 289.177 li 267.656 285.617 li 252.384 285.617 li 251.903 285.617 251.519 285.762 251.134 286.147 cv 250.796 286.435 250.653 286.82 250.604 287.349 cv 250.604 288.696 li 250.604 289.177 250.75 289.562 251.134 289.948 cv 251.47 290.235 251.855 290.378 252.384 290.428 cv 270.398 290.428 li 270.398 292.641 li f 292.641 288.696 mo 292.641 287.349 li 292.641 286.868 292.497 286.483 292.111 286.147 cv 291.823 285.809 291.438 285.665 290.909 285.617 cv 275.541 285.617 li 275.541 290.428 li 290.909 290.428 li 291.39 290.428 291.775 290.284 292.111 289.948 cv 292.448 289.608 292.592 289.225 292.641 288.696 cv cp 295.334 288.889 mo 295.334 289.898 294.998 290.764 294.228 291.534 cv 293.555 292.256 292.688 292.592 291.582 292.641 cv 272.847 292.641 li 272.847 280.327 li 275.541 280.327 li 275.541 283.405 li 291.582 283.405 li 292.641 283.405 293.507 283.742 294.228 284.511 cv 294.949 285.232 295.286 286.098 295.334 287.158 cv 295.334 288.889 li f 327.416 288.889 mo 327.416 289.898 327.079 290.764 326.31 291.534 cv 325.588 292.256 324.723 292.592 323.663 292.641 cv 314.789 292.641 li 313.876 292.641 313.106 292.352 312.385 291.774 cv 311.711 292.352 310.894 292.641 309.932 292.641 cv 301.058 292.641 li 300.048 292.641 299.182 292.305 298.412 291.534 cv 297.69 290.811 297.354 289.948 297.306 288.889 cv 297.306 283.357 li 299.999 283.357 li 299.999 288.696 li 299.999 289.177 300.145 289.562 300.528 289.948 cv 300.865 290.235 301.25 290.378 301.78 290.428 cv 309.259 290.428 li 309.739 290.428 310.124 290.284 310.46 289.948 cv 310.797 289.608 310.941 289.225 310.989 288.696 cv 310.989 283.357 li 313.731 283.357 li 313.731 288.696 li 313.731 289.177 313.876 289.562 314.212 289.948 cv 314.55 290.235 314.934 290.378 315.463 290.428 cv 322.99 290.428 li 323.471 290.428 323.855 290.284 324.193 289.948 cv 324.529 289.608 324.673 289.225 324.723 288.696 cv 324.723 283.357 li 327.416 283.357 li 327.416 288.889 li 0.960785 0.94902 0.29804 0.184314 cmyk f 349.178 288.669 mo 349.178 287.274 li 349.178 286.793 349.032 286.408 348.647 286.072 cv 348.312 285.735 347.926 285.592 347.397 285.542 cv 333.954 285.542 li 333.473 285.542 333.088 285.688 332.703 286.072 cv 332.365 286.361 332.223 286.746 332.174 287.274 cv 332.174 288.669 li 332.174 289.151 332.318 289.536 332.703 289.92 cv 333.04 290.21 333.426 290.354 333.954 290.401 cv 347.397 290.401 li 347.879 290.401 348.265 290.256 348.647 289.92 cv 348.984 289.583 349.129 289.198 349.178 288.669 cv cp 351.87 288.861 mo 351.87 289.874 351.534 290.739 350.764 291.507 cv 350.044 292.229 349.178 292.566 348.119 292.614 cv 333.231 292.614 li 332.223 292.614 331.356 292.276 330.587 291.507 cv 329.865 290.786 329.527 289.92 329.48 288.861 cv 329.48 287.081 li 329.48 286.072 329.817 285.207 330.587 284.437 cv 331.308 283.714 332.174 283.378 333.231 283.329 cv 348.119 283.329 li 349.129 283.329 349.996 283.666 350.764 284.437 cv 351.486 285.157 351.822 286.024 351.87 287.081 cv 351.87 288.861 li f 372.061 285.569 mo 358.271 285.569 li 357.79 285.569 357.405 285.712 357.021 286.098 cv 356.683 286.387 356.538 286.772 356.491 287.301 cv 356.491 292.641 li 353.797 292.641 li 353.797 287.11 li 353.797 286.098 354.134 285.232 354.903 284.461 cv 355.625 283.742 356.491 283.405 357.55 283.357 cv 372.061 283.357 li 372.061 285.569 li f 393.889 284.993 mo 393.889 286.049 393.504 286.916 392.735 287.686 cv 393.504 288.407 393.889 289.322 393.889 290.428 cv 393.889 292.641 li 391.148 292.641 li 391.148 290.621 li 391.148 290.139 391.004 289.754 390.618 289.416 cv 390.33 289.081 389.946 288.936 389.416 288.889 cv 376.896 288.889 li 376.896 292.641 li 374.202 292.641 li 374.202 280.327 li 376.896 280.327 li 376.896 286.531 li 389.416 286.531 li 389.897 286.531 390.283 286.387 390.618 286.049 cv 390.955 285.712 391.099 285.328 391.148 284.799 cv 391.148 283.405 li 393.889 283.405 li 393.889 284.993 li f 396.205 291.073 mo 396.008 291.073 li 396.008 291.444 li 396.205 291.444 li 396.323 291.444 396.406 291.366 396.406 291.26 cv 396.406 291.153 396.323 291.073 396.205 291.073 cv cp 396.412 292.002 mo 396.169 291.57 li 396.008 291.57 li 396.008 292.002 li 395.861 292.002 li 395.861 290.942 li 396.222 290.942 li 396.406 290.942 396.556 291.081 396.556 291.26 cv 396.556 291.415 396.459 291.51 396.329 291.551 cv 396.583 292.002 li 396.412 292.002 li cp 396.177 290.647 mo 395.728 290.647 395.364 291.019 395.364 291.473 cv 395.364 291.928 395.728 292.299 396.177 292.299 cv 396.625 292.299 396.992 291.928 396.992 291.473 cv 396.992 291.019 396.625 290.647 396.177 290.647 cv cp 396.177 292.441 mo 395.642 292.441 395.209 292.008 395.209 291.473 cv 395.209 290.939 395.642 290.506 396.177 290.506 cv 396.711 290.506 397.144 290.939 397.144 291.473 cv 397.144 292.008 396.711 292.441 396.177 292.441 cv f 402.319 392.493 mo 402.319 398.2 397.693 402.826 391.986 402.826 cv 218.985 402.826 li 213.279 402.826 208.652 398.2 208.652 392.493 cv 208.652 386.786 213.279 382.16 218.985 382.16 cv 391.986 382.16 li 397.693 382.16 402.319 386.786 402.319 392.493 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 284.759 394.229 mo 284.759 394.957 284.516 395.582 283.961 396.136 cv 283.439 396.657 282.814 396.9 282.052 396.935 cv 275.65 396.935 li 274.99 396.935 274.436 396.727 273.915 396.31 cv 273.428 396.727 272.84 396.935 272.146 396.935 cv 266.259 396.935 li 265.531 396.935 264.905 396.693 264.351 396.136 cv 263.83 395.615 263.588 394.993 263.553 394.229 cv 263.553 390.239 li 265.495 390.239 li 265.495 394.089 li 265.495 394.436 265.6 394.713 265.877 394.993 cv 266.121 395.2 266.397 395.303 266.779 395.339 cv 271.66 395.339 li 272.006 395.339 272.284 395.235 272.527 394.993 cv 272.77 394.748 272.873 394.472 272.908 394.089 cv 272.908 390.239 li 274.887 390.239 li 274.887 394.089 li 274.887 394.436 274.99 394.713 275.233 394.993 cv 275.477 395.2 275.754 395.303 276.135 395.339 cv 281.566 395.339 li 281.912 395.339 282.19 395.235 282.434 394.993 cv 282.676 394.748 282.78 394.472 282.814 394.089 cv 282.814 390.239 li 284.759 390.239 li 284.759 394.229 li 0 0 0 0 cmyk f 302.439 396.935 mo 288.923 396.935 li 288.193 396.935 287.569 396.693 287.014 396.136 cv 286.494 395.615 286.25 394.993 286.216 394.229 cv 286.216 392.979 li 286.216 392.25 286.459 391.625 287.014 391.07 cv 287.535 390.55 288.159 390.306 288.923 390.272 cv 302.439 390.272 li 302.439 391.868 li 300.564 394.436 li 298.621 394.436 li 300.461 391.868 li 289.442 391.868 li 289.096 391.868 288.818 391.973 288.541 392.25 cv 288.297 392.458 288.193 392.735 288.159 393.117 cv 288.159 394.089 li 288.159 394.436 288.264 394.713 288.541 394.993 cv 288.783 395.2 289.062 395.303 289.442 395.339 cv 302.439 395.339 li 302.439 396.935 li f 318.485 394.089 mo 318.485 393.117 li 318.485 392.77 318.382 392.493 318.104 392.25 cv 317.896 392.006 317.618 391.903 317.236 391.868 cv 306.149 391.868 li 306.149 395.339 li 317.236 395.339 li 317.584 395.339 317.861 395.235 318.104 394.993 cv 318.348 394.748 318.451 394.472 318.485 394.089 cv cp 320.43 394.229 mo 320.43 394.957 320.187 395.582 319.631 396.136 cv 319.146 396.657 318.52 396.9 317.722 396.935 cv 304.205 396.935 li 304.205 388.051 li 306.149 388.051 li 306.149 390.272 li 317.722 390.272 li 318.485 390.272 319.111 390.515 319.631 391.07 cv 320.151 391.589 320.395 392.215 320.43 392.979 cv 320.43 394.229 li f 343.574 394.229 mo 343.574 394.957 343.332 395.582 342.776 396.136 cv 342.256 396.657 341.631 396.9 340.867 396.935 cv 334.465 396.935 li 333.807 396.935 333.25 396.727 332.73 396.31 cv 332.244 396.727 331.654 396.935 330.96 396.935 cv 324.559 396.935 li 323.83 396.935 323.205 396.693 322.649 396.136 cv 322.129 395.615 321.886 394.993 321.852 394.229 cv 321.852 390.239 li 323.795 390.239 li 323.795 394.089 li 323.795 394.436 323.9 394.713 324.176 394.993 cv 324.42 395.2 324.697 395.303 325.08 395.339 cv 330.475 395.339 li 330.822 395.339 331.1 395.235 331.342 394.993 cv 331.584 394.748 331.689 394.472 331.723 394.089 cv 331.723 390.239 li 333.702 390.239 li 333.702 394.089 li 333.702 394.436 333.807 394.713 334.049 394.993 cv 334.292 395.2 334.569 395.303 334.951 395.339 cv 340.381 395.339 li 340.729 395.339 341.006 395.235 341.25 394.993 cv 341.492 394.748 341.596 394.472 341.631 394.089 cv 341.631 390.239 li 343.574 390.239 li 343.574 394.229 li f 359.274 394.071 mo 359.274 393.064 li 359.274 392.716 359.17 392.439 358.892 392.197 cv 358.649 391.953 358.371 391.85 357.99 391.815 cv 348.291 391.815 li 347.944 391.815 347.666 391.919 347.389 392.197 cv 347.145 392.405 347.042 392.683 347.007 393.064 cv 347.007 394.071 li 347.007 394.418 347.111 394.695 347.389 394.973 cv 347.633 395.181 347.91 395.286 348.291 395.319 cv 357.99 395.319 li 358.338 395.319 358.615 395.215 358.892 394.973 cv 359.135 394.729 359.24 394.452 359.274 394.071 cv cp 361.217 394.208 mo 361.217 394.939 360.975 395.563 360.418 396.117 cv 359.9 396.638 359.274 396.88 358.511 396.916 cv 347.77 396.916 li 347.042 396.916 346.417 396.672 345.862 396.117 cv 345.342 395.597 345.098 394.973 345.064 394.208 cv 345.064 392.924 li 345.064 392.197 345.307 391.573 345.862 391.015 cv 346.382 390.496 347.007 390.251 347.77 390.217 cv 358.511 390.217 li 359.24 390.217 359.865 390.46 360.418 391.015 cv 360.939 391.537 361.182 392.161 361.217 392.924 cv 361.217 394.208 li f 375.783 391.834 mo 365.834 391.834 li 365.488 391.834 365.211 391.937 364.933 392.215 cv 364.689 392.423 364.585 392.702 364.551 393.084 cv 364.551 396.935 li 362.607 396.935 li 362.607 392.945 li 362.607 392.215 362.85 391.589 363.405 391.034 cv 363.926 390.515 364.551 390.272 365.314 390.239 cv 375.783 390.239 li 375.783 391.834 li f 391.531 391.418 mo 391.531 392.18 391.254 392.804 390.699 393.361 cv 391.254 393.88 391.531 394.541 391.531 395.339 cv 391.531 396.935 li 389.555 396.935 li 389.555 395.477 li 389.555 395.129 389.45 394.854 389.172 394.609 cv 388.964 394.366 388.688 394.262 388.304 394.229 cv 379.272 394.229 li 379.272 396.935 li 377.329 396.935 li 377.329 388.051 li 379.272 388.051 li 379.272 392.527 li 388.304 392.527 li 388.652 392.527 388.93 392.423 389.172 392.18 cv 389.414 391.937 389.518 391.659 389.555 391.278 cv 389.555 390.272 li 391.531 390.272 li 391.531 391.418 li f 393.202 395.804 mo 393.06 395.804 li 393.06 396.071 li 393.202 396.071 li 393.287 396.071 393.347 396.015 393.347 395.939 cv 393.347 395.861 393.287 395.804 393.202 395.804 cv cp 393.352 396.475 mo 393.177 396.163 li 393.06 396.163 li 393.06 396.475 li 392.954 396.475 li 392.954 395.71 li 393.215 395.71 li 393.347 395.71 393.455 395.81 393.455 395.939 cv 393.455 396.05 393.385 396.12 393.292 396.149 cv 393.475 396.475 li 393.352 396.475 li cp 393.182 395.497 mo 392.857 395.497 392.596 395.765 392.596 396.093 cv 392.596 396.421 392.857 396.689 393.182 396.689 cv 393.505 396.689 393.771 396.421 393.771 396.093 cv 393.771 395.765 393.505 395.497 393.182 395.497 cv cp 393.182 396.791 mo 392.796 396.791 392.483 396.48 392.483 396.093 cv 392.483 395.708 392.796 395.395 393.182 395.395 cv 393.567 395.395 393.879 395.708 393.879 396.093 cv 393.879 396.48 393.567 396.791 393.182 396.791 cv f 252.647 396.333 mo 251.604 396.333 250.653 395.954 249.94 395.241 cv 249.229 394.53 248.802 393.532 248.802 392.535 cv 248.802 391.49 249.229 390.542 249.94 389.829 cv 250.653 389.116 251.604 388.69 252.647 388.69 cv 253.644 388.69 254.593 389.116 255.353 389.829 cv 256.065 390.542 256.445 391.49 256.445 392.535 cv 256.445 394.624 254.736 396.333 252.647 396.333 cv cp 236.602 396.333 mo 236.014 396.333 235.434 396.186 234.904 395.932 cv 234.555 395.747 234.227 395.525 233.944 395.242 cv 233.232 394.53 232.805 393.581 232.805 392.537 cv 232.805 391.54 233.232 390.542 233.944 389.831 cv 234.656 389.118 235.605 388.738 236.65 388.738 cv 237.688 388.738 238.631 389.162 239.318 389.842 cv 240.022 390.553 240.446 391.497 240.446 392.535 cv 240.446 394.624 238.69 396.333 236.602 396.333 cv cp 223.311 395.242 mo 222.598 395.954 221.648 396.381 220.604 396.381 cv 219.607 396.381 218.61 395.954 217.898 395.242 cv 217.187 394.53 216.807 393.581 216.807 392.537 cv 216.807 391.54 217.187 390.542 217.898 389.831 cv 218.61 389.118 219.607 388.738 220.604 388.738 cv 222.693 388.738 224.449 390.447 224.449 392.537 cv 224.449 393.581 224.022 394.53 223.311 395.242 cv cp 256.967 388.215 mo 255.781 387.077 254.262 386.46 252.647 386.46 cv 250.369 386.46 248.422 387.693 247.377 389.497 cv 246.523 389.022 245.525 388.784 244.529 388.784 cv 243.589 388.784 242.651 389.019 241.85 389.391 cv 241.6 388.968 241.308 388.569 240.969 388.215 cv 240.389 387.661 239.697 387.217 238.945 386.913 cv 238.92 386.904 238.893 386.896 238.867 386.885 cv 238.707 386.823 238.546 386.764 238.381 386.716 cv 238.368 386.711 238.355 386.71 238.343 386.706 cv 237.795 386.547 237.226 386.46 236.65 386.46 cv 236.643 386.46 236.634 386.46 236.625 386.46 cv 236.617 386.46 236.609 386.46 236.602 386.46 cv 233.23 386.46 230.525 389.165 230.525 392.535 cv 230.525 392.828 230.552 393.119 230.593 393.405 cv 229.981 393.774 229.28 394.006 228.532 394.006 cv 227.867 394.006 227.203 393.817 226.586 393.532 cv 226.633 393.202 226.681 392.868 226.681 392.537 cv 226.681 390.921 226.064 389.355 224.924 388.215 cv 223.785 387.125 222.219 386.46 220.604 386.46 cv 218.99 386.46 217.471 387.125 216.283 388.215 cv 215.145 389.401 214.527 390.921 214.527 392.537 cv 214.527 395.907 217.233 398.612 220.604 398.612 cv 222.219 398.612 223.785 397.994 224.924 396.856 cv 225.256 396.475 225.59 396.096 225.826 395.668 cv 226.633 396.049 227.582 396.288 228.532 396.288 cv 229.515 396.288 230.496 396.053 231.342 395.59 cv 231.6 396.042 231.91 396.467 232.281 396.856 cv 233.061 397.572 233.985 398.1 234.984 398.382 cv 235.01 398.389 235.037 398.395 235.063 398.403 cv 235.289 398.463 235.519 398.51 235.75 398.543 cv 235.783 398.548 235.816 398.553 235.849 398.558 cv 236.098 398.59 236.348 398.612 236.602 398.612 cv 236.61 398.612 236.619 398.611 236.629 398.611 cv 236.636 398.611 236.643 398.612 236.65 398.612 cv 238.264 398.612 239.783 397.994 240.969 396.856 cv 242.062 395.716 242.727 394.197 242.727 392.537 cv 242.727 392.193 242.689 391.853 242.632 391.518 cv 243.234 391.246 243.882 391.063 244.529 391.063 cv 245.289 391.063 246.002 391.301 246.618 391.68 cv 246.57 391.966 246.57 392.203 246.57 392.535 cv 246.57 394.149 247.188 395.668 248.326 396.856 cv 249.466 397.946 250.985 398.612 252.647 398.612 cv 254.262 398.612 255.827 397.946 256.967 396.856 cv 258.059 395.716 258.724 394.149 258.724 392.535 cv 258.724 390.874 258.059 389.355 256.967 388.215 cv f 236.625 390.162 mo 235.314 390.162 234.252 391.225 234.252 392.535 cv 234.252 393.847 235.314 394.908 236.625 394.908 cv 237.936 394.908 239 393.847 239 392.535 cv 239 391.225 237.936 390.162 236.625 390.162 cv f 402.319 443.725 mo 402.319 449.432 397.693 454.058 391.986 454.058 cv 218.985 454.058 li 213.279 454.058 208.652 449.432 208.652 443.725 cv 208.652 438.018 213.279 433.392 218.985 433.392 cv 391.986 433.392 li 397.693 433.392 402.319 438.018 402.319 443.725 cv 0.960785 0.94902 0.29804 0.184314 cmyk f 284.759 445.461 mo 284.759 446.189 284.516 446.814 283.961 447.369 cv 283.439 447.889 282.814 448.132 282.052 448.168 cv 275.65 448.168 li 274.99 448.168 274.436 447.96 273.915 447.542 cv 273.428 447.96 272.84 448.168 272.146 448.168 cv 266.259 448.168 li 265.531 448.168 264.905 447.925 264.351 447.369 cv 263.83 446.847 263.588 446.225 263.553 445.461 cv 263.553 441.471 li 265.495 441.471 li 265.495 445.322 li 265.495 445.668 265.6 445.946 265.877 446.225 cv 266.121 446.432 266.397 446.536 266.779 446.572 cv 271.66 446.572 li 272.006 446.572 272.284 446.467 272.527 446.225 cv 272.77 445.98 272.873 445.705 272.908 445.322 cv 272.908 441.471 li 274.887 441.471 li 274.887 445.322 li 274.887 445.668 274.99 445.946 275.233 446.225 cv 275.477 446.432 275.754 446.536 276.135 446.572 cv 281.566 446.572 li 281.912 446.572 282.19 446.467 282.434 446.225 cv 282.676 445.98 282.78 445.705 282.814 445.322 cv 282.814 441.471 li 284.759 441.471 li 284.759 445.461 li 0 0 0 0 cmyk f 302.439 448.168 mo 288.923 448.168 li 288.193 448.168 287.569 447.925 287.014 447.369 cv 286.494 446.847 286.25 446.225 286.216 445.461 cv 286.216 444.211 li 286.216 443.482 286.459 442.857 287.014 442.302 cv 287.535 441.783 288.159 441.539 288.923 441.504 cv 302.439 441.504 li 302.439 443.1 li 300.564 445.668 li 298.621 445.668 li 300.461 443.1 li 289.442 443.1 li 289.096 443.1 288.818 443.206 288.541 443.482 cv 288.297 443.691 288.193 443.967 288.159 444.349 cv 288.159 445.322 li 288.159 445.668 288.264 445.946 288.541 446.225 cv 288.783 446.432 289.062 446.536 289.442 446.572 cv 302.439 446.572 li 302.439 448.168 li f 318.485 445.322 mo 318.485 444.349 li 318.485 444.002 318.382 443.725 318.104 443.482 cv 317.896 443.239 317.618 443.135 317.236 443.1 cv 306.149 443.1 li 306.149 446.572 li 317.236 446.572 li 317.584 446.572 317.861 446.467 318.104 446.225 cv 318.348 445.98 318.451 445.705 318.485 445.322 cv cp 320.43 445.461 mo 320.43 446.189 320.187 446.814 319.631 447.369 cv 319.146 447.889 318.52 448.132 317.722 448.168 cv 304.205 448.168 li 304.205 439.284 li 306.149 439.284 li 306.149 441.504 li 317.722 441.504 li 318.485 441.504 319.111 441.748 319.631 442.302 cv 320.151 442.822 320.395 443.448 320.43 444.211 cv 320.43 445.461 li f 343.574 445.461 mo 343.574 446.189 343.332 446.814 342.776 447.369 cv 342.256 447.889 341.631 448.132 340.867 448.168 cv 334.465 448.168 li 333.807 448.168 333.25 447.96 332.73 447.542 cv 332.244 447.96 331.654 448.168 330.96 448.168 cv 324.559 448.168 li 323.83 448.168 323.205 447.925 322.649 447.369 cv 322.129 446.847 321.886 446.225 321.852 445.461 cv 321.852 441.471 li 323.795 441.471 li 323.795 445.322 li 323.795 445.668 323.9 445.946 324.176 446.225 cv 324.42 446.432 324.697 446.536 325.08 446.572 cv 330.475 446.572 li 330.822 446.572 331.1 446.467 331.342 446.225 cv 331.584 445.98 331.689 445.705 331.723 445.322 cv 331.723 441.471 li 333.702 441.471 li 333.702 445.322 li 333.702 445.668 333.807 445.946 334.049 446.225 cv 334.292 446.432 334.569 446.536 334.951 446.572 cv 340.381 446.572 li 340.729 446.572 341.006 446.467 341.25 446.225 cv 341.492 445.98 341.596 445.705 341.631 445.322 cv 341.631 441.471 li 343.574 441.471 li 343.574 445.461 li f 359.274 445.303 mo 359.274 444.296 li 359.274 443.949 359.17 443.671 358.892 443.429 cv 358.649 443.185 358.371 443.083 357.99 443.047 cv 348.291 443.047 li 347.944 443.047 347.666 443.152 347.389 443.429 cv 347.145 443.637 347.042 443.916 347.007 444.296 cv 347.007 445.303 li 347.007 445.65 347.111 445.927 347.389 446.206 cv 347.633 446.414 347.91 446.518 348.291 446.551 cv 357.99 446.551 li 358.338 446.551 358.615 446.448 358.892 446.206 cv 359.135 445.961 359.24 445.684 359.274 445.303 cv cp 361.217 445.44 mo 361.217 446.171 360.975 446.795 360.418 447.349 cv 359.9 447.871 359.274 448.113 358.511 448.148 cv 347.77 448.148 li 347.042 448.148 346.417 447.905 345.862 447.349 cv 345.342 446.83 345.098 446.206 345.064 445.44 cv 345.064 444.157 li 345.064 443.429 345.307 442.805 345.862 442.248 cv 346.382 441.728 347.007 441.484 347.77 441.45 cv 358.511 441.45 li 359.24 441.45 359.865 441.693 360.418 442.248 cv 360.939 442.769 361.182 443.393 361.217 444.157 cv 361.217 445.44 li f 375.783 443.066 mo 365.834 443.066 li 365.488 443.066 365.211 443.169 364.933 443.448 cv 364.689 443.656 364.585 443.934 364.551 444.316 cv 364.551 448.168 li 362.607 448.168 li 362.607 444.177 li 362.607 443.448 362.85 442.822 363.405 442.266 cv 363.926 441.748 364.551 441.504 365.314 441.471 cv 375.783 441.471 li 375.783 443.066 li f 391.531 442.65 mo 391.531 443.413 391.254 444.037 390.699 444.593 cv 391.254 445.113 391.531 445.773 391.531 446.572 cv 391.531 448.168 li 389.555 448.168 li 389.555 446.71 li 389.555 446.362 389.45 446.086 389.172 445.841 cv 388.964 445.598 388.688 445.495 388.304 445.461 cv 379.272 445.461 li 379.272 448.168 li 377.329 448.168 li 377.329 439.284 li 379.272 439.284 li 379.272 443.759 li 388.304 443.759 li 388.652 443.759 388.93 443.656 389.172 443.413 cv 389.414 443.169 389.518 442.891 389.555 442.51 cv 389.555 441.504 li 391.531 441.504 li 391.531 442.65 li f 393.202 447.037 mo 393.06 447.037 li 393.06 447.303 li 393.202 447.303 li 393.287 447.303 393.347 447.248 393.347 447.171 cv 393.347 447.093 393.287 447.037 393.202 447.037 cv cp 393.352 447.708 mo 393.177 447.395 li 393.06 447.395 li 393.06 447.708 li 392.954 447.708 li 392.954 446.942 li 393.215 446.942 li 393.347 446.942 393.455 447.042 393.455 447.171 cv 393.455 447.283 393.385 447.352 393.292 447.381 cv 393.475 447.708 li 393.352 447.708 li cp 393.182 446.729 mo 392.857 446.729 392.596 446.998 392.596 447.326 cv 392.596 447.654 392.857 447.921 393.182 447.921 cv 393.505 447.921 393.771 447.654 393.771 447.326 cv 393.771 446.998 393.505 446.729 393.182 446.729 cv cp 393.182 448.023 mo 392.796 448.023 392.483 447.712 392.483 447.326 cv 392.483 446.94 392.796 446.627 393.182 446.627 cv 393.567 446.627 393.879 446.94 393.879 447.326 cv 393.879 447.712 393.567 448.023 393.182 448.023 cv f 252.647 447.565 mo 251.604 447.565 250.653 447.186 249.94 446.473 cv 249.229 445.762 248.802 444.764 248.802 443.767 cv 248.802 442.722 249.229 441.774 249.94 441.061 cv 250.653 440.348 251.604 439.922 252.647 439.922 cv 253.644 439.922 254.593 440.348 255.353 441.061 cv 256.065 441.774 256.445 442.722 256.445 443.767 cv 256.445 445.856 254.736 447.565 252.647 447.565 cv cp 236.602 447.565 mo 236.014 447.565 235.434 447.418 234.904 447.165 cv 234.555 446.979 234.227 446.757 233.944 446.474 cv 233.232 445.762 232.805 444.813 232.805 443.769 cv 232.805 442.772 233.232 441.774 233.944 441.063 cv 234.656 440.35 235.605 439.97 236.65 439.97 cv 237.688 439.97 238.631 440.394 239.318 441.075 cv 240.022 441.786 240.446 442.729 240.446 443.767 cv 240.446 445.856 238.69 447.565 236.602 447.565 cv cp 223.311 446.474 mo 222.598 447.186 221.648 447.614 220.604 447.614 cv 219.607 447.614 218.61 447.186 217.898 446.474 cv 217.187 445.762 216.807 444.813 216.807 443.769 cv 216.807 442.772 217.187 441.774 217.898 441.063 cv 218.61 440.35 219.607 439.97 220.604 439.97 cv 222.693 439.97 224.449 441.679 224.449 443.769 cv 224.449 444.813 224.022 445.762 223.311 446.474 cv cp 256.967 439.448 mo 255.781 438.309 254.262 437.692 252.647 437.692 cv 250.369 437.692 248.422 438.925 247.377 440.729 cv 246.523 440.254 245.525 440.016 244.529 440.016 cv 243.589 440.016 242.651 440.251 241.85 440.624 cv 241.6 440.201 241.308 439.801 240.969 439.448 cv 240.389 438.893 239.697 438.45 238.945 438.145 cv 238.92 438.136 238.893 438.128 238.867 438.118 cv 238.707 438.055 238.546 437.997 238.381 437.949 cv 238.368 437.944 238.355 437.943 238.343 437.938 cv 237.795 437.78 237.226 437.692 236.65 437.692 cv 236.643 437.692 236.634 437.692 236.625 437.692 cv 236.617 437.692 236.609 437.692 236.602 437.692 cv 233.23 437.692 230.525 440.397 230.525 443.767 cv 230.525 444.06 230.552 444.351 230.593 444.637 cv 229.981 445.006 229.28 445.239 228.532 445.239 cv 227.867 445.239 227.203 445.049 226.586 444.764 cv 226.633 444.434 226.681 444.1 226.681 443.769 cv 226.681 442.154 226.064 440.587 224.924 439.448 cv 223.785 438.357 222.219 437.692 220.604 437.692 cv 218.99 437.692 217.471 438.357 216.283 439.448 cv 215.145 440.633 214.527 442.154 214.527 443.769 cv 214.527 447.139 217.233 449.844 220.604 449.844 cv 222.219 449.844 223.785 449.226 224.924 448.088 cv 225.256 447.708 225.59 447.329 225.826 446.901 cv 226.633 447.282 227.582 447.52 228.532 447.52 cv 229.515 447.52 230.496 447.286 231.342 446.823 cv 231.6 447.275 231.91 447.7 232.281 448.088 cv 233.061 448.804 233.985 449.333 234.984 449.615 cv 235.01 449.622 235.037 449.627 235.063 449.635 cv 235.289 449.696 235.519 449.743 235.75 449.776 cv 235.783 449.781 235.816 449.786 235.849 449.791 cv 236.098 449.823 236.348 449.844 236.602 449.844 cv 236.61 449.844 236.619 449.843 236.629 449.843 cv 236.636 449.843 236.643 449.844 236.65 449.844 cv 238.264 449.844 239.783 449.226 240.969 448.088 cv 242.062 446.949 242.727 445.429 242.727 443.769 cv 242.727 443.425 242.689 443.085 242.632 442.75 cv 243.234 442.478 243.882 442.295 244.529 442.295 cv 245.289 442.295 246.002 442.534 246.618 442.913 cv 246.57 443.199 246.57 443.435 246.57 443.767 cv 246.57 445.381 247.188 446.901 248.326 448.088 cv 249.466 449.178 250.985 449.844 252.647 449.844 cv 254.262 449.844 255.827 449.178 256.967 448.088 cv 258.059 446.949 258.724 445.381 258.724 443.767 cv 258.724 442.106 258.059 440.587 256.967 439.448 cv f 236.625 441.394 mo 235.314 441.394 234.252 442.458 234.252 443.767 cv 234.252 445.08 235.314 446.14 236.625 446.14 cv 237.936 446.14 239 445.08 239 443.767 cv 239 442.458 237.936 441.394 236.625 441.394 cv f 402.319 497.571 mo 402.319 503.278 397.693 507.904 391.986 507.904 cv 218.985 507.904 li 213.279 507.904 208.652 503.278 208.652 497.571 cv 208.652 491.864 213.279 487.238 218.985 487.238 cv 391.986 487.238 li 397.693 487.238 402.319 491.864 402.319 497.571 cv 0.960785 0.94902 0.29804 0.184314 cmyk f 284.759 499.307 mo 284.759 500.035 284.516 500.66 283.961 501.214 cv 283.439 501.735 282.814 501.978 282.052 502.013 cv 275.65 502.013 li 274.99 502.013 274.436 501.805 273.915 501.388 cv 273.428 501.805 272.84 502.013 272.146 502.013 cv 266.259 502.013 li 265.531 502.013 264.905 501.771 264.351 501.214 cv 263.83 500.693 263.588 500.071 263.553 499.307 cv 263.553 495.317 li 265.495 495.317 li 265.495 499.168 li 265.495 499.514 265.6 499.792 265.877 500.071 cv 266.121 500.278 266.397 500.381 266.779 500.418 cv 271.66 500.418 li 272.006 500.418 272.284 500.313 272.527 500.071 cv 272.77 499.826 272.873 499.55 272.908 499.168 cv 272.908 495.317 li 274.887 495.317 li 274.887 499.168 li 274.887 499.514 274.99 499.792 275.233 500.071 cv 275.477 500.278 275.754 500.381 276.135 500.418 cv 281.566 500.418 li 281.912 500.418 282.19 500.313 282.434 500.071 cv 282.676 499.826 282.78 499.55 282.814 499.168 cv 282.814 495.317 li 284.759 495.317 li 284.759 499.307 li 0 0 0 0 cmyk f 302.439 502.013 mo 288.923 502.013 li 288.193 502.013 287.569 501.771 287.014 501.214 cv 286.494 500.693 286.25 500.071 286.216 499.307 cv 286.216 498.057 li 286.216 497.328 286.459 496.703 287.014 496.148 cv 287.535 495.628 288.159 495.384 288.923 495.35 cv 302.439 495.35 li 302.439 496.946 li 300.564 499.514 li 298.621 499.514 li 300.461 496.946 li 289.442 496.946 li 289.096 496.946 288.818 497.051 288.541 497.328 cv 288.297 497.537 288.193 497.813 288.159 498.195 cv 288.159 499.168 li 288.159 499.514 288.264 499.792 288.541 500.071 cv 288.783 500.278 289.062 500.381 289.442 500.418 cv 302.439 500.418 li 302.439 502.013 li f 318.485 499.168 mo 318.485 498.195 li 318.485 497.848 318.382 497.571 318.104 497.328 cv 317.896 497.084 317.618 496.981 317.236 496.946 cv 306.149 496.946 li 306.149 500.418 li 317.236 500.418 li 317.584 500.418 317.861 500.313 318.104 500.071 cv 318.348 499.826 318.451 499.55 318.485 499.168 cv cp 320.43 499.307 mo 320.43 500.035 320.187 500.66 319.631 501.214 cv 319.146 501.735 318.52 501.978 317.722 502.013 cv 304.205 502.013 li 304.205 493.129 li 306.149 493.129 li 306.149 495.35 li 317.722 495.35 li 318.485 495.35 319.111 495.593 319.631 496.148 cv 320.151 496.668 320.395 497.293 320.43 498.057 cv 320.43 499.307 li f 343.574 499.307 mo 343.574 500.035 343.332 500.66 342.776 501.214 cv 342.256 501.735 341.631 501.978 340.867 502.013 cv 334.465 502.013 li 333.807 502.013 333.25 501.805 332.73 501.388 cv 332.244 501.805 331.654 502.013 330.96 502.013 cv 324.559 502.013 li 323.83 502.013 323.205 501.771 322.649 501.214 cv 322.129 500.693 321.886 500.071 321.852 499.307 cv 321.852 495.317 li 323.795 495.317 li 323.795 499.168 li 323.795 499.514 323.9 499.792 324.176 500.071 cv 324.42 500.278 324.697 500.381 325.08 500.418 cv 330.475 500.418 li 330.822 500.418 331.1 500.313 331.342 500.071 cv 331.584 499.826 331.689 499.55 331.723 499.168 cv 331.723 495.317 li 333.702 495.317 li 333.702 499.168 li 333.702 499.514 333.807 499.792 334.049 500.071 cv 334.292 500.278 334.569 500.381 334.951 500.418 cv 340.381 500.418 li 340.729 500.418 341.006 500.313 341.25 500.071 cv 341.492 499.826 341.596 499.55 341.631 499.168 cv 341.631 495.317 li 343.574 495.317 li 343.574 499.307 li f 359.274 499.149 mo 359.274 498.142 li 359.274 497.794 359.17 497.517 358.892 497.275 cv 358.649 497.031 358.371 496.928 357.99 496.893 cv 348.291 496.893 li 347.944 496.893 347.666 496.998 347.389 497.275 cv 347.145 497.483 347.042 497.761 347.007 498.142 cv 347.007 499.149 li 347.007 499.496 347.111 499.773 347.389 500.051 cv 347.633 500.259 347.91 500.364 348.291 500.397 cv 357.99 500.397 li 358.338 500.397 358.615 500.293 358.892 500.051 cv 359.135 499.807 359.24 499.53 359.274 499.149 cv cp 361.217 499.286 mo 361.217 500.017 360.975 500.641 360.418 501.195 cv 359.9 501.716 359.274 501.958 358.511 501.994 cv 347.77 501.994 li 347.042 501.994 346.417 501.75 345.862 501.195 cv 345.342 500.675 345.098 500.051 345.064 499.286 cv 345.064 498.002 li 345.064 497.275 345.307 496.651 345.862 496.093 cv 346.382 495.574 347.007 495.33 347.77 495.295 cv 358.511 495.295 li 359.24 495.295 359.865 495.539 360.418 496.093 cv 360.939 496.615 361.182 497.239 361.217 498.002 cv 361.217 499.286 li f 375.783 496.912 mo 365.834 496.912 li 365.488 496.912 365.211 497.015 364.933 497.293 cv 364.689 497.501 364.585 497.78 364.551 498.162 cv 364.551 502.013 li 362.607 502.013 li 362.607 498.023 li 362.607 497.293 362.85 496.668 363.405 496.112 cv 363.926 495.593 364.551 495.35 365.314 495.317 cv 375.783 495.317 li 375.783 496.912 li f 391.531 496.496 mo 391.531 497.258 391.254 497.882 390.699 498.439 cv 391.254 498.958 391.531 499.619 391.531 500.418 cv 391.531 502.013 li 389.555 502.013 li 389.555 500.555 li 389.555 500.208 389.45 499.932 389.172 499.687 cv 388.964 499.444 388.688 499.34 388.304 499.307 cv 379.272 499.307 li 379.272 502.013 li 377.329 502.013 li 377.329 493.129 li 379.272 493.129 li 379.272 497.605 li 388.304 497.605 li 388.652 497.605 388.93 497.501 389.172 497.258 cv 389.414 497.015 389.518 496.737 389.555 496.356 cv 389.555 495.35 li 391.531 495.35 li 391.531 496.496 li f 393.202 500.882 mo 393.06 500.882 li 393.06 501.149 li 393.202 501.149 li 393.287 501.149 393.347 501.093 393.347 501.017 cv 393.347 500.939 393.287 500.882 393.202 500.882 cv cp 393.352 501.553 mo 393.177 501.241 li 393.06 501.241 li 393.06 501.553 li 392.954 501.553 li 392.954 500.788 li 393.215 500.788 li 393.347 500.788 393.455 500.888 393.455 501.017 cv 393.455 501.128 393.385 501.198 393.292 501.227 cv 393.475 501.553 li 393.352 501.553 li cp 393.182 500.575 mo 392.857 500.575 392.596 500.843 392.596 501.171 cv 392.596 501.5 392.857 501.767 393.182 501.767 cv 393.505 501.767 393.771 501.5 393.771 501.171 cv 393.771 500.843 393.505 500.575 393.182 500.575 cv cp 393.182 501.869 mo 392.796 501.869 392.483 501.558 392.483 501.171 cv 392.483 500.786 392.796 500.473 393.182 500.473 cv 393.567 500.473 393.879 500.786 393.879 501.171 cv 393.879 501.558 393.567 501.869 393.182 501.869 cv f 252.647 501.411 mo 251.604 501.411 250.653 501.032 249.94 500.319 cv 249.229 499.608 248.802 498.61 248.802 497.613 cv 248.802 496.568 249.229 495.62 249.94 494.907 cv 250.653 494.194 251.604 493.768 252.647 493.768 cv 253.644 493.768 254.593 494.194 255.353 494.907 cv 256.065 495.62 256.445 496.568 256.445 497.613 cv 256.445 499.702 254.736 501.411 252.647 501.411 cv cp 236.602 501.411 mo 236.014 501.411 235.434 501.264 234.904 501.01 cv 234.555 500.825 234.227 500.603 233.944 500.32 cv 233.232 499.608 232.805 498.659 232.805 497.615 cv 232.805 496.618 233.232 495.62 233.944 494.909 cv 234.656 494.196 235.605 493.816 236.65 493.816 cv 237.688 493.816 238.631 494.24 239.318 494.92 cv 240.022 495.631 240.446 496.575 240.446 497.613 cv 240.446 499.702 238.69 501.411 236.602 501.411 cv cp 223.311 500.32 mo 222.598 501.032 221.648 501.46 220.604 501.46 cv 219.607 501.46 218.61 501.032 217.898 500.32 cv 217.187 499.608 216.807 498.659 216.807 497.615 cv 216.807 496.618 217.187 495.62 217.898 494.909 cv 218.61 494.196 219.607 493.816 220.604 493.816 cv 222.693 493.816 224.449 495.525 224.449 497.615 cv 224.449 498.659 224.022 499.608 223.311 500.32 cv cp 256.967 493.293 mo 255.781 492.155 254.262 491.538 252.647 491.538 cv 250.369 491.538 248.422 492.771 247.377 494.575 cv 246.523 494.1 245.525 493.862 244.529 493.862 cv 243.589 493.862 242.651 494.097 241.85 494.469 cv 241.6 494.046 241.308 493.647 240.969 493.293 cv 240.389 492.739 239.697 492.295 238.945 491.991 cv 238.92 491.982 238.893 491.974 238.867 491.963 cv 238.707 491.901 238.546 491.842 238.381 491.794 cv 238.368 491.79 238.355 491.789 238.343 491.784 cv 237.795 491.626 237.226 491.538 236.65 491.538 cv 236.643 491.538 236.634 491.538 236.625 491.538 cv 236.617 491.538 236.609 491.538 236.602 491.538 cv 233.23 491.538 230.525 494.243 230.525 497.613 cv 230.525 497.906 230.552 498.197 230.593 498.483 cv 229.981 498.852 229.28 499.084 228.532 499.084 cv 227.867 499.084 227.203 498.895 226.586 498.61 cv 226.633 498.28 226.681 497.946 226.681 497.615 cv 226.681 496 226.064 494.433 224.924 493.293 cv 223.785 492.203 222.219 491.538 220.604 491.538 cv 218.99 491.538 217.471 492.203 216.283 493.293 cv 215.145 494.479 214.527 496 214.527 497.615 cv 214.527 500.985 217.233 503.69 220.604 503.69 cv 222.219 503.69 223.785 503.072 224.924 501.934 cv 225.256 501.553 225.59 501.174 225.826 500.747 cv 226.633 501.127 227.582 501.366 228.532 501.366 cv 229.515 501.366 230.496 501.131 231.342 500.668 cv 231.6 501.121 231.91 501.545 232.281 501.934 cv 233.061 502.65 233.985 503.178 234.984 503.46 cv 235.01 503.467 235.037 503.473 235.063 503.481 cv 235.289 503.542 235.519 503.588 235.75 503.622 cv 235.783 503.626 235.816 503.631 235.849 503.636 cv 236.098 503.668 236.348 503.69 236.602 503.69 cv 236.61 503.69 236.619 503.689 236.629 503.689 cv 236.636 503.689 236.643 503.69 236.65 503.69 cv 238.264 503.69 239.783 503.072 240.969 501.934 cv 242.062 500.794 242.727 499.275 242.727 497.615 cv 242.727 497.271 242.689 496.931 242.632 496.596 cv 243.234 496.324 243.882 496.141 244.529 496.141 cv 245.289 496.141 246.002 496.379 246.618 496.758 cv 246.57 497.044 246.57 497.281 246.57 497.613 cv 246.57 499.227 247.188 500.747 248.326 501.934 cv 249.466 503.024 250.985 503.69 252.647 503.69 cv 254.262 503.69 255.827 503.024 256.967 501.934 cv 258.059 500.794 258.724 499.227 258.724 497.613 cv 258.724 495.952 258.059 494.433 256.967 493.293 cv 0.196079 0.219608 0.505883 0.0470589 cmyk f 236.625 495.24 mo 235.314 495.24 234.252 496.303 234.252 497.613 cv 234.252 498.925 235.314 499.986 236.625 499.986 cv 237.936 499.986 239 498.925 239 497.613 cv 239 496.303 237.936 495.24 236.625 495.24 cv f 21.0918 532.5 mo 20.5953 532.5 li 19.4888 528.51 li 18.3829 532.5 li 17.8863 532.5 li 16.6119 527.516 li 17.1792 527.516 li 18.1519 531.535 li 19.251 527.516 li 19.7271 527.516 li 20.8262 531.535 li 21.7989 527.516 li 22.3658 527.516 li 21.0918 532.5 li 0 0 0 1 cmyk f 23.1988 532.5 mo 23.1988 527.516 li 26.293 527.516 li 26.293 527.993 li 23.731 527.993 li 23.731 529.75 li 25.9151 529.75 li 25.9151 530.225 li 23.731 530.225 li 23.731 532.025 li 26.293 532.025 li 26.293 532.5 li 23.1988 532.5 li f 29.2891 530.198 mo 27.9307 530.198 li 27.9307 532.025 li 29.2891 532.025 li 29.9048 532.025 30.2901 531.668 30.2901 531.108 cv 30.2901 530.547 29.9048 530.198 29.2891 530.198 cv cp 29.233 527.993 mo 27.9307 527.993 li 27.9307 529.721 li 29.233 529.721 li 29.7857 529.721 30.2129 529.449 30.2129 528.853 cv 30.2129 528.258 29.7857 527.993 29.233 527.993 cv cp 29.3379 532.5 mo 27.399 532.5 li 27.399 527.516 li 29.275 527.516 li 30.1431 527.516 30.7447 528.013 30.7447 528.846 cv 30.7447 529.372 30.4297 529.785 30.0098 529.939 cv 30.4859 530.114 30.8218 530.527 30.8218 531.122 cv 30.8218 532.025 30.2198 532.5 29.3379 532.5 cv f 35.9458 532.5 mo 35.4488 532.5 li 34.3428 528.51 li 33.2369 532.5 li 32.7398 532.5 li 31.4659 527.516 li 32.0328 527.516 li 33.0059 531.535 li 34.105 527.516 li 34.5811 527.516 li 35.6797 531.535 li 36.6529 527.516 li 37.2198 527.516 li 35.9458 532.5 li f 40.3975 528.307 mo 40.1807 528.084 39.8658 527.951 39.5367 527.951 cv 39.2076 527.951 38.8926 528.084 38.6758 528.307 cv 38.3609 528.629 38.3257 528.965 38.3257 530.008 cv 38.3257 531.051 38.3609 531.387 38.6758 531.71 cv 38.8926 531.933 39.2076 532.067 39.5367 532.067 cv 39.8658 532.067 40.1807 531.933 40.3975 531.71 cv 40.7129 531.387 40.7476 531.051 40.7476 530.008 cv 40.7476 528.965 40.7129 528.629 40.3975 528.307 cv cp 40.8106 532.025 mo 40.4747 532.361 40.0337 532.542 39.5367 532.542 cv 39.0396 532.542 38.5987 532.361 38.2627 532.025 cv 37.7935 531.555 37.7935 531.066 37.7935 530.008 cv 37.7935 528.952 37.7935 528.461 38.2627 527.993 cv 38.5987 527.657 39.0396 527.474 39.5367 527.474 cv 40.0337 527.474 40.4747 527.657 40.8106 527.993 cv 41.2798 528.461 41.2798 528.952 41.2798 530.008 cv 41.2798 531.066 41.2798 531.555 40.8106 532.025 cv f 44.3946 527.993 mo 43.0645 527.993 li 43.0645 529.82 li 44.3946 529.82 li 44.9756 529.82 45.3887 529.518 45.3887 528.91 cv 45.3887 528.3 44.9756 527.993 44.3946 527.993 cv cp 45.3956 532.5 mo 44.2618 530.289 li 43.0645 530.289 li 43.0645 532.5 li 42.5328 532.5 li 42.5328 527.516 li 44.4439 527.516 li 45.3116 527.516 45.9205 528.042 45.9205 528.903 cv 45.9205 529.63 45.4795 530.107 44.8355 530.24 cv 46.0186 532.5 li 45.3956 532.5 li f 50.2256 532.5 mo 48.7066 529.847 li 47.6568 531.108 li 47.6568 532.5 li 47.1246 532.5 li 47.1246 527.516 li 47.6568 527.516 li 47.6568 530.379 li 49.9805 527.516 li 50.6314 527.516 li 49.0635 529.442 li 50.8555 532.5 li 50.2256 532.5 li f 53.4175 532.5 mo 53.4175 527.516 li 53.9498 527.516 li 53.9498 532.025 li 56.4976 532.025 li 56.4976 532.5 li 53.4175 532.5 li f 59.5904 528.307 mo 59.3736 528.084 59.0586 527.951 58.7295 527.951 cv 58.4004 527.951 58.0855 528.084 57.8687 528.307 cv 57.5538 528.629 57.5186 528.965 57.5186 530.008 cv 57.5186 531.051 57.5538 531.387 57.8687 531.71 cv 58.0855 531.933 58.4004 532.067 58.7295 532.067 cv 59.0586 532.067 59.3736 531.933 59.5904 531.71 cv 59.9058 531.387 59.9405 531.051 59.9405 530.008 cv 59.9405 528.965 59.9058 528.629 59.5904 528.307 cv cp 60.0035 532.025 mo 59.6675 532.361 59.2266 532.542 58.7295 532.542 cv 58.2325 532.542 57.7916 532.361 57.4556 532.025 cv 56.9864 531.555 56.9864 531.066 56.9864 530.008 cv 56.9864 528.952 56.9864 528.461 57.4556 527.993 cv 57.7916 527.657 58.2325 527.474 58.7295 527.474 cv 59.2266 527.474 59.6675 527.657 60.0035 527.993 cv 60.4727 528.461 60.4727 528.952 60.4727 530.008 cv 60.4727 531.066 60.4727 531.555 60.0035 532.025 cv f 64.6094 531.968 mo 64.2593 532.346 63.7906 532.542 63.2794 532.542 cv 62.7896 532.542 62.3414 532.361 62.0054 532.025 cv 61.5367 531.555 61.5367 531.066 61.5367 530.008 cv 61.5367 528.952 61.5367 528.461 62.0054 527.993 cv 62.3414 527.657 62.7828 527.474 63.2794 527.474 cv 64.2315 527.474 64.8755 528.09 65.0225 528.965 cv 64.4908 528.965 li 64.3506 528.335 63.9024 527.951 63.2794 527.951 cv 62.9507 527.951 62.6353 528.084 62.4185 528.307 cv 62.1036 528.629 62.0684 528.965 62.0684 530.008 cv 62.0684 531.051 62.1036 531.394 62.4185 531.716 cv 62.6353 531.941 62.9507 532.067 63.2794 532.067 cv 63.6436 532.067 63.9937 531.919 64.2247 531.639 cv 64.4273 531.394 64.5044 531.122 64.5044 530.737 cv 64.5044 530.359 li 63.2794 530.359 li 63.2794 529.889 li 65.0367 529.889 li 65.0367 530.68 li 65.0367 531.254 64.9175 531.639 64.6094 531.968 cv f 68.6905 528.307 mo 68.4737 528.084 68.1587 527.951 67.8296 527.951 cv 67.5005 527.951 67.1856 528.084 66.9683 528.307 cv 66.6534 528.629 66.6187 528.965 66.6187 530.008 cv 66.6187 531.051 66.6534 531.387 66.9683 531.71 cv 67.1856 531.933 67.5005 532.067 67.8296 532.067 cv 68.1587 532.067 68.4737 531.933 68.6905 531.71 cv 69.0054 531.387 69.0406 531.051 69.0406 530.008 cv 69.0406 528.965 69.0054 528.629 68.6905 528.307 cv cp 69.1036 532.025 mo 68.7676 532.361 68.3267 532.542 67.8296 532.542 cv 67.3326 532.542 66.8916 532.361 66.5557 532.025 cv 66.0865 531.555 66.0865 531.066 66.0865 530.008 cv 66.0865 528.952 66.0865 528.461 66.5557 527.993 cv 66.8916 527.657 67.3326 527.474 67.8296 527.474 cv 68.3267 527.474 68.7676 527.657 69.1036 527.993 cv 69.5723 528.461 69.5723 528.952 69.5723 530.008 cv 69.5723 531.066 69.5723 531.555 69.1036 532.025 cv f 74.1226 532.542 mo 73.6324 532.542 73.1846 532.361 72.8482 532.025 cv 72.3794 531.555 72.3794 531.066 72.3794 530.008 cv 72.3794 528.952 72.3794 528.461 72.8482 527.993 cv 73.1846 527.657 73.6324 527.474 74.1226 527.474 cv 75.0186 527.474 75.6836 528.02 75.8516 528.958 cv 75.3052 528.958 li 75.1724 528.349 74.7457 527.951 74.1226 527.951 cv 73.7935 527.951 73.4786 528.077 73.2613 528.3 cv 72.9463 528.623 72.9117 528.965 72.9117 530.008 cv 72.9117 531.051 72.9463 531.394 73.2613 531.716 cv 73.4786 531.941 73.7935 532.067 74.1226 532.067 cv 74.7457 532.067 75.1866 531.668 75.3194 531.058 cv 75.8516 531.058 li 75.6905 531.997 75.0113 532.542 74.1226 532.542 cv f 79.4424 528.307 mo 79.2252 528.084 78.9102 527.951 78.5816 527.951 cv 78.2525 527.951 77.9376 528.084 77.7203 528.307 cv 77.4053 528.629 77.3702 528.965 77.3702 530.008 cv 77.3702 531.051 77.4053 531.387 77.7203 531.71 cv 77.9376 531.933 78.2525 532.067 78.5816 532.067 cv 78.9102 532.067 79.2252 531.933 79.4424 531.71 cv 79.7574 531.387 79.7925 531.051 79.7925 530.008 cv 79.7925 528.965 79.7574 528.629 79.4424 528.307 cv cp 79.8555 532.025 mo 79.5196 532.361 79.0782 532.542 78.5816 532.542 cv 78.0845 532.542 77.6436 532.361 77.3072 532.025 cv 76.8384 531.555 76.8384 531.066 76.8384 530.008 cv 76.8384 528.952 76.8384 528.461 77.3072 527.993 cv 77.6436 527.657 78.0845 527.474 78.5816 527.474 cv 79.0782 527.474 79.5196 527.657 79.8555 527.993 cv 80.3243 528.461 80.3243 528.952 80.3243 530.008 cv 80.3243 531.066 80.3243 531.555 79.8555 532.025 cv f 84.7554 532.5 mo 82.1094 528.503 li 82.1094 532.5 li 81.5772 532.5 li 81.5772 527.516 li 82.0811 527.516 li 84.7271 531.5 li 84.7271 527.516 li 85.2593 527.516 li 85.2593 532.5 li 84.7554 532.5 li f 88.2554 532.542 mo 87.7652 532.542 87.3174 532.361 86.9815 532.025 cv 86.5123 531.555 86.5123 531.066 86.5123 530.008 cv 86.5123 528.952 86.5123 528.461 86.9815 527.993 cv 87.3174 527.657 87.7652 527.474 88.2554 527.474 cv 89.1514 527.474 89.8165 528.02 89.9844 528.958 cv 89.438 528.958 li 89.3052 528.349 88.8785 527.951 88.2554 527.951 cv 87.9263 527.951 87.6114 528.077 87.3941 528.3 cv 87.0792 528.623 87.0445 528.965 87.0445 530.008 cv 87.0445 531.051 87.0792 531.394 87.3941 531.716 cv 87.6114 531.941 87.9263 532.067 88.2554 532.067 cv 88.8785 532.067 89.3194 531.668 89.4522 531.058 cv 89.9844 531.058 li 89.8233 531.997 89.1441 532.542 88.2554 532.542 cv f 91.1602 532.5 mo 91.1602 527.516 li 94.2544 527.516 li 94.2544 527.993 li 91.6924 527.993 li 91.6924 529.75 li 93.876 529.75 li 93.876 530.225 li 91.6924 530.225 li 91.6924 532.025 li 94.2544 532.025 li 94.2544 532.5 li 91.1602 532.5 li f 97.1661 527.993 mo 95.8921 527.993 li 95.8921 529.973 li 97.1661 529.973 li 97.7891 529.973 98.2232 529.637 98.2232 528.979 cv 98.2232 528.322 97.7891 527.993 97.1661 527.993 cv cp 97.2154 530.45 mo 95.8921 530.45 li 95.8921 532.5 li 95.3604 532.5 li 95.3604 527.516 li 97.2154 527.516 li 98.125 527.516 98.7554 528.084 98.7554 528.979 cv 98.7554 529.876 98.125 530.45 97.2154 530.45 cv f 101.233 527.993 mo 101.233 532.5 li 100.702 532.5 li 100.702 527.993 li 99.2593 527.993 li 99.2593 527.516 li 102.676 527.516 li 102.676 527.993 li 101.233 527.993 li f 18.3062 541 mo 18.3062 536.577 li 17.375 537.395 li 17.375 536.822 li 18.3062 536.016 li 18.8101 536.016 li 18.8101 541 li 18.3062 541 li f 20.6299 541 mo 20.6299 540.552 li 22.5967 538.053 li 22.7862 537.808 22.877 537.591 22.877 537.319 cv 22.877 536.78 22.5547 536.422 22.0088 536.422 cv 21.5469 536.422 21.1412 536.681 21.1412 537.326 cv 20.6368 537.326 li 20.6368 536.542 21.1758 535.974 22.0088 535.974 cv 22.8282 535.974 23.3809 536.5 23.3809 537.319 cv 23.3809 537.717 23.2549 537.976 22.982 538.327 cv 21.2388 540.552 li 23.3809 540.552 li 23.3809 541 li 20.6299 541 li f 26.2579 539.348 mo 26.2579 538.879 li 24.3399 538.879 li 24.3399 539.348 li 26.2579 539.348 li f 28.5958 541 mo 28.5958 536.577 li 27.6646 537.395 li 27.6646 536.822 li 28.5958 536.016 li 29.0997 536.016 li 29.0997 541 li 28.5958 541 li f 32.2496 541 mo 32.2496 536.577 li 31.3189 537.395 li 31.3189 536.822 li 32.2496 536.016 li 32.754 536.016 li 32.754 541 li 32.2496 541 li f 34.6294 539.348 mo 34.6294 538.879 li 36.5474 538.879 li 36.5474 539.348 li 34.6294 539.348 li f 37.5557 541 mo 37.5557 540.552 li 39.5225 538.053 li 39.7115 537.808 39.8028 537.591 39.8028 537.319 cv 39.8028 536.78 39.4805 536.422 38.9346 536.422 cv 38.4727 536.422 38.0665 536.681 38.0665 537.326 cv 37.5626 537.326 li 37.5626 536.542 38.1016 535.974 38.9346 535.974 cv 39.7535 535.974 40.3067 536.5 40.3067 537.319 cv 40.3067 537.717 40.1807 537.976 39.9078 538.327 cv 38.1646 540.552 li 40.3067 540.552 li 40.3067 541 li 37.5557 541 li f 43.4214 537.374 mo 43.4214 536.829 43.1133 536.422 42.5606 536.422 cv 42.0074 536.422 41.6998 536.829 41.6998 537.374 cv 41.6998 539.642 li 41.6998 540.189 42.0074 540.594 42.5606 540.594 cv 43.1133 540.594 43.4214 540.189 43.4214 539.642 cv 43.4214 537.374 li cp 42.5606 541.042 mo 41.7837 541.042 41.1954 540.497 41.1954 539.67 cv 41.1954 537.346 li 41.1954 536.52 41.7837 535.974 42.5606 535.974 cv 43.3375 535.974 43.9253 536.52 43.9253 537.346 cv 43.9253 539.67 li 43.9253 540.497 43.3375 541.042 42.5606 541.042 cv f 47.0752 537.374 mo 47.0752 536.829 46.7676 536.422 46.2144 536.422 cv 45.6617 536.422 45.3536 536.829 45.3536 537.374 cv 45.3536 539.642 li 45.3536 540.189 45.6617 540.594 46.2144 540.594 cv 46.7676 540.594 47.0752 540.189 47.0752 539.642 cv 47.0752 537.374 li cp 46.2144 541.042 mo 45.4376 541.042 44.8497 540.497 44.8497 539.67 cv 44.8497 537.346 li 44.8497 536.52 45.4376 535.974 46.2144 535.974 cv 46.9913 535.974 47.5796 536.52 47.5796 537.346 cv 47.5796 539.67 li 47.5796 540.497 46.9913 541.042 46.2144 541.042 cv f 49.8472 541 mo 49.8472 536.577 li 48.9166 537.395 li 48.9166 536.822 li 49.8472 536.016 li 50.3511 536.016 li 50.3511 541 li 49.8472 541 li f 20.1192 549.5 mo 20.1192 547.225 li 17.753 547.225 li 17.753 549.5 li 17.2212 549.5 li 17.2212 544.516 li 17.753 544.516 li 17.753 546.75 li 20.1192 546.75 li 20.1192 544.516 li 20.6509 544.516 li 20.6509 549.5 li 20.1192 549.5 li f 23.521 545.28 mo 22.5831 547.912 li 24.4449 547.912 li 23.521 545.28 li cp 24.9981 549.5 mo 24.5992 548.374 li 22.4219 548.374 li 22.023 549.5 li 21.4561 549.5 li 23.2901 544.516 li 23.7378 544.516 li 25.565 549.5 li 24.9981 549.5 li f 27.4747 547.443 mo 27.4747 549.5 li 26.9429 549.5 li 26.9429 547.443 li 25.459 544.516 li 26.0328 544.516 li 27.209 546.904 li 28.3707 544.516 li 28.9449 544.516 li 27.4747 547.443 li f 31.1846 544.993 mo 31.1846 549.5 li 30.6529 549.5 li 30.6529 544.993 li 29.211 544.993 li 29.211 544.516 li 32.627 544.516 li 32.627 544.993 li 31.1846 544.993 li f 36.4556 549.5 mo 36.4556 547.225 li 34.0899 547.225 li 34.0899 549.5 li 33.5577 549.5 li 33.5577 544.516 li 34.0899 544.516 li 34.0899 546.75 li 36.4556 546.75 li 36.4556 544.516 li 36.9878 544.516 li 36.9878 549.5 li 36.4556 549.5 li f 38.4297 549.5 mo 38.4297 544.516 li 41.524 544.516 li 41.524 544.993 li 38.962 544.993 li 38.962 546.75 li 41.1456 546.75 li 41.1456 547.225 li 38.962 547.225 li 38.962 549.025 li 41.524 549.025 li 41.524 549.5 li 38.4297 549.5 li f 46.3677 549.5 mo 46.3677 545.713 li 45.0025 548.716 li 44.5479 548.716 li 43.1617 545.713 li 43.1617 549.5 li 42.6294 549.5 li 42.6294 544.516 li 43.1617 544.516 li 44.7857 548.051 li 46.3677 544.516 li 46.8995 544.516 li 46.8995 549.5 li 46.3677 549.5 li f 52.9825 549.5 mo 52.9825 547.225 li 50.6168 547.225 li 50.6168 549.5 li 50.0845 549.5 li 50.0845 544.516 li 50.6168 544.516 li 50.6168 546.75 li 52.9825 546.75 li 52.9825 544.516 li 53.5147 544.516 li 53.5147 549.5 li 52.9825 549.5 li f 56.3848 545.28 mo 55.4468 547.912 li 57.3086 547.912 li 56.3848 545.28 li cp 57.8614 549.5 mo 57.4624 548.374 li 55.2857 548.374 li 54.8868 549.5 li 54.3194 549.5 li 56.1534 544.516 li 56.6016 544.516 li 58.4288 549.5 li 57.8614 549.5 li f 61.8306 545.357 mo 61.5713 545.09 61.2354 544.993 60.8506 544.993 cv 59.7657 544.993 li 59.7657 549.025 li 60.8506 549.025 li 61.2354 549.025 61.5713 548.926 61.8306 548.661 cv 62.1734 548.303 62.1597 547.561 62.1597 546.953 cv 62.1597 546.343 62.1734 545.713 61.8306 545.357 cv cp 62.2017 549.039 mo 61.9004 549.339 61.4595 549.5 60.9415 549.5 cv 59.2334 549.5 li 59.2334 544.516 li 60.9415 544.516 li 61.4595 544.516 61.9004 544.677 62.2017 544.978 cv 62.7193 545.497 62.6915 546.259 62.6915 546.953 cv 62.6915 547.645 62.7193 548.52 62.2017 549.039 cv f 66.5416 545.357 mo 66.2823 545.09 65.9463 544.993 65.5616 544.993 cv 64.4766 544.993 li 64.4766 549.025 li 65.5616 549.025 li 65.9463 549.025 66.2823 548.926 66.5416 548.661 cv 66.8843 548.303 66.8707 547.561 66.8707 546.953 cv 66.8707 546.343 66.8843 545.713 66.5416 545.357 cv cp 66.9126 549.039 mo 66.6114 549.339 66.1705 549.5 65.6524 549.5 cv 63.9444 549.5 li 63.9444 544.516 li 65.6524 544.516 li 66.1705 544.516 66.6114 544.677 66.9126 544.978 cv 67.4302 545.497 67.4024 546.259 67.4024 546.953 cv 67.4024 547.645 67.4302 548.52 66.9126 549.039 cv f 70.0132 545.28 mo 69.0752 547.912 li 70.9371 547.912 li 70.0132 545.28 li cp 71.4903 549.5 mo 71.0914 548.374 li 68.9141 548.374 li 68.5152 549.5 li 67.9483 549.5 li 69.7823 544.516 li 70.2305 544.516 li 72.0572 549.5 li 71.4903 549.5 li f 75.459 545.357 mo 75.2002 545.09 74.8643 544.993 74.4791 544.993 cv 73.3941 544.993 li 73.3941 549.025 li 74.4791 549.025 li 74.8643 549.025 75.2002 548.926 75.459 548.661 cv 75.8023 548.303 75.7881 547.561 75.7881 546.953 cv 75.7881 546.343 75.8023 545.713 75.459 545.357 cv cp 75.8301 549.039 mo 75.5294 549.339 75.0884 549.5 74.5704 549.5 cv 72.8624 549.5 li 72.8624 544.516 li 74.5704 544.516 li 75.0884 544.516 75.5294 544.677 75.8301 544.978 cv 76.3482 545.497 76.3204 546.259 76.3204 546.953 cv 76.3204 547.645 76.3482 548.52 75.8301 549.039 cv f 17.1299 558 mo 17.1299 554.556 li 17.6338 554.556 li 17.6338 558 li 17.1299 558 li cp 17.1021 553.577 mo 17.1021 553.009 li 17.669 553.009 li 17.669 553.577 li 17.1021 553.577 li f 20.084 554.962 mo 19.335 554.962 19.2232 555.607 19.2232 556.25 cv 19.2232 556.894 19.335 557.539 20.084 557.539 cv 20.8331 557.539 20.938 556.894 20.938 556.25 cv 20.938 555.607 20.8331 554.962 20.084 554.962 cv cp 20.0069 559.582 mo 19.4888 559.582 19.2022 559.45 18.8379 559.121 cv 19.167 558.798 li 19.419 559.023 19.5938 559.141 19.9927 559.141 cv 20.6578 559.141 20.938 558.672 20.938 558.084 cv 20.938 557.545 li 20.6578 557.903 20.3428 557.994 19.9722 557.994 cv 19.6221 557.994 19.3208 557.868 19.1392 557.685 cv 18.7959 557.342 18.7188 556.81 18.7188 556.25 cv 18.7188 555.691 18.7959 555.159 19.1392 554.816 cv 19.3208 554.633 19.629 554.514 19.9791 554.514 cv 20.357 554.514 20.6651 554.598 20.9449 554.962 cv 20.9449 554.556 li 21.4419 554.556 li 21.4419 558.106 li 21.4419 558.96 20.9097 559.582 20.0069 559.582 cv f 24.9068 558 mo 24.9068 555.879 li 24.9068 555.27 24.5782 554.962 24.0601 554.962 cv 23.542 554.962 23.2061 555.278 23.2061 555.879 cv 23.2061 558 li 22.7022 558 li 22.7022 554.556 li 23.2061 554.556 li 23.2061 554.934 li 23.4507 554.655 23.7872 554.514 24.1719 554.514 cv 24.543 554.514 24.8438 554.626 25.0538 554.836 cv 25.2989 555.075 25.4112 555.397 25.4112 555.795 cv 25.4112 558 li 24.9068 558 li f 26.6358 558 mo 26.6358 554.556 li 27.1402 554.556 li 27.1402 558 li 26.6358 558 li cp 26.608 553.577 mo 26.608 553.009 li 27.1749 553.009 li 27.1749 553.577 li 26.608 553.577 li f 29.3731 558 mo 28.7847 558 28.4908 557.587 28.4908 557.077 cv 28.4908 554.962 li 28.0567 554.962 li 28.0567 554.578 li 28.4908 554.578 li 28.4908 553.5 li 28.9947 553.5 li 28.9947 554.578 li 29.73 554.578 li 29.73 554.962 li 28.9947 554.962 li 28.9947 557.062 li 28.9947 557.377 29.1416 557.567 29.4639 557.567 cv 29.73 557.567 li 29.73 558 li 29.3731 558 li f 32.7042 555.46 mo 32.5713 555.144 32.2632 554.942 31.8995 554.942 cv 31.5352 554.942 31.2276 555.144 31.0943 555.46 cv 31.0171 555.649 31.0035 555.753 30.9893 556.034 cv 32.8091 556.034 li 32.7955 555.753 32.7813 555.649 32.7042 555.46 cv cp 30.9893 556.412 mo 30.9893 557.168 31.3462 557.601 32.0044 557.601 cv 32.4034 557.601 32.6343 557.483 32.9073 557.21 cv 33.2505 557.51 li 32.9004 557.861 32.5782 558.042 31.9903 558.042 cv 31.0806 558.042 30.4854 557.497 30.4854 556.279 cv 30.4854 555.166 31.0245 554.514 31.8995 554.514 cv 32.7886 554.514 33.3135 555.159 33.3135 556.18 cv 33.3135 556.412 li 30.9893 556.412 li f 36.2393 555.214 mo 36.0782 555.053 35.8545 554.962 35.6094 554.962 cv 35.3643 554.962 35.1475 555.053 34.9864 555.214 cv 34.7344 555.466 34.7066 555.893 34.7066 556.279 cv 34.7066 556.664 34.7344 557.09 34.9864 557.342 cv 35.1475 557.503 35.3643 557.594 35.6094 557.594 cv 35.8545 557.594 36.0782 557.503 36.2393 557.342 cv 36.4913 557.09 36.5123 556.664 36.5123 556.279 cv 36.5123 555.893 36.4913 555.466 36.2393 555.214 cv cp 36.5962 557.651 mo 36.3584 557.888 36.0293 558.042 35.6094 558.042 cv 35.1895 558.042 34.8604 557.888 34.6226 557.651 cv 34.2725 557.294 34.2022 556.81 34.2022 556.279 cv 34.2022 555.747 34.2725 555.263 34.6226 554.907 cv 34.8604 554.668 35.1895 554.514 35.6094 554.514 cv 36.0293 554.514 36.3584 554.668 36.5962 554.907 cv 36.9463 555.263 37.0162 555.747 37.0162 556.279 cv 37.0162 556.81 36.9463 557.294 36.5962 557.651 cv f 40.2994 558 mo 40.2994 555.879 li 40.2994 555.27 39.9703 554.962 39.4522 554.962 cv 38.9341 554.962 38.5982 555.278 38.5982 555.879 cv 38.5982 558 li 38.0943 558 li 38.0943 554.556 li 38.5982 554.556 li 38.5982 554.934 li 38.8433 554.655 39.1792 554.514 39.5645 554.514 cv 39.9351 554.514 40.2364 554.626 40.4463 554.836 cv 40.6915 555.075 40.8033 555.397 40.8033 555.795 cv 40.8033 558 li 40.2994 558 li f 42.8892 558 mo 42.2872 558 42.0142 557.609 42.0142 557.084 cv 42.0142 553.016 li 42.5181 553.016 li 42.5181 557.062 li 42.5181 557.399 42.6304 557.567 42.9805 557.567 cv 43.2535 557.567 li 43.2535 558 li 42.8892 558 li f 44.6114 558 mo 44.6114 554.556 li 44.1075 554.556 li 44.1075 558 li 44.6114 558 li cp 44.6465 553.577 mo 44.6465 553.009 li 44.0792 553.009 li 44.0792 553.577 li 44.6465 553.577 li f 48.0831 558 mo 48.0831 555.879 li 48.0831 555.27 47.7544 554.962 47.2364 554.962 cv 46.7183 554.962 46.3824 555.278 46.3824 555.879 cv 46.3824 558 li 45.8785 558 li 45.8785 554.556 li 46.3824 554.556 li 46.3824 554.934 li 46.6275 554.655 46.9634 554.514 47.3482 554.514 cv 47.7193 554.514 48.0201 554.626 48.23 554.836 cv 48.4751 555.075 48.5875 555.397 48.5875 555.795 cv 48.5875 558 li 48.0831 558 li f 51.8423 555.46 mo 51.709 555.144 51.4014 554.942 51.0372 554.942 cv 50.6734 554.942 50.3653 555.144 50.232 555.46 cv 50.1553 555.649 50.1412 555.753 50.127 556.034 cv 51.9473 556.034 li 51.9332 555.753 51.919 555.649 51.8423 555.46 cv cp 50.127 556.412 mo 50.127 557.168 50.4844 557.601 51.1421 557.601 cv 51.5411 557.601 51.772 557.483 52.0455 557.21 cv 52.3882 557.51 li 52.0381 557.861 51.7164 558.042 51.1285 558.042 cv 50.2183 558.042 49.6231 557.497 49.6231 556.279 cv 49.6231 555.166 50.1622 554.514 51.0372 554.514 cv 51.9263 554.514 52.4512 555.159 52.4512 556.18 cv 52.4512 556.412 li 50.127 556.412 li f 54.1661 558 mo 54.1661 557.342 li 53.5084 557.342 li 53.5084 558 li 54.1661 558 li f 56.7491 558.042 mo 55.8809 558.042 55.2232 557.455 55.2232 556.279 cv 55.2232 555.102 55.8809 554.514 56.7491 554.514 cv 57.2252 554.514 57.5259 554.64 57.8834 555.026 cv 57.5401 555.347 li 57.2813 555.06 57.0782 554.962 56.7491 554.962 cv 56.4131 554.962 56.1334 555.095 55.9512 555.354 cv 55.7901 555.579 55.7271 555.844 55.7271 556.279 cv 55.7271 556.712 55.7901 556.978 55.9512 557.203 cv 56.1334 557.461 56.4131 557.594 56.7491 557.594 cv 57.0782 557.594 57.2813 557.49 57.5401 557.203 cv 57.8834 557.532 li 57.5259 557.916 57.2252 558.042 56.7491 558.042 cv f 60.5914 555.214 mo 60.4302 555.053 60.2061 554.962 59.961 554.962 cv 59.7164 554.962 59.4991 555.053 59.3379 555.214 cv 59.086 555.466 59.0582 555.893 59.0582 556.279 cv 59.0582 556.664 59.086 557.09 59.3379 557.342 cv 59.4991 557.503 59.7164 557.594 59.961 557.594 cv 60.2061 557.594 60.4302 557.503 60.5914 557.342 cv 60.8433 557.09 60.8643 556.664 60.8643 556.279 cv 60.8643 555.893 60.8433 555.466 60.5914 555.214 cv cp 60.9483 557.651 mo 60.71 557.888 60.3809 558.042 59.961 558.042 cv 59.5411 558.042 59.212 557.888 58.9742 557.651 cv 58.6241 557.294 58.5542 556.81 58.5542 556.279 cv 58.5542 555.747 58.6241 555.263 58.9742 554.907 cv 59.212 554.668 59.5411 554.514 59.961 554.514 cv 60.3809 554.514 60.71 554.668 60.9483 554.907 cv 61.2979 555.263 61.3682 555.747 61.3682 556.279 cv 61.3682 556.81 61.2979 557.294 60.9483 557.651 cv f 66.8702 558 mo 66.8702 555.879 li 66.8702 555.27 66.5411 554.962 66.023 554.962 cv 65.5191 554.962 65.1622 555.278 65.1622 555.824 cv 65.1622 558 li 64.6582 558 li 64.6582 555.879 li 64.6582 555.27 64.3292 554.962 63.8111 554.962 cv 63.293 554.962 62.9502 555.278 62.9502 555.879 cv 62.9502 558 li 62.4463 558 li 62.4463 554.556 li 62.9502 554.556 li 62.9502 554.934 li 63.1949 554.655 63.5381 554.514 63.9229 554.514 cv 64.399 554.514 64.7701 554.71 64.98 555.088 cv 65.2461 554.71 65.6309 554.514 66.1143 554.514 cv 66.4849 554.514 66.793 554.633 67.003 554.836 cv 67.2481 555.075 67.3741 555.397 67.3741 555.795 cv 67.3741 558 li 66.8702 558 li f 155.499 137.735 mo 155.499 139.944 154.763 141.838 153.078 143.524 cv 151.499 145.105 149.603 145.84 147.289 145.947 cv 127.871 145.947 li 125.871 145.947 124.186 145.314 122.607 144.05 cv 121.132 145.314 119.344 145.947 117.239 145.947 cv 99.3848 145.947 li 97.1768 145.947 95.2794 145.21 93.5958 143.524 cv 92.0186 141.942 91.2803 140.051 91.1749 137.735 cv 91.1749 125.63 li 97.0694 125.63 li 97.0694 137.312 li 97.0694 138.367 97.3853 139.208 98.2276 140.051 cv 98.9659 140.681 99.8067 140.996 100.964 141.103 cv 115.766 141.103 li 116.817 141.103 117.66 140.787 118.396 140.051 cv 119.133 139.31 119.449 138.472 119.553 137.312 cv 119.553 125.63 li 125.555 125.63 li 125.555 137.312 li 125.555 138.367 125.871 139.208 126.607 140.051 cv 127.344 140.681 128.184 140.996 129.342 141.103 cv 145.815 141.103 li 146.867 141.103 147.71 140.787 148.446 140.051 cv 149.183 139.31 149.499 138.472 149.603 137.312 cv 149.603 125.63 li 155.499 125.63 li 155.499 137.735 li 0.196079 0.219608 0.505883 0.0470589 cmyk f 209.129 145.947 mo 168.13 145.947 li 165.919 145.947 164.026 145.21 162.34 143.524 cv 160.762 141.942 160.024 140.051 159.92 137.735 cv 159.92 133.947 li 159.92 131.735 160.656 129.837 162.34 128.155 cv 163.919 126.578 165.813 125.838 168.13 125.735 cv 209.129 125.735 li 209.129 130.575 li 203.443 138.367 li 197.549 138.367 li 203.127 130.575 li 169.708 130.575 li 168.656 130.575 167.814 130.894 166.972 131.735 cv 166.233 132.366 165.919 133.208 165.813 134.365 cv 165.813 137.312 li 165.813 138.367 166.131 139.208 166.972 140.051 cv 167.708 140.681 168.551 140.996 169.708 141.103 cv 209.129 141.103 li 209.129 145.947 li f 257.802 137.312 mo 257.802 134.365 li 257.802 133.313 257.488 132.47 256.645 131.735 cv 256.013 130.996 255.171 130.68 254.012 130.575 cv 220.383 130.575 li 220.383 141.103 li 254.012 141.103 li 255.066 141.103 255.909 140.787 256.645 140.051 cv 257.381 139.31 257.697 138.472 257.802 137.312 cv cp 263.697 137.735 mo 263.697 139.944 262.961 141.838 261.276 143.524 cv 259.803 145.105 257.906 145.84 255.486 145.947 cv 214.488 145.947 li 214.488 119 li 220.383 119 li 220.383 125.735 li 255.486 125.735 li 257.802 125.735 259.699 126.473 261.276 128.155 cv 262.854 129.733 263.593 131.627 263.697 133.947 cv 263.697 137.735 li f 333.903 137.735 mo 333.903 139.944 333.166 141.838 331.481 143.524 cv 329.903 145.105 328.009 145.84 325.691 145.947 cv 306.271 145.947 li 304.273 145.947 302.588 145.314 301.01 144.05 cv 299.535 145.314 297.747 145.947 295.641 145.947 cv 276.222 145.947 li 274.012 145.947 272.117 145.21 270.433 143.524 cv 268.854 141.942 268.116 140.051 268.012 137.735 cv 268.012 125.63 li 273.906 125.63 li 273.906 137.312 li 273.906 138.367 274.224 139.208 275.064 140.051 cv 275.8 140.681 276.643 140.996 277.802 141.103 cv 294.168 141.103 li 295.219 141.103 296.062 140.787 296.798 140.051 cv 297.535 139.31 297.85 138.472 297.956 137.312 cv 297.956 125.63 li 303.957 125.63 li 303.957 137.312 li 303.957 138.367 304.273 139.208 305.007 140.051 cv 305.747 140.681 306.587 140.996 307.745 141.103 cv 324.218 141.103 li 325.27 141.103 326.112 140.787 326.851 140.051 cv 327.586 139.31 327.901 138.472 328.009 137.312 cv 328.009 125.63 li 333.903 125.63 li 333.903 137.735 li 0.960785 0.94902 0.29804 0.184314 cmyk f 381.525 137.255 mo 381.525 134.203 li 381.525 133.15 381.207 132.308 380.365 131.572 cv 379.629 130.834 378.785 130.52 377.63 130.412 cv 348.21 130.412 li 347.156 130.412 346.315 130.73 345.474 131.572 cv 344.734 132.203 344.422 133.045 344.315 134.203 cv 344.315 137.255 li 344.315 138.308 344.631 139.15 345.474 139.993 cv 346.211 140.625 347.054 140.941 348.21 141.045 cv 377.63 141.045 li 378.683 141.045 379.526 140.728 380.365 139.993 cv 381.103 139.255 381.418 138.411 381.525 137.255 cv cp 387.418 137.674 mo 387.418 139.889 386.681 141.783 384.995 143.465 cv 383.42 145.045 381.525 145.782 379.208 145.886 cv 346.63 145.886 li 344.422 145.886 342.526 145.147 340.842 143.465 cv 339.263 141.887 338.524 139.993 338.42 137.674 cv 338.42 133.78 li 338.42 131.572 339.157 129.678 340.842 127.992 cv 342.42 126.412 344.315 125.676 346.63 125.569 cv 379.208 125.569 li 381.418 125.569 383.315 126.307 384.995 127.992 cv 386.576 129.57 387.312 131.468 387.418 133.78 cv 387.418 137.674 li f 431.601 130.472 mo 401.424 130.472 li 400.371 130.472 399.529 130.785 398.688 131.627 cv 397.949 132.26 397.633 133.104 397.528 134.26 cv 397.528 145.947 li 391.634 145.947 li 391.634 133.842 li 391.634 131.627 392.371 129.733 394.056 128.047 cv 395.634 126.473 397.528 125.735 399.846 125.63 cv 431.601 125.63 li 431.601 130.472 li f 479.367 129.21 mo 479.367 131.522 478.526 133.418 476.843 135.103 cv 478.526 136.68 479.367 138.683 479.367 141.103 cv 479.367 145.947 li 473.37 145.947 li 473.37 141.525 li 473.37 140.473 473.055 139.631 472.211 138.892 cv 471.581 138.154 470.739 137.84 469.579 137.735 cv 442.181 137.735 li 442.181 145.947 li 436.286 145.947 li 436.286 119 li 442.181 119 li 442.181 132.575 li 469.579 132.575 li 470.633 132.575 471.477 132.26 472.211 131.522 cv 472.947 130.785 473.263 129.942 473.37 128.786 cv 473.37 125.735 li 479.367 125.735 li 479.367 129.21 li f 484.438 142.514 mo 484.005 142.514 li 484.005 143.327 li 484.438 143.327 li 484.695 143.327 484.877 143.157 484.877 142.924 cv 484.877 142.689 484.695 142.514 484.438 142.514 cv cp 484.889 144.549 mo 484.356 143.602 li 484.005 143.602 li 484.005 144.549 li 483.684 144.549 li 483.684 142.228 li 484.473 142.228 li 484.877 142.228 485.204 142.532 485.204 142.924 cv 485.204 143.263 484.993 143.474 484.707 143.561 cv 485.263 144.549 li 484.889 144.549 li cp 484.374 141.584 mo 483.391 141.584 482.596 142.397 482.596 143.391 cv 482.596 144.386 483.391 145.199 484.374 145.199 cv 485.356 145.199 486.158 144.386 486.158 143.391 cv 486.158 142.397 485.356 141.584 484.374 141.584 cv cp 484.374 145.509 mo 483.204 145.509 482.256 144.562 482.256 143.391 cv 482.256 142.222 483.204 141.274 484.374 141.274 cv 485.543 141.274 486.49 142.222 486.49 143.391 cv 486.49 144.562 485.543 145.509 484.374 145.509 cv f 499.045 141.886 mo 505.853 141.886 511.491 141.886 522.601 141.886 cv 533.618 141.886 538.455 141.886 537.112 141.797 cv 537.112 145.918 li 494.178 145.918 li 494.178 136.87 li 494.178 134.899 494.805 133.287 496.238 131.942 cv 497.582 130.599 499.193 129.972 501.165 129.882 cv 529.049 129.882 li 529.945 129.882 530.662 129.613 531.289 128.987 cv 531.916 128.36 532.185 127.643 532.275 126.657 cv 532.275 126.12 li 532.275 125.313 532.007 124.597 531.289 123.88 cv 530.752 123.253 530.035 122.984 529.049 122.895 cv 494.983 122.895 li 494.983 118.774 li 530.304 118.774 li 532.185 118.774 533.798 119.401 535.23 120.834 cv 536.574 122.178 537.202 123.791 537.291 125.762 cv 537.291 127.105 li 537.291 128.987 536.664 130.599 535.23 132.033 cv 533.887 133.287 532.275 133.914 530.304 134.003 cv 502.51 134.003 li 501.613 134.003 500.896 134.272 500.18 134.988 cv 499.553 135.526 499.284 136.243 499.193 137.228 cv 499.193 141.797 li f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 11.0.0 %%For: (H) (D) %%Title: (webworka [Converted].eps) %%CreationDate: 3/30/04 9:29 PM %AI9_DataStream %Gb"-6CQg$SN?J!(r'/,d2O!R+F5?Y8h:S+6F&mKF;O^k$RC0<-[Sh7U\otE[g?R'hmB8`:8^Q9<1[C`sjt+t3/&Ms@3XLB<#Qipc %?QJ!NGl@Taf7,ioq-UnjI@YT2R!398]2ZZ:eQ;eDjmQNgl\hR..A_j^DBb3GC4K+k3]cf %m>c[Ap3QHdci+()4PThD(O((Ark(>J4a[/mbp2+pq!"]gQS6(.(V]_7(7tNUmO+sph2D$>rV(70pu8ot(I,[EF5QA7%55J9]+LY5 %58QcF4b*@g`Tq_GAmCYtkC<g&#'f+dhH$s5>!**Dhcg)>rgPcgO&Fs5Ft_pl"U?C[^bNr#L4bp;Qq':d:V"K!uj%jhLaY %G49sg)sNf7^\IQ\^%g&LlLW1XYQ+JQTeIUFhtcYtT:RbWC4hDJ3+D@KieM.gmbW"pG-)I+I/hA1FnW:/+lFA(PitP\NV0]$PmYn( %lO!U!@a"3Xl?7UmkV_7FF2D!O %Z./<":EGSlc1-U$/f4HZE_-S0^0L1)bCuSI(3=i54o@eK(8'+F]cXu*s03:3$3/%DfI-&8Itp2(s03"+#lhqo.jk$olkBAZGM"/< %+)>=JER!,\r#bfqIh@Qd_KRanq>FD&qh>&[REGbB3^22:`\CtcZ%W/KPMC4s4h%!:`c&n`lPO=BrkVLb5PuU=iXt6Xo63<+p_QS3 %s)`o3/,Usl&-'[3llD-Orm*/d#l]m]Y^cF4O!7L/j-AM_Dc@XjQ7MptQuW!?lWB&7VKh'kF6g*mgb+%/f<"#O-1hGc@.0=8Z$5t" %pR8k9ro*lZMWl)Wa#N$jnUE*B]c4[`b1=,@R,^+ZFXmnOXXLScbF)7q(3EmHQnmO/Fc:Hl0B3LGXs9Zhj0iGHI66'+ch$o/__(&> %ajeOEcFDgO0(d'RgL`N31OQ%*[EU8A;knc/;6q.Hcnbg1:qn:)K\^=PIG$iP/*(ujYAiGN#r %j`7pm"3uFAUQh:CZk4@[k_C4O;*i\-U(4Id"^bO&G-huFXpblG2d0neoQ5Qrnfa2PeM]QVVnqIIB-VWW#oWDHgD=dq,8iRt. %Sgi&WO8\4HdITH)V?F8ZT=*2Z0)@EbpW!YJq+U6H$Ce7'qnf2g\VXKE[aoE"fOfLeQ:,Hgl!F'D+81QJ5ck8(PhojILnt5nkarN% %7d.R>,PE(KhiIY3hEZ"_c_'uXgCEQ`ir\*IjV$S3GhM9?,s&s\IL#lhre0Y>/=]UG\j;kFs2.pjL4%_$9_F3QK_(]'F#ZI6'D7XI %9RiaiiAaTbEZ)iPDrYI:6P4<3mf5IXM1^cO*bY?2EcT*LQqkXaIY)Qln][DNp[dK'anm(Keif(Ore5f^qeRGP=5/?bd,1SerQLL_ %PZg_Fp+'uUo^%8dLpR=F"FS:H6YiX^,NJ"/T-?QR162&e*VW&@Q3O+MVgUlM;JJPRa]p6Sg5)-7?c8REPtE3r[Vt_>lA5:Ih^b?_ %U>]h9q9:lf8enF8Ri7"orD'JLiuTWG8EDU8c!UrPAt#'Oc?2;qVNd7O4O>!DZHPUJ-fZ1"X9F+.>fFE\36Z=)Vo.4YAO@7-7u$X! %@=p5R)PM?g):5+7HZtpKi3JBTN]Hb/Lm/8kN/m#sUhY=D4HSfsB\N,h@!b:,O8V+?5p/a,]:C.-i:C:W62qN.b_/-T4"q[&l%8&PMXFnSo= %jStY0#0mjukDYX"FmM2(F(lVhddi"J[le4Hmj==[e`F;F"h4Hb<('@0aS %kY+m%O+4.:=_:g&ha15(IeRMk6+M9\cV-d/M:(*=[FVYE-7YPMU0iMVh,lJJtYn),Te,5)NAq/N8D))$,cE9&MScR=(!Zd=7i'1,9FdO,mjWZRll,je(4:%W:2N\%QAV`,C]>fZ\4j*85P0 %In@AuUkLdmr[_JX=2>U^Xqjjb[_KE!+[&86Z:?s"Utan!A_B@db:JSA3M-8Te3*>+7V+`k*-D`Dc*O"rK(::$X]a`mF'X.p@E;YV %Ig@ujQ)kh>;Q*CNRsEOPXZe5[M&rqJN\u+04D?\3RZ:PeIn=R`&72"#;oIqo_C%at?N(+C\akaUH^2LI*,@<[nY:>DIo/Zgs3bY" %iu=H5iqUZ5A0jZV%-YDj8D:4;;t#NEPRGc-^SgR+_S[(E+""@[4Op5(d$)0*Q&Rds"f(nYro\R0l:$A!b24N-r)ea %R#h._lOmq[8n#E0cC&PkiVuTJfFD_K;BJIcl8PkTU#43UVA-u!MDj$^V$Y0maV?HX9Drf+(J!hc;EtKM%;NGX`^Ondf6E>Fi3nFjc3+*YJLoB,J-]=rfC`O4WjDr9:r6sD55Q1BJq,[/-hq.U-HhQ;4?LFDuIF7>Qg\U[$ %-bk()W8)-!s&H1Kj,*Zjn<[4+Huo&Qh5aS]J[E`6;$7Mo5J2:=ap]jfc`_hIEVJTCK>n7DpA4[B %^HR#Ae$WqqF[*NdrB4QMgCGsp^M!`Jk1*8kI^/eDa(IU[GZBo>#g=>O5JI-nSr#8l%^4./l4WWfh(Qhsiu`IEqBJtPq]13Z_9d!b %Blj7BrUB9n8Cp'9j2_*l="hVGTHE7cjpKoZc'@A4EYZ/t]E\.L0@tcX,?uV-c>[(YU*dr6#@&=Q0L`Ja>T'\"c#E(/3XjJG3_h'4 %cI7IcM=r)'#U2nQab\>'-H`a,8-',9q"J-(j\p;P@,mgoE]:]j,4k(Ao0Pc=Ej9.k9GPZ,+X?i1o,%*R,[Hj7giI=tV9*gZ)X_fQ0>I$bGKr&hQ#"BB/# %!4(&;!9adQE]sQAr$>Y2$^:Y-#NC()-QiSSJnL7$LW^aQ/=-d!,033&EL5oFShK9uq/efl&*Nn:L5PO^SKh+ucgEod7hE/me*1s: %*FL1@[ %!X&g%.hLkbL_Q,s"CrI%HlWbRkfuHE-Qqm\d/"/mT4%qS((2q8_ %]>IiP*BGi<[u5J5hgIS6p"ebSLNc,S`^XpG[=;ra/Ne5:7D;(5V`Lsi9!>-auXCgCa/eSmsj %[M)]l?*B@(*DCV!l^E-A[5+m=5&d>g[*;S'])7pG4^@riCpFou]sc:-%6\^`I.q8Y_`_?j((jhVLIZJX0E:N!X8p>C.i)*@SjdR0 %SbXhJZ>.L41h>0t8N/!8R+5YDM?hRdRm'O"E2O6@)Y(OU`=&LZeRD@4#@MKUeVd!TSq$tK@"sLjerTR"+eO:%U6[p(T'V$'U9:"X %>FpDt*n"a&epAQ\RXc9&@*4URk6u/F(d0S>"6n0GS%AYi-8MNF@."VoHid>UJEN]dk5Z.Q<)*N$K+"bBE5CHt6i]FU@?IcH&03Ro %#ou9uJ1Lf-EhS3/"G-h=#""*S#C,QJ%g!&*g&SDb6mHC-\9aQ.BE'l5:ShEBH5*`OLdqJl$.6OcB9%3V]788Pp=iul)MU'kLW!Js"4pMq;1Q#!sgBIe_8/#99uop(6NZHua#X[VlJ5nk-9\q'>q %\r4sBN;h6^R&7d"('CU4iomlm4p4P[lP:-@O5H#T.8:?)*+LB"KXomod1miBi %9k1/]`"ga&?%Ql2K324?%hcUV@fJDem=fi"jnER5;9MM:M58;aBArX0o82cD$YtR+LTgnhRu!=3/.'reK!Kp'6(oIV%jV\r1m04% %$R?Qc1e]acScj_(#dg/,jlB+@!Gs0"0fbF;n3](!S;?>Qa%(#3)dA.DmZ*fc:HTZN\Ka"m/=bBPZYm8H"7^6jfuU@J=][N+%([!c %-Do!;,3D1B\;M^Ej+tn:`O):#;1D?sFmQ;?`DY$:TdgRQY)0?:GmXriq?e$X$=J.*+X@T:rK=O.UP5cB/R,_u-+EBJ\FuED]Xl8N %aofa%]a2!VP$Wh6%7,(i9g$LdnM(_f^sZ*&!CKAV2ZliCWT[`-U;T0e&4K_?J6=#D5/@5o%*fu^"0ddnb"L[M,0A%Q0LbnS=7!##A_SNIm"0o[/r(hUq7*G_C*mVjHmi&AS %/k:PSXDL2;Hq/X?Hji"PF"Ubj(#g<08,jrP*561UIDF";=;VHh7F2IUpKDb%D7s6,E3Z*8>t'$Ul>*flVQ.Q%l$nU;Q3SYnkr_oo %cu]48gg<(Vo)+]UqRp>-`@dg<"fM*,e[WK]PJQ@!?uY?ZrF&l:dehVP#-IV@=rVC`O3?gggE>n;Dd8(JF^/4MFq&&\p"*c#D/AsJ %J)!:f_d7e7"hbW7N8CGNj@\o'*o`R)bM:c3u6mqDFho3Z]aNf01(1]!#E0722T%S^jRX[P)_eQ*#sDdLub](R]@g.?I9G]er1 %dPB2/G.G9I"g4$mXtF^P/9,Z6kX:$l65gBk0T'"-P@h)c2_JaG[[\C# %%FaT[7S?ZC9GOU--%qNqYqoV)"X`!Naau/=F1.\3$Bbh\@Q%lTM+m%6WD1WHhV68De_J@EYNZ'8ZfIUV(9k"ZY?-"0[G/+crE7ai %(#Jt3=^H_=]jGi@[?];/6f,Gp*A3k %?K?mQb\%m]OdGoTIUq %IfV<;,"FgZ!D>OPeOq-7]=^75eCHEt#,a'%P-lU8WT]e=MCOin88W.kmr75fU7%fJO;7N#)T8`=WS7CjM[2/q2-P/hR>)\LdLfb(Z&4-t^ %!XQc+'.5jQ4Y1iHfP*Zb-4BC4KT32/@h^Y,4U1/fZ@sS4acunF$4<%l!X6QbKg\KTB=oED"=4>s&"UmEG49#VfeEbD>ImkQ-`_So %EVR.UScA3pr`*UHIu4T*b_T&D>Kq*0-k=FkVp0(LV8U#:g(&:qL/\7T&+&CZQb.DMf=qrQGhl/hECLP`D9]Jr?I]@T;d`u"-#,"< %[B3A+FbYTje^UXC*C[AFB8`Uu7:ket-l=jcbiYpIV59Z59[%RUhZsb,]3/sC#DcdD/&EgBkp %B5X99CIZ4Srs+Thc=0`_5=mX`#7ro4mn %;h\Sk_WI&i^,F2P)q;7Rml#9rZY?\4e@PnY4%.9*+`W8V7*3sE\@>9Qf/)aHg%X2(Z2gn@g%n94b_m!S[agf&9RDX0u5g07S_dFZ;)LH/AiN]JX]#5)L:Mf2#,K.%sg_la8RSR_DMiDHp %ho%75+(02sL'BGMg@49P9O[K2S7&sQifZ.Jm(SoUD6beM[p&6F>-f3]IlMjCs]d'HFsmY %5"NWhW#-+fb+]jtk7=pb>]*IYMK_>!E-L@YlkL9".H.kKF_@n@\Ohqb\/0,l4rKHj)Drn&BP!<%2Dir0"Bk0EhNt"UXYsp*Rs(_l[BTp9>bq4.kdR^]>Ag5'$A1)uGPV*#4q\%sUZPGmeo8unf? %A?O>X%i6s]VMQ174]K1JUmX2>G)8mq37r'(l`[>)8uBHkFIk/ZoCqKu+MMKgelVgumNp)"0;55k=K75dQ147KZX:A^((=_JRauX" %f@t>j;RnP\*]6C)H"!\Z[S#._FbnR_a`^=#"CpaDgFr:'/MoFeb>IEGR?KObQe3_.)^[S7e;JH*83/4qk.m;.m)hTh]k5CQYa5bu %SDiET':,3009Y^2PakaDomnl"&ag\b,X4af%Zg8jH`W/G*[;pp7RdlK&X"6BEDtZr)`\pS$BM$ii1otBcdSC,^t`S+%*iQu/l"Kd$(odO!U\REq6hpjT#!;hBF %NP%6+qJ3Fsd-n3,(2&a5#N\cnHVD*Klg(`Z"4=OU[O\LE`HnA,ja&B-/-ATVrB8Zfj+;nA*_K@%J'#d,]TdjM4n2ZeRB'#)qi`s! %F941&h.#@p>5Nlf1ll0a\l@7\kl>.HhWH514g1e4Q_IYA[?;9I4IE3oeu*FJS>=I8Z1^H!]F15)=149S2QoL6DqNM,M50%VGoN4I %k`odf*uM?V5-03k9>A@ra2MmC_GBjiqq.O]\-[UrR*"5SLr=]\a:F("59dB(6QU=#1.fO_qm^G#!Om7Ig1J`D`GJ]P`qmng/VdHa %idTUOH.nckmF.V[s"uFc!WlT;e`neioCTE&$oR4uE43;,=qITDX0BF()EM#9]O[g;TjGeG=81`?ZudW(l:?30pHheLQUV=^>lcliE7$+Ik$P$/dWa["A2dS%%Pdun0dZ';cElgtiq@$b3,9,H6AG(@!`2Ct9i[KC@7bPCt: %S3ubgBbSC5RNq!727_t[,Nh;b)6I_b`l\?b<@4c1Xn%qi&*-YqAh@>Y.9enrl'>'>>\>52X"'pHU-,Z`pc-6'>GLs]/Z4*pUQd13 %WdVJ3@=*Pc>VS/0*?HI/cJ.s8,b&B)"ilOOX:DDFkZ8hV4"N@7=0VMrX1n]e %s4?ZGLhGBNdt6-nY/EX"#+COYt'k+5V^>'fdI!LPgE'%HI8-Ck!5NE3K/`R %iYb,ig66cAe_7%sf&#D$'#^0%G%)k8#=bdMNn.I1J'6nldoD=H6=Cteeqab;`&d;]1;S7&eGO&2F47oWEVYlIjd`5rA[:^J[_:o` %0>;.eb,-k7ib:!;1mN#A6fqdb5;s&i(rh#9ACj<&S`r>a"SPoYrnIYRN]i'KM4 %lK;28mr`a#dK`Xum7pL,e=3Vt2@5kmhK8JD(tR(&$ruEFR@U%JhVBL91.a/kRib%l>aQV!L-o`;m#;R`!Z5GS?u6JpJYgAFfF3V]PdkZ.rpZRbo%[sS%qT+GSO.+k:e%C"DmV.U %s#@*g9[p)HRI4&\3Y3%PFdo6?V]R>)XjZ;lrG5]%g(e>)P.n7nYR.(#U9QXkch^UekSJrCR=*S\Ub^[scgQZ::Qj4$]\$Fl1IHIV %G(WB4T>dQG':^5:m;%;0ok6QkO*2ct:Bqo2CJK>S*]FYh+OTO7][t\S`HEcVMN3_oTC+DD^$e0jOTM0A#r6nPVSCC#LdA4ui\K2d %n&Dc>bV%Q@^-Wf9$:r%;2uj^)ZNu[##;$kc%EsT8,"s*WaJ2'sA%YB3H$n8DPioXR4:YbWGS%n8-J'GS5q(7Hf6!4,Kp[(3giFIR %$cV$sBMT#a:#q!7h07smKJ>6Bk$jECOJ[de^Tl$)NX;F>@e %fh<0dFnkN>@Ld4mH5BtW;rdl$)@pYU54m2H[S_g>2a-5cG\up%Za],*9I]_FA:%8-09^H>e>DQ$eK9L_X..@ubB*=)PRf:sh^:[q=Hd[s"/Vg,>iS`]V'C,J!#@.rtdVjdmpciI256.#f>F$^\2$*,gheUb.Y,`P(UHVTNC %*(1rr_,+,6<=Vtk:^)DM"B?(:9i+9p*m5k-:_2)kV$Bl(g0b_VI"5omM;"Oi>u.6Ho;Do"#^`n6ljou5`?]BrLo&:b:9E\XlNu+K %\/]I/=H9@u9?\&`U_c%m=r3ZS@!+Q:)Y])$=a%*=lo<)Oo0f'k(J9EHaT9taetJe?7GC\jeqhm!@rWF*RWe+ZU6$%k2j-[$a]cC/ %^.&&C_Gq0iM#ZFr6%A&RU_Jd6oAi_V:gDD9UfSDe&4T,?UAg5_f0Uh9(1R\XW/uZZ%h8Pd:PQCS`dD[d4)P %)2+oY`<,AHaKN6->#uCk(LfjU)gAb%SQqEjT_3//^'pQfa7Y+(Zp3h%[(eN)Ja6NgKE?MgA!bfD:lrH5?*p#Di]@-C38+LYkn? %*`XAO$)Wcm)Eqgn*7fu-(Z#.,3F(2HY?;BklLrb5^\C;mMAO*:b_s`6 %bH[1,r"@],GcZ@!Zhe[h&Z.i&6B8K=aA_UqFEsU+F>0T466&\tT@="s>S,BrH(oS/+EQUm&>+VBHbt)L[MgLG5@Gb,qGL%P-ea>> %<(#au*XfN(/B$gAj^gNdq(5jO%J(k%$bY<02]`C(Gqf`ga:Q=Y+]LZ-j%3'q$.QW[fk%0F %9k#lkBWaPb'k'%mNlJ3Q##q\Tr-#V8CbF$U?>XP_/iGJ*4hR54^hrC7>G@bLT)?MqT")iT(O>!a*>_jh%qni>Xt1gn(Z.A*%:c"5 %o+?[@bG+@3%*B(IaYdkL[_;/2F5\Jc"s:;2X^:O^m.o+Xh8cF(cVMZST9;?%jjj1dae#,b(4&#FkilcSV[@9lVk\s;NY[cZ:IbdU %Ko1pmNYZq%bkUEVj/9eRT+3Z+3m@B`0]UCZ:PTfPfc8SRI/e1?&Pi7eP<+[p)Lu-BWZ^*KbPIbqfqE1g1=;P;ZSuPrdSqPHR0Q\i %Q^'D*1s#1E!NNn"ca[=15pjaDX&1!?Sp#)roR,%$da2\ppZOjheo\[+57)_9W>`!X%HG#0RS!-cVVca[C!?Eii@q11[!kOV2,p[U %[&cP_mLEIc7I9\+NKEO5XKV"mChtd^k&gm:KgFH2fG+U+?[tjr?r7i;%D6D-1[PEV9?<>;0r-@u4]-/Vn0$dWHHt!MT(T(i2A.WK9p-Bb>PpKUEB%)1[nn+3DGgOFpeQX>S_1Qu/A8c-"QnQDJ(-SSC48#Xtdq)cM;U(iADaq+i@0 %5/4tLl4!G`;;kH"\gNu"[5h4*@@]Ec]<'nu=djO`XDH<7alBT?%bat+QCKEZ/@cB^s[6O9>$D,*2RsmM5A`!=S!"-MRdg\qf'eE9L2BCj#t\' %M(J)TS9K4@XMaBehReiHl9;?\jCc^q]Tm1j)CKRM1OQ?Cj@;6X;r,MN/N3anc(H%8`ePP'3(puJ<#s$"l8#NaK6bFeY0s8VnT&-# %Z#Ir.>TL[Qhcr0oM^s%qE3o$9(JjOo3J1CgE-2LPfAq\O)QrMel69PLCcsZn=X#pf*T;:l-uf^Q/7dYtJ5&2uS3o,s,fH5/@?@]e4bSF)0l8&q^8<8WD/#t&F]"JmN>"ga.2]Bn4Xrpq.YC-DX1"h8 %P*^9E*&MpXN/3-EUh+1:KPQXAsR8\\1JJ?l[U)C %[$M$ggM;q\kEX2jdC.Z7hI+BEkS2oOZA*D>aeo%q"^"\'2'"ZDn6$Tb6'U?.%a-jtWYDr'E2a&e*YtHU2@k07G0Npa2Ub"1I&PnM3kX-XW'j@)O>-P[Jb?SdU?5B25%o,KH/Xa%hXI@^"00@jGPpWT$Fc;?AIQJblb5@f %A*?8.l\$rj6754g4BZqAG\GLg1+V-VdfVi.ne)tmXqi=:$'\0DiYEljOt!m3TBDY^X\WZAL_(IG$5#$Z6L+oNN@5smaNQ"[Xs<0M %$eJMWF.N9Pau,DiEs4'eh[_'"rbP\&9*3P^dd*l&&HJ^tbC/]&8\dTc0LPSMF6K0>8EV:uFaDj"saONs.)KS,6-BV:\&L!$I\O9O%/s=5[AJ@.47ZjIRh)FYJZem\Lrn;)O %WghG`NX=N$,IF!V@cKJ8AFCW8*0>IPLaqPeQD^aK]5%7FoDd2Xqk7YOKV=-D:0hPr %6&`O!(Y<@2qH-1/8keDUJiYcbF-M''/Y7#Z=WfPe1Nk2r>9#">mXo3@R[[V@pL#f,f>u46S6M7`'312*51Hn]s5Wj&5'$C1fZ6+B %5B?e%gAr3NF,l7kliCDL"\QZfRS!4([W[82p4?>W6,WB*VN%gWITOVY$e:fA_42jV2qp\=EDBf,dp2X(>&mJt5sVJN+8'o3;F-6] %BNL;nIZuWb&eU-_Z-/F-kU4H[0nH"8%"`%!eS9([#*3AS6I0P'MLO&R+(O^5f,nA6J+4&]_qhZ^s7;REInOpII:I(Oo8i]md+Gh7 %a^#EH]e:;QUcTPs)95sanbuA?Q:Td\H-=,nLI!a[2>QPFW1*\R>lefprJ.G.s-EB.-JP/(JYR*'Od7dZY?Ojo)8rSNaF`M?99i&k %PQNL6e<'j"-"k"%Y"(7L6uX.ZaD9fA6JR^4`dRnu,nTGgE5uu_!l@(hdWo7WJ(e^gg2)90]6GNR-W515Kagp^jO'?*UM$FVCk%A3 %dNZ_$\)Fdgh0iH;!5A?TS(HQ1IJNa76u$?&gn8uAiA-Z[YXkS"`\pCMjie;%5fYhV;9cP[[C+2t$;;P?"gtI3K5'X@ %a#fghps]MogsRWm=IM8Cc_pKA)H'2,o("f*We#R8(66sh7J^.?Kn#@.Qu;S\fkThiCY0V>=*NpY51s6nOa5d %.K[uGqG:s7fA]C2FJiVQ>?i,[Cp-%&:\:DI+*;2.55*h$0LIG=LK``Lk#Qfd_IMKY7Vq`hI>27K(&%0:. %i\h(GoM.oC7]#EqUWp)2QZ@ka-2gdrL*W]g,meu7!U)arW"n`(>Y0P8FF\.bCP.u@e`Km:d1&K.gMJ&0mWY%l(?e,fEF!W98T`6^J@M:(I8OP4Z\j?h%'T"]UFXG%bZ;GWnBdjM);G_YP5Vp]2#9oY^hUNMMna4Rem5$7^]W&CK06q(5CW_K@r %a,^)ffrI%RI^jauV\_&Nk(\2E4oG2Qn]%J6d9igSgI,'+VhmJgJ*hJjIj[Eo7#pj%:E`:!$^!('N\;g`440BJNfJ]BNptJOttJUp+f*(r2nbb46#rOCHT-#QeW(`sd@`-Ftq7DUZiIJ,t`W %'[V5k7gGeN5sM&UbPU4+,SRpZ62>,O.IEf$#s!E`$d9:8Di>kD"W7-pTbZd;[CRsZHuRL^!i:a5bi'lp5HSfJTP[Z@12+D<@l\`o %KQ-CX''_X,a:Yh5%%Ij^-7#@q=rJ[/#Re[V>J2sKX>"?%N'Z&b]sk\T0^6**2cGZaI;_r[0Z>Zo;.,]mn([Uc8;@bF3l,i[I;c'W %_Lt`j!mVA:lJ@\-KeY=!+'=;beZC!,Kdji"?k5e"X*ZX4.SQ]Re,a@Q\@OUT;F*'LFa.I]lg7*9d&)8%*j_>t?TMd81\*psBF=_Q %A6a]#U[8@s+TWnn0N@0WEe?#5-3-"V.[a9::B>ftHZ_NTmpS@5NVo(L_\:$F2IL\g05l9QECK]5 %_E=dQ+I44UN0N,_hT`jA<$3Uu81H!)rJXWlGn21aKbZ$FFFdD!2Fdul!%%%'5(_XTpmDJYDS1UJ!EhFYBm$%Vpet-K'?K(T\a4EW %"&BNBA\M(<_+-#9GAmKYHFJD(Si8".>7d(L?mIdg1>n@<8?LsR_a-R^%f] %ZCX>SRmWi%>V#6L.^jXH,DENC1eW].B4Qu6bO>t+Ph.TWRNRZ7/Mqme*ihRIo-:[n8[%%^-7)1qOpC23N.M_)#Lec\PngcYe%(-7 %^S[@L7hmu)$.QX %LMEk#&nu?fQ-/AB#pRWV#>JE,#Obg!Z\#3pQLIm!$@0EgE4DnZHO@2JNCbg)d["?/*nU %TrTs"Y=cPTbIeIaPc=pFpklRnAP:g0p,)HF#ie]R2hl'Gm:`o0BPIl>q$IF)H_$Ic&?d1QRrI[]\>oTk:i# %fgr\8b(`t4!4+YZ=@*XEJ2]k:W#$?7[&sI$DW)D\9m_D.UcP>&']I@-5gVl\[Q1-M^6)9fQSCm3-BE?;>d6_bAQ(H3m)0W/3`oo& %<'J/!Ql9XVJ@j2PiQqr[r^;`;nD_Z!`#J;uE!Dm$Hk.d_0uN%,BG@kk3m$[1phOc'5&/hdGpG,+-loBOP"q?T;o-\X]jkItG8$p? %9J'2aU`^h`RC_HKQjN1lf'iG-okCsJeZ%E!E^^Uk+8#c&WdS`6IC4I+c'5,AWuiu*=RlOa<6tpoJZ@j(D$#]b7uC>W53iY^7;-tj %J5W!h=s8`IOqSldOj]ifcMb#h?PSf!mgEP8PJF+o/*bDooR21UMRpgRSpM?r/7ldsiSID"m^j2j(#4^#q@cke>")d.pBdj7[!9:4P!IU8,uChZS8 %%&VlNSbcC_[XW>s"R6Du,>Z#gHGe93,LEur;!;"+;4m/1potGKh?`4WH)EMW:83Ean!ou.;W51PW@_h,f0a[+bIEdT0cZ[)@ %ipDBTeCqnM(js7+k_#)$G;9oVC\@T(iC29-CL)4bFS.]HW;M)11p0[i/u*@H?JU4qFm>8D"1YY9$:K:Q6b!I!W,:J51B5#FrB9Ij %Pu$!\*8>H"lm&X@b4Q(oNU'BB[^Jr_2ou]HHZ&-7]MCS$,Fl*&c*7r,9?B;!_*%!=UC,CG7I/G0jeYY2<[;<&OgS%:Q64'*S_/AH %7mq&5EW(u,lj=\6.P-17LZDK(,7C0jNAU9K_H!&[MnUol>b,RHcuX7_Fm-NO7ho]g@G')4ecFEIdC`!;KbLG'a^nZQ\W0+.'Fg*\ %AUX0:\'JBor#T.al:9^OSU&3MBc^c$&!Z@iPni3Imcn+l?%q9A)HH5Q_qXYR-7ID#2HV@D %U"]jRQN4\3bZ$6BX:@tg,I/"]92`oTV]1,rqWi9nesj7g9F12/LuEV8`%b$pp")&!IM?X,lXNKNG;$\fIJa$2bF``Xh;"[qS7iEm %IMu)Ro.1oT%c,iVTA\JY>&NSFGi)\>bO;Zsf:g6!arJaf-Ubt`f9,UNm[T!G3P>=[mRODB(Vb7ckFLCYPka>ome4PRTkiREWX)I/ %k5n&0ELkHo\/F,IR-0;L[ln71\6CjGR%@JKkc*1`JDVtaAq?bN'I[Ofn#E/W!c&.lN&@7D!Vfp44%+PaG#9*#?q88q1>R5&8O9Vot_KbX*nQVk-#Zt2P!>'+b.'*DPE0GAn$k7YX=L9@/*Z*ajCDHoqijZmlk.olM\nFJ=_"NBkX_4Er\K56VW`[i3;bsF' %D=)^RdOKc5jbl:(6>OJ$\XliQ&B7C*[2l@NR.e'O>(qNdAM06MTb+H@ZD:TIGqS^<;f%+Q%!,4K!"5L1'u>K2m_%il2EC2=8$Qd> %_:[lb`?OK*4i,-)*_m`h7aun-\>32>.fa4hnLs)`_%Jkq"heMEkd!tlHC\t>0D8%b9gXs__5>.G.ilUG9;0sd8[6n`2s-]@END=2^ecT?^_O\X %Ti_;A["`c=$c'mG\YiQ.FWS5';Cmi$EN,jeUA@&d$/kL4e%VJ4KZrH;(AdVKt-WcU'*,>$W*9!_>"F0I302G_JT%*_,"I)rjr=TFVWl[i_)-pqmB(Gn5F2HNDTJB/:U`u1=7n+MT` %>bfs\6U*>iCbuO;j-+G-6aP,n(s]Xa=dU=&"WbkMOXKmTAeCQ%#/E'RprYVk1^h)1h6a!24L0gNUY.c8@;:u1T5TqURUuq(_)O#\ %(2tI&cHpBA05NHQ5[W]"UY.Dcc)DpjJ@UnB:U4*%8p*e4JEVh8RitpZ.h#rpODKK2)`1baYV9-o1^e_OSoeqFfbr;Lka++6D$!El %oe]lBG!YG-[\-un-oH`kiJhAUl=dU+c8&7JU"PTqjGM2QDP7^X:kGJ3O@l\Fnp.@T!gNWV3blWBpPapsG"hd-ubdo*?j5[?M^(mlT%Pl_.)+Ht[.OV;+P5rM]-Ir5=%_5WP!,Ju[AlV`1 %=]EmFdb6J%>j\Q'7j%ri7$>%iZMkT"q,bpBa*u3gZ%m$b'lC!p.,)c(Q>@[T'[_U2fQl$kjJBlu#ij)+_kuoa#@6\@7cU;\'aru` %N6+s1W#9p`lU>%jeI$WlXUI#X/[3$Y'!I_.[E,kGThRs`Z_r!JFXbHP6n?.`AIROE;TJ&cU;R:@LP9C^>,t_-72:MJfFNgC!G8&e %jJZ!V9Wc*603K*I+7"M#JC$a5`GboXenuG&YR+>;UP0L_P?7ZB>T5BIKc%!*/lEOc$$B]Hb/puj(1PD5K?7Jb_CWi9#pb*jZ"VE[ %9,O7>lktK+KtSgDk>?4^8)iEZCH$YSY0Cp2dFT@!g1;.(d0pg*JbUW5iAAt^6`EH*O[ptUjT6^t?3C0=UnC"9c5%iRd[m.$OAO&G %HiGc_:H0md&#)r,kkCJm$mtK>pc1jnQGs<1D4YMXShLc(3JEq?TK/eYBJmJMfEJrb(pd?uS %=#X$7C,1k%V]=p]X8rRo1@M<;0nZiR"lK#]LSdK^.NajHY(0_&YHRE&^oD#-aXT.@9#.Yr(E9nt)grmA2%:8f$&mR)I\sED\V!-O %0Prf@\eK[9NWP0LFfo;R8;`WBC1bGO"inCa=rYO(.N;7]OS4SRTHdBM7&EUN0;)VW;hiIj*5Y$:,I1jQGAJq@m8X6Ag"^$36IUf9 %6e".mlO#6P/!!64#$URF?GE.i&XW<0>=KE!/dmU&dEDNRX:,Z-H"*Pl-a(t/Ce!`Vj)1fdWr]m:Qtk;6PJ"bgWu/5qBZ2bP-d>E0 %![!eD-0%kn-cR#PFY$eq`0#aYG%PeRAtpS85"0$[ %L#D'LoO1CM^dlf9=QSmAI<(4`+3+!`N_%66lF[dkW9gZ&/aa %+I+\5p:@NMpl%LT`@t8-0YhWse5dCq'CV5aHW=FuW/cjT8RN!=^u*Q[=Cf==5qjJ/,PMhf"\h4Y+IFDaMEk9:B%j`F$1Y@c#E`)$ %(kiPWQN_D;r>(q_&a2=a3\9`;:&?Td$OWRQFPuI/c-tO9P-$BkoNh)u@aeNd9HgU::."D.jY\@4.M#PYe6&8ZSE*j(#adWlA^M>0XiTTK %3O!VbQ]uPg*"0_jIAI*pKt,fbs01_A59%@4*epbX(O5a*;H=gIj8>2#@n(FD9JCJWo9Q,4[&AOtb[qP*I2ZR+Z`F %BZGG/uFXV%537DISSui/]?r"-?*#_8U=rC\d9r[OgZF,(b&68N#>W9<7Rt9r?!CQ.:@8+1c %S]08P'n16gSTAr)OliAGC7/V^(,#(fP*n]][@C5PjS3k1A`gFs3 %m=`(&NaXV1`:cl?9.cTFh1/Poh@P4[-^ks\XcY1r0]^50M=`VZUF*)Zh9AKi^blHp;p5t2o((@p=2PfZgqppQ6J%>D;Q$1g1mc2F %O\)EQS9`eHiE;9h^WZm33u3i5+Y`.R#_XWG8P5_tauF1gJ64ThBJa$MNG9mTHtsBb2QWZ99>%_;g>Z'Wk](^mahAq7oGZ#A\Z;)RVNG`6i%,E$C4!cTWaG]JnBK$2$8o!/coEQX;# %rd[p@9VI1=>e'-Rp32qS,g3_"Z#AY8"8sBbe/XAp&?0Cg"CN!X%NnKq0,5"X[mP*R*CQZ]"m01JYu,slD>JS3I[kV?q\tpNo5a,h %H$a!%F!IOu,%+fJQSL8;3i")L$ocLK27:D"%XK=Zin=<[f*bm>eT%thC8CXMoKqee?/3%+`@hBYk% %rL(au]n8=UL1SrL2L9NS-I8DNVg*;aDfsnsRQ1d+i-ohA<_&&[3^5:A8GchI5"rTg1%60N6R&"AA9UAgf-m='X/I^,4DeVPi$a&; %GC:e$L#bOf\D+1`DYW8]eT_%)s7ZEUjn&4"hn4F3p+O$b!U(>,UJW(^I_#>/kUul2:V0sR%f>G85J6jKS+k75ln?S"!t"(r)FDE_sjMA6?&l7^c>R\PkJ$Y59RE#duAcM_Y27?k,M*-k3oI::C^ %mX!2<40r)aQg:CN7o3k9b$WHV1q(2Ueji^Bct(,(cabMA+@YH+QG)TF^"&*2X^A528,$)-jbb!cUX1'NR)Bns.jObM %rL-c9@1)9iQa?=_X7:*io-,f7fX`CBift?;Ba]r;*&EcRh*'fOO3hL@?`oaia7X9nrDepN:j?8g]A:ukAX@;DM=Yn;7c&%RU.&L% %]*khul.,uXmrNL%eq/I'>-K6LgMIY[r_46H)Wtu:i9g[#/FMr"[k0YpXS,;LQZWT14P-7^j?Gq'5uS"Y`o-Q3VE>`R0SM@X+5FEr %:,]0,UK>7uq:A\eQ'$p>_Z+V?JGRFu3hB@)`u[&->=bAPK2(9RpD`FIZ[[3gVLhm=#;\'1>I@RgBr5% %V.\E$#0re["E)12R)P<m$kmX>6]m"l %U]k?%\Haksp&1+UO7Nc:`gK-\[4kD^7-sR+O/o)@,IQU2mra^B1(&R`'0#^P$ucNE2?[pF.&YWNUXBXk?W.h %M%H#n#/i-mq`X=RBD'EF(#IQTh]F\ZJQA+#d(urU\/PTuhJ*W_jiDuuj4@Tqcm^6:_N]_N34locaE]gKSg?:d,HCYm5Y5M59nHV[ %B$>?c"9b&,^hsGEHmA.J!fWPtU2l#)`^/:Gq_?#qVpn6fORX5M2FXf4PO8@.k',[!0YkaDV\M%mdZLLD(?ErC/P,4gP%@^%;<->5 %Lk-%rLDKd+Y1'n'3fE;qAXci4e+7EoHM<-Gq&b]no6Q["L5FE"Woc_*\cAtQ[A#GWR8O>^qrk-BLhgK,-<_10`0?.0Kg1k3);BT%kN.XJ^>$7@=m/:j;-1;-f'r4IRk[KWe#*`6C#fbLV"]e\6cTWN^aF8+E9W[\X^tuC&?E?5&j@UErNK]G=:0k'% %8NmDpnu.Z_"_4C^"VFl=Z^fI6_[MVCTSaV@;DLtLEgCs7R0+K*olG'faKKgS=4EQGkZfQZdZtmUUPiUJV-La\"T_Am8d*AG&k=-R %&O'r[_#'"B8Qp)[JB$quB2/]:++\B,W"\Gs(E+,;Nf+Mm=+Io*@p5*k\eU.2WqVGUVD,Id'HCkdL?Yk/"q?D/nuOuf %d*s%udDa/NM[::_5HlNq\&mn[`#>n-YQ?pn_Z_^.El!]ZTPQ9Wml"!Ob/&@TG0jWT867mf,iK7PQrN=acHb %r(7eCZ"!ir3p"K/XAR]J.+tAU^n*2]>L]?M=8dh6p8QW>W7If+ZS+oDSX-D`(NJ!`T@rX[%9h7f;fh_ibPu2>^$\a'9<.AhA5=K# %r,U.!17@aeo&*#Dq+ajWqqM*gAR)Mm:NEiZ'8>'3k_-aJq*\rdPJPc4/#+[8:GVu@#Z4,`@`iq%u>RV.$`I$Aaj %3RBH7NKMi`'?eRo&.j%eE*Nr;8NDNQoSM/d+Wm8JPqLM`_d^:Y,#%9Xd%* %MUVG@doF4P-Z)@lbZ!2HFsM$";,(-`cMEh)p*CK3Mpe,PK-8On-LFt3:Y_pWa-qL$;>At,4Ue[`gcJI(Z#p'c+sEIM$]@nCPg %cP0=N]E+;EJpWmU4];b\26_7hfQI1Ycr(H71Y4B='j(H02<>:Nj)ChH^2i4boj"k4EVRGb*cZs%K06c6,6c@aA)l,5L5B6eXGs8t %2NuL0EuLgP)akN/lSYi/2N$0-2JJ+*k!k`gId(I(i7,9u)&Gm0-nfSL8Cp\8Y,10CAWjtIkFthXR=4mu`l[V7d!fN,RK5uOBfGo8 %Q!=?6HnEksE,:>"]3oe(ZF/$^jk.TG?p83E].K;[G/"ruG&Ia#f9!Fti2r-O12'ko]L`I^aC^XS2MlFCE&WW$F#n,Gqs)7=NT#2r %O./8mXtg1DY!PdUnCkM)^b31ZkOQmqBm^R5Wmfs-&#"AGOsq$^2Xf4%"]mm#CM_5_Se[.//q^-5G0HN %g79:oC73F)HBNqQ\YdR6^g=[\*M510B)*]ik)KmD,aF!`Z&F^],tYBIMN.S'I%eLs/%]Q]7,MIWl(OPK'O>rpHcMAqQnH?tX[TT3 %!t6.i`t^FMe7=9oc5l[k^i[NIO,hG@]m0&a'fF)NE+0hX>+;hI)C9K969bk7T+[gV5_;C@=beFOASY`^-*2VR#[0M3H'+IN\IJ]> %m'I.85fYX["'Nf!jrEQ7;^^9(SnYE/7_-8Om)+kSq(`\i&(%#,m'W9+-l!)5B!.E3WSI$YJ`Md<- %/%D4]KtWJ3^tCiRd(/S%@^L[J,tj((fMSaSWiZWNgO>0ue8$a.-#"FRf]UFC:a2F/YmC-p>ddRI)/Z4ZAle]0qaKoigE %I\@W!3hY(]N>=W63f7Oo0Vo\Yk=3Rj(ol6jS'$TgmYlq"bYqIFMuh$X$;Hn#&ggVTJp7HeZAuE#qH=oG]O_HtNMn[n`DdKAZ<%Lf %@DIIF[T]L3Y>#BY,N(O;F?`f#VO::u5bW_g[cWDcF4Cqu7"[5Eh,?qN`u'(HW(4:*%!S&90eP28Ti5:&,8d2HnBpnG1I-l'%]gL' %Pr=RuJh<=8N+#Z(25t!m4!de$@E\^'`c,SBZY*.SfFfa!&`4lBeM_2W_cWIkg'jlB7,%Z"g]0.P\_qeJJ^V=0()[pC)JO*3U7dkF %[#K,ET]L1ugc-LTB,]q:n&2l6*!P!b=T`P(\O]oTNdG7K\_4/G4eQBq9_YE#)oX-g3acH=[-p64Z/M$@@?Q0#?KMORH]+eV)Z2h3\*.G?c^_8(1j$`(GU5(EGX02kT"7?WVUNb40`j4Voa%rVY(dFdu_YEeh-MHC]Pn7l1?TuN$;7q %fesY82M\Fb;$FBo@[hXD+md"E;kdX@XBN#HTBHP\1_jlV/hc?hVW6_QlX9ogk*n8M&ZBsfbq-p'VD>_OfrCf(hU)Gk'L?[UkMCYQ08j"7&'ghi#34,]d=[-' %@]^>(Abi6@J`4""=SOZ15br2Wi&TG:IPto1^Fbc$db;Wp"WC7%l&5qPWtH1@)=qu=f*a8?1r@OiX'ikLe]#(V:hhMm%Tm_/4]R3g %Pf9s]F6S?;+\JQ!&bpMf<9:nj>1FgCR)+9AF@N+9i2XrH]0[!udUNNdW^elV3GE5,Ukl0#:%g"c%b75%u(4N)=K8U"1bVE2"N;tj!/,2&0I0_N<7[!a]*WiE): %2u7(U[P[@i:Kg&_l\j3bJB,g#d@FLSf]O2=Mf+i8;*DNG[$Ct1qct2.`2r.Ub'sEW5;ol=3Ps/7$L@dGYEG6c34eb;0&E[nGudQGf!EcSB?o$O)tBk5T#VK %;[k.L'>UC,`0s:HN9Z7[^A7!_8JV#"Qe@ahJeM:GRdS1SMPC;h9!-VO>-n(1!+J/k(M^tBUh:VicjTRVlo!,8_qZZH7_+I?#r!7; %<+PQt_VQ/t<%9t4jO]#/$D(,=@3;l4a.$p0<1g$ch6;=^ik_]>WF8%D>GIcjK0Z&lYRL3#!+=`tA]PK@JU[DKb;L]Hb`%1qhVEFbN#iPKfs7p':WZ`HK\7p#1"32!3G@5KUQEl'3,cIeLGb(qN4eMf".:irDN'6JjT-[)G^6bh,m$q):l!+TtR-."9T=:a!3"lE$Z"j?&WKfuJ\r.rZE>>J.`s]ZpkA9];U99>Zj2&7ee6JcZP2N^'Lp,#bMs\TEFT %d5puQ,%Cga::4X:"bJ2:K,#(+9\"tm:.`=_bU!.Q&JRVd]Hc&3"]JIg"U1JAU;B$`Ts"":gbaq(enoP7@mF@Y-SFl&cM+ZBdkH"6rjegTGUrDfkZ0@cXmdL^D.G-*Y9)b-R^\?NNf`9-t&QFUf]pF %kGV:X$&UiH-*@O]"HFJ9@0HgD5duHJTV)]beZD1A"T^XHU_ORLQK&=@TKo.e':PT0F;\Bp)_lpG<,5Lo%+gnWF`"+0!c\d>+^76` %?qDe^"9i3lV-ZuW?:Af\-kIqILJ:UlnYE/gWh:1`GZGKq`&\/1_is4X:bZU_(+=b9aUls(?/;QSaCP5=V%XPGSM7.k*ZU@&`41]5DekIG!/i4rQE$lEXR&=IW?phhF`k.XS %+nFjaG)`,E)RT.qicNk@^lH@VpKn)&--Kn#0P-h%(9`(F<6_HI(p-dNls/#e@dpM`2(1(:la$Y823OsgVO#J3='o_F8di"X"o)s= %ef:FHAY(,lqh>E=lYW1HAM"[4XXhm`ho=<>,k7GT%6MbLN3=#T:tK9-XD=q7O#t8WoHAP`A<"/)Q^Y2[<9%MieGuEL>/:8f[fVc@ %^409K9[ksoJ?3Io:7/=&$X2j72:&`d-E#@%qVA(tH;pp2_(n[iN1:3a%;9Y9pNH$.H$>C\54gR$G>?lN^T %MsZ0H>KiLh[FQ(-So8+4:cW#TXKa=TZ3SQ,Tg[DlB0/\.:3m%q*IOdl*_U3E2JZ&9>H7qY_;>7M/\mXUmE=c/YRND;`HK+_D;@(W %Y#+_;)e37734dpF5/Zhr&oVni;\Yb#rnEm*?lQ2nhl^^APlIb3Jb\)8gnn]4&b'WJmbWkY\g;4='sQkk\')d0KA.n@cJ+V!ciY\; %c"@o,[MR,A=3Z)dZO/Y(C>p'6g8leF39s-S@oZ$=L=^5uUH0i%hLaq=J231si>%Q&C9+tJb_md/cI>!L"6?*g"lCc=Srt!<`@M4Y %<^/Fsmmdbc;emZ[eM?Ggonh2(:?*l;1RcF\!V,fGp3_LmSt8@30"crsC9-F:1'O[h2[8*r1M%jU%QVf^20XAEB'bh_#d_p:7uJg# %cR)$/VS%Km$FKntMF#)L0!AjJ:bFp,R:*9`ggDA*,Z9`u\E2M9rnRY*[PtE/PP!L_OFJ_;-_[f&#UU^Y*RnTI%?@%uFTYjar$j_-$=B'6esqlI)!+R\g]Gb6.Si7M4j\2YOWm92 %'5(D)>/_-mF.;IjaHN'8'WCn:@9*UI/PG4n-i%J>*p?MOk6rBU]UIa.?JWC*PT:ifSWXC(%>N_&Rc2A=@m)%Gc/mg8;="P(%W)Go %HGC/2HYW*snd1C!YT6Pk>/A.45ajN"R#3KHKI=;W>&$=OK#4nO\$i5J'kU^un?*0<854,(%?t/OYs'7fT"6lX\pA;1Q4Kqs45J.5 %l8E:=,h7R:$ET_ZPFcJlb5r2F8Q+oR'Xb/uHA$/`/%F]"0qE.p_4WK%n?7j<"4ng3PjPKHIY&=urYkCI(LadnhDbO-UXj9k;V;3)pHQr* %AfjHm>*G5_RRouaRNb7#a]Lo>AaS5KM/6.)9d[1M9n==9QMnArY)WZm1-YZ,YT?2(,9"3&ooiP6_Y<:S='/2QZuEGCbLFAWlR9uQ%+i.gD^^i$W^rZZ%Wgt9gQT4f?<.g&(3 %2)B5IWN0ETrcV<%isZ(Q"js4%m0j+Lh/5"[G`sT.1hRc_.f&&Nfl-K3.B[tj!9nDra&S\Q.`:77j_F^h*%IY.P#\fYB$@UHGROtQ %,H!SNhCA>A18F<("1'&LBU93/&@cVG_*S6N("M7t:T5mqM-G+e$8hFRJF?OsWdZt?J5Y4YFc3B%!;^SA(,Qtc?,FkO#c3[U!dq_N %NjW]k(6ObQ0R!oMg4J*3:?=aee1G0!j%hN]D!"ZBZipe32/baeb@j,jiu?a9)hEkJp#Ir@?+5o^*k6+8*uf>^M9AJVOK9TkEk5?q %9&<0G`\p\T]/2tcQP]*,TG!U!NRW#$-*8k(;)khcqJ!7S-0Z`_JrOoMQBfD.AB/]DJJ+J35]oV^cmW*VFI"1T#$@P`=U$kWBm;C: %H;N'm;bRnN?CJKj3*m7fgTo*CdaG&rBT6mEJSi[=piZhl,NTIrC[gF6#!-#H)'bh9L`omUHAZ;=2DZ*XO!UrZF3S$,^p?amg,r:* %@*HVLBk:ZIer$#Urn6U.Tk1W9kX`7X_WjZ2?uJpDp1g.L)Qg/S!pnIK24/KWRTF@k<2!$*c,I0WiPQ#N>/n9[J>5\CB/Jmj0^6oP %bL%Hu$J7uJ[9Be2o_hcYInNZ6U<,RRoSM9tlg"nk>:9d-`F^(Eks=XH+/]O8[od2idtWQ`.RO[#Bg&=fgYbk)L.nF!WG>IE9+*T- %kU?"hl<&`@>.2k1Pm("tg0)lj0X&>1..Nh5CooNQj2M-Li6!^?AHsL#HB\anTL-F4(+Da4)O=ZtChh1bK#qb,:DF!LGW)_I::qM0 %KSojh1"65(?r;a8<24bA[,Ln1>_t`R]c5e%XKS*P9t6MO`+]BpO[tRFfbF*j.c*6pP@U1#e7)Hbk#:^?$T-'r/Qalm%]W,oBeI+o %]eSubW_`q$[AbuO\LCXW-Go#30a[r(bHbW;5H5WnJT],nXF@6OE@fX7_Pij@3,0:Q["45%.Vm("aedYD(^s5\kY5rp=ed(\^>#X? %P`RrhV+PX&5uZ[cS8F.4#;h([At=Hj(Z;aWTFg9`Yb2@;1Q$>f;d(_C>OWbT8NNQR2!TU6'kO&%,p]U7Z>n32Ao+r8.s5-,Q@(". %o6ooXd-t?":sZTgC/]n.W0S?s%Q.ptpTP?<6]AUoQs6R[*'L^VFo%gOi(hm4T<[WeE)hHi]m)V!6$aA0(ZE#GB\&"W<_cU)0 %Q=c-dAKXe6ZJ9.Y%G\Mj/_#D+X8TP(e:*i:\&f&XcJ9*SX^)c(2>e2naWoJRj=HFS3_[cViMbm(Z#r-7eJFP$[H$!H&,mdGf1Tcj %mBbBmaZS"/? %5O6`*0^`%gjh`EiHn+l@nT6G/1l>5?So1q>VScGT1C+dl&TIuE-!4r>RVa`:OG2OuMqgPq+?h)j=?VTeJY`)VJhAR`?%#qL>!jbo %DcU+Rs-Rj,hY,mPg1q=/>PXO/4u!)tR-2NOU=WndYN:b71t*B)=B.(0RT.m)19UaXN2$U6<*/Zn_k]dA3K"pmC7HUu(7o.[F7L,j %AY%?R?:.s0j;(%dW3 %\oOBWhV&^=T3j`si+mG?FhZ(\4@S5c[-N^M1R^Pk-1tcg;mA`ZU&hHJH(5q03IT_(C/sbil2B5@2^(p1lRlLX9%S%<(gW?G2Bc?L %\g;32'(?WFhjbOQ;s;AGgR=S#PB_]gY>X_MY1N;qm.&t/Mq,%ZWA4F9E[:V.bbTL=GT:UmiY[TFq(V%u0#ASQK)n)+T_$BNZ7p%3[#[/kZa1,'38rp-!";WYI5%?%VlIPBp5+cgZ!%B[Uj')rQ\\Ih %.7m8J7D60nQnk3+$VZhrg+U(ij##i@"fA8099"j)U&UUgrBH11Yjd+4:H$+V,R!iYGWAbc+\udqD\Q)B4Z9Pk-D20>RQMc9LCn-? %(>S.6`eeOaa2(%)Lb=.6%WUPCf#7Y$9e)['%:bQj?--k1<.q\T7EqUVWW+GNJ9G(HVuCRX7WjJ7&hYY$eL:.T2!E:P;Vl`00OL,'_VE %M,'7@4\IZLT=ceW^VX*^FK8aLm:T%K)P+B5Xii]<\SfR!]fS5IQ@UdmBYTafgAtq%>6[.=3Gp=;3.e2L^gmL7>$G]%"Kaq8"[MEi %f7/@N7q:[8N)gR2.Yls@GqD=;2,&=r4Ip&bMP_B0Mt8Ph%@Bs61KSY3b^:1SKs@O78B?XYUKbiR)R!.1=.NF[lf4pJ4Jo(Y-U=35 %5#HJUF\JsO8%'`N4D`-jGXZ;%RbXc-I],i,bs3G6SUeqG)P@uH%[p*hWO*sP0b"uERCoZ,\=jJ1K%_`KoWJ4[q>jO3(NH/`hJb`M %8p[:"^?#V&VH?Gb<)Ob0>6[O?Uqj;IJ8IpEPVbXDgk?YKRDnOp9HamPWXoNU9L#gKL6A;[$RD?3DAWdP,T23(9hu`NQ%_%1(hQM+ %C0;tEKf:P6$cTbq;i(DDeZ'^Q'SQT.k'G+mf@-*t?ND#l$atS7_RtT\Mrn/nVT=ll!0[MA3l0g^7`Jo@\R`_/b`g,E+<^2/5d=?s %%cE2Ml:+i6?@>One79jP[Ad/,WTkpT>O5!Po<\j>;JW3qSP]&X:L,X]J<-.]h5CZ$Y\=e8lM`8.n'GC\$\Zm>f)Z0;5HusW2#mV; %+=SsOn0h7iJZAH%%;DY4*]`AJJdequKAK8d"*=Ml_)3WRCB2%6PW[nsR#5EJ1]om19PK;73h=ScSkmStJ6>5U?*KbBkS7cr1,+$% %XphP"`9\PAb^Ga4\d$Goq>*,8\alVsPk?<`Y"s,i%&sBha,>5.Q7O"Yq>\k9DS)3Na`Z5PS:@IR!@6TKd:b@3VUncgkY1/\DB#Ml%WW5.MBY=Z@/Dh9:f!+9X^L&TC %/RU>W&W]ATE>isb`4cum4da#r^>3sY,b>ZnpGKD.B);%eY>k,Q[LK3eQOe66]e^kC+r7asK?P]?DshJI1hS&j.X:,_Z+^GG^c'4@ %nWl92hP,WJO1EbkKf7QufUB]$>tq`%m9\!m:;H:O1a)Z/q$[4sro[=B_DkaN9S(PDU]9sU)1[Vjmb>TmM>?[!u],9+&i@d7r %E:8)D'[N8i)T)Q06k7dl(;186T7#.i(d?e>11C^agbS4W's&d&.rOMTg&CW7R,P3u?-kE]O+)&gT`+fH[)T?8"V$NG48r(aKZ?(< %+ed-'cnWn(!L6J_UcN@13cI^g\r"=uZ5UtB5PTTF^Yj([4p@Z*_;mJP`4Rg#.PFlj1p17-5e41CY]7ABX@AVCk+3I%t64AHQ-5:WgYi]h<$,3])DQj^:TGla:Xr_9:,D:gN[;]NWU*a?7uKar5Dl#V\X8EFnVq!2!dlY3>RCG %*Pp42A9tKF=8Ml@2QHC>GO6K,J8TB.[ZnE(+J.]lU?4`jSHck$!GjfGig4el!I\[GEdeu*dc\BbbNWrWMBYCTg%_O@oc;cJ`SnQN %A-e=WDW3OC:e-h([IR)i!3h#lGQ]3bF62+p)spIYs4@U#X(TGJ"[bQQI$,YFc;Li7jPacHhn;q/Xu[Ts./IqKrt?$NjIUe2r9F.C %RO[sWc[Z;^I6Vn#c)ZMH;tgnjk-kf?S],/,5qPS^3T-7+e..WC*J,XC]dT5o*X5kbeUuf@NqcXi0#n-Zs"LKO>3N[i@Z\:Wm-E5:s2KrNse`S:1Qc4/K>W56^s+?*BroD@"9] %!,(0&%3[\Ilgu%.XqUD%gR3="H2g*XH]Wf\TFB1RCr0[+^,i"_(6KJbo>FfT %W9J[jQF\6Sp_dq"ni:^@%MAeTCZcqA39p,S"J[_-P<[t@j %qh(m^;E>7qW=GR,0RC82q[Q?C, %J]>V)%%!H]fDR7"D/'c,u7K;k1d2l_imu:KQOZLY%4J&cZ_d\#8`D.pXm`WM@PC$Dj5IoPA#tn`U_C@ELT^4M[<+Q'[UfGF' %k-$P@Gf%W$Ma]5$:h_ptg!R!Gf37]IVa1hZ&\ICO1B%_3;R1C'rY&;rVQEYNgKHnKOF#Q/j>3o;sRN9M5t/t4:FFQoHFCr*I@!p_p)Lo[\7UC %A:3H)hQ1,UAXHcDI>.#Q=)1IE1G%P%BRjoEklJY4A*G3 %BmtqPjF1NFh2`o^3J:_[3XhtCIQ(QR2lVUU-VUlp:%]"*]W_M9n[0ZZKQ]5n"8Mei$NneX!q3e:ktaAjfBPW;aa_JIiQ:2$4[poeT"N'`%?Er?JJ0&mDc3fLoY=#Z_8T@:qVDi`) %W0rPD/RN91/1At8b6%qm\N)T4r%.S+I-ruT+i!0qpkPkLm(5!q'I&\oH:*LoEU(//7aNJ!a%$ZS9F %TG>:k3s5R$/Z5SL4)Jud[Cn4g5dHZ#SUth/jF4h)%m-/Oh$nOKCifXX\^Ij%9(2%5)UmX*"M)/n2Ma_8B=#0ISD10)O/2U6,*$>d %BaKgUks(_dnb;ps3ip%+&SYAoi@!bKQoL`Cq6lchP_*:-9,2eR8&3J!\bBteu" %;Vl19ljEJBU;*6)qKHr?8^u"5;YSV(SSj=)XTR4]VAdO2 %j5GWSqr34[*G$<0`PrERUW]2bs#H6m>CX)O.Q&pq8i0uPA[U&?Y2.#:C@Pc#F*s_#f?i"+]P.!=K-\]kNJu8.4^0*M5V:[Lc.K3o %b7WVQLVm-C;*qb`aq6Y'qm@d/Fe(I543r8!Zs<#$a&3tB1ubjmOcQKQ+a@9Gs7WHSl&gToU1qCAqb";98TiaT-"WuMh`jX_*DD_N %6kP\!D's0=a(+fE$b3.kg_X%RX,%:,7;Q-e_P0VR+TN0>Ia=d[4l)jb&oBDR$tBSdZG7+t/%;k"&/"?P1(K!HV5c6hWfg47TkjZC %ApiV.(`_06N8O?JHRf+4p]U'5TQ8%DgpA/r8[ckp`4Qp,KY2@-TIAm3BgV#1RGVgbjm&g^4ih.aJ %4%Sr$(*N>9UTtekQU\cX)=`=R$#2,3c-2nIV'W:r:89+dG]@r>.n=j(jfG%SU!TF)%]eSaNj(MnhYjLm %"c:obnVuA-mfs^;KuF'WZ#:_#I=Bgg)El(\6rqFBM&("RN^VMn*0>@3Cs*`^+Sr1`fPC@[Rf@ac+g9R^\Z_YH^3ukW:CabTiWM"E %lARm'C:s-`OeFp6@T^cK@nL@30BWS7aD_geJ4>?.3EnlTFbsFjCcUTeh/m`-\9iK[**r!F+VGep^h@SPi&Ha\g%UGuSR=(QE*H&ck!K!Co$De_ %X.(eLGs_0eiMj[J'8Edu[pjp9R@"/1\5uJc6]24*5b6`nKjL_`6Vnr(LW+[C61e[=ZW+.;keQe(YrWCh7u&6b:F&^1\cU!H&OgiF %?3$MZ$CK1H*$&/d2J5U7%)>sTh1*'A52%gM-+IQ#L6Zp;?.WfP8Ss$&gPR\hgmjD$EI\T?4mk,-O:$+557r&eh%>+Wa\GZTlgbP> %.M\5DZk:B#CF!]m/UgJuZU=iqZ!b!J2$@G)'3j/`%*T'OI(E9RLr5ufHiu`)\J""]<\bqRMaO.[GNQ/^gr@:#m^=>^f*lB!#qj'T %^7it:H>$5FXMR:2P:9NHWUk(uj\nLBM#;5g%!:r<0]X5K8M^0=%fqJ;9q(e5-W-UCV1sc@LlA2@2h?B+m*FW;Y]3t>mF"]/,-O]X %^d1&q,%<9l>Fn?X'W^>9\EmsY\*/ZIrd_6&%stVYdnSa,#E&D%V@0.7Gu8Ppi(^%"V6ml\SWk`s=9K_<+&/?61=Qn->WF06$!dt? %ZQE&opsHCX'Te=V1J/6\WAk5M*aU?K*0F23ntQ+"KK %(#DU'k^o/r>6Ns"#oP1dNj8Rd):qIp3g"X;Gf^nE3]BtB8NpCI!3sVs?>b--NtkLPdB8c[LpBG0;'65-V7ZTl6kuA1?LQ4l?jO^, %d(S6ADq+q1osdogB3HJG8>@=07=`rncXRlW@\H$nfqo^XJVjMXp\k*-hbS.-:dDS-_mj'u(;\=*+\jtCWrnJc>a\K7q.B&aKsY&f %it[hG(EG"oR!IA+J:\G(k`Wi4=K9S\,`uS-aC3&G1]na_IB:>lJe[hhP,"0:93QoZM0b8mj$AW^<2b**5kL05E][ptcB"HR$*#i/lf55qB6>]EidofjQ5MMZmp"2ulh=(#.[@^f#[)`uf*dhk/'aSE(]gOrJLDB$EGk?Tdft\cjfsjo %P6?#S5$BX3>Ja%t<+M.7[WP2V$2&U+U[1r68L&++9_(a`ZXKP^XB@Uo=gJU2aI6\E.;P5PQ/`MK06[l;I;?[FK=)f_!q6>%;cm/2 %T%d]Ep1:2InpI(9L[1m?mc0b[c-?FNCK2OtY9?j,o8h<7WKa\oW %8ifrBTo*RG@n75ST3rNRb\G15EA0?Y1OsI\A%IIgn[S1r1*nEH/7M)FPgtemPd3#$.]$rj7\u@:cDZt"bc$aRPu0!`>.`rsk0*8TV=\b0uh3_.m9i61-VCAN,=#k3$s`,M"Yd %"+4sDr"dT"T"sZ6-Ce%eF>F"C_t0 %VBF<-3NT0fm6*QkPk#EjmIb%.]lS7>PC`#PDKR$0hYMJS5Z$B6661Zj&X35q$p>D:S>UsI&`RD8)NrVl%[IReaJUlt;#)i((!5/>l60gePWq85'm0^j'Kdoc/pgZMmRFUF9%=_>*/:]LAeC$ug7C!=P]bo;%.'S952]ca^ %\tn5pLBYa+TL;]ngHok:5TRGNqbA-uGhB/bP:n5agt:WJ-&P=<.192DEnp$QI/EbZS=Jb-7tG`<.3T(2QJ(#]oM&o"ZrFI^0U-nO %2Sp>CK0,iY,0\#%G1j65kk":,:"Q'nH2+\.F/*j?F20PmhkBB.;k]D-a[46qE[Fjk!JG,XKCG3Cm6?-U&ROmUMXcbaLLP3pULLh:gb1>AKI %-c]LSOi).q5t*MoCko8)\H#:G)+M6ZG.8J?Pdk-P'%qFstk/m81oem=9)RAnSOS"s?QDa`[Z0T6duF %A7DkCP4b-XfR8sYQ?hFX-;N&q-`=(`>>JS4*FE"0&=g+6PY<=ik>QSL'#P>`W9MYWSYecL%%oXl[aGd; %$?C1.bctG.ctX2Em=BsTdsSI1W&>31Q@7to=,Y9DP$;W<0Hd48A(UVMq#&O1R6?:N9Yp2\S;pOR7%O9r`WK.DcLfo=ZjBaP\ba2P %HCP?3/gf$lT$h(Q/]=sl&#p+3kqjD!AH:8SOb6A`7S]sC1iiTgoH-Hgr_tYXVY.bb^:fH;fp6hL8e[K`=k`b9!O@=`ulLbXtPLo1>d==Z['5ZOWYlR!#L* %*WjS9FJgnoe?[43.P6"l'$sq=jZ9M9*q!u/?de^hfoMJI#-`g!MdR;@Eu6IH'12biL*7A0bK]V*?]bBe@61"F0V5o@:IWRnIOl@= %=D$HoV35'1ZlCWq/S&jU%mHm();K\N^"U=RPD8lk(A8),WRN$@k%^^BI;:Gq`PCq5YOI(6"&JI@4Z %MO/nYPsr?n7D)*:[Tn-11@kNNciVE?1*8bV4?[:?'Ib.\+"FO+4qr%^I&Q,II)*e$W+>#m7XP!ZXI0TdQm+:1o>)]J\_-W:OdV?k %R@+Rf_+qg#>OEtWEuqAkP6Oj(WJu?m/07E;=cIjX&OA:_BAIp?1e_oUrPRls[,+=C#dcB^U7R5U>&cI>L4$A[d&pN0mhl*I/4Bo)8<8 %@\"Rlj*gS$>l2]Km":Rpma$'I<4q[BroNbs3.`St@@=96HMLJC@T4L*QkY!t;ZKtX"Hh1UM/!r,dV*Ouq!CA%m`EP-4sL*qCML90 %=7Y<`.3L7`3cL#UC!6lOqCTZOC^q>::`.94)KLO_+E3lSF_(kl<&./P!Y6W3JRflZn7!IJ">TJ+(/4ugpNZQ+>SLX-64^(58EhrK %8/X[(+D%e!5g$/tR8o=?bd^!G^WR8rXLQsl"$nKrod7u>4Vk>@4)B4\h+P2,0U]Vs:&a`4[out4&N%+QC>s4BO3]3GE#Iqt#ZYje %c3[/Y9"1^>%E,p/FMh*fjWR3uJ4c(HH,ra3[6[Xp980Ii=_(\:#)6`"@![^9_4Mcm/(jV"JfUtkYtW>*'CN%]m;Pa9.#8sdYc*hQ4D86?6);9rKY3rSZp@XBP7_j>A, %C_8Y@VES*Q+X[YK*SjGDKnUYA`q)G:P;'UsgRg$-0R!E26;fkFMjT*$@3I)i,n!<'nA.FhO=Vq.7F#p/*lL$+KpjP<7GbmJ;ETE4 %O;+N!$cuQ5e]@R<99aIEBc4d%\X0984RR/<''6j*`fZ3'Fd's7+MQ/"g!YO\0e7C7WmTku/b.#)W6i#nbNr.`X0YSBma73??=>"V %(d;%m.ZoF=Uq0]280O;TIo'3):j^:#8!X*`UjZX6^2Mb"nTXB6_?mIZj[uVorBgX#[P2=>;f^*=CYGusP:/$k&JRW[&W#Ej(8A9!)Tj6@s %M)Qs!g5fmi&P2,^b8#R9p%.>qkAV:g,#\-4*n%2s+CK?c2`3gb/JIr7%(%1&`F7r1,RuT1bbcWq,2EDOM*Hi0Hp=SRM&VR<91\(9 %-/**l,];[1p*jW52HF!:65$bqqV,*tnTJc3@2K9t=OWJ:Jj>.#L%Yq+M@bba;/MXbL^(+Q2%Cfu=(4IOIZfO!%3eO9M%FNrnfk[\ %+W=kq\L0^#7SBPK7#2&0O'kD4DV'L7hWtOP+hGQUm)K!]U'U>/T`mdT4f[B[*nHJ[d3/!lR$[tG+$l/ZdSc0p3nYp_H!Q]C2(?]96IaRL3QW8%tGW@Kp-%\5f@]18LU8!Z;E@P,`Gs&`oWVVc_1q?o-D_u;fe.+?o-Mu] %AkTU8UM(uGZ3NuO>V^cVTRd*k/j-8OM!fd@p0cdrLpdb7@&1_Q]m!V'Z=64G+J4#'A&X6VjG,osaJk69kN&pMd7:VqnGT@TZif[S %Hnf=XVX*G!-B5\h\?AM8!3*]@(O]g9;CYTefb$ikC8SCgImiEil6@EXj$cmp&47WneC6u\Vl>`A!E=Ima'/+tS5m_b3WCRkmtYXC %Q'V/?`sgZH',V.E#"N36Nob6Gb\(=Udrn%mgHkl0(%9LS/AKPUp"I+QO-6(OSgo4U-j %oaqc4]06::HdtVO4C7]C9$H+@;HGbnYPLd15g`*E?rJ-rZO2,VbeKZsaC6`qWMkk7e@M;55l(c;R?d+'mCSdD?l;ia!AX%"ooVit %qFDc2N+g;gbX/DZ%>8ht9-bToL:X0<,TKs/\Def$6a:KstR2P<>>aX7*R;5g4JA_99U&$JJN4&hnL5=5MO_W^Z=]A-KR%NhV[5rD?RQC]Y!Z#KmAX.m(\\MT^-FQ<-*O %JSjaJ7iA5\1ZjX0G,cok4R4W#&&TrLl,`46Gk>kH8Q^8a`1:kX5LJ!G;.:a[LG49m$]:nkpJ` %I/e/i*S091=I\@9i7[%YQIcF_dLXWPXQ+\BG<^]b8]N9S,uFG.TR?X_:X;7IEgpCg0oDb,Ml';#J7PW#%"@*>GV%guiQRj!mqn%4 %BlX1<>2JRrb-[,E0e9nt?un.5;jaWlKccrC$_;Ai%ViAMRO"]^pAl`-,o0&E_MjdH17uE>I)7JZ*jV:?MsqnLfS:!a)?E]EY,k]9W:[*AR6[&R_"QSW8.J66=cWAYddG+,SH)pMjJC3V %f:hs652s4!'<&!r&qS#/OiZf'c%Z-uilGI3D3]kBZ?mq@oCM]")_,&k#0N)UcRHP&>2R#]K\*\BM^W%h-o,h#GrUU&q[T4+Gm9:k %M,JR",f@eQJX@G)lc5*!59F%T,?l3Di6p^&l*9pQh-b*&k>6/:Xu9cR^n1,n%[o-1Y5I-EM]Ar:%Yb;@jf")bP8d/9jG);aGOY:\ %\d't)S?sL[[]&o9Gc^aegoW.mYG!"DGksFmj(64mfS2sJW$V$YE:o6D_BNb.TdjMQKpWYB#9["sJL.rKcIhDF4k^:'=5(B\A2/V\ %(\56DF,t@$IajHYF"Iu(l),X^J\5it+sIt!1S3S6ajtt\a7P_8(/[Maji7^4`"3#W:H%)D=bb]X7lD813**u(;UJ#PI@ %0>DjN69jb6RHV]RQ:EL'o&[+VH.N/^1!3O$d/akF4/4-%dut]<5$#Cs28+.nT?-ZYRZ^n[8_I\Q\,hM.4PI46;a%dq`H:AiNHD58 %p?.'gF=Z81o(3`-'bc\H2&q%.&1ROEB;X\0%T]Hc@Y]\Pe7/>,<+e,8U#/M39A/K.6=^6j8-$$Y>*^'W5]/oj+SE@u0aT"kbQjsg %`t:UG@W\R;15DU?"'clRZSDP&:4`do,ftNUi*G"G\^%6?qn"b_niXVq23["`3DPeQCu[OL/'@mTk!'sXWS2Af"aT[0[.6JB0aOW9 %N9Z0CFGWq:QB_]LGMj)`gQU:4pQJ2TCa6Oaf(>h<22@E!]/c(3!Osn=`5VNM;W(2h"F84*=-1WtN)?YirJRnhDiQo,*NG]H=Ti&t %in9H7r,*glGc?";e6shJ92T?IU(`rC#$bo#Pn0TP2X3Pg.'!Sr0TuCE"We.h3l70@ %K;p'H'uf!Q`sr/jknk?P-u1;-)4Sd:!HgUAmH?J51uXd=!o#fq=W!9bGtjQR6ucG1C6hajihjLD?@sV&2s*]njf4lk2(Sj.=1/Mq %YBQC7n:<@p_D+l!9hp4P\Kc9-5+*^36I'P:"N*Rn\)&qk-IpeW! %5BQs>ns#A]YnS@c@4qt0__Y9+>=HSB>c4a3Ri.6B&O@l6jbiWBdCPEM5;iSqeD7H_K[T6emDg>:/qmR-8j47XcA?V=Y3GKrlBeYM %2E(q)aF@MGb%Fi!hlV-6esk*!hlU?BKleF%=_^=gRK3VFJO@jDp[BFmZqWgR$tVUpgY;l2[jW((U+TTF8^B%qp=R+Mq-NDRAY@l8 %s3E-RQV$B%DT'<^(0uJp7>1h[#Hd4_AH6`UU"iO'7$`pm*N;DD6YOeGgY %?uKer1?kcTK#m4M%$YC?Q)LR)ibSg9J#X?(g=8hfa7d-'H"g:tn`PO\L^h7b %=Rb!jh.X\]@#`3"jX,OhE2ZkUA3^AcS&8AgLs+U^L55+_6U$O"nXX2T*X#$5m=oE]dio14%Usqt,'XuPiBND">DU$Wr2Pf(XWOuT %i0\ufb"oX5%O,cnD->:J:,bJY$:+iMlH3*\,]FS@&B"dMW7"1G=!+P`B=#*GHdMCEmuE` %).ELt>R*ZP6n/&u5of^dTWQY(>paJ@T"[(<^3!V;&G" %4BnD>/Wa6>8sXUhlK;598W!%!<;6H-7eOMLiN-_4E%(D,CPt%=ns'HBG`buMYd/H(GY/Jh?;Xa\ElO<1?V[%"6g6@:SGN%*&(R@O %EiQGP$*-gi#908V;s<,TCRaM5<69"Y+EftUV*GaFSA*W)0nQ?n9$&h[os#.W]PWEr1lBpjU#8GrXp:`d9CO!iI1fpYoV&aaG]5RG?ct,#r*d8'&RPiZknB!sNX\4U/U:V9l@H-CLW %@0G.s0<`X/&[g%<0QWX:\C%6c+:$f+\g.AZ5\k7CA@C;t&F-$8: %;*6Da9t_p9ps+$P*MuC/GB$kj&Gk)pL22$;jV^SDaL9A!BfKMq6O&q=ndcT^ZKnf!%E]u$_%L4W*o.f;B %SF(M]1gQcWV"r=Ia%(B]K[%e#*I18ABrhf2f6u@LSq6(joWU.W>3J0JfQ"c"I;oPL$8J7f]AlUfn4ch)7c7YpoW"NI'N@>+.8dT4 %*2bB&e(D,ZW$Ic>Kq1+i7<*j!N;G6=5i6;F$p3D5)EB3^N36m %ATbK/q?8+t'.2-V,U]ij\r[0R_Sb+tYAggFK?4_@*0'^63lo]PhWa",(Lp'3dW<^GKp7S9=\Ooi4"R,C:)UhBjc7s0MaN:tRb?"7 %)6el+GC/YRbaX5lfaAalE$+ZTqXj\CNK*?2\,[uR!nW+J+Tf/_Ac]+P@Mk3nqXn[8&(OCZ'\ge=0;eG- %3KZU+G$gd0-1S7HKtR?%4F0H+$&^7P!0HH%l3BA9*:0)>B[-qtf^&H,Z_-DQ7E`!4kRpkq*m9Vj"!,mX5IP;ISs/g%lK'`U?g`CZ %?9BhTRRD0AeCL6;&$PDHP8QMp7"5p`?fFu'KBNCfPU9h7G1bT:pAB/V;+)E9k0]EF6U8l6k.Z]'A_Z;)2N%GI7bY-Ag'S#JREH[`-XoZd=h/uW'NeN"*F\SXLlL]kZVWcQ,5m(R$^ %fMiTif"KjJMr,DTQbQ:tZW6GDj;]4/dn'0/ZMge\fMt>jdZAYboj[W-#D@(dV:4I$gRZ?<;I('Qp %979tLSs.%A#bq$43?Zpt/$_)EQ2*1KR0O,))j<*56XbQRa]GhTml\rgOh:iSbjrp %?dTO9c0Nbt>1HG!@e]CoV)O..!UY)Q'i]inp`pB$i96!aqtQDZ%@KYn0*@OgXe%uF.D;Cap`1" %a+H;E)2[T/O*\)3&?j^dot_N8?1gK%F`,Y*kGn`=Whk7i0`GUPjEOSiP=ZF]uW'T$Yaffc@rL'"$, %XD(=Z'\(a]<0ms8i_fE"6KI!D]2>oV\KrH->`_6c7@&1LX']kC.'CXqB\;Q&(W!50Q,hTcY(^"]_TaicTup*[a$;C3"."\AQD:UV %NqV^7%M.Pt"k^s:5]`^n.PZfc*AY.>er,eYrVKXbcg3d=c/mib>2gT'do@rF=`Q;q)>Yd1qm@p[$L&=DHCn4B9'._3H8uXBDN$cK %,+ej1q,-`?o,HlVol?o6[V5-g/XQ/HOG1niWH=Fl-X3^]U)A^'$3)6[*Y\%#"ps4Lr8mQ4sJg4Nt&R[2s$rR %it.=`4uN_c+7+N]51333/[o`I2=MmN"Zp@U5\-V@Hp5YQ<-Msc[&hP88J&]8js-BSMNo;(D9/^'pnF7=h;WO]I=+hKS/:`]OTm6l %'VTNV$1[modd9]P`2s_*19P3he^h>D@;(f/;0]kJ$F5sX\.q4 %=#$g_%]+H`L'nra>2^5Dd&GsPMP6Ra#sE"rF+d`a223!UWRusZAa$+ScU5@?7\<%:iB49's*[9Y8c:1PNn*-"-0d2+)n_qI!3@Mm %prp1L=DjSg%K5(gSC8b`,`_YBdW?>QA`TE0,]CW"fbu2_+&s$+M:&fJ!-,oX(&nrO1[?[#J5t:q3Z8hsCPV;+OF:,c8YCpT*C%utQ/%.>6AD+"VZYQ`)TKgE'QLsa&8TQ/csI&m\raXX)H;8pt,%nlF&[a:%U4l"812&hJ6G-GXl>YF#P,Ie%C&rWnq.hj*r9mfqJP>HG[c %`+cIK/:(R3dL6i;_SK&+Et;'Ahd#q@L0Udq'N\?jOj\9K^.[j6$<-*WH$FXq4d_sro&CohGnNhGrbg6un+/D*]N?=h;o09KUn(^B %R/Qt#A\k#r&melr-4>pc?AQg!>5Zfkb\'Rm&7f\^5g/VuD0rWlg[Y!NQ'"np)&7*mhP)Vk;[>Zl1^JGp2DQ'cclgs+rgp%?8F@Bo %G?91umH5lae;f=))RYTG9^36+>LjCbT1A0`]X^(\=2*#[pD*UuU(>+@h:Dm9"scO=BfHid%V&%R"5C8;@:V^P('XM=5I2n"M>#[= %VDBQnI(+t`KZ3MV>uk[XDX=/+Sc.o6[p.h^iTsEY4i9"UCgXfq%:r]G3/Zu@E/A0NDgh4']>>sh %%VP)E.;>d/,![anfZ<2?,`m;W\L2C8YEQE#@4%gJp8af=Z_$1Ckg7I90[Xa\ORP5]`7(U][3!RMs2V2b#*5fqJj^"Fac1c7^,:'%G@=WlMq>!?HAsF;U %o4*SYp/n[W0W5TqQfAcbO`*KP:ehg8);!`;X&?eiaoZ0W7Tnp\b:%^8__TC6AQVFTkmYa['&.^o'H*364,pJ'14U:/;9#&5).ch\ %EDYe)9j2gNZK5M8"b.OOX"0U9L.:+@[]*pLEnR`+'/>_YiRpaPD)'>n`=b %Y"Y#C_7^t7AV.uSCcS3W8l"u_-%?PS0AP,L\c^'l.fdZr>m3`C&Q>]!oHV'5KfGU=]EmY@M[XLhG#Ndu+q28;%kgSb %KuXG;YWYeq`-<\)0"5Pgm#%E9.i^XG((5gLE,bR=M"lV>H#p3Zg9teC;)a4VI+2,:&_TkM%$SO/Ntr^(k$=+EN68n%!g#:"+(a`IO:fMDk0H^iae2\JG'p?RWi[D=DPPb/dumT+ %+;.,>7e'^)^3/]*H5(jSdkd$!&kaL"'c'CmIjOPd!-q2aaCp#2N(>-MRbsnX=!0;f+7d^&F@AKM%+M2<@e8cP5Z=DR/[?u/h[t(u4UP(6([SZ? %4j]k8?%BbXrfE!V3;`MgKY?e,>gSAA"MQlD"N*PFkKD@,ddNX./['\0kC\@Q-Rs"9*ZqG4Ek\1^FURTeIVLqc`7XnkH]]&R8cB7AcDAd6Q&!#DPogQ\Ycl4btFEH=G7aj0XNQAr_nn+#[)6\*\6M2PhO)2'cKg.+29t[\&LF105q3bjXXNB %Zr]"jaB4'$.8%a?m)S\FJmGNHYmq_&HM.a45Zf!PX^iIH=>$e]qH1L*WOBo0`hiFEYRX?<.6'7h#HGbGJ1W/7!0Ie@3>@aGkGM5P %dPRsHMKRt[*ipRk>?FD@Wn`K!J%\(F=7n%3+D-248b5R2R]hP?qSHVOA6j<\Rg0:h:MCgVdjV:"3EG;f;6mA^?'bIDiVi/uB?10d %SEEa!HZDI"Mq0D5&#uO=nHmQ'T]64&U4UZ?N8Q %QX)6+P6^XF32@$j]*rO>5@4!Y3lnN+eEOVNK2Z-:bJG$7UXC>`DI9eXPae,-NcLo4,Z:do0qK(#OY)cbPV/0i4?fB2WXLbqg%iMV %cK)Hd>As7@Go,mocUtgqJm9BQYCLkTPQ.!QE,DL&=GSJ0SF.G+d3H\KbSJJS0RqF-N-;i+ES %m#(pJ3()tL&'g9J?JudbP)D*5dK0+9'g=kiHh[dsBm;Hu+(Q&6-> %N>NdR+Y\7SRe'r"[g>$'EXL#kmY9G.$HuU$Q)>";i-%jqC.We\/2U!IBODC@4*D5Tpdkm-i(=Jm?nVVi %Esi6_N"L/%F=Y_Rh<`;aW4H-.e%C;nJB*)_ %_3V^(ZV$3;k?i@Iq!1'u^9m6uX8PlHbr6hSUf?aUXV=m%)#t8`a+I+\qS?KBZ.:p!BNG$liMM8SRdhlAi1RkDn1b@8ZAp`L$A[#lP^ncu,-_o#f'hKFrrE+J-Tn-(\Y6Cpa %Tn0KJH^aR0%?-I0$D%]?@,&J&E&>N$7*.r)a8ug0)K;2/mo=&Z6@S,6Kq,`n9r+F^FGp$thD/bo'n`qn0]GO1!9,tJ"&cV\UK"?` %Yl0[Z[HJBQ/U)^.k`;[@S[udhA3O;_(9!Tl<8/*7+2ec+:7?9_dUh\ZjmuK]-j*3"U.f:69KFj$u_t""a7E=,+k[D$r-1j %;$7FtFZadS@s2e%"fg17II,:Gn6I&1h#^%.qR+$%(+A:rfD3oJ9OdK&atohCY,e@bjU$^=`V-<95ao4>FUO;W=5PY.r>@:CPHf?rl+@+kO[U1:Oi0*5Ps3Ms*t$Os6[#hmdL/2hu:HKJ+i@1_r(CN62m'to7oR.e^&a>fAG;SrjI7PrGR1H8q>gmDk$^o %0E0/nQ[a/XiW$V`s7on!p:l"P5Q9!rgL&jf^\IDIfI)7f>^X'UrTBBMBH]24q"t#-?7P1UA0JoVHMm^.%lU$Zof!sgN6>rHih6dg %f]qMq,^DhhZ>Fm#,S3+5%7JbN!mu!>X?Io1V-18/b8+,ALjhNQ*5pEX)h8a6WRKS6cG<;>Q&W;Q\1B[T]*cY`!6-*"R/hOk2_BBS %7-MH]of/*f#,%(f8'iLQd$\[hg-\nXDs(^P!!qhJca%"e,W\+=;NoG(V0qMd5KLW=`8(N6/N0RW*6aea5'T)dV:AF*cQKuEo'*gi %XDLDg4?T`176WaupJ&>?,/JiGShD`KKpK*^TMA@MdIuQm9[6e(-Gh[#-n%d!KAN`*Z@AN5M-"1-'67, %XNl/m0sT;]pbDn'FMHgS1e6j,8b*]jQ/3B9B4\g4_I8FjQT)NUk6"+*a7.q95DMXYW.8[9)a?o#%_m$rTeI0.]`R&>gEqc1:URdF %V[??s7+HoWUH@$JG8k=/S9N'*B6DcS.rZgdS:K,>o#ET]R=J^U0qD^t:#7QT_+;X`1(M@WF-^ %dd!FP;?.KF2\$\g66>?Kg:CV%(W>I/(Fok%K'4(LX1Ms?6QJ.:mHR%(ZB)9i??`W.01ShtIN,lBk?`?2kT]c]gKRkt>^"7kL %__i="e(@Z=oqg9DfnoWa]Ar"Of57L(qdNZ_WGpjuXF,_3"]RL%etWO8Z?p,a1XVb1%G]Bg9H)LX(Mb<5L<.q*\!uRl,MKHCanlAC %!S4R[M?_AI]i,5KT:Zo&#BAY?D6:>(LH:7)R,U68"C#$n-o(KSk;fj*c0P!",l++o!L00o:267*I?.mtcQ_3HNnD4a0nF2Uj'%OuJcak:c8HR(ek>nC7`">Bjp%@/n^LtZ1.\:p>p]E9O%D%?djQ"a\Z!.[p;ibjhH^+6K?gEY! %D9k:'p\F4"c[RoLds!>>]/`\%mdcOV!26tGAG?qclpMWMJKj&!LB.'E]a1T'L[#@Z6C0Id@/fsIfd&?97o6@?m"YCkUh5@[JkXDl %SN+d.\U$5XLHs-["4FYd;B$LG:?-Vt?EHjHR9#Q_"A_+Id!8edo"dVZ3$e(SCM7t]+AH"Qm5J9q9-b3Kog]I=6piX\r^ek>D2U;& %hknYl"`4utD5\<@-l%]geue\$GnLL1$:>^fFpMam),4fN[pIYrKrIF4[?t=i(R7F5^66`LDnTWQ7\VLTLjh?#1!.ss$1aDJ\4(CQ %`_IKH:YS<[?\`X-1WtKEDS&0BXi&\[.maut.Cm>'NSZA`'kHprV+TW$AVd8Y'UKr!%#A^jTK`q,kL1Gj"Qb3Tglbcl+c8PsWK1Me*"iS-q7*0XAZ %ml`^&Ao.)=,WX&3feHl=#E%BDGa=l"jrA''?T06ZdmXEtpMlr.'U40F\(rPjfB[C>:;q^nS8a$Am*W+"+Mj[dA %pdF&B*'+h7U,@!D2o4EeKI?`^8\):_?LP*bZ@LPTY;X!-Du?6c#X(8kU*K"71%9:/:^;Y=G!E9d.5%[DS07o8+ %XGA9X4X9BH$ll?@%VC,[-T;^K3Zt5Qc1f]n9":-jg"(9(!P]tcQGp;n\"T5GUp^2d'/o^QrfT=M+YXtrL_/)Q.9!^[\K8ghV4#?f1^arma""k%$W'*a7/Z/iFI)D16;l\2j6eDEp5]T?pJSCXG0^tbL45/h,Qf`Q[jj)09Lt?]j9uJ&*Q\ho-dUVF]hHHKq!Il-`a1M#Cu[*QDR;TAR6!X1"arT-t!4!?Oe`!kT-2T %E8'.B%MWopL\Na%L9ccgl9GQ(1fr!Z]SN&?$ULQn?eBYh?lt$Do]VUH#NA/\_S]*%:8I;qMg/h=gSLh)''DI/DZnIJI:)8k(Af>0 %WgVu*N`%,ABU_`pb.P@R]V1sse@"(Hl:`J[B:eJ%_)Rj.Je?1-n!\8;H6fi5jb@.tPGN %/a@20_/)/h$PB>ud8WZa,X6Fe2\")VA"`BQ"8iIHE9JGVpS#JN>mM/L_?'i\R/QG]r3-mffqM!h,gQ"sV2P %aD\C;B5%W,n$;L%(;F(jY4@85bpAC>R+K>7(afZ:\&k,W%O/3HAQ;".G*VgVC"Ad\K%'WD;?o$U6_8GYn8fjECr"PNQkGkHbD-OL %5Nj+Aao7K7WoXeF%_q'L,"Tph:'9_9Eg)Hlm8E]I[R@J[Q"BHFNjK38Nn2N/:3#TFFnL(mA,U@H7cPf'^"kE&MeV,%a("W,&k2@3 %+"O?a*C@QKM/\+_D5t'BRk*Pe747XdQUU5V-!d*]7"^nR;OIlqbV3/G9:Qf]8rEc(U4Y@#E^Fuk, %Ms?m6+k:/49'+cYN0o]V(jk2;JW3BHmGZVa/10iupu[)Y>?\rA'<9$qa4[J>W.L3:4*Uu^cGgWC%(+jPJ._5g/`9I`_3ru-M']f* %o%'JAihQFrG+oV\Rb+!JUc*gmrmSPe` %0nVi9#]RI"O1c0#G0o[]@!_UEFJ;GpLT8IIGlK4?A*]!^j9.H4YseogJ%"R6>t50f^[$P..*8"7Z"]0BZu=>( %%@?r\)PJVALmIN$g*Hg028f06`VEne&8s$I;0G9H68\bRa]--1)A$'/>UE#iB#26!8nUF26$h^.$+)H*q%UGWNnab4[^fhc46Y&mI;2Lkb[UI? %>lGb87m6`>*1?49j7@!T_@T1-X,"m6BKK`9hKeIiLlJK1:!sHk>nJ^O=6:3oFQ2-"Ln.'sQm$=%#`N\-&^e*_nVJ$$!*D86iUM<%$f758c*Si[&1"5'%(X3TJfK4Xa/0UN=JMY[+P^n%r]aNL%QL@`"NBWZWIhn[?q5p)41SF@LE"O"`DJMe<'B %h()JenOb1S-?BghMDj#B,K-^,i,:0&\WL%baD,s7"H7U0BBD(jJo;9Ha6p%/AI-MG+L`I,IEKG+W(sas.Ze=;M]?a^2TZ8rP"s1u %;MXEl.^24+lmOR4`$&oEWeqoLn60W2O2C>*k5-5.R-;1[5f`MdMUc_7m\(-50eYNFK2Wb/Xh)jg<*9))Vd-#\Sb.YajS%)4- %RHBq;U$jpCTilF-ZlIM8'Of6jcHr'/QdGlS+1Su$*MmV6&gU]F&u?3UF&4t]jbhUB>h+9Lnm)7?pX"hJ:ZHEeSA&S"#fXF_JBUV]PS"T"OKTh!1%80)NA`q+C9.>Vl(0Bk7TC+.!&QEA?D%4ZDU^d=r_7FZ!3m@ %=^e*3^-r1k7?-frqeS.27TbC.@,X(<`,`..Ua9qR7UV!Vp9qP=LLUuX;4fTl>'3(Z$Z(i\lES8i0sOB67uQ\Gr*I-MXW[N[:_c/G %'V].AOND4oW^5hVAF#3$'Gplmmd;[6f0/pBs;Ot7>`M[.U<\&)1] %5Z/$!CVOL!2UM.qd)JY#N*`&F@qXAh_,?u7F$+ekO9N'N#D>"0/&V]4E@bsC9nn!:&]KDD)`llRrI0p"@lQ@eAJt[`$f[#H`Za>j %=;$6G`:R4e(*^&+NXlSWFtCuWD8&-0?.X]H;"/!FfUDB+9el4)@'2^PRqA-D87(j<03U+2.I-G)q3ag;g3q/)A$t*-N=pn\$4L^NCc)-Z? %3*hb!H;pu_V[rnIdehH6S9(\4^1lfhg-hb%&!&jH/bFgp,Hp$DWtQYNpbAeU7dR3>J*MPb8rLiLGj7g+5egSO2Q/N.-1K,9(h=0@ %2^c84nW8q$iPk<9#6VsSeXZ5>J@Y'j3IXX9C.J?$)pG0Ae@rJq(7dc-C %hP4q3N"Kl<%m?J_+L[QqL^n*+;KVIWa^QdaifZL94N>6"aZt)s/J5aB/]G.OYPZ%Ir08_/0&N&HBE?9ekhOKr@'@t<#[OA6Eb/!In"jD)Z8b*USTTHC_Hb+d;FhlWoOsZ<(rs3s# %b8l*637^C#=^qu>fHmWM?'Q%Pq_`.dYnQes9.M,#a#uNFZ2u %,Ee>l"W%8./\P(Lb/&I0EUk\"*EKa2+V1B.i-u%"T,Q/[OXh5W]'ln.H+q0UXN.aun.DEb, %]W\Vj,UY@h=',CO*[rOSU %5\6!k1'grrUs\;8=G]j,Gs)/Fj%'k7^t`*tR\a*e+sNt3`-2SI:aOZNme[N<5c*2VFr]eu %//"R#lR[5re.dhIY'=]m?W)PAGp)3`cMkR_!1&5rHV$]51@[jC>mgFIG1 %;O]sqpTq!_;KQ-t\o&r[XRA.uaB.oS06T(2WMC#Klm)Ig'1[<;aIB/-"k::S(LGlO".VZ9CrZ%gs0CP+=A_I*L*kb6'T;K:=J]g; %U(MJK!KW`K/k,')f^T0#/'Y.?P)`gQWh-:?Kf0[8K?+!Sdk42gQ,I3Vi"f6&Q(%P-Y`HTN2a2H,FDH%^XZbt[SA[P@)PpY&I3e9P %0GDoSkiJa#9C#B:ZhG>?=Wg5.mLe<\pP>ZlYP\=C,;g^u!E("U83]OL,@k/2Jj9aDDb``n&RbnggS*tUCO.DtL/u?-V_a1U!Jj;Y %3"RWD*DE/nR[2/o\*8b4hQlP%JLYAp0PF6E;(&1uK1H\GiMSS9I%!h4m8aF %2\?qkUnq#q,8Nh!7!srWSe8t]L%$s8lqQEGWIXgeH*q"F+B)TZW"CB,.-4Ge)ItC)$3]*(S(KCb$CUprP>(/kqfgpe_!rh.r>#TN %I(21(POc&\DZ&?E3UQRF'kP;maSQD&6$Mj!PZn=\_<\l'0p.PY+).o/3_8*>@5r1(i6'mE[3X)[n7b*9)DK+Z3oQbsP[ImD#>N.= %Kt$,*;`J4%%*L-Qda$N#]SgYmtC@=>H61I0sP'b[itD?2[@$J>D3UK/o6!-op*G4@H"Fgl_j#>V\)PQLq^:Ajb8:.jC)O %MB)XrN<6=OaV6Dp!Xn(NT-l87gRpaESl^1ad*\iQD+gZrc`&:9^Lc1SOjGh"kFOc@4;Q6=TB)"q'CT#Mj+#mgf\;:I$/jP]Sen8u %\++5-RU/tk_dnTfO;[2!QA6\p#@sa"m^=8.O9(a<5%!sZ_%(d]U=T4!Ia>647-mf%for_lIb!o%k?>r]ZWs*Q'k9c\3^I;cCfrOb %Xh6WtVef;%0[AHH^U\Bdd:8L>l\^s;<]nH\5jF6/12s1p\.>R(!8_KP\D?+)Gm#$uSX.d0hRsAk][Q6r:q(UJIZc5aqW0GG/l_7r %*:"Hbng!*djE>2+4lZ3k/mGhIc3Q_k,'k2j %(u^mnc4]6UMY6\C12:;63J;s%(:%rE=KS0W*;B6GV]4#7"O+:ha:O^$.F8J?=p9t!O!Q>p;OUfo\C\rIWC17N`99I*(j-Jqkk*C2 %rk5H`F1F4'1]AY&WKN`4$qZBjnId(kcEC&Bis?=kePnJ6dFL7=IUVi*;T.kjWa'EG;?qOIY:uR+A)X;t17mkL,@DiYVB?[GO*Ji" %5a^E[TQ$Rb@tq=aobeAC/Tq!4@(C&O:F>]^^+oT>4b>ddM&J/0%p,MV@)r3C?]C`r%h*,Rop)^tcN2[8"]V4fMGI,&WeGI`7-Qg,K_DBQM1/\:nYS7t@d53'qWaL3Zt4p!>k/aEL6"2< %.noe[7]%4MRcBnuJuRdCAooE+&i$8a#]2sNn%==PRB>@NAR)-N@8hun+bk9XI"rKASqo7s$2JFPX)2PcL]Ohns!1`]5mAs((?uXa %8/Z[<6Iq,HP'JW!S:/`-Dq[Pq^PRVfZ[cMWcFcb[jq],81Q[mhORC8n<,gF^4!fNm%7',6h.%]JYd=_-VF;9Gu>Knn^,S %?+_U64AAQrfF%nr8Zmd?:Z"4d/shO.h>f#YQLRNd;T5)WRM#HuAFXKTj;-\bZ'>eRf04[&9n-W7AJMJc?-hd/[ %.Q-<(^NI`;TgUrVfm#f3P+:e"F0M7K[14UA<=qi03m$6*Uu.We=M65[M;TR'm_Z`%o?Q"gU$1C%BEEN->8'u_hH#=68prXs(7glD %,a9,V;<7'eE#llM"[2ng#V@W+B>;V!Ts-PT-8*Qroh[%Vap#hAC0h)2-;#QJ;/mYQgtB*9"2WP0Q:%eiTHhG&Q3,TjpbpZ6TUbP=M\_0k-XKCC\/7+E:Lt(kbNh!6qP)"jo %#+C]+]R<'B9ZilO"n:_DAoR.!4(d %S1]X0Te=YP'H#&C.!^<;?0D^d,`=*pmdiK>o&-]Gf@na%7@eTj&qgE#Do+D/K(KgRc^RIF!o1"1O)/ZqQqLrj3S"K0Cn_]mfsUmm %8\Efc#Je7>MO4'q>:8rJh?.lH"kY*\chkqXIN5Uk98$%V>(FaFhK#+e20t=DkSkas?-ml%VCSWlbM\f;Mi7?u[NIcK04XiVHKW2I %#kB,HT%PihaKYHY&mHV&$E6eqLp7#\'H3luY=E]X.$(2EG-!>P2YDFM+Kmb*@te^qMHgY`\ncrB^`N[2!iScFYV?3c.ZEDKcf![. %WKi=1C,rBAaOtlH6eU5+hDP3u]G.]=(i5*3'$N[`9E]\L:>*VD3g"Z68e$&j.L_k7f)I6'=b=DUWHf$=1]Ys)3%dMR_chNW6J+7( %4a/pu&&71%>4s!PfF8!@3Z8oN1tg?XnXU49MGL]/,(@k"1<'T`8>NsfI/`d=VF.(c+UPk<:P$*Y(#dgVU5>s+JjY??YRLpu6u0#S %@6VH_L+:_CD&pT2r?RfalAA.Yd0ob8kS9CXjS2kK@ltfpO_E#pO(!X^ofcB;"je0$2BVR3]#TO6BS-b?/0G5RZOMi<=fEL- %";M5fa=\c,>5pc`F5U%EM!&`PL(i$%>O[HCUo),o?#$F=O6J!if8kE7`bTS9B4(s;j-A*%4#l@MagQEeXl?iLL.rbpae#,3p\j>F %h5)=@W5*CP'leu)mYIO^'eukGjhqE!CZMY:V,5aB/_r%M:;C@XT2."UjU>-cne$WiH)%uJ/H@R@IZdBWUT#s>dVNqcQu6oMh7mLT9WjA6gTB*F>ha$u_1"A?Qf1T,&GR$%%Yt.R %[4@a9D5^]GU^hR-b7^i:Iku(pAG8q@O]K1bljS\E$&'7YNSd5aS'3/F#b6]&=S)Ci5%8'(ggVc\G)3fPGptP6iNO_38p$-t?YpZ2 %:66b2m@<-q+9q^;Pd+e@:l/NfNGT?POAJ.YD'W0=l[O?[EXHj0Cm)[F_d^_>^VqL4WY5LZoAIl$j/gF[S!Zmjm)XGib5A_crZmo" %7qYd'Z_ZeM&_]%Eqdj.RnI]_:H\m-TqE8J]5W[V-A<8Z@c\o1FBSLC'LH=&i-N?'eYB]r78g!E"6)uPsT-V0^i$`k?a^d1-s$/]# %<\1rF4jE-Lld'8bXZTT6h=rS+TphJ9'fR7QeM88CAMMlr5k"Yd""\sd*il9e*%MrIK*,dYDEj"&n=NI(+q/l%0AM %]OHS9,a*jiR"'S@M=dkbct>i`PcJSUfkBuUQ;eb_KcNFHNg>&4:BTY9DF(-_MTo1J>s)#X@k-X8WR;=#nZH,i1\LS"V:*=="rU(=[8s+gLO^KLCMfL6VUm6iWRs-"s]o_H)HR&<$F:r81<,aQm+=i_AP@"8",/!Uj\k,sYRr/%0%qsJn1 %Oi%C/@haeOU5A=j*N8F*q!l\=UgQ)G@Qgm"ZMVFeQ65J$-;O1o2_F:k)%kVP5>PXX]O.5XWuc=O-sFj#M7Uc:JZeg81m3#`I]rk9 %;HB]Qpu/>7Is%Fa=V`[d*JBF\Qf%@hNFDdgg])K#fSWdLG:BGb[+kPIB2f$i9=Ka3o*e_:o/)rC!)U//fDMPl0^"6Y>25^=@fbZLgF=\,s.s3M<:M:eNm8-:Fd2)%sB3&r%WmA(N8\a9WR.mUl!hM[cn!3MDOEHQ@3CEH\ %%DgZFIK8]j:RQ[_OgQturdKRrf`N55$pm91A*3feFj0N#2tAqr6!+o;_*^BAp?T`c4`#tqI`Z\b6kW5P)S8n3ekdQQ&k76%s01?4 %n2LB2YMLEfY=7NBn*\!co<^D*q/6KKS0P5N0iU6<`^B@12X1*@5c@+,gFt`.PKf75`^d<5*6A"sQ(.OHBRbF:hM:JtB"#r7lu8e+ %ba'+84\WATVdV)#MV/(k61AhC,Dp(P_e\t5lP0FMF+rH4I9h4`)r=&/e[j`"U<`]uc%Q %&"9KPr>ZX,UDY:J&(,SGck_trkXKXVKVBi^FCsKG8&RU&MN&&!d/s"33NdiO1If7TYh'*5.!AiR@A`!F4JWbmP[aho(gWY&dI@c1 %[*>CQ4r6bF5fD@eWhB*M48a0S8VDUE`\8qNnB5g"r8UQJ0BVlF-b^SDYJr_j9@XWHE%.E>.BHRlFAjqMIB%m3QL;G/b6\/pKI45l %?.D^g&oR_n=o-tSME)qq`7rd*]tt^NJ)J&<%UOt7hS,t20SSe!SD&7t6ati8K&aMKQCkoQh9N;X%*.e2_S1QYm/"++:t<*&D?N4+d-hL:nS:&u&$X!k$S06gI:8?mp;4'ZdE$mCX;iZ6 %pQo9l`YRh-4c4IU9E24Mu+2Z=4nU0Pm[6:^"[^lX)!7>Q;\'^KdY>Qh8J_s*CHSi8T6>_7d*@n\*bZ %Bco0Z'28D\4--hLP^hcEs&)1.'dMS!UrGS"]hnK'Pk=D8m@E3h;gaYAq]1d24s??;\Dd%H'6=r?ZuEE[%a+gpVF>goWJ'3s8?lV %[t"(OO$C^1Z_9CmY/;p6Gie@k--471?eG+V=7*cN_Y%8]>@u`XJ,D17B+Qs?[k&:%'X&qC@-4A2$Lc3FT45&9_.uh)4<8[a$q_:o %,@?Sm6q98NBK].W>C?4'?91YRPU^K\B'`BLjqLh^HKd58lBt4-G-7[&I[?!QL0Na#5;^iP0i\TuFWuD5e<\&$9O:&O0-+2JV[)A3 %(kGi;UN@\d_0mt-JM)R7]%=p09EKJP=nh0gK@9i(#*[>'*;f^nXHs+c&YEn %o]TReZdAm:"06B/bE]hTdOVn/0))L[8Lp2A$iZZHU%Z1 %]$t:WUJ[f]AR(+/lAGO/jP1$bRKn+>!G*Zk<7ZOn*l=+gn,"nAM#cQa4;T&fbAoaZF,UM9JihKJi5--9=^E.fAa[?d-tm(CR&)$Y"XaT)``A5` %9:kSJ!h"&PE3K&$`t]o]cd4J&AQSJP2MLM8)Th2!0C*qIa<4nA?Ylp1Ld*]r:VqU)5ZD`NMer4=hZI^bPi*]Z>/jsMp6Y*=J@nPF %_6\D=qk#'Z1agA/rINVfM3G8W,[2OD:&:ADfE'/c+ss$77gcAB;`-+TU9TL9oqcP0j1TjP&&e@DgWak-6f2s%$%V)#A$i'>%QJJn %E3khp["(/DDME%+C&-/b&;Qb0%r'`p=D_i_ltG\GPC#IY=Bl'_Cj9c^1r9!Wh^;/!%SWWbW=EG'#LeQ=tCE?@)R8TPdW;ik5Ok %T:'sdH#)!%H>bC@bT`B$VZiL._(-(9T096RqHL_&JBjs>,_caS$6XiR/\RH'k"1/#,":]#d1Gaje(dBOEL)Fur1mQV:4^lsW0d;W %f#tRffao%%`ZSijZs9;_>YC?^O]UUR"7_?JTkJ*FR??aoBrJ@.n[KGo-XMV\FaVR;Mp";u[4">M/BdlJJWbf+a+krrI`c9j@aG7H %_i"(#>(ErLL1TT8@L]XkhJ)_G:iMah/^+\sMU-5mFV3_H0asl0[Z&8Ra1e'1cL%8:45niMAY@q!"]E2C&ZR+TNF2c,^gg6e1HkrN?9'DJ/[s(1o7-qk``'8[^"!$!;MZk2pX_s9V\=2Wg,4aekQ?:U$k9tMOR %.dH%eB9WcS;n+#4,7fo#p=0:&Z(X!!4Oq6e(T=77?42Sa3>A"_,e!$e`JG:6[,p%D0)8>+9&.HSZuX:?.]B"XJshJ_D,?r(dLi+$ %)8E[-Jmk*O&#Hu_=3HM/=>f?afUmK8XRD;4QVO?e#-b@X/'eV?Tm,AS1b,)&/mjEfN$K+QYfhJgpDaF16BoC4^keITO84Itq4Hs,1Iba%RIYaW_YAI'LtR8+)SPJg"E %%sDLpRRef*.$-+PbfFiG7Js4)Z.BK(ggn2lJ1qNF0k_:\I\/sPm0MOijAO6>G8h^HV2i,+ktId[_"r[#5XLN\Q#*$%FqFj\Am:4'QMk_YP2l<5@SB^n?;6IcrJ!q,u=[aDF-:K_&X[2Q[7L*=*>;I!.2?VjrYJPg;CjK\,l!-MSq0)[Gd;9;)96+\cER7 %@EH8Y+i.<,g"V7bgdn>+j<==&*3:HPE8]YK]`HO$h$tp#eRBfjpo2KFQ=]([pnVJkVqF%i[Nb+al92^TUoh)fQ0?9QDf7UEV5H!-I+8 %jmhS),G&J"3Kd\?3$%<]&T"gsNUEYuL\Wr\6UH%ree+e2mSU\n,g*Kk'g"\.Y7'Lo]C#F>=tM*W!mU/+R*,Ok(kmi1nA&ugUAXPdm>UPB8r+PH0id]Q>#5uo$G6GX<`nY=Sl7#:hm_Qn`.:I;Z\`rg&4],_=kr6(>O0"a %0;rAR]WSZa"98VgP/.93a,Yl?FrO"-@'-YW8p&0ehmE7*!rY'6@\*X[,&!<+acfQk`UP-aAW*"33fuN(S*L&T))9HJb/uhRCbY6ZW+Y`9);*+E%ak]M>s84#t0*Q#!]-#o=&M %\Z>kj25=RW,QNT1J6MkUT$>TTP4JqL4NWU2H^JlaW(doKA@d3mar"=FVkU.`;[Ai!^XKk#XT#rc[Y\^GflIs_6]tke`J07/.cbmYbbtJ+(H`fkYM2=kNfaSuN)0b*p9(nquO %A954`!V>6rBO>?u!Iknf(L@)t/s-E3Y'U>JeD+%ll%RdOgc'Z@K,k6hAd_-u&GIVt.75(q"COe5$m!_7UoJeM)>)YR5j`R62Qmoh %@XR'bpXQBbjYtf+U54b0>r=S-WI>_9U8@[+]mb6p4'Wu]gWF[S&crpT5]%ejYgrUAlV;nOZ-C4rPY;;_0eh'!^cHbi;etT)g'NJl %TF4edZc^GmIbWY^@OicfQfrT>VDP$!q,1OJ&"G'FeWir'!-`R"iUM9W(X7WJ#1:\TQLQ2HlQ@+2D`TVPJ^6gXUkImR:Y@h>B9!G7 %[YDd\eQ2I]I.a%$o*K_+7q0$"mb]ql^GF%O$,C@-N_4>]Oo"grR..MB%*'-q/t1OS:lbV=E/:_'SnA&EE<\A+/6? %lT23?_'d#[SDR:k9$3OZmb@0dEQqH[PjKkb/<+0f:,3\'GQ'T:_>JQQZbA5"pI:+iJud0cUQ %=fI=>4uO3uS)Vsll3a'Rrhi/UQ3PDCftfGUKGK\XDJJ@UDTI1*C?_,[e=`R9cR?1(nPZEklkG-KG/'4#1,Ud.c2*d!0kW2F(9#bL)::;\r %7lM=%'b+Apdj,F('+=^0Y&8P^0*W]3kYa)tB[PAWN&8*oCKXFHA.03r1R'J+O3qN8 %](BNi&=8LGCgf%_^+mkj%L3c/;3p=B1Rr`s__"JpPEaHgF,Lp./?C;Ik`l%926I?qQ^`Vl==>CiZ\1M5ZXsS7A]_R7!h!2HUt-AA?_;E](T"Y@si^>126@QRG8WAK/E?5,4@_\%XZ[#S7si$34+@BDlEU*aqNSUF_T6Xq]tpoHa`OeGT. %D-.W!UdX]KgHPIg?<,@.e+Gsc;<[jES2LeKAI_(1&P.6>V/K"fe9Xln7>^d>JpU_K9n2OB#LAQubH'.%Hn*5hO_(b#_%N9(e^rQW %Y=Ehm::]^"+dk]8ZD>MJ$ck*%\HQOJaDWW3eLE8?3d.g8_IC^24_kPs\V3([gUa9a(:R2X0.khV8mm@5>-5"\J=X6NGDeRd,50QA %d%(6'kTh=88Wg.+oth#35[RYi_*X=2'%\nHfGuaq&`:aoF4,H5RT^g;eV^%qNT"XKBWXPen693a4"eaI43tpIme$O@N!(s!FUgGb %Zem#K\XJ[CLk!>C@VW>A4(pB6KUp[Hm:[-C'Ihu=gq#6)JlKXGA4C"+,T<_nM"u)+6BVXHL9mc7.!Dg?o`aecirI*G:-=ZfXH0eJ %MS<_(Kn^W**UiT*ZM,l\4,,#b!PN[n"`9On<4cL>'p:`j&M(gAHQfA[%`)]HXHCX0=MuJ9`#;g5k)=*?fRp'4jK^7UQ?jEjHi]un %cU+jd0"DJn$rl"r87p[Gj9BeM=)iBX#u!6V6om/)P+P %b$a5;&<2#H(@SqgHH:alc"`%Mlo\JLJSkf!:a/H)Jtt`m?q+?KS#/+$.`N,82CZgI-V3es[YL-QkTZ,0Sd]BSGCd0Y>p)5tEGu]WNiR]Un?7i!^2djW]J2o(sRAEHE3nPu/WATP3"AQ-d9hXbC/d<4. %Q"X(IGVKWl.gW.O-Y&Li>d?15LZaoFlKG(%'lQ#%jJetQUMOI&UhO^mU1mDOrWidZ`#:jUr:$Z9.m9\cRU4I0/--Wbjlh:.bgMRb %0rh?'4aMObVdJH$N`'`8bnn"E4_i!*Rf4XX.Gu@D&n+m["HT!R!52Cccd):rhOW'T^6ur68h#%;.t"W1K*E_#.ljP80Pq*h?a>L\ %Nq8Vn/.QL<`.uupqJ\:5?Y0tKkOQ;?e6O'/A0P.3VuY*:,)b`G/!sG#/Z4se05#`Z;#:P\mFYa79=C?A:0fCO3t!LB1Z"<_'B.F\ %6;Jr)9P]YrX]H/RXIAa0T"?'4ks\rNCQ`A9$VT^dp,=dPak6P8laRcV9,&$@&U.J&VF7%3_Ql;uR2+L9qdS5rQ;=l$O?!EN;FWL,g2]"*LXHs4j- %ktF3`$)Y"BYO<-f"6F\?WUbJG!*mmg7o_g:QpeAF^Q=U@KsnR@fF\e$1=4=Z'kVW^(6G`=,`^/RJ_Y`#q6In3*>:3+\]n6R!1[gWA*S+46hU[&:7PAqAf0cj"mSW;o[K\0%8it-5 %getUkI*?Tu_#1PcKr(d_)j,=/k)4S(L)1cGO$R3OGPg/^r/!lL%M<tD#ET.Bs\Fu[,(XXhbX%sOD>'rWH)=]2ETb^0u[?!;e_ng"\o+_AXTViE:]&G0CtGWT%3ElsKn %hbH1O6HGlc;i6p7X\GmYlAA&sC[[h8[ToAWIAXEIbI(L!8*'lEGm677q#\WghuH61#rp2+XVL&g'VY;J@12+Pd`%Rm$MhN2fVl3a %CYbL#5,_P)ouT&OX?[:XrM9PLR:qT%HPF0!0M-RP-&Wh=i9kjEm54/\H5,"V]nSC'.uBk1Pjiqdr92_%<;3EEJ-oqM)T4K[g7$g]Cs+Lc`t@R/RX)7E(\F5$>X6aZ=`/FK]sZE16H^hbSep.?iKq1!TXV5"Ki$)s#M#W@A_rfB,Jh-LuW('ZGs1R8OeC]L-<,.&=i]?Ra4#fhL''MHL[ %PW's+'T'9);cZ-iP863q1b+TF#Z4CIROn`Oo?\rqB$O-Jr0l'NE`;H45*8[-m8D$=7R@+Zp5*D.dWJ$+i_u?SrEbjh'[9[XH>lEi %oR"^H\Xk+tPQXaY.:&<]m(*2Dl[c7!EP5[G4_q_4Z6a'XocBp9?.q$hS*aoMbb]Wh%RV'_=AA>IJLBA@>"Sm@[52C3]W4;?[=D>D %*.#:%96:UBN2Y;U'c$r[?s0D$B^.)<[UBiG?qHJ(elaiD$L03?@(qV_nNgW-H](Kq_.5Uq&sW85@FM %fHP!9ZXK-ed-,dPP1D\dTU!d.`b,XT48IBX+V`*pe2=\%n_L3TXfR1XOO@"fBPerKk4I$:OJ@DVd:l_-UW*b4=Njag^IFEA8FR\9 %P#2SnY3%8^7*B%2-cG.rm[r[+k2>M%Pjj*!`ska6LR_@R[5i;=*Nc"(!`A_\iM?EEk&ZJYjB,;[n.jO=qQh;Vt-J0i,@b)1iFglBd2!'q@Y6X)CD %67Q<".&t.NIN"ts".2`#]1)IVH:>V:MOq)NB"1EXdZW)uJrqMmlXESg@AJXH+'#ZNis3t\&aG9o7,&CcCN)-:&O_:@+.-1t1hkC9 %CpH/Vk5G?n'r(q(NXJZ)5U%+n/eo'6\WLii6+&oa/Had=f#@b@JQ0E,qMd+4.7Kp_RdarEJQ_EV3fS7j4kq]]:Y$\J^=g;-ONu2Bi@sD/ZNZU-,-R5/Ee@k9BGAlHACWnim:q.UE%(d3=Rk3 %j!1t%M$RJPA(P'l&7VfO)Ff@mM1LFgZrl4FU*(H"RrhEu-.Tn#pZT#hY$u,[)WjE)XTclf5'OSd+4N.\=em@@=O=u9=Z#jSM@s3ZK2sE>G(c/pGuFfD\A:M18OYX2]J5/( %Ap3FP.ZJsnXLZIjZ%B$?%s`*U)Bqc$$8U?h!JXMK6sp=p6SauR22EsqMFqJdb:GZ0CqM],7n^qbSV:-]F]uj?/]cg29:;A&Y`O'@ %s-q4\_j`nm`B[UX37";%P+ffiqN?Ve92]jB+@Wm&$7rP#-8>WR/)oj&J0m@J_)pj"``m$n^m7""\*Q*!;UJ]f1>OT];U.q&d\uFQ %A`\$)/^,\6.lPJTKm*)"!#=0)Uls78)QX6*5Xg]L!Xk^MkUfOq1WsUA!caG-4D4&4o'\.2r!9=$gKU1/6-&embmOpF-)fL[3*aRg %j#BST2ToC-9h@pJc#O'cr7 %=71>62$Ur(g4DT'k0gC0B7QVD3e(q2h[27HqI%$4J;mR+H;=ZMbkkS9'k=qoetWK4f\[_cTnS,i/L+07.LO\2%'$0&WWEX_aipo0 %.#/Fo@2pl:I[e868)1=@*B;7YId4Y!:3p# %@])\+U;6gH)p#T#J0d$F,>kPX!SU+:%3C`c1(ET)7)%P_VM#_9!kHq9?Qujj(!SHrbk;M](NK^K!DQnRRS+K/,s"P.^MS[/n7iW_ %biW4eRq@&7gbKDcgG#jg-IKIeYD-$aT4mJb.F07J+Y]lVRpurIXm$3@!]] %.5Een*@#(-h2[U?9C&.90q`W-r+pGO&;;e6bX[b9(?m#eJTG'pIq4OCj'&>3CuJ6^Z]1,0$YmHiM&a_"k)EVeO"R!L(!=\@]^O8`JU!TY3XZe8Zk=u8RlLn %i7V6kJ[pJqG,/f8mn)#A;j0&Y+P?oJAXX^I*#6aJisfh0C;ijQTQt?r94mDi`H7$8NiXd8Y6;:'fu]!'5S>S\]e75E[X&bWRZW_q %3MnY^59%X%FHseu]3SG.+T5L"H\TpDAl0%?2WA1)gJHiS3R#*!b-J5Y`0@hi0B]JB87H3PV5bTJe^h`>3&#mMD`M<"B1%G!@aVST %DMedVTJb1SEa=C1QOa=1dTHFbTh7T-KBS@`FD?Et7A^`_.H,l6p_WW!a>2B]au&QfL" %&MA`nknd"U(g*cQTZAe.'N\65,-\Q;:(*e15[88gHNoB\$1j2`i[/VJS8Y+G!2%K&=JLUJ!-./),DQMO0$UH9OTcssW:*k` %!ODM"@n`Wr5^$jg0/$pq(cakVM84gt^Q;0Fh?tH8e='=tB+7lf9T,^,ZM"tB'(C!#1Pb&F*L!b4ho=2!S6T]Jt;D*^*Z/"I_I2@!Xm+H_%bA>UjF-P@\6J(4pZ`)mA20o6lZ;QBX)en%s9jE5oJ5h6M"[W--KA)ki>\''.ONN?r:9d*WOt+eL&e\lPJo %cENh/RMc,As%@n/P"um,&PU*`0&>hKoG:,H?%s-Y^?_r2phF)Y]mALL8YrqAX=C;-l!9O"SHSi+Ukq[a@]hTE;HPoN\(7V#o>7e( %X]GT!i;O@%>#aI?"VOn0h3HU1X;\rp@=p-IZUXTi+V%sZ0rJoJ!RuA&9.po'qqKW:;?;]8L^s:\f9aUR?HE7A^k7>XC[D!al$U'F %V4q_#;+qYhKDDeh[EN)^rJlu:Al6s3m%21jP!cN12r;D/\WQ.`(5qY`0^3X*$La %!!.5$Mt"R$n-_Hh(mMNV?'H:!7\#05Z6eXc3WsY@B=sYD+ILC>'i_g,M8dR`=m'Ig>r7uNS0Tr/#^0*^0t#R%%a+i@KfNo6OCB)N %.kW@8]bkB'/A`%A'!gqoAn]iQH&""a:hJ;F6&UKQoTm/pW;39a/[8`O)GdtD`M)VL %'t%V(/cbjbg4:KmG#&6AlgpDQXb,iPOj$*'-,i_Ke-XHt!d3$Y&.a&HB8t.B\\$K>\DGjo0(uA[(79oeTunk:>CkL4\nK<&$J.FV %a+U^Q3.A026$#IcI'(I47&`.FcpgJdDl]ZgP?3X:VA)tl2!M2o/JYMVIqNb'&0'Df1Upok1bj1u'o6o>M53%VBCaFGE^e6u-t9^k %oc)h70sOD,T<K6]L,0T]*<9%C%E^`7%pVC6R&>&XTjX^)N/amHUV9(Qb5CUA7X %\Y.b%W8Pk9DJ.j0Y<*-)%AOtQk+'D,UG07LlAGE\=6%Ke;SaX]V._Q:f+"AYdgLPK+FqN!(%4mskEIRI-Q"$Np`m=gIN9`#W\!FBER#dq#_Rc]D&hoR[717f2eXCq?BuR[#"nR._lt^sEYk61CJpGsQcCJN*E>H%2bY88c)ZRi'OMSdC3Xb!O %O@.`:#G1DQQZa332NhgD-F(^7F/KLGE<\hD:6eTg4"i[__G$t'11*[eM(J^#=ES6W-d\)'(2t%e!(s95l2H6a?ZY/*Hsn=ab)9"W#c:"F/#Tu/.*3:n)h:%E*V$P=QN!m/3;Pu<:O0hnS;Gj4,d1Tdb_^>=%CY#aQ1k?I,RaS>(M@mc4Y#! %APnVc-5V]XoRoYUU0P_04fNC)h@:C*KgQ(rRd>`^7Oi5>8A]X\!L(C;h]_fn6ocE1T9HR=(rJA;^0J`C$?<0XUVU][%+uNQao/pS<=+b/8`skPZiXh.ouFq-.WGh%S-`L=hWf5V&cmgKl('GBOI;Pb/*@ZM=@mU.qfU2LhS`h0"OH. %h#eQGGj10B!@M17)ClGnS.[T@lhuns,.),o%Yh8%Lc-n%OrN_T1JIiXVCrkG8RpDbTWU#6%+R:=rR)K$>o-a75 %[b"V^OR"@C"u$tJUoRqT*'$C"jJ:W8_Hm9kWs]ZAXVg?!^9X9:<`9;m'kOBUR.FoFNiWMpG:#&LM&MaNp6dV;dEHT,[]"-!Pk)K@ %I%bTql&Ga+SP0bF3CA>:8(=j)4A0)9mElh)AjtdXcF'pX@^.*/ %Xl`Y@rAj'eED0oB>TL[RDd7:VC07mU6o#)LSf`L1#8?Rl4duFk9Oq\`Z+ZD/-0.&^aGEpR!qp14q]qa$bm6QNhL@ENJZ$LZ.gj7o\S(k %ab80'NT&)sD-Uf\.Qc;fk4LF,$ZX/,k\7?smZU:`CqVT.sqQidOMeM_N;CmZnZdQpL$ %X\.D@!]N'*b>*TtIks/>EQQGP#BT#UW*4c9V#Um]2G(nP]Ja;aU>2OkKN+ju/hT#3Kh37LN=e.%QHshk@r,\7,K_qR.SD.L&mpPrY,7CWP*VEmc3c.hCNt?q]Z;4'=I'<$7\N5`%t=R*93K`-D>!AbILpgRr+RF='GX^N9Lm!6]rJ<%b,DUtt/YRQ*Rm %cmHr2W%`k(lX#N?m$?;PYnnW9nkjpXB.PBERp$ZkeUYWD#>`KRZ44WRhQ^*][gNYPJd.E$91^?L907+@RKr[]A0jpI8Carp`B1=L %A33$ZeAK:_ZeiQNb42Q89L",lEfe-U:p*/*5uAFIRHC+i4DXR&Pql'.C,:Hb1:D/X6bPL[s4qWPWnl8`Zi#Fl3lFu+WlUs>iI]T1 %V?hnCgn]P'N?u\c\pM*U\R-o2cGFAT9&ZH-+#I6s<%NIM_GRTA1`]4Dl.&W!+p+=7=9J^#]'ttARAVKK2(?j^o(K*Znd.Z9n0(p_$ZLh %A5qA??Vs(iZ#L\N2M9Y^.tKR\W:63qb"A>?`mRV%c$J[&X*R./W3s7;JXZRl%Wnn''DV6DeM2XJ:/Ob"-H9WMWE1lm%M]BmlRG0* %:91k&mt@PkRTe)/JI3ob4Z?:(61%dkJ$fAS@c@GcGZ]/@n`8nSoqH2,-5BV27EcagA9L[G1r#1`%%9@\6*?l+4A@/,T>]]f[3"ZE %L3\S=)5gl'^(scT2&=@E+M=@IfQ7d*Erg?ZL8\Jq*M/IN\#<)%#d,uD!us-q^G;tJ+=5>[KBe#tWh@3#HoOt_jW516GQkUcA6lF^ %((Bk*p%4"D6/6Ya9'!7C:^W`?2"-GUC8RMM&CLE*L'ejOPVtnB7bMJAK4@Ah^!`(_RiYTVeS?_*X?kIk1(o5:c&qkpA>^%qDm7Zr %L?b\5Zs0!mLZi$@TXb?$kJ8@T3a+0NFecd9&f0&fGT3=>MCFa%>CA(`JG<'NASUf`O^]1b$etb(erGVlS@M0bbpCcBeV\mo'I/X' %^)a+Z!Y`T]FX\i(&SLV[VkDV5\g"6Xaj`55PuPT2c59OJVX%L%.QjP99qL^eRcFn8V"m>nX*Dn14-%N@7ku]3YNZu``@6G.##+SO %Co)_s;&V:]8QW@>Q_-D+Yo$GS_:1TdI!_Q4'39HQSqrOF3d7kh02qJ/'R8t0@+Q%m(Y-lqY[&bUV:nb^CuKlo*sJ<=a7#<_DlA3E %ObQ4,3N7cm#un9`(;e^qjMA]rKm%1=,ni6_J1[r?CKVSal4\fU;87$h2k>ZVkk7a7!_,mMZPmV''il5tlW.aDTOYTQj %e4@[._GO"f^?puK@^0uN6.@S[?!4Ep_hq;D-(+@`mpuh;Denj=1mPB3Xge'+]8)o^%9"'^Oq]uZ![mTH09WYiRP^^$"R)R<#&*Of %ZaWI#e47@i^Cbu3=aB_Q=A!`:p2*Z/8-.g5P"7YC8iD_]OdiERMjU0;>R\eb3%#$c"]3.3JN]lH"=!7E)F0JE(,X`LOI2^SB*gEq %Mf>Fqqic`2%-BJQ0^'30i@LFe/C'1XPsFT8bH*mQXU6rr#.XH!C."Ec@3hA=BJX[kki2X^]=DSlIDDgn"=hug\GrpE!>J%t[eJ?a %`OchWNuH)DmMc5p&s8ik$u8%#cXHOCCg)"/TXFnWY2'Fq_PjP=s$WKIYf/p3pa/oB>b#,Ge:SEc>9"qq*/*"\BH8feHX.V2l)N9l %Ya-l8^^&XIBK?8*FrF([*(L8K&N=SW-^Z0gdB0d@moCeJd_'H1W"H)$7gu[6oQ"bL949=Xt/=sfX-?.C-A(NWsQC*MPrlGM5 %bF%7)?6XQe:tZW.T:J/C;F2;\"SAtc1a`O2e1*kjiu4TCXnG7HQ'E`'l;>U1jD#OJU:H0f[\2NP1*,,DHUpCDf:(X3?;\WjAX^(; %LI`DC9"YBIJ;=:P>B/E-bgD1'P9!a#Le2k*Eh^/Qj!/:knL=79-o@j@i`T4NZ]QKS1UthT$.W7/%T(CX]H4Q %3UM3$9V.[I1tMo2o#OQ6e8OWn8,'O8OuR+H7m^[W"`6u?W$\g:OFq/m#U9teJe"WYhp\o.:GpBY/[-4;_D*E]RZOk=/Om(BP0aR. %#W5m-*VYJl5!;EFT_h'C=D;NN=,Ud]=[58A3E79WRZh#OVW]'^YaA6R/;6"S*_9rHlsbo(*#cBbM`_VD6'RqOu:W52AZ(J3<.Yu9D8m5^l]:11q28X,NC=Za&lkh*H&Kj+'j*u'luo`'l'TD$Q8-nDWCS@YXAN*cdR%?`+J.BVn#AC25#h?l/!_ef'Ymlm@9%;%`g6] %<\mmV0F5IC:,jOo)D$Ymr7J)8,2 %Y&odAr/Q=m5dgSt'2+1L])WJcBel&fEK5K:%H4NqqS]Cr!)Vm$1IO/@GuS8XZ99+pQ9TT`&,O-PD6_9-)f4*N,-IW$)EF1eY&KVU %`?&_OO8*P=KE3ErFL08aq6=*OH:O!!<+H^oOOGQX$t^Z:3'*6+(*OJ)[2#".$F'B+Qjkk2LZkh.YqgoZb %UQN89a[iLbUOC7,PXGeDTX$p7-TW$,fBA:VmrOI>SL0`Y6IlXGKMc>ca<#Ad<>PJdB+qGE1 %?6bd#5j)C]P:"`$a))*fn`2[aHhasXnXua?Mrp=SLW;R5sbN?M42h1c"iGZJUp/1Y7 %YHQ89\9iAunrqOXL\&,n#!Y*Iio597htt=ap$($&fd=I`1i8g)]fPHV&AG,.r,_h[T.BR,->rg*o3_M\D9aX-a%t*^&iD.^5ubd* %'XllRjV0lr@1TMF/c8g!#N/Y)F`$s7,PWfjAcSg%4oSC5rj778BK\c!CK:WON+Bb#%OM.">/0rVm:>bRaOS,;3]II7=uK`_fn>+l %Y9hN\>14SBdcP2J89YZfHWnAXN$R4dU$V,G(r[C29"2UTAgq.0lc!ojk9lcQSjg?3o=7.u.@on&T!Y668=:RsL!qh]fq$Dq*keNE %E\QOLW.]-mqp:.k-Dhhe4b@Jk^RGe#6;gZ4*&k&tAF\ZP$2^AreB$DX(T^+NeZCIpAscR!>_OJ!N2e*n$L3E#JCg"],l6IY9pjRaQ]-qPO;FTO)!_4g=[^sDT4/XlPsRLa\LO9hg?,@\p&Q)1%iE'q9lLWRT:'A^una]AfP %Rfgf\PJnq8K4&/FMjMbCJ@-?Q(uFn';p]'\8/36OBMPDE0J2gL'ilq`HsP8e2[\!,5FMM=#>95))P03"\fh2N?;,d[j_DYuk4DUe %%tU#%oN7[W*#=/m$Cn*#ZH.EE.tHh__k*oS'Y3:,NWi"O:_3^2d)>WJoQc!)Q;_.':-6FfVXKN\@>u+XjOfugm_7[;Si"k=C %,h_XVP7S?q8CTqb@gdUj[\fiY]EQ!Z&ZB5r)Um1A)RY>c;NYr&83"h=U*aJV5lRM'Hc]J/>7R]cDT.=%]0(R3j,Luj_^G$e3]%G, %?(T&HUd9Y@F-f]T:E!IS]33]lD'@8Q$IPB3)^jd/Ae-W`@;j0Q8*-1L;rc2u`1ucYbWdji(HO+abZhnA!)!BTRl&5p-PbM^2elrs %`d(H^/V9!V[iLifFc&h,8L`ui]^W]nd4-^rg(qN2H2a!k %4Vf>agCXRl4a^5lsF='GW%EEN+d\uX`V6_ %4R\gl;2Nc=b3hm2bgZ-J>j0?tI#60]<.V?C(j015XtJg>p+peD"L(ag*h74)`0-rQ+d] %PR,sinNK@1_]Wr6=S>B)CN@(V313ur[e+Z-@L5[R_(nV/`#t\)`Dr)*eAuYX+i3[".8,ukJt@?7-N_9]inSmTOsM'^71Nk6FnnW> %?sO/f!aHF3a6\'oSeg@!hj#oLb*[Z/esuB*R<``u5XT/8730<('f\+sITTm7LDlQsrtOg-.TipCGY;3b?N/="`CG%sID*B#=45T_ %6f-8oJ`.`%D14KGdbrH3Ids>6cgDi<]\#DQgg$K.IC&ai$GAt"4."sah`Ul(iU5_%Mp6SjI.1saI(3 %H#7#mM?C*5ED:lYGb9=FWF2G][ZJ;s8mo2#Z96F)YZ=)l::"MhJ?5B^%TsE\RUTbu;V!5m>^]nrNeqTgbhK&[Wtp[VQErbGaCnuO %!f@D)cN#)2fYfecGPhCU %BnP$$Xq6Ml5k]NXj4J/M2*+crSihR.T7dQBZ\e.^m*u<\>HZ1dfaW-dn5e_cEa63P/>hukQ_huI'RtR^8NkPp6H$eo)TG,$a5.*`kPYgK&4J[;AD,H#3"fGC`o?:%2?Y;*'_g2,T& %_@_;.'+(+%WBW(Hii'7F($abUS\[ %18kR6QJ?sd; %(JRA"1t;ba)grJu*7$l&9(9_E2-^;mFhC!k3jBOl-B^2;boV2Ge[\ZVcb`.bb!)gE6.'db!1V;C/Cq?6UJn&ub7@BVdEk0kg'.r] %/AC.9"4g:Y/h"q!+R3"5DXgTO1URBkP.(d?AKu63UgDKpE^Gn@ %^,]qOGnO_-jL&YQC1L5p"@4Q"@ip\A9AcsU"fD,)m!I&d$^i)q9._,/L;>kt.8*\k$na!O=Jt5li-7i299F1X5n,VL>3N?Uj$lLX %McER[C2gH1F@gmde_-#!`D.S[U!k46d3oHuf,fV323br*HB<"&[YtXaX41']?1QRbpie`OIG&+gt^Z+RRne$t^V>)%eK_.:_cP&\s` %"LhQhZ!57#lk->AAA-&LgZ*&]*J&i]\@s60=%q0*1q[uf0Go2[>/@!]1,2nX$J])pWF2,NC75;7b2uFIR0mIt0U4`_9c+Mfg4MMG %km_lBj^H\p$kZR-jHM6V9i8Z9%ITm\U/!bpTE\KBQ:"A+A#hj`5N7ELfW8DO1$\330^6R-]Zjh[AX$2=27I[)0.\U*U7nE?hmU$r %cm:-O[BI;9(Q,b\H)SUPG\pJ(IPPbGk&>&Dk/A6k=8BU&=`nK#(30K0g:YEhZ,k..LL&n7A'QVYjf3VNC$;q*qMLqMY%WUkAQo.m %*Y`&-1iC[g]uSX\"Q\"u6;)KKFJ.jS3Y/^7VltG;FcZYs=c+4b76Trg>#>JCdmI.gr4V:JWc2@gXOOBmKYGFDRH\Yqp.X)pM;;;; %O"QgMiqe_26ORo&P!-%^;/alZ/c)pG'_btFk;5%?C9X.7RP9eU!LekkE\JW3Mrge!5X<_;"AkOFUG=gIYnF:h$b3kQb:J4OFVYCqcMpHXH?Mp>7$Kn]P:R&)MEg"h%!"^E(K%Q %CNs@S0t0jf$&RfcrJ>?!`3plPb"^;FOqJJNZLig8hF/[*W9"pF7?EgeL8gaVEQ*cjrs@p9-WZ0NZEaV084f4lR-74X0bpGD8h/6@ %S)e]hQY6KL?KG-#7D_(U %p0%0u5[[D($Z8/7_O:Q6emeO](BM!!3"g3LX2De\P*N)`C,,cNAq$P@jtr$&c&^0pTf0B+Ab[B&V\^^MW//,Z?EaUIr+]I'QRGaj %d#so1c*@hQO!ahJC&j.:8gGP3gs&toP()8h&ZpXR;\c,iFnAE\cGJMW!-HYsg)4oUHBNGfP3DZnE\o6%(Vr'^#r[L7e=h^?"kGE5 %Vnqt7nKK$2C6f4M.?/aJ?=!Il`1i.q>qC2h;aE*`eQu'm]7F(p$Z%58)$VFe4:lClm:hHa<"X"W&K$/:K$5>No.1WT6,g4pa\$Xe %WQV"`/*'?]Kl2L]JeQeLne]ip6:rVD\7m[XDW.#8$K>N'@9(=TBW+tQR)HdcJd-[i_hgAGmErbU#AQEKK>"tS40H7RW4Rda/nJeg %Hrtis4DU(d:)*`NKO!dS8oW2i:RX4j9(q+GCkDer+coKo8fop)^g\XC'I>,@"d0"5C4(/4F#0tL`8/ir%CeK2j6[Wm7E_?='G_2+ %V\LVlNMJ=$!u"BUl8&`_@8WcgDrsogc1\B/Fknlq"A$8Qk+GS.-Kh2(WVO4M.=g8rC/@[a^/Q":knsCob-or&asJrb0B-M6n>ufb %DN_=pAS`&'Vi`L=&3\]5VO8b&PWE-Q88Rm'M9:=\2//&61gonJRP`,PK^Xj([[ZWW*C\dd9Qp^*JabpW\0gL+dm*Jf"gBZI?q&LX %I4#]KW"88B=G[s9[KW,;]\=UB)T)48OQS3!2AS](3EX3gm?dPk@QWO,cYg^hGnQ#W2P"Es+454p %iGtib+'O:KU4pPP]%$keB_F#hk:$1FQG0EYU):'@9,kni1okgVQ7Ek$8ode<)K`&J6OGSqC&R;=FouKemZ-l-ZML4u:S5<_]flDR %o)/?c:A;qm53)n?hS1$]o)!?Ccb!19@9VqFZ?^V;A@>Wps"fl'dtS8sfUeQ2_tM@9L>t-\)'6Rp,7JE"46.O]P1Y%M9:Q0$;qAH/ %B_*GWI4JMg(Em*7D4%cXZdiGr!j>WRHu-_pX`ZlpmXTGg/)(NAe[eBS8o2;*B>@o;4^!Za#n]<7Ae7;TC*X;(Q8E;0h+@!d3Z+h3 %q,*P3^HA+;ejkXYtcQ=m'jlR<:k,k7]_/;ZCb2(GQ!F:/'F[7O>2lk,pJL* %6H7+G$k_J@-6p`nRg6*nf]l;clUZ4OZQ3)"MeX]>;1A^*.XDoOZ?4`6+CM=Z"1\M-`.g=2@,3<'>nE1[[S#%K%`LE!a,_6^i&0i,,jE]&_,APl=(E-!]9_j3,sZ'Hue6@61F4&C6r6r_fA0!JCBg_,"A*[o)mYho(b %gUOguGA$t+o$%\WMb_#li-+/ML(Z-Xcne%4"/AJ$CGIY<=u^oM,(<*(S7Lb>0uIg95dNHN/#]iI&qlpC`K_X0f@E/Z]A'(mL,X^/ %%C?Hieuasl$cn=:Nco!gBY%Ak7Xg^@GkSRk!Mh9DW=[r9EHgud&JAAaQE^\o.2K<:^oR'!@H!?$fj+^PRS6i&N!%]m-lZMW,A3NrPsDsiEnc5]tD#QipQI4 %ji(7mrr2'Bo''cCgcfP'F*[VdH2:(ZpGYm.hP9XZ_?V04FaEjcGqSBiBO<\u[Jp@/k&o8pp\'0_Z$lj&FImcNrrjlWn)e%EZ)37e-.oW.S9?c9NW %^ie%sMNdp'i]hZ)'M<]G"Cc"_[Ym]cV@AN.H>I!H[\%D$N1J2J8I*l)-n`:iL_F`=K"0G)"=+Ii9(LR]'6WluIWhRYPXXXSDn51[ %3"15%Ss/b!G`fkERH)&$a($A=9>;FZRDAKd!@2USg[B8HVFH0LVo3r6UVYLc;0\CVaZiS`qT!kVNVHO9erDi[f^I,#f'TncNeg=- %4Df334SRRa-\NmabOo^N:f#m7YT6:q#RJgt&akGk49("i;;`O"8U9[uh8:V(j-Aph^>!ue`$tU\B?Gd0(?;b`S-E:!WV#l`G&8\mI.b,*bcKSOK^rCChaOkj3RH[kf-:n_mS$_)ls9GN4L@nHF&T6j^pFT %A$5i=kl5QTg:+U!p+[r&?ckJ#VVg#,3^)<_5DbHAqR?=]lZ)Mh;9TjWd/ut=JiP_2iirK %Sg<&X.-l+^K\I!n^RD#U\'OtQb)Qd`R9 %pFERQ]=7UtdF2a_LPr@][D:8S2cmJuIXcEY#r_8pl+F^>hJ`KbhrftM7=Mf9UWV)(^\kM^]g5:5SDIUhgD;t^Q!a=GANbR2^fL4n %_k/\ilYk'[f\Q"FJ+7JLPitQ0Ps.,;T:Tt>m`t)Crpm#%@QlrYCtO+/(OmS?B>'uB3I?8ZW$7_/+4Ok"Md/EX"RrH$YO:$_\!(g3oqW[f>?LH!X8Jj %T)A)%2##t2ci&_2cYou4?hTcOY3tkio;NkC!.6?(bQO[l]r(,qb$MCS*dQ]mk#SDX6E>P#lQnn&V.ErRVZhTFgK %DOrh+HC@MlT-eK"RbV3(5?r[//fZ'RO1Y56M_G'MqS`qc;rPuN!oLoN[,8P/F5rLO3IPmsF8>+[r;-?jrr)g4G8Q43`ql33Ilem5H2:7$N[oj_5]Wml=;Qd"@7'B[ouB/b#NT3lDa^*qm$ %Mt3FO1;;9Jn\L,E0CSl:bDV/I?Z&Eo`m$_N<48b@Idff)k(=3$rgiV':RUj'CsS_dr8!q6o)2>YpH*Tlq,">h_?l7q*TdLFq@7Ru0d3Pk%_Jeb19D`;m@"cK`?A0u]ZUZMI^.Ab7p3[2cgMPupuAVU^H&uV %35**'R>(L*KmK4)Wh.fa]YrX+`][\aSXs,W?U&B)q_6!\4CWq/]oFce$TYl;d+O\VijJ+-c]$H0=Vj[/'bQ5&KXrGg2!:LjP5&A/ %ocHjYq-DY::Oi8Xk0pmm?U/q>d^nmYk5GkYk.;R78,YU-bAV4en08l7]Rttp48/XPoYoqfp6$3<]D%7fPMhYNSt2G/efXm595gOh %4hnVdI6Kg/qr[kYSftj05S5(!:V7jWRc.l]oP^\D1/J,e:$+#j5G7t5f5 %nUH;fnFQ\Ms8?;IbZ)Q**WF+6lVD_Zs7,g\oQp,n`U3'Srpd0!Hkuj;q7@3r=9%jP\%c\]p]p`p:[R?>?V?KqX(2*ldtbPnRtlo= %SZ3JZ&;0>OT(%N:IOjZShqVM0hqdb-rU#*HhZA$NnRcR[%"Z7P]fN+4IiEU[j*kK"-cr'&qbEEIZJG;*,\'<^Du')c?gk>Q6BZ_@ %EIW=\q@3Hqg\nT'^\IDu[>oal$t$Z-`_Ur"N7rjWKNR+uO8;eF^Q-K[O%`[RH,AF#$+$0ls3Z=V&"E29Abk67jLlLu00`\5^1G=D %eQq;72P7WC4!Ot!n+5@k,jL<,ca)$qDtsS4j*>g9A^/p1[-:_^bL[f!:ogf1kV(iYk5"fDcgT1%i-kHBpSHC>DVmfqq#).kr/(+= %k4AJ*@>%^K(K^(sg81^rTShf'u^>@Mdr361b[mb)]ac+Nn&<;YakrM*F^SsrM.:G:#m5*+Rh:R1V`$JF9rD#>Yq?o!/VL5YLI %\,*EtjMsJr_6)3qS=a0fI@d].X$qIo?1mZ(^,dS-2!%$@IfmR7a+P-_IY20IrWgkKn#-VCH[!0V@=iuU="1kMrRKeQ(Bm+qhaKh- %IfI1_qr^Zsn8eNSj8X8QIf=igh8R.AXQ=p,N;eQ]rT7=";;UR](On@*Ga$mAcJm(RVg"Vk55LkS\"@l\cd+.?6e*7VRb^;[HktWf %Y+^20"l8o)[ID7(J6,18PSka*G9jeF\,<7U+9?*5`$#fbY;f8)!%1U/k,at7=)$YZ'D'#3i:ZWL(?EDg)8Epp^+kE?GAu'G\qc-Z %-g,F&52f!nBA\7t]G$7fXfbtBN5'\K]XYs@nboq`NNYNqZ]!n(HhRUj.Df7[EA1)*Nfml*X/$#>TVQhq`E,8S>MnlEpt>B/il-hb %*^An[dHp6)m$tdWcpeJ-:UE1?SCX,.rR^51?g\=kcohKYhgE%[g;W`X?@7$>pQkpUlMU)/rVhGulg;jr\9TqI\@C.!I%PRu5?InK %:++"p-(E-sAP)ZG,_\bl%:uq3G0\S'N0)$MZhkI.?d5rcr`)\>R(fKR.oEZfQu-`dA*PX:/h61339oK/D9]E2l404'$>2& %3E'ktVciZ+5DuVpb"+_/]=G>RYH-n/I^`sqa5=YZ<9Np;SbGZE8B(Peo(m/NnDa#h*D;3WM!4L!bCs$i%5 %hk0qp_lLE'V3@O4keFAIqCNe6msXcOhR?T0?e825U(%"7\N@RH%QlsWiY>VB[G+.@hoT9>m.479WX7QV-\C^&@:&fiMbbp;WjBYgLHm@KCUKQpi+X&XZ0/Gaj@2-m'bZaWWtg&g %o:;o\g=4D'_=S?8=)/JJ1cjO:&L8[Kmk2>g\Gl&>[:TKds.nK"m36?FZsM0n\7#2D_YW?[luLppI=-6brP`N>aiT_190$-sdWj.! %=*bob6_XL_Dl=N#perABp\gfTabL;@=%0ZSOYNS;rGk7/2kO.5#R1Qqf"(M_leIt6WNV1_%<(UP24!#V3-HQmZjn_:])V'lmc+6D %FZn>Sot0Z*")R]N<:k%!-=(&-qWom.q7HI0Z8-@lohZ\E5fSXG)7OMu$@4+\c_&hTl?`'giPCi@CFU/cTIRZU0^>>k+*2JZ1Wr1q %Q6V-\1/=EWI/3(#bJ_"+fta6;>i+7Q55Y3K@Jb**oDmi%mJEsLGbVPD3-4e\RIB3m,(&YH<7`K>(qZbPjgRgDHr:j)St0aZP4p6# %m,JJWj&>:NKXLNK?5rfd<`aXei.KSFNWc3s)iR@S7__8!]@^b_BZ]ggG]t@P@J3u_pYjBjeQ%%VIM1C9ZBODHr@0Ps>$O's&pQ[%R,P9>`^gH@Gnb2.'%pr1E5*\Yu?"lYZCu05(YMFKk8$f/MG;DeeIL\@^.2p"k2slhT5Q %X/iD>s6_'Km9?.f>m,lL*A>VK_+SUBOOEIoIU"\@"^bPR?W6%`)LUAo %)f=s@j8ZYQ^:#W+YP)/Xk4\/lCC8k3Y(l>gGW;l6@#7$Qi8tr(X*\hiGbco?g%Kqh#>3S5ANXYj38[g.DI##qr<7sn\p*:TH/9X8 %oie:Ho!)GDf;sm22Wt#+r:0V9*Hpr:_kVo8m2g/J+/(?Q\\e'Sn#rX;jfZqE3/&F?n?gb50?Bnh#'cg$mC_<-dc]3ma7o7#G[t21 %Ecu_Tp\@O5%NQs@F`Sm8T(eEFMlSLlY>4Q#]YF:?oA^WG%sAl(61I$;'Y\#?LR[$W/phmCGpC+U_Y&:95?mmY%>oACIY6)"lSg4R %oQk`L;3q!c(T2JrRrF7;*fAk1HSa"$SgH*4P=e(ME)9ETl\\_LK:FnGiamCCB]5"CC(Fh7QhV %as1JPqdX!4mG6Ic6[`SqT=JkFU!3IYHi;T/j>+32>J9.m+)>,_5$sAcHGabV+'Eb8F`[;2f(E\oWFt)hO!;%lpD8lD16eg1IB/)= %Pp=P/b166!AZfCHC:BORa2UZ`@&_jiAbE4=]m4j5gRr(=m.RWh\e\Yj*h^H0Mhe@^g[u;,W&0LnoU\9nK;(;cYAc#d!g84,`f#F] %kP#d">ec,]\KcHC2VHV^MBmc(7#QIhJl/d1>Z05@u4lO()$+>3tX %p(Wr+f@Z4!0AB?^S?[2%O[HAhH9JH]s)9E`DK!i2[tnMAU6RfF@4d(ZH.aP7Og8*bkBF&ll^I#-qFp*pk5/>\Qga#r4d=YVs&UP% %K$O7](>dt<[7:e4qm\\o2pp:B_eXGl?"F6/ma"bbh;JC0jSbD]\+Qi8rpk3p)qY0gG3k7XT5S%`<*=omFA9>G$iTpccSclKT"'DH %8BRI\Xo7VSJZ\Sg[sM((,[^LNbsq1;bD?]l6gPbXKfo;mQ5Y-i8898Q(Fd/ggKWoMREp1N_/?O@O:aSk)8W5aN8RF+9W6n^dF'.o %]=quWL!@Ro#psU=g\gH?\7UgWMJ7Q;&JAl%o'qpmDpIg3S=!*NoKOuJkKAT[PR6Qq$`NZ3=U=LmY-I?Zr2rFqX[G,'>--IQp!;$m %Gue.F5IX.Z/tZd#Nu4q1Tuk9C>HuDt*CH`_FPBke:D,LsM1.LjT9,o8`(H%SEQK"RN!VjrP"SB9jW*b>5+%LEjG4T]j+`9Wh %[>qIJA:#"'9h=\E`Gh>E``J&n\c.P8!P[,@c,XCp-(Z34OH6`g=*9&@`EFb0itS5kaE$Wf.MZsD+m.RAg6sZ0M]ER\W^r;A4SnID %E@q8LeaD#:B[=C'V/)kuG$(1mD')SKHJspehq![%O;-+c<<#<0nmJ:g;,.DMrF0rNQ!tEd+Ho.]%;DLUsK8NI`VgkjNRu6I^C_CU*;G!$8mBVk&%7 %7kh<]S[M%Cc1Uk)h;GW[r67WmJA()X*$"VW\&DUeRhNXm/[TV0*WD"]Tl_7/V`OTXi\1CQ3R2O,VTHk^CA,L/M01>nkYKqm^2EFB %.7ZOAFkiHIM=h_$nS5a#CuQ %;_+l'AX_q9<_qe&jLD%Y\6?qo4,'3/V?l6quA2:^`f,5#>J.cJ`ZFL4^W=LE+1N5cXR7kT*Nj)jj7ebP'E %[%Z#-4YQK`:Seg[WNO$/juJ%%PpBe;9=qKJa!J=NagureKp68?_Or=`Q>s]7%Ru#$e;=N6oWo+nm&F/"aMYS:e7hZ47m^koKW4C< %;O9BjBdmJa,H,d1iON4U3YMLl-\TujQ&p7u%"uQY719b5'6rE(a-O- %F+/;j0)-FZ$--DQ`2.'c_r3edF&[[95UE=@L6RMujuK]I-J#qVlq_I,=%!$-M`VTMVo*_qal'J"=mD)lfIM]a(hR$'>#X8Hp!fO1 %CTm_6\%8>PC9PFtQGYC5i54eF=8rJ#+rNdm``JTc:pBP$LXYbQRb,->ekKZ(s^6L %I2#!tj"]#^>^p.Uf8\tW1gfO1!.LYO[#^;4^>9BWQ5[#_38]pXI[D$_T9d3p(^<`s2P,Z15qCN`7Vca;U[@_Q;u;uL.CH.kpaVJq %)poTtfqntTB]Y_pklU/i_(QCiQZ3VqA[6t[m6PcI'=Ld`K$Ql`quf3qi!EA]isE2\+oQk*==rX35g9UZ?k]l<5+5G4/@nDIJ_>SI %D8IUa(>_!VYFVk4G)fGobsDYK?/$NTg!Ij?0,_2u"\4FX]`VI$'r)ormC6/,F(/lk>8aI)U^3I_6d!=O`c"pC`q4LNg@q:mr/4#mjq*+p*'W@A6ALBSKXtOQ/>m: %KG*A,a>&Sd8/QsG$E1-+)<5Oel5>a$f-?-5ijq>/lLR).PJ04&L2p\?li0E_jMGNt^9,_oH>'IqXn6aD %i5T]IO^I[bK06$V*O50p,RUo>Z)r(0KL%F[#[-P]]h%74SPOo=Fsl4mYnmf+^6eBEI97LIQuh[#F1HWPSXshcD>51<$]DsC?XG)! %f_+rT")RK%Wa9I\N@fVI<^8h#.u?A%KW_-PR6A;a)ceJkUSYO_XM..DIn;1#a>VWbMtRK!m6GDdFDk4(KC&cglE84VY>P^;ZV+Wj %Ve7?4>Br'*hnb-Q8A/?QL_(6=I20t-m^:p.QTaKh;\H$Ab=pAQ,[Ae8>8^m8i,tY=?82!;M#%Y`L!m2h*g;]f6T;haoU+01.60') %Le3#^H_>8n.h?.-+a_bk=QreqV6T-1(q*btQDMhi`IpE4>. %W'1$j`omc=9c^J*;XQGcO6EHY(c]/ho#hW?!H[?T>MjYEB3Q[4l_PgHr2a8FOUH=f;PPd9,g=!YLWR"U6<@cYpud[ap":"RO$00U %Uh#Gp-b7ui1np^f^;pM[Eb\6;l&+P(;Ffsm;+`dK;7af8dStQaNRI+n)Ppr7P8NJ6dVYM6dQKUTWpSPhfR?F??XHI2j%2;-;5^_4 %,^nI/g!/\YA_\YJD',WrZ>-_X%VLU4VS4tuBe=t"AqeVr9NtZMe[:PblW.1>\_aT?lMHt-=?P?'NM#GLD:_HKj>,F1FdT7lP7cht %eEYVmf%LpNg\8"5Z=5U(,Me[u08HC-]gHn,2@M[;=&?&X"QJnK=BfJW6BSeu^cZkje[PF[\ld+^a;C^+qlk7K2p<[fUR*tYkAf6g %\@unZe8s?>TqGIsGEEWP!X?mEINadqfV_)mgeX3uF`A>p?o2#sP8/h=X`B$iD3&ZEA,#A."(sbMEOaa1h:c;I`upcD_I"1hrcWDq %<2MN5SU09d)P[16kQU;H,/SFhcCUpom6qp6(?j&<5ChFRA"Qqc+Wm+TLFa+o+]]fo_4gSWO3&6iF`jfOFoih$CW0"!bALZgKN,1- %i9.>ciC;#!6gUK00KUZeN5a>LDWuZ&^)[nn0A@m\j;Xch&j1ACqV"#!%Z1b&NS%Yt,-,"h4OQeS1Z4N+lr\ok'(4QYDdpDB@Xer48/k"9M*0l%Qu(f*s1=C>SD]V"-EQbBBj-l-NJ3%76%.=7.rj,K8jA\@@pGDgRFI)#LL<-u/D2jo,TUb9?cA.>[Gj4C5)#hl_t]Lumd0'BXC-?(.0Vq)i`n %_:I/,#$1>K'Oo?`DYVEu.tj6Vh?Pl@_<:p9>[=9>7Ac.W@+LI&%c+,dA!?&(MF-3F`Sntpm0Qb6cGCBnUpdl>sEV4'nG/3]k8 %dn+OVqr3r^>+p867c"HBT4U#QJ0Qmj]ICF4FjDW1ZMq9SGXiBJ*slY<4\9DCW?3aSbcMG.T<1$28NOf"X:@$=CV].Ymcp+pG3p68 %eb-5-$2b([5l7i25(qS=hBR(9GF3AQ*Mt&r[I]beFAa_!\G&2]>ZM!j81O:Um<+e9<8G%\Ye=:B,SBP$?.omr1`qKGHbe]oNaD+Y %p0t/%+@461!2aPK,EgHEp*+@64QPM^&K#M:Vg_tQ#ug%?m/bU[CRAD]"%JW#=1_]X>p&F]Nf_X65?uq;dZ+C>Zj08o3RY[s8HG"C %rcjF==/q,LSQ*9M4f1)k9&&;)l]=TDp>%n@2\d?gkXBY>pDh)`qdVsE'cJ=M_upif/VVN9;"$t'//]<8X>&o%3+AT#+#KYSgahaj %$JSopDiDgccqHo1kTStBPg)k?TIba&D&kQ7!9;OJ=kgW:HHP2%iTL0UTH4'3V&lg,ma6 %b%06<>p9@"LDJXoH>$cUQ2rNmJ=o/tfeST5#srU1D<\A5N!?MR4BpX,5[BiEj/0%13>M@-SsYhZZ3uW--BSkl?nmg-,=,p_p8".\ %2g'jh1n^"H]:LWH+516,Te!F-Z/79,HCkO]I(Z>pS%I% %p,&1nU(B.b3&)Ne9D&;E7?O]Uoe9W#29-LW4F]G)6K&J>U+.+"YgND:g%d&pR<-8dj^U2>H7cBN4Gd)cre^(a>?X:$Km3RqAJLn9$4<@A0;h(#-DZSdNeQhH)@,e)mWPGQs8T/Lu)[7L%QFV*`O[iP!l3+V5L %lO_f9"#dIh?6rpOKWJ2K>#/F'nOJs'@hs,:GT5!ZQH.1n5aYD'g18JJtKV'1%qK63+IPD.4jtn''6"%VS^8PRr..m4?X.EDFb_8@=DZaP#dd!?'/1qE=R)V_Qnjm'U"u1&[Q:dW<0/1F3q+4KeTDJp(_#mEIDVDX>6=)j+Lj(pD]2Cdocln*1qPQ*Vg/^&JVbi %f*"GK:Z#l5*fSOc:,glWaK-cZQJnFqI\FuAZU?$m1KKGTdQ]f%WuGH']WJ^k-l-=J[,qK& %O/k5tLn9k>0niM"LNL^@1$ql>W-*GM\@5rG$^2SAc_"#8]9HT`Gu>g'IDsiLWUd]E_8&[tPKpHtpq_k@@lYeio&I1[M\W]Dr$#Nb %a5uT]XK4-3e-[m-n6Shc.MJGoEfO.4mF^,gVP.W)+MXd+gcK%[M.n< %Foa*i@dp]`@IqaVE_)NJ]df%XMV'CV4(P*[B%S1-.FMPYnLK865giTNlJYrc6'r8W=G@,2+`?`Ad[JHnN/.C-;-"APDHGod7BV/q %Sb/;.Q,hg1>XMCpjCdf#SgMND3/R-p#Np`lj_9EgfkkpL$_5$/Up"YX-;CSmhX$W]l;uk*iSj4#*k!k"#R;'d)Tt[kTXSB %@1e*X[^UfukI\F`,J(?'(>8W`El;Y0>^Hg[pU_ZW4Yr:LMgIbli,7n5SFk]/a&^[=$>,3#J.'?%UeZfb`M>* %GQ;NCZI<^KVra;48(T&@]%3SFc-$-hCM?dQf+EBK2ZX %=CDl7$c@kCosm2q_jK4bE,^M!GaPmmq>V27a)Vqq&K!kY6IQ[RCoX]%m>PAD>l %3-<)kJc+L=VSn"50K^Qj@J9*"Isp4\"RP>!]O>*ZO:WMP]()lf>8`8`'!loC5[NI^m\j,Qd6^aqWhFVdq6]G0*Y:>'3m:?^!Md?b %eLlJg?*JsWl`#j\;BlMKeU8:e0WhCg6f]BS0\`T0-3LR-D:!'5R;F[[[Zg>YmQT&;,WWa&d-35G@(L:N@=*8/esaY0]Zodr:(2Q- %A>n+aDDGi7&[3ACW&mA`P=I1a[DMY`3H#F1=0AoY[#9(oY/`92^gZV);,"R7ggPFJMhUuN-"otnF?>kKF$0u'Z)G\^,;/!j+c)SK9!2G*3[]fhe75bsqQ6a^\Yr@(![W %iKtbjM%H$!NMK%*)&82e9*<,UV9EaOO!l+%Yf=`V(n^/sG!5e.*uZBUqV$q4ErENb/-1TI*bt-T]f-k\(qC]O&R"KZl8?86Oc,WQ %Vk0$OUThdnhOG$j9O%C;+1B)._,I5Fcpf>lEn)?E+MIGp9Q,0'bLas%XS!7#dbqIH+)t!'^X]KrId9A5ocZecY2]Yp/n&/BXZp2ScLjH`?(+K,p)6GNp;#Opa+N5gXi(*$b&Cjj!nd%uOr %$&I(J!%)AJ_]ggq&>aJ7@XB6YaA>*RE=f4F%BD-qn9?YB1X&4ON?u9rDF#sV01!j5A3X#^[>I[r)+oU/c2"%W0=K>8(Wak<%m=l_ %j573S&Q0I[gf-9;+be5l/B2u[^g[l&!X%*j_OqW-]a1PAEi&u?+"Nd43?kGqi2s+N_i@#J^lTkl?ns %O@a]`Lt+Cg,F2e%@<@:n_e`3D0fbs6j`NA`8tHd.h56$bCRk5q'*Cb4BU^>8YtJSBRjNH8or3c]R_HNl`oj.9s%49W<#.gUn) %T7K@E:5-8Uq%#^O^'b+Y-:F`bd?JX9+V5k,7;+A7_*K?(P\3?1"12n^([U8V&n[1<"UmCCO<&RTe5@sr_gJb9*gQ1p^:pl[5#/8eEGUE %e'?CS*!H'I>Xs"I)5L><.I8Y7Xu;+*kAbp9XS8>nD2""+mUdtq5IF^,-@1^(MIQ(9F?/h%(@ptN$aiDL%1LT7VJ:uc8&HOO30eqL %D5j!A*ub:4BLEU!rrUlE_j&(&,Wk>f/i?j(''Y-&NN4+a-$1nOZkn5q^[RC46ZS-Kifa".[UO(%LcF176^!L$->I0/7'OrA-7$/C %[RS2D(FmoM;#@Q9^p]$d,ctd_m^iIi%nDuS2B-8%oR-^+mSrR763MORJEsXj %r@9n4[He+;bM7(?KS7cj#QBafr`V`4aL,L_l;,h]1=V^@VXZ1*Vt0SYHpu?ZjQsCLSWR)n%%g/pd;n@:UCK %Ea/($#epcg+A6+Pj4Js]fjY^p(-E.c:=Lk?_`G)2_2tYg5-1O0J4X!V?"u\Vb/P$)rEE?]8?J.X5WCWX&dt9M'K2d8(2S_RcN0Z" %r@p>12I_f\>j5?Mll6L>hY!ROjN5uojU/cO)S+R^CZJBp-]Ms44jY5[%\\sTs52PBlroPsfqEHfnII@RTi016P=$ek5QaN<#+@JK %V\>m2,-$Te:#4%q2^KN8NReGq-'Ur)'gQK7*OgVdQm8_C`(eSo=9s80M%d(=&^,L %C2Ch*Ri^0*H^8k@UtHHGD=PM5(LiBu?ZhI?Q?/6kC)M(g3-j%W#WCPBMdR"Cr!6pl-; %MLK(En`4?1bu2TlV:DX%$g'R3F=u?lj`,ugoomoW4;NX'arUh$IAjK!bq:B+g@W(\WJb]tkq!!DAAS.nsa3b!Z'OX"C5S!:4?NIetM)>^jBX6[[??.,Z(7VRj+mTNI]2S7:5G$r\cYtlCF3I=7H %KEPthU-9,9!OFsjKguVkG&VY&&/]'I->qRUV:l^MU"tNlCh:b&V\"C4Q6>>lcORnT@D*2CVhA:;`[';1_Q=o#c&_6k(#TBVgriF$ %2IYQto[Ds#-Z"CQ2t*,k_(B2#\#>LLm;$!IiJuq6A`CR=Ejo<[GKE]pc9"3dIte$ri;KP&*&C*kIR+gjk5UPujO`=5s/B51\,_5n %#`Fp=VfbOHUsC^YTcp+S;aL@#IE9$C,c8Dn6Be3-jL*SK]Bnn>qi3Q,@?q+@"QGq(W?6?DY(@uaB0W9pPT+^:^K$58i_c6#G#V`$;/.`>_tsa>fSXKS3%mpi\g2stB.,em'#!7q0XiF;2=;hZ %+$<*1N6Cis5:!tjWK-QnUkC<^kmQ^EB/0Zj3=,Q\P+dFWCT3[Nd9k>B'`"O)\ct]$m;pQP;F^"oJXK2/P)9-<3Br2>P&O*XC.eU4 %_qNO@)GLj1ofJ72 %D;Y`#ElmW75!YRY*NN`7)$Zn=,u:N?Pn7tVV"0O#?PcAh.fS!.QpPg)OM5#NAS+58(%FFk"p9]INiGCg]^CZ*gp(?_YGo4)0O?GU %lrNl/qRRoNVN*C1e?'ugnLj.j:X5![1)j/Lrnj4iaX.P,8N&ArM%(?2L>GqgZ5OlbE;fN1IQ4m]NdU_U@ho9%E9paL,8X[cl+)[5 %Hu&@&4V3h9.dIQ@aOl`bK9m(>?pjh%%$#`4ij(V"L=@,%Q8G;3^[(%:K>'OP7af1:[`(m7='eFQZ\D160"QLBCrme)jKb>uD89GE %3tVK$RKV/SZcd4WbN1jejE5"?#]T48G1B9I#BC%n(a("EE1[fU`1M?5U@l=+T=/9Mlkg;i;k+KI#m!cQA4SYfjgsVCj>uWaa$We. %WMb>e<4KqRKL7XMZ3Xr5c/R!QFT7hE.^?%!+\XnbeM'`Y_?WQ%(_H+a;5"4nIpq6$ql6Z>Gu$-^,NoRh"Q2Q=asRU=?7FtNj2qo= %:W[-G(25IAEN4[#T6tGG"rq=1[.S^cH2n66);^F;*c`Ef/ito2H`iBW&ED`XA'd=o[?AgQ(ONZXc8)&@CqlLL:`40U43KrfLUr$Z %4Kd:BLWTrcLN[>nc!,TDK&A_,@lE7\ca4RRHB;a1WdMgk;1PP5XS(&O&+ %E_DcpD@HGK1lN8![jGNmDNe:71oQZd\&JDJ2,.u4kR?W1cRaF"gQ_Sj@sc:.]ak<1i0jHuk&qKsaOhdF4WD9eD=;KPYnqV6X\NN>nSrV+'CW^VN3ec$X&R!kVS^jJsnH2;OB'ZY)Y"QBc\K6=khB_\OTYW`'a&inX1,[3hp+l %9_%Nk_^V0EP4-#l(oKaLY]80jnBBY,C"@7r)WUJ%[U-D[OL"[Alcjk\1]%=^G@pG`;po/go0j^&-G=To7:'U]E\h("loAf=?\C?^ %,:8g32A3R6lPTAkeM!ZK`>qR(HUtjgG;ddRjJOUBf%G(0\Bs)M'&[F*J]=tu`Eb$AnNsmXEIu$s8sf6GSTr59Ue`[0cD&eP&@3;g %g+CQ'J]1#K)="c)Yo"^(R%.(tnl=.q??Tk!UiU&q1a+4/G8hfQ=G+uk5"Gb.V'RKUJn-a,@DdhfIVg@B#-uK:'I1W.K=KAR"1`F) %L8tM;$6'1)7e3`>lg_K3Z7lm=&Ke9RY)J4K_V@gj's1PD6sYuRaL--kl>i9#&?8Aa?tcSapK-*.D7)!#6(tF3_mpM![;gCa5"U-? %Fk!3=F>;(eY-$o0Te4)+p0_GFMhT:`'JAJ8i*]J`kBV6kVJ#$p1l'3>mo"4e63nN41Ok=(PobSlf!Rasdtq6XtR3:7dH4m4jSRcD70D[DML'@&B

I6:YSIp=dV5Pd0j*\l_0+u"(M#=rlX %-ANC?Mn,[:*iNVG$fg2c36rb83S7E(bAB9K:%C+8#BBY$)P8jDgCYU+2=UNQ0C=a1Y\ %D0'&lTuY]:OSFbdfqEZ,j90Vi(agJLou8us:j/B](6@SK<_6je)HhOTTu/n:E3VZFo`(902/buC/G\9VH"Ble#fV@;I0th%?^'_CuYZUIMV*&0q:q*d?Fm:4Rn!iXKV/_5)_=(F%36Z].3$EB, %5/5l,SsVu%Lf2?a4oQm!jHR+q](P5^O_,..-,@9]0U9`f;Q9-XnjBl;"G7(tNOK6\XH>r^A/FNI]L%pG<+j7=SMl`i2,AUcK8:P) %lf-$Y@]n!U;F49`*E/rM,a\G:IX^X<-'p/j:'id+BDO`dX&dRPCSb"YB8l9dVE6fafXZn]rUQ]&*@g59*.8P %N/XHkdj"3bCl*%amBg1kqF<;bmPCCBZHZL)&t`D/U$gN"UPd5N<<@]GBN])c=XrL"dR_,EA4am]J<[uF07f*/LkO;m8nW66Y+%+b %;0iQ^FY*oTe$oCQo6Zf8\DMN[7Lhbn9q4oqG!O,s@/AlX,aEae8n3!#LUr/@l1u?GNh#AQ+p0Ja)"J"%'(2q?=kb26<2kY6)4N"N, %)&V]4*U]`d7saQHT_4^[,/(78WT!]E>=]tj5EJ6aZHFOWa5kGT#YuDMonWeViN`qZ\5`7C>@/X1_7(O1SQAk-Sf;MQ4fE_O:f)g,) %8aTRN^.i>ES5d[hc(<>UkXraIu%NGcMg_ %TY'HZ(]#`90U%LYU#&^RZ7lJ\$>HT[H`[dhkH@; %\RLBEY$]WeTe;5>#bkPjAct;p,ZE[;e,%6dr%J^".gNGe"4?l*=t`Zk*5%QDEnN4>lUdI.eZ?c&RQg29en^poG'3eo?&:Y4A'9n> %F?rDp(CI7B*sBM_giE+H)0>'d$P,J9aYh@h8dCX']:I)OiDC3EoD)LN:Lj %Fcn2!HX*MO+WEdfpkMgWb\E$VKHX="GRBpTHGn,0E=#3G)A\UKXD[Z7KjU=#W?u(*3dGlI#DY"r50*p$D+'G#%7=3MBgp=E981?V %>*nWeS<@@ra<;c1,4t3WES3WP9iLFGY"OYZA!5ThC?%kY2]T0$nWKtfr,\iOE:C/V92/?oA:"c^LNaV1du&#G`Db;^7c!$5%Ckgg7`7b%Q5p9g0'=([Vps`J<=N4L(b\V(p5ID9gCr2JgC-Vj50oP+9\1hKdOp^4$+D)ES4VEc3C@XBkaFd*ijKXXVaXYLqsVFUY(L8;fT!4rIV>T6'.mQ9!?!daloUp:YBL;_i$L$T/ENRMTuLP"%dUXBGC_,Y+QaQPRru %E3)6l=Guf.hkh+r6C1iL.?+F<5[$],">>3\nO')hm'e3JVLQbhZ/8IcMZ+1(f!eV=!SIeh13pML(\tIFpP]\NZMirnmWGNXi\R+1 %9b\G-b,h25[HPM6ir][serWS-2(V[A%1@chQ(APP+]E.cbLB]t/C0ctoZLJHY'#C+L*UN9@u4CT=Oc%sJ(MrS#CZPh;et-NCH\(h %gJ5jK)Uqrp2K0)OC2]&q<$_m)!hCJLu8db<`a8'5F3bp*1s7[SqO4P@mVCR8Ah=CQ_OULpBfY>B3O(L8f7YI+es)pJ:Rk-:6kDd\hgO3hI02bXAq7OBp3"r-i8QCAHesR$6q?<3Lr'dC380+QdKM7>t1_dl>eq&;O>jH?!U4'F`f^8 %2Tam!>$%'>BjG#leO!Q%-.R8'I_s;]TBNZ9*AX*B3fUI%Xj]7reiSk4=];5<0!0=9j3i7GEK4l#1P&gal&s-dNZm(O=[J^^]"jfp %nX9T:d(%%JF#GU'P]HNTkb>Sf/F.,Q09A?c/5O/=bEL,bUYj_2C3>qVDk&MRPEjN)AZR]0LBq!Bh;kn4_-<"(;I]qp\*=( %r@k72-1g&3m=[ne$;A'oPA.]LR0:W`SP8@_aN:gGMnHp+(PVNN07(%I-SB8[AdQr>/@`&FRg&7;CbrT.2Oal:en28H\]0Tf[+XX_ %%cJh1bWE*$&TaG!04`9DR>(m/Q<24EAd=*n#EoodJlc6K8IK$:J@*[hG-,Zn>((&3RXnurXVoR-*)1rb&KZ0mW0GtUX5&6p&ctB]8 %(k'ti`LtQ2YSd#c(`%`fRgdp5ZYm]=-g1*?!5IE:!.MM %Cf6S*B3eZcSonT^HT"IRlrdDUZY*QHdEt9`N[;Yhc[Naf*O284ibu>"Sa!Ht*>hYkl*F**D``JKLD'LDhq^NDi8s %N-a[5)O:Z9"rW%/?'Hm1VlqEJS3`&cb2>_6TS9fl/)I81JMSOV@u:S):-R*lKU8aI9-@g@u/5,+F-nMa1IR7<,1[ub`G %1tp5BjM[eS_+M&4/&gZ2+TXft7;J9sBMikY1N?N\!7%In":XHPkTn0a)lTA?pGF_7ILdI7nf6Oak3kGgg?9=5!L?d!X9uH^p:7m?LYWJ6,O#qMeJi;T/_GMY`hO1_f+cUg2:[):\ %P_jj1n>lSd&D$bS4JPeX7T(4]b"'S16K$(VF59X8;j1"U#2BQRTqQp\JgcjY9BldAfm[J=2gY)(`"6"!]G`X %2_6k546$_eNRf]9CMqCaBsc_iS43m-4EaLW=q!MtJm8Eolb,!9-VVeLR7H!g"a4M+)AXl,KOgB.4-!"&TJMoM-hUCU[p"rLo8:j# %OK#VO)'R*k0a[B23T_N25q_kHjkf7/Y["l!kTj9JJgeerdrjQ1<,KU/ll)^`L6.(+Oq>`WgAI0HAYUM@DDcW3V=KdSo%3`OdqPMb %h/7%4I,pBi/'\fV`8oHBS:-!dLTGJNm2Zk;W*quV"g;F;4$]]$ZY>m47=6J:AcL7g2gGj!MA$* %dj"Gn2l3%Y@nGrKSRaK-U4eHnA7XDp[e/m<9Zq\@A),/4h<.iadfMP1&7/qS %"j!]eWbTS.IE5VZVX:$_25/"3dM3&CoLu,.`fgHKdh4YU+e9CiXQ)dJ70H9gJp08X\"tl%;N!W!m.M,2[5VWt\(?@83$.&klO>"[ %+hd'G>(=[4Zb8ql`BZ++@j.=e[IB^M#Wf.)rZs"?cE"pQ&W;FgX1^4K`u;.i/_P7T\tgL;1Oh %EoB/.K^6M!X6g2$">@`>[0U3_*?lknRSd^(/NPqR6(Eu#)KlTgC'UZf``'mZNKT6*RlZ[qCDdj%HPoSJFibXqoa>S.Pf+]rJs(pD %?QlYClr7'7j,2,e;< %i,T.?W3pLE5-Q;"EGFn.WM*eIERqT4VeV^8[OkO@;=_Z,8ESIB;p)/[>"0io,E?O*g55E2i=O*&Rh/<8@7Vro7!Tsq9:7]c8`EA&]I %SbkbDPS%]E,kn=epRDc[Dmt]u[S@4g9'ZnkYGfiR`fW!t5QQoX.a1O<"Xc476[_nY>MkM4ajYF^CU#)E[,>KHe2Ya0F]"\eldZ:eq&G-7j*4/P3<$V@3)6XL`c6%$X$'_4BH/DO``#@0V=1>-J<4Q7g/@0l7]n%o %UT^jeRt]oNa$)jg[gVO:DLA[(]j]cdn'8+2NTro3J(MfDhK>@Zb18RaYVBIc[uPNBc#69H)AEWj*LE^/9(LR'n$.#DjZjHXfK)JN %PdC*2$2i6":Q\>UNMh_E)^QB@f"RJ"[P!iOB3fOJnt>36[>pGe6c6+pn4L%+XDl7B=OSn*fTK*F0q%YL^[nbJTVZ0_0*Oj`iiq^G %%*1!SGXr^Z?B,-0*#15K]G)1W[9!K7Au[P15jbHfR4$^/[G %-A*IuAF!>AffBnV[aO&UoBehNs19Q2K)"NMg@un&9ii#uZ7V_=0bCONCk:(^`%rXkQ/2@d%BF=femn$a;[D"e;oo3U"k4'Z`C.04g %Cl[5$BBu^XP?3su3mX+h?"VH"C&L^SD,a[,&"d!_W?405L6Q#h&3,H"360STkTm%[[W?85J9HsT&(#6`q?b,!)fB%q\4X"8]/>I_ %[TfNZL>(@nd_8:9gY;1F&qu %3s"PumM&n!*fErh668XP?@uZZi/jmt7Q>NA(q'o'_j2U0i3qdO)o%[_1,Y6bCKV*E%?3=4Pth0[c:[t'YN*dJ+IGP/OK$e?_-j+0&]p=rBKp$+UWU[G&.sPRUdd1qcocms6%\Q&S(meFOY2qbs %E_W"i)*>$&qg*V0i]l8pjL.>A+C %Q&/kknV<&bj4A>(i3&#?=;_-r?gChRf/i'l=r)RW\J[^8UXsMhg9#j!#1t1,_Rh8pKO.;o0Ac:ZHEBPk?L+!-CMhq2U;; %968hAagGq2WL&cMfh-9,5@H;8)f>9d;hEg7;[:n+[I3#m\X%]K"K6<\D0X5IK6bs9Y4Y*W1M\WJmPg+hOD>4qDgc8=/LBgYdAO?S %]#S1a34TgG@Bg=@W@m4Q'\$[!]HK?7"Vc8>0'>$FKuA5PR\Z?^"Md8\Fqg2'$JFBXoKamHKa=9=Gk,c4[b?1$?d_fb0OdOW&&O %KLs1j.&k<#;>OUW'T5SA]fegLCapkWM1)=i9B@J1jKJ6',M:FjEUo;![Z3@j[W'EC%*+$sRQG[4.9nGF)u*/e61g8W=g>H6aIJ6A %&s2DGR*+In\_OBrH_]2Mf$55LQE-^QaW?^/qMa[NM,!l+U&F9%%,2SWr)(M)4Nk;jQ![#EZmLY^[=TDYVq?mi=APjI;Z&?C/`(@X %oi3#N,[1jleP*8klpXe60][Ek7V]#7\*=3Herco4A"%a%Q)''4X/u=@P3r98Sk*L5@%bFXRV92jE,'fk6,P:5B15k#SoHfSBXm:U %V;\.ffa&?3/qu5%F/%WZAP>Idi<#EaS\b#>,ggS[;bFrmP+!B4W]u%3d%t:t/t\;g#>2o<_E=npJMO&I*\OK[C8LH>bBCIZno0/= %A$=+o-,pK-`ksAL:WI^i7%,gPKSN3R9HrNUne?$o$)&l-gKhak:HVlk7?;Q4_\JuCYdT/-Q$Kln8`%HgVr:*L)E/kL\<5)):P!5& %8&fk%D.n@XTjIU(!fB?ocY0iYPS%`ZFB'`;No7QI_e^Z9O@!M8>hQ&lB@(V^F^^DpBXi"RAnR>TV;VKlVPNf5%7hc"GXa^'/4O*" %.L-d26GE%Zie.;s<+odn(6=rP&Z8,[G$[Y)6JKrPaeLYlWL7g:i"chDBq3^MY#1I)',Ug14f&SB<0B"U;suFB/nH4uaJcL!FoYCK %^oHIfGQ-teOD7qNKYuB8Qe2BbOjS)gjc"Wr(%?C4dr,VTibAl#D;g?*f>PBL,(Xg#I7pAJqCRgRKH?oGU'W+'TsASC'TH9(p+73i6X+$W %$J'iW90b>.jBFnqrM@n[M7"&M2@RCAP@Q#[^:c`g<,1P9E;$CYM1'`#M?Dh>Um9+um+_/3Zh:)]V,'7Rjc"U\PEUMrb,aWI&1Q7_ %7/$urRjf7\7b?kQ=A)9$"gYu68H`;$;U2h)J1KeS]B:VGO[QuZ:C.&g"k?M&JBK5N(/B^:bD"E4jm*AT&kC--(tJfTiYacXfDDEY %E3hTbJ4l^HH)qrNa;W(sS()iR"iXD4^l=N4SP%cqg2&U<;/8Pi5b`^Y+VlCA_blR+mB>s4)uisI[DfC,r[j[=d`7>sb@O;+B5TtD %ho7HEF%sV%):h$K<7]bB4?kQH$Y8hR<\M?a4`0H+V5O\"#0t(!"t2\TNie)mUBc2X1rHnhqJoeqoQkFlIbq3l\mnehQl8khV$< %e2kU`9i"bN;qVpj;;&GVhDKP,:$c(V`Hf@G[2eDk_Nc@nk5oF^>0GU.d5#Y-G@TOm<](A&]PBX]kW?e=Q.?N`dQ"S\3l\4CO"hel %7!*6[Pas5E=sq%n,[irIhb*4Yq)(_R.OZskH2SFKm+_0^1,mo[;YI5B0:!k_Nn4WPl[0Sp&+=;cRhN7fPr6DQ$>c+Ef>f4l!cF)bDro-2CO8B`k"O=cskZ*RIGnLB:C.lPEQbR^S %ntjY%1PdJQ5Od["r?i.oQVfPpcEMbP/O2hkNk(8AO%(`,p'&#R%XiK %JOB3Wk;1q3ZN`ZY-7)]+aN6`4U7ZoK;4Ij#el/qsaE@;(,bZc5R#/SF+X&WhV3TcQ\qKEg^Fr#cqOuOOC#1'b7)/^JiVi8NDUFT8 %i`>569G(q+o/>UDX#LV/EPO@kRm0)UKDsI%05/UUn&RHigp[ln,(&dipMHEtp3D9K2H4F?Oe0\-I?>IZXhMI3C4B_@>1)ki]BO%h-:^#9NVOo4q:_\*AF%s[#L\,?/nouJW,Zqg8GJo+A=YPfg$Dm4k)!^!%U[1KKk'JhcZ\4MI#3W %T:nFV3JZPa0KH)6?VsT=$j7.7FJp[K`_3:/iV6=H774r%/6JgACa]nh;FP@WeOKYk8*b!;\5KC>e!kgkXi%Ef,jCJO3+R.SlJmuV %fh4'%]X5umcXHjj/\<1J3g$Ocr>YLgR3W8dQs0!9thl#T^J\l%>o4:CVBJ=>h%>nHc/D\%!H,tef9f/hM>c4D2,/@2$TOdHQ["VV2N;EOafAKpfpI8UBmkO5+l]:L0ka1`1Y %L68mSo0``ElU\>f(e$7*44o(P1$a49\U\It^Z,@=&0hod,X-8f:^?QImhK>M!'2S7i$1KP3k>Qhj*uHuc,bUd=X8[NH,coF;c-NH %*\iXV)6U@A$t_"1%R_!99NVOo64R.p*AFn62NQ*O-j4fadpt:g-YDtkJ0ic'd9)*TXN,aUFlNa %HZWL&+=cZ>mI %1NKZoF9HErS`TRhWX@+4JuXSY2qDNXg7__>+j]__+XHPXUQJmpJ1'b1M`L"6$Kf%N*>[$MZ;'57:;.Y*oQ"#H7 %hVpV`R)_`2D#c&&!+)FN[+58V?="Sl-F_+AopmJ>$/X8OX/'H2%^!K89ta>0&FVKP8#5Tf&VlsW7[K]OdBDc_dnY@o:BqI(F@c:N %PbM)KI*#t@(IdL5(KJ(_eAf+BeC^@4Puo342ZHIYES2V:4?sESm<@("&?E#O@4HP>SGUMgc`<\^kWqF`#S"Y^&@dXDUBC8)H$19Q %0W-2i%9%8^N6-V^h'"RH#L%#_94?O,NEO#SC]2.d'RaZJHHVnrmZ<]r% %U4G@:F.9dEA_?A&CjBWV`!Lm9$hHImeuHY&E;_,Aa,<"CWQ*ggbe6n>;'o`(pN];58%7pee@l%S-4*613rl\WplaBU8>GnGd]2PX %FkjR'_Y/e"`/67>`E2od9P<&o%)?Cr+R8!Ke_'uPb"LdI"EF!3j>K;o9rWt1\mL^^HV5Bulfh^>`)5G`bF]G,O^a>2@DuE'NcZY/ %7ol'$!$!S9U]EkH*R_))VgK7FAA'ACYSWea]4F27?"[-!#i&bs0ZfM^B^[1g[Mep,d#!LfN)c0U9:/c@(:0E/Cu=,OQQ0 %p5;Z6I:Afm+T6G.rq#NDDh[->Qb@]m64OEXAtP31B\Rk!!O?oCd+C&2q=0?eNZVWDl.IT,LP>EUZ(q>O=]bIEN'XQJLY==C!::-p %\E3nA4r&VA](hH_b`G:UDhtI-4)3h$!,`OQ]FMjPZEDJ$k;Q`83Gg=AFD,i$Us3hj"1QRChfoU'U^e35p.i`1U-#L%E2BJu6BX.[ %.N4s&B"4nu];SSIL4^[F'+\+^5ZXdLC?n`Sc>`;"TA`*TS`2tBm<)8Rn!R$kH`#Jt-F4\1;%;i7SE3)R50GNIGW]K%6SjihCR4^( %S'gaAHC'R"YZUqeVSAGX"8E1u42dd3fC9NqNjE_DkLefBLn85AfA7Y-^^LgH+T+k)ME\V0#(FB`*b&Pb]a8V@*g.N3S_++Vli_9Z>79=.n\u7#G5Q<(i %IH]SKm?g$ZW-tGMp@I[PJ$u)4H^Q/7(I#(()5Ipj@ba\W<*' %-a@XIJ7YI3Q%&2IlUjM+]_lDsC1g`eCqR$[n]T_?;4P-"dL#7B3slHk,F`8#f5r\(E`jm25(poV$?us:',6tFpl[d]FjICPhB\t( %!]6GN.WJ?qKg'D$k(nQbC[ro_AYsAVRBfZ4=_;sa=2qfYK,l6;*L1_[k]$qrR4JA.m8VV&mO/(s,V9MCSG[OYh91(sL/oal/obkJ %BF^k]M:D:[##.+(.\K,8T0dqqqg2HfnJO_;78']C`,@SJ>Y`'s(A=702V:)J.Xa9uK#)&360loS!c*@hWbka%hhV5-ZNrs>7c]DD@DnhAYD-[iG %rc=@[NH(qVVbm@$#j1XUX;bffZGI_(FR%L#)3LG`#^]aLKB=ft-\4f*4b'>=6!Lu8a7#t#6e[BfIpefan^n^%0KLqATkT:r]pM<' %BSG#i*J4^'`O*3]1rcBjZT<]b0bol_GdhYI19fIUd6nD3Er>NKK,BG0au/kEQU?D'`f]a\/?XO?P(4b#]RWtOml*d*p4B\IpI[M; %k1%#6.(teqPS!7`0S:@R8):hP(1r+bU05G[6ZPC]+UKPs6BW/eP.*n>#tQi"HF[*%*saY:[GYs+F>2tG&XVA^8H;!ImB+ssn*G`q %Y==:ulsFuSA%G'=CCZ`/li`](3#)(K+DG"0Ilp;MSOTc6NlfXB!bUTV-V-_6qkoXQ %M^S[3WEJb#LlNo>P2a\:nr*"sRXcG\3e!SPIbHFILf(FXh'@^shj:GL]"*JaX@@c@.e13!$TV%.H= %VYrQ@$(HT5C/29K$/4!MZb1r:JJ#9sm`9N"Vom9]_FTH7JnQhZgbRlKLBP<)GW2p3PYI!:J4R?F,=+q75>SIfr6iV7qrPbUQg+jk %2B^dimX/bq:i-RKQ(G93n[B>'![ag]kRl)4['?qXik'A2jlP*7ju-n3C*F0bE.^7@'gG(Zii=oX&NH#(,ihf%ja@82isM^_$.<0t %Qh'i#"S0ST+R:iP'=Q>M3iF"g]Z1c %I[q,N7*(H\G_'nG5tIq+d@iqZ36ldq^$&:Z?aR.o#)(7&B=p\=5)uXc?Xm!9n %UOU=TLuUDCj'8;0Ee@\*]T<'E`b52dfK\f+rr<_s,b'fc[Y2AJLgCXJd0R@_9^.Yf$mpEl^&7DNX>!*&CDpPC,guI,,WZA[$S'B0 %HT_e1ZJ8BqlNM8+:M9CTJ;.=rN)I7^ZYsu1$K\[aRQ<+l4t`,KO"TfJHo(+$XqehgY3`6]7Xs]9m%'f1"Sm9U0*^Kk.hnVr,$+D&PJE(6,f9B-m])ao+eme)Z7#P(o5-FV>o""Rh %.L`+ajo[l]1Gtd)6:26^q*ZZH5-KigYo^j*'nntC\:WC8)HnL`Y0VA`,f'a'?*Fd;_:(%]I%Unq3qnaBU^ELFJ?S;1pRGuk##>3[R< %\02!N>pW+JY4>bCmj`&I@!r4;[p&&I=%278;dYsV#5-PMOO9nr$2R2SGE$i%6X%"m(B;&?()J^:$_iH:1Nf%D*T*9rMZ_@4*4#"l %V-%qeKPh>&UY)qlK?$:RXIm)H\.1_DNL6>=$1Dpl3h@:-*oR7sW()`QU/F"u8'$r1.Cr1d[M) %="f\8TW/aJ$MonlAnh<';a^b8#'sGK$q%4B?/&H!XI""E"IUhN:$hBQ%EU0s4[J"j84t\5jVBr;;Yc-s2'Amr7Q`b=`e!Y9's%L9 %aBJq7@ZVKCX*-L=j_)rC$n%NOI"g:J7))oJ9RfR\CJ>J,4@:G^HLVH5&uOk&'aDiKFJpB5BM>[g!/Ndgch&rG5&S`/hau-cs-U,P %Dk+];qN7Gm$kj$Z\91D0^+oQ/.lmkWKc-UTXn3#[SPCVeJM&JJh`)OiUKd6^YiB+T1NN![m]?Xm?+S?@D_ip"3,gXZjB'=:\!&/I_\0?DQ^jl;F& %ojLfa=:\ND=\&UM>_Gd\pLfl]c3qHdkreo+e-2U(Eirg(nuao>0bbe.D\ed-=%+"?c@EWeITCn,/0V.0'`:kLQeV.fA3lmi+gVCI %]?;gA%I=E]*iLUCHL"S5YQf(F'7qs+Zo]pM8aJ\AbU:;[*&8s!*pPL^;OsQ__LN7E!'-PhYYr#O@Hb$$=)'H@&(K:;AC0XXS9EZ3Mi-nut>0U9@gdj_DX_5!Ugk3Mo73]lgF**fVQt-[W#6kIO%,!@s"Nu4D_B[0! %3DfG!fSJ[-+OEWhGpJ459&`iq,T5$>;h]6]P@$<<\N?iWGck+>_Q/0:_K1,Sk9D1;aL8;:d=6o\?%qr]5=6X]]p+R^YNiV/Q!E&< %mCatlm8Y0+Kej0p]nEq1YNj.cWL!`BcdZ(EWrhcs'p*0Yld^Qqhd4o>liX&s$=RqP.Z(hGkCCdu@QikRK'_SfYQ&d/S8q1GDXq?gu"+l#(<:[L;[JDp\+_+I6-0@4uLi>pqM2I %LHt^N?14k^5D)bXP!,D>1#Vs9ljuni0R6V-pq.3#pqNct*iYhEW;&LC/N<<*ME`o%H;4rh!:Bl#86t.4KprGYNLafniW?IW\m%Sk %o`AmoalCWdWXF2?Z8%Z:\`WN?Q-qOQXS\]QC$?7]Xt"tNQK)prZde7BP9"rp\+i%Y3V.#_>4&Q"[fMD"34 %'%=R]&jt-XL6#>i>7-FC:NFV&G'<4J*Jc$W5hM)a9;k?XL`/a1a,O_6RKn>>kgh2o4VTt78H_-NamDJYF6ZRu,VB`?Wbp/&R*3"+ %FPCo[+4jp78(iSV(\+L[.l04K9(L*[#SHUMQiH3Oe*d.@iWD?cRf2E9M=uEEDE.;_p>-ij$ %M'P!eX^)"tQH9]i5Z*??P2\jCOpYW.Ynb-E'mkAGd_3fsN%7=)EP9>8`oZ`UQ=Rfp`0-rkJCV^aX0n:gC3aY=V^W_sDniF,7b7`W %>AYP;R.$?H?_sc+^M5Yc`A=W1higqh12][g_Y3Ej2_Z.CPQ\7VfV %f3Wj(g\Sd_l$>,Kni@>)8s%Q7a!sM7o@ct.%#Vq]=F[.(mUZTu?7&IuHQ!pFX0bYU+GgY\:=9AfZa4pIVL]KIg..">-8.oJ@iStWA)e%DQgh2hp',(5jADXdMu8JU$)OgS8Vr!QUr<4]8[@p"![Uu9@L4Q^r_[/ %b]:d2KENWD[d`W"ir/tZ7V %B$J?C'J>_A(H8:,4pqL1he3bcg8/A3!0;Q>CJ710BfSdRP0g8X"%5eZQ[sM-:iFD_%dt#<)4\GD@9<[QO;=gm@lVcj03H$kdcETa %CaA*l78o%0J3FfbZeu08Jj.1A(sKdpMIMHJ&PN8m-3V$SI9cEX=t(S!3kh&C-.e,Lp8;/c9D(ddGXS,@>aerj?]8='W(4D;53/6T %Fj66U656YfV]rXMHf/*=&FWZe)hQ23nSWA!N+LX-@,N>>`8n4Bo8`N@2)?%,d>PN6!Tlht< %6B4^ZT[rER-]sTQc4GOJ)/PH9^b,ko;+uDI)"--&'$Yf@\[;IbXp.f$(R^.82T'BD,fY'UOL*Wm'B7>BT%.b'EQ"@4)4t\j/k-3W,6#[dR %A"i\&G4^m50S>><(deGdcLs'j#VWTHRFEmp$1PLh,mi?$*XO]a_&K!b1Pn+b"toCLCc.=UE=k8gU(klu:rnk77au!YXTB53k,%_h %j4VPY+JB[j4u0"G5&p,PPSbogEklWWZ)g#FAKdT$ST(YaJS,De-lL]80hB@;oK]QVor8%fR'BE*<mn=)Y&KH$uFuKheBR]j#'^JV)WsHfYPb@60$@p`(7P^Wg.$?N.3V2U=GV9!6KJ %8DqGMTg"/R'ag!adgX+#GLq=b%gd&qL8`)-H'c4Z-R`,_Ij&6nUpn_QK<1hVkbR[#EuhG](jfhGD;%UGK*:Cm*XV1bko`;qg:+dZ %.+OA[>nFE)*uRs4]#bIJ?#T<$gW8UaTX2@4b&=s=[r3"!UrcG8s/pFG6?#6iYF&/0lH`N?EYMInOcEe,N4B[#@7L60R %eCkk?*S:@5CN!e-7I=XQm5U2nqe#2!:2M#O)l/YFh%d!&9*17:YLUesC%FI96Nn(bE]M5:H=@R[^$RrCb$l,oSe>$UhONL/*]5:? %3jA`,2kRK%_WFJ^;8po.kc`Ra5h'=l4piiQidWbMbim@7-"lsJ>/Q>g!gK[e\KjLKt5@O"5>XN2++`0Q_m>hBa4Q!S(#;,+nk9?:!52le6R %F$%3iXQ%]OE,F>i,VeaqIS!MuPVa'o0sGMPA(X.daZ5(U),%-k44\Wl\n-PFd5E!%,!8;[!9_P>n74Qe7)0XEUGP\@J.$tk0=&H> %c`o(,2*MY-^hsmt].\iX7@5&28C/L^!tQtD^7P%iT!L7O_k@6gD?`,:X#uKK7Y5!7AdlQ(kE'j@#TEE"(m$E)+\@2pQ,aY#R5Pch %HB%(H!ZnHN,#,-Rrq:48SoMVO&Z86,k)dBeluIS$%+ttQD$!%jp%nSUdeK"r68`j7p$UrVcZt@j.M7eaZc'C&VQM7CI:+p'XE.;3Ke-@HK+OX"CWnI@ %_I.?%(ku)<<6C4Y#6!=4S=O:5W?%-)(WPbE*%UoJeh_q;oH/H>r/Jt(A!#[6]MWu0cV7V$"%'i774pq':fVR@uRAITL:02UWjgikTFlO3e!>m/(&JCHnl.rhUhJ&=p(tBCDLp=&SFirg7nPG>bD,=e*U=spB_C8pTasJCU=:__a %L,u_PcS4ab\MYXINh,YaoodVAc'\")]L*<^cmk'L$3N=8bZBVB:nBA0P8`.>LoDsdg]AQ&V['F`0`00/f]?J_P_VgKbNAjZ&g,!C %#cpS`M^SiM>P/mPrG)Vq[13+bHA5#9\M%OU";5'_bXKs#6Kjc)H$gPI67FH`j_NkJJY>!GXU1f-j#D"YZ=!r;"*Z(!JieU@nf`_h %;WU504!*+;Z0$WHae*XuA?peRm$G;3C0kWPiP\#"on?)r5DZ9YRb.4bRNN@D):Nd5)b=N/Lp?'_g;c/+TrqV:c4UD_Tlu$Qn7m/X %>iW*?hD(VeFui2nFECb\,9fMLEnVT.(4/rFo2QUaZY>rbM)s^^k=;Pc@39]P!R![pmj;jMDY5OBFU-C&[J\eFkm4SFgklZ7d$p,h %5<0C'b9m+)omGtq]A7G.AgA"m38g?Rfo5Jc!ZT1Ab8u3gfVS9l+ujp5-'`j?"daV=P**X_=$.4\drE8ZIP3S]+fKqa[Y%l"tfU4HSo"meVdk+TKE.uY]ME:c>n %nl;&/8$S,6FX/^&"aT/V"^1SS=WIs(a]r\nM&\X4!ne[&`ds[":*d')b;4fZ7IIGkjSG)t5?kuD""@7B_VLPs?NQ\%qt3*QqHeq#2[^/Op5=q3Bd76Kd!"?0#-jIJ]R=lZbSD$Hm?EekV! %MW*uqFm+10BnuT\o'cU81$.HQI/1[prgWGes6`[4p[RSLs4d#Bnm?kA_]SmLYCHK;^\n)shgb[npFh$obHLs+\$*RGktcg.l`Yg: %mD!"Xq>/.hJ,@Drs8;b4?iT]Srqo!3>d)f?s8)3`r*OsNgV5uZBhu %AI9_PrivateDataEnd \ No newline at end of file diff --git a/docs/wikidocs/Webwork 2 HTML form buttons Howto.html b/docs/wikidocs/Webwork 2 HTML form buttons Howto.html deleted file mode 100644 index d5a8818e3..000000000 --- a/docs/wikidocs/Webwork 2 HTML form buttons Howto.html +++ /dev/null @@ -1,133 +0,0 @@ - - - WebWork - - Webwork 2 HTML form buttons Howto - - - - - - - - - - -
-

HTML Form Buttons and Webwork2

- -

This Howto will describe the usage of HTML form buttons to invoke different behavior in actions.

-

Determine which button was pressed

- -

The trick is that the type conversion of XWork can be used to test which button was pressed in a simple way. When a button is pressed, a parameter is set in webwork with the name and value that are specified as the name and value attributes of your HTML button. XWork converts this automatically to boolean value if an appropriate property of the Action is found.
-These boolean Properties can be tested to determine which button was pressed:

- -
-
<form action="MyAction.action">
-<input type="submit" name="buttonOnePressed" value="First option"> 
-<input type="submit" name="buttonTwoPressed" value="Alternative Option">
-</form>
-
- -
-
public class MyAction extends Action {
-
-    /**
-     * Action implementation
-     *
-     * Sets the message according to which button was pressed.
-     **/
-    public String execute() {
-        if (buttonOnePressed) {
-            message="You pressed the first button";
-        } else if (buttonTwoPressed) {
-            message="You pressed the second button";
-        } else {
-            return ERROR;
-        }
-        return SUCCES;
-    }
-
-    // Input parameters
-    private boolean buttonOnePressed=false;
-    private boolean buttonTwoPressed=false;
-
-    public void setButtonOnePressed(boolean value) {
-        this.buttonOnePressed = value;
-    }
-
-
-    public void setButtonTwoPressed(boolean value) {
-        this.buttonTwoPressed = value;
-    }
-
-    // Output parameters
-
-    private String message;
-    public String getMessage() {
-        return message;
-    }
-}
-
- -

*Note_: Do not use String properties with buttons and test for the value that's set. This will break as soon as the _value attribute of the HTML button changes! This is likely because the value attribute used as the text shown to the user.

-

Dynamic set of buttons

- -

Consider a web page showing a shopping cart or similiar tabular data. Often there is a button belonging to each row, in case of the shopping cart a delete button to remove the item from the cart. The number of buttons is dynamic and the id that couples the button to an item cannot go to the value attribute because all buttons should read "delete".

- -

The solution is to __name* the buttons like delete[123], delete[594], delete[494] where 123, 594 and 494 are e.g. the items' ids:

- -
-
<form action="UpdateCart.action">
-  <ww:iterate value="items">
-    <ww:property value="name"> 
-    <input type="submit" name="delete[<ww:property value='id'>]" value="delete" /> <br/>
-  </ww:iterate>
-</form>
-
- -

When e.g. the button for the item with the property id == "27" is pressed, a parameter named delete[27] and value "delete" is set in your action. The trick is to us declare your action's property "delete" as java.util.Map. Then, a key will exist for the button that was pressed:

- -
-
public void class UpdateCart implements Action {
-    // must be initialized to be usable as a webwork input parameter
-    private Map delete = new HashMap(); 
-
-    /** This is somewhat counter intuitive. But a property like "delete[OS:27]"
-     *  that is set to "delete" by webwork will be interpreted by the underlying    
-     *  OGNL expression engine as "set the property 27 of the action's property
-     *  "delete" to the value "delete". So we must provide a getter for this
-     */ action. A setter is not needed.
-    public Map getDelete() {
-        return delete;
-    }
-
-    public String execute() {
-        for(Iterator i = delete.keySet().iterator(); i.hasNext(); ) {
-            String id = (String) i.next();
-            ...
-            // do what ever you want
-            ...
-         }
-         ...
-    }
-}
-
- -

In this case it would not be necessary to iterate the whole keySet because it contains only one key but the same code can be use to handle sets of checkboxes if this is prefered later:

- -
-
<form action="UpdateCart.action">
-  <ww:iterate value="items">
-    <ww:property value="name"> 
-    <input type="checkbox" name="delete[<ww:property value='item'/>]" value="delete"> <br/>
-  </ww:iterate>
-  <input type="submit" name="updateCart" value="Update the cart"/>
-</form>
-
- - -

The two implementations can even be combined two provide a quick "delete this item" button and a set of checkboxes for "mass updates". All with the above code, cool eh?

- -
- - diff --git a/docs/wikidocs/Webwork 2 skinning.html b/docs/wikidocs/Webwork 2 skinning.html deleted file mode 100644 index f8df64167..000000000 --- a/docs/wikidocs/Webwork 2 skinning.html +++ /dev/null @@ -1,69 +0,0 @@ - - - WebWork - - Webwork 2 skinning - - - - - - - - - - -
-

Skinning in Webwork 2 can be done more than one way. We will show how to use two skins called "html" and "wml", and we'll be working with the following directory structure:

- -
-
/WEB-INF
-   /web.xml
-/html
-   /index.jsp
-   /Register.jsp
-/wml
-   /index.jsp
-   /Register.jsp
-/index.jsp
-
-

Classic Approach

-

If you want to go the Webwork 1.3 route, simply place all actions in the default namespace so that they are accessible from any URL path. When you create your views, place them in the sub-directory that corresponds with the skin's identifier.

- - -

Your action configuration would look like this (simplified, without defined interceptors):

-
-
<package name="default">
-   <action name="registration" class="x.actionset.Register">
-      <result name="success" type="dispatcher">
-         <param name="location">Register.jsp</param>
-      </result>
-      <interceptor-ref name="defaultStack"/>
-   </action>
-</package>
-
- -

If a user requested http://yoursite/html/register.action, he would see the JSP located at /html/Register.jsp.

-

Namespace Defined

-

If you require the use of namespaces, you can do the following:

- -

Simplified configuration example:

-
-
<package name="user" extends="default">
-   <action name="register" class="x.x.actionset.Register">
-      <result name="success" type="dispatcher">
-         <param name="location">Register.jsp</param>
-      </result>
-
-      <interceptor-ref name="defaultStack"/>
-  </action>
-</package>
-
-<package name="user-html" extends="user" namespace="/user/html" />
-<package name="user-wml" extends="user" namespace="/user/wml" />
-
- -

The last two package definitions extend the first package, changing only the namespace. The view result defined in the "register" action has a relative path. Because of this, you'll get the same behavior as the Classic Approach, but with the security of knowing that ONLY those two paths can be accessed for the action, instead of ANY path.

- -
- - diff --git a/docs/wikidocs/Webwork file upload handling.html b/docs/wikidocs/Webwork file upload handling.html deleted file mode 100644 index 980e7ed05..000000000 --- a/docs/wikidocs/Webwork file upload handling.html +++ /dev/null @@ -1,127 +0,0 @@ - - - WebWork - - Webwork file upload handling - - - - - - - - - - -
-

File upload using WebWork

- -

Webwork comes with built in file upload support. Uploading a file is simple. When ServletDispatcher begins it checks to see if the request contains multipart content. If it does the dispatcher creates a MultipartWrapperRequest. This wrapper handles receiving the file and saving to disk. It is important for the action programmer to check to see if any errors occured during processing. Three properties can be set that effect file uploading.

-

Properties

- -

Webwork properties can be set by putting a file 'webwork.properties' in WEB-INF/classes. Any property found there will override the default value.

-
    -
  1. webwork.multipart.parser - This should be set to a class that extends MultiPartRequest. Currently WebWork ships with two implementations. "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest" and "com.opensymphony.webwork.dispatcher.multipart.CosMultiPartRequest" If the property is not found the Pell parser is used.
  2. -
  3. webwork.multipart.saveDir - The directory where the uploaded files will be placed. If this property is not set it defaults to javax.servlet.context.tempdir.
  4. -
  5. webwork.multipart.maxSize - The maximum file size in bytes to allow for upload. This helps prevent system abuse by someone uploading lots of large files. The default value is 2 Megabytes and can be set as high as 2 Gigabytes (higher if you want to edit the Pell multipart source but you really need to rethink things if you need to upload files larger then 2 Gigabytes!) If you are uploading more than one file on a form the maxSize applies to the combined total, not the individual file sizes.
  6. -
- - -

If you're happy with the defaults there is no need to put any of the properties in webwork.properties. Here is my current webwork.properties

-
-
# don't really need to set this but I put it here for testing
-# various values
-webwork.multipart.parser=com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest
-
-# put the uploaded files in /tmp. My application will move them to their
-# final destination
-webwork.multipart.saveDir=/tmp
-
- -

Note, while you can set these properties to new values at runtime the MultiPartRequestWrapper is created and the file handled before your action code is called. So if you want to change values you must do so before this action.

-

Sample form

- -
-
<%@ taglib uri="webwork" prefix="ww" %>
-
-<html>
-  <head>
-   <title>File Upload Test</title>
-  </head>
-  <body>
-    <h1>File Upload</h1>
-
-    <form action="FileUpload.action" method="POST" enctype="multipart/form-data">
-
-    <center>
-      <table width="350" border="0" cellpadding="3" cellspacing="0">
-      <tr>
-        <td colspan="2"><input type="file" name="FileName" value="Browse..." size="50"/></td>
-      </tr>
-      <tr>
-        <td colspan="2" align="center">
-          <input type="submit" value="Submit">
-        </td>
-      </tr>
-      </table>
-    </center>
-  </form>
-
-</body>
-</html>
-
- -

That's all you have to do to upload a file. No coding required, the file will be placed in the default directory. However, that leaves us with no error checking among other things. So let's add some code to the Action.

-

FileUploadAction.java

- -

Before the action method is called the dispatcher will upload the file. Then we can get access to information about the file from MultiPartRequestWrapper.

-
-
MultiPartRequestWrapper multiWrapper = 
-		(MultiPartRequestWrapper) ServletActionContext.getRequest();
-
- -

The first thing you should always do is check for errors. If there were any there's no point in continuing, most methods will return null. Unfortunately, currently there is no easy way to distinguish what error occured making it more difficult to route to different error pages. (I have improving error handling for file uploads on my stack of things I'd like to do sometime).

- -
-
if (multiWrapper.hasErrors()) {
-  Collection errors = multiWrapper.getErrors();
-  Iterator i = errors.iterator();
-  while (i.hasNext()) {
-    addActionError((String) i.next());
-  }
-  return ERROR;
-}
-
- - -

Now get the input tag name for the uploaded file and use that to get information on the transfer. Since you can upload multiple files (just add multiple input tags) at a time getFileNames returns an Enumeration of the names.

-
-
Enumeration e = multiWrapper.getFileNames();
-
-while (e.hasMoreElements()) {
-   // get the value of this input tag
-   String inputValue = (String) e.nextElement();
-
-   // get the content type
-   String contentType = multiWrapper.getContentType(inputValue);
-
-   // get the name of the file from the input tag
-   String fileName = multiWrapper.getFilesystemName(inputValue);
-
-   // Get a File object for the uploaded File
-   File file = multiWrapper.getFile(inputValue);
-
-   // If it's null the upload failed
-   if (file == null) {
-      addActionError("Error uploading: " + multiWrapper.getFilesystemName(inputValue));
-   }
-
-   // Do additional processing/logging...
-}
-
-

Further improvements.

- -

Code above may be packed into one nice reusable component (Interceptor) that handles 90% of all typical file upload tasks. And Action does not know anything about web-app and just gets its files. Neat. See WW:File Upload Interceptor

- -
- - diff --git a/docs/wikidocs/What are the default variables in the value stack.html b/docs/wikidocs/What are the default variables in the value stack.html deleted file mode 100644 index 4899e3fc8..000000000 --- a/docs/wikidocs/What are the default variables in the value stack.html +++ /dev/null @@ -1,104 +0,0 @@ - - - WebWork - - are the default variables in the value stack - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
VariablesDescription
attrscans the request, session, and application attributes, in that order
requestrequest attributes
sessionsession attributes
applicationapplication attributes
parametersrequest params
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Defining Java ConstantVariablesDescription
ActionContext.PARAMETERScom.opensymphony.xwork.ActionContext.parametersSame as 'parameters' above
ActionContext.SESSIONcom.opensymphony.xwork.ActionContext.sessionSame as 'session' above
ActionContext.APPLICATIONcom.opensymphony.xwork.ActionContext.applicationSame as 'application' above
ActionContext.LOCALEcom.opensymphony.xwork.ActionContext.localeFrom locale defined in webwork.properties else from the request object
ActionContext.DEV_MODE__devModetrue or false if in development mode or otherwise whereby resource bundle webwork.properties, xwork.xml, converters, validators will be refreshed when changes
ActionContext.HTTP_REQUESTcom.opensymphony.xwork.dispatcher.HttpServletRequestSame as 'request' above
ActionContext.HTTP_RESPONSEcom.opensymphony.xwork.dispatcher.HttpServletResponseSame as 'response' above
ActionContext.SERVLET_CONTEXTcom.opensymphony.xwork.dispatcher.ServletContextServlet's spec's ServletContext object
ActionContext.COMPONENT_MANAGERcom.opensymphony.xwork.interceptor.component.ComponentManagerWebwork's IOC component manager
- -

For further information
-@see com.opensymphony.webwork.dispatcher.DispatcherUtils#createContextMap
-@see com.opensymphony.xwork.interceptor.component.ComponentInterceptor
-@see com.opensymphony.webwork.WebWorkStatics

- -
- - diff --git a/docs/wikidocs/Which portal servers are supported.html b/docs/wikidocs/Which portal servers are supported.html deleted file mode 100644 index 8ba9f9083..000000000 --- a/docs/wikidocs/Which portal servers are supported.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork - - Which portal servers are supported - - - - - - - - - - -
-

List of supported portal servers

- -

The following portal servers are known to work with the webwork portlet integration:

- - - - -

If your portal server is not listed here and you would like to contribute
-required config files and additional deployment descriptors, please add them
-to Jira. http://jira.opensymphony.com/browse/WW

- -
- - diff --git a/docs/wikidocs/Why am I getting RuntimeException saying Compound Root cannot find a particular Object with a particular property.html b/docs/wikidocs/Why am I getting RuntimeException saying Compound Root cannot find a particular Object with a particular property.html deleted file mode 100644 index 8175e9e5a..000000000 --- a/docs/wikidocs/Why am I getting RuntimeException saying Compound Root cannot find a particular Object with a particular property.html +++ /dev/null @@ -1,24 +0,0 @@ - - - WebWork - - am I getting RuntimeException saying Compound Root cannot find a particular Object with a particular property - - - - - - - - - - -
-

This exception could be thrown if WebWork's development mode is turn on. It is done through webwork.properties.

- -
-
webwork.devMode = true
-
- -
- - diff --git a/docs/wikidocs/Why didn't my webwork action tag gets executed when I have validation errors.html b/docs/wikidocs/Why didn't my webwork action tag gets executed when I have validation errors.html deleted file mode 100644 index e56128af7..000000000 --- a/docs/wikidocs/Why didn't my webwork action tag gets executed when I have validation errors.html +++ /dev/null @@ -1,34 +0,0 @@ - - - WebWork - - didn't my webwork action tag gets executed when I have validation errors - - - - - - - - - - -
-

WebWork action tag will not get executed when there's a validation error with ValidationInterceptor and DefaultWorkflowInterceptor in place.

- -

One way to make the action gets executed if to have the action's execution method specified in ValidationInterceptor's excludeMethods parameter as show in the following snippet.

- -
-
<interceptor-ref name="validation">
-  <param name="excludeMethods">input,back,cancel,browse</param>
-</interceptor-ref>
-
- -

and defined the method on the action to be executed as one of those excludedMethods, eg.

- -
-
<ww:action name="myActionAlias!input" executeResult="false" />
-
- -
- - diff --git a/docs/wikidocs/Why do I get error message saying Attribute 'short-circuit' must be declared for element type 'field-validator'.html b/docs/wikidocs/Why do I get error message saying Attribute 'short-circuit' must be declared for element type 'field-validator'.html deleted file mode 100644 index b47166594..000000000 --- a/docs/wikidocs/Why do I get error message saying Attribute 'short-circuit' must be declared for element type 'field-validator'.html +++ /dev/null @@ -1,26 +0,0 @@ - - - WebWork - - do I get error message saying Attribute 'short-circuit' must be declared for element type 'field-validator' - - - - - - - - - - -
-

The DTD needs to be of version 1.0.2 instead of 1.0, as the short-circuit is introduced in the 1.0.2 version

- -
-
<!DOCTYPE validators PUBLIC 
-  		"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
-  		"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-
- -
- - diff --git a/docs/wikidocs/Why does FreeMarker complains that there's an error in my user-directive when I used JSP Tag.html b/docs/wikidocs/Why does FreeMarker complains that there's an error in my user-directive when I used JSP Tag.html deleted file mode 100644 index c4726e1f2..000000000 --- a/docs/wikidocs/Why does FreeMarker complains that there's an error in my user-directive when I used JSP Tag.html +++ /dev/null @@ -1,30 +0,0 @@ - - - WebWork - - does FreeMarker complains that there's an error in my user-directive when I used JSP Tag - - - - - - - - - - -
-

To use JSP Tags in FreeMarker template, the following needs to be included in the web.xml

- -
-
<servlet>
-    <servlet-name>jspSupportServlet</servlet-name>
-    <servlet-class>com.opensymphony.webwork.views.JspSupportServlet.JspSupportServlet</servlet-class>
-    <load-on-startup>10</load-on-startup>
-</servlet>
-
- -

The snippets above, register a JspSupportServlet with the webapp, and requires that the container load it upon startup. It provides access to the servlet instance itself where valuable information like ServletContext could be obtained. This is needed for FreeMarker template rendering that contains JSP tags.

- -
- - diff --git a/docs/wikidocs/Why does webwork keeps calling my action's properties (eg. my getModel if my action implements ModelDriven) multiple times.html b/docs/wikidocs/Why does webwork keeps calling my action's properties (eg. my getModel if my action implements ModelDriven) multiple times.html deleted file mode 100644 index 96b09712a..000000000 --- a/docs/wikidocs/Why does webwork keeps calling my action's properties (eg. my getModel if my action implements ModelDriven) multiple times.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - does webwork keeps calling my action's properties (eg. my getModel if my action implements ModelDriven) multiple times - - - - - - - - - - -
-

This is due to OGNL's accessor calls. One possible improvement would be to have the action do some caching if possible. Say if getModel is called multiple times it might be worthwhile considering the possibilities of caching the returned model itself.

- -
- - diff --git a/docs/wikidocs/Why won't the 'if' tag evaluate a one char string.html b/docs/wikidocs/Why won't the 'if' tag evaluate a one char string.html deleted file mode 100644 index 94f9f64d7..000000000 --- a/docs/wikidocs/Why won't the 'if' tag evaluate a one char string.html +++ /dev/null @@ -1,39 +0,0 @@ - - - WebWork - - won't the 'if' tag evaluate a one char string - - - - - - - - - - -
-
-
<ww:if test="#myObj.myString == 'A'">
-Why doesn't this work when myString is equal to A?
-</ww:if>
-
- -

OGNL will interpret 'A' as a char type and not a string. Simple solution - flip the double and single quotes.

-
-
<ww:if test='#myObj.myString == "A"'>
-This works!
-</ww:if>
-
- -

Alternatively, you can escape the double quotes in the String:

- -
-
<ww:if test="#myObj.myString == \"A\"">
-This works!
-</ww:if>
-
- -
- - diff --git a/docs/wikidocs/Workflow Interceptor.html b/docs/wikidocs/Workflow Interceptor.html deleted file mode 100644 index 93f8702b4..000000000 --- a/docs/wikidocs/Workflow Interceptor.html +++ /dev/null @@ -1,88 +0,0 @@ - - - WebWork - - Workflow Interceptor - - - - - - - - - - -
- -

An interceptor that does some basic validation workflow before allowing the interceptor chain to continue.

- -

This interceptor does nothing if the name of the method being invoked is specified in the excludeMethods - parameter. excludeMethods accepts a comma-delimited list of method names. For example, requests to - foo!input.action and foo!back.action will be skipped by this interceptor if you set the - excludeMethods parameter to "input, back".

- -

The order of execution in the workflow is:

- -

    - -

  1. If the action being executed implements Validateable, the action's {@link Validateable#validate() - validate} method is called.
  2. - -

  3. Next, if the action implements ValidationAware, the action's {@link ValidationAware#hasErrors() - hasErrors} method is called. If this method returns true, this interceptor stops the chain from continuing and - immediately returns Action#INPUT
  4. - -

- -

Note: if the action doesn't implement either interface, this interceptor effectively does nothing. This - interceptor is often used with the validation interceptor. However, it does not have to be, especially if you - wish to write all your validation rules by hand in the validate() method rather than in XML files.

- -

- -

NOTE: As this method extends off MethodFilterInterceptor, it is capable of - deciding if it is applicable only to selective methods in the action class. See - MethodFilterInterceptor for more info.

- - -

Parameters

- - -

    - -

  • None
  • - -

- - -

Extending the Interceptor

- - -

There are no known extension points for this interceptor.

- - -

Examples

- -
-
<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="validation"/>
-    <interceptor-ref name="workflow"/>
-    <result name="success">good_result.ftl</result>
-</action>
-
-<-- In this case myMethod of the action class will not pass through 
-       the workflow process -->
-<action name="someAction" class="com.examples.SomeAction">
-    <interceptor-ref name="params"/>
-    <interceptor-ref name="validation"/>
-    <interceptor-ref name="workflow">
-        <param name="excludeMethods">myMethod</param>
-    </interceptor-ref name="workflow">
-    <result name="success">good_result.ftl</result>
-</action>
-
- -
- - diff --git a/docs/wikidocs/XSL Result.html b/docs/wikidocs/XSL Result.html deleted file mode 100644 index dae78f3a8..000000000 --- a/docs/wikidocs/XSL Result.html +++ /dev/null @@ -1,153 +0,0 @@ - - - WebWork - - Result - - - - - - - - - - -
- -

XSLTResult uses XSLT to transform action object to XML. Recent version has - been specifically modified to deal with Xalan flaws. When using Xalan you may - notice that even though you have very minimal stylesheet like this one -

- <xsl:template match="/result">
-   <result />
- </xsl:template>

- -

- then Xalan would still iterate through every property of your action and it's - all descendants. -

- -

- If you had double-linked objects then Xalan would work forever analysing - infinite object tree. Even if your stylesheet was not constructed to process - them all. It's becouse current Xalan eagerly and extensively converts - everything to it's internal DTM model before further processing. -

- -

- Thet's why there's a loop eliminator added that works by indexing every - object-property combination during processing. If it notices that some - object's property were already walked through, it doesn't get any deeper. - Say, you have two objects x and y with the following properties set - (pseudocode): -

-
- x.y = y;
- and
- y.x = x;
- action.x=x;

- -

- Due to that modification the resulting XML document based on x would be: -

- -

- <result>
-   <x>
-     <y/>
-   </x>
- </result>

- -

- Without it there would be an endless x/y/x/y/x/y/... elements. -

- -

- The XSLTResult code tries also to deal with the fact that DTM model is built - in a manner that childs are processed before siblings. The result is that if - there is object x that is both set in action's x property, and very deeply - under action's a property then it would only appear under a, not under x. - That's not what we expect, and that's why XSLTResult allows objects to repeat - in various places to some extent. -

- -

- Sometimes the object mesh is still very dense and you may notice that even - though you have relatively simple stylesheet execution takes a tremendous - amount of time. To help you to deal with that obstacle of Xalan you may - attach regexp filters to elements paths (xpath). -

- -

- Note: In your .xsl file the root match must be named result. -
This example will output the username by using getUsername on your - action class: -

- <xsl:template match="result">
-   <html>
-   <body>
-   Hello <xsl:value-of select="username"/> how are you?
-   </body>
-   <html>
- <xsl:template/>
- 

- -

- In the following example the XSLT result would only walk through action's - properties without their childs. It would also skip every property that has - "hugeCollection" in their name. Element's path is first compared to - excludingPattern - if it matches it's no longer processed. Then it is - compared to matchingPattern and processed only if there's a match. -

- - -
-
<result name="success" type="xslt">
-  <param name="location">foo.xslt</param>
-  <param name="matchingPattern">^/result/[^/*]$</param>
-  <param name="excludingPattern">.*(hugeCollection).*</param>
-</result>
-
- -

Parameters

- - -

    - -

  • location (default) - the location to go to after execution.
  • - -

  • parse - true by default. If set to false, the location param will - not be parsed for Ognl expressions.
  • - -

  • matchingPattern - Pattern that matches only desired elements, by - default it matches everything.
  • - -

  • excludingPattern - Pattern that eliminates unwanted elements, by - default it matches none.
  • - -

- -

- webwork.properties related configuration: -

-

    - -

  • webwork.xslt.nocache - Defaults to false. If set to true, disables - stylesheet caching. Good for development, bad for production.
  • - -

- - -

Examples

- -
-
<result name="success" type="xslt">
-  <param name="location">foo.xslt</param>
-  <param name="matchingPattern">^/result/[^/*]$</param>
-  <param name="excludingPattern">.*(hugeCollection).*</param>
-</result>
-
- -
- - diff --git a/docs/wikidocs/XWork Configuration.html b/docs/wikidocs/XWork Configuration.html deleted file mode 100644 index ed24ce821..000000000 --- a/docs/wikidocs/XWork Configuration.html +++ /dev/null @@ -1,33 +0,0 @@ - - - WebWork - - XWork Configuration - - - - - - - - - - -
-

Overview

- -

All action configuration is done from within xwork.xml (see Configuration Files for more info). In this section we discuss the various elements that make up the action configuration, such as actions, interceptors, results, and package.

- -
    -
  1. Package Configuration
  2. -
  3. Namespace Configuration
  4. -
  5. Include configuration
  6. -
  7. Action configuration
  8. -
  9. Result Configuration
  10. -
  11. Interceptor Configuration
  12. -
  13. Views
  14. -
- - -
- - diff --git a/docs/wikidocs/Xwork's Component Architecture.html b/docs/wikidocs/Xwork's Component Architecture.html deleted file mode 100644 index de39e0767..000000000 --- a/docs/wikidocs/Xwork's Component Architecture.html +++ /dev/null @@ -1,104 +0,0 @@ - - - WebWork - - Xwork's Component Architecture - - - - - - - - - - -
-
These documents are out of date. As of WebWork 2.2, the WebWork IoC container has been deprecated (though not removed) and the WebWork team recommends you use Spring for all your IoC needs
- -

Writing Component Classes

- -

In XWork the actual component class can be virtually anything you like. The only constraints on it are that it must be a concrete class with a default constructor so that XWork can create instances of it as required. Optionally, a component may implement the Initializable and/or Disposable interfaces so it will receive lifecycle events just after it is created or before it is destroyed. Simply:

- -
-
public class MyComponent implements Intializable, Disposable {
-    public void init () {
-         //do initialization here
-    }
-
-    public void dispose() {
-         //do any clean up necessary before garbage collection of this component
-    }
-}
-
- -

Component Dependencies

- -

One feature that is not immediately obvious is that it is possible for components to depend on other components. For example if the ExchangeRateService described above depended on a Configuration component, XWork will pass the Configuration component through to the ExchangeRateService instance after ExchangeRateService is instantiated. Note that XWork automatically takes care of initializing the components in the correct order, so if A is an action or component that depends on B and C, and B depends on C and if A, B, and C have not been previously instantiated, the ComponentManager will in the following order:

- -
    -
  1. Instantiate C and call it's init() method if it implements Initializable.
  2. -
  3. Instantiate B, then using the enabler method, set C to be used by B
  4. -
  5. Call B's init() method, if it implements Intitializable.
  6. -
  7. Set B using B's enabler method to be used by A.
  8. -
- - -

And so on and so forth. Of course, if there are instances of B or C that would be reused in this case, those instances would be passed using the enabler method rather than a new instance.

- -

Writing Enablers

- -

An enabler should consist of just a single method that accepts a single parameter. The parameter class should either be the component class that is to be enabled, or one of the component's superclasses. XWork does not care what the name of the enabler's method is.

- -

Here is an example of what the ExchangeRateAware enabler might look like:

- -
-
public interface ExchangeRateAware {
-    public void setExchangeRateService(ExchangeRateService exchangeRateService);
-}
-
- -

Note that typically an enabler would be an interface, however there is nothing to prevent you from using a class instead if you so choose.

- -

Writing "Enabler-aware" Actions

- -

All an action needs to do is implement the relevant enabler interface. XWork will then call the action's enabler method just prior to the action's execution. As a simple example:

- -
-
public class MyAction extends ActionSupport implements ExchangeRateAware {
-    ExchangeRateService ers;
-    
-    public void setExchangeRateService(ExchangeRateService exchangeRateService) {
-        ers = exchangeRateService;
-    }
-    
-    public String execute() throws Exception {
-        System.out.println("The base currency is " + ers.getBaseCurrency());
-    }
-}
-
- -

If you have an object that is not an action or another component, you must explictly tell XWork to supply any enabled components to your object by calling componentManager.initializeObject(enabledObject);

- -

Using an external reference resolver

- -

You can also use an external reference resolver in XWork, i.e., references that will be resolved not by XWork itself. One such example is using an external resolver to integrate XWork with the Spring Framework

- -

You just need to write an external reference resolver and then tell XWork to use it in the package declaration:

-
-
<package
-    name="default"
-    externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
-
-

Now, to use external references you do something like this:

-
-
<external-ref name="foo">Foo</external-ref>
-
-

Where the name attribute is the setter method name and Foo is the reference to lookup.

- -

For more details and sample code about this integration, take a look at the javadocs to the com.opensymphony.xwork.config.ExternalReferenceResolver class (unfortunately unavailable online) and at XW-122

- -

-Chris

- -
- - diff --git a/docs/wikidocs/a.html b/docs/wikidocs/a.html deleted file mode 100644 index c8c131ee4..000000000 --- a/docs/wikidocs/a.html +++ /dev/null @@ -1,741 +0,0 @@ - - - WebWork - - a - - - - - - - - - - -
-

Description

- - -

A tag that creates a HTML <a href='' /> that when clicked calls a URL remote XMLHttpRequest call via the dojo - framework. The result from the URL is executed as JavaScript. If a "listenTopics" is supplied, it will publish a - 'click' message to that topic when the result is returned.

-

-While this tag can be used with the simple theme, xhtml theme, and others, it is really designed to work best with the ajax theme. We recommend reading the ajax a template documentation for more details.
- -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

idfalse StringThe id to assign the component
notifyTopicsfalse Object/StringTopic names to post an event to after the remote call has been made
preInvokeJSfalse String
themefalse StringThe theme to use for the element. This tag will usually use the ajax theme.
hreffalse StringThe URL to call to obtain the content
errorTextfalse StringThe text to display to the user if the is an error fetching the content
showErrorTransportTextfalsefalseBooleanwhen to show the error message as content when the URL had problems
afterLoadingfalse StringJavascript code that will be executed after the content has been fetched
openTemplatefalse Object/StringSet template to use for opening the rendered html.
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration

- -

Usage

- -

To get started, use the head tag and the ajax theme. See ajax head template for more information. Then look at the usage details for the ajax a template.

- -

 
-If you want to use additional parameters in your ww:a the Best Practiceis to use a ww:url to create your url and then leverage this url into your ww:a tag. This is done by creating a ww:url and specifying an id attribute.. like "testUrlId" in this example. Then in the ww:a tag reference this id in the href attribute via " %{testUrlId}"

-
-
<ww:url id="testUrlId" namespace="/subscriber" action="customField" method="delete">
-                  <ww:param name="customFieldDefinition.id" value="${id}"/>
-              </ww:url>
-             <ww:a errorText="Sorry your request had an error." preInvokeJS="confirm('Are you sure you want to delete this item?')" href="%{testUrlId}">
-                    <img src="<ww:url value="/images/delete.gif"/>" border="none"/></ww:a>
-
- -

<img xsrc="<ww:url value="delete.gif"/>" border="none"/></ww:a><img xsrc="<ww:url value="delete.gif"/>" border="none"/></ww:a>

- -
- - diff --git a/docs/wikidocs/action.html b/docs/wikidocs/action.html deleted file mode 100644 index b0b42d100..000000000 --- a/docs/wikidocs/action.html +++ /dev/null @@ -1,171 +0,0 @@ - - - WebWork - - action - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

This tag enables developers to call actions directly from a JSP page by specifying the action name and an optional -namespace. The body content of the tag is used to render the results from the Action. Any result processor defined -for this action in xwork.xml will be ignored, unless the executeResult parameter is specified.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

idfalse Stringthe id (if speficied) to put the action under stack's context.
nametrue Stringname of the action to be executed (without the extension suffix eg. .action)
namespacefalsenamespace from where tag is usedStringnamespace for action to call
executeResultfalsefalseBooleanwhether the result of this action (probably a view) should be executed/rendered
ignoreContextParamsfalsefalseBooleanwhether the request parameters are to be included when the action is invoked

- -

Examples

-
-
public class ActionTagAction extends ActionSupport {
-
-public String execute() throws Exception {
-	return "done";
-}
-
-public String doDefault() throws Exception {
-	ServletActionContext.getRequest().setAttribute("stringByAction", "This is a String put in by the action's doDefault()");
-	return "done";
-}
-}
-
-
-
<xwork>
-   ....
-  <action name="actionTagAction1" class="tmjee.testing.ActionTagAction">
-      <result name="done">success.jsp</result>
-  </action>
-   <action name="actionTagAction2" class="tmjee.testing.ActionTagAction" method="default">
-      <result name="done">success.jsp</result>
-  </action>
-   ....
-</xwork>
-
-
-
<div>The following action tag will execute result and include it in this page</div>
-<br />
-<ww:action name="actionTagAction" executeResult="true" />
- <br />
- <div>The following action tag will do the same as above, but invokes method specialMethod in action</div>
-<br />
-<ww:action name="actionTagAction!specialMethod" executeResult="true" />
- <br />
- <div>The following action tag will not execute result, but put a String in request scope
-      under an id "stringByAction" which will be retrieved using property tag</div>
- <ww:action name="actionTagAction!default" executeResult="false" />
- <ww:property value="#attr.stringByAction" />
-
- - -
- - diff --git a/docs/wikidocs/actionerror.html b/docs/wikidocs/actionerror.html deleted file mode 100644 index 369ed1fb5..000000000 --- a/docs/wikidocs/actionerror.html +++ /dev/null @@ -1,604 +0,0 @@ - - - WebWork - - actionerror - - - - - - - - - - -
-

Description

- -

Render action errors if they exists the specific layout of the rendering depends on - the theme itself.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:actionerror />
-   <ww:form .... >>
-      ....
-   </ww:form>
-
- -
- - diff --git a/docs/wikidocs/actionmessage.html b/docs/wikidocs/actionmessage.html deleted file mode 100644 index 5705d450a..000000000 --- a/docs/wikidocs/actionmessage.html +++ /dev/null @@ -1,604 +0,0 @@ - - - WebWork - - actionmessage - - - - - - - - - - -
-

Description

- -

Render action messages if they exists, specific rendering layout depends on the - theme itself.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:actionmessage />
-<ww:form .... >
-   ....
-</ww:form>
-
- -
- - diff --git a/docs/wikidocs/ajax a template.html b/docs/wikidocs/ajax a template.html deleted file mode 100644 index a72c6b762..000000000 --- a/docs/wikidocs/ajax a template.html +++ /dev/null @@ -1,26 +0,0 @@ - - - WebWork - - a template - - - - - - - - - - -
-

The ajax a template is used to make asynchronous calls to the server when the user clicks on the a href link. It is useful when you need to communicate information back to the application from the UI, without requiring the entire page to be re-rendered. An example would be removing an item from a list.

- -

The preInvokeJS attribute is used to determine whether the URL specified should be called or not, and must contain Javascript that returns true or false. If you want to call a JavaScript function, use the format preInvokeJS='yourMethodName(data,type)'. An example would be to show a confirm dialog to the user to double check whether they want to remove a user from a list.

- -

Remember: the content returned by the href attribute must be JavaScript. That JavaScript will then be evaluated within the webpage. If you only wish to publish an event to the topic specified, then simply return no result (or NONE) from your action and utilize the notifyTopics attribute to specific the topic names.

- -

For an example of the interaction between the div tag and the a tag using the topic pub/sub model, see the examples in the ajax div template.

- -
- - diff --git a/docs/wikidocs/ajax div template.html b/docs/wikidocs/ajax div template.html deleted file mode 100644 index 70519aeae..000000000 --- a/docs/wikidocs/ajax div template.html +++ /dev/null @@ -1,141 +0,0 @@ - - - WebWork - - div template - - - - - - - - - - -
-

The ajax div template provides a much more interesting div rendering option that the other themes do. Rather than simply rendering a <div> tag, this template relies on advanced AJAX features provided by the Dojo Toolkit. While the div tag could be used outside of the ajax theme, it is usually not very useful. See the div tag for more information on what features are provided.

- -

Features

- -

The remote div has a few features, some of which can be combined with the a tag and the ajax a template. These uses are:

-
    -
  • Retrieve remote data
  • -
  • Initialize the div with content before the remote data is retrieved
  • -
  • Display appropriate error and loading messages
  • -
  • Refresh data on a timed cycle
  • -
  • Listen for events and refresh data
  • -
  • JavaScript control support
  • -
- - -

Retrieve Remote Data

- -

The simplest way to use the div tag is to provide an href attribute. For example:

-
-
<ww:div theme="ajax" id="weather" href="http://www.weather.com/weather?zip=97239"/>
-
-

What this does after the HTML page is completely loaded, the specified URL will be retrieved asynchronously in the browser. The entire contents returned by that URL will be injected in to the div.

- -

Initializing the Div

- -

Because the remote data isn't loaded immediately, it is sometimes useful to have some placeholder content that exists before the remote data is retrieved. The content is essentially just the body of the div element. For example:

-
-
<ww:div theme="ajax" id="weather" href="http://www.weather.com/weather?zip=97239">
-    Placeholder...
-</ww:div>
-
-

If you wish to load more complex initial data, you can use the action tag and the executeResult attribute:

-
-
<ww:div theme="ajax" id="weather" href="http://www.weather.com/weather?zip=97239">
-    <ww:action id="weather" name="weatherBean" executeResult="true">
-        <ww:param name="zip" value="97239"/>
-    </ww:action>
-</ww:div>
-
- -

Loading and Error Messages

- -

If you'd like to display special messages when the data is being retrieved or when the data cannot be retrieved, you can use the errorText and loadingText attributes:

-
-
<ww:div theme="ajax" id="weather" href="http://www.weather.com/weather?zip=97239"
-        loadingText="Loading weather information..."
-        errorText="Unable to contact weather server">
-    Placeholder...
-</ww:div>
-
- -

Refresh Timers

- -

Another feature this div template provides is the ability to refresh data on a timed basis. Using the updateFreq and the delayattributes, you can specify how often the timer goes off and when the timer starts (times in milliseconds). For example, the following will update every minute after a two second delay:

-
-
<ww:div theme="ajax" id="weather" href="http://www.weather.com/weather?zip=97239"
-        loadingText="Loading weather information..."
-        errorText="Unable to contact weather server">
-        delay="2000"
-        updateFreq="60000"
-    Placeholder...
-</ww:div>
-
- -

Listening for Events

- -

The a tag (specifically the ajax a template) and the div tag support an ajax event system, providing the ability to broadcast events to topics. You can specify the topics to listen to using a comma separated list in the listenTopics attribute. What this means is that when a topic is published, usually through the ajax a template, the URL specified in the href attribute will be re-requested.

-
-
<ww:div theme="ajax" id="weather" href="http://www.weather.com/weather?zip=97239"
-        loadingText="Loading weather information..."
-        errorText="Unable to contact weather server"
-        listenTopics="weather_topic,some_topic">
-    Placeholder...
-</ww:div>
-<ww:a id="link1"
-      theme="ajax"
-      href="refreshWeather.action"
-      notifyTopics="weather_topic,other_topic"
-      errorText="An Error ocurred">Refresh</ww:a>
-
- -

JavaScript Support

- -

There are also javascript functions to refresh the content and stop/start the refreshing of the component. For the remote div with the component id "remotediv1":

- -

To start refreshing use the javascript:

-
-
remotediv1.start();
-
-

To stop refreshing use the javascript:

-
-
remotediv1.stop();
-
-

To refresh the content use the javascript:

-
-
remotediv1.bind();
-
- -

JavaScript Examples:

-

To further illustrate these concepts here is an example. Say you want to change the url of a div at runtime via javascript. Here is what you need to do:
-What you will need to do is add a JS function that listens to a JS event that publishes the id from the select box that was selected. It will modify the URL for the div (adding the id so the correct data is obtained) and then bind() the AJAX div so it refreshes.

- -
-
<ww:head theme="ajax" />
-
-<script type="text/javascript">
-    function updateReports(id) {
-       var reportDiv= window['reportDivId'];
-       reportDiv.href = '/../reportListRemote.action?selectedId='+id;
-       reportDiv.bind();
-    }
-    dojo.event.topic.getTopic("updateReportsListTopic").subscribe(null, "updateReports");
-</script>
-
-<form ... >
-<ww:select .... onchange="javascript: dojo.event.topic.publish("updateReportsListTopic", this.value); " />
-
-<ww:div id="reportDivId" theme="ajax" href="/.../reportListRemote.action" >
-  Loading reports...
-</ww:div>
-</form>
-
- -
- - diff --git a/docs/wikidocs/ajax event system.html b/docs/wikidocs/ajax event system.html deleted file mode 100644 index 4a99b1d2a..000000000 --- a/docs/wikidocs/ajax event system.html +++ /dev/null @@ -1,44 +0,0 @@ - - - WebWork - - event system - - - - - - - - - - -
-

As you may have seen with the ajax div template and ajax a template, WebWork and Dojo provide a nice way to subscribe and notify of topics from within the browser. A benifit of using Dojo as the basis of many of these components is being able to loosely couple UI components. There are two attributes of importance: listenTopics and notifyTopics.

- -
    -
  • If a component has a notifyTopics attribute, then after the processing has been completed a message with be published to the topic names supplied as a value (comma delimited).
  • -
  • If a component has a listenTopics attribute, then when a message is published to the topic names supplied as a value (comma delimited), the component will perform custom tag-specific logic ( i.e a DIV tag will re-fresh its content).
  • -
- - -

As well as this, you can publish and subscribe to topic names with javascript code. To publish to the topic_name topic:

-
-
dojo.event.topic.publish("topic_name", "content");
-
- -

The topic_name attribute is required, the content attribute is not and most elements are triggered without having this attribute. See the ajax div template for an example of this type of interaction.

- -

To subscribe to the topic_name topic:

-
-
function doSomethingWithEvent(data) {
-...
-}
-
-dojo.event.topic.getTopic("topic_name").subscribe(null, "doSomethingWithEvent");
-
- -

The subscribe method takes 2 parameters, the first is the JavaScript object variable (or null if the function is not from an object) and the second is the name of the function to call when an event is recieved on the topic.

- -
- - diff --git a/docs/wikidocs/ajax head template.html b/docs/wikidocs/ajax head template.html deleted file mode 100644 index 95cf70a65..000000000 --- a/docs/wikidocs/ajax head template.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork - - head template - - - - - - - - - - -
-

The ajax head template builds upon the xhtml head template by providing additional JavaScript includes for the Dojo Toolkit, which is used by the ajax a template, ajax div template , and the ajax tabbedPanel template. It is required to use this tag, <ww:head theme="ajax"/>, in your HTML <head> block if you wish to use AJAX feature. The contents of head.ftl are:

- -
-
<#include "/${parameters.templateDir}/xhtml/head.ftl" />
-<script language="JavaScript" type="text/javascript">
-    // Dojo configuration
-    djConfig = {
-        baseRelativePath: "<@ww.url includeParams='none' value='/webwork/dojo/' encode='false'/>",
-        isDebug: ${parameters.debug},
-        bindEncoding: "${parameters.encoding}",
-        debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes
-    };
-</script>
-<script language="JavaScript" type="text/javascript"
-        src="<@ww.url includeParams='none' value='/webwork/dojo/dojo.js' encode='false'/>"></script>
-<script language="JavaScript" type="text/javascript"
-        src="<@ww.url includeParams='none' value='/webwork/ajax/dojoRequire.js' encode='false'/>"></script>
-<script language="JavaScript" type="text/javascript"
-        src="<@ww.url includeParams='none' value='/webwork/CommonFunctions.js' encode='false'/>"></script>
-
- -
-

If you are having trouble getting the AJAX theme to work, you should include the above JavaScript in your page manually, changing "isDebug: false" to "isDebug: true". This will log out debugging information directly to the screen.

- -

Note that Dojo is configured to use the same character encoding specified in webwork.properties, typically UTF-8. For a simple example of how to use the head tag with the AJAX theme, simply do the following in your HTML:

- -
-
<ww:head theme="ajax"/>
-
- -
- - diff --git a/docs/wikidocs/ajax submit template.html b/docs/wikidocs/ajax submit template.html deleted file mode 100644 index e8df1a55f..000000000 --- a/docs/wikidocs/ajax submit template.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - submit template - - - - - - - - - - -
-

TODO: Describe the Ajax Submit template

- -
- - diff --git a/docs/wikidocs/ajax tabbedPanel template.html b/docs/wikidocs/ajax tabbedPanel template.html deleted file mode 100644 index d1fc7dbcc..000000000 --- a/docs/wikidocs/ajax tabbedPanel template.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - tabbedPanel template - - - - - - - - - - -
-

TODO: Describe the Ajax TabbedPanel template

- -
- - diff --git a/docs/wikidocs/ajax theme.html b/docs/wikidocs/ajax theme.html deleted file mode 100644 index 9ee1b6c7d..000000000 --- a/docs/wikidocs/ajax theme.html +++ /dev/null @@ -1,77 +0,0 @@ - - - WebWork - - theme - - - - - - - - - - -
-

The ajax theme extends the xhtml theme, providing AJAX features on top of everything provided by its parent theme. This theme uses two popular AJAX/JavaScript libraries: Dojo and DWR. These AJAX features are:

- -
    -
  • AJAX Client Side Validation
  • -
  • Remote form submission support (works with the submit tag as well)
  • -
  • An advanced div template that provides dynamic reloading of partial HTML
  • -
  • An advanced a template that provides the ability to load and evaluate JavaScript remotely
  • -
  • An AJAX-only tabbedPanel implementation
  • -
  • A rich pub-sub event model
  • -
- - -

Browser Compatibility

- -

AJAX (as a technology) uses a browser side scripting component that varies between browers (and sometimes versions). To hide those differences from the developer, we utilize the dojo toolkit (http://www.dojotoolkit.org). The following browsers are supported by dojo, and any UI's created with the AJAX theme should act the same for all those browsers listed below:

-
    -
  • IE 5.5+
  • -
  • FF 1.0+
  • -
  • Latest Safari (on up-to-date OS versions)
  • -
  • Latest Opera
  • -
  • Latest Konqueror
  • -
- - - -

Extending the XHTML Theme

- -

The wrapping behavior provided by this theme is almost exactly like that provided by the xhtml theme. The only difference is that the controlheader.ftl template is slightly different:

- -
-
<#include "/${parameters.templateDir}/xhtml/controlheader-core.ftl" />
-<#if parameters.form?exists && parameters.form.validate?default(false) == true>
-	<#-- can't mutate the data model in freemarker -->
-    <#if parameters.onblur?exists>
-        ${tag.addParameter('onblur', "validate(this);${parameters.onblur}")}
-    <#else>
-        ${tag.addParameter('onblur', "validate(this);")}
-    </#if>
-</#if>
-    <td>
-
- -

This provides for AJAX Client Side Validation by checking if the validate attribute is set to true. If it is, on each onblur event for HTML Tags, a validation request is made. Some people don't like the onblur behavior and would rather a more advanced timer (say, 200ms) be kicked off after every keystroke. You can override this template and provide that type of behavior if you would like.

- -

Special Notes

- -

While most of the templates in this theme are self explanatory, there are some templates that should be called out and explained in detail:

- -
Especially with this theme, it is strongly recommended you use the head tag. See the ajax head template for more information. Without it, you most likely not have AJAX support set up properly.
- - - - -

In addition to these templates, it is important to make yourself familiar with the ajax event system provided by WebWork and Dojo.

- -
- - diff --git a/docs/wikidocs/append.html b/docs/wikidocs/append.html deleted file mode 100644 index b80e2abbb..000000000 --- a/docs/wikidocs/append.html +++ /dev/null @@ -1,118 +0,0 @@ - - - WebWork - - append - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Component for AppendIteratorTag, which jobs is to append iterators to form an -appended iterator whereby entries goes from one iterator to another after each -respective iterator is exhausted of entries.

- -

For example, if there are 3 iterator appended (each iterator has 3 entries), -the following will be how the appended iterator entries will be arranged:

- -

    -
  1. First Entry of the First Iterator
  2. -
  3. Second Entry of the First Iterator
  4. -
  5. Third Entry of the First Iterator
  6. -
  7. First Entry of the Second Iterator
  8. -
  9. Second Entry of the Second Iterator
  10. -
  11. Third Entry of the Second Iterator
  12. -
  13. First Entry of the Third Iterator
  14. -
  15. Second Entry of the Third Iterator
  16. -
  17. Third Entry of the Third ITerator
  18. -

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

idfalse Object/Stringthe id of which if supplied will have the resultant appended iterator stored under in the stack's context

- -

Example

-
-
public class AppendIteratorTagAction extends ActionSupport {
-
-	private List myList1;
-	private List myList2;
-	private List myList3;
-
-
-	public String execute() throws Exception {
-
-		myList1 = new ArrayList();
-		myList1.add("1");
-		myList1.add("2");
-		myList1.add("3");
-
-		myList2 = new ArrayList();
-		myList2.add("a");
-		myList2.add("b");
-		myList2.add("c");
-
-		myList3 = new ArrayList();
-		myList3.add("A");
-		myList3.add("B");
-		myList3.add("C");
-
-		return "done";
-	}
-
-	public List getMyList1() { return myList1; }
-	public List getMyList2() { return myList2; }
-	public List getMyList3() { return myList3; }
-}
-
-
-
<ww:append id="myAppendIterator">
-	<ww:param value="%{myList1}" />
-	<ww:param value="%{myList2}" />
-	<ww:param value="%{myList3}" />
-</ww:append>
-<ww:iterator value="%{#myAppendIterator}">
-	<ww:property />
-</ww:iterator>
-
- - -
- - diff --git a/docs/wikidocs/bean.html b/docs/wikidocs/bean.html deleted file mode 100644 index 792e2d7f1..000000000 --- a/docs/wikidocs/bean.html +++ /dev/null @@ -1,111 +0,0 @@ - - - WebWork - - bean - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Instantiates a class that conforms to the JavaBeans specification. This tag has a body which can contain -a number of Param elements to set any mutator methods on that class.

-

-

If the id attribute is set on the BeanTag, it will place the instantiated bean into the -stack's Context.

-

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

nametrue Stringthe class name of the bean to be instantiated (must respect JavaBean specification)
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<-- in freemarker form -->
-[ww.bean name="com.opensymphony.webwork.example.counter.SimpleCounter" id="counter"]
-  [ww:param name="foo" value="BAR"/]
-  The value of foo is : [ww:property value="foo"/], when inside the bean tag.<br />
-[/ww:bean]
-
-<-- in jsp form -->
-<ww:bean name="com.opensymphony.webwork.example.counter.SimpleCounter" id="counter">
-	 <ww:param name="foo" value="BAR" />
-  The value of foot is : <ww:property value="foo"/>, when inside the bean tag <br />
-</ww:bean>
-
-

This example instantiates a bean called SimpleCounter and sets the foo property (setFoo('BAR')). The -SimpleCounter object is then pushed onto the Valuestack, which means that we can called its accessor methods (getFoo()) -with the Property tag and get their values.

-

-

In the above example, the id has been set to a value of counter. This means that the SimpleCounter class -will be placed into the stack's context. You can access the SimpleCounter class using WW's tag:

-

-

-<-- jsp form -->
-<ww:property value="#counter" />

- -

<-- freemarker form --> -[ww:property value="#counter.foo"/] -

-

-

In the property tag example, the # tells Ognl to search the context for the SimpleCounter class which has -an id(key) of counter

- - -
- - diff --git a/docs/wikidocs/border/border_bottom.gif b/docs/wikidocs/border/border_bottom.gif deleted file mode 100644 index b93012ac2..000000000 Binary files a/docs/wikidocs/border/border_bottom.gif and /dev/null differ diff --git a/docs/wikidocs/border/spacer.gif b/docs/wikidocs/border/spacer.gif deleted file mode 100644 index fc2560981..000000000 Binary files a/docs/wikidocs/border/spacer.gif and /dev/null differ diff --git a/docs/wikidocs/checkbox.html b/docs/wikidocs/checkbox.html deleted file mode 100644 index a108ba476..000000000 --- a/docs/wikidocs/checkbox.html +++ /dev/null @@ -1,627 +0,0 @@ - - - WebWork - - checkbox - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Renders an HTML input element of type checkbox, populated by the specified property from the OgnlValueStack.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

fieldValuefalse'true'Object/StringThe actual HTML value attribute of the checkbox.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
JSP:
- <ww:checkbox label="checkbox test" name="checkboxField1" value="aBoolean" fieldValue="true"/>
-
- Velocity:
- #tag( Checkbox "label=checkbox test" "name=checkboxField1" "value=aBoolean" )
-
- Resulting HTML (simple template, aBoolean == true):
- <input type="checkbox" name="checkboxField1" value="true" checked="checked" />
-
- -
- - diff --git a/docs/wikidocs/checkboxlist.html b/docs/wikidocs/checkboxlist.html deleted file mode 100644 index e9ef28fa6..000000000 --- a/docs/wikidocs/checkboxlist.html +++ /dev/null @@ -1,658 +0,0 @@ - - - WebWork - - checkboxlist - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Creates a series of checkboxes from a list. Setup is like <ww:select /> or <ww:radio />, but creates checkbox tags.

- - - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
<ww:checkboxlist name="foo" list="bar"/>
-
- -
- - diff --git a/docs/wikidocs/combobox.html b/docs/wikidocs/combobox.html deleted file mode 100644 index f08ab298a..000000000 --- a/docs/wikidocs/combobox.html +++ /dev/null @@ -1,712 +0,0 @@ - - - WebWork - - combobox - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

The combo box is basically an HTML INPUT of type text and HTML SELECT grouped together to give you a combo box -functionality. You can place text in the INPUT control by using the SELECT control or type it in directly in -the text field.

- -

In this example, the SELECT will be populated from id=year attribute. Counter is itself an Iterator. It will -span from first to last. The population is done via javascript, and requires that this tag be surrounded by a -<form>.

- -

Note that unlike the <ww:select/> tag, there is no ability to define the individual <option> tags' id attribute -or content separately. Each of these is simply populated from the toString() method of the list item. Presumably -this is because the select box isn't intended to actually submit useful data, but to assist the user in filling -out the text field.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

listtrue Object/StringIteratable source to populate from. If this is missing, the select widget is simply not displayed.
maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
JSP:
-<ww:bean name="webwork.util.Counter" id="year">
-  <ww:param name="first" value="text('firstBirthYear')"/>
-  <ww:param name="last" value="2000"/>
-
-  <ww:combobox label="Birth year" size="6" maxlength="4" name="birthYear" list="#year"/>
-</ww:bean>
-
-Velocity:
-#tag( ComboBox "label=Birth year" "size=6" "maxlength=4" "name=birthYear" "list=#year" )
-
- -
- - diff --git a/docs/wikidocs/component.html b/docs/wikidocs/component.html deleted file mode 100644 index b7d9f730d..000000000 --- a/docs/wikidocs/component.html +++ /dev/null @@ -1,630 +0,0 @@ - - - WebWork - - component - - - - - - - - - - -
-

Description

-

Renders an custom UI widget using the specified templates. Additional objects can be passed in to the template -using the param tags. Objects provided can be retrieve from within the template via $parameters.paramname.

- -

In the bottom JSP and Velocity samples, two parameters are being passed in to the component. From within the -component, they can be accessed as $parameters.get('key1') and $parameters.get('key2'). Velocity also allows -you reference them as $parameters.key1 and $parameters.key2.

- -

Currently, your custom UI components can be written in Velocity, JSP, or Freemarker, and the correct rendering -engine will be found based on file extension.

- -

Remember: the value params will always be resolved against the OgnlValueStack so if you mean to pass a -string literal to your component, make sure to wrap it in quotes i.e. value="'value1'" otherwise, the the value -stack will search for an Object on the stack with a method of getValue1(). (now that i've written this, i'm not -entirely sure this is the case. i should verify this manana)

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
JSP
-    <ww:component template="/my/custom/component.vm"/>
-      or
-
-    <ww:component template="/my/custom/component.vm">
-      <ww:param name="key1" value="value1"/>
-      <ww:param name="key2" value="value2"/>
-    </ww:component>
-
-Velocity
-    #tag( Component "template=/my/custom/component.vm" )
-
-      or
-
-    #bodytag( Component "template=/my/custom/component.vm" )
-      #param( "key1" "value1" )
-      #param( "key2" "value2" )
-    #end
-
- -
- - diff --git a/docs/wikidocs/conversion validator.html b/docs/wikidocs/conversion validator.html deleted file mode 100644 index e569e6fc1..000000000 --- a/docs/wikidocs/conversion validator.html +++ /dev/null @@ -1,44 +0,0 @@ - - - WebWork - - conversion validator - - - - - - - - - - -
-

Description

-

Field Validator that checks if a conversion error occured for this field.

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -

- -

Examples

-
-
<pre>
-    <!-- Plain Validator Syntax -->
-    <validator type="conversion">
-    		<param name="fieldName">myField</param>
-         <message>Conversion Error Occurred</message>
-    </validator>
-     
-    <!-- Field Validator Syntax -->
-    <field name="myField">
-       <field-validator type="conversion">
-          <message>Conversion Error Occurred</message>
-       </field-validator>
-    </field>
-</pre>
-
- -
- - diff --git a/docs/wikidocs/css_xhtml form template.html b/docs/wikidocs/css_xhtml form template.html deleted file mode 100644 index eaa359181..000000000 --- a/docs/wikidocs/css_xhtml form template.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - css_xhtml form template - - - - - - - - - - -
-

The css_xhtml form template is almost exactly like the xhtml form template, including support for Pure JavaScript Client Side Validation. The only difference is that instead of printing out an opening and closing <table> element, there are no elements. Instead, the CSS rules for the individual HTML tags are assumed to handle all dislay logic. However, as noted, client side validation is still supported.

- -
- - diff --git a/docs/wikidocs/css_xhtml head template.html b/docs/wikidocs/css_xhtml head template.html deleted file mode 100644 index d9c8904ef..000000000 --- a/docs/wikidocs/css_xhtml head template.html +++ /dev/null @@ -1,41 +0,0 @@ - - - WebWork - - css_xhtml head template - - - - - - - - - - -
-

The css_xhtml head template is very similar to the xhtml head template. The only difference is that CSS that is included is specifically designed to provide the layout for the css\_xhtml theme. The contents of head.ftl are:

- -
-
<link rel="stylesheet" href="<@ww.url value='/webwork/css_xhtml/styles.css' encode='false' />" type="text/css"/>
-<#include "/${parameters.templateDir}/simple/head.ftl" />
-
- -

The contents of styles.css are:

- -
-
.wwFormTable {}
-.label {
-    font-style:italic;
-    float:left;
-    width:30%
-}
-.errorLabel {font-style:italic; color:red; }
-.errorMessage {font-weight:bold; text-align: center; color:red; }
-.checkboxLabel {}
-.checkboxErrorLabel {color:red; }
-.required {color:red;}
-
- -
- - diff --git a/docs/wikidocs/css_xhtml theme.html b/docs/wikidocs/css_xhtml theme.html deleted file mode 100644 index 661967c32..000000000 --- a/docs/wikidocs/css_xhtml theme.html +++ /dev/null @@ -1,133 +0,0 @@ - - - WebWork - - css_xhtml theme - - - - - - - - - - -
-

The css_xhtml theme is the default theme in WebWork. It provides all the basics that the simple theme provides, plus these additional features:

- - - - -

Wrapping the Simple Theme

- -

The css_xhtml theme uses the wrapping technique mentioned in Extending Themes, also done by the xhtml theme. As such, it is important to understand how the HTML tags are wrapped by a standard header and footer. For example, take a look at the textfield template, text.ftl:

- -
-
<#include "/${parameters.templateDir}/css_xhtml/controlheader.ftl" />
-<#include "/${parameters.templateDir}/simple/text.ftl" />
-<#include "/${parameters.templateDir}/css_xhtml/controlfooter.ftl" />
-
- -

As you can see, the controlheader.ftl and controlfooter.ftl templates are wrapped around the simple template.

- -

CSS XHTML Theme Header

- -

Now let's look at the controlheader.ftl:

- -
-
<#--
-	Only show message if errors are available.
-	This will be done if ActionSupport is used.
--->
-<#assign hasFieldErrors = parameters.name?exists && fieldErrors?exists && fieldErrors[parameters.name]?exists/> 
-<div <#rt/><#if parameters.id?exists>id="wwgrp_${parameters.id}"<#rt/></#if> class="wwgrp">
-	
-<#if hasFieldErrors>
-<div <#rt/><#if parameters.id?exists>id="wwerr_${parameters.id}"<#rt/></#if> class="wwerr">
-<#list fieldErrors[parameters.name] as error>
-    <div<#rt/>
-    <#if parameters.id?exists>
-     errorFor="${parameters.id}"<#rt/>
-    </#if>
-    class="errorMessage">
-             ${error?html}
-    </div><#t/>
-</#list>
-</div><#t/>
-</#if>
-
-<#if parameters.label?exists>
-<#if parameters.labelposition?default("top") == 'top'>
-<div <#rt/>
-<#else>
-<span <#rt/>
-</#if>
-<#if parameters.id?exists>id="wwlbl_${parameters.id}"<#rt/></#if> class="wwlbl">
-    <label <#t/>
-<#if parameters.id?exists>
-        for="${parameters.id?html}" <#t/>
-</#if>
-<#if hasFieldErrors>
-        class="errorLabel"<#t/>
-<#else>
-        class="label"<#t/>
-</#if>
-    ><#t/>
-<#if parameters.required?default(false)>
-        <span class="required">*</span><#t/>
-</#if>
-        ${parameters.label?html}:
-<#include "/${parameters.templateDir}/xhtml/tooltip.ftl" />
-	</label><#t/>
-<#if parameters.labelposition?default("top") == 'top'>
-</div> <br/><#rt/>
-<#else>
-</span> <#rt/>
-</#if>
-</#if>
-
-<#if parameters.labelposition?default("top") == 'top'>
-<div <#rt/>
-<#else>
-<span <#rt/>
-</#if>
-<#if parameters.id?exists>id="wwctrl_${parameters.id}"<#rt/></#if> class="wwctrl">
-
- -

The header used by the HTML tags in the css_xhtml theme is somewhat complex. Unlike the xhtml theme, this theme does not support the labelposition attribute. Instead, your CSS rules can define how the layout is done.

- -

Also note that the fieldErrors, usually caused by Validation, are displayed in a div block before the element is displayed.

- -

CSS XHTML Theme Footer

- -

And the controlfooter.ftl contents:

- -
-
${parameters.after?if_exists}<#t/>
-    <#lt/>
-<#if parameters.labelposition?default("top") == 'top'>
-</div> <#rt/>
-<#else>
-</span> <#rt/>
-</#if>
-</div>
-
- -

Special Notes

- -

While most of the templates in this theme are self explanatory, there are some templates that should be called out and explained in detail:

- - - - -
- - diff --git a/docs/wikidocs/date validator.html b/docs/wikidocs/date validator.html deleted file mode 100644 index b12b306eb..000000000 --- a/docs/wikidocs/date validator.html +++ /dev/null @@ -1,53 +0,0 @@ - - - WebWork - - validator - - - - - - - - - - -
-

Description

-

Field Validator that checks if the date supplied is within a specific range.

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -
  • min - the min date range. If not specified will not be checked.
  • -
  • max - the max date range. If not specified will not be checked.
  • -

- -

Examples

-
-
<validators>
-		<!-- Plain Validator syntax -->
-		<validator type="date">
-	        <param name="fieldName">birthday</param>
-          <param name="min">01/01/1990</param>
-          <param name="max">01/01/2000</param>
-          <message>Birthday must be within ${min} and ${max}</message>
-		</validator>
-
-      <!-- Field Validator Syntax -->
-      <field name="birthday">
-      	<field-validator type="date">
-       	    <param name="min">01/01/1990</param>
-              <param name="max">01/01/2000</param>
-              <message>Birthday must be within ${min} and ${max}</message>
-      	</field>
-      </field>
-
-</validators>
-
- - - -
- - diff --git a/docs/wikidocs/date.html b/docs/wikidocs/date.html deleted file mode 100644 index f72f3ca7c..000000000 --- a/docs/wikidocs/date.html +++ /dev/null @@ -1,198 +0,0 @@ - - - WebWork - - date - - - - - - - - - - -
-

Description

- -

Format Date object in different ways. -

-The date tag will allow you to format a Date in a quick and easy way. -You can specify a custom format (eg. "dd/MM/yyyy hh:mm"), you can generate -easy readable notations (like "in 2 hours, 14 minutes"), or you can just fall back -on a predefined format with key 'webwork.date.format' in your properties file.

- -

If that key is not defined, it will finally fall back to the default DateFormat.MEDIUM -formatting.

- -

Note: If the requested Date object isn't found on the stack, a blank will be returned. -

- -

Configurable attributes are :- -

    -
  • name
  • -
  • nice
  • -
  • format
  • -

- -

- -

Following how the date component will work, depending on the value of nice attribute -(which by default is false) and the format attribute.

- -

- -

Condition 1: With nice attribute as true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
i18n keydefault
webwork.date.format.past{0} ago
webwork.date.format.futurein {0}
webwork.date.format.secondsan instant
webwork.date.format.minutes{0,choice,1#one minute|1<{0} minutes}
webwork.date.format.hours{0,choice,1#one hour|1<{0} hours}{1,choice,0#|1#, one minute|1<, {1} minutes}
webwork.date.format.days{0,choice,1#one day|1<{0} days}{1,choice,0#|1#, one hour|1<, {1} hours}
webwork.date.format.years{0,choice,1#one year|1<{0} years}{1,choice,0#|1#, one day|1<, {1} days}

- -

- -

Condition 2: With nice attribute as false and format attribute is specified eg. dd/MM/yyyyy -

In this case the format attribute will be used.

- -

- -

Condition 3: With nice attribute as false and no format attribute is specified - - - - - - - - - -
i18n keydefault
webwork.date.formatif one is not found DateFormat.MEDIUM format will be used

- - - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

formatfalse Object/StringDate or DateTime format pattern
nicefalsefalseBooleanWhether to print out the date nicely
nametrue StringThe date value to format
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:date name="person.birthday" format="dd/MM/yyyy" />
-<ww:date name="person.birthday" format="%{getText('some.i18n.key')}" />
-<ww:date name="person.birthday" nice="true" />
-<ww:date name="person.birthday" />
-
- -
- - diff --git a/docs/wikidocs/datepicker.html b/docs/wikidocs/datepicker.html deleted file mode 100644 index c91943eb2..000000000 --- a/docs/wikidocs/datepicker.html +++ /dev/null @@ -1,800 +0,0 @@ - - - WebWork - - datepicker - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Renders datepicker element.

- -

Implementation was changed in WebWork 2.2 to use jscalendar - instead of non locale aware tigracalendar. Check locale and format settings if you used the old widget in your - applications. Be sure to include proper stylesheet as described below if you don't want the calender widget to look - transparent.

- -

Important: Be sure to set the id attributs if not used within a <ww:form /> tag, as it takes care of - setting the id for you, being required to copy selected date to text input element.

- -

Following a reference for the format parameter (copied from jscalendar documentation): - - - - - - - - - - - - - - - - - - - - - - - - - - -
%a abbreviated weekday name
%A full weekday name
%b abbreviated month name
%B full month name
%C century number
%d the day of the month ( 00 .. 31 )
%e the day of the month ( 0 .. 31 )
%H hour ( 00 .. 23 )
%I hour ( 01 .. 12 )
%j day of the year ( 000 .. 366 )
%k hour ( 0 .. 23 )
%l hour ( 1 .. 12 )
%m month ( 01 .. 12 )
%M minute ( 00 .. 59 )
%n a newline character
%p ``PM'' or ``AM''
%P ``pm'' or ``am''
%S second ( 00 .. 59 )
%s number of seconds since Epoch (since Jan 01 1970 00:00:00 UTC)
%t a tab character
%U, %W, %V the week number
%u the day of the week ( 1 .. 7, 1 = MON )
%w the day of the week ( 0 .. 6, 0 = SUN )
%y year without the century ( 00 .. 99 )
%Y year including the century ( ex. 1979 )
%% a literal % character -

- - - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

languagefalseThe language of the current LocaleStringThe language to use for the widget texts and localization presets.
formatfalseDateformat specified by language preset (%Y/%m/%d for en)StringThe format to use for date field.
showstimefalsefalseStringWhether time selector is to be shown. Valid values are "true", "false", "24" and "12".
singleclickfalsetrueBooleanWhether to use selected value after single or double click.
maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
Date in application's locale format:
-    <ww:datepicker name="order.date" id="order.date" />
-Date in german locale, with german texts:
-    <ww:datepicker name="delivery.date" id="delivery.date" template="datepicker_js.ftl" language="de" />
-Date in german locale, with german texts and custom date format, including time:
-    <ww:datepicker name="invoice.date" id="invoice.date" template="datepicker_js.ftl" language="de" format="%d. %b &Y %H:%M" showstime="true" />
-
- -

If you use this jscalendar based datepicker widget, you might want to use one of the standard stylesheets provided - with jscalendar (all distribution stylesheets are included in webwork jar). The easiest way to do so is to place the - <ww:head/> tag in the head of your html page, as it takes care of including calendar css. - Otherwise, to manually activate the calendar-blue style, include the following in your stylesheet definition:

- -
-
<link href="<ww:url value="/webwork/jscalendar/calendar-blue.css" />" rel="stylesheet" type="text/css" media="all"/>
-
- -
- - diff --git a/docs/wikidocs/debug.html b/docs/wikidocs/debug.html deleted file mode 100644 index 8a3f918c1..000000000 --- a/docs/wikidocs/debug.html +++ /dev/null @@ -1,36 +0,0 @@ - - - WebWork - - debug - - - - - - - - - - -
-

debug

- - - - - - - - - - - - - - - -
Attribute Type Required Default Description
id string FALSE   
- -
- - diff --git a/docs/wikidocs/div.html b/docs/wikidocs/div.html deleted file mode 100644 index 2e2b57fdd..000000000 --- a/docs/wikidocs/div.html +++ /dev/null @@ -1,773 +0,0 @@ - - - WebWork - - div - - - - - - - - - - -
-

Description

- -

The div tag is primarily an AJAX tag, providing a remote call from the current page to update a section -of content without having to refresh the entire page.

- -

It creates a HTML <DIV /> that obtains it's content via a remote XMLHttpRequest call -via the dojo framework.

- -

If a "listenTopics" is supplied, it will listen to that topic and refresh it's content when any message -is received.


-While this tag can be used with the simple theme, xhtml theme, and others, it is really designed to work best with the ajax theme. We recommend reading the ajax div template documentation for more details.
- -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

updateFreqfalse0IntegerHow often to re-fetch the content (in milliseconds)
delayfalse0IntegerHow long to wait before fetching the content (in milliseconds)
loadingTextfalse Object/StringThe text to display to the user while the new content is being fetched (especially good if the content will take awhile)
listenTopicsfalse Object/StringTopic name to listen to (comma delimited), that will cause the DIV's content to be re-fetched
themefalse StringThe theme to use for the element. This tag will usually use the ajax theme.
hreffalse StringThe URL to call to obtain the content
errorTextfalse StringThe text to display to the user if the is an error fetching the content
showErrorTransportTextfalsefalseBooleanwhen to show the error message as content when the URL had problems
afterLoadingfalse StringJavascript code that will be executed after the content has been fetched
openTemplatefalse Object/StringSet template to use for opening the rendered html.
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Usage

- -

To get started, use the head tag and the ajax theme. See ajax head template for more information. Then look at the usage details for the ajax div template.

- -

 

-
Handy Hint
-

I have found that the target of the div must return good html. Basically a html and a body block that are happily closed.

- -
- - diff --git a/docs/wikidocs/doubleselect.html b/docs/wikidocs/doubleselect.html deleted file mode 100644 index ab24a7ece..000000000 --- a/docs/wikidocs/doubleselect.html +++ /dev/null @@ -1,1287 +0,0 @@ - - - WebWork - - doubleselect - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Renders two HTML select elements with second one changing displayed values depending on selected entry of first one.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

doubleListtrue Object/StringThe second iterable source to populate from.
doubleListKeyfalse Object/StringThe key expression to use for second list
doubleListValuefalse Object/StringThe value expression to use for second list
doubleNametrue Object/StringThe name for complete component
doubleValuefalse Object/StringThe value expression for complete component
formNamefalse Object/StringThe form name this component resides in and populates to
doubleCssClassfalse Object/StringThe css class for the second list
doubleCssStylefalse Object/StringThe css style for the second list
doubleHeaderKeyfalse Object/StringThe header key for the second list
doubleHeaderValuefalse Object/StringThe header value for the second list
doubleEmptyOptionfalse Object/StringDecides if the second list will add an empty option
doubleDisabledfalse Object/StringDecides if a disable attribute should be added to the second list
doubleIdfalse Object/StringThe id of the second list
doubleMultiplefalse Object/StringDecides if multiple attribute should be set on the second list
doubleOnblurfalse Object/StringSet the onblur attribute of the second list
doubleOnchangefalse Object/StringSet the onchange attribute of the second list
doubleOnclickfalse Object/StringSet the onclick attribute of the second list
doubleOndblclickfalse Object/StringSet the ondbclick attribute of the second list
doubleOnfocusfalse Object/StringSet the onfocus attribute of the second list
doubleOnkeydownfalse Object/StringSet the onkeydown attribute of the second list
doubleOnkeypressfalse Object/StringSet the onkeypress attribute of the second list
doubleOnkeyupfalse Object/StringSet the onkeyup attribute of the second list
doubleOnmousedownfalse Object/StringSet the onmousedown attribute of the second list
doubleOnmousemovefalse Object/StringSet the onmousemove attribute of the second list
doubleOnmouseoutfalse Object/StringSet the onmouseout attribute of the second list
doubleOnmouseoverfalse Object/StringSet the onmouseover attribute of the second list
doubleOnmouseupfalse Object/StringSet the onmouseup attribute of the second list
doubleOnselectfalse Object/StringSet the onselect attribute of the second list
doubleSizefalse Object/StringSet the size attribute of the second list
doubleListKeyfalse Object/StringSet the list key of the second attribute
emptyOptionfalsefalseBooleanDecides of an empty option is to be inserted in the second list
headerKeyfalse Object/StringSet the header key of the second list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringSet the header value of the second list
multiplefalse Object/StringCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
<ww:doubleselect label="doubleselect test1" name="menu" list="{'fruit','other'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />
-<ww:doubleselect label="doubleselect test2" name="menu" list="#{'fruit':'Nice Fruits', 'other':'Other Dishes'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />
-
- -
- - diff --git a/docs/wikidocs/else.html b/docs/wikidocs/else.html deleted file mode 100644 index 9a1cc7cda..000000000 --- a/docs/wikidocs/else.html +++ /dev/null @@ -1,71 +0,0 @@ - - - WebWork - - else - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

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

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:if test="%{false}">
-	    <div>Will Not Be Executed</div>
- </ww:if>
-	<ww:elseif test="%{true}">
-	    <div>Will Be Executed</div>
- </ww:elseif>
- <ww:else>
-	    <div>Will Not Be Executed</div>
- </ww:else>
-
- -
- - diff --git a/docs/wikidocs/elseIf.html b/docs/wikidocs/elseIf.html deleted file mode 100644 index 6b546066f..000000000 --- a/docs/wikidocs/elseIf.html +++ /dev/null @@ -1,93 +0,0 @@ - - - WebWork - - elseIf - - - - - - - - - - -
-
-

Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.

- -

Description

- - -

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

- - -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

testtrue BooleanExpression to determine if body of tag is to be displayed
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

- -
-
<ww:if test="%{false}">
-	    <div>Will Not Be Executed</div>
- </ww:if>
-	<ww:elseif test="%{true}">
-	    <div>Will Be Executed</div>
- </ww:elseif>
- <ww:else>
-	    <div>Will Not Be Executed</div>
- </ww:else>
-
- -
- - diff --git a/docs/wikidocs/email validator.html b/docs/wikidocs/email validator.html deleted file mode 100644 index 90bf94ef1..000000000 --- a/docs/wikidocs/email validator.html +++ /dev/null @@ -1,56 +0,0 @@ - - - WebWork - - email validator - - - - - - - - - - -
-

Description

-

EmailValidator checks that a given String field, if not empty, -is a valid email address. -

-

-The regular expression used to validate that the string is an email address -is: -

-
-"\\b(^(\\S+@).+((\\.com)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\..{2,2}))$)\\b"
-

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -

- - -

Examples

-
-
<!-- Plain Validator Syntax -->
-<validators>
-    <validator type="email">
-        <param name="fieldName">myEmail</param>
-        <message>Must provide a valid email</message>
-    </validator>
-</validators>
-
-<!-- Field Validator Syntax -->
-<field name="myEmail">
-   <field-validator type="email">
-      <message>Must provide a valid email</message>
-   </field-validator>
-</field>
-
- - - -
- - diff --git a/docs/wikidocs/expression validator.html b/docs/wikidocs/expression validator.html deleted file mode 100644 index 89d1d1dac..000000000 --- a/docs/wikidocs/expression validator.html +++ /dev/null @@ -1,39 +0,0 @@ - - - WebWork - - expression validator - - - - - - - - - - -
-

Description

-

A Non-Field Level validator that validates based on regular expression supplied.

- - -

Parameters

-

    -
  • expression - the Ognl expression to be evaluated against the stack (Must evaluate to a Boolean)
  • -

- - -

Examples

-
-
<validators>
-      <validator type="expression">
-         <param name="expression"> .... </param>
-         <message>Failed to meet Ognl Expression  .... </message>
-      </validator>
-</validators>
-
- - -
- - diff --git a/docs/wikidocs/fielderror.html b/docs/wikidocs/fielderror.html deleted file mode 100644 index 15bc8ac08..000000000 --- a/docs/wikidocs/fielderror.html +++ /dev/null @@ -1,624 +0,0 @@ - - - WebWork - - fielderror - - - - - - - - - - -
-

Description

- -

Render field errors if they exists. Specific layout depends on the particular theme.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<!-- example 1 -->
-   <ww:fielderror />
-
-   <!-- example 2 -->
-   <ww:fielderror>
-        <ww:param>field1</ww:param>
-        <ww:param>field2</ww:param>
-   </ww:fielderror>
-   <ww:form .... >>
-      ....
-   </ww:form>
-
-   OR
-
-   <ww:fielderror>
-   		<ww:param value="%{'field1'}" />
-   		<ww:param value="%{'field2'}" />
-   </ww:fielderror>
-   <ww:form .... >>
-      ....
-   </ww:form>
-
- -

Example 1: display all field errors

- Example 2: display field errors only for 'field1' and 'field2'

- - -
- - diff --git a/docs/wikidocs/fieldexpression validator.html b/docs/wikidocs/fieldexpression validator.html deleted file mode 100644 index d6d0e1484..000000000 --- a/docs/wikidocs/fieldexpression validator.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - fieldexpression validator - - - - - - - - - - -
-

Description

-

Validates a field using an OGNL expression.

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -
  • expression - The Ognl expression (must evaluate to a boolean) which is to be evalidated the stack
  • -

- - -

Examples

-
-
<!-- Plain Validator Syntax -->
-<validators>
-    <!-- Plain Validator Syntax -->
-    <validator type="fieldexpression">
-       <param name="fieldName">myField</param>
-       <param name="expression"><![CDATA[#myCreditLimit > #myGirfriendCreditLimit]]></param>
-       <message>My credit limit should be MORE than my girlfriend</message>
-    <validator>
-    
-    <!-- Field Validator Syntax -->
-    <field name="myField">
-        <field-validator type="fieldexpression">
-            <param name="expression"><![CDATA[#myCreditLimit > #myGirfriendCreditLimit]]></param>
-            <message>My credit limit should be MORE than my girlfriend</message>
-        </field-validator>
-    </field>
-    
-</vaidators>
-
- -
- - diff --git a/docs/wikidocs/file.html b/docs/wikidocs/file.html deleted file mode 100644 index 564270a23..000000000 --- a/docs/wikidocs/file.html +++ /dev/null @@ -1,639 +0,0 @@ - - - WebWork - - file - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Renders an HTML file input element.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

acceptfalse Object/StringHTML accept attribute to indicate accepted file mimetypes
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
<ww:file name="anUploadFile" accept="text/*" />
-<ww:file name="anohterUploadFIle" accept="text/html,text/plain" />
-
- -
- - diff --git a/docs/wikidocs/form.html b/docs/wikidocs/form.html deleted file mode 100644 index e5e80213e..000000000 --- a/docs/wikidocs/form.html +++ /dev/null @@ -1,792 +0,0 @@ - - - WebWork - - form - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Renders HTML an input form.

- -

The remote form allows the form to be submitted without the page being refreshed. The results from the form - can be inserted into any HTML element on the page.

- - - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

onsubmitfalse Object/StringHTML onsubmit attribute
actionfalsecurrent actionObject/StringSet action nane to submit to, without .action suffix
targetfalse Object/StringHTML form target attribute
enctypefalse Object/StringHTML form enctype attribute
methodfalse Object/StringHTML form method attribute
namespacefalsecurrent namespaceObject/Stringnamespace for action to submit to
validatefalsefalseBooleanWhether client side/remote validation should be performed. Only useful with theme xhtml/ajax
portletModefalse Object/StringThe portlet mode to display after the form submit
windowStatefalse Object/StringThe window state to display after the form submit
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
<ww:form ... />
-
- - -

Validation

- -

There are two flavours Client Side Validation, depening on the theme you are using (xhtml, ajax, etc). If you are using the xhtml theme or css\_xhtml theme, pure client side validation will be used. If you are using the ajax theme, a special AJAX-based validation will take place. Read the Client Side Validation docs for more information.

- -
- - diff --git a/docs/wikidocs/generator.html b/docs/wikidocs/generator.html deleted file mode 100644 index c5365dd8d..000000000 --- a/docs/wikidocs/generator.html +++ /dev/null @@ -1,203 +0,0 @@ - - - WebWork - - generator - - - - - - - - - - -
-

Description

-

NOTE: JSP-TAG

- -

Generate an iterator based on the val attribute supplied.

- -

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

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

countfalse Integerthe max number entries to be in the iterator
separatortrue Stringthe separator to be used in separating the val into entries of the iterator
valtrue Object/Stringthe source to be parsed into an iterator
converterfalse com.opensymphony.webwork.util.IteratorGenerator.Converterthe converter to convert the String entry parsed from val into an object
idfalse Stringthe id to store the resultant iterator into page context, if such id is supplied

- - -

Examples

-
-
Example One:
-<pre>
-Generate a simple iterator
-<ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
-<ww:iterator>
-	<ww:property /><br/>
-</ww:iterator>
-</ww:generator>
-</pre>
-This generates an iterator and print it out using the iterator tag.
-
-Example Two:
-<pre>
-Generate an iterator with count attribute
-<ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">
-<ww:iterator>
-	<ww:property /><br/>
-</ww:iterator>
-</ww:generator>
-</pre>
-This generates an iterator, but only 3 entries will be available in the iterator
-generated, namely aaa, bbb and ccc respectively because count attribute is set to 3
-
-Example Three:
-<pre>
-Generate an iterator with id attribute
-<ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" />
-<%
-	Iterator i = (Iterator) pageContext.getAttribute("myAtt");
-	while(i.hasNext()) {
-		String s = (String) i.next(); %>
-		<%=s%> <br/>
-<% 	}
-%>
-</pre>
-This generates an iterator and put it in the PageContext under the key as specified
-by the id attribute.
-
-
-Example Four:
-<pre>
-Generate an iterator with comparator attribute
-<ww:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}">
-<ww:iterator>
-		<ww:property /><br/>
-	</ww:iterator>
-</ww:generator>
-
-
-public class GeneratorTagAction extends ActionSupport {
-
-  ....
-
- public Converter getMyConverter() {
-	return new Converter() {
-		public Object convert(String value) throws Exception {
-			return "converter-"+value;
-		}
-	};
- }
-
-  ...
-
-}
-</pre>
-This will generate an iterator with each entries decided by the converter supplied. With
-this converter, it simply add "converter-" to each entries.
-
- -
- - diff --git a/docs/wikidocs/head.html b/docs/wikidocs/head.html deleted file mode 100644 index 5589808df..000000000 --- a/docs/wikidocs/head.html +++ /dev/null @@ -1,657 +0,0 @@ - - - WebWork - - head - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Renders parts of the HEAD section for an HTML file. This is useful as some themes require certain CSS and JavaScript - includes.

- -

If, for example, your page has ajax components integrated, without having the default theme set to ajax, you might - want to use the head tag with theme="ajax" so that the typical ajax header setup will be included in the - page.

- -

The tag also includes the option to set a custom datepicker theme if needed. See calendarcss parameter for - description for details.

- -

If you use the ajax theme you can turn a debug flag on by setting the debug parameter to true.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

calendarcssfalse Object/StringThe jscalendar css theme to use" default="calendar-blue.css
debugfalse Object/StringSet to true to enable debugging mode for AJAX themes
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<head>
-  <title>My page</title>
-  <ww:head/>
-</head>
-
-
-
<head>
-  <title>My page</title>
-  <ww:head theme="ajax" calendarcss="calendar-green"/>
-</head>
-
- -
- - diff --git a/docs/wikidocs/hidden.html b/docs/wikidocs/hidden.html deleted file mode 100644 index 537a6ad9f..000000000 --- a/docs/wikidocs/hidden.html +++ /dev/null @@ -1,610 +0,0 @@ - - - WebWork - - hidden - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Renders an HTML input element of type hidden, populated by the specified property from the OgnlValueStack.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
<-- example one -->
-<ww:hidden name="foo" />
-<-- example two -->
-<ww:hidden name="foo" value="bar" />
-
-Example One Resulting HTML (if foo evaluates to bar):
-<input type="hidden" name="foo" value="bar" />
-Example Two Resulting HTML (if getBar method of the action returns 'bar')
-<input type="hidden" name="foo" value="bar" />
-
- -
- - diff --git a/docs/wikidocs/i18n.html b/docs/wikidocs/i18n.html deleted file mode 100644 index 414a69013..000000000 --- a/docs/wikidocs/i18n.html +++ /dev/null @@ -1,84 +0,0 @@ - - - WebWork - - i18n - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Gets a resource bundle and place it on the value stack. This allows -the text tag to access messages from any bundle, and not just the bundle -associated with the current action.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

nametrueStringObject/StringName of ressource bundle to use (eg foo/bar/customBundle)
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:i18n name="myCustomBundle">
-   The i18n value for key aaa.bbb.ccc in myCustomBundle is <ww:property value="text('aaa.bbb.ccc')" />
-</ww:i18n>
-
- -
- - diff --git a/docs/wikidocs/icons/blogentry_16.gif b/docs/wikidocs/icons/blogentry_16.gif deleted file mode 100644 index 83d600d09..000000000 Binary files a/docs/wikidocs/icons/blogentry_16.gif and /dev/null differ diff --git a/docs/wikidocs/icons/bullet_blue.gif b/docs/wikidocs/icons/bullet_blue.gif deleted file mode 100644 index 25bfa0cf2..000000000 Binary files a/docs/wikidocs/icons/bullet_blue.gif and /dev/null differ diff --git a/docs/wikidocs/icons/comment_16.gif b/docs/wikidocs/icons/comment_16.gif deleted file mode 100644 index 6f76e86bd..000000000 Binary files a/docs/wikidocs/icons/comment_16.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/add.gif b/docs/wikidocs/icons/emoticons/add.gif deleted file mode 100644 index 0c00fe0d4..000000000 Binary files a/docs/wikidocs/icons/emoticons/add.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/biggrin.gif b/docs/wikidocs/icons/emoticons/biggrin.gif deleted file mode 100644 index ad0403198..000000000 Binary files a/docs/wikidocs/icons/emoticons/biggrin.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/check.gif b/docs/wikidocs/icons/emoticons/check.gif deleted file mode 100644 index 28bb99943..000000000 Binary files a/docs/wikidocs/icons/emoticons/check.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/error.gif b/docs/wikidocs/icons/emoticons/error.gif deleted file mode 100644 index 6d68a8cc0..000000000 Binary files a/docs/wikidocs/icons/emoticons/error.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/forbidden.gif b/docs/wikidocs/icons/emoticons/forbidden.gif deleted file mode 100644 index c6acdec60..000000000 Binary files a/docs/wikidocs/icons/emoticons/forbidden.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/help_16.gif b/docs/wikidocs/icons/emoticons/help_16.gif deleted file mode 100644 index 83387c25c..000000000 Binary files a/docs/wikidocs/icons/emoticons/help_16.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/information.gif b/docs/wikidocs/icons/emoticons/information.gif deleted file mode 100644 index 072ab660f..000000000 Binary files a/docs/wikidocs/icons/emoticons/information.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/lightbulb.gif b/docs/wikidocs/icons/emoticons/lightbulb.gif deleted file mode 100644 index cd72409a4..000000000 Binary files a/docs/wikidocs/icons/emoticons/lightbulb.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/lightbulb_on.gif b/docs/wikidocs/icons/emoticons/lightbulb_on.gif deleted file mode 100644 index 3768ef7d1..000000000 Binary files a/docs/wikidocs/icons/emoticons/lightbulb_on.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/sad.gif b/docs/wikidocs/icons/emoticons/sad.gif deleted file mode 100644 index 6aca31070..000000000 Binary files a/docs/wikidocs/icons/emoticons/sad.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/smile.gif b/docs/wikidocs/icons/emoticons/smile.gif deleted file mode 100644 index f8dc2782a..000000000 Binary files a/docs/wikidocs/icons/emoticons/smile.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/star_blue.gif b/docs/wikidocs/icons/emoticons/star_blue.gif deleted file mode 100644 index 9b366cebe..000000000 Binary files a/docs/wikidocs/icons/emoticons/star_blue.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/star_green.gif b/docs/wikidocs/icons/emoticons/star_green.gif deleted file mode 100644 index 42d27ec7e..000000000 Binary files a/docs/wikidocs/icons/emoticons/star_green.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/star_red.gif b/docs/wikidocs/icons/emoticons/star_red.gif deleted file mode 100644 index c10acb9f7..000000000 Binary files a/docs/wikidocs/icons/emoticons/star_red.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/star_yellow.gif b/docs/wikidocs/icons/emoticons/star_yellow.gif deleted file mode 100644 index 0f1d151a3..000000000 Binary files a/docs/wikidocs/icons/emoticons/star_yellow.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/thumbs_down.gif b/docs/wikidocs/icons/emoticons/thumbs_down.gif deleted file mode 100644 index 855c74886..000000000 Binary files a/docs/wikidocs/icons/emoticons/thumbs_down.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/thumbs_up.gif b/docs/wikidocs/icons/emoticons/thumbs_up.gif deleted file mode 100644 index 7c55feebd..000000000 Binary files a/docs/wikidocs/icons/emoticons/thumbs_up.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/tongue.gif b/docs/wikidocs/icons/emoticons/tongue.gif deleted file mode 100644 index fe77df2fa..000000000 Binary files a/docs/wikidocs/icons/emoticons/tongue.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/warning.gif b/docs/wikidocs/icons/emoticons/warning.gif deleted file mode 100644 index 1c9883b8f..000000000 Binary files a/docs/wikidocs/icons/emoticons/warning.gif and /dev/null differ diff --git a/docs/wikidocs/icons/emoticons/wink.gif b/docs/wikidocs/icons/emoticons/wink.gif deleted file mode 100644 index 24bdea960..000000000 Binary files a/docs/wikidocs/icons/emoticons/wink.gif and /dev/null differ diff --git a/docs/wikidocs/icons/home_16.gif b/docs/wikidocs/icons/home_16.gif deleted file mode 100644 index 7a902b1be..000000000 Binary files a/docs/wikidocs/icons/home_16.gif and /dev/null differ diff --git a/docs/wikidocs/icons/linkext7.gif b/docs/wikidocs/icons/linkext7.gif deleted file mode 100644 index f2dd2dcfa..000000000 Binary files a/docs/wikidocs/icons/linkext7.gif and /dev/null differ diff --git a/docs/wikidocs/icons/mail_16.gif b/docs/wikidocs/icons/mail_16.gif deleted file mode 100644 index 0386c0d10..000000000 Binary files a/docs/wikidocs/icons/mail_16.gif and /dev/null differ diff --git a/docs/wikidocs/icons/mail_small.gif b/docs/wikidocs/icons/mail_small.gif deleted file mode 100644 index a3b7d9f06..000000000 Binary files a/docs/wikidocs/icons/mail_small.gif and /dev/null differ diff --git a/docs/wikidocs/icons/user_12.gif b/docs/wikidocs/icons/user_12.gif deleted file mode 100644 index d41511f1b..000000000 Binary files a/docs/wikidocs/icons/user_12.gif and /dev/null differ diff --git a/docs/wikidocs/icons/user_16.gif b/docs/wikidocs/icons/user_16.gif deleted file mode 100644 index f5a2fb6a3..000000000 Binary files a/docs/wikidocs/icons/user_16.gif and /dev/null differ diff --git a/docs/wikidocs/if.html b/docs/wikidocs/if.html deleted file mode 100644 index 2bc27b591..000000000 --- a/docs/wikidocs/if.html +++ /dev/null @@ -1,90 +0,0 @@ - - - WebWork - - if - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

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

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

testtrue BooleanExpression to determine if body of tag is to be displayed
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:if test="%{false}">
-    <div>Will Not Be Executed</div>
- </ww:if>
-	<ww:elseif test="%{true}">
-    <div>Will Be Executed</div>
- </ww:elseif>
- <ww:else>
-    <div>Will Not Be Executed</div>
- </ww:else>
-
- - -
- - diff --git a/docs/wikidocs/include.html b/docs/wikidocs/include.html deleted file mode 100644 index a96c25e65..000000000 --- a/docs/wikidocs/include.html +++ /dev/null @@ -1,98 +0,0 @@ - - - WebWork - - include - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Include a servlet's output (result of servlet or a JSP page).

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

valuetrue StringThe jsp/servlet output to include
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Example

-
-
<-- One: -->
-<ww:include value="myJsp.jsp" />
-
-<-- Two: -->
-<ww:include value="myJsp.jsp">
-   <ww:param name="param1" value="value2" />
-   <ww:param name="param2" value="value2" />
-</ww:include>
-
-<-- Three: -->
-<ww:include value="myJsp.jsp">
-   <ww:param name="param1">value1</ww:param>
-   <ww:param name="param2">value2<ww:param>
-</ww:include>
-
-
-
Example one - do an include myJsp.jsp page
-Example two - do an include to myJsp.jsp page with parameters param1=value1 and param2=value2
-Example three - do an include to myJsp.jsp page with parameters param1=value1 and param2=value2
-
- - - -
- - diff --git a/docs/wikidocs/index.html b/docs/wikidocs/index.html deleted file mode 100644 index b5975c0cd..000000000 --- a/docs/wikidocs/index.html +++ /dev/null @@ -1,1994 +0,0 @@ - - - WW (WebWork) - - - - - - - - -
-
-

Space Details:

-
- - - - - - - - - - - - - -
- Key: - WW
- Name: - WebWork
- Description: -
-
-
-

-

Available Pages:

- -

-
- - diff --git a/docs/wikidocs/int validator.html b/docs/wikidocs/int validator.html deleted file mode 100644 index cd37758a2..000000000 --- a/docs/wikidocs/int validator.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork - - validator - - - - - - - - - - -
-

Description

-

Field Validator that checks if the integer specified is within a certain range.

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -
  • min - the minimum value (if none is specified, it will not be checked)
  • -
  • max - the maximum value (if none is specified, it will not be checked)
  • -

- -

Examples

-
-
<validators>
-          <!-- Plain Validator Syntax -->
-          <validator type="int">
-              <param name="fieldName">age</param>
-              <param name="min">20</param>
-              <param name="max">50</param>
-              <message>Age needs to be between ${min} and ${max}</message>
-          </validator>
-          
-          <!-- Field Validator Syntax -->
-          <field name="age">
-              <field-validator type="int">
-                  <param name="min">20</param>
-                  <param name="max">50</param>
-                  <message>Age needs to be between ${min} and ${max}</message>
-              </field-validator>
-          </field>
-     </validators>
-
- -
- - diff --git a/docs/wikidocs/iterator.html b/docs/wikidocs/iterator.html deleted file mode 100644 index 393b4a298..000000000 --- a/docs/wikidocs/iterator.html +++ /dev/null @@ -1,171 +0,0 @@ - - - WebWork - - iterator - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Iterator will iterate over a value. An iterable value can be either of: java.util.Collection, java.util.Iterator,

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

statusfalsefalseBooleanif specified, an instanceof IteratorStatus will be pushed into stack upon each iteration
valuefalse Object/Stringthe iteratable source to iterate over, else an the object itself will be put into a newly created List
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

- -

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

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

The following example uses a Bean tag and places it into the ActionContext. The iterator tag will retrieve - that object from the ActionContext and then calls its getDays() method as above. The status attribute is also used to - create a IteratorStatus object, which in this example, its odd() method is used to alternate row - colours:

- -
-
<ww:bean name="com.opensymphony.webwork.example.IteratorExample" id="it">
-  <ww:param name="day" value="'foo'"/>
-  <ww:param name="day" value="'bar'"/>
-</ww:bean>
-<p/>
-<table border="0" cellspacing="0" cellpadding="1">
-<tr>
-  <th>Days of the week</th>
-</tr>
-<p/>
-<ww:iterator value="#it.days" status="rowstatus">
-  <tr>
-    <ww:if test="#rowstatus.odd == true">
-      <td style="background: grey"><ww:property/></td>
-    </ww:if>
-    <ww:else>
-      <td><ww:property/></td>
-    </ww:else>
-  </tr>
-</ww:iterator>
-</table>
-
- - -

The next example will further demonstrate the use of the status attribute, using a DAO obtained from the action - class through OGNL, iterating over groups and their users (in a security context). The last() method indicates if the - current object is the last available in the iteration, and if not, we need to seperate the users using a comma:

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

The next example iterates over a an action collection and passes every iterator value to another action. The - trick here lies in the use of the '[0]' operator. It takes the current iterator value and passes it on to the edit - action. Using the '[0]' operator has the same effect as using >ww:property />. (The latter, however, does not - work from inside the param tag).

- -
-
<ww:action name="entries" id="entries"/>
-		<ww:iterator value="#entries.entries" >
-			<ww:property value="name" />
-			<ww:property />
-			<ww:push value="...">
-				<ww:action name="edit" id="edit" >
-					<ww:param name="entry" value="[0]" />
-				</ww:action>
-			</push>
-		</ww:iterator>
-
- -
- - diff --git a/docs/wikidocs/label.html b/docs/wikidocs/label.html deleted file mode 100644 index 3f2df371b..000000000 --- a/docs/wikidocs/label.html +++ /dev/null @@ -1,624 +0,0 @@ - - - WebWork - - label - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Renders an HTML LABEL that will allow you to output label:name combination that has the same format treatment as -the rest of your UI controls.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

forfalse Object/StringHTML for attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:label label="%{text('user_name')}" name="userName" />
-
-
-
In this example, a label is rendered. The label is retrieved from a ResourceBundle by calling ActionSupport's
-getText() method giving you an output of 'User Name:tm_jee'. Assuming that i18n message user_name corresponds
-to 'User Name' and the action's getUserName() method returns 'tm_jee'<p/>
-
- -
- - diff --git a/docs/wikidocs/merge.html b/docs/wikidocs/merge.html deleted file mode 100644 index 18594213d..000000000 --- a/docs/wikidocs/merge.html +++ /dev/null @@ -1,128 +0,0 @@ - - - WebWork - - merge - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Component for MergeIteratorTag, which job is to merge iterators and successive -call to the merged iterator will cause each merge iterator to have a chance to -expose its element, subsequently next call will allow the next iterator to expose -its element. Once the last iterator is done exposing its element, the first iterator -is allowed to do so again (unless it is exhausted of entries).

- -

Internally the task are delegated to MergeIteratorFilter

- -

Example if there are 3 lists being merged, each list have 3 entries, the following will -be the logic.

-
    -
  1. Display first element of the first list
  2. -
  3. Display first element of the second list
  4. -
  5. Display first element of the third list
  6. -
  7. Display second element of the first list
  8. -
  9. Display second element of the second list
  10. -
  11. Display second element of the third list
  12. -
  13. Display third element of the first list
  14. -
  15. Display thrid element of the second list
  16. -
  17. Display third element of the thrid list
  18. -

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

idfalse Object/Stringthe id where the resultant merged iterator will be stored in the stack's context

- -

Examples

-
-
public class MergeIteratorTagAction extends ActionSupport {
-
-private List myList1;
-private List myList2;
-private List myList3;
-
-public List getMyList1() {
-	return myList1;
-}
-
-public List getMyList2() {
-	return myList2;
-}
-
-public List getMyList3() {
-	return myList3;
-}
-
-
-public String execute() throws Exception {
-	
-	myList1 = new ArrayList();
-	myList1.add("1");
-	myList1.add("2");
-	myList1.add("3");
-	
-	myList2 = new ArrayList();
-	myList2.add("a");
-	myList2.add("b");
-	myList2.add("c");
-	
-	myList3 = new ArrayList();
-	myList3.add("A");
-	myList3.add("B");
-	myList3.add("C");
-	
-	return "done";
-}
-}
-
-
-
<ww:merge id="myMergedIterator1">
-	<ww:param value="%{myList1}" />
-	<ww:param value="%{myList2}" />
-	<ww:param value="%{myList3}" />
-</ww:merge>
-<ww:iterator value="%{#myMergedIterator1}">
-	<ww:property />
-</ww:iterator>
-
- -
- - diff --git a/docs/wikidocs/optiontransferselect.html b/docs/wikidocs/optiontransferselect.html deleted file mode 100644 index 66b04710e..000000000 --- a/docs/wikidocs/optiontransferselect.html +++ /dev/null @@ -1,1581 +0,0 @@ - - - WebWork - - optiontransferselect - - - - - - - - - - -
-
-

Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.

-

 

- -

Description

- - -

Create a option transfer select component which is basically two <select ...> -tag with buttons in the middle of them allowing options in each of the -<select ...> to be moved between themselves. Will auto-select all its -elements upon its containing form submision.

- -

-

NOTE: The id and doubleId need not be supplied as they will generated provided -that the optiontransferselect tag is being used in a form tag. The generated id -and doubleId will be <form_id>_<optiontransferselect_doubleName> and -<form_id>_<optiontransferselect_doubleName> respectively.

- 

- -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

addAllToLeftLabelfalse Object/Stringset Add To Left button label
addAllToRightLabelfalse Object/Stringset Add All To Right button label
addToLeftLabelfalse Object/Stringset Add To Left button label
addToRightLabelfalse Object/Stringset Add To Right button label
allowAddAllToLeftfalse Object/Stringenable Add All To Left button
allowAddAllToRightfalse Object/Stringenable Add All To Right button
allowAddToLeftfalse Object/Stringenable Add To Left button
allowAddToRightfalse Object/Stringenable Add To Right button
leftTitlefalse Object/Stringset Left title
rightTitlefalse Object/Stringset Right title
allowSelectAllfalse Object/Stringenable Select All button
selectAllLabelfalse Object/Stringset Select All button label
buttonCssClassfalse Object/Stringset buttons css class
buttonCssStylefalse Object/Stringset button css style
doubleListtrue Object/StringThe second iterable source to populate from.
doubleListKeyfalse Object/StringThe key expression to use for second list
doubleListValuefalse Object/StringThe value expression to use for second list
doubleNametrue Object/StringThe name for complete component
doubleValuefalse Object/StringThe value expression for complete component
formNamefalse Object/StringThe form name this component resides in and populates to
doubleCssClassfalse Object/StringThe css class for the second list
doubleCssStylefalse Object/StringThe css style for the second list
doubleHeaderKeyfalse Object/StringThe header key for the second list
doubleHeaderValuefalse Object/StringThe header value for the second list
doubleEmptyOptionfalse Object/StringDecides if the second list will add an empty option
doubleDisabledfalse Object/StringDecides if a disable attribute should be added to the second list
doubleIdfalse Object/StringThe id of the second list
doubleMultiplefalse Object/StringDecides if multiple attribute should be set on the second list
doubleOnblurfalse Object/StringSet the onblur attribute of the second list
doubleOnchangefalse Object/StringSet the onchange attribute of the second list
doubleOnclickfalse Object/StringSet the onclick attribute of the second list
doubleOndblclickfalse Object/StringSet the ondbclick attribute of the second list
doubleOnfocusfalse Object/StringSet the onfocus attribute of the second list
doubleOnkeydownfalse Object/StringSet the onkeydown attribute of the second list
doubleOnkeypressfalse Object/StringSet the onkeypress attribute of the second list
doubleOnkeyupfalse Object/StringSet the onkeyup attribute of the second list
doubleOnmousedownfalse Object/StringSet the onmousedown attribute of the second list
doubleOnmousemovefalse Object/StringSet the onmousemove attribute of the second list
doubleOnmouseoutfalse Object/StringSet the onmouseout attribute of the second list
doubleOnmouseoverfalse Object/StringSet the onmouseover attribute of the second list
doubleOnmouseupfalse Object/StringSet the onmouseup attribute of the second list
doubleOnselectfalse Object/StringSet the onselect attribute of the second list
doubleSizefalse Object/StringSet the size attribute of the second list
doubleListKeyfalse Object/StringSet the list key of the second attribute
emptyOptionfalsefalseBooleanDecides of an empty option is to be inserted in the second list
headerKeyfalse Object/StringSet the header key of the second list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringSet the header value of the second list
multiplefalse Object/StringCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

-

 

- -

Examples

- -
-
<-- minimum configuration -->
-<ww:optiontransferselect 
-  	label="Favourite Cartoons Characters"
-	name="leftSideCartoonCharacters" 
-	list="{'Popeye', 'He-Man', 'Spiderman'}" 
-	doubleName="rightSideCartoonCharacters"
-	doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}" 
-/>
-
- <-- possible configuration -->
- <ww:optiontransferselect 
-  	label="Favourite Cartoons Characters"
-	name="leftSideCartoonCharacters" 
-	leftTitle="Left Title"
-	rightTitle="Right Title"
-	list="{'Popeye', 'He-Man', 'Spiderman'}" 
-	multiple="true"
-	headerKey="headerKey"
-	headerValue="--- Please Select ---"
-	emptyOption="true"
-	doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}" 
-	doubleName="rightSideCartoonCharacters"
-	doubleHeaderKey="doubleHeaderKey"
-	doubleHeaderValue="--- Please Select ---" 
-	doubleEmptyOption="true"
-	doubleMultiple="true"
-/>
-
-

 

- -
- - diff --git a/docs/wikidocs/panel.html b/docs/wikidocs/panel.html deleted file mode 100644 index 144a29d02..000000000 --- a/docs/wikidocs/panel.html +++ /dev/null @@ -1,831 +0,0 @@ - - - WebWork - - panel - - - - - - - - - - -
-

Description

-

Render a panel for tabbedPanel.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

tabNametrue Object/StringThe text of the tab to display in the header tab list
subscribeTopicNamefalse Object/StringSet subscribeTopicName attribute
remotefalsefalseBooleandetermines whether this is a remote panel (ajax) or a local panel (content loaded into visible/hidden containers)
updateFreqfalse0IntegerHow often to re-fetch the content (in milliseconds)
delayfalse0IntegerHow long to wait before fetching the content (in milliseconds)
loadingTextfalse Object/StringThe text to display to the user while the new content is being fetched (especially good if the content will take awhile)
listenTopicsfalse Object/StringTopic name to listen to (comma delimited), that will cause the DIV's content to be re-fetched
themefalse StringThe theme to use for the element. This tag will usually use the ajax theme.
hreffalse StringThe URL to call to obtain the content
errorTextfalse StringThe text to display to the user if the is an error fetching the content
showErrorTransportTextfalsefalseBooleanwhen to show the error message as content when the URL had problems
afterLoadingfalse StringJavascript code that will be executed after the content has been fetched
openTemplatefalse Object/StringSet template to use for opening the rendered html.
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-

The following is an example of a tabbedpanel and panel tag utilizing local and remote content.

-

If you are looking for the "nifty" rounded corner look, there is additional configuration. This assumes -that the background color of the tabs is white. If you are using a different color, please modify the -parameter in the Rounded() method.

-
-
<link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/tabs.css"/>">
-<link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/niftycorners/niftyCorners.css"/>">
-<link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/niftycorners/niftyPrint.css"/>" media="print">
-<script type="text/javascript" src="<ww:url value="/webwork/niftycorners/nifty.js"/>"></script>
-<script type="text/javascript">
-    dojo.event.connect(window, "onload", function() {
-        if (!NiftyCheck())
-            return;
-        Rounded("li.tab_selected", "top", "white", "transparent", "border #ffffffS");
-        Rounded("li.tab_unselected", "top", "white", "transparent", "border #ffffffS");
-        // "white" needs to be replaced with the background color
-    });
-</script>
-
- -
- - diff --git a/docs/wikidocs/param.html b/docs/wikidocs/param.html deleted file mode 100644 index ac079ac72..000000000 --- a/docs/wikidocs/param.html +++ /dev/null @@ -1,127 +0,0 @@ - - - WebWork - - param - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

This tag can be used to parameterize other tags.

-The include tag and bean tag are examples of such tags. -

-The parameters can be added with or without a name as key. -If the tag provides a name attribute the parameters are added using the -{@link Component#addParameter(String, Object) addParamter} method. -For unnamed parameters the Tag must implement the UnnamedParametric interface defined in -this class (e.g. The TextTag does this). -

-This tag has the following two paramters. -

    -
  • name (String) - the name of the parameter
  • -
  • value (Object) - the value of the parameter
  • -
-

-Note: -When you declare the param tag, the value can be defined in either a value attribute or -as text between the start and end tag. WebWork behaves a bit different according to these two situations. -This is best illustrated using an example: -
<param name="color">blue</param> <-- (A) --> -
<param name="color" value="blue"/> <-- (B) --> -
In the first situation (A) the value would be evaluated to the stack as a java.lang.String object. -And in situation (B) the value would be evaluated to the stack as a java.lang.Object object. -
For more information see WW-808.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

namefalse StringName of Parameter to set
valuefalseThe value of evaluating provided name against stackObject/StringValue expression for Parameter to set
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<pre>
-<ui:component>
- <ui:param name="key"     value="[0]"/>
- <ui:param name="value"   value="[1]"/>
- <ui:param name="context" value="[2]"/>
-</ui:component>
-</pre>
-
-

where the key will be the identifier and the value the result of an OGNL expression run against the current -OgnlValueStack.

- -
- - diff --git a/docs/wikidocs/password.html b/docs/wikidocs/password.html deleted file mode 100644 index fc9c7e44e..000000000 --- a/docs/wikidocs/password.html +++ /dev/null @@ -1,712 +0,0 @@ - - - WebWork - - password - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Render an HTML input tag of type password.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

showPasswordfalsefalseBooleanWhether to show input
showfalse Object/StringDeprecated. Use showPassword instead.
maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
In this example, a password control is displayed. For the label, we are calling ActionSupport's getText() to
-retrieve password label from a resource bundle.<p/>
-
-
-
<ww:password label="%{text('password')}" name="password" size="10" maxlength="15" />
-
- -
- - diff --git a/docs/wikidocs/property.html b/docs/wikidocs/property.html deleted file mode 100644 index 5c51cef3b..000000000 --- a/docs/wikidocs/property.html +++ /dev/null @@ -1,132 +0,0 @@ - - - WebWork - - property - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-
    -
  • -
  • Used to get the property of a <i>value</i>, which will default to the top of
  • -
  • the stack if none is specified.
  • -
  • -
- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

defaultfalse StringThe default value to be used if value attribute is null
escapefalsetrueBooleanWhether to escape HTML
valuefalse<top of stack>Objectvalue to be displayed
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:push value="myBean">
-    <!-- Example 1: -->
-    <ww:property value="myBeanProperty" />
-
-    <!-- Example 2: -->
-    <ww:property value="myBeanProperty" default="a default value" />
-</ww:push>
-
-
-
Example 1 prints the result of myBean's getMyBeanProperty() method.
-Example 2 prints the result of myBean's getMyBeanProperty() method and if it is null, print 'a default value' instead.
-
- - - -
- - diff --git a/docs/wikidocs/push.html b/docs/wikidocs/push.html deleted file mode 100644 index 4cf8a20bb..000000000 --- a/docs/wikidocs/push.html +++ /dev/null @@ -1,123 +0,0 @@ - - - WebWork - - push - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Push value on stack for simplified usage.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

valuetrue Object/StringValue to push on stack
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<ww:push value="user">
-    <ww:propery value="firstName" />
-    <ww:propery value="lastName" />
-</ww:push>
-
-
-
Pushed user into the stack, and hence property tag could access user's properties 
-(firstName, lastName etc) since user is not at the top of the stack
-
-
-
<ww:push value="myObject">                              ----- (1)
-      <ww:bean name="jp.SomeBean" id="myBean"/>        ----- (2)
-		    <ww:param name="myParam" value="top"/>        ----- (3)
-      </ww:bean>
-  </ww:push>
-
-
-
when in (1), myObject is at the top of the stack
-when in (2), jp.SomeBean is in the top of stack, also in stack's context with key myBean
-when in (3), top will get the jp.SomeBean instance
-
-
-
<ww:push value="myObject">                                       ---(A)
-   <ww:bean name="jp.SomeBean" id="myBean"/>                   ---(B)
-      <ww:param name="myParam" value="top.mySomeOtherValue"/>  ---(C)
-   </ww:bean>
-</ww:push>
-
-
-
when in (A), myObject is at the top of the stack
-when in (B), jp.SomeBean is at the top of the stack, also in context with key myBean
-when in (C), top refers to jp.SomeBean instance. so top.mySomeOtherValue would invoke SomeBean's mySomeOtherValue() method
-
-
-
<ww:push value="myObject">                                 ---- (i)
-   <ww:bean name="jp.SomeBean" id="myBean"/>             ---- (ii)
-      <ww:param name="myParam" value="[1].top"/>         -----(iii)
-   </ww:bean>
-</ww:push>
-
-
-
when in (i), myObject is at the top of the stack
-when in (ii), jp.SomeBean is at the top of the stack, followed by myObject
-when in (iii), [1].top will returned top of the cut of stack starting from myObject, namely myObject itself
-
- - - -
- - diff --git a/docs/wikidocs/radio.html b/docs/wikidocs/radio.html deleted file mode 100644 index 71ce0a4be..000000000 --- a/docs/wikidocs/radio.html +++ /dev/null @@ -1,660 +0,0 @@ - - - WebWork - - radio - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Render a radio button input field.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-

In this example, a radio control is displayed with a list of genders. The gender list is built from attribute -id=genders. WW calls getGenders() which will return a Map. For examples using listKey and listValue attributes, -see the section select tag. The default selected one will be determined (in this case) by the getMale() method -in the action class which should retun a value similar to the key of the getGenters() map if that particular -gender is to be selected.

-
-
<ww:action name="GenderMap" id="genders"/>
-<ww:radio label="Gender" name="male" list="#genders.genders"/>
-
- -
- - diff --git a/docs/wikidocs/redirect after post.html b/docs/wikidocs/redirect after post.html deleted file mode 100644 index a1ff19538..000000000 --- a/docs/wikidocs/redirect after post.html +++ /dev/null @@ -1,20 +0,0 @@ - - - WebWork - - redirect after post - - - - - - - - - - -
-

The redirect-after-post technique is a common pattern in web application development. It simply means making your action, after it has successfully executed, result in a redirect. You can do this by using the Redirect Result or the Redirect Action Result.

- -
- - diff --git a/docs/wikidocs/regex validator.html b/docs/wikidocs/regex validator.html deleted file mode 100644 index e43d6558b..000000000 --- a/docs/wikidocs/regex validator.html +++ /dev/null @@ -1,46 +0,0 @@ - - - WebWork - - regex validator - - - - - - - - - - -
-

Description

-

Validates a string field using a regular expression.

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -
  • expression - The RegExp expression REQUIRED
  • -

- - -

Examples

-
-
<validators>
-    <!-- Plain Validator Syntax -->
-    <validator type="regex">
-        <param name="fieldName">myStrangePostcode</param>
-        <param name="expression"><![CDATA[([aAbBcCdD][123][eEfFgG][456])]]<>/param>
-    </validator>
-
-    <!-- Field Validator Syntax -->
-    <field name="myStrangePostcode">
-        <field-validator type="regex">
-           <param name="expression"><![CDATA[([aAbBcCdD][123][eEfFgG][456])]]></param>
-        </field-validator>
-    </field>
-</validators>
-
- -
- - diff --git a/docs/wikidocs/required validator.html b/docs/wikidocs/required validator.html deleted file mode 100644 index 90e7f2429..000000000 --- a/docs/wikidocs/required validator.html +++ /dev/null @@ -1,48 +0,0 @@ - - - WebWork - - required validator - - - - - - - - - - -
-

Description

-

RequiredFieldValidator checks if the specified field is not null.

- -

Parameters

-

    -
  • fieldName - field name if plain-validator syntax is used, not needed if field-validator syntax is used
  • -

- - -

Examples

-
-
<validators>
-
-        <!-- Plain Validator Syntax -->
-        <validator type="required">
-            <param name="fieldName">username</param>
-            <message>username must not be null</message>
-        </validator>
-
-
-        <!-- Field Validator Syntax -->
-        <field name="username">
-            <field-validator type="required">
-            	   <message>username must not be null</message>
-            </field-validator>
-        </field>
-
-    </validators>
-
- -
- - diff --git a/docs/wikidocs/requiredstring validator.html b/docs/wikidocs/requiredstring validator.html deleted file mode 100644 index 4aecf0bc0..000000000 --- a/docs/wikidocs/requiredstring validator.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork - - requiredstring validator - - - - - - - - - - -
-

Description

-

RequiredStringValidator checks that a String field is non-null and has a length > 0. -(i.e. it isn't ""). The "trim" parameter determines whether it will {@link String#trim() trim} -the String before performing the length check. If unspecified, the String will be trimmed.

- -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -
  • trim - trim the field name value before validating (default is true)
  • -

- -

Examples

-
-
<validators>
-    <!-- Plain-Validator Syntax -->
-    <validator type="requiredstring">
-        <param name="fieldName">username</param>
-        <param name="trim">true</param>
-        <message>username is required</message>
-    </validator>
-    
-    <!-- Field-Validator Syntax -->
-    <field name="username">
-    	  <field-validator type="requiredstring">
-            <param name="trim">true</param>
-            <message>username is required</message>
-       </field-validator>
-    </field>
-</validators>
-
- -
- - diff --git a/docs/wikidocs/reset.html b/docs/wikidocs/reset.html deleted file mode 100644 index 5818d51c0..000000000 --- a/docs/wikidocs/reset.html +++ /dev/null @@ -1,693 +0,0 @@ - - - WebWork - - reset - - - - - - - - - - -
-
-

Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.

- -

Description

- -

Render a reset button. The reset tag is used together with the form tag to provide form resetting. -The reset can have two different types of rendering: -

    -
  • input: renders as html <input type="reset"...>
  • -
  • button: renders as html <button type="reset"...>
  • -
-Please note that the button type has advantages by adding the possibility to seperate the submitted value from the -text shown on the button face, but has issues with Microsoft Internet Explorer at least up to 6.0

- -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

labelfalse Object/StringSupply a reset button text apart from reset value. Will have no effect for input type reset, since button text will always be the value parameter.
actionfalse StringSet action attribute.
methodfalse StringSet method attribute.
alignfalse StringHTML align attribute.
typefalseinputStringThe type of submit to use. Valid values are input, button and image.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

- - -

Example 1

- -
-
<ww:reset value="%{'Reset'}" />
-
- -

Example 2

- -
-
Render an button reset:
-<ww:reset type="button" value="%{'Reset'}" label="Reset the form"/>
-
- -
- - diff --git a/docs/wikidocs/richtexteditor.html b/docs/wikidocs/richtexteditor.html deleted file mode 100644 index 3128ef918..000000000 --- a/docs/wikidocs/richtexteditor.html +++ /dev/null @@ -1,1963 +0,0 @@ - - - WebWork - - richtexteditor - - - - - - - - - - -
-
-

Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.

- -

Description

- - -

Create a Rich Text Editor based on FCK editor (www.fckeditor.net).

- - -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

checkBrowserfalsetrueBooleanWhether the rich text editor should check for browser compatibility when rendering its toolbar
displayErrorfalsetrueBooleanWhether should the rich text editor display error when it fails to render etc.
autoDetectLanguagefalsetrueBooleanTells the editor to automatically detect the user language preferences to adapt its interface language. With Internet Explorer, the language configured in the Windows Control Panel is used. With Firefox, the browser language is used
baseHreffalse StringBase URL used to resolve links (on images, links, styles, etc.). For example, if BaseHref is set to 'http://www.fredck.com', an image that points to "Logo.gif" will be interpreted by the editor as "http://www.fredck.com/images/Logo.gif", without touching the "src" attribute of the image.
basePathfalse/webwork/static/richtexteditor/StringSet the dir where the FCKeditor files reside on the server
contentLangDirectionfalseltrStringSets the direction of the editor area contents. Either ltr or rtl
customConfigurationsPathfalse StringSet the path of a custom file that can override some configurations. It is recommended to use absolute paths (starting with /), like /myfckconfig.js.
debugfalsefalseBooleanEnables the debug window to be shown when calling the FCKDebug.Output() function.
defaultLanguagefalseenStringSets the default language used for the editor's interface localization. The default language is used when the AutoDetectLanguage options is disabled or when the user language is not available.
editorAreaCSSfalsecss/fck_editorarea.cssStringSet the CSS styles file to be used in the editing area. In this way you can point to a file that reflects your web site styles
enableSourceXHTMLfalsetrueStringTells the editor to process the HTML source to XHTML when switching from WYSIWYG to Source view
enableXHTMLfalsetrueStringTells the editor to process the HTML source to XHTML on form post.
fillEmptyBlocksfalsetrueStringBlock elements (like P, DIV, H1, PRE, etc...) are forced to have content (a &nbsp. Empty blocks are "collapsed" by while browsing, so a empty <p></p> is not visible. While editing, the editor "expand" empty blocks so you can insert content inside then. Setting this option to "true" results useful to reflect the same output when browsing and editing.
flashBrowserURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ browser/default/browser.html? Type=Flash& Connector=connectors/jsp/connector.actionStringSets the URL of the page called when the user clicks the 'Browse Server' button in the "Flash" dialog window. In this way, you can create your custom Flash Browser that is well integrated with your system.
flashUploadURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ upload/uploader.action? Type=FlashstringSets the URL of the upload handler called when the user clicks the 'Send it to server' button in the "Flash" dialog window. In this way, you can create your custom Flash Uploader that is well integrated with your system.
fontColorsfalse000000, 993300, 333300, 003300, 003366, 000080, 333399, 333333, 800000, FF6600, 808000, 808080, 008080, 0000FF, 666699, 808080, FF0000, FF9900, 99CC00, 339966, 33CCCC, 3366FF, 800080, 999999, FF00FF, FFCC00, FFFF00, 00FF00, 00FFFF, 00CCFF, 993366, C0C0C0, FF99CC, FFCC99, FFFF99, CCFFCC, CCFFFF, 99CCFF, CC99FF, FFFFFFstringSets the colors that must be shown in the colors panels (in the toolbar).
fontFormatsfalsep; div; pre; address; h1; h2; h3; h4; h5; h6stringSets the list of formats to be shown in the "Format" toolbar command.
fontNamesfalseArial; Comic Sans MS; Courier New; Tahoma; Times New Roman; VerdanastringSets the list of fonts to be shown in the "Font" toolbar command.
fontSizesfalse1/xx-small; 2/x-small; 3/small; 4/medium; 5/large; 6/x-large; 7/xx-largestringSets the list of font sizes to be shown in the "Size" toolbar command.
forcePasteAsPlainTextfalsefalsebooleanConverts the clipboard contents to pure text on pasting operations
forceSimpleAmpersandfalsefalsebooleanForces the ampersands (&) on tags attributes to not be converted to '&amp;' This conversion is a W3C requirement for XHTML, so it is recommended to leave this option to 'false'.
formatIndentatorfalse' 'booleanSets the characters to be used when indenting the HTML source when formatting it. Useful values are a sequence of spaces (' ') or a tab char ('\t').
formatOutputfalsetruebooleanThe output HTML generated by the editor will be processed and formatted.
formatSourcefalsetruebooleanThe HTML shown by the editor, while switching from WYSIWYG to Source views, will be processed and formatted
fullPagefalsefalsebooleanEnables full page editing (from <HTML> to </HTML>). It also enables the 'Page Properties' toolbar button.
geckoUseSPANfalsetruebooleanTells Gecko browsers to use SPAN instead of <B>, <I> and <U> for bold, italic an underline
heightfalse200stringSet the height of the rich text editor
imageBrowserURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ browser/default/browser.html? Type=Image& Connector=connectors/jsp/connector.actionstringSets the URL of the page called when the user clicks the 'Browse Server' button in the 'Image' dialog window. In this way, you can create your custom Image Browser that is well integrated with your system.
imageUploadURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ upload/uploader.action? Type=ImagestringSets the URL of the upload handler called when the user clicks the 'Send it to server' button in the 'Image' dialog window. In this way, you can create your custom Image Uploader that is well integrated with your system.
linkBrowserURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ browser/default/browser.html? Type=File& Connector=connectors/jsp/connector.actionstringSets the URL of the page called when the user clicks the 'Browse Server' button in the 'Link' dialog window. In this way, you can create your custom File Browser that is well integrated with your system.
linkUploadURLfalse/webwork/static/ richtexteditor/ editor/filemanager/ upload/uploader.action? Type=FilestringSets the URL of the upload handler called when the user clicks the 'Send it to server' button in the 'Link' dialog window. In this way, you can create your custom Link Uploader that is well integrated with your system.
pluginsPathfalse/webwork/static/richtexteditor/plugins/stringSets the base path used when looking for registered plugins.
skinPathfalse/webwork/static/richtexteditor/skins/defaultstringSets the path to the skin (graphical interface settings) to be used by the editor.
startupFocusfalsefalsebooleanForces the editor to get the keyboard input focus on startup (page load)
stylesXmlPathfalse/webwork/static/richtexteditor/fckstyles.xmlstringSets the path to the XML file that has the definitions and rules of the styles used by the 'Style' toolbar command
tabSpacesfalse0stringSet the number of spaces (&nbsp) to be inserted when the user hits the 'tab' key. This is an Internet Explorer only feature. Other browsers insert spaces automatically by default.
toolbarCanCollapsefalsetruebooleanTells the editor that the toolbar can be Collapsed/Expanded by the user when clicking the vertical bar placed on the left of it (on the right for 'rtl' languages).
toolbarSetfalseDefaultstringSet the name of the toolbar to display
toolbarStartExpandedfalsetruebooleanDecide if the toolbar should be expanded when the rich text editor is loaded
useBROnCarriageReturnfalsetruebooleanDecide if a <br/> should be used in place of the occurence of a carriage return
widthfalse100%stringset the width of the rich text editor
allowFlashBrowsefalsetruebooleandetermine if to allow flash browsing
allowFlashUploadfalsetruebooleandetermine if to allow flash upload
allowImageBrowsefalsetruebooleandetermine if to allow image browsing
allowImageUploadfalsetruebooleandetermine if to allow image uploading
allowLinkBrowsefalsetruebooleandetermine if to allow link browsing
allowLinkUploadfalsetruebooleandetermine if to allow link uploading
flashUploadAllowedExtensionfalse.(swf|fla)$stringregexp for allowed flash upload file format
flashUploadDeniedExtensionfalsestringregexp for deinied flash upload file format
imageUploadAllowedExtensionfalse.(jpg|gif|jpeg|png)$stringregexp for allowed image upload file format
imageUploadDeniedExtensionfalsestringregexp for denied image upload file format
linkUploadAllowedExtensionfalsestringregexp for allowed link upload file format
linkUploadDeniedExtensionfalse.(php| php3| php5| phtml| asp| aspx| ascx| jsp| cfm| cfc| pl| bat| exe| dll| reg| cgi)$stringregexp for denied link upload file format
smileyImagesfalse Object/Stringjs array of smilies files to be included
smileyPathfalse/webwork/static/ richtexteditor/editor/ images/smiley/msn/stringpath where smilies are located
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

- -
-
<ww:richtexteditor 
-		toolbarCanCollapse="false"
-		width="700"
-		label="Description 1" 
-		name="description1" 
-		value="Some Content I keyed In In The Tag Itself"
-		/>
-
- -

Server Side Browsing

- - -

It is possible to have a rich text editor do server side browsing -when for example the image button is clicked. To integrate this functionality with -webwork, one need to defined the following action definition typically in xwork.xml

- -

-  <package name="richtexteditor-browse" extends="webwork-default" 
-  namespace="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp">
-  	<action name="connector" 
-     class="com.opensymphony.webwork.components.DefaultRichtexteditorConnector" 
-     method="browse">
-  		<result name="getFolders" type="richtexteditorGetFolders" />
-  		<result name="getFoldersAndFiles" type="richtexteditorGetFoldersAndFiles" />
-  		<result name="createFolder" type="richtexteditorCreateFolder" />
-  		<result name="fileUpload" type="richtexteditorFileUpload" />
-  	</action>
-  </package>
-

- -

By default whenever a browse command is triggered (eg. by clicking on the 'image' button and then -'browse server' button, the url '/webwork/static/richtexteditor/editor/filemanager/browser/default/browser.html?&Type=Image&Connector=connectors/jsp/connector.action'. -The page browser.html which comes with FCK Editor will trigger the url -'/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp/connector.action' which will -caused the webwork's DefaultRichtexteditorConnector to be executed. The trigerring url could be -changed by altering the 'imageBrowseURL'. There 3 types of such related url, namely 'imageBrowseURL', -'linkBrowseURL' and 'flashBrowseURL'. It is recomended that the default one being used. One could change the -Connector parameter instead. For example

- -

-/webwork/static/richtexteditor/editor/filemanager/browser/default/browser.html?
-&Type=Image&Connector=connectors/jsp/connector.action
-

- -

could be changed to

- -

-/webwork/static/richtexteditor/editor/filemanager/browser/default/browser.html?
-&Type=Image&Connector=myLittlePath/myConnector.action
-

- -

In this case the action will need to have a namespace of '/webwork/richtexteditor/editor/filemanager/browser/default/myLittlePath' -and action name of 'myConnector'

- -

- -

By default the action method that needs to be defined in xwork.xml needs to be 'browse'. If this needs -to be something else say, myBrowse, the following could be used

- -

-  public String myBrowse() {
-      browse();
-  }
-

- - -

Server Side Uploading

- - -

It is possible for the richtexteditor to do server side uploading as well. For example when clicking -on the 'Image' button and then the 'Upload' tab and then selecting a file from client local -machine and the clicking 'Send it to the server'. To integrate this functionality with -webwork, one need to defined the following action definition typically in xwork.xml

- -

-  <package name="richtexteditor-upload" extends="webwork-default" 
-  namespace="/webwork/richtexteditor/editor/filemanager/upload">
-	<action name="uploader" 
-      class="com.opensymphony.webwork.components.DefaultRichtexteditorConnector" 
-      method="upload">
-		<result name="richtexteditorFileUpload" />
-	</action>    
-  </package>
-

- -

By default whenever an upload command is triggered, a '/webwork/static/richtexteditor/editor/filemanager/upload/uploader.action?Type=Image' -will be issued. This could be changed by setting the imageUploadURL attribute of the tag. -When this link is issued, the webwork action will get executed. There's 3 such related upload url -namely, 'imageUploadURL', 'linkUploadURL' and 'flashUploadURL'. It is recomended that the default -one being used. However one could change the url, but need to include the Type parameter. For example

- -

-/webwork/static/richtexteditor/editor/filemanager/upload/uploader.action?Type=Image
-

- -

could be changed to

- -

-/webwork/static/richtexteditor/editor/filemanager/upload/aDifferentUploader.action?Type=Image
-

- -

In this case the action will need to have a namespace of '/webwork/static/richtexteditor/editor/filemanager/upload' -and action name of 'aDifferentUploader'

- -

By default the action method that needs to be defined in xwork.xml needs to be 'upload'. If this needs -to be something else say, myUpload, the following could be used

- -

-  public String myUpload() {
-      upload();
-  }
-

- - -

WebWork Action

- - -

AbstractRichtexteditorConnector

- - -

An abstract class to be extended in order for the Rich text editor to perform server-side -browsing and uploading.

- - -

The webwork action that handles the server-side browsing and uploading needs to extends from -AbstractRichtexteditorConnector.

- -

There are four abstract methods need to be implemented, namely

- -

- -

- protected abstract String calculateServerPath(String serverPath, String folderPath, 
-       String type) throws Exception;
- protected abstract Folder[] getFolders(String virtualFolderPath, String type) 
-       throws Exception;
- protected abstract FoldersAndFiles getFoldersAndFiles(String virtualFolderPath, 
-       String type) throws Exception;
- protected abstract CreateFolderResult createFolder(String virtualFolderPath, 
-       String type, String newFolderName) throws Exception;
- protected abstract FileUploadResult fileUpload(String virtualFolderPath, 
-       String type, String filename, String contentType, java.io.File newFile) 
-       throws Exception;
- protected abstract void unknownCommand(String command, String virtualFolderPath, 
-       String type, String filename, String contentType, java.io.File newFile) 
-       throws Exception;
-

- - -

browse method

- - -

The method that does the functionality when the richtexteditor 'browse' command is -issued.

- -

- -

Following are the result name that gets returned depending on the actual 'browse' -command.

- -

- - - - - - - - - - - - - - - - - - - - -
Browse CommandResult Name
GetFoldersgetFolders
GetFoldersAndFilesgetFoldersAndFiles
CreateFoldercreateFolder
FileUploadfileUpload

- - -

upload method

- - -

The method that does the functionality when the richtexteditor 'upload' command is '/webwork/richtexteditor/data/' -issued.

- -

- -

It return a result name of 'fileUpload'.

- - -

getFolders method

- - -

Method that gets called when a 'GetFolders' command is issued by the rich text editor. -This method should search the server-side and return an Folder[] that the server side has.

- -

- -

The folder path queried by the rich text editor is folderPath. While the -type of could be one of 'Image', 'Link' or 'Flash'.

- - -

getFoldersAndFiles method

- - -

Method that gets called when a 'GetFoldersAndFiles' command is issued by the rich text -editor. This method should typically search the server-side for files and folders under the -provided virtualFolderPath and return a FoldersAndFiles object.

- -

- -

The folder path queried by the richtexted editor is virtualFolderPath. -While the type could be one of 'Image', 'Link' or 'Flash'.

- - -

createFolder method

- - -

Method that gets called when a 'CreateFolder' command is issued by the rich text -editor. This method would typically create a folder in the server-side if it is -allowed to do so and return the result through CreateFolderResult object. CreateFolderResult -contains static methods to return the available results.

- -

- -

The folder path queried by the richtexted editor is virtualFolderPath. -While the type could be one of 'Image', 'Link' or 'Flash'. The new folder name -to be created is newFolderName.

- - -

fileUpload method

- - -

Method that gets called when a 'FileUpload' command is issued by the rich text -editor. This method would typically handle the file upload and return a -FileUploadResult object. FileUploadResult contains only static methods that -could create the available results.

- -

- -

The folder path queried by the richtexted editor is virtualFolderPath. -While the type could be one of 'Image', 'Link' or 'Flash'. The upload file name -is filename while its content type is conetnType and -its content could be read off the newFile object.

- - -

Result

- - -

AbstractRichtexteditorResult

- - -

Abstract result for all Rich Text Editor results. It contains common methods -that might come in handy to its subclass.

- -

Configuration of result necessary in xwork.xml (is already there by default) are -as follows:

- -

- <!-- Results necessary when using 'browse server' and 'upload' feature of Richtexteditor -->
- <result-type name="richtexteditorGetFolders" 
-                 class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorGetFoldersResult" />
- <result-type name="richtexteditorGetFoldersAndFiles" 
-                 class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorGetFoldersAndFilesResult" />
- <result-type name="richtexteditorCreateFolder" 
-                 class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorCreateFolderResult" />
- <result-type name="richtexteditorFileUpload" 
-                 class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorFileUploadResult" />
-

- - -

RichtexteditorGetFoldersResult

- - -

WebWork's result, creating the appropriate result (in xml form) and write to the -response stream corresponding the the Rich Text Editor's 'GetFolders' command.

- -

- -

An example of the response would be as follows:

- -

-<?xml version="1.0" encoding="utf-8" ?>
-<Connector command="GetFolders" resourceType="File">
-  <CurrentFolder path="/Samples/Docs/" url="/UserFiles/File/Samples/Docs/" />
-  <Folders>
-    <Folder name="Documents" />
-    <Folder name="Files" />
-    <Folder name="Other Files" />
-    <Folder name="Related" />
- </Folders>
-</Connector>
-

- - -

RichtexteditorGetFoldersAndFilesResult

- - -

WebWork's result, creating the appropriate result (in xml form) and write to -the response stream corresponding to the Rich Text Editor's 'GetFoldersAndFiles' -command

- -

- -

An example of the response would be as follows:

- -

-<?xml version="1.0" encoding="utf-8" ?>
-<Connector command="GetFoldersAndFiles" resourceType="File">
-  <CurrentFolder path="/Samples/Docs/" url="/UserFiles/File/Samples/Docs/" />
-  <Folders>
-    <Folder name="Documents" />
-    <Folder name="Files" />
-    <Folder name="Other Files" />
-    <Folder name="Related" />
-  </Folders>
-  <Files>
-    <File name="XML Definition.doc" size="14" />
-    <File name="Samples.txt" size="5" />
-    <File name="Definition.txt" size="125" />
-    <File name="External Resources.drw" size="840" />
-    <File name="Todo.txt" size="2" />
-  </Files>
-</Connector>
-

- - -

RichtexteditorCreateFolderResult

- - -

WebWork's result, creating the apropriate result (in xml form) and write it out -to the response stream corresponding to a 'CreateFolder' command from the -Rich Text Editor.

- -

- -

An example of the response would be as follows:

- -

-<?xml version="1.0" encoding="utf-8" ?>
-<Connector command="CreateFolder" resourceType="File">
-  <CurrentFolder path="/Samples/Docs/" url="/UserFiles/File/Samples/Docs/" />
-  <Error number="0" />
-</Connector>
-

- - -

RichtexteditorUploadFileResult

- - -

WebWork's result, creating the appropriate result (in javascript form) and write to -the response stream corresponding to a 'FileUpload' command from the -Rich Text Editor.

- -

- -

An example of the response would be as follows:

- -

-<script type="text/javascript">
-     window.parent.frames['frmUpload'].OnUploadCompleted(0) ;
-</script>
-

- - -
- - diff --git a/docs/wikidocs/select.html b/docs/wikidocs/select.html deleted file mode 100644 index 522449ba4..000000000 --- a/docs/wikidocs/select.html +++ /dev/null @@ -1,773 +0,0 @@ - - - WebWork - - select - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Render an HTML input tag of type select.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

emptyOptionfalsefalseBooleanWhether or not to add an empty (--) option after the header option
headerKeyfalse Object/StringKey for first item in list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringValue expression for first item in list
multiplefalsefalseBooleanCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute. Passing a Collection may work too? Haven't tested this.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
Note: For any of the tags that use lists (select probably being the most ubiquitous), which uses the OGNL list
-notation (see the "months" example above), it should be noted that the map key created (in the months example,
-the '01', '02', etc.) is typed. '1' is a char, '01' is a String, "1" is a String. This is important since if
-the value returned by your "value" attribute is NOT the same type as the key in the "list" attribute, they
-WILL NOT MATCH, even though their String values may be equivalent. If they don't match, nothing in your list
-will be auto-selected.<p/>
-
-
-
<ww:select label="Pets"
-       name="petIds"
-       list="petDao.pets"
-       listKey="id"
-       listValue="name"
-       multiple="true"
-       size="3"
-       required="true"
-/>
-
-<ww:select label="Months"
-       name="months"
-       headerKey="-1" headerValue="Select Month"
-       list="#{'01':'Jan', '02':'Feb', [...]}"
-       value="selectedMonth"
-       required="true"
-/>
-
-// The month id (01, 02, ...) returned by the getSelectedMonth() call
-// against the stack will be auto-selected
-
- -
- - diff --git a/docs/wikidocs/set.html b/docs/wikidocs/set.html deleted file mode 100644 index 4e5ac6c98..000000000 --- a/docs/wikidocs/set.html +++ /dev/null @@ -1,120 +0,0 @@ - - - WebWork - - set - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

The set tag assigns a value to a variable in a specified scope. It is useful when you wish to assign a variable to a - complex expression and then simply reference that variable each time rather than the complex expression. This is - useful in both cases: when the complex expression takes time (performance improvement) or is hard to read (code - readability improvement).

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

nametrue StringThe name of the new variable that is assigned the value of value
scopefalseactionStringThe scope in which to assign the variable. Can be application, session, request, page, or action.
valuefalse Object/StringThe value that is assigned to the variable named name
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

- -
-
<ww:set name="personName" value="person.name"/>
-Hello, <ww:property value="#personName"/>. How are you?
-
- -
- - diff --git a/docs/wikidocs/simple head template.html b/docs/wikidocs/simple head template.html deleted file mode 100644 index 0ce3b70f4..000000000 --- a/docs/wikidocs/simple head template.html +++ /dev/null @@ -1,28 +0,0 @@ - - - WebWork - - simple head template - - - - - - - - - - -
-

The simple theme head template only does one thing: it prints out an HTML <link/> to the CSS required for the datepicker tag to render properly.

- -

The source of the simple head.ftl template is:

- -
-
<#if parameters.calendarcss?exists>
-<link rel="stylesheet" href="<@ww.url value='/webwork/jscalendar/${parameters.calendarcss?html}' />" type="text/css"/>
-</#if>
-
- -
- - diff --git a/docs/wikidocs/simple theme.html b/docs/wikidocs/simple theme.html deleted file mode 100644 index 5dd1209b8..000000000 --- a/docs/wikidocs/simple theme.html +++ /dev/null @@ -1,29 +0,0 @@ - - - WebWork - - simple theme - - - - - - - - - - -
-

The simple theme provides the "bare bones" HTML element support and is considered the low end of the structure and can be to build additional functionality or behavior (see Extending Themes for more information). For example, the textfield tag renders the HTML <input/> tag without any additional labels, validation error reporting, or anything else. If you require additional behavior, see the xhtml theme.

- -
The xhtml theme and css\_xhtml theme both directly extend this theme. Look to them for examples of how to utilize the basics provided by this theme.
- -

While most of the templates in this theme are self explanatory, there are some templates that should be called out and explained in detail:

- - - - -
- - diff --git a/docs/wikidocs/sort.html b/docs/wikidocs/sort.html deleted file mode 100644 index 568f10640..000000000 --- a/docs/wikidocs/sort.html +++ /dev/null @@ -1,119 +0,0 @@ - - - WebWork - - sort - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

NOTE: JSP-TAG

- -

A Tag that sorts a List using a Comparator both passed in as the tag attribute. - If 'id' attribute is specified, the sorted list will be placed into the PageContext - attribute using the key specified by 'id'. The sorted list will ALWAYS be - pushed into the stack and poped at the end of this tag.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

comparatortrue java.util.ComparatorThe comparator to use
sourcefalse Object/StringThe iterable source to sort
idfalse StringThe id of the tag element.

- -

Examples

-
-
USAGE 1:
- <ww:sort comparator="myComparator" source="myList">
-      <ww:iterator>
- 		<!-- do something with each sorted elements -->
- 		<ww:property value="..." />
-      </ww:iterator>
- </ww:sort>
-
- USAGE 2:
- <ww:sort id="mySortedList" comparator="myComparator" source="myList" />
-
- <%
-    Iterator sortedIterator = (Iterator) pageContext.getAttribute("mySortedList");
-    for (Iterator i = sortedIterator; i.hasNext(); ) {
-    	// do something with each of the sorted elements
-    }
- %>
-
- -
- - diff --git a/docs/wikidocs/stringlength validator.html b/docs/wikidocs/stringlength validator.html deleted file mode 100644 index 1a586aba7..000000000 --- a/docs/wikidocs/stringlength validator.html +++ /dev/null @@ -1,57 +0,0 @@ - - - WebWork - - stringlength validator - - - - - - - - - - -
-

Description

-

StringLengthFieldValidator checks that a String field is of a certain length. If the "minLength" -parameter is specified, it will make sure that the String has at least that many characters. If -the "maxLength" parameter is specified, it will make sure that the String has at most that many -characters. The "trim" parameter determines whether it will {@link String#trim() trim} the -String before performing the length check. If unspecified, the String will be trimmed.

- - -

Parameters

-

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -
  • maxLength - The max length of the field value. Default ignore.
  • -
  • minLength - The min length of the field value. Default ignore.
  • -
  • trim - Trim the field value before evaluating its min/max length. Default true
  • -

- - -

Examples

-
-
<validators>
-         <!-- Plain Validator Syntax -->
-			<validator type="stringlength">
-				<param name="fieldName">myPurchaseCode</param>
-				<param name="minLength">10</param>
-             <param name="maxLength">10</param>
-             <param name="trim">true</param>
-             <message>Your purchase code needs to be 10 characters long</message>		
-         </validator>
-
-			<!-- Field Validator Syntax -->
-			<field name="myPurchaseCode">
-				<param name="minLength">10</param>
-             <param name="maxLength>10</param>
-             <param name="trim">true</param>
-             <message>Your purchase code needs to be 10 characters long</message>
-			</field-name>
-     </validators>
-
- -
- - diff --git a/docs/wikidocs/styles/site.css b/docs/wikidocs/styles/site.css deleted file mode 100644 index 08b5c0fd6..000000000 --- a/docs/wikidocs/styles/site.css +++ /dev/null @@ -1,1390 +0,0 @@ -body, p, td, table, tr, .bodytext, .stepfield { - font-family: Verdana, arial, sans-serif; - font-size: 11px; - line-height: 16px; - color: #000000; - font-weight: normal; -} -#PageContent { - text-align: left; - background-color: #fff; - padding: 0px; - margin: 0px; - padding-bottom:20px; -} -/* -** when this stylesheet is used for the FCK Wysiwyg editor's edit area, we can't -** use an id=PageContent or class=wiki-content, so we must -** set the body style to that used for PageContent, and p to that used for wiki-content. -*/ - -body { - margin: 0px; - padding: 0px; - text-align: center; - background-color: #f0f0f0; -} - -.monospaceInput { - font:12px monospace -} - -.wiki-content p, .commentblock p { - margin: 16px 0px 16px 0px; - padding: 0px; -} - -.wiki-content-preview { - padding: 5px; - border-left: 1px solid #3c78b5; - border-right: 1px solid #3c78b5; -} - -ul, ol { - margin-top: 2px; - margin-bottom: 2px; - padding-top: 0px; - padding-bottom: 0px; -} - -pre { - padding: 0px; - margin-top: 5px; - margin-left: 15px; - margin-bottom: 5px; - margin-right: 5px; - text-align: left; -} - -.helpheading { - font-weight: bold; - background-color: #D0D9BD; - border-bottom: 1px solid #3c78b5; - padding: 4px 4px 4px 4px; - margin: 0px; - margin-top: 10px; -} -.helpcontent { - padding: 4px 4px 20px 4px; - background-color: #f5f7f1; -} - -.code { - border: 1px dashed #3c78b5; - font-size: 11px; - font-family: Courier; - margin: 10px; - line-height: 13px; -} - -.focusedComment { - background: #ffffce; -} - -.commentBox, .focusedComment { - padding: 10px; - margin: 5px 0 5px 0; - border: 1px #bbb solid; -} - -.codeHeader { - background-color: #f0f0f0; - border-bottom: 1px dashed #3c78b5; - padding: 3px; - text-align: center; -} - -.codeContent { - text-align: left; - background-color: #f0f0f0; - padding: 3px; -} - -.preformatted { - border: 1px dashed #3c78b5; - font-size: 11px; - font-family: Courier; - margin: 10px; - line-height: 13px; -} - -.preformattedHeader { - background-color: #f0f0f0; - border-bottom: 1px dashed #3c78b5; - padding: 3px; - text-align: center; -} - -.preformattedContent { - background-color: #f0f0f0; - padding: 3px; -} - -.panel { - border: 1px dashed #3c78b5; - margin: 10px; - margin-top: 0px; -} - -.panelHeader { - background-color: #f0f0f0; - border-bottom: 1px dashed #3c78b5; - padding: 3px; - text-align: center; -} - -.panelContent { - background-color: #f0f0f0; - padding: 5px; -} - -.anonymousAlert { - background-color: #f0f0f0; - border: 1px dashed red; - font-size: 11px; - padding: 10px 5px 10px 5px; - margin: 4px; - line-height: 13px; -} - -.lockAlert { - background-color: #f0f0f0; - width: 50%; - border: 1px dashed red; - font-size: 11px; - padding: 10px 5px 10px 5px; - margin: 4px; - line-height: 13px; -} - - -.code-keyword { - color: #000091; - background-color: inherit; -} - -.code-object { - color: #910091; - background-color: inherit; -} - -.code-quote { - color: #009100; - background-color: inherit; -} - -.code-comment { - color: #808080; - background-color: inherit; -} - - -.code-xml .code-keyword { - color: inherit; - font-weight: bold; -} - -.code-tag { - color: #000091; - background-color: inherit; -} - -.breadcrumbs { - background-color: #f0f0f0; - border-color: #3c78b5; - border-width: 1px 0px 1px 0px; - border-style: solid; - font-size: 11px; - padding: 3px 0px 3px 0px; -} - -.navmenu { - border: 1px solid #ccc; -} - -.menuheading { - font-weight: bold; - background-color: #f0f0f0; - border-bottom: 1px solid #3c78b5; - padding: 4px 4px 2px 4px; -} - -.menuitems { - padding: 4px 4px 20px 4px; -} - -.rightpanel { - border-left: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -#helpheading { - text-align: left; - font-weight: bold; - background-color: #D0D9BD; - border-bottom: 1px solid #3c78b5; - padding: 4px 4px 4px 4px; - margin: 0px; -} -#helpcontent { - padding: 4px 4px 4px 4px; - background-color: #f5f7f1; -} -.helptab-unselected { - font-weight: bold; - padding: 5px; - background-color: #f5f7f1; -} -.helptab-selected { - font-weight: bold; - background-color: #D0D9BD; - padding: 5px; -} -.helptabs { - margin: 0px; - background-color: #f5f7f1; - padding: 5px; -} -.infopanel-heading { - font-weight: bold; - padding: 4px 0px 2px 0px; -} - -.pagebody { -} - -.pageheader { - padding: 5px 5px 5px 0px; - border-bottom: 1px solid #3c78b5; -} - -.pagetitle { - font-size: 22px; - font-weight: bold; - font-family: Arial, sans-serif; - color: #003366; -} - -.steptitle { - font-size: 18px; - font-weight: bold; - font-family: Arial, sans-serif; - color: #003366; - margin-bottom: 7px; -} - -.substeptitle { - font-size: 12px; - font-weight: bold; - font-family: Arial, sans-serif; - color: #003366; - margin: 2px 4px 4px 4px; - padding: 2px 4px 1px 4px; -} - -.stepdesc { - font-family: Verdana, arial, sans-serif; - font-size: 11px; - line-height: 16px; - font-weight: normal; - color: #666666; - margin-top: 7px; - margin-bottom: 7px; -} - -.steplabel { - font-weight: bold; - margin-right: 4px; - color: black; - float: left; - width: 15%; - text-align: right; -} - -.stepfield { - background: #f0f0f0; - padding: 5px; -} - -.submitButtons{ - margin-top:5px; - text-align:right; -} - -.formtitle { - font-size: 12px; - font-weight: bold; - font-family: Arial, sans-serif; - color: #003366; -} - -.sectionbottom { - border-bottom: 1px solid #3c78b5; -} - -.topRow { - border-top: 2px solid #3c78b5; -} - -.tabletitle { - font-size: 14px; - font-weight: bold; - font-family: Arial, sans-serif; - padding: 3px 0px 2px 0px; - margin: 8px 4px 2px 0px; - color: #003366; - border-bottom: 2px solid #3c78b5; -} -.pagesubheading { - color: #666666; - font-size: 10px; - padding: 0px 0px 5px 0px; -} - -HR { - color: 3c78b5; - height: 1; -} - -A:link, A:visited, A:active, A:hover { - color: #003366; -} - -h1 A:link, h1 A:visited, h1 A:active { - text-decoration: none; -} - -h1 A:hover { - border-bottom: 1px dotted #003366; -} - -.wiki-content > :first-child, .commentblock > :first-child { - margin-top: 3px; -} - -.logocell { - padding: 10px; -} - -input { - font-family: verdana, geneva, arial, sans-serif; - font-size: 11px; - color: #000000; -} - -textarea, textarea.editor { - font-family: verdana, geneva, arial, sans-serif; - font-size: 11px; - color: #333333; -} - -/* use logoSpaceLink instead. -.spacenametitle { - font: 21px/31px Impact, Arial, Helvetica; - font-weight: 100; - color: #999999; - margin: 0px; -} -.spacenametitle img { - margin: 0 0 -4px 0; -} -.spacenametitle a { - text-decoration: none; - color: #999999; -} -.spacenametitle a:visited { - text-decoration: none; - color: #999999; -}*/ - -.spacenametitle-printable { - font: 20px/25px Impact, Arial, Helvetica; - font-weight: 100; - color: #999999; - margin: 0px; -} -.spacenametitle-printable a { - text-decoration: none; - color: #999999; -} -.spacenametitle-printable a:visited { - text-decoration: none; - color: #999999; -} - -.blogHeading { - font-size: 20px; - line-height: normal; - font-weight: bold; - padding: 10px 0px 0px 0px; - margin: 10px 0px 0px 0px; -} - -h1 { - font-size: 24px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - color: #003366; - border-bottom: 1px solid #3c78b5; - padding: 2px; - margin: 36px 0px 4px 0px; -} - -h2 { - font-size: 18px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - border-bottom: 1px solid #3c78b5; - padding: 2px; - margin: 27px 0px 4px 0px; -} - -h3 { - font-size: 14px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 21px 0px 4px 0px; -} - -h4 { - font-size: 12px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 18px 0px 4px 0px; -} - -h4.search { - font-size: 12px; - line-height: normal; - font-weight: normal; - background-color: #f0f0f0; - padding: 4px; - margin: 18px 0px 4px 0px; -} - -h5 { - font-size: 10px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 14px 0px 4px 0px; -} - -h6 { - font-size: 8px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 14px 0px 4px 0px; -} - -.smallfont { - font-size: 10px; -} -.descfont { - font-size: 10px; - color: #666666; -} -.smallerfont { - font-size: 9px; -} -.smalltext { - color: #666666; - font-size: 10px; -} -.smalltext a { - color: #666666; -} -.smalltext-blue { - color: #3c78b5; - font-size: 10px; -} -.surtitle { - margin-left: 1px; - margin-bottom: 5px; - font-size: 14px; - color: #666666; -} - -/* css hack found here: http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */ -.navItemOver { font-size: 10px; font-weight: bold; color: #dedede; background-color: #669900; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;} -.navItemOver a { color: #dedede; background-color:#669900; text-decoration: none; } -.navItemOver a:visited { color: #dedede; background-color:#669900; text-decoration: none; } -.navItemOver a:hover { color: #dedede; background-color:#669900; text-decoration: none; } -.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #99CCFF; } -.navItem a { color: #666666; text-decoration: none; } -.navItem a:hover { color: #666666; text-decoration: none; } -.navItem a:visited { color: #666666; text-decoration: none; } - -div.padded { padding: 4px; } -div.thickPadded { padding: 10px; } -h3.macrolibrariestitle { - margin: 0px 0px 0px 0px; -} - -div.centered { text-align: center; margin: 10px; } -div.centered table {margin: 0px auto; text-align: left; } - -.tableview table { - margin: 0; -} - -.tableview th { - text-align: left; - color: #003366; - font-size: 12px; - padding: 5px 0px 0px 5px; - border-bottom: 2px solid #3c78b5; -} -.tableview td { - text-align: left; - border-color: #ccc; - border-width: 0px 0px 1px 0px; - border-style: solid; - margin: 0; - padding: 4px 10px 4px 5px; -} - -.grid { - margin: 2px 0px 5px 0px; - border-collapse: collapse; -} -.grid th { - border: 1px solid #ccc; - padding: 2px 4px 2px 4px; - background: #f0f0f0; - text-align: center; -} -.grid td { - border: 1px solid #ccc; - padding: 3px 4px 3px 4px; -} -.gridHover { - background-color: #f9f9f9; -} - -td.infocell { - background-color: #f0f0f0; -} -.label { - font-weight: bold; - color: #003366; -} -.error { - background-color: #fcc; -} - -.errorBox { - background-color: #fcc; - border: 1px solid #c00; - padding: 5px; - margin: 5px; -} - -.errorMessage { - color: #c00; -} - -.success { - background-color: #dfd; -} - -.successBox { - background-color: #dfd; - border: 1px solid #090; - padding: 5px; - margin-top:5px; - margin-bottom:5px; -} - -blockquote { - padding-left: 10px; - padding-right: 10px; - margin-left: 5px; - margin-right: 0px; - border-left: 1px solid #3c78b5; -} - -table.confluenceTable -{ - margin: 5px; - border-collapse: collapse; -} - -/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */ -table.confluenceTable td.confluenceTd -{ - border-width: 1px; - border-style: solid; - border-color: #ccc; - padding: 3px 4px 3px 4px; -} - -/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */ -table.confluenceTable th.confluenceTh -{ - border-width: 1px; - border-style: solid; - border-color: #ccc; - padding: 3px 4px 3px 4px; - background-color: #f0f0f0; - text-align: center; -} - -td.confluenceTd -{ - border-width: 1px; - border-style: solid; - border-color: #ccc; - padding: 3px 4px 3px 4px; -} - -th.confluenceTh -{ - border-width: 1px; - border-style: solid; - border-color: #ccc; - padding: 3px 4px 3px 4px; - background-color: #f0f0f0; - text-align: center; -} - -DIV.small { - font-size: 9px; -} - -H1.pagename { - margin-top: 0px; -} - -IMG.inline {} - -.loginform { - margin: 5px; - border: 1px solid #ccc; -} - -/* The text how the "This is a preview" comment should be shown. */ -.previewnote { text-align: center; - font-size: 11px; - color: red; } - -/* How the preview content should be shown */ -.previewcontent { background: #E0E0E0; } - -/* How the system messages should be shown (DisplayMessage.jsp) */ -.messagecontent { background: #E0E0E0; } - -/* How the "This page has been modified..." -comment should be shown. */ -.conflictnote { } - -.createlink { - color: maroon; -} -a.createlink { - color: maroon; -} -.templateparameter { - font-size: 9px; - color: darkblue; -} - -.diffadded { - background: #ddffdd; - padding: 1px 1px 1px 4px; - border-left: 4px solid darkgreen; -} -.diffdeleted { - color: #999; - background: #ffdddd; - padding: 1px 1px 1px 4px; - border-left: 4px solid darkred; -} -.diffnochange { - padding: 1px 1px 1px 4px; - border-left: 4px solid lightgrey; -} -.differror { - background: brown; -} -.diff { - font-family: lucida console, courier new, fixed-width; - font-size: 12px; - line-height: 14px; -} -.diffaddedchars { - background-color:#99ff99; - font-weight:bolder; -} -.diffremovedchars { - background-color:#ff9999; - text-decoration: line-through; - font-weight:bolder; -} - -.greybackground { - background: #f0f0f0 -} - -.greybox { - border: 1px solid #ddd; - padding: 3px; - margin: 1px 1px 10px 1px; -} - -.borderedGreyBox { - border: 1px solid #cccccc; - background-color: #f0f0f0; - padding: 10px; -} - -.greyboxfilled { - border: 1px solid #ddd; - padding: 5px; - margin: 10px 1px 10px 1px; - background: #f0f0f0; -} - -.navBackgroundBox { - padding: 5px 5px 5px 5px; - font-size: 22px; - font-weight: bold; - font-family: Arial, sans-serif; - color: white; - background: #99CCFF; - text-decoration: none; -} - -.previewBoxTop { - background-color: #f0f0f0; - border-width: 1px 1px 0px 1px; - border-style: solid; - border-color: #3c78b5; - padding: 5px; - margin: 5px 0px 0px 0px; - text-align: center; -} -.previewContent { - background-color: #fff; - border-color: #3c78b5; - border-width: 0px 1px 0px 1px; - border-style: solid; - padding: 10px; - margin: 0px; -} -.previewBoxBottom { - background-color: #f0f0f0; - border-width: 0px 1px 1px 1px; - border-style: solid; - border-color: #3c78b5; - padding: 5px; - margin: 0px 0px 5px 0px; - text-align: center; -} - -.functionbox { - background-color: #f0f0f0; - border: 1px solid #3c78b5; - padding: 3px; - margin: 1px 1px 10px 1px; -} - -.functionbox-greyborder { - background-color: #f0f0f0; - border: 1px solid #ddd; - padding: 3px; - margin: 1px 1px 10px 1px; -} - -.search-highlight { - background-color: #ffffcc; -} - -/* normal (white) background */ -.rowNormal { - background-color: #ffffff; - } - -/* alternate (pale yellow) background */ -.rowAlternate { - background-color: #f7f7f7; -} - -/* used in the list attachments table */ -.rowAlternateNoBottomColor { - background-color: #f7f7f7; -} - -.rowAlternateNoBottomNoColor { -} - -.rowAlternateNoBottomColor td { - border-bottom: 0px; -} - -.rowAlternateNoBottomNoColor td { - border-bottom: 0px; -} - -/* row highlight (grey) background */ -.rowHighlight { - background-color: #f0f0f0; - -} - -TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; } -TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; } -TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; } - -TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; } -TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; } - -.toolbar { - margin: 0px; - border-collapse: collapse; -} - -.toolbar td { - border: 1px solid #ccc; - padding: 2px 2px 2px 2px; - color: #ccc; -} - -td.noformatting { - border-width: 0px; - border-style: none; - text-align: center; - padding: 0px; -} - -.commentblock { - margin: 12px 0 12px 0; -} - -/* - * Divs displaying the license information, if necessary. - */ -.license-eval, .license-none, .license-nonprofit { - border-top: 1px solid #bbbbbb; - text-align: center; - font-size: 10px; - font-family: Verdana, Arial, Helvetica, sans-serif; -} - -.license-eval, .license-none { - background-color: #ffcccc; -} - -.license-eval b, .license-none b { - color: #990000 -} - -.license-nonprofit { - background-color: #ffffff; -} - -/* - * The shadow at the bottom of the page between the main content and the - * "powered by" section. - */ -.bottomshadow { - height: 12px; - background-image: url("$req.contextPath/images/border/border_bottom.gif"); - background-repeat: repeat-x; -} - -/* - * Styling of the operations box - */ -.navmenu .operations li, .navmenu .operations ul { - list-style: none; - margin-left: 0; - padding-left: 0; -} - -.navmenu .operations ul { - margin-bottom: 9px; -} - -.navmenu .label { - font-weight: inherit; -} - -/* - * Styling of ops as a toolbar - */ -.toolbar div { - display: none; -} - -.toolbar .label { - display: none; -} - -.toolbar .operations { - display: block; -} - -.toolbar .operations ul { - display: inline; - list-style: none; - margin-left: 10px; - padding-left: 0; -} - -.toolbar .operations li { - list-style: none; - display: inline; -} - -/* list page navigational tabs */ -#foldertab { -padding: 3px 0px 3px 8px; -margin-left: 0; -border-bottom: 1px solid #99CCFF; -font: bold 11px Verdana, sans-serif; -} - -#foldertab li { -list-style: none; -margin: 0; -display: inline; -} - -#foldertab li a { -padding: 3px 0.5em; -margin-left: 3px; -border: 1px solid #99CCFF; -border-bottom: none; -background: #99CCFF; -text-decoration: none; -} - -#foldertab li a:link { color: #666666; } -#foldertab li a:visited { color: #666666; } - -#foldertab li a:hover { -color: #dedede; -background: #669900; -border-color: #669900; -} - -#foldertab li a.current { -background: white; -border-bottom: 1px solid white; -color: black; -} - -#foldertab li a.current:link { color: black; } -#foldertab li a.current:visited { color: black; } -#foldertab li a.current:hover { -background: white; -border-bottom: 1px solid white; -color: black; -} - -/* alphabet list */ -ul#squaretab { -margin-left: 0; -padding-left: 0; -white-space: nowrap; -font: bold 8px Verdana, sans-serif; -} - -#squaretab li { -display: inline; -list-style-type: none; -} - -#squaretab a { -padding: 2px 6px; -border: 1px solid #99CCFF; -} - -#squaretab a:link, #squaretab a:visited { -color: #fff; -background-color: #99CCFF; -text-decoration: none; -} - -#squaretab a:hover { -color: #dedede; -background-color: #669900; -border-color: #669900; -text-decoration: none; -} - -#squaretab li a#current { -background: white; -color: black; -} - -.blogcalendar * { - font-family:verdana, arial, sans-serif; - font-size:x-small; - font-weight:normal; - line-height:140%; - padding:2px; -} - - -table.blogcalendar { - border: 1px solid #3c78b5; -} - -.blogcalendar th.calendarhead, a.calendarhead { - font-size:x-small; - font-weight:bold; - padding:2px; - text-transform:uppercase; - background-color: #99CCFF; - color: #ffffff; - letter-spacing: .3em; - text-transform: uppercase; -} - -.calendarhead:visited {color: white;} -.calendarhead:active {color: white;} -.calendarhead:hover {color: white;} - -.blogcalendar th { - font-size:x-small; - font-weight:bold; - padding:2px; - background-color:#f0f0f0; -} - -.blogcalendar td { - font-size:x-small; - font-weight:normal; -} - -.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; } -.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #99CCFF; padding: 2px 4px 1px 4px; } -.searchItem { padding: 1px 4px 1px 4px; } -.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; } - -/* permissions page styles */ -.permissionHeading { - border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left; -} -.permissionTab { - border-width: 0 0 0 1px; border-style: solid; background: #99CCFF; color: #666666; font-size: 10px; -} -.permissionSuperTab { - border-width: 0 0 0 1px; border-style: solid; background: #669900; color: #dedede; -} -.permissionCell { - border-left: #bbb; border-width: 0 0 0 1px; border-style: solid; -} - -/* warning panel */ -.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; } -/* alert panel */ -.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; } - -/* side menu highlighting (e.g. space content screen) */ -.optionPadded { padding: 2px; } -.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; } -.optionSelected a { font-weight: bold; text-decoration: none; color: black; } - -/* information macros */ -.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px} -.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px} -.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px} -.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px} -.informationMacroPadding { padding: 5px 0 0 5px; } - -table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td { - border: none; -} - -table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;} - -.pagecontent -{ - padding: 10px; - text-align: left; -} - -/* styles for links in the top bar */ -.topBarDiv a:link {color: #ffffff;} -.topBarDiv a:visited {color: #ffffff;} -.topBarDiv a:active {color: #ffffff;} -.topBarDiv a:hover {color: #ffffff;} -.topBarDiv {color: #ffffff;} - -.topBar { - background-color: #669900; -} - - -/* styles for extended operations */ -.greyLinks a:link {color: #666666; text-decoration:underline;} -.greyLinks a:visited {color: #666666; text-decoration:underline;} -.greyLinks a:active {color: #666666; text-decoration:underline;} -.greyLinks a:hover {color: #666666; text-decoration:underline;} -.greyLinks {color: #666666; display:block; padding: 10px} - -.logoSpaceLink {color: #999999; text-decoration: none} -.logoSpaceLink a:link {color: #999999; text-decoration: none} -.logoSpaceLink a:visited {color: #999999; text-decoration: none} -.logoSpaceLink a:active {color: #999999; text-decoration: none} -.logoSpaceLink a:hover {color: #003366; text-decoration: none} - -/* basic panel (basicpanel.vmd) style */ -.basicPanelContainer {border: 1px solid #99CCFF; margin-top: 2px; margin-bottom: 8px; width: 100%} -.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;} -.basicPanelBody {padding: 5px; margin: 0px} - -.separatorLinks a:link {color: white} -.separatorLinks a:visited {color: white} -.separatorLinks a:active {color: white} - -.greynavbar {background-color: #f0f0f0; border-top: 1px solid #99CCFF; margin-top: 2px} - -div.headerField { - float: left; - width: auto; - height: 100%; -} - -.headerFloat { - margin-left: auto; - width: 50%; -} - -.headerFloatLeft { - float: left; - margin-right: 20px; - margin-bottom: 10px; -} - -#headerRow { - padding: 10px; -} - -div.license-personal { - background-color: #669900; - color: #666666; -} - -div.license-personal a { - color: #666666; -} - -.greyFormBox { - border: 1px solid #cccccc; - padding: 5px; -} - -/* IE automatically adds a margin before and after form tags. Use this style to remove that */ -.marginlessForm { - margin: 0px; -} - -.openPageHighlight { - background-color: #ffffcc; - padding: 2px; - border: 1px solid #ddd; -} - -.editPageInsertLinks, .editPageInsertLinks a -{ - color: #666666; - font-weight: bold; - font-size: 10px; -} - -/* Style for label heatmap. */ -.top10 a { - font-weight: bold; - font-size: 2em; - color: #003366; -} -.top25 a { - font-weight: bold; - font-size: 1.6em; - color: #003366; -} -.top50 a { - font-size: 1.4em; - color: #003366; -} -.top100 a { - font-size: 1.2em; - color: #003366; -} - -.heatmap { - list-style:none; - width: 95%; - margin: 0px auto; -} - -.heatmap a { - text-decoration:none; -} - -.heatmap a:hover { - text-decoration:underline; -} - -.heatmap li { - display: inline; -} - -.minitab { -padding: 3px 0px 3px 8px; -margin-left: 0; -margin-top: 1px; -margin-bottom: 0px; -border-bottom: 1px solid #99CCFF; -font: bold 9px Verdana, sans-serif; -text-decoration: none; -float:none; -} -.selectedminitab { -padding: 3px 0.5em; -margin-left: 3px; -margin-top: 1px; -border: 1px solid #99CCFF; -background: white; -border-bottom: 1px solid white; -color: #000000; -text-decoration: none; -} -.unselectedminitab { -padding: 3px 0.5em; -margin-left: 3px; -margin-top: 1px; -border: 1px solid #99CCFF; -border-bottom: none; -background: #99CCFF; -color: #ffffff; -text-decoration: none; -} - -a.unselectedminitab:hover { -color: #dedede; -background: #669900; -border-color: #669900; -} - -a.unselectedminitab:link { color: white; } -a.unselectedminitab:visited { color: white; } - -a.selectedminitab:link { color: black; } -a.selectedminitab:visited { color: black; } - -.linkerror { background-color: #fcc;} - -a.labelOperationLink:link {text-decoration: underline} -a.labelOperationLink:active {text-decoration: underline} -a.labelOperationLink:visited {text-decoration: underline} -a.labelOperationLink:hover {text-decoration: underline} - -a.newLabel:link {background-color: #ddffdd} -a.newLabel:active {background-color: #ddffdd} -a.newLabel:visited {background-color: #ddffdd} -a.newLabel:hover {background-color: #ddffdd} - -ul.square {list-style-type: square} - -.inline-control-link { - background: #ffc; - font-size: 9px; - color: #666; - padding: 2px; - text-transform: uppercase; - text-decoration: none; -} - - -.inline-control-link a:link {text-decoration: none} -.inline-control-link a:active {text-decoration: none} -.inline-control-link a:visited {text-decoration: none} -.inline-control-link a:hover {text-decoration: none} - -.inline-control-link { - background: #ffc; - font-size: 9px; - color: #666; - padding: 2px; - text-transform: uppercase; - text-decoration: none; - cursor: pointer; -} - -div.auto_complete { - width: 350px; - background: #fff; -} -div.auto_complete ul { - border: 1px solid #888; - margin: 0; - padding: 0; - width: 100%; - list-style-type: none; -} -div.auto_complete ul li { - margin: 0; - padding: 3px; -} -div.auto_complete ul li.selected { - background-color: #ffb; -} -div.auto_complete ul strong.highlight { - color: #800; - margin: 0; - padding: 0; -} - -/******* Edit Page Styles *******/ -.toogleFormDiv{ - border:1px solid #A7A6AA; - background-color:white; - padding:5px; - margin-top: 5px; -} - -.toogleInfoDiv{ - border:1px solid #A7A6AA; - background-color:white; - display:none; - padding:5px; - margin-top: 10px; -} - -.inputSection{ - margin-bottom:20px; -} - -#editBox{ - border:1px solid lightgray; - background-color:#F0F0F0; -} - -/******* Left Navigation Theme Styles ********/ -.leftnav li a { - text-decoration:none; - color:white; - margin:0px; - display:block; - padding:2px; - padding-left:5px; - background-color: #99CCFF; - border-top:1px solid #99CCFF; -} - -.leftnav li a:active {color:white;} -.leftnav li a:visited {color:white;} -.leftnav li a:hover {background-color: #669900; color:white;} diff --git a/docs/wikidocs/submit.html b/docs/wikidocs/submit.html deleted file mode 100644 index f556b52d8..000000000 --- a/docs/wikidocs/submit.html +++ /dev/null @@ -1,897 +0,0 @@ - - - WebWork - - submit - - - - - - - - - - -
-
-

Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.

- -

Description

- -

Render a submit button. The submit tag is used together with the form tag to provide asynchronous form submissions. -The submit can have three different types of rendering: -

    -
  • input: renders as html <input type="submit"...>
  • -
  • image: renders as html <input type="image"...>
  • -
  • button: renders as html <button type="submit"...>
  • -
-Please note that the button type has advantages by adding the possibility to seperate the submitted value from the -text shown on the button face, but has issues with Microsoft Internet Explorer at least up to 6.0

-

THE FOLLOWING IS ONLY VALID WHEN AJAX IS CONFIGURED -

    -
  • resultDivId
  • -
  • notifyTopics
  • -
  • onLoadJS
  • -
  • preInvokeJS
  • -
-The remote form has three basic modes of use, using the resultDivId, -the notifyTopics, or the onLoadJS. You can mix and match any combination of -them to get your desired result. All of these examples are contained in the -Ajax example webapp. Lets go through some scenarios to see how you might use it:


-This tag works with all themes, but has special importance when combined with the form tag in the ajax theme. Please read up on the ajax theme for more information.
- -

Parameters

- -

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

resultDivIdfalse StringThe id of the HTML element to place the result (this can be the form's id or any id on the page.
onLoadJSfalse StringJavascript code that will be executed after the form has been submitted. The format is onLoadJS='yourMethodName(data,type)'. NOTE: the words data and type must be left like that if you want the event type and the returned data.
notifyTopicsfalse StringTopic names to post an event to after the form has been submitted.
listenTopicsfalse StringSet listenTopics attribute.
preInvokeJSfalse StringJavascript code that will be executed before invokation. The format is preInvokeJS='yourMethodName(data,type)'.
labelfalse Object/StringSupply a submit button text apart from submit value. Will have no effect for input type submit, since button text will always be the value parameter. For the type image, alt parameter will be set to this value.
srcfalse Object/StringSupply an image src for image type submit button. Will have no effect for types input and button.
actionfalse StringSet action attribute.
methodfalse StringSet method attribute.
alignfalse StringHTML align attribute.
typefalseinputStringThe type of submit to use. Valid values are input, button and image.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

- - -

Example 1

- -
-
<ww:submit value="%{'Submit'}" />
-
- -

Example 2

- -
-
Render an image submit:
-<ww:submit type="image" value="%{'Submit'}" label="Submit the form" src="submit.gif"/>
-
- -

Example 3

- -
-
Render an button submit:
-<ww:submit type="button" value="%{'Submit'}" label="Submit the form"/>
-
- -

Example 4

- -

Show the results in another div. If you want your results to be shown in -a div, use the resultDivId where the id is the id of the div you want them -shown in. This is an inner HTML approah. Your results get jammed into -the div for you. Here is a sample of this approach:

-
-
Remote form replacing another div:
-<div id='two' style="border: 1px solid yellow;">Initial content</div>
-<ww:form
-      id='theForm2'
-      cssStyle="border: 1px solid green;"
-      action='/AjaxRemoteForm.action'
-      method='post'
-      theme="ajax">
-
-  <input type='text' name='data' value='WebWork User' />
-  <ww:submit value="GO2" theme="ajax" resultDivId="two" />
-
-</ww:form >
-
- -

Example 5

- -

Notify other controls(divs) of a change. Using an pub-sub model you can -notify others that your control changed and they can take the appropriate action. -Most likely they will execute some action to refresh. The notifyTopics does this -for you. You can have many topic names in a comma delimited list. -eg: notifyTopics="newPerson, dataChanged" . -Here is an example of this approach:

-
-
<ww:form id="frm1" action="newPersonWithXMLResult" theme="ajax"  >
-    <ww:textfield label="Name" name="person.name" value="person.name" size="20" required="true" />
-    <ww:submit id="submitBtn" value="Save" theme="ajax"  cssClass="primary"  notifyTopics="personUpdated, systemWorking" />
-</ww:form >
-
-<ww:div href="/listPeople.action" theme="ajax" errorText="error opps"
-        loadingText="loading..." id="cart-body" >
-    <ww:action namespace="" name="listPeople" executeResult="true" />
-</ww:div>
-
- -

Example 6

- -

Massage the results with JavaScript. Say that your result returns some h -appy XML and you want to parse it and do lots of cool things with it. -The way to do this is with a onLoadJS handler. Here you provide the name of -a JavaScript function to be called back with the result and the event type. -The only key is that you must use the variable names 'data' and 'type' when -defining the callback. For example: onLoadJS="myFancyDancyFunction(data, type)". -While I talked about XML in this example, your not limited to XML, the data in -the callback will be exactly whats returned as your result. -Here is an example of this approach:

-
-
<script language="JavaScript" type="text/javascript">
-    function doGreatThings(data, type) {
-        //Do whatever with your returned fragment... 
-        //Perhapps.... if xml...
-              var xml = dojo.xml.domUtil.createDocumentFromText(data);
-              var people = xml.getElementsByTagName("person");
-              for(var i = 0;i < people.length; i ++){
-                  var person = people[i];
-                  var name = person.getAttribute("name")
-                  var id = person.getAttribute("id")
-                  alert('Thanks dude. Person: ' + name + ' saved great!!!');
-              }
-
-    }
-</script>
-
-<ww:form id="frm1" action="newPersonWithXMLResult" theme="ajax"  >
-    <ww:textfield label="Name" name="person.name" value="person.name" size="20" required="true" />
-    <ww:submit id="submitBtn" value="Save" theme="ajax"  cssClass="primary"  onLoadJS="doGreatThings(data, type)" /> 
-</ww:form>
-
- -
- - diff --git a/docs/wikidocs/subset.html b/docs/wikidocs/subset.html deleted file mode 100644 index 1a2e62500..000000000 --- a/docs/wikidocs/subset.html +++ /dev/null @@ -1,204 +0,0 @@ - - - WebWork - - subset - - - - - - - - - - -
-

Description

-

NOTE: JSP-TAG

- -

A tag that takes an iterator and outputs a subset of it. It delegates to -com.opensymphony.webwork.util.SubsetIteratorFilter internally to -perform the subset functionality.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

countfalse IntegerIndicate the number of entries to be in the resulting subset iterator
sourcefalse Object/StringIndicate the source of which the resulting subset iterator is to be derived base on
startfalse IntegerIndicate the starting index (eg. first entry is 0) of entries in the source to be available as the first entry in the resulting subset iterator
deciderfalse com.opensymphony.webwork.util.SubsetIteratorFilter.DeciderExtension to plug-in a decider to determine if that particular entry is to be included in the resulting subset iterator
idfalse StringThe id of the tag element.

- -

Examples

-
-
public class MySubsetTagAction extends ActionSupport {
-      public String execute() throws Exception {
-		   l = new ArrayList();
-		   l.add(new Integer(1));
-		   l.add(new Integer(2));
-		   l.add(new Integer(3));
-		   l.add(new Integer(4));
-		   l.add(new Integer(5));
-		   return "done";
-	    }
-
-
-	    public Integer[] getMyArray() {
-		   return a;
-	    }
-
-	    public List getMyList() {
-		   return l;
-	     }
-
-      public Decider getMyDecider() {
-		return new Decider() {
-			public boolean decide(Object element) throws Exception {
-				int i = ((Integer)element).intValue();
-				return (((i % 2) == 0)?true:false);
-			}
-		};
-		}
-	}
-
-
-
<!-- A: List basic -->
-   <ww:subset source="myList">
-     <ww:iterator>
-	    <ww:property />
-     </ww:iterator>
-   </ww:subset>
-
-
-
<!-- B: List with count -->
-   <ww:subset source="myList" count="3">
-	     <ww:iterator>
-		     <ww:property />
-	     </ww:iterator>
-    </ww:subset>
-
-
-
<!--  C: List with start -->
-     <ww:subset source="myList" count="13" start="3">
-	       <ww:iterator>
-		     <ww:property />
-	       </ww:iterator>
-     </ww:subset>
-
-
-
<!--  D: List with id -->
-     <ww:subset id="mySubset" source="myList" count="13" start="3" />
-     <%
-	        Iterator i = (Iterator) pageContext.getAttribute("mySubset");
-         while(i.hasNext()) {
-     %>
-     <%=i.next() %>
-     <%  } %>
-
-
-
<!--  D: List with Decider -->
-     <ww:subset source="myList" decider="myDecider">
-	           <ww:iterator>
-	            <ww:property />
-           </ww:iterator>
-     </ww:subset>
-
- -
- - diff --git a/docs/wikidocs/tabbedPanel.html b/docs/wikidocs/tabbedPanel.html deleted file mode 100644 index 71ef52062..000000000 --- a/docs/wikidocs/tabbedPanel.html +++ /dev/null @@ -1,655 +0,0 @@ - - - WebWork - - tabbedPanel - - - - - - - - - - -
-

Description

-

The tabbedpanel widget is primarily an AJAX component, where each tab can either be local content or remote -content (refreshed each time the user selects that tab).

- -
This tag only works with the ajax theme. Be sure to read up on the theme before using this tag.
- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

idtrue StringThe id to assign to the component.
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration

- -

Examples

-

The following is an example of a tabbedpanel and panel tag utilizing local and remote content.

-
-
<ww:tabbedPanel id="test2" theme="simple" >
-      <ww:panel id="left" tabName="left" theme="ajax">
-          This is the left pane<br/>
-          <ww:form >
-              <ww:textfield name="tt" label="Test Text" />  <br/>
-              <ww:textfield name="tt2" label="Test Text2" />
-          </ww:form>
-      </ww:panel>
-      <ww:panel remote="true" href="/AjaxTest.action" id="ryh1" theme="ajax" tabName="remote one" />
-      <ww:panel id="middle" tabName="middle" theme="ajax">
-          middle tab<br/>
-          <ww:form >
-              <ww:textfield name="tt" label="Test Text44" />  <br/>
-              <ww:textfield name="tt2" label="Test Text442" />
-          </ww:form>
-      </ww:panel>
-      <ww:panel remote="true" href="/AjaxTest.action"  id="ryh21" theme="ajax" tabName="remote right" />
-  </ww:tabbedPanel>
-
-

If you are looking for the "nifty" rounded corner look, there is additional configuration. This assumes -that the background color of the tabs is white. If you are using a different color, please modify the -parameter in the Rounded() method.

-
-
<link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/tabs.css"/>">
-<link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/niftycorners/niftyCorners.css"/>">
-<link rel="stylesheet" type="text/css" href="<ww:url value="/webwork/niftycorners/niftyPrint.css"/>" media="print">
-<script type="text/javascript" src="<ww:url value="/webwork/niftycorners/nifty.js"/>"></script>
-<script type="text/javascript">
-    dojo.event.connect(window, "onload", function() {
-        if (!NiftyCheck())
-            return;
-        Rounded("li.tab_selected", "top", "white", "transparent", "border #ffffffS");
-        Rounded("li.tab_unselected", "top", "white", "transparent", "border #ffffffS");
-        // "white" needs to be replaced with the background color
-    });
-</script>
-
- -
- - diff --git a/docs/wikidocs/tabbedpane.html b/docs/wikidocs/tabbedpane.html deleted file mode 100644 index 40ce91474..000000000 --- a/docs/wikidocs/tabbedpane.html +++ /dev/null @@ -1,222 +0,0 @@ - - - WebWork - - tabbedpane - - - - - - - - - - -
-
Deprecated
-

This tag has been deprecated in favour of TabbedPanel.

- - -

tabbedpane

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Attribute Type Required Default Description
id string FALSE   
contentName string TRUE   name of collection to use
selectedIndex integer FALSE   
name string TRUE   
value string FALSE   
required boolean FALSE   
disabled boolean FALSE   
theme string FALSE   
template string FALSE tabbedpane  
cssClass string FALSE   
cssStyle string FALSE   
label string FALSE   
labelposition string FALSE   
tabindex string FALSE   
onclick string FALSE   
ondblclick string FALSE   
onmousedown string FALSE   
onmouseup string FALSE   
onmouseover string FALSE   
onmousemove string FALSE   
onmouseout string FALSE   
onfocus string FALSE   
onblur string FALSE   
onkeypress string FALSE   
onkeydown string FALSE   
onselect string FALSE   
onchange string FALSE   
- -
- - diff --git a/docs/wikidocs/table.html b/docs/wikidocs/table.html deleted file mode 100644 index ac60e9ed4..000000000 --- a/docs/wikidocs/table.html +++ /dev/null @@ -1,662 +0,0 @@ - - - WebWork - - table - - - - - - - - - - -
-

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

modelNametrue StringThe name of model to use
sortColumnfalse IntegerIndex of column to sort data by
sortOrderfalseNONEStringSet sort order. Allowed values are NONE, ASC and DESC
sortablefalsefalseBooleanWhether the table should be sortable. Requires that model implements com.opensymphony.webwork.components.table.SortableTableModel if set to true.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -
- - diff --git a/docs/wikidocs/text.html b/docs/wikidocs/text.html deleted file mode 100644 index d93bfecc5..000000000 --- a/docs/wikidocs/text.html +++ /dev/null @@ -1,117 +0,0 @@ - - - WebWork - - text - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Render a I18n text message.

- -

- -

The message must be in a resource bundle -with the same name as the action that it is associated with. In practice -this means that you should create a properties file in the same package -as your Java class with the same name as your class, but with .properties -extension.

- -

- -

If the named message is not found, then the body of the tag will be used as default message. -If no body is used, then the name of the message will be used.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

nametrue Object/StringName of resource property to fetch
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
Accessing messages from a given bundle (the i18n Shop example bundle in the first example) and using bundle defined through ww in the second example.</p>
-
-
-
<!-- First Example -->
-<ww:i18n name="webwork.action.test.i18n.Shop">
-    <ww:text name="main.title"/>
-</ww:i18n>
-
-<!-- Second Example -->
-<ww:text name="main.title" />
-
- -

Other example

-
-
<ww:text name="format.money"><ww:param name="value" value="myMoneyValue"/></ww:text>
-
-

where

-
-
format.money={0,number,currency}
-
- -

For documentation on possibilities for formatting text, see

-
    -
  1. http://java.sun.com/j2se/1.4.2/docs/api/java/text/MessageFormat.html
  2. -
  3. http://java.sun.com/docs/books/tutorial/i18n/format/decimalFormat.html
  4. -
- - -
- - diff --git a/docs/wikidocs/textarea.html b/docs/wikidocs/textarea.html deleted file mode 100644 index 1af880877..000000000 --- a/docs/wikidocs/textarea.html +++ /dev/null @@ -1,672 +0,0 @@ - - - WebWork - - textarea - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Render HTML textarea tag.

- -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

colsfalse IntegerHTML cols attribute
readonlyfalsefalseBooleanWhether the textarea is readonly
rowsfalse IntegerHTML rows attribute
wrapfalse StringHTML wrap attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Example

-
-
<ww:textarea label="Comments" name="comments" cols="30" rows="8"/>
-
- -
- - diff --git a/docs/wikidocs/textfield.html b/docs/wikidocs/textfield.html deleted file mode 100644 index a08e18a5b..000000000 --- a/docs/wikidocs/textfield.html +++ /dev/null @@ -1,676 +0,0 @@ - - - WebWork - - textfield - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Descrption

-

Render an HTML input field of type text

- -

Paramaters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

maxlengthfalse IntegerHTML maxlength attribute
maxLengthfalse Object/StringDeprecated. Use maxlength instead.
readonlyfalsefalseBooleanWhether the input is readonly
sizefalse IntegerHTML size attribute
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
In this example, a text control is rendered. The label is retrieved from a ResourceBundle by calling
-ActionSupport's getText() method.<p/>
-
-
-
<ww:textfield label="%{text('user_name')}" name="user" />
-
- -
- - diff --git a/docs/wikidocs/token.html b/docs/wikidocs/token.html deleted file mode 100644 index 8303fcf0e..000000000 --- a/docs/wikidocs/token.html +++ /dev/null @@ -1,606 +0,0 @@ - - - WebWork - - token - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

-

Stop double-submission of forms.

- -

The token tag is used to help with the "double click" submission problem. It is needed if you are using the -TokenInterceptor or the TokenSessionInterceptor. The ww:token tag merely places a hidden element that contains -the unique token.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- - -

Examples

-
-
<ww:token />
-
- -
- - diff --git a/docs/wikidocs/tree.html b/docs/wikidocs/tree.html deleted file mode 100644 index 652183a0c..000000000 --- a/docs/wikidocs/tree.html +++ /dev/null @@ -1,778 +0,0 @@ - - - WebWork - - tree - - - - - - - - - - -
-

Description

- -

Renders a tree widget with AJAX support.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

togglefalse Object/StringThe toggle property.
treeSelectedTopicfalse Object/StringThe treeSelectedTopic property.
treeExpandedTopicfalse Object/StringThe treeExpandedTopic property.
treeCollapsedTopicfalse Object/StringThe treeCollapsedTopic property.
openAllfalsefalsebooleanThe openAll property.
rootNodefalse Object/StringThe rootNode property.
childCollectionPropertyfalse Object/StringThe childCollectionProperty property.
nodeTitlePropertyfalse Object/StringThe nodeTitleProperty property.
nodeIdPropertyfalse Object/StringThe nodeIdProperty property.
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-

<tree .../>

- -
- - diff --git a/docs/wikidocs/treenode.html b/docs/wikidocs/treenode.html deleted file mode 100644 index 134e663f2..000000000 --- a/docs/wikidocs/treenode.html +++ /dev/null @@ -1,616 +0,0 @@ - - - WebWork - - treenode - - - - - - - - - - -
-

Description

- -

Renders a tree node within a tree widget with AJAX support.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

labeltrue Object/StringLabel expression used for rendering tree node label.
openTemplatefalse Object/StringSet template to use for opening the rendered html.
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-

<treenode .../>

- -
- - diff --git a/docs/wikidocs/updownselect.html b/docs/wikidocs/updownselect.html deleted file mode 100644 index 886be2f68..000000000 --- a/docs/wikidocs/updownselect.html +++ /dev/null @@ -1,876 +0,0 @@ - - - WebWork - - updownselect - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

Create a Select component with buttons to move the elements in the select component -up and down. When the containing form is submited, its elements will be submitted in -the order they are arranged (top to bottom).

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

allowMoveUpfalsetrueBooleanWhether move up button should be displayed
allowMoveDownfalsetrueBooleanWhether move down button should be displayed
allowSelectAllfalsetrueBooleanWhether or not select all button should be displayed
moveUpLabelfalse^StringText to display on the move up button
moveDownLabelfalsevStringText to display on the move down button
selectAllLabelfalse*StringText to display on the select all button
emptyOptionfalsefalseBooleanWhether or not to add an empty (--) option after the header option
headerKeyfalse Object/StringKey for first item in list. Must not be empty! "'-1'" and "''" is correct, "" is bad.
headerValuefalse Object/StringValue expression for first item in list
multiplefalsefalseBooleanCreates a multiple select. The tag will pre-select multiple values if the values are passed as an Array (of appropriate types) via the value attribute. Passing a Collection may work too? Haven't tested this.
sizefalse IntegerSize of the element box (# of elements to show)
listtrue Object/StringIterable source to populate from. If the list is a Map (key, value), the Map key will become the option "value" parameter and the Map value will become the option body.
listKeyfalse Object/StringProperty of list objects to get field value from
listValuefalse Object/StringProperty of list objects to get field content from
themefalse Object/StringThe theme (other than default) to use for rendering the element
templatefalse Object/StringThe template (other than default) to use for rendering the element
cssClassfalse Object/StringThe css class to use for element
cssStylefalse Object/StringThe css style definitions for element ro use
titlefalse Object/StringSet the html title attribute on rendered html element
disabledfalse Object/StringSet the html disabled attribute on rendered html element
labelfalse Object/StringLabel expression used for rendering a element specific label
labelPositionfalseleftObject/Stringdeprecated.
labelpositionfalse Object/Stringdefine label position of form element (top/left)
requiredpositionfalse Object/Stringdefine required position of required form element (left|right)
namefalse Object/StringThe name to set for element
requiredfalsefalseBooleanIf set to true, the rendered element will indicate that input is required
tabindexfalse Object/StringSet the html tabindex attribute on rendered html element
valuefalse Object/StringPreset the value of input element.
onclickfalse Object/StringSet the html onclick attribute on rendered html element
ondblclickfalse Object/StringSet the html ondblclick attribute on rendered html element
onmousedownfalse Object/StringSet the html onmousedown attribute on rendered html element
onmouseupfalse Object/StringSet the html onmouseup attribute on rendered html element
onmouseoverfalse Object/StringSet the html onmouseover attribute on rendered html element
onmousemovefalse Object/StringSet the html onmousemove attribute on rendered html element
onmouseoutfalse Object/StringSet the html onmouseout attribute on rendered html element
onfocusfalse Object/StringSet the html onfocus attribute on rendered html element
onblurfalse Object/StringSet the html onblur attribute on rendered html element
onkeypressfalse Object/StringSet the html onkeypress attribute on rendered html element
onkeydownfalse Object/StringSet the html onkeydown attribute on rendered html element
onkeyupfalse Object/StringSet the html onkeyup attribute on rendered html element
onselectfalse Object/StringSet the html onselect attribute on rendered html element
onchangefalse Object/StringSet the html onchange attribute on rendered html element
tooltipfalseStringSet the tooltip of this particular component
tooltipConfigfalseStringSet the tooltip configuration
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<!-- Example 1: simple example -->
-<ww:updownselect 
-list="#{'england':'England', 'america':'America', 'germany':'Germany'}" 
-name="prioritisedFavouriteCountries" 
-headerKey="-1" 
-headerValue="--- Please Order Them Accordingly ---" 
-emptyOption="true" />
-
-<!-- Example 2: more complex example -->
-<ww:updownselect 
-list="defaultFavouriteCartoonCharacters" 
-name="prioritisedFavouriteCartoonCharacters" 
-headerKey="-1" 
-headerValue="--- Please Order ---" 
-emptyOption="true" 
-allowMoveUp="true" 
-allowMoveDown="true" 
-allowSelectAll="true" 
-moveUpLabel="Move Up"
-moveDownLabel="Move Down" 
-selectAllLabel="Select All" />
-
- -
- - diff --git a/docs/wikidocs/url validator.html b/docs/wikidocs/url validator.html deleted file mode 100644 index 26ec6b085..000000000 --- a/docs/wikidocs/url validator.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork - - validator - - - - - - - - - - -
-

Description

- -

URLValidator checks that a given field is a String and a valid URL

- - -

Parameters

- -

    -
  • fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
  • -

- - - -

Examples

-
-
<validators>
-         <!-- Plain Validator Syntax -->
-         <validator type="url">
-             <param name="fieldName">myHomePage</param>
-             <message>Invalid homepage url</message>
-         </validator>
-         
-         <!-- Field Validator Syntax -->
-         <field name="myHomepage">
-             <message>Invalid homepage url</message>
-         </field>
-    </validators>
-
- -
- - diff --git a/docs/wikidocs/url.html b/docs/wikidocs/url.html deleted file mode 100644 index b87981c3d..000000000 --- a/docs/wikidocs/url.html +++ /dev/null @@ -1,302 +0,0 @@ - - - WebWork - - url - - - - - - - - - - -
-
Please make sure you have read the Tag Syntax document and understand how tag attribute syntax works.
- -

Description

- -

This tag is used to create a URL.

- -

You can use the "param" tag inside the body to provide -additional request parameters.

- -

NOTE: -

When includeParams is 'all' or 'get', the parameter defined in param tag will take -precedence and will not be overriden if they exists in the parameter submitted. For -example, in Example 3 below, if there is a id parameter in the url where the page this -tag is included like http://://editUser.action?id=3333&name=John -the generated url will be http://:/context>/editUser.action?id=22&name=John -cause the parameter defined in the param tag will take precedence.

- - -

Parameters

-

-

- -

- - - -

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

- -

-

- -

-

- -

-

- -

-

- -

- -

Name

Required

Default

Type

Description

includeParamsfalsegetObject/StringThe includeParams attribute may have the value 'none', 'get' or 'all'.
schemefalse Object/StringSet scheme attribute
valuefalse Object/StringThe target value to use, if not using action
actionfalse Object/StringThe action generate url for, if not using value
namespacefalse Object/StringThe namespace to use
methodfalse Object/StringThe method of action to use
encodefalsetrueBooleanwhether to encode parameters
includeContextfalsetrueBooleanwhether actual context should be included in url
portletModefalse Object/StringThe resulting portlet mode
windowStatefalse Object/StringThe resulting portlet window state
portletUrlTypefalse Object/StringSpecifies if this should be a portlet render or action url
anchorfalse Object/StringThe anchor for this URL
idfalse Object/Stringid for referencing element. For UI and form tags it will be used as HTML id attribute

- -

Examples

-
-
<-- Example 1 -->
-<ww:url value="editGadget.action">
-    <ww:param name="id" value="%{selected}" />
-</ww:url>
-
-<-- Example 2 -->
-<ww:url action="editGadget">
-    <ww:param name="id" value="%{selected}" />
-</ww:url>
-
-<-- Example 3-->
-<ww:url includeParams="get"  >
-    &lt:param name="id" value="%{'22'}" />
-</ww:url>
-
- -
- - diff --git a/docs/wikidocs/velocity.properties.html b/docs/wikidocs/velocity.properties.html deleted file mode 100644 index c6a216e82..000000000 --- a/docs/wikidocs/velocity.properties.html +++ /dev/null @@ -1,27 +0,0 @@ - - - WebWork - - velocity.properties - - - - - - - - - - -
-

This file if provided (/WEB-INF/classes) will be loaded by Velocity. It can be used to load custom macros:

- -
-
# Velocity Macro libraries.  
-velocimacro.library = webwork.vm, tigris-macros.vm, myapp.vm
-
- -

See the Velocity documentation for more information.

- -
- - diff --git a/docs/wikidocs/visitor validator.html b/docs/wikidocs/visitor validator.html deleted file mode 100644 index 3950cb916..000000000 --- a/docs/wikidocs/visitor validator.html +++ /dev/null @@ -1,58 +0,0 @@ - - - WebWork - - visitor validator - - - - - - - - - - -
-

Description

-

The VisitorFieldValidator allows you to forward validation to object -properties of your action using the object's own validation files. This -allows you to use the ModelDriven development pattern and manage your -validations for your models in one place, where they belong, next to your -model classes. The VisitorFieldValidator can handle either simple Object -properties, Collections of Objects, or Arrays.

- -

Parameters

-

    -
  • fieldName - field name if plain-validator syntax is used, not needed if field-validator syntax is used
  • -
  • context - the context of which validation should take place. Optional
  • -
  • appendPrefix - the prefix to be added to field. Optional
  • -

- - -

Examples

-
-
<validators>
-    <!-- Plain Validator Syntax -->
-    <validator type="visitor">
-        <param name="fieldName">user</param>
-        <param name="context">myContext</param>
-        <param name="appendPrefix">true</param>
-    </validator>
-    
-    <!-- Field Validator Syntax -->
-    <field name="user">
-       <field-validator type="visitor">
-          <param name="context">myContext</param>
-          <param name="appendPrefix">true</param>
-       </field-validator>
-    </field>
-</validators>
-
-

In the example above, if the acion's getUser() method return User object, WebWork -will look for User-myContext-validation.xml for the validators. Since appednPrefix is true, -every field name will be prefixed with 'user' such that if the actual field name for 'name' is -'user.name'

- -
- - diff --git a/docs/wikidocs/web.xml 2.1.x compatibility.html b/docs/wikidocs/web.xml 2.1.x compatibility.html deleted file mode 100644 index ee363a388..000000000 --- a/docs/wikidocs/web.xml 2.1.x compatibility.html +++ /dev/null @@ -1,44 +0,0 @@ - - - WebWork - - web.xml 2.1.x compatibility - - - - - - - - - - -
-

Before WebWork 2.2, a ServletDispatcher was used to handle action requests. In addition, JSP tags were emulated from within Velocity. WebWork 2.2 made a key changes in this area: The ServletDispatcher was deprecated and replaced with a FilterDispatcher. This generally works perfectly for users who follow the best practices of WebWork, which is what version 2.2 is pushing. However, due to some small behavioral changes in WebWork 2.2, older applications may require the ServletDispatcher.

- -

The biggest change to note is that any application that was including another action, either via a result dispatcher or jsp/ww:include tag, no longer works with the FilterDispatcher. This is because Servlet containers don't support RequestDispatchers out to filter mappings – only servlet mappings are supported. To get around this, you can either change your code to use action chaining in liue of a result dispatcher and the ww:action tag in liue of a jsp/ww:include.

- -

As a consequence of switching the FilterDispatcher, JSP tag emulation from within Velocity does not work. While this feature was never fully robust and supported, we recognize that many users take advantage of this feature. As of WebWork 2.2, native Velocity tags are supplied and are the only supported tags within WebWork/Velocity integration.

- -

However, we do provide a deprecated way to avoid changing your code. We recommend that when possible you update your code as suggested. In the meantime, you may add the following Servlets to web.xml:

- -
-
<servlet>
-    <servlet-name>JspSupportServlet</servlet-name>
-    <servlet-class>com.opensymphony.webwork.views.JspSupportServlet</servlet-class>
-    <load-on-startup>1</load-on-startup>
-</servlet>
-
-<servlet>
-    <servlet-name>action</servlet-name>
-    <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
-</servlet>
-
-<servlet-mapping>
-    <servlet-name>action</servlet-name>
-    <url-pattern>*.action</url-pattern>
-</servlet-mapping>
-
- -
- - diff --git a/docs/wikidocs/web.xml.html b/docs/wikidocs/web.xml.html deleted file mode 100644 index 43dbae672..000000000 --- a/docs/wikidocs/web.xml.html +++ /dev/null @@ -1,55 +0,0 @@ - - - WebWork - - web.xml - - - - - - - - - - -
-

For those using all the latest features of WebWork and have no requirement for backwards compatibility, configuring web.xml is a matter of adding a single filter and, if you're using JSP, a taglib. However, those upgrading from version 2.1.7 of earlier may need to do a bit more work to get everything in order. See web.xml 2.1.x compatibility for more information.

- -

The filter is configured as:

- -
-
<filter>
-    <filter-name>webwork</filter-name>
-    <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
-</filter>
-
-<filter-mapping>
-    <filter-name>webwork</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-
-<listener>
-    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-</listener>
-
- -

For those using JSP, you may also configuration the tag library as:

- -
-
<!--
-    This typically isn't required, as the taglib is included in webwork.jar.
-    If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld
-    to the WEB-INF directory as webwork.tld.
- -->
-<!--taglib>
-    <taglib-uri>webwork</taglib-uri>
-    <taglib-location>/WEB-INF/webwork.tld</taglib-location>
-</taglib-->
-
- -
In case you want to use SiteMesh for page decoration, you should add some additional filters
- - -
- - diff --git a/docs/wikidocs/webwork-default.xml.html b/docs/wikidocs/webwork-default.xml.html deleted file mode 100644 index 5927d0d9c..000000000 --- a/docs/wikidocs/webwork-default.xml.html +++ /dev/null @@ -1,237 +0,0 @@ - - - WebWork - - webwork-default.xml - - - - - - - - - - -
-

A base configuration file named webwork-default.xml is included in the webwork jar file. This file may be included at the top of your xwork.xml file to include the standard configuration settings without having to copy them, like so:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"><xwork>
-    <include file="webwork-default.xml"/>    
-    
-    <package name="default" extends="webwork-default">
-    ...
-    </package>
-</xwork>
-
- -

The contents of webwork-default.xml are here:

- -
-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
-<xwork>
-    <package name="webwork-default">
-        <result-types>
-            <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
-            <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
-            <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
-            <result-type name="httpheader" class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
-            <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
-            <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
-            <result-type name="redirect-action" class="com.opensymphony.webwork.dispatcher.ServletActionRedirectResult"/>
-            <result-type name="stream" class="com.opensymphony.webwork.dispatcher.StreamResult"/>
-            <result-type name="tiles" class="com.opensymphony.webwork.views.tiles.TilesResult"/>
-            <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
-            <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
-            <result-type name="plaintext" class="com.opensymphony.webwork.dispatcher.PlainTextResult" />
-            
-            <!-- Results necessary when using 'browse server' and 'upload' feature of Richtexteditor -->
-            <result-type name="richtexteditorGetFolders" class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorGetFoldersResult" />
-            <result-type name="richtexteditorGetFoldersAndFiles" class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorGetFoldersAndFilesResult" />
-            <result-type name="richtexteditorCreateFolder" class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorCreateFolderResult" />
-            <result-type name="richtexteditorFileUpload" class="com.opensymphony.webwork.views.jsp.ui.RichtexteditorFileUploadResult" />
-            
-        </result-types>
-
-        <interceptors>
-            <interceptor name="alias" class="com.opensymphony.xwork.interceptor.AliasInterceptor"/>
-            <interceptor name="autowiring" class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor"/>
-            <interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
-            <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
-            <interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
-            <interceptor name="createSession" class="com.opensymphony.webwork.interceptor.CreateSessionInterceptor" />
-            <interceptor name="external-ref" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
-            <interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>
-            <interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
-            <interceptor name="fileUpload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>
-            <interceptor name="i18n" class="com.opensymphony.xwork.interceptor.I18nInterceptor"/>
-            <interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
-            <interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
-            <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
-            <interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
-            <interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
-            <interceptor name="scope" class="com.opensymphony.webwork.interceptor.ScopeInterceptor"/>
-            <interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
-            <interceptor name="sessionAutowiring" class="com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringInterceptor"/>
-            <interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
-            <interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
-            <interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
-            <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
-            <interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
-
-            <!-- Basic stack -->
-            <interceptor-stack name="basicStack">
-                <interceptor-ref name="exception"/>
-                <interceptor-ref name="servlet-config"/>
-                <interceptor-ref name="prepare"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="conversionError"/>
-            </interceptor-stack>
-
-            <!-- Sample validation and workflow stack -->
-            <interceptor-stack name="validationWorkflowStack">
-                <interceptor-ref name="basicStack"/>
-                <interceptor-ref name="validation"/>
-                <interceptor-ref name="workflow"/>
-            </interceptor-stack>
-
-            <!-- Sample file upload stack -->
-            <interceptor-stack name="fileUploadStack">
-                <interceptor-ref name="fileUpload"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample WebWork Inversion of Control stack
-                 Note: WebWork's IoC is deprecated - please
-                 look at alternatives such as Spring -->
-            <interceptor-stack name="componentStack">
-                <interceptor-ref name="component"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample model-driven stack  -->
-            <interceptor-stack name="modelDrivenStack">
-                <interceptor-ref name="model-driven"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample action chaining stack -->
-            <interceptor-stack name="chainStack">
-                <interceptor-ref name="chain"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample i18n stack -->
-            <interceptor-stack name="i18nStack">
-                <interceptor-ref name="i18n"/>
-                <interceptor-ref name="basicStack"/>
-            </interceptor-stack>
-
-            <!-- Sample execute and wait stack.
-                 Note: execAndWait should always be the *last* interceptor. -->
-            <interceptor-stack name="executeAndWaitStack">
-                <interceptor-ref name="basicStack"/>
-                <interceptor-ref name="execAndWait"/>
-            </interceptor-stack>
-
-            <!-- An example of the params-prepare-params trick. This stack
-                 is exactly the same as the defaultStack, except that it
-                 includes one extra interceptor before the prepare interceptor:
-                 the params interceptor.
-
-                 This is useful for when you wish to apply parameters directly
-                 to an object that you wish to load externally (such as a DAO
-                 or database or service layer), but can't load that object
-                 until at least the ID parameter has been loaded. By loading
-                 the parameters twice, you can retrieve the object in the
-                 prepare() method, allowing the second params interceptor to
-                 apply the values on the object. -->
-            <interceptor-stack name="paramsPrepareParamsStack">
-                <interceptor-ref name="exception"/>
-                <interceptor-ref name="alias"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="servlet-config"/>
-                <interceptor-ref name="prepare"/>
-                <interceptor-ref name="i18n"/>
-                <interceptor-ref name="chain"/>
-                <interceptor-ref name="model-driven"/>
-                <interceptor-ref name="fileUpload"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="conversionError"/>
-                <interceptor-ref name="validation">
-                    <param name="excludeMethods">input,back,cancel</param>
-                </interceptor-ref>
-                <interceptor-ref name="workflow">
-                    <param name="excludeMethods">input,back,cancel</param>
-                </interceptor-ref>
-            </interceptor-stack>
-
-            <!-- A complete stack with all the common interceptors in place.
-                 Generally, this stack should be the one you use, though it
-                 may do more than you need. Also, the ordering can be
-                 switched around (ex: if you wish to have your servlet-related
-                 objects applied before prepare() is called, you'd need to move
-                 servlet-config interceptor up.
-
-                 This stack also excludes from the normal validation and workflow
-                 the method names input, back, and cancel. These typically are
-                 associated with requests that should not be validated.
-                 -->
-            <interceptor-stack name="defaultStack">
-                <interceptor-ref name="exception"/>
-                <interceptor-ref name="alias"/>
-                <interceptor-ref name="servlet-config"/>
-                <interceptor-ref name="prepare"/>
-                <interceptor-ref name="i18n"/>
-                <interceptor-ref name="chain"/>
-                <interceptor-ref name="model-driven"/>
-                <interceptor-ref name="fileUpload"/>
-                <interceptor-ref name="static-params"/>
-                <interceptor-ref name="params"/>
-                <interceptor-ref name="conversionError"/>
-                <interceptor-ref name="validation">
-                    <param name="excludeMethods">input,back,cancel,browse</param>
-                </interceptor-ref>
-                <interceptor-ref name="workflow">
-                    <param name="excludeMethods">input,back,cancel,browse</param>
-                </interceptor-ref>
-            </interceptor-stack>
-
-            <!-- The completeStack is here for backwards compatibility for
-                 applications that still refer to the defaultStack by the
-                 old name -->
-            <interceptor-stack name="completeStack">
-                <interceptor-ref name="defaultStack"/>
-            </interceptor-stack>
-        </interceptors>
-
-        <default-interceptor-ref name="defaultStack"/>
-    </package>
-    <package name="webwork-portlet-default" extends="webwork-default">
-
-	   <result-types>
-			<result-type name="dispatcher" class="com.opensymphony.webwork.portlet.result.PortletResult" default="true"/>
-			<result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.PortletFreemarkerResult"/>
-			<result-type name="velocity" class="com.opensymphony.webwork.portlet.result.PortletVelocityResult"/>
-	   </result-types>
-
-	   <action name="renderDirect" class="com.opensymphony.webwork.portlet.dispatcher.DirectRenderFromEventAction">
-	   		<result name="success">${location}</result>
-	   </action>
-	   <action name="freemarkerDirect" class="com.opensymphony.webwork.portlet.dispatcher.DirectRenderFromEventAction">
-	   		<result type="freemarker" name="success">${location}</result>
-	   </action>
-	   <action name="velocityDirect" class="com.opensymphony.webwork.portlet.dispatcher.DirectRenderFromEventAction">
-	   		<result type="velocity" name="success">${location}</result>
-	   </action>
-	</package>
-</xwork>
-
- -

This file defines all of the default bundled results and interceptors and many interceptor stacks which you can use either as-is or as a basis for your own application-specific interceptor stacks. Notice the name of the package is "webwork-default".

- -
- - diff --git a/docs/wikidocs/webwork.properties.html b/docs/wikidocs/webwork.properties.html deleted file mode 100644 index 94cfe6f67..000000000 --- a/docs/wikidocs/webwork.properties.html +++ /dev/null @@ -1,141 +0,0 @@ - - - WebWork - - webwork.properties - - - - - - - - - - -
-

WebWork uses a number of properties that can be changed to fit your needs. To change them, specify your values in webwork.properties in the classpath (typically /WEB-INF/classes). The list of properties can be found in default.properties (inside webwork.jar):

- -
-
### Webwork default properties
-###(can be overridden by a webwork.properties file in the root of the classpath)
-###
-
-### Specifies the Configuration used to configure webwork
-### one could extend com.opensymphony.webwork.config.Configuration
-### to build one's customize way of getting the configurations parameters into webwork
-# webwork.configuration=com.opensymphony.webwork.config.DefaultConfiguration
-
-### This can be used to set your default locale and encoding scheme
-# webwork.locale=en_US
-webwork.i18n.encoding=UTF-8
-
-### if specified, the default object factory can be overridden here
-### Note: short-hand notation is supported in some cases, such as "spring"
-###       Alternatively, you can provide a com.opensymphony.xwork.ObjectFactory subclass name here  
-# webwork.objectFactory = spring
-
-### specifies the autoWiring logic when using the SpringObjectFactory.
-### valid values are: name, type, auto, and constructor (name is the default)
-webwork.objectFactory.spring.autoWire = name
-
-### indicates to the webwork-spring integration if Class instances should be cached
-### this should, until a future Spring release makes it possible, be left as true
-### unless you know exactly what you are doing!
-### valid values are: true, false (true is the default)
-webwork.objectFactory.spring.useClassCache = true
-
-### if specified, the default object type determiner can be overridden here
-### Note: short-hand notation is supported in some cases, such as "tiger" or "notiger"
-###       Alternatively, you can provide a com.opensymphony.xwork.util.ObjectTypeDeterminer implementation name here
-### Note: if you have the xwork-tiger.jar within your classpath, GenericsObjectTypeDeterminer is used by default
-###       To disable tiger support use the "notiger" property value here.
-#webwork.objectTypeDeterminer = tiger
-#webwork.objectTypeDeterminer = notiger
-
-### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
-# webwork.multipart.parser=cos
-# webwork.multipart.parser=pell
-webwork.multipart.parser=jakarta
-# uses javax.servlet.context.tempdir by default
-webwork.multipart.saveDir=
-webwork.multipart.maxSize=2097152
-
-### Load custom property files (does not override webwork.properties!)
-# webwork.custom.properties=application,com/webwork/extension/custom
-
-### How request URLs are mapped to and from actions
-webwork.mapper.class=com.opensymphony.webwork.dispatcher.mapper.DefaultActionMapper
-
-### Used by the DefaultActionMapper
-### You may provide a comma separated list, e.g. webwork.action.extension=action,jnlp,do
-webwork.action.extension=action
-
-### Used by FilterDispatcher
-### If true than WW serves static content from inside its jar. 
-### If false than the static content must be available at <context_path>/webwork
-webwork.serve.static=true
-
-### use alternative syntax that requires %{} in most places
-### to evaluate expressions for String attributes for tags
-webwork.tag.altSyntax=true
-
-### when set to true, WebWork will act much more friendly for developers. This
-### includes:
-### - webwork.i18n.reload = true
-### - webwork.configuration.xml.reload = true
-### - raising various debug or ignorable problems to errors
-###   For example: normally a request to foo.action?someUnknownField=true should
-###                be ignored (given that any value can come from the web and it
-###                should not be trusted). However, during development, it may be
-###                useful to know when these errors are happening and be told of
-###                them right away.
-webwork.devMode = false
-
-### when set to true, resource bundles will be reloaded on _every_ request.
-### this is good during development, but should never be used in production
-webwork.i18n.reload=false
-
-### Standard UI theme
-### Change this to reflect which path should be used for JSP control tag templates by default
-webwork.ui.theme=xhtml
-webwork.ui.templateDir=template
-#sets the default template type. Either ftl, vm, or jsp
-webwork.ui.templateSuffix=ftl
-
-### Configuration reloading
-### This will cause the configuration to reload xwork.xml when it is changed
-webwork.configuration.xml.reload=false
-
-### Location of velocity.properties file.  defaults to velocity.properties
-# webwork.velocity.configfile = velocity.properties
-
-### Comma separated list of VelocityContext classnames to chain to the WebWorkVelocityContext
-# webwork.velocity.contexts =
-
-### used to build URLs, such as the UrlTag
-webwork.url.http.port = 80
-webwork.url.https.port = 443
-
-### Load custom default resource bundles
-# webwork.custom.i18n.resources=testmessages,testmessages2
-
-### workaround for some app servers that don't handle HttpServletRequest.getParameterMap()
-### often used for WebLogic, Orion, and OC4J
-webwork.dispatcher.parametersWorkaround = false
-
-### configure the Freemarker Manager class to be used
-### Allows user to plug-in customised Freemarker Manager if necessary
-### MUST extends off com.opensymphony.webwork.views.freemarker.FreemarkerManager
-#webwork.freemarker.manager.classname=com.opensymphony.webwork.views.freemarker.FreemarkerManager
-
-### See the WebWorkBeanWrapper javadocs for more information
-webwork.freemarker.wrapper.altMap=true
-
-### configure the XSLTResult class to use stylesheet caching.
-### Set to true for developers and false for production.
-webwork.xslt.nocache=false
-
- -
- - diff --git a/docs/wikidocs/xhtml form template.html b/docs/wikidocs/xhtml form template.html deleted file mode 100644 index 11d6c09ae..000000000 --- a/docs/wikidocs/xhtml form template.html +++ /dev/null @@ -1,37 +0,0 @@ - - - WebWork - - xhtml form template - - - - - - - - - - -
-

The xhtml form template sets up the wrapping table around all the other xhtml theme form elements. In addition to creating this wrapping table, the opening and closing templates also, if the validate parameter is set to true, enable Pure JavaScript Client Side Validation. See the form.ftl contents:

- -
-
<#include "/${parameters.templateDir}/xhtml/form-validate.ftl" />
-<#include "/${parameters.templateDir}/simple/form.ftl" />
-<table class="${parameters.cssClass?default('wwFormTable')?html}"<#rt/>
-<#if parameters.cssStyle?exists> style="${parameters.cssStyle?html}"<#rt/>
-</#if>
->
-
- -

The closing template, form-close.ftl:

- -
-
</table>
-<#include "/${parameters.templateDir}/simple/form-close.ftl" />
-<#include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" />
-
- -
- - diff --git a/docs/wikidocs/xhtml head template.html b/docs/wikidocs/xhtml head template.html deleted file mode 100644 index 9c0a9450d..000000000 --- a/docs/wikidocs/xhtml head template.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork - - xhtml head template - - - - - - - - - - -
-

The xhtml head template extends the simple head template and provides an additional CSS that helps render the xhtml theme form elements. The contents of head.ftl are:

- -
-
<link rel="stylesheet" href="<@ww.url value='/webwork/xhtml/styles.css' encode='false' />" type="text/css"/>
-<#include "/${parameters.templateDir}/simple/head.ftl" />
-
- -

The contents of styles.css are:

- -
-
.wwFormTable {}
-.label {font-style:italic; }
-.errorLabel {font-style:italic; color:red; }
-.errorMessage {font-weight:bold; text-align: center; color:red; }
-.checkboxLabel {}
-.checkboxErrorLabel {color:red; }
-.required {color:red;}
-.tdLabel {text-align:right; vertical-align:top; }
-
- -
- - diff --git a/docs/wikidocs/xhtml theme.html b/docs/wikidocs/xhtml theme.html deleted file mode 100644 index 30aa055c7..000000000 --- a/docs/wikidocs/xhtml theme.html +++ /dev/null @@ -1,134 +0,0 @@ - - - WebWork - - xhtml theme - - - - - - - - - - -
-

The xhtml theme is the default theme in WebWork. It provides all the basics that the simple theme provides, plus these additional features:

- - - - -

Wrapping the Simple Theme

- -

The xhtml theme uses the wrapping technique mentioned in Extending Themes. As such, it is important to understand how the HTML tags are wrapped by a standard header and footer. For example, take a look at the textfield template, text.ftl:

- -
-
<#include "/${parameters.templateDir}/${parameters.theme}/controlheader.ftl" />
-<#include "/${parameters.templateDir}/simple/text.ftl" />
-<#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />
-
- -

As you can see, the controlheader.ftl and controlfooter.ftl templates are wrapped around the simple template. In case you are wondering, the reason the controlheader.ftl is refered using ${parameters.theme} is to assist with code re-use for the ajax theme. For now, assume that the xhtml theme is used there as well.

- -

XHTML Theme Header

- -

Now let's look at the controlheader.ftl and controlheader-core.ftl (again, these are split up for easy re-use with the ajax theme) contents:

- -
-
<#include "/${parameters.templateDir}/xhtml/controlheader-core.ftl" />
-    <td>
-
- -
-
<#--
-	Only show message if errors are available.
-	This will be done if ActionSupport is used.
--->
-<#assign hasFieldErrors = parameters.name?exists && fieldErrors?exists && fieldErrors[parameters.name]?exists/>
-<#if hasFieldErrors>
-<#list fieldErrors[parameters.name] as error>
-<tr errorFor="${parameters.id}">
-<#if parameters.labelposition?default("") == 'top'>
-    <td align="left" valign="top" colspan="2"><#rt/>
-<#else>
-    <td align="center" valign="top" colspan="2"><#rt/>
-</#if>
-        <span class="errorMessage">${error?html}</span><#t/>
-    </td><#lt/>
-</tr>
-</#list>
-</#if>
-<#--
-	if the label position is top,
-	then give the label it's own row in the table
--->
-<tr>
-<#if parameters.labelposition?default("") == 'top'>
-    <td align="left" valign="top" colspan="2"><#rt/>
-<#else>
-    <td class="tdLabel"><#rt/>
-</#if>
-<#if parameters.label?exists>
-    <label <#t/>
-<#if parameters.id?exists>
-        for="${parameters.id?html}" <#t/>
-</#if>
-<#if hasFieldErrors>
-        class="errorLabel"<#t/>
-<#else>
-        class="label"<#t/>
-</#if>
-    ><#t/>
-<#if parameters.required?default(false) && parameters.requiredposition?default("right") != 'right'>
-        <span class="required">*</span><#t/>
-</#if>
-${parameters.label?html}<#t/>
-<#if parameters.required?default(false) && parameters.requiredposition?default("right") == 'right'>
- <span class="required">*</span><#t/>
-</#if>
-:<#t/>
-<#include "/${parameters.templateDir}/xhtml/tooltip.ftl" /> 
-</label><#t/>
-</#if>
-    </td><#lt/>
-<#-- add the extra row -->
-<#if parameters.labelposition?default("") == 'top'>
-</tr>
-<tr>
-</#if>
-
- -

The header used by the HTML tags in the xhtml theme is somewhat complex. However, if you look closely you will see that the logic produces two behaviors: either a two-column format or a two-row format. Generally the two-column approach is what you want, so that is the default option. However, you can use the two-row approach by changing the labelposition parameter to "top".

- -

Also note that the fieldErrors, usually caused by Validation, are printed out as a row above the HTML form element. Some people prefer these errors elsewhere, such as in a third column. If you wish to place these elsehwere, overriding the headers is easy, allowing you to continue to use the other features provided by this theme. See Template Loading for more information on how to do this.

- -

XHTML Theme Footer

- -

And the controlfooter.ftl contents:

- -
-
${parameters.after?if_exists}<#t/>
-    </td><#lt/>
-</tr>
-
- -

The important thing to note here is that the table cell and row is closed. Before that, however, note that a special after parameter is checked for. While this isn't an official attribute suppotred by any of the Tags, if you are using FreeMarker Tags, Velocity Tags, or the param tag in any template language, you can add an after parameter to place any content you like after the simple theme template renders. This makes it easier to fine-tune your HTML forms as you please.

- -

Special Notes

- -

While most of the templates in this theme are self explanatory, there are some templates that should be called out and explained in detail:

- - - - -
- - diff --git a/docs/wikidocs/xwork.xml.html b/docs/wikidocs/xwork.xml.html deleted file mode 100644 index 92c82a6e4..000000000 --- a/docs/wikidocs/xwork.xml.html +++ /dev/null @@ -1,161 +0,0 @@ - - - WebWork - - xwork.xml - - - - - - - - - - -
-

Example of xwork dtd

- -
-
<!--
-   XWork configuration DTD.
-   Use the following DOCTYPE
-   
-   <!DOCTYPE xwork PUBLIC 
-	"-//OpenSymphony Group//XWork 1.1.1//EN"
-	"http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
--->
-
-<!ELEMENT xwork (package|include)*>
-
-<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, global-results?, global-exception-mappings?, action*)>
-<!ATTLIST package
-    name CDATA #REQUIRED
-    extends CDATA #IMPLIED
-    namespace CDATA #IMPLIED
-    abstract CDATA #IMPLIED
-    externalReferenceResolver NMTOKEN #IMPLIED
->
-
-<!ELEMENT result-types (result-type+)>
-
-<!ELEMENT result-type (param*)>
-<!ATTLIST result-type
-    name CDATA #REQUIRED
-    class CDATA #REQUIRED
-    default (true|false) "false"
->
-
-<!ELEMENT interceptors (interceptor|interceptor-stack)+>
-
-<!ELEMENT interceptor (param*)>
-<!ATTLIST interceptor
-    name CDATA #REQUIRED
-    class CDATA #REQUIRED
->
-
-<!ELEMENT interceptor-stack (interceptor-ref+)>
-<!ATTLIST interceptor-stack
-    name CDATA #REQUIRED
->
-
-<!ELEMENT interceptor-ref (param*)>
-<!ATTLIST interceptor-ref
-    name CDATA #REQUIRED
->
-
-<!ELEMENT default-interceptor-ref (param*)>
-<!ATTLIST default-interceptor-ref
-    name CDATA #REQUIRED
->
-
-<!ELEMENT default-action-ref (param*)>
-<!ATTLIST default-action-ref
-    name CDATA #REQUIRED
->
-
-<!ELEMENT external-ref (#PCDATA)>
-<!ATTLIST external-ref
-    name NMTOKEN #REQUIRED
-    required (true|false) "true"
->
-
-<!ELEMENT global-results (result+)>
-
-<!ELEMENT global-exception-mappings (exception-mapping+)>
-
-<!ELEMENT action (param|result|interceptor-ref|exception-mapping|external-ref)*>
-<!ATTLIST action
-    name CDATA #REQUIRED
-    class CDATA #IMPLIED
-    method CDATA #IMPLIED
-    converter CDATA #IMPLIED
->
-
-<!ELEMENT param (#PCDATA)>
-<!ATTLIST param
-    name CDATA #REQUIRED
->
-
-<!ELEMENT result (#PCDATA|param)*>
-<!ATTLIST result
-    name CDATA #IMPLIED
-    type CDATA #IMPLIED
->
-
-<!ELEMENT exception-mapping (#PCDATA|param)*>
-<!ATTLIST exception-mapping
-    name CDATA #IMPLIED
-    exception CDATA #REQUIRED
-    result CDATA #REQUIRED
->
-
-<!ELEMENT include (#PCDATA)>
-<!ATTLIST include
-    file CDATA #REQUIRED
->
-
- - -

Example of xwork.xml

- -
-
<xwork>
-    <include file="webwork-default.xml"/>
-
-    <package name="person" extends="webwork-default" namespace="/person">
-        <action name="listPeople" class="com.opensymphony.webwork.showcase.person.ListPeople">
-            <interceptor-ref name="validationWorkflowStack"/>
-            <result type="freemarker">listPeople.ftl</result>
-        </action>
-
-        <!-- our JasperReports example -->
-        <action name="jasperList" class="com.opensymphony.webwork.showcase.jasper.JasperAction">
-            <result name="success" type="jasper">
-                <param name="location">/jasper/sample_report.jasper</param>
-                <param name="dataSource">people</param>
-                <param name="documentName">peoplereport</param>
-            </result>
-        </action>
-
-
-        <action name="newPerson" class="com.opensymphony.webwork.showcase.person.CreatePerson">
-            <result type="redirect">listPeople.action</result>
-            <result name="input" type="freemarker">newPerson.ftl</result>
-        </action>
-
-        <action name="editPerson" class="com.opensymphony.webwork.showcase.person.EditPerson">
-            <result>editPeople.jsp</result>
-        </action>
-
-        <action name="doEditPerson" class="com.opensymphony.webwork.showcase.person.EditPerson" method="save">
-            <result name="error">editPeople.jsp</result>
-            <result type="redirect">listPeople.action</result>
-        </action>
-    </package>
-</xwork>
-
-

For more information about the configuration details see XWork Configuration

- -
- - diff --git a/docs/wwia.jpg b/docs/wwia.jpg deleted file mode 100644 index bec1959b4..000000000 Binary files a/docs/wwia.jpg and /dev/null differ

I6:YSIp=dV5Pd0j*\l_0+u"(M#=rlX %-ANC?Mn,[:*iNVG$fg2c36rb83S7E(bAB9K:%C+8#BBY$)P8jDgCYU+2=UNQ0C=a1Y\ %D0'&lTuY]:OSFbdfqEZ,j90Vi(agJLou8us:j/B](6@SK<_6je)HhOTTu/n:E3VZFo`(902/buC/G\9VH"Ble#fV@;I0th%?^'_CuYZUIMV*&0q:q*d?Fm:4Rn!iXKV/_5)_=(F%36Z].3$EB, %5/5l,SsVu%Lf2?a4oQm!jHR+q](P5^O_,..-,@9]0U9`f;Q9-XnjBl;"G7(tNOK6\XH>r^A/FNI]L%pG<+j7=SMl`i2,AUcK8:P) %lf-$Y@]n!U;F49`*E/rM,a\G:IX^X<-'p/j:'id+BDO`dX&dRPCSb"YB8l9dVE6fafXZn]rUQ]&*@g59*.8P %N/XHkdj"3bCl*%amBg1kqF<;bmPCCBZHZL)&t`D/U$gN"UPd5N<<@]GBN])c=XrL"dR_,EA4am]J<[uF07f*/LkO;m8nW66Y+%+b %;0iQ^FY*oTe$oCQo6Zf8\DMN[7Lhbn9q4oqG!O,s@/AlX,aEae8n3!#LUr/@l1u?GNh#AQ+p0Ja)"J"%'(2q?=kb26<2kY6)4N"N, %)&V]4*U]`d7saQHT_4^[,/(78WT!]E>=]tj5EJ6aZHFOWa5kGT#YuDMonWeViN`qZ\5`7C>@/X1_7(O1SQAk-Sf;MQ4fE_O:f)g,) %8aTRN^.i>ES5d[hc(<>UkXraIu%NGcMg_ %TY'HZ(]#`90U%LYU#&^RZ7lJ\$>HT[H`[dhkH@; %\RLBEY$]WeTe;5>#bkPjAct;p,ZE[;e,%6dr%J^".gNGe"4?l*=t`Zk*5%QDEnN4>lUdI.eZ?c&RQg29en^poG'3eo?&:Y4A'9n> %F?rDp(CI7B*sBM_giE+H)0>'d$P,J9aYh@h8dCX']:I)OiDC3EoD)LN:Lj %Fcn2!HX*MO+WEdfpkMgWb\E$VKHX="GRBpTHGn,0E=#3G)A\UKXD[Z7KjU=#W?u(*3dGlI#DY"r50*p$D+'G#%7=3MBgp=E981?V %>*nWeS<@@ra<;c1,4t3WES3WP9iLFGY"OYZA!5ThC?%kY2]T0$nWKtfr,\iOE:C/V92/?oA:"c^LNaV1du&#G`Db;^7c!$5%Ckgg7`7b%Q5p9g0'=([Vps`J<=N4L(b\V(p5ID9gCr2JgC-Vj50oP+9\1hKdOp^4$+D)ES4VEc3C@XBkaFd*ijKXXVaXYLqsVFUY(L8;fT!4rIV>T6'.mQ9!?!daloUp:YBL;_i$L$T/ENRMTuLP"%dUXBGC_,Y+QaQPRru %E3)6l=Guf.hkh+r6C1iL.?+F<5[$],">>3\nO')hm'e3JVLQbhZ/8IcMZ+1(f!eV=!SIeh13pML(\tIFpP]\NZMirnmWGNXi\R+1 %9b\G-b,h25[HPM6ir][serWS-2(V[A%1@chQ(APP+]E.cbLB]t/C0ctoZLJHY'#C+L*UN9@u4CT=Oc%sJ(MrS#CZPh;et-NCH\(h %gJ5jK)Uqrp2K0)OC2]&q<$_m)!hCJLu8db<`a8'5F3bp*1s7[SqO4P@mVCR8Ah=CQ_OULpBfY>B3O(L8f7YI+es)pJ:Rk-:6kDd\hgO3hI02bXAq7OBp3"r-i8QCAHesR$6q?<3Lr'dC380+QdKM7>t1_dl>eq&;O>jH?!U4'F`f^8 %2Tam!>$%'>BjG#leO!Q%-.R8'I_s;]TBNZ9*AX*B3fUI%Xj]7reiSk4=];5<0!0=9j3i7GEK4l#1P&gal&s-dNZm(O=[J^^]"jfp %nX9T:d(%%JF#GU'P]HNTkb>Sf/F.,Q09A?c/5O/=bEL,bUYj_2C3>qVDk&MRPEjN)AZR]0LBq!Bh;kn4_-<"(;I]qp\*=( %r@k72-1g&3m=[ne$;A'oPA.]LR0:W`SP8@_aN:gGMnHp+(PVNN07(%I-SB8[AdQr>/@`&FRg&7;CbrT.2Oal:en28H\]0Tf[+XX_ %%cJh1bWE*$&TaG!04`9DR>(m/Q<24EAd=*n#EoodJlc6K8IK$:J@*[hG-,Zn>((&3RXnurXVoR-*)1rb&KZ0mW0GtUX5&6p&ctB]8 %(k'ti`LtQ2YSd#c(`%`fRgdp5ZYm]=-g1*?!5IE:!.MM %Cf6S*B3eZcSonT^HT"IRlrdDUZY*QHdEt9`N[;Yhc[Naf*O284ibu>"Sa!Ht*>hYkl*F**D``JKLD'LDhq^NDi8s %N-a[5)O:Z9"rW%/?'Hm1VlqEJS3`&cb2>_6TS9fl/)I81JMSOV@u:S):-R*lKU8aI9-@g@u/5,+F-nMa1IR7<,1[ub`G %1tp5BjM[eS_+M&4/&gZ2+TXft7;J9sBMikY1N?N\!7%In":XHPkTn0a)lTA?pGF_7ILdI7nf6Oak3kGgg?9=5!L?d!X9uH^p:7m?LYWJ6,O#qMeJi;T/_GMY`hO1_f+cUg2:[):\ %P_jj1n>lSd&D$bS4JPeX7T(4]b"'S16K$(VF59X8;j1"U#2BQRTqQp\JgcjY9BldAfm[J=2gY)(`"6"!]G`X %2_6k546$_eNRf]9CMqCaBsc_iS43m-4EaLW=q!MtJm8Eolb,!9-VVeLR7H!g"a4M+)AXl,KOgB.4-!"&TJMoM-hUCU[p"rLo8:j# %OK#VO)'R*k0a[B23T_N25q_kHjkf7/Y["l!kTj9JJgeerdrjQ1<,KU/ll)^`L6.(+Oq>`WgAI0HAYUM@DDcW3V=KdSo%3`OdqPMb %h/7%4I,pBi/'\fV`8oHBS:-!dLTGJNm2Zk;W*quV"g;F;4$]]$ZY>m47=6J:AcL7g2gGj!MA$* %dj"Gn2l3%Y@nGrKSRaK-U4eHnA7XDp[e/m<9Zq\@A),/4h<.iadfMP1&7/qS %"j!]eWbTS.IE5VZVX:$_25/"3dM3&CoLu,.`fgHKdh4YU+e9CiXQ)dJ70H9gJp08X\"tl%;N!W!m.M,2[5VWt\(?@83$.&klO>"[ %+hd'G>(=[4Zb8ql`BZ++@j.=e[IB^M#Wf.)rZs"?cE"pQ&W;FgX1^4K`u;.i/_P7T\tgL;1Oh %EoB/.K^6M!X6g2$">@`>[0U3_*?lknRSd^(/NPqR6(Eu#)KlTgC'UZf``'mZNKT6*RlZ[qCDdj%HPoSJFibXqoa>S.Pf+]rJs(pD %?QlYClr7'7j,2,e;< %i,T.?W3pLE5-Q;"EGFn.WM*eIERqT4VeV^8[OkO@;=_Z,8ESIB;p)/[>"0io,E?O*g55E2i=O*&Rh/<8@7Vro7!Tsq9:7]c8`EA&]I %SbkbDPS%]E,kn=epRDc[Dmt]u[S@4g9'ZnkYGfiR`fW!t5QQoX.a1O<"Xc476[_nY>MkM4ajYF^CU#)E[,>KHe2Ya0F]"\eldZ:eq&G-7j*4/P3<$V@3)6XL`c6%$X$'_4BH/DO``#@0V=1>-J<4Q7g/@0l7]n%o %UT^jeRt]oNa$)jg[gVO:DLA[(]j]cdn'8+2NTro3J(MfDhK>@Zb18RaYVBIc[uPNBc#69H)AEWj*LE^/9(LR'n$.#DjZjHXfK)JN %PdC*2$2i6":Q\>UNMh_E)^QB@f"RJ"[P!iOB3fOJnt>36[>pGe6c6+pn4L%+XDl7B=OSn*fTK*F0q%YL^[nbJTVZ0_0*Oj`iiq^G %%*1!SGXr^Z?B,-0*#15K]G)1W[9!K7Au[P15jbHfR4$^/[G %-A*IuAF!>AffBnV[aO&UoBehNs19Q2K)"NMg@un&9ii#uZ7V_=0bCONCk:(^`%rXkQ/2@d%BF=femn$a;[D"e;oo3U"k4'Z`C.04g %Cl[5$BBu^XP?3su3mX+h?"VH"C&L^SD,a[,&"d!_W?405L6Q#h&3,H"360STkTm%[[W?85J9HsT&(#6`q?b,!)fB%q\4X"8]/>I_ %[TfNZL>(@nd_8:9gY;1F&qu %3s"PumM&n!*fErh668XP?@uZZi/jmt7Q>NA(q'o'_j2U0i3qdO)o%[_1,Y6bCKV*E%?3=4Pth0[c:[t'YN*dJ+IGP/OK$e?_-j+0&]p=rBKp$+UWU[G&.sPRUdd1qcocms6%\Q&S(meFOY2qbs %E_W"i)*>$&qg*V0i]l8pjL.>A+C %Q&/kknV<&bj4A>(i3&#?=;_-r?gChRf/i'l=r)RW\J[^8UXsMhg9#j!#1t1,_Rh8pKO.;o0Ac:ZHEBPk?L+!-CMhq2U;; %968hAagGq2WL&cMfh-9,5@H;8)f>9d;hEg7;[:n+[I3#m\X%]K"K6<\D0X5IK6bs9Y4Y*W1M\WJmPg+hOD>4qDgc8=/LBgYdAO?S %]#S1a34TgG@Bg=@W@m4Q'\$[!]HK?7"Vc8>0'>$FKuA5PR\Z?^"Md8\Fqg2'$JFBXoKamHKa=9=Gk,c4[b?1$?d_fb0OdOW&&O %KLs1j.&k<#;>OUW'T5SA]fegLCapkWM1)=i9B@J1jKJ6',M:FjEUo;![Z3@j[W'EC%*+$sRQG[4.9nGF)u*/e61g8W=g>H6aIJ6A %&s2DGR*+In\_OBrH_]2Mf$55LQE-^QaW?^/qMa[NM,!l+U&F9%%,2SWr)(M)4Nk;jQ![#EZmLY^[=TDYVq?mi=APjI;Z&?C/`(@X %oi3#N,[1jleP*8klpXe60][Ek7V]#7\*=3Herco4A"%a%Q)''4X/u=@P3r98Sk*L5@%bFXRV92jE,'fk6,P:5B15k#SoHfSBXm:U %V;\.ffa&?3/qu5%F/%WZAP>Idi<#EaS\b#>,ggS[;bFrmP+!B4W]u%3d%t:t/t\;g#>2o<_E=npJMO&I*\OK[C8LH>bBCIZno0/= %A$=+o-,pK-`ksAL:WI^i7%,gPKSN3R9HrNUne?$o$)&l-gKhak:HVlk7?;Q4_\JuCYdT/-Q$Kln8`%HgVr:*L)E/kL\<5)):P!5& %8&fk%D.n@XTjIU(!fB?ocY0iYPS%`ZFB'`;No7QI_e^Z9O@!M8>hQ&lB@(V^F^^DpBXi"RAnR>TV;VKlVPNf5%7hc"GXa^'/4O*" %.L-d26GE%Zie.;s<+odn(6=rP&Z8,[G$[Y)6JKrPaeLYlWL7g:i"chDBq3^MY#1I)',Ug14f&SB<0B"U;suFB/nH4uaJcL!FoYCK %^oHIfGQ-teOD7qNKYuB8Qe2BbOjS)gjc"Wr(%?C4dr,VTibAl#D;g?*f>PBL,(Xg#I7pAJqCRgRKH?oGU'W+'TsASC'TH9(p+73i6X+$W %$J'iW90b>.jBFnqrM@n[M7"&M2@RCAP@Q#[^:c`g<,1P9E;$CYM1'`#M?Dh>Um9+um+_/3Zh:)]V,'7Rjc"U\PEUMrb,aWI&1Q7_ %7/$urRjf7\7b?kQ=A)9$"gYu68H`;$;U2h)J1KeS]B:VGO[QuZ:C.&g"k?M&JBK5N(/B^:bD"E4jm*AT&kC--(tJfTiYacXfDDEY %E3hTbJ4l^HH)qrNa;W(sS()iR"iXD4^l=N4SP%cqg2&U<;/8Pi5b`^Y+VlCA_blR+mB>s4)uisI[DfC,r[j[=d`7>sb@O;+B5TtD %ho7HEF%sV%):h$K<7]bB4?kQH$Y8hR<\M?a4`0H+V5O\"#0t(!"t2\TNie)mUBc2X1rHnhqJoeqoQkFlIbq3l\mnehQl8khV$< %e2kU`9i"bN;qVpj;;&GVhDKP,:$c(V`Hf@G[2eDk_Nc@nk5oF^>0GU.d5#Y-G@TOm<](A&]PBX]kW?e=Q.?N`dQ"S\3l\4CO"hel %7!*6[Pas5E=sq%n,[irIhb*4Yq)(_R.OZskH2SFKm+_0^1,mo[;YI5B0:!k_Nn4WPl[0Sp&+=;cRhN7fPr6DQ$>c+Ef>f4l!cF)bDro-2CO8B`k"O=cskZ*RIGnLB:C.lPEQbR^S %ntjY%1PdJQ5Od["r?i.oQVfPpcEMbP/O2hkNk(8AO%(`,p'&#R%XiK %JOB3Wk;1q3ZN`ZY-7)]+aN6`4U7ZoK;4Ij#el/qsaE@;(,bZc5R#/SF+X&WhV3TcQ\qKEg^Fr#cqOuOOC#1'b7)/^JiVi8NDUFT8 %i`>569G(q+o/>UDX#LV/EPO@kRm0)UKDsI%05/UUn&RHigp[ln,(&dipMHEtp3D9K2H4F?Oe0\-I?>IZXhMI3C4B_@>1)ki]BO%h-:^#9NVOo4q:_\*AF%s[#L\,?/nouJW,Zqg8GJo+A=YPfg$Dm4k)!^!%U[1KKk'JhcZ\4MI#3W %T:nFV3JZPa0KH)6?VsT=$j7.7FJp[K`_3:/iV6=H774r%/6JgACa]nh;FP@WeOKYk8*b!;\5KC>e!kgkXi%Ef,jCJO3+R.SlJmuV %fh4'%]X5umcXHjj/\<1J3g$Ocr>YLgR3W8dQs0!9thl#T^J\l%>o4:CVBJ=>h%>nHc/D\%!H,tef9f/hM>c4D2,/@2$TOdHQ["VV2N;EOafAKpfpI8UBmkO5+l]:L0ka1`1Y %L68mSo0``ElU\>f(e$7*44o(P1$a49\U\It^Z,@=&0hod,X-8f:^?QImhK>M!'2S7i$1KP3k>Qhj*uHuc,bUd=X8[NH,coF;c-NH %*\iXV)6U@A$t_"1%R_!99NVOo64R.p*AFn62NQ*O-j4fadpt:g-YDtkJ0ic'd9)*TXN,aUFlNa %HZWL&+=cZ>mI %1NKZoF9HErS`TRhWX@+4JuXSY2qDNXg7__>+j]__+XHPXUQJmpJ1'b1M`L"6$Kf%N*>[$MZ;'57:;.Y*oQ"#H7 %hVpV`R)_`2D#c&&!+)FN[+58V?="Sl-F_+AopmJ>$/X8OX/'H2%^!K89ta>0&FVKP8#5Tf&VlsW7[K]OdBDc_dnY@o:BqI(F@c:N %PbM)KI*#t@(IdL5(KJ(_eAf+BeC^@4Puo342ZHIYES2V:4?sESm<@("&?E#O@4HP>SGUMgc`<\^kWqF`#S"Y^&@dXDUBC8)H$19Q %0W-2i%9%8^N6-V^h'"RH#L%#_94?O,NEO#SC]2.d'RaZJHHVnrmZ<]r% %U4G@:F.9dEA_?A&CjBWV`!Lm9$hHImeuHY&E;_,Aa,<"CWQ*ggbe6n>;'o`(pN];58%7pee@l%S-4*613rl\WplaBU8>GnGd]2PX %FkjR'_Y/e"`/67>`E2od9P<&o%)?Cr+R8!Ke_'uPb"LdI"EF!3j>K;o9rWt1\mL^^HV5Bulfh^>`)5G`bF]G,O^a>2@DuE'NcZY/ %7ol'$!$!S9U]EkH*R_))VgK7FAA'ACYSWea]4F27?"[-!#i&bs0ZfM^B^[1g[Mep,d#!LfN)c0U9:/c@(:0E/Cu=,OQQ0 %p5;Z6I:Afm+T6G.rq#NDDh[->Qb@]m64OEXAtP31B\Rk!!O?oCd+C&2q=0?eNZVWDl.IT,LP>EUZ(q>O=]bIEN'XQJLY==C!::-p %\E3nA4r&VA](hH_b`G:UDhtI-4)3h$!,`OQ]FMjPZEDJ$k;Q`83Gg=AFD,i$Us3hj"1QRChfoU'U^e35p.i`1U-#L%E2BJu6BX.[ %.N4s&B"4nu];SSIL4^[F'+\+^5ZXdLC?n`Sc>`;"TA`*TS`2tBm<)8Rn!R$kH`#Jt-F4\1;%;i7SE3)R50GNIGW]K%6SjihCR4^( %S'gaAHC'R"YZUqeVSAGX"8E1u42dd3fC9NqNjE_DkLefBLn85AfA7Y-^^LgH+T+k)ME\V0#(FB`*b&Pb]a8V@*g.N3S_++Vli_9Z>79=.n\u7#G5Q<(i %IH]SKm?g$ZW-tGMp@I[PJ$u)4H^Q/7(I#(()5Ipj@ba\W<*' %-a@XIJ7YI3Q%&2IlUjM+]_lDsC1g`eCqR$[n]T_?;4P-"dL#7B3slHk,F`8#f5r\(E`jm25(poV$?us:',6tFpl[d]FjICPhB\t( %!]6GN.WJ?qKg'D$k(nQbC[ro_AYsAVRBfZ4=_;sa=2qfYK,l6;*L1_[k]$qrR4JA.m8VV&mO/(s,V9MCSG[OYh91(sL/oal/obkJ %BF^k]M:D:[##.+(.\K,8T0dqqqg2HfnJO_;78']C`,@SJ>Y`'s(A=702V:)J.Xa9uK#)&360loS!c*@hWbka%hhV5-ZNrs>7c]DD@DnhAYD-[iG %rc=@[NH(qVVbm@$#j1XUX;bffZGI_(FR%L#)3LG`#^]aLKB=ft-\4f*4b'>=6!Lu8a7#t#6e[BfIpefan^n^%0KLqATkT:r]pM<' %BSG#i*J4^'`O*3]1rcBjZT<]b0bol_GdhYI19fIUd6nD3Er>NKK,BG0au/kEQU?D'`f]a\/?XO?P(4b#]RWtOml*d*p4B\IpI[M; %k1%#6.(teqPS!7`0S:@R8):hP(1r+bU05G[6ZPC]+UKPs6BW/eP.*n>#tQi"HF[*%*saY:[GYs+F>2tG&XVA^8H;!ImB+ssn*G`q %Y==:ulsFuSA%G'=CCZ`/li`](3#)(K+DG"0Ilp;MSOTc6NlfXB!bUTV-V-_6qkoXQ %M^S[3WEJb#LlNo>P2a\:nr*"sRXcG\3e!SPIbHFILf(FXh'@^shj:GL]"*JaX@@c@.e13!$TV%.H= %VYrQ@$(HT5C/29K$/4!MZb1r:JJ#9sm`9N"Vom9]_FTH7JnQhZgbRlKLBP<)GW2p3PYI!:J4R?F,=+q75>SIfr6iV7qrPbUQg+jk %2B^dimX/bq:i-RKQ(G93n[B>'![ag]kRl)4['?qXik'A2jlP*7ju-n3C*F0bE.^7@'gG(Zii=oX&NH#(,ihf%ja@82isM^_$.<0t %Qh'i#"S0ST+R:iP'=Q>M3iF"g]Z1c %I[q,N7*(H\G_'nG5tIq+d@iqZ36ldq^$&:Z?aR.o#)(7&B=p\=5)uXc?Xm!9n %UOU=TLuUDCj'8;0Ee@\*]T<'E`b52dfK\f+rr<_s,b'fc[Y2AJLgCXJd0R@_9^.Yf$mpEl^&7DNX>!*&CDpPC,guI,,WZA[$S'B0 %HT_e1ZJ8BqlNM8+:M9CTJ;.=rN)I7^ZYsu1$K\[aRQ<+l4t`,KO"TfJHo(+$XqehgY3`6]7Xs]9m%'f1"Sm9U0*^Kk.hnVr,$+D&PJE(6,f9B-m])ao+eme)Z7#P(o5-FV>o""Rh %.L`+ajo[l]1Gtd)6:26^q*ZZH5-KigYo^j*'nntC\:WC8)HnL`Y0VA`,f'a'?*Fd;_:(%]I%Unq3qnaBU^ELFJ?S;1pRGuk##>3[R< %\02!N>pW+JY4>bCmj`&I@!r4;[p&&I=%278;dYsV#5-PMOO9nr$2R2SGE$i%6X%"m(B;&?()J^:$_iH:1Nf%D*T*9rMZ_@4*4#"l %V-%qeKPh>&UY)qlK?$:RXIm)H\.1_DNL6>=$1Dpl3h@:-*oR7sW()`QU/F"u8'$r1.Cr1d[M) %="f\8TW/aJ$MonlAnh<';a^b8#'sGK$q%4B?/&H!XI""E"IUhN:$hBQ%EU0s4[J"j84t\5jVBr;;Yc-s2'Amr7Q`b=`e!Y9's%L9 %aBJq7@ZVKCX*-L=j_)rC$n%NOI"g:J7))oJ9RfR\CJ>J,4@:G^HLVH5&uOk&'aDiKFJpB5BM>[g!/Ndgch&rG5&S`/hau-cs-U,P %Dk+];qN7Gm$kj$Z\91D0^+oQ/.lmkWKc-UTXn3#[SPCVeJM&JJh`)OiUKd6^YiB+T1NN![m]?Xm?+S?@D_ip"3,gXZjB'=:\!&/I_\0?DQ^jl;F& %ojLfa=:\ND=\&UM>_Gd\pLfl]c3qHdkreo+e-2U(Eirg(nuao>0bbe.D\ed-=%+"?c@EWeITCn,/0V.0'`:kLQeV.fA3lmi+gVCI %]?;gA%I=E]*iLUCHL"S5YQf(F'7qs+Zo]pM8aJ\AbU:;[*&8s!*pPL^;OsQ__LN7E!'-PhYYr#O@Hb$$=)'H@&(K:;AC0XXS9EZ3Mi-nut>0U9@gdj_DX_5!Ugk3Mo73]lgF**fVQt-[W#6kIO%,!@s"Nu4D_B[0! %3DfG!fSJ[-+OEWhGpJ459&`iq,T5$>;h]6]P@$<<\N?iWGck+>_Q/0:_K1,Sk9D1;aL8;:d=6o\?%qr]5=6X]]p+R^YNiV/Q!E&< %mCatlm8Y0+Kej0p]nEq1YNj.cWL!`BcdZ(EWrhcs'p*0Yld^Qqhd4o>liX&s$=RqP.Z(hGkCCdu@QikRK'_SfYQ&d/S8q1GDXq?gu"+l#(<:[L;[JDp\+_+I6-0@4uLi>pqM2I %LHt^N?14k^5D)bXP!,D>1#Vs9ljuni0R6V-pq.3#pqNct*iYhEW;&LC/N<<*ME`o%H;4rh!:Bl#86t.4KprGYNLafniW?IW\m%Sk %o`AmoalCWdWXF2?Z8%Z:\`WN?Q-qOQXS\]QC$?7]Xt"tNQK)prZde7BP9"rp\+i%Y3V.#_>4&Q"[fMD"34 %'%=R]&jt-XL6#>i>7-FC:NFV&G'<4J*Jc$W5hM)a9;k?XL`/a1a,O_6RKn>>kgh2o4VTt78H_-NamDJYF6ZRu,VB`?Wbp/&R*3"+ %FPCo[+4jp78(iSV(\+L[.l04K9(L*[#SHUMQiH3Oe*d.@iWD?cRf2E9M=uEEDE.;_p>-ij$ %M'P!eX^)"tQH9]i5Z*??P2\jCOpYW.Ynb-E'mkAGd_3fsN%7=)EP9>8`oZ`UQ=Rfp`0-rkJCV^aX0n:gC3aY=V^W_sDniF,7b7`W %>AYP;R.$?H?_sc+^M5Yc`A=W1higqh12][g_Y3Ej2_Z.CPQ\7VfV %f3Wj(g\Sd_l$>,Kni@>)8s%Q7a!sM7o@ct.%#Vq]=F[.(mUZTu?7&IuHQ!pFX0bYU+GgY\:=9AfZa4pIVL]KIg..">-8.oJ@iStWA)e%DQgh2hp',(5jADXdMu8JU$)OgS8Vr!QUr<4]8[@p"![Uu9@L4Q^r_[/ %b]:d2KENWD[d`W"ir/tZ7V %B$J?C'J>_A(H8:,4pqL1he3bcg8/A3!0;Q>CJ710BfSdRP0g8X"%5eZQ[sM-:iFD_%dt#<)4\GD@9<[QO;=gm@lVcj03H$kdcETa %CaA*l78o%0J3FfbZeu08Jj.1A(sKdpMIMHJ&PN8m-3V$SI9cEX=t(S!3kh&C-.e,Lp8;/c9D(ddGXS,@>aerj?]8='W(4D;53/6T %Fj66U656YfV]rXMHf/*=&FWZe)hQ23nSWA!N+LX-@,N>>`8n4Bo8`N@2)?%,d>PN6!Tlht< %6B4^ZT[rER-]sTQc4GOJ)/PH9^b,ko;+uDI)"--&'$Yf@\[;IbXp.f$(R^.82T'BD,fY'UOL*Wm'B7>BT%.b'EQ"@4)4t\j/k-3W,6#[dR %A"i\&G4^m50S>><(deGdcLs'j#VWTHRFEmp$1PLh,mi?$*XO]a_&K!b1Pn+b"toCLCc.=UE=k8gU(klu:rnk77au!YXTB53k,%_h %j4VPY+JB[j4u0"G5&p,PPSbogEklWWZ)g#FAKdT$ST(YaJS,De-lL]80hB@;oK]QVor8%fR'BE*<mn=)Y&KH$uFuKheBR]j#'^JV)WsHfYPb@60$@p`(7P^Wg.$?N.3V2U=GV9!6KJ %8DqGMTg"/R'ag!adgX+#GLq=b%gd&qL8`)-H'c4Z-R`,_Ij&6nUpn_QK<1hVkbR[#EuhG](jfhGD;%UGK*:Cm*XV1bko`;qg:+dZ %.+OA[>nFE)*uRs4]#bIJ?#T<$gW8UaTX2@4b&=s=[r3"!UrcG8s/pFG6?#6iYF&/0lH`N?EYMInOcEe,N4B[#@7L60R %eCkk?*S:@5CN!e-7I=XQm5U2nqe#2!:2M#O)l/YFh%d!&9*17:YLUesC%FI96Nn(bE]M5:H=@R[^$RrCb$l,oSe>$UhONL/*]5:? %3jA`,2kRK%_WFJ^;8po.kc`Ra5h'=l4piiQidWbMbim@7-"lsJ>/Q>g!gK[e\KjLKt5@O"5>XN2++`0Q_m>hBa4Q!S(#;,+nk9?:!52le6R %F$%3iXQ%]OE,F>i,VeaqIS!MuPVa'o0sGMPA(X.daZ5(U),%-k44\Wl\n-PFd5E!%,!8;[!9_P>n74Qe7)0XEUGP\@J.$tk0=&H> %c`o(,2*MY-^hsmt].\iX7@5&28C/L^!tQtD^7P%iT!L7O_k@6gD?`,:X#uKK7Y5!7AdlQ(kE'j@#TEE"(m$E)+\@2pQ,aY#R5Pch %HB%(H!ZnHN,#,-Rrq:48SoMVO&Z86,k)dBeluIS$%+ttQD$!%jp%nSUdeK"r68`j7p$UrVcZt@j.M7eaZc'C&VQM7CI:+p'XE.;3Ke-@HK+OX"CWnI@ %_I.?%(ku)<<6C4Y#6!=4S=O:5W?%-)(WPbE*%UoJeh_q;oH/H>r/Jt(A!#[6]MWu0cV7V$"%'i774pq':fVR@uRAITL:02UWjgikTFlO3e!>m/(&JCHnl.rhUhJ&=p(tBCDLp=&SFirg7nPG>bD,=e*U=spB_C8pTasJCU=:__a %L,u_PcS4ab\MYXINh,YaoodVAc'\")]L*<^cmk'L$3N=8bZBVB:nBA0P8`.>LoDsdg]AQ&V['F`0`00/f]?J_P_VgKbNAjZ&g,!C %#cpS`M^SiM>P/mPrG)Vq[13+bHA5#9\M%OU";5'_bXKs#6Kjc)H$gPI67FH`j_NkJJY>!GXU1f-j#D"YZ=!r;"*Z(!JieU@nf`_h %;WU504!*+;Z0$WHae*XuA?peRm$G;3C0kWPiP\#"on?)r5DZ9YRb.4bRNN@D):Nd5)b=N/Lp?'_g;c/+TrqV:c4UD_Tlu$Qn7m/X %>iW*?hD(VeFui2nFECb\,9fMLEnVT.(4/rFo2QUaZY>rbM)s^^k=;Pc@39]P!R![pmj;jMDY5OBFU-C&[J\eFkm4SFgklZ7d$p,h %5<0C'b9m+)omGtq]A7G.AgA"m38g?Rfo5Jc!ZT1Ab8u3gfVS9l+ujp5-'`j?"daV=P**X_=$.4\drE8ZIP3S]+fKqa[Y%l"tfU4HSo"meVdk+TKE.uY]ME:c>n %nl;&/8$S,6FX/^&"aT/V"^1SS=WIs(a]r\nM&\X4!ne[&`ds[":*d')b;4fZ7IIGkjSG)t5?kuD""@7B_VLPs?NQ\%qt3*QqHeq#2[^/Op5=q3Bd76Kd!"?0#-jIJ]R=lZbSD$Hm?EekV! %MW*uqFm+10BnuT\o'cU81$.HQI/1[prgWGes6`[4p[RSLs4d#Bnm?kA_]SmLYCHK;^\n)shgb[npFh$obHLs+\$*RGktcg.l`Yg: %mD!"Xq>/.hJ,@Drs8;b4?iT]Srqo!3>d)f?s8)3`r*OsNgV5uZBhu %AI9_PrivateDataEnd \ No newline at end of file diff --git a/docs/chinese/wikidocs/Webwork 2 HTML form buttons Howto.html b/docs/chinese/wikidocs/Webwork 2 HTML form buttons Howto.html deleted file mode 100644 index 31333280e..000000000 --- a/docs/chinese/wikidocs/Webwork 2 HTML form buttons Howto.html +++ /dev/null @@ -1,52 +0,0 @@ - - - WebWork 2 : Webwork 2 HTML form buttons Howto - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

HTML Form Buttons and Webwork2

This Howto will describe the usage of HTML form buttons to invoke different behavior in actions. -

Determine which button was pressed

The trick is that the type conversion of XW:XWork can be used to test which button was pressed in a simple way. When a button is pressed, a parameter is set in webwork with the name and value that are specified as the name and value attributes of your HTML button. XW:XWork converts this automatically to boolean value if an appropriate property of the Action is found.
-These boolean Properties can be tested to determine which button was pressed:

-
<form action="MyAction.action">
<input type="submit" name="buttonOnePressed" value="First option"> 
<input type="submit" name="buttonTwoPressed" value="Alternative Option">
</form>
-

- -
-
public class MyAction extends Action {

    /**
     * Action implementation
     *
     * Sets the message according to which button was pressed.
     **/
    public String execute() {
        if (buttonOnePressed) {
            message="You pressed the first button";
        } else if (buttonTwoPressed) {
            message="You pressed the second button";
        } else {
            return ERROR;
        }
        return SUCCES;
    }

    // Input parameters
    private boolean buttonOnePressed=false;
    private boolean buttonTwoPressed=false;

    public void setButtonOnePressed(boolean value) {
        this.buttonOnePressed = value;
    }


    public void setButtonTwoPressed(boolean value) {
        this.buttonTwoPressed = value;
    }

    // Output parameters

    private String message;
    public String getMessage() {
        return message;
    }
}
-

*Note_: Do not use String properties with buttons and test for the value that's set. This will break as soon as the _value attribute of the HTML button changes! This is likely because the value attribute used as the text shown to the user. -

Dynamic set of buttons

Consider a web page showing a shopping cart or similiar tabular data. Often there is a button belonging to each row, in case of the shopping cart a delete button to remove the item from the cart. The number of buttons is dynamic and the id that couples the button to an item cannot go to the value attribute because all buttons should read "delete".

The solution is to __name* the buttons like delete[123], delete[594], delete[494] where 123, 594 and 494 are e.g. the items' ids:

-
<form action="UpdateCart.action">
  <ww:iterate value="items">
    <ww:property value="name"> 
    <input type="submit" name="delete[<ww:property value='id'>]" value="delete" /> <br/>
  </ww:iterate>
</form>
-

When e.g. the button for the item with the property id == "27" is pressed, a parameter named delete[27] and value "delete" is set in your action. The trick is to us declare your action's property "delete" as java.util.Map. Then, a key will exist for the button that was pressed:

-
public void class UpdateCart implements Action {
    // must be initialized to be usable as a webwork input parameter
    private Map delete = new HashMap(); 

    /** This is somewhat counter intuitive. But a property like "delete[OS:27]"
     *  that is set to "delete" by webwork will be interpreted by the underlying    
     *  OGNL expression engine as "set the property 27 of the action's property
     *  "delete" to the value "delete". So we must provide a getter for this
     */ action. A setter is not needed.
    public Map getDelete() {
        return delete;
    }

    public String execute() {
        for(Iterator i = delete.keySet().iterator(); i.hasNext(); ) {
            String id = (String) i.next();
            ...
            // do what ever you want
            ...
         }
         ...
    }
}
-

In this case it would not be necessary to iterate the whole keySet because it contains only one key but the same code can be use to handle sets of checkboxes if this is prefered later:

-
<form action="UpdateCart.action">
  <ww:iterate value="items">
    <ww:property value="name"> 
    <input type="checkbox" name="delete[<ww:property value='item'/>]" value="delete"> <br/>
  </ww:iterate>
  <input type="submit" name="updateCart" value="Update the cart"/>
</form>
-
-

The two implementations can even be combined two provide a quick "delete this item" button and a set of checkboxes for "mass updates". All with the above code, cool eh?

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Webwork 2 file upload handling.html b/docs/chinese/wikidocs/Webwork 2 file upload handling.html deleted file mode 100644 index 38a5508dd..000000000 --- a/docs/chinese/wikidocs/Webwork 2 file upload handling.html +++ /dev/null @@ -1,62 +0,0 @@ - - - WebWork 2 : Webwork 2 file upload handling - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

File upload using WebWork2

Webwork comes with built in file upload support. Uploading a file is simple. When ServletDispatcher begins it checks to see if the request contains multipart content. If it does the dispatcher creates a MultipartWrapperRequest. This wrapper handles receiving the file and saving to disk. It is important for the action programmer to check to see if any errors occured during processing. Three properties can be set that effect file uploading. -

Properties

Webwork properties can be set by putting a file 'webwork.properties' in WEB-INF/classes. Any property found there will override the default value. -

    -
  1. webwork.multipart.parser - This should be set to a class that extends MultiPartRequest. Currently WebWork ships with two implementations. "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest" and "com.opensymphony.webwork.dispatcher.multipart.CosMultiPartRequest" If the property is not found the Pell parser is used.
  2. -
  3. webwork.multipart.saveDir - The directory where the uploaded files will be placed. If this property is not set it defaults to javax.servlet.context.tempdir.
  4. -
  5. webwork.multipart.maxSize - The maximum file size in bytes to allow for upload. This helps prevent system abuse by someone uploading lots of large files. The default value is 2 Megabytes and can be set as high as 2 Gigabytes (higher if you want to edit the Pell multipart source but you really need to rethink things if you need to upload files larger then 2 Gigabytes!) If you are uploading more than one file on a form the maxSize applies to the combined total, not the individual file sizes.
  6. -

-If you're happy with the defaults there is no need to put any of the properties in webwork.properties. Here is my current webwork.properties -
-
# don't really need to set this but I put it here for testing
# various values
webwork.multipart.parser=com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest

# put the uploaded files in /tmp. My application will move them to their
# final destination
webwork.multipart.saveDir=/tmp
-

Note, while you can set these properties to new values at runtime the MultiPartRequestWrapper is created and the file handled before your action code is called. So if you want to change values you must do so before this action. -

Sample form

- -
-
<%@ taglib uri="webwork" prefix="ww" %>

<html>
  <head>
   <title>File Upload Test</title>
  </head>
  <body>
    <h1>File Upload</h1>

    <form action="FileUpload.action" method="POST" enctype="multipart/form-data">

    <center>
      <table width="350" border="0" cellpadding="3" cellspacing="0">
      <tr>
        <td colspan="2"><input type="file" name="FileName" value="Browse..." size="50"/></td>
      </tr>
      <tr>
        <td colspan="2" align="center">
          <input type="submit" value="Submit">
        </td>
      </tr>
      </table>
    </center>
  </form>

</body>
</html>
-

That's all you have to do to upload a file. No coding required, the file will be placed in the default directory. However, that leaves us with no error checking among other things. So let's add some code to the Action. -

FileUploadAction.java

Before the action method is called the dispatcher will upload the file. Then we can get access to information about the file from MultiPartRequestWrapper. -
-
MultiPartRequestWrapper multiWrapper = 
		(MultiPartRequestWrapper) ServletActionContext.getRequest();
-

The first thing you should always do is check for errors. If there were any there's no point in continuing, most methods will return null. Unfortunately, currently there is no easy way to distinguish what error occured making it more difficult to route to different error pages. (I have improving error handling for file uploads on my stack of things I'd like to do sometime).

-
if (multiWrapper.hasErrors()) {
  Collection errors = multiWrapper.getErrors();
  Iterator i = errors.iterator();
  while (i.hasNext()) {
    addActionError((String) i.next());
  }
  return ERROR;
}
-
-

Now get the input tag name for the uploaded file and use that to get information on the transfer. Since you can upload multiple files (just add multiple input tags) at a time getFileNames returns an Enumeration of the names. -

-
Enumeration e = multiWrapper.getFileNames();

while (e.hasMoreElements()) {
   // get the value of this input tag
   String inputValue = (String) e.nextElement();

   // get the content type
   String contentType = multiWrapper.getContentType(inputValue);

   // get the name of the file from the input tag
   String fileName = multiWrapper.getFilesystemName(inputValue);

   // Get a File object for the uploaded File
   File file = multiWrapper.getFile(inputValue);

   // If it's null the upload failed
   if (file == null) {
      addActionError("Error uploading: " + multiWrapper.getFilesystemName(inputValue));
   }

   // Do additional processing/logging...
}
-
-

Further improvements.

Code above may be packed into one nice reusable component (Interceptor) that handles 90% of all typical file upload tasks. And Action does not know anything about web-app and just gets its files. Neat. See WW:File Upload Interceptor - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Webwork 2 skinning.html b/docs/chinese/wikidocs/Webwork 2 skinning.html deleted file mode 100644 index a9762dd41..000000000 --- a/docs/chinese/wikidocs/Webwork 2 skinning.html +++ /dev/null @@ -1,49 +0,0 @@ - - - WebWork 2 : Webwork 2 skinning - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Skinning in Webwork 2 can be done more than one way. We will show how to use two skins called "html" and "wml", and we'll be working with the following directory structure:

-
/WEB-INF
   /web.xml
/html
   /index.jsp
   /Register.jsp
/wml
   /index.jsp
   /Register.jsp
/index.jsp
-
-

Classic Approach

-If you want to go the Webwork 1.3 route, simply place all actions in the default namespace so that they are accessible from any URL path. When you create your views, place them in the sub-directory that corresponds with the skin's identifier. -

Your action configuration would look like this (simplified, without defined interceptors): -

-
<package name="default">
   <action name="registration" class="x.actionset.Register">
      <result name="success" type="dispatcher">
         <param name="location">Register.jsp</param>
      </result>
      <interceptor-ref name="defaultStack"/>
   </action>
</package>
-

If a user requested http://yoursite/html/register.action, he would see the JSP located at /html/Register.jsp. -

Namespace Defined

-If you require the use of namespaces, you can do the following:

Simplified configuration example: -

-
<package name="user" extends="default">
   <action name="register" class="x.x.actionset.Register">
      <result name="success" type="dispatcher">
         <param name="location">Register.jsp</param>
      </result>

      <interceptor-ref name="defaultStack"/>
  </action>
</package>

<package name="user-html" extends="user" namespace="/user/html" />
<package name="user-wml" extends="user" namespace="/user/wml" />
-

The last two package definitions extend the first package, changing only the namespace. The view result defined in the "register" action has a relative path. Because of this, you'll get the same behavior as the Classic Approach, but with the security of knowing that ONLY those two paths can be accessed for the action, instead of ANY path. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Webwork reference to OGNL access.html b/docs/chinese/wikidocs/Webwork reference to OGNL access.html deleted file mode 100644 index 9ad50ff1f..000000000 --- a/docs/chinese/wikidocs/Webwork reference to OGNL access.html +++ /dev/null @@ -1,42 +0,0 @@ - - - WebWork 2 : Webwork reference to OGNL access - - - - - - - - - -
- -
- This page last changed on Nov 30, 2004 by jcarreira. -
- -

Webwork uses a standard naming context to evaluate OGNL expressions. The top level object dealing with OGNL is a map (usually referred as a context map). OGNL has a concept of a root object (in webwork terms, this is the OGNLValueStack). Along with the root, other objects are placed in the context map (referred as in the context) including your session/application/request/attr maps. These objects have nothing to do with the root, they just exist along side it in the context map. So, to access these objects, the # is used telling ognl not to look in the root object, but within the rest of the context -

-
|             

                     |-- request
                     |
                     |--application
                     |
       context map---|--OgnlValueStack(root)
                     |
                     |--session
                     |
                     |--attr
                     |
                     |--parameters
-

Note that their are other objects in the context map, I'm just referring to a few for this example. Now, your actions instances are placed in the OGNLValueStack so you can refer to your bean properties without the #.

<ww: property value="myBean.myProperty"/>

for sessions,request, and the rest that lie in the context map
-ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
-<ww: property value="#session.mySessionPropKey"/> or
-<ww: property value="#session['mySessionPropKey']"/>

<ww: property value="#attr.mySessionPropKey"/>

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/What is Webwork.html b/docs/chinese/wikidocs/What is Webwork.html deleted file mode 100644 index 3ac0460a1..000000000 --- a/docs/chinese/wikidocs/What is Webwork.html +++ /dev/null @@ -1,62 +0,0 @@ - - - WebWork 2 : ʲôÊÇWebWork - - - - - - - - - -
- -
- ±¾Ò³ÓÉcasey×îºóÐÞ¸ÄÓÚ2004Äê12ÔÂ24ÈÕ. -
- -

»¶Ó­Ê¹ÓÃWebWork!

WebWorkÊÇÒ»¸öÇ¿´óµÄ»ùÓÚWebµÄMVC¿ò¼Ü, Ëü¹¹½¨ÔÚÒ»¸öÃüÁîģʽ¿ò¼ÜXWorkÖ®ÉÏ. WebWorkµÄÌØÐÔ°üÀ¨ÓÃÓÚ´¦Àí»ò´úÀíÇëÇóµÄ·Ö·¢Æ÷(Dispatcher), Ö§³Ö¶àÖÖÊÓͼ¼¼Êõ(JSP, Velocity, JasperReports, XML, FreeMarker)µÄ½á¹ûÀàÐÍ, Ò»¸öС¶øÇ¿´óµÄJSP±êÇ©¿âºÍVelocityºê¶¨Òå. ·Ö·¢Æ÷µ÷ÓÃXWork»î¶¯À´·ÃÎʺͲÙ×÷Ä£ÐÍ(Model)²¢ÎªÊÓͼÏÔʾģÐÍÊý¾ÝÌṩ·½±ãµÄ;¾¶. WebWorkÕæÕýµÄÓÅÊÆÔÚÓÚËüÇ¿µ÷¼ò½àºÍЭ×÷ÄÜÁ¦µÄ¸ù±¾ÀíÄî. ʹÓÃWebWork½«ÓÐÖúÓÚ×îС»¯´úÂë²¢ÔÊÐí¿ª·¢ÈËÔ±¸ü¶àµÄ¹Ø×¢ÒµÎñÂß¼­(business logic)ºÍ½¨Ä£(modeling)¶ø²»ÊÇÖîÈç±àдServletÖ®ÀàµÄÊÂÇé. -

ÌØÐÔ

    -
  • Áé»îµÄУÑé(validation)¿ò¼Ü, ÔÊÐíʹÓÃXMLÎļþ¶¨ÒåУÑ鲢ͨ¹ý½ØÈ¡Æ÷(Interceptor)ÔÚÔËÐÐʱ×Ô¶¯Ó¦Óõ½»î¶¯Àà(Action class), ´Ó¶ø´ïµ½Ð£ÑéÓë»î¶¯ÀàÖ®¼äµÄÍêÈ«½âź(decoupled). а汾»¹Ö§³Ö¿Í»§¶ËУÑé.
  • -
  • ÀàÐÍת»¯(Type conversion)¿ÉÒÔºÜÈÝÒ׵Ľ«¶ÔÏó´ÓÒ»¸öÀàת»»³ÉÁíÒ»¸öÀà
  • -
  • Ç¿´óµÄ±í´ïʽÓïÑÔ(Expression Language, EL)½¨Á¢ÔÚOGNL»ù´¡Ö®ÉÏ, ÔÊÐí±éÀú¶¯Ì¬¶ÔÏóͼ, Ö´ÐжÔÏó·½·¨ÒÔ¼°Ê¹ÓÃÖµÕ»(ValueStack)ʵÏÖ¶Ô¶à¸öJavaBeanÊôÐÔµÄ͸Ã÷·ÃÎÊ. WebworkÒ²¿ÉÒÔʹÓÃJSTL.
  • -
  • ʹÓ÷´×ª¿ØÖÆ(Inversion of Control, IoC)¹ÜÀí×é¼þ(component)ÉúÃüÖÜÆÚºÍÒÀÀµ¹ØÏµ, ²»ÐèÒª±àдע²áÀà´´½¨×é¼þ, ×é¼þ¿Í»§Ò²²»ÐèÒªÖ÷¶¯»ñÈ¡×é¼þʵÀý(instance).
  • -
  • VelocityÄ£°æ, ʹµÃ¿ª·¢ÈËÔ±¿ÉÒÔºÜÈÝÒ׵͍֯WebÒ³ÃæµÄÍâ¹Û(look & feel).
  • -
  • ½ØÈ¡Æ÷(Interceptors)¿ÉÒÔ¶¯Ì¬½ØÈ¡»î¶¯(Action)Ö´ÐÐǰºóµÄ´¦Àí¹ý³Ì, Õâ¼ò»¯Á˻µÄ´úÂë²¢Ìá¸ßÁË´úÂ븴ÓÃÄÜÁ¦.
  • -
  • Ö§³Ö¹ú¼Ê»¯(I18n).
  • -
  • ¿ÉÒÔ·½±ãµÄÓëÆäËûµÚÈý·½Èí¼þ¼¯³É, °üÀ¨Hibernate, Spring, Pico, Sitemesh.
  • -
  • Ö§³Ö¶àÖÖÊÓͼ¼¼ÊõÈç: JSP, Velocity, FreeMarker, JasperReports, XML.
  • -
  • ʹÓðü(Packages)ºÍÃû¿Õ¼ä(Namespaces)¹ÜÀíÊýÒ԰ټƵĻ.
  • -
-

±³¾°ÓëÄ¿µÄ

WebWorkÊÇÒ»¸ö¿ª·ÅÔ´´úÂëÏîÄ¿, Ä¿±êÊÇΪÔÚ¶Ìʱ¼äÄÚ¹¹½¨¸´ÔÓÍøÕ¾ÌṩÒ×ÓÚÀí½âºÍά»¤µÄ¹¤¾ß¼°¿ª·¢¿ò¼Ü. JavaÊÇÒ»¸öƽ̨ÒÔ¼°»ùÓÚ¸ÃÆ½Ì¨µÄÓïÑÔ, ¾¡¹ÜËûÖ§³Öalthough it supports many others as the language in which systems are built, such as JavaScript and XML.

WebWorkÔÚ¹¹¼ÜÉÏ»ùÓÚ×î¼Ñʵ¼ùºÍÄÇЩÒѱ»Ö¤ÊµÓмÛÖµµÄÉè¼ÆÄ£Ê½. Ëü»¹»ùÓÚÒ»¸öÇ¿Áҵ͝»ú: ¾¡¿ÉÄܵļòµ¥, ²¢¾ßÓÐά»¤ÉϵÄÁé»îÐÔ(Õâʵ¼ÊÉÏÊÇÒ»¸öÀ§ÄÑµÄÆ½ºâ).

ËüÒ²¹ÄÀøÓû§Ê¹ÓÃÇ¡µ±µÄ, ·ûºÏÐèÒªµÄ·½Ê½¹¤×÷. [It also encourages you, as a user, to do things the way you seem fit for your needs.] WebWorkÄÜÒÔ¶àÖÖ·½Ê½ÅäÖúÍʹÓÃ, ÄÄÖÖ·½Ê½¸üÊʺÏÓÚÄãÒÀÀµÓÚʹÓû·¾³. ÏÂÃæÊÇÒ»¸öÀý×Ó, WebWorkÖ§³Ö¶àÖÖ²»Í¬µÄHTMLÉú³É¼¼ÊõÈçJSP, VelocityÄ£°æÒýÇæºÍXSLT. ËüÃÇÖ®¼äÔÚÀíÄîÉϺͼ¼ÊõÉ϶¼´æÔںܴóµÄ²î±ð, µ«¶¼ÄÜΪWebWorkËùÓÃ, ͬʱ, ²»Í¬µÄÓû§È·ÊµÐèÒªÕâЩ²»Í¬µÄ·½Ê½. "Äã²»ÄÜÄÇô×ö"ÊÇÎÒÃǾ¡¿ÉÄܱÜÃâµÄÒ»¾ä»°, ¶ø"ÎÒÃDz»ÄÜ"ÍùÍùÊÇÒòΪÓÐÁíÒ»¸ö¸üºÃ, ¸üÊʺϵŤ¾ß.

WebWork¶ÔMVC Model-1ºÍModel-2µÄÖ§³Ö

WebÓ¦Óÿª·¢¿ò¼ÜµÄ×îÖØÒªµÄÒ»¸öÈÎÎñÊÇÖ§³ÖÂß¼­, ÄÚÈÝ, ±íÏÖÏà·ÖÀëµÄÀíÄî. Èç¹ûûÓÐ×öµ½ÕâÒ»µã, ͨ³£»áµ¼ÖÂά»¤ÉϵÄÎÊÌâ, Èç¹û¿ª·¢ÍŶӽṹ¸´ÔÓ(ÒòΪÿһ¸öÍŶӳÉԱͨ³£Ö»¸ºÔðÓ¦ÓõÄijһ·½Ãæ(aspect)), »¹»áʹӦÓõĿª·¢±äµÃ¸ü¼ÓÀ§ÄÑ. ´ïµ½·ÖÀëÄ¿µÄµÄÒ»°ã·½·¨ÊDzÉÓÃMVC(Model-View-Controller)Éè¼ÆÄ£Ê½. ¸Ãģʽ¹ÄÀøÊ¹Ó÷ÖÀëµÄ´úÂëÀ´´¦ÀíÄ£ÐÍ(model, ¼´"ÒµÎñÂß¼­"), ¿ØÖÆÆ÷(controller, ¼´"Ó¦ÓÃÂß¼­")ºÍÊÓͼ(view). ÕâÑù·ÖÀëÖ®ºó, ÏÂÒ»¸öÎÊÌâÊÇ: ¿ØÖÆÆ÷µÄ´úÂëÓë±íÏÖ²¿·ÖÈçºÎ½»»¥. ÓÐÁ½ÖÖ³£ÓõÄÉè¼ÆÄ£ÐÍ¿ÉÒÔ×öµ½ÕâÒ»µã, ËüÃǷֱ𱻳ÆÎªModel-1ºÍModel-2. ÕâÁ½ÖÖÄ£Ðͽ«ÔÚÏÂÎÄÃèÊö.

Model-1

Model-1·½Ê½µÄ»ù±¾Ïë·¨ÊÇÔÚ±íʾ²ã(presentation layer)ÈçJSP»òÄ£°æÖе÷ÓÿØÖÆÆ÷´úÂë. Èç¹ûÄãÕýÔÚʹÓÃJSP, ÕâÒâζ×ÅÄã¿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½Ö´ÐÐÄãµÄWebWork»î¶¯£º ʹÓÃ"webwork:action"±êÇ©µ÷ÓÃÖ´ÐÐ; »òʹÓÃ"webwork:bean"±êÇ©Ïñµ÷ÓÃJavaBeansÒ»ÑùÖ´Ðл.

Model-2

ÔÚModel-2·½Ê½ÖÐ, ÄÄЩ´úÂëµ÷ÓÿØÖÆÆ÷ÒÔ¼°ÄÄЩÊÓͼ½øÐÐչʾÓɵÚÈý·½¾ö¶¨, ͨ³£ÊÇÒ»¸öservlet·Ö·¢Æ÷. ·Ö·¢Æ÷½âÂëHTTPÇëÇóÖеÄURL, È»ºó¾ö¶¨Ö´ÐÐÄÄЩ´úÂë. Ò»¸ö°üº¬¿ØÖÆÆ÷´úÂëµÄJava¶ÔÏó±»»ñÈ¡²¢Ö´ÐÐ, ´Ó¶øÍê³É¶Ôij¸öÓ¦ÓÃÂß¼­ºÍÒµÎñÂß¼­µÄ´¦Àí. µ±Ö´ÐнáÊøºó, ·Ö·¢Æ÷½«ÇëÇóת½»(forward)¸øÒ»¸öÊÓͼ´¦ÀíÆ÷(ÈçÒ»¸öJSP), ËüʹÓÃǰһ¸ö´¦ÀíµÄÊý¾Ý»æÖƽá¹ûÊÓͼ.

ÈçºÎÑ¡ÔñʹÓÃ?

ÓÉÓÚ¿ØÖÆÆ÷Âß¼­Óë±íÏÖÉú³ÉÍêÈ«½âź, ʹµÃ¸ù¾ÝÖ´ÐÐÇé¿öÀ´ÏÔʾ²»Í¬½á¹ûÒ³Ãæ³ÉΪ¿ÉÄÜ. ÀýÈç, Èç¹û´¦Àí³öÏÖ´íÎó¾Í¿ÉÒÔÏÔʾһ¸ö´íÎóÒ³Ãæ¶ø²»ÏÔʾÕý³£µÄ½á¹ûÒ³Ãæ.

Model-1·½Ê½µÄÓŵãÈçÏÂ.
- -
    -
  • ²»ÐèÒª½¨Á¢´úÂëÓë±íʾ֮¼äµÄÓ³Éä¹ØÏµ.
  • -
  • Ò×Óڲ쿴JSP»òÄ£°æÖÐÖ´ÐÐÁËÄÄЩ´úÂë.
  • -
  • Èç¹ûÒ³ÃæÖеÄÒ»²¿·ÖÒªÇóij¸ö´¦Àí¹ý³ÌÖ»ÔÊÐí³É¹¦(·ñÔòϵͳʧÁé), ÄÇôÕâЩ´úÂëµ÷ÓúͱíÏÖ²¿·ÖµÄ´úÂë(ÈçJSP±êÇ©¿âºÍHTML)²»±Ø·ÖÀ뵽еĻºÍJSPÒ³ÃæÖд¦Àí¹ý³Ì. ÕâÑù¿ÉÒÔÌá¸ßÐÔÄܺͿɶÁÐÔ.
  • -

-Model-2·½Ê½µÄÓŵãÈçÏÂ.
- -
    -
  • ´úÂëºÍ±íÏÖ³¹µ×·ÖÀë. ͬһ¸ö±íÏÖÒ³Ãæ¿ÉÒÔ±»¶à¸ö²»Í¬µÄ»î¶¯¸´ÓÃ, ÕâЩ»î¶¯¿ÉÒÔ·ÃÎʲ»Í¬µÄÊý¾Ýµ«Ê¹ÓÃÏàͬµÄ·½Ê½Õ¹Ê¾.
  • -
  • Èç¹ûÒ»¸ö»î¶¯¿ÉÄܵ¼Ö¶àÖÖ״̬, Èç"³É¹¦", "ÐèÒªÖØÐÂÊäÈë", »ò"³öÏÖ´íÎó", ÄÇôʹÓÃModel-2·½Ê½¿ÉÒÔºÜÈÝÒ׵Ľ«ÕâЩ״̬ӳÉäµ½²»Í¬µÄÒ³Ãæ.
  • -

-Ñ¡ÔñʹÓõÄÊ×ÒªÔ­ÔòÊÇ: µ±´úÂë½ö½öÊÇ»ñÈ¡²¢ÏÔʾÊý¾Ý(Õâ±»³ÆÎªread-type code)ʱʹÓÃModel-1, Ö»Òªµ±Ä£ÐÍÊÇÓɻ»òÒ»¸ö´¦ÀíÁ÷³ÌËù¸Ä±äʱ¾ÍÓ¦µ±Ê¹ÓÃModel-2. - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/XSL Result.html b/docs/chinese/wikidocs/XSL Result.html deleted file mode 100644 index 3d3c1ca53..000000000 --- a/docs/chinese/wikidocs/XSL Result.html +++ /dev/null @@ -1,50 +0,0 @@ - - - WebWork 2 : XSL Result - - - - - - - - - -
- -
- This page last changed on Dec 13, 2004 by casey. -
- -

XML/XSL

-ÓëXSLT½Ó¿Ú.

- - - - - - - -
²ÎÊý ±ØÐè ÃèÊö
location ÊÇ Ö´ÐкóÌø×ªµÄλÖÃ
parse ·ñ ȱʡΪtrue. Èç¹ûÉèΪfalse, location²ÎÊý½«²»×÷ΪOgnl±í´ïʽ½øÐнâÎö
-
-
<result name="success" type="xslt">foo.xslt</result>
-

- - - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/Xwork's Component Architecture.html b/docs/chinese/wikidocs/Xwork's Component Architecture.html deleted file mode 100644 index 2928540d6..000000000 --- a/docs/chinese/wikidocs/Xwork's Component Architecture.html +++ /dev/null @@ -1,61 +0,0 @@ - - - WebWork 2 : Xwork×é¼þ¼Ü¹¹ - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

±àд×é¼þÀà

ÔÚXWorkÖÐ, ×é¼þÀà¿ÉÒÔÊÇÄãÏ£ÍûµÄÈκÎÊÂÎï. ΨһµÄÔ¼ÊøÊDZØÐëÓÐÒ»¸ö¾ßÌå(concrete)Àà, ËüÓÐÒ»¸öȱʡ¹¹Ô캯Êý, ÕâÑùXWork²ÅÄÜ´´½¨ÊµÀý. ×é¼þ¿ÉÒÔʵÏÖInitializableºÍDisposable½Ó¿ÚÕâÑùÔÚ´´½¨ºóºËÏú»áǰ¿ÉÒÔ½ÓÊܵ½ÉúÃüÖÜÆÚʼþ. ÕâºÜ¼òµ¥:
- -
-
public class MyComponent implements Intializable, Disposable {
    public void init () {
         //do initialization here
    }

    public void dispose() {
         //do any clean up necessary before garbage collection of this component
    }
}
-

×é¼þÒÀÀµ

Ò»¸ö²»ÄÇôÃ÷ÏÔµÄÌØÐÔÊÇ×é¼þ¿ÉÒÔÒÀÀµÓÚÆäËû×é¼þ. ÀýÈç: Èç¹ûExchangeRateServiceÒÀÀµÓÚConfiguration×é¼þ, XWork½«ÔÚExchangeRateService³õʼ»¯ºóÏòËü´«µÝConfiguration×é¼þʵÀý. ×¢Òâ, XWork×Ô¶¯ÒÔÕýÈ·µÄ˳Ðò³õʼ»¯×é¼þ, Èç¹ûAÊÇÒ»¸öÒÀÀµÓÚBºÍCµÄ×é¼þ»ò»î¶¯, BÒÀÀµÓÚC, Èç¹ûA, B, C֮ǰûÓб»³õʼ»¯, ComponentManager½«Ê¹ÓÃÏÂÃæµÄ˳Ðò:
- -
    -
  1. ³õʼ»¯C, Èç¹ûCʵÏÖÁËInitializable¾Íµ÷ÓÃinit()·½·¨.
  2. -
  3. ³õʼ»¯B, ²¢Ê¹ÓÃenabler·½·¨ÉèÖÃC.
  4. -
  5. Èç¹ûBʵÏÖÁËInitializable¾Íµ÷ÓÃinit()·½·¨.
  6. -
  7. µ÷ÓÃBµÄenabler·½·¨½«BÉèÖõ½A.
  8. -

-µ±È», Èç¹ûB»òCµÄʵÀýÒѾ­´æÔÚÔò½«ÔÚ±¾ÀýÖи´ÓÃ, ʾÀý½«Ö±½Ó´«µÝµ½AÖÐ -.

±àдEnabler

EnablerÖ»ÄÜÓÐÒ»¸ö·½·¨, ·½·¨Ö»½ÓÊÜÒ»¸ö²ÎÊý. ²ÎÊýÀàÐÍÓ¦µ±ÊÇËùÐèµÄ×é¼þµÄÀàÐÍ»òÕß×é¼þµÄ¸¸ÀàÐÍ. XWork²»¹ØÐÄenabler·½·¨Ãû³Æ.

ÏÂÁÐչʾExchangeRateAware¿ÉÄÜʹÓõĴúÂë:

-
public interface ExchangeRateAware {
    public void setExchangeRateService(ExchangeRateService exchangeRateService);
}
-

×¢Òâenablerͨ³£ÊÇÒ»¸ö½Ó¿Ú, µ±È»Ò²Ã»ÓÐ×èÖ¹ÄãÑ¡ÔñʹÓÃÀà.

±àд"Enabler-aware"µÄ»î¶¯

»î¶¯ÀàÐèÒª×öµÄÊÇʵÏÖÏàÓ¦µÄenabler½Ó¿Ú. XWorkËæºó½«ÔڻִÐÐǰµ÷ÓÃËüµÄenabler·½·¨. ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄÀý×Ó:

-
public class MyAction extends ActionSupport implements ExchangeRateAware {
    ExchangeRateService ers;
    
    public void setExchangeRateService(ExchangeRateService exchangeRateService) {
        ers = exchangeRateService;
    }
    
    public String execute() throws Exception {
        System.out.println("The base currency is " + ers.getBaseCurrency());
    }
}
-

Èç¹ûÒ»¸ö¶ÔÏó¼È²»ÊǻҲ²»ÊÇ×é¼þ, Äã±ØÐëÏÔʾµ÷ÓÃcomponentManager.initializeObject(enabledObject)֪ͨXWorkΪ¸Ã¶ÔÏóÌṩËùÐèµÄ×é¼þ;

ʹÓÃÍⲿÒýÓô¦ÀíÆ÷(resolver)

ÔÚXWorkÒ²¿ÉÒÔʹÓÃÍⲿÒýÓô¦ÀíÆ÷, Ò²¾ÍÊÇ˵, ²»ÓÉXWork×Ô¼º´¦ÀíÒýÓÃ. Ò»¸öÀý×ÓÊÇʹÓÃÍⲿÒýÓô¦ÀíÆ÷½«XWorkºÍSpring Framework¼¯³ÉÆðÀ´.

Ö»ÐèÒª±àдһ¸öÍⲿÒýÓô¦ÀíÆ÷²¢ÔÚpackageÉùÃ÷ÖиæËßXWorkȥʹÓÃËü: -
-
<package
    name="default"
    externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
-

-ÏÖÔÚ, ΪÁËʹÓÃÍⲿÒýÓÃÄãÐèҪʹÓÃÀàËÆÏÂÃæµÄ·½·¨: -
-
<external-ref name="foo">Foo</external-ref>
-

-ÔÚÕâÀï, nameÊôÐÔÊÇsetter·½·¨µÄÃû³Æ, FooÊÇÐèÒª²éÕÒµÄÒýÓÃÃû³Æ.

¹ØÓÚ¼¯³ÉµÄ¸ü¶àϸ½ÚºÍÑùÀý´úÂë, Çë²é¿´com.opensymphony.xwork.config.ExternalReferenceResolverÀàµÄJavaDoc(²»ÐÒµÄÊÇûÓÐÔÚÏßÐÅÏ¢)ÒÔ¼°XW-122

-Chris - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/border/border_bottom.gif b/docs/chinese/wikidocs/border/border_bottom.gif deleted file mode 100644 index b93012ac2..000000000 Binary files a/docs/chinese/wikidocs/border/border_bottom.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/border/spacer.gif b/docs/chinese/wikidocs/border/spacer.gif deleted file mode 100644 index fc2560981..000000000 Binary files a/docs/chinese/wikidocs/border/spacer.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/blogentry_16.gif b/docs/chinese/wikidocs/icons/blogentry_16.gif deleted file mode 100644 index 83d600d09..000000000 Binary files a/docs/chinese/wikidocs/icons/blogentry_16.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/bullet_blue.gif b/docs/chinese/wikidocs/icons/bullet_blue.gif deleted file mode 100644 index 25bfa0cf2..000000000 Binary files a/docs/chinese/wikidocs/icons/bullet_blue.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/comment_16.gif b/docs/chinese/wikidocs/icons/comment_16.gif deleted file mode 100644 index 6f76e86bd..000000000 Binary files a/docs/chinese/wikidocs/icons/comment_16.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/add.png b/docs/chinese/wikidocs/icons/emoticons/add.png deleted file mode 100644 index ad794dc72..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/add.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/biggrin.gif b/docs/chinese/wikidocs/icons/emoticons/biggrin.gif deleted file mode 100644 index ad0403198..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/biggrin.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/check.png b/docs/chinese/wikidocs/icons/emoticons/check.png deleted file mode 100644 index deefc129d..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/check.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/error.png b/docs/chinese/wikidocs/icons/emoticons/error.png deleted file mode 100644 index 24e260184..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/error.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/forbidden.png b/docs/chinese/wikidocs/icons/emoticons/forbidden.png deleted file mode 100644 index d33897164..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/forbidden.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/help_16.gif b/docs/chinese/wikidocs/icons/emoticons/help_16.gif deleted file mode 100644 index 83387c25c..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/help_16.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/information.png b/docs/chinese/wikidocs/icons/emoticons/information.png deleted file mode 100644 index c7c9a4781..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/information.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/lightbulb.png b/docs/chinese/wikidocs/icons/emoticons/lightbulb.png deleted file mode 100644 index 451834ce9..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/lightbulb.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/lightbulb_on.png b/docs/chinese/wikidocs/icons/emoticons/lightbulb_on.png deleted file mode 100644 index 9e42542a2..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/lightbulb_on.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/sad.gif b/docs/chinese/wikidocs/icons/emoticons/sad.gif deleted file mode 100644 index 6aca31070..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/sad.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/smile.gif b/docs/chinese/wikidocs/icons/emoticons/smile.gif deleted file mode 100644 index f8dc2782a..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/smile.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/star_blue.png b/docs/chinese/wikidocs/icons/emoticons/star_blue.png deleted file mode 100644 index 2eb9db986..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/star_blue.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/star_green.png b/docs/chinese/wikidocs/icons/emoticons/star_green.png deleted file mode 100644 index 0343b7f87..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/star_green.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/star_red.png b/docs/chinese/wikidocs/icons/emoticons/star_red.png deleted file mode 100644 index cffcdef94..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/star_red.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/star_yellow.png b/docs/chinese/wikidocs/icons/emoticons/star_yellow.png deleted file mode 100644 index 9d695b19d..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/star_yellow.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/thumbs_down.gif b/docs/chinese/wikidocs/icons/emoticons/thumbs_down.gif deleted file mode 100644 index f0dc4bf2d..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/thumbs_down.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/thumbs_up.gif b/docs/chinese/wikidocs/icons/emoticons/thumbs_up.gif deleted file mode 100644 index 6a8a26e9c..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/thumbs_up.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/tongue.gif b/docs/chinese/wikidocs/icons/emoticons/tongue.gif deleted file mode 100644 index fe77df2fa..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/tongue.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/warning.png b/docs/chinese/wikidocs/icons/emoticons/warning.png deleted file mode 100644 index 56ad042e5..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/warning.png and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/emoticons/wink.gif b/docs/chinese/wikidocs/icons/emoticons/wink.gif deleted file mode 100644 index 24bdea960..000000000 Binary files a/docs/chinese/wikidocs/icons/emoticons/wink.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/home_16.gif b/docs/chinese/wikidocs/icons/home_16.gif deleted file mode 100644 index 7a902b1be..000000000 Binary files a/docs/chinese/wikidocs/icons/home_16.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/linkext7.gif b/docs/chinese/wikidocs/icons/linkext7.gif deleted file mode 100644 index f2dd2dcfa..000000000 Binary files a/docs/chinese/wikidocs/icons/linkext7.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/mail_16.gif b/docs/chinese/wikidocs/icons/mail_16.gif deleted file mode 100644 index 0386c0d10..000000000 Binary files a/docs/chinese/wikidocs/icons/mail_16.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/mail_small.gif b/docs/chinese/wikidocs/icons/mail_small.gif deleted file mode 100644 index a3b7d9f06..000000000 Binary files a/docs/chinese/wikidocs/icons/mail_small.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/user_12.gif b/docs/chinese/wikidocs/icons/user_12.gif deleted file mode 100644 index d41511f1b..000000000 Binary files a/docs/chinese/wikidocs/icons/user_12.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/icons/user_16.gif b/docs/chinese/wikidocs/icons/user_16.gif deleted file mode 100644 index f5a2fb6a3..000000000 Binary files a/docs/chinese/wikidocs/icons/user_16.gif and /dev/null differ diff --git a/docs/chinese/wikidocs/index.html b/docs/chinese/wikidocs/index.html deleted file mode 100644 index 0c2ebbb87..000000000 --- a/docs/chinese/wikidocs/index.html +++ /dev/null @@ -1,904 +0,0 @@ - - - WW (WebWork 2) - - - - - - - - -
-
-

Space Details:

-
- - - - - - - - - - - - - - - - - - - - - -
- Key: - WW
- Name: - WebWork 2
- Description: -
- Creator (Creation Date): - plightbo (Apr 18, 2004)
- Last Modifier (Mod. Date): - plightbo (May 18, 2004)
-
-
-

-

Available Pages:

- -

-
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:36
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/navpanel.jsp b/docs/chinese/wikidocs/navpanel.jsp deleted file mode 100644 index a9c90cfc0..000000000 --- a/docs/chinese/wikidocs/navpanel.jsp +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/chinese/wikidocs/styles/site.css b/docs/chinese/wikidocs/styles/site.css deleted file mode 100644 index 69e489c81..000000000 --- a/docs/chinese/wikidocs/styles/site.css +++ /dev/null @@ -1,984 +0,0 @@ -body, p, td, table, tr, .bodytext, .stepfield { - font-family: Verdana, arial, sans-serif; - font-size: 11px; - line-height: 16px; - color: #000000; - font-weight: normal; -} - -body { - margin: 0px; - padding: 0px; - text-align: center; - background-color: #f0f0f0; -} - -.monospaceInput { - font:12px monospace -} - -p.paragraph { - margin: 5px 0px 5px 0px; - padding: 0px; -} - -ul, ol { - margin-top: 2px; - margin-bottom: 2px; - padding-top: 0px; - padding-bottom: 0px; -} - -pre { - padding: 0px; - margin-top: 5px; - margin-left: 15px; - margin-bottom: 5px; - margin-right: 5px; - text-align: left; -} - -.code { - border: 1px dashed #3c78b5; - font-size: 11px; - font-family: Courier; - margin: 10px; - line-height: 13px; -} - -.focusedComment { - background: #ffffce; -} - -.commentBox, .focusedComment { - padding: 10px; - margin: 5px 0 5px 0; - border: 1px #bbb solid; -} - -.codeHeader { - background-color: #f0f0f0; - border-bottom: 1px dashed #3c78b5; - padding: 3px; - text-align: center; -} - -.codeContent { - text-align: left; - background-color: #f0f0f0; - padding: 3px; -} - -.preformatted { - border: 1px dashed #3c78b5; - font-size: 11px; - font-family: Courier; - margin: 10px; - line-height: 13px; -} - -.preformattedHeader { - background-color: #f0f0f0; - border-bottom: 1px dashed #3c78b5; - padding: 3px; - text-align: center; -} - -.preformattedContent { - background-color: #f0f0f0; - padding: 3px; -} - -.panel { - border: 1px dashed #3c78b5; - margin: 10px; -} - -.panelHeader { - background-color: #f0f0f0; - border-bottom: 1px dashed #3c78b5; - padding: 3px; - text-align: center; -} - -.panelContent { - background-color: #f0f0f0; - padding: 5px; -} - -.anonymousAlert { - background-color: #f0f0f0; - border: 1px dashed red; - font-size: 11px; - padding: 10px 5px 10px 5px; - margin: 4px; - line-height: 13px; -} - -.lockAlert { - background-color: #f0f0f0; - width: 50%; - border: 1px dashed red; - font-size: 11px; - padding: 10px 5px 10px 5px; - margin: 4px; - line-height: 13px; -} - - -.java-keyword { - color: #000091; - background-color: inherit; -} - -.java-object { - color: #910091; - background-color: inherit; -} - -.java-quote { - color: #009100; - background-color: inherit; -} - -.java-comment { - color: #808080; - background-color: inherit; -} - -.javascript-keyword { - color: #000091; - background-color: inherit; -} - -.javascript-object { - color: #910091; - background-color: inherit; -} - -.javascript-quote { - color: #009100; - background-color: inherit; -} - -.javascript-comment { - color: #808080; - background-color: inherit; -} - -.actionscript-keyword { - color: #000091; - background-color: inherit; -} - -.actionscript-object { - color: #910091; - background-color: inherit; -} - -.actionscript-quote { - color: #009100; - background-color: inherit; -} - -.actionscript-comment { - color: #808080; - background-color: inherit; -} - -.xml-keyword { - font-weight: bold; -} - -.xml-tag { - color: #000091; - background-color: inherit; -} - -.xml-quote { - color: #009100; - background-color: inherit; -} - -.xml-comment { - color: #808080; - background-color: inherit; -} - -.sql-keyword { - color: #000091; - background-color: inherit; -} - -.sql-object { - color: #910091; - background-color: inherit; -} - -.sql-quote { - color: #009100; - background-color: inherit; -} - -.breadcrumbs { - background-color: #f0f0f0; - border-color: #3c78b5; - border-width: 1px 0px 1px 0px; - border-style: solid; - font-size: 11px; - padding: 3px 0px 3px 0px; -} - -.navmenu { - border: 1px solid #ccc; -} - -.menuheading { - font-weight: bold; - background-color: #f0f0f0; - border-bottom: 1px solid #3c78b5; - padding: 4px 4px 2px 4px; -} - -.menuitems { - padding: 4px 4px 20px 4px; -} - -.helpheading { - font-weight: bold; - background-color: #D0D9BD; - border-bottom: 1px solid #3c78b5; - padding: 4px 4px 4px 4px; - margin: 0px; -} -.helpcontent { - padding: 4px 4px 20px 4px; - background-color: #f5f7f1; -} -.helptab-unselected { - font-weight: bold; - padding: 5px; - background-color: #f5f7f1; -} -.helptab-selected { - font-weight: bold; - background-color: #D0D9BD; - padding: 5px; -} -.helptabs { - margin: 0px; - background-color: #f5f7f1; - padding: 5px; -} -.infopanel-heading { - font-weight: bold; - border-bottom: 1px solid #3c78b5; - padding: 4px 0px 2px 0px; -} - -#Content { - text-align: left; - background-color: #fff; - padding: 0px; - margin: 0px; - border-top: 10px solid #669900; -} - -.pagebody { -} - -.pageheader { - padding: 5px 5px 5px 0px; - border-bottom: 1px solid #3c78b5; -} - -.pagetitle { - font-size: 22px; - font-weight: bold; - font-family: Arial, sans-serif; - color: #003366; -} - -.steptitle { - font-size: 18px; - font-weight: bold; - font-family: Arial, sans-serif; - color: #003366; - margin-bottom: 7px; -} - -.stepdesc { - font-family: Verdana, arial, sans-serif; - font-size: 11px; - line-height: 16px; - font-weight: normal; - color: #666666; - margin-top: 7px; - margin-bottom: 7px; -} - -.steplabel { - font-weight: bold; - margin-right: 4px; - color: black; - float: left; - width: 15%; - text-align: right; -} - -.stepfield { - background: #f0f0f0; - padding: 5px; -} - -.tabletitle { - font-size: 14px; - font-weight: bold; - font-family: Arial, sans-serif; - padding: 3px 0px 2px 0px; - margin: 8px 4px 2px 0px; - color: #003366; - border-bottom: 1px solid #3c78b5; -} -.pagesubheading { - color: #666666; - font-size: 10px; - padding: 0px 0px 5px 0px; -} - -HR { - color: 3c78b5; - height: 1; -} - -A:link, A:visited, A:active, A:hover { - color: #003366; -} - -h1 A:link, h1 A:visited, h1 A:active { - text-decoration: none; -} - -h1 A:hover { - border-bottom: 1px dotted #003366; -} - - -.logocell { - padding: 10px; -} - -input { - font-family: verdana, geneva, arial, sans-serif; - font-size: 11px; - color: #000000; -} - -textarea, textarea.editor { - font-family: verdana, geneva, arial, sans-serif; - font-size: 11px; - color: #333333; -} - -.spacenametitle { - font: 31px/41px Impact, Arial, Helvetica; - font-weight: 100; - color: #999999; - margin: 0px; -} -.spacenametitle img { - margin: 0 0 -4px 0; -} -.spacenametitle a { - text-decoration: none; - color: #999999; -} -.spacenametitle a:visited { - text-decoration: none; - color: #999999; -} -.spacenametitle-printable { - font: 20px/25px Impact, Arial, Helvetica; - font-weight: 100; - color: #999999; - margin: 0px; -} -.spacenametitle-printable a { - text-decoration: none; - color: #999999; -} -.spacenametitle-printable a:visited { - text-decoration: none; - color: #999999; -} - -.blogHeading { - font-size: 20px; - line-height: normal; - font-weight: bold; - padding: 10px 0px 0px 0px; - margin: 10px 0px 0px 0px; -} - -h1 { - font-size: 24px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - color: #003366; - border-bottom: 1px solid #3c78b5; - padding: 2px; - margin: 36px 0px 4px 0px; -} - -h2 { - font-size: 18px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - border-bottom: 1px solid #3c78b5; - padding: 2px; - margin: 27px 0px 4px 0px; -} - -h3 { - font-size: 14px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 21px 0px 4px 0px; -} - -h4 { - font-size: 12px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 18px 0px 4px 0px; -} - -h4.search { - font-size: 12px; - line-height: normal; - font-weight: normal; - background-color: #f0f0f0; - padding: 4px; - margin: 18px 0px 4px 0px; -} - -h5 { - font-size: 10px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 14px 0px 4px 0px; -} - -h6 { - font-size: 8px; - line-height: normal; - font-weight: bold; - background-color: #f0f0f0; - padding: 2px; - margin: 14px 0px 4px 0px; -} - -.smallfont { - font-size: 10px; -} -.descfont { - font-size: 10px; - color: #666666; -} -.smallerfont { - font-size: 9px; -} -.smalltext { - color: #666666; - font-size: 10px; -} -.smalltext a { - color: #666666; -} -.smalltext-blue { - color: #3c78b5; - font-size: 10px; -} -.surtitle { - margin-left: 1px; - margin-bottom: 5px; - font-size: 14px; - color: #666666; -} - -/* css hack found here: http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */ -.navItemOver { font-size: 10px; font-weight: bold; color: #dedede; background-color: #669900; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;} -.navItemOver a { color: #dedede; background-color:#669900; text-decoration: none; } -.navItemOver a:visited { color: #dedede; background-color:#669900; text-decoration: none; } -.navItemOver a:hover { color: #dedede; background-color:#669900; text-decoration: none; } -.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #99CCFF; } -.navItem a { color: #666666; text-decoration: none; } -.navItem a:hover { color: #666666; text-decoration: none; } -.navItem a:visited { color: #666666; text-decoration: none; } - -div.padded { padding: 4px; } -h3.macrolibrariestitle { - margin: 0px 0px 0px 0px; -} - -div.centered { text-align: center; margin: 10px; } -div.centered table {margin: 0px auto; text-align: left; } -.grid { - margin: 2px 0px 5px 0px; - border-collapse: collapse; -} -.grid th { - border: 1px solid #ccc; - padding: 2px 4px 2px 4px; - background: #f0f0f0; - text-align: center; -} -.grid td { - border: 1px solid #ccc; - padding: 3px 4px 3px 4px; -} -.gridHover { - background-color: #f9f9f9; -} - -td.infocell { - background-color: #f0f0f0; -} -.label { - font-weight: bold; -} -.error { - background-color: #fcc; -} -.errorBox { - background-color: #fcc; - border: 1px solid #c00; - padding: 5px; - margin: 5px; -} -.errorMessage { - color: #c00; -} - -blockquote { - padding-left: 10px; - padding-right: 10px; - margin-left: 5px; - margin-right: 0px; - border-left: 1px solid #3c78b5; -} - -.wikitable, .wiki-table { - margin: 5px; - border-collapse: collapse; -} -.wikitable td, .wikitable th, .wiki-table td, .wiki-table th { - border: 1px solid #ccc; - padding: 3px 4px 3px 4px; -} -.wikitable th, .wiki-table th { - background: #f0f0f0; - text-align: center; -} - -DIV.small { - font-size: 9px; -} - -H1.pagename { - margin-top: 0px; -} - -IMG.inline {} - -.loginform { - margin: 5px; - border: 1px solid #ccc; -} - -/* The text how the "This is a preview" comment should be shown. */ -.previewnote { text-align: center; - font-size: 11px; - color: red; } - -/* How the preview content should be shown */ -.previewcontent { background: #E0E0E0; } - -/* How the system messages should be shown (DisplayMessage.jsp) */ -.messagecontent { background: #E0E0E0; } - -/* How the "This page has been modified..." -comment should be shown. */ -.conflictnote { } - -.createlink { - color: maroon; -} -a.createlink { - color: maroon; -} -.templateparameter { - font-size: 9px; - color: darkblue; -} - -.diffadded { - background: #ddffdd; - padding: 1px 1px 1px 4px; - border-left: 4px solid darkgreen; -} -.diffdeleted { - color: #999; - background: #ffdddd; - padding: 1px 1px 1px 4px; - border-left: 4px solid darkred; -} -.diffnochange { - padding: 1px 1px 1px 4px; - border-left: 4px solid lightgrey; -} -.differror { - background: brown; -} -.diff { - font-family: lucida console, courier new, fixed-width; - font-size: 12px; - line-height: 14px; -} -.diffaddedchars { - background-color:#99ff99; - font-weight:bolder; -} -.diffremovedchars { - background-color:#ff9999; - text-decoration: line-through; - font-weight:bolder; -} - -.greybackground { - background: #f0f0f0 -} - -.greybox { - border: 1px solid #ddd; - padding: 3px; - margin: 1px 1px 10px 1px; -} - -.greyboxfilled { - border: 1px solid #ddd; - padding: 5px; - margin: 10px 1px 10px 1px; - background: #f0f0f0; -} - -.previewBoxTop { - background-color: #f0f0f0; - border-width: 1px 1px 0px 1px; - border-style: solid; - border-color: #3c78b5; - padding: 5px; - margin: 5px 0px 0px 0px; - text-align: center; -} -.previewContent { - background-color: #fff; - border-color: #3c78b5; - border-width: 0px 1px 0px 1px; - border-style: solid; - padding: 10px; - margin: 0px; -} -.previewBoxBottom { - background-color: #f0f0f0; - border-width: 0px 1px 1px 1px; - border-style: solid; - border-color: #3c78b5; - padding: 5px; - margin: 0px 0px 5px 0px; - text-align: center; -} - -.functionbox { - background-color: #f0f0f0; - border: 1px solid #3c78b5; - padding: 3px; - margin: 1px 1px 10px 1px; -} - -.functionbox-greyborder { - background-color: #f0f0f0; - border: 1px solid #ddd; - padding: 3px; - margin: 1px 1px 10px 1px; -} - -.search-highlight { - background-color: #ffffcc; -} - -/* normal (white) background */ -.rowNormal { - background-color: #ffffff; - } - -/* alternate (pale yellow) background */ -.rowAlternate { - background-color: #fffff0; -} - -TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; } -TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; } -TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; } - -TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; } -TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; } - -.toolbar { - margin: 0px; - border-collapse: collapse; -} - -.toolbar td { - border: 1px solid #ccc; - padding: 2px 2px 2px 2px; - color: #ccc; -} - -td.noformatting { - border-width: 0px; - border-style: none; - text-align: center; - padding: 0px; -} - -.commentblock { - margin: 12px 0 12px 0; -} - -/* - * Divs displaying the license information, if necessary. - */ -.license-eval, .license-none, .license-nonprofit { - border-top: 1px solid #bbbbbb; - text-align: center; - font-size: 10px; - font-family: Verdana, Arial, Helvetica, sans-serif; -} - -.license-eval, .license-none { - background-color: #ffcccc; -} - -.license-eval b, .license-none b { - color: #990000 -} - -.license-nonprofit { - background-color: #ffffff; -} - -/* - * The shadow at the bottom of the page between the main content and the - * "powered by" section. - */ -.bottomshadow { - height: 12px; - background-image: url("$req.contextPath/images/border/border_bottom.gif"); - background-repeat: repeat-x; -} - -/* - * Styling of the operations box - */ -.navmenu .operations li, .navmenu .operations ul { - list-style: none; - margin-left: 0; - padding-left: 0; -} - -.navmenu .operations ul { - margin-bottom: 9px; -} - -.navmenu .label { - font-weight: inherit; -} - -/* - * Styling of ops as a toolbar - */ -.toolbar div { - display: none; -} - -.toolbar .label { - display: none; -} - -.toolbar .operations { - display: block; -} - -.toolbar .operations ul { - display: inline; - list-style: none; - margin-left: 10px; - padding-left: 0; -} - -.toolbar .operations li { - list-style: none; - display: inline; -} - -/* list page navigational tabs */ -#foldertab { -padding: 3px 0; -margin-left: 0; -border-bottom: 1px solid #99CCFF; -font: bold 12px Verdana, sans-serif; -} - -#foldertab li { -list-style: none; -margin: 0; -display: inline; -} - -#foldertab li a { -padding: 3px 0.5em; -margin-left: 3px; -border: 1px solid #99CCFF; -border-bottom: none; -background: #99CCFF; -text-decoration: none; -} - -#foldertab li a:link { color: white; } -#foldertab li a:visited { color: white; } - -#foldertab li a:hover { -color: #dedede; -background: #669900; -border-color: #669900; -} - -#foldertab li a#current { -background: white; -border-bottom: 1px solid white; -color: black; -} - -/* alphabet list */ -ul#squaretab { -margin-left: 0; -padding-left: 0; -white-space: nowrap; -font: bold 8px Verdana, sans-serif; -} - -#squaretab li { -display: inline; -list-style-type: none; -} - -#squaretab a { -padding: 2px 6px; -border: 1px solid #99CCFF; -} - -#squaretab a:link, #squaretab a:visited { -color: #fff; -background-color: #99CCFF; -text-decoration: none; -} - -#squaretab a:hover { -color: #dedede; -background-color: #669900; -border-color: #669900; -text-decoration: none; -} - -#squaretab li a#current { -background: white; -color: black; -} - -.blogcalendar * { - font-family:verdana, arial, sans-serif; - font-size:x-small; - font-weight:normal; - line-height:140%; - padding:2px; -} - - -table.blogcalendar { - border: 1px solid #3c78b5; -} - -.blogcalendar th.calendarhead { - font-size:x-small; - font-weight:bold; - padding:2px; - text-transform:uppercase; - background-color: #99CCFF; - color: #ffffff; - letter-spacing: .3em; - text-transform: uppercase; -} - -.blogcalendar th { - font-size:x-small; - font-weight:bold; - padding:2px; - background-color:#f0f0f0; -} - -.blogcalendar td { - font-size:x-small; - font-weight:normal; -} - -.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; } -.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #99CCFF; padding: 2px 4px 1px 4px; } -.searchItem { padding: 1px 4px 1px 4px; } -.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; } - -/* permissions page styles */ -.permissionHeading { - border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left; -} -.permissionTab { - border-width: 0 0 0 1px; border-style: solid; background: #99CCFF; color: #666666; font-size: 10px; -} -.permissionSuperTab { - border-width: 0 0 0 1px; border-style: solid; background: #669900; color: #dedede; -} -.permissionCell { - border-left: #bbb; border-width: 0 0 0 1px; border-style: solid; -} - -/* warning panel */ -.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; } - -/* side menu highlighting (e.g. space content screen) */ -.optionPadded { padding: 2px; } -.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; } -.optionSelected a { font-weight: bold; text-decoration: none; color: black; } - -/* information macros */ -.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; } -.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; } -.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; } -.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; } -.informationMacroPadding { padding: 5px 0 0 5px; } \ No newline at end of file diff --git a/docs/chinese/wikidocs/velocity.properties.html b/docs/chinese/wikidocs/velocity.properties.html deleted file mode 100644 index 31d7b5ef2..000000000 --- a/docs/chinese/wikidocs/velocity.properties.html +++ /dev/null @@ -1,38 +0,0 @@ - - - WebWork 2 : velocity.properties - - - - - - - - - -
- -
- This page last changed on Jun 18, 2004 by plightbo. -
- -

Èç¹ûÌṩ¸ÃÎļþ(ÔÚ/WEB-INF/classesĿ¼ÖÐ), Velocity½«¼ÓÔØ¸ÃÎļþ. Ëü¿ÉÒÔÓÃÀ´¼ÓÔØ¶¨ÖƵĺê:

-
# Velocity Macro libraries.  
velocimacro.library = webwork.vm, tigris-macros.vm, myapp.vm
-

ÆäËû²ÎÊýÓ÷¨²Î¼ûVelocityÎĵµ.

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/web.xml.html b/docs/chinese/wikidocs/web.xml.html deleted file mode 100644 index 6afed50a3..000000000 --- a/docs/chinese/wikidocs/web.xml.html +++ /dev/null @@ -1,74 +0,0 @@ - - - WebWork 2 : web.xml - - - - - - - - - -
- -
- This page last changed on May 23, 2004 by ctran. -
- -

web.xmlÎļþ¼òµ¥Ã÷ÁË, Ò×ÓÚÅäÖÃ.

ÅäÖÃServletDispatcher

Ó¦ÓÃÖÐ×î³£ÓõĻµ÷ÓÃÈë¿ÚµãÊÇÖ±½Ó·ÃÎÊÒ»¸öURL»òʹÓÃ±íµ¥Ïò»î¶¯Ìá½»Êý¾Ý. ÏÂÀýչʾÁËÈçºÎÅäÖÃServletDispatcherÀ´´¦Àí»î¶¯.
- -
-
<!-- This entry is required to have the framework process calls to WebWork actions -->
<servlet>
  <servlet-name>webworkDispatcher</servlet-name>
  <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
  <load-on-startup>1</load-on-startup> 
</servlet>
<servlet-mapping>
  <servlet-name>webworkDispatcher</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>
-

×¢Òâ: ÉÏÃæµÄÀý×Ó¼Ù¶¨»î¶¯Ê¹ÓÃ".action"À©Õ¹Ãû. Èç¹ûÄãÏòʹÓò»Í¬µÄÀ©Õ¹Ãû, ½«url-patternÔªËØ¸ÄΪÄãÐèÒªµÄÀ©Õ¹Ãû²¢Ê¹ÓøÃÀ©Õ¹ÃûÐ޸ĵ÷ÓôúÂë.

ÅäÖÃCoolUriServletDispatcher(¿ÉÑ¡)

Ò»¸ö¶¨ÖƵÄservlet·Ö·¢Æ÷, ¿ÉÒÔ°Ñservlet·¾¶Ó³ÉäΪ»î¶¯. ¿ÉÒÔÓÃÀ´´úÌæÉÏÃæµÄServletDispatcher. ¸ñʽÈçÏÂ: -

-
http://HOST/ACTION_NAME/PARAM_NAME1/PARAM_VALUE1/PARAM_NAME2/PARAM_VALUE2
-

-Äã¿ÉÒÔʹÓÃÈÎÒâ¶àµÄ²ÎÊý. URLÒ²¿ÉÒÔÏñÏÂÎÄÄÇÑù¼òд: -
-
http://HOST/ACTION_NAME/PARAM_VALUE1/PARAM_NAME2/PARAM_VALUE2
-

-ÕâÑùдҲÊÇÏàͬµÄ: -
-
http://HOST/ACTION_NAME/ACTION_NAME/PARAM_VALUE1/PARAM_NAME2/PARAM_VALUE2
-

-¼Ù¶¨¸ù¾ÝIDÏÔʾÎÄÕÂÄÚÈݵÄURLʹÓÃÏÂÃæµÄģʽ: -
-
http://HOST/article/ID
-

-ÎÒÃÇÐèÒª×öµÄ¾ÍÊǽ«/article/*Ó³Éäµ½¸Ãservlet²¢ÉùÃ÷Ò»¸öÃûΪarticleµÄWebWork»î¶¯. ¸Ã»î¶¯»áÉèÖòÎÊýID: -
-
<servlet>
  <servlet-name>coolDispatcher</servlet-name>
  <servlet-class>com.opensymphony.webwork.dispatcher.CoolUriServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>coolDispatcher</servlet-name>
  <url-pattern>/article/*</url-pattern>
</servlet-mapping>
-

ÅäÖÃÖ§³ÖVelocity(¿ÉÑ¡)

WebWorkʹÓÃVelocity×÷Ϊ¶¨ÖÆJSP±êÇ©¿âµÄµ×²ãÄ£°æÏµÍ³. ³ý·ÇÄãÐèÒªÖ±½Ó(»òʹÓÃ"dispatcher"ÖеĽá¹ûÀàÐÍ)µ÷ÓÃvelocityÄ£°æ, ·ñÔò²»ÐèÒªÅäÖÃWebWorkVelocityServlet. ÅäÖÃËüÐèÒª¼ÓÈëÏÂÁÐÄÚÈÝ:

-
<servlet>
  <servlet-name>velocity</servlet-name> 
  <servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class> 
  <load-on-startup>10</load-on-startup> 
</servlet>
<servlet-mapping>
  <servlet-name>velocity</servlet-name> 
  <url-pattern>*.vm</url-pattern> 
</servlet-mapping>
-

ÅäÖñêÇ©¿â(¿ÉÑ¡)

±êÇ©¿âÊÇ¿ò¼ÜµÄ¿ÉÑ¡²¿·Ö, ÔÚʹÓÃ±íµ¥ºÍ»î¶¯Ê±¿ÉÒÔÌṩһЩºÃ´¦. ²Î¼ûJSP±êÇ©Á˽â¸ü¶àÐÅÏ¢. ʹÓÃʱÐèÒªÖ¸¶¨tld(Tag Library Descriptor)ÎļþµÄλÖÃ:
- -
-
<taglib>
  <taglib-uri>webwork</taglib-uri> 
  <taglib-location>/WEB-INF/lib/webwork-2.1.jar</taglib-location> 
</taglib>
-

Èç¹ûÓ¦Ó÷þÎñÆ÷²»Ö§³ÖjarÎļþÖеıê¼Ç¿âÃèÊöÎļþ, ÄãÐèÒª½â³öwebwork.tld²¢¸´ÖƵ½/WEB-INFĿ¼Öв¢ÐÞ¸ÄÅäÖÃΪ:

-
<taglib>
  <taglib-uri>webwork</taglib-uri> 
  <taglib-location>/WEB-INF/webwork.tld</taglib-location> 
</taglib>
-

×¢Òâ: webwork.tld¿ÉÒÔ·ÅÖÃÔÚÓ¦ÓõÄÈκÎĿ¼ÖÐ.

ÅäÖÃÖ§³ÖFreemarker(¿ÉÑ¡)

¼ÓÈëÏÂÁÐÄÚÈÝ: -

-
<servlet>
  <servlet-name>freemarker</servlet-name>
  <servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>
  <load-on-startup>10</load-on-startup>
</servlet>
-

ÒÔ¼°
- -
-
<servlet-mapping>
  <servlet-name>freemarker</servlet-name>
  <url-pattern>*.ftl</url-pattern>
</servlet-mapping>
-

ÅäÖÃIoC/ÉúÃüÖÜÆÚ¹ÜÀíLifeCycle(¿ÉÑ¡)

²Î¼ûIoCÅäÖà - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/webwork-default.xml.html b/docs/chinese/wikidocs/webwork-default.xml.html deleted file mode 100644 index 617f41512..000000000 --- a/docs/chinese/wikidocs/webwork-default.xml.html +++ /dev/null @@ -1,40 +0,0 @@ - - - WebWork 2 : webwork-default.xml - - - - - - - - - -
- -
- This page last changed on Oct 23, 2004 by plightbo. -
- -

»ù±¾ÅäÖÃÎļþwebwork-default.xml°üº¬ÔÚwebworkµÄjarÎļþÖÐ. ¸ÃÎļþ¿ÉÒÔ°üº¬ÔÚxwork.xml ÖÐÒÔ±ã°üº¬±ê×¼µÄÅäÖÃÐÅÏ¢¶øÎÞÐè¸´ÖÆ, ÈçÏÂ:

-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"><xwork>
   <include file="webwork-default.xml"/>    
    
   <package name="default" extends="webwork-default">
    ...
    </package>
</xwork>
-

2.1.5°æ±¾µÄwebwork-default.xmlÄÚÈÝÈçÏÂ:

-
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
    <package name="webwork-default">
        <result-types>
            <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
            <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
            <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
            <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
            <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
            <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
            <result-type name="stream" class="com.opensymphony.webwork.dispatcher.StreamResult"/>
        </result-types>

        <interceptors>
            <interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
            <interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
            <interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
            <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
            <interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
            <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
            <interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
            <interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
            <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
            <interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
            <interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
            <interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
            <interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
            <interceptor name="fileUpload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>
            <interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>

            <!-- Basic stack -->
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="servlet-config"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="static-params"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="conversionError"/>
            </interceptor-stack>

            <!-- Sample validation and workflow stack -->
            <interceptor-stack name="validationWorkflowStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

            <!-- Sample file upload stack -->
            <interceptor-stack name="fileUploadStack">
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

            <!-- Sample Inversion of Control stack -->
            <interceptor-stack name="componentStack">
                <interceptor-ref name="component"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

            <!-- Sample model-driven stack  -->
            <interceptor-stack name="modelDrivenStack">
                <interceptor-ref name="model-driven"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

            <!-- Sample action chaining stack -->
            <interceptor-stack name="chainStack">
                <interceptor-ref name="chain"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

            <!-- Sample execute and wait stack.
                 Note: execAndWait should always be the *last* interceptor. -->
            <interceptor-stack name="executeAndWaitStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="execAndWait"/>
            </interceptor-stack>

            <!-- A complete stack with all the common interceptors in place.
                 Generally, this stack should be the one you use, though it
                 may process additional stuff you don't need, which could
                 lead to some performance problems. Also, the ordering can be
                 switched around (ex: if you wish to have your components
                 before prepare() is called, you'd need to move the component
                 interceptor up -->
            <interceptor-stack name="completeStack">
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="servlet-config"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="model-driven"/>
                <interceptor-ref name="component"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="static-params"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>
        </interceptors>
    </package>
</xwork>
-

ÎļþÖж¨ÒåÁËÈ«²¿È±Ê¡½á¹ûºÍ½ØÈ¡Æ÷, »¹¶¨ÒåÁËһЩ½ØÈ¡Æ÷Õ»¹©ÄãÖ±½ÓʹÓûò×÷ÎªÌØ¶¨½ØÈ¡Æ÷Õ»µÄ»ù´¡. ×¢Òâ: °üÃû×ÖÊÇ"webwork-default".

- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/webwork.properties.html b/docs/chinese/wikidocs/webwork.properties.html deleted file mode 100644 index 73e174d96..000000000 --- a/docs/chinese/wikidocs/webwork.properties.html +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork 2 : webwork.properties - - - - - - - - - -
- -
- This page last changed on Aug 04, 2004 by jcarreira. -
- -

¿ÉÒÔͨ¹ýÐÞ¸ÄWebWorkµÄÊôÐÔÀ´ÊÊÓ¦Äã×Ô¼ºµÄÐèÒª. ÄãÐèÒªÔÚ/WEB-INF/classesĿ¼ÏµÄwebwork.propertiesÎļþÖÐÉèÖÃÄãËùÐèµÄÊôÐÔÖµ. ÏÂÎĵÄÊôÐÔÁбí¿ÉÒÔÔÚdefault.properties(ÔÚwebwork.jarÖÐ)ÖÐÕÒµ½:

-
### These can be used to set the default HTTP and HTTPS  ports
-### ÓÃÓÚÉèÖÃHTTPºÍHTTPSȱʡ¶Ë¿Ú
-webwork.url.http.port = 80
webwork.url.https.port = 443
-
-### This can be used to set your locale and encoding scheme
-### ÓÃÓÚÉèÖÃÄãµÄÇøÓòºÍ±àÂë
-webwork.locale=en_US
webwork.i18n.encoding=ISO-8859-1

-### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
-### ½âÎöMIME-typeΪmultipart/form-dataµÄPOSTÇëÇó.
-#webwork.multipart.parser=cos
webwork.multipart.parser=pell

# uses javax.servlet.context.tempdir by default
webwork.multipart.saveDir=
webwork.multipart.maxSize=2097152

### Load custom property files (does not override webwork.properties!)
webwork.custom.properties=application,com/webwork/extension/custom

# extension for actions.  This uses by the webwork:form tag
webwork.action.extension=action

### Standard UI theme
# Change this to reflect which path should be used for JSP control tag templates by default
webwork.ui.theme=xhtml
webwork.ui.templateDir=template

### Configuration reloading
# This will cause the configuration to reload xwork.xml when it is changed
webwork.configuration.xml.reload=false

### Location of velocity.properties file.  defaults to velocity.properties
webwork.velocity.configfile = velocity.properties

### Comma separated list of VelocityContext classnames to chain to the WebWorkVelocityContext
webwork.velocity.contexts =

### Override the default VelocityManager with a custom implementation
webwork.velocity.manager.classname=path.and.classname

### Load custom default resource bundles
#webwork.custom.i18n.resources=testmessages,testmessages2
-
- - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/chinese/wikidocs/xwork.xml.html b/docs/chinese/wikidocs/xwork.xml.html deleted file mode 100644 index b05c0d85b..000000000 --- a/docs/chinese/wikidocs/xwork.xml.html +++ /dev/null @@ -1,78 +0,0 @@ - - - WebWork 2 : xwork.xml - - - - - - - - - -
- -
- This page last changed on May 26, 2004 by ctran. -
- -

ʾÀý

-
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xwork 
          PUBLIC 
          "-//OpenSymphony Group//XWork 1.0//EN" 
          "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
    <include file="webwork-default.xml"/>
    
    <package name="default" extends="webwork-default">

        <interceptors>
            <interceptor-stack name="defaultComponentStack">
                <interceptor-ref name="component"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="defaultStack"/>

        <action name="SimpleCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
            <result name="success" type="dispatcher">/success.jsp</result>
            <interceptor-ref name="defaultComponentStack"/>
        </action>

        <!--
          - Velocity implementation of the SimpleCounter.  Also demonstrate a more verbose version of result element
          -->
        <action name="VelocityCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
            <result name="success" type="velocity">
                <param name="location">/success.vm</param>
            </result>
            <interceptor-ref name="defaultComponentStack"/>
        </action>

        <!--
            - Different method can be used (processForm). 
            -->
        <action name="formTest" class="com.opensymphony.webwork.example.FormAction" method="processForm" >
            <result name="success" type="dispatcher">/formSuccess.jsp</result>
            <result name="invalid.token" type="dispatcher">/form.jsp</result>
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="token"/>
        </action>

    </package>
</xwork>
-

»î¶¯

-
<action name="formTest" class="com.opensymphony.webwork.example.FormAction" method="processForm">
-

»î¶¯ÊÇWebWorkµÄ»ù±¾¹¤×÷µ¥Ôª, ËüÕýÊǶ¨ÒåÁ˻. »î¶¯Í¨³£ÓÐÒ»¸öÇëÇó(ͨ³£Êǵã»÷°´Å¥, »òÌá½»±íµ¥). Ö÷ÒªµÄactionÔªËØÓÐÁ½²¿·Ö, ÓѺõÄÃû×Ö(ÔÚURLÖÐÒýÓÃ, ÈçsaveForm.action)ºÍ¶ÔÓ¦µÄ"´¦Àí(handler)"Àà.

¿ÉÑ¡µÄ"method"ÊôÐÔ¸æËßWebWorkÓ¦µ±µ÷ÓûµÄÄĸö·½·¨. Èç¹ûÄã²»ÌîдmethodÊôÐÔ, WebWorkȱʡµ÷ÓÃexecute(). Èç¹û»î¶¯Ã»ÓÐexecute()·½·¨, ҲûÓÐÔÚxmlÖÐÖ¸¶¨methodÊôÐÔ, WebWork½«Å׳öÒì³£.

ͬÑù, ÄãÒ²¿ÉÒÔÔÚ±íµ¥ÖÐÖ¸¶¨"actionName!something"À´¸æËßWebWorkµ÷ÓÃ"doSomething"·½·¨. ÀýÈç, "formTest!save.action"½«µ÷ÓÃFormActionµÄ"save"·½·¨. ¸Ã·½·¨±ØÐëÊÇpublicÇÒûÓвÎÊý:

-
public String save() throws Exception
  {
      ...
      return SUCCESS;
  }
-

»î¶¯µÄËùÓÐÅäÖö¼¿ÉÒÔÓÃÔÚ"actionName!something"ÖÐ(½ØÈ¡Æ÷, ½á¹ûÀàÐ͵È)

½á¹û

-
-
<result name="missing-data" type="dispatcher">
    <param name="location">/form.jsp</param>
    <param name="parameterA">A</param>
    <param name="parameterB">B</param>
</result>
-

ResultÔªËØ¸æËßWebWork»î¶¯Ö´ÐкóÏÂÒ»²½¸Ã×öʲô. "name"ÊôÐÔ¶ÔÓ¦»î¶¯execute() ·½·¨·µ»ØµÄ½á¹û´úÂë. "type"ÊôÐÔ±íʾʹÓÃÄĸö½á¹ûÀàÐÍ(²Î¼û½á¹ûÀàÐÍ). ¿ÉÒÔʹÓÃ"param"ÔªËØÏòÊÓͼ´«µÝ²ÎÊý:
-

-
<result-types>
     ....
    <result-type name="header"                    
         class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
		
</result-types>

<result name="no-content" type="header">
    <param name="status">204</param>
    <param name="headers.customHeaderA">A</param>
    <param name="headers.customHeaderB">B</param>
</result>
-

ÏÂÃæÊÇWebWorkÄÚÖõıê×¼½á¹û´úÂë(¶¨ÒåÔÚAction½Ó¿ÚÖÐ), °üÀ¨: -
-
Action.SUCCESS = "success";
Action.NONE    = "none";
Action.ERROR   = "error";
Action.INPUT   = "input";
Action.LOGIN   = "login";
-

Äã¿ÉÒÔÀ©³äÄãÈÏΪÊʺϵĽá¹û´úÂë(Èç"missing-data"). ´ó¶àÊýÇé¿öÏÂÄãÖ»ÐèʹÓÃSUCCESSºÍERROR, SUCCESS½«Ç°½øµ½ÏÂÒ»¸öÒ³Ãæ.

Èç¹ûÄãÖ»ÐèÒªÖ¸¶¨"location"ÊôÐÔ, ¿ÉÒÔʹÓüòдÐÎʽ: -
-
<result name="missing-data" type="dispatcher">/form.jsp</result>
-

²ÎÔÄwebwork-default.xml»òResult TypesÒÔÁ˽â±ê×¼½á¹ûÀàÐÍ

½ØÈ¡Æ÷

½ØÈ¡Æ÷ÔÊÐí¶¨Òå»î¶¯Ö´ÐÐǰºóµÄ´úÂë. ½ØÈ¡Æ÷ÊDZàдWebÓ¦ÓõÄÇ¿´ó¹¤¾ß. һЩ×î³£ÓõÄʵÏÖÊÇ: -

    -
  • °²È«¼ì²é(È·±£Óû§Òѵǽ)
  • -
  • ¸ú×ټͼ (¼Ç¼ÿһ¸ö»î¶¯)
  • -
  • ¼ì²éÖ´ÐÐÆ¿¾± (ÔڻǰºóÆô¶¯¼ÆÊ±Æ÷, ÒÔ¼ì²éÓ¦ÓÃÆ¿¾±)
    -Ò²¿ÉÒÔ½«½ØÈ¡Æ÷Á¬½ÓÆðÀ´´´½¨Ò»¸ö½ØÈ¡Æ÷Õ». Èç¹ûÄãÏëÍê³ÉµÇ½¼ì²é, °²È«¼ì²é, ²¢¼Ç¼ÿ¸ö»î¶¯µ÷ÓÃ, ʹÓýØÈ¡Æ÷Õ»»áÊ®·ÖÈÝÒ×. -
  • -

-±ØÐëÏȶ¨Òå½ØÈ¡Æ÷(¸øËüÃüÃû)È»ºó²ÅÄÜÁª½Ó³ÉÕ»:

-
<interceptors>
  <interceptor name="security" class="com.mycompany.security.SecurityInterceptor"/>
  <interceptor-stack name="defaultComponentStack">
    <interceptor-ref name="component"/>
    <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
</interceptors>
-

ÒªÔڻÖÐʹÓÃËüÃÇ: -

-
<action name="VelocityCounter" class="com.opensymphony.webwork.example.counter.SimpleCounter">
   <result name="success">...</result>
   <interceptor-ref name="defaultComponentStack"/>
</action>
-

×¢Òâ: ¿ÉÒÔÒýÓÃÀ¹½ØÆ÷»òÕ»µÄÃû×Ö

¸ü¶àϸ½Ú²Î¼û½ØÈ¡Æ÷.

ÊÓͼ

WebWorkÖ§³ÖJSPºÍVelocity×÷ΪӦÓñíʾ²ã. ±¾ÀýʹÓÃJSPÎļþ. Webwork¸½´øÁ˱êÇ©¿â(taglibs). Äã¿ÉÒÔÔÚJSPÖÐÏî×é¼þÒ»ÑùʹÓñêÇ©¿â.ÏÂÃæÊÇform.jspµÄƬ¶Ï:

-
<%@ taglib prefix="ww" uri="webwork" %>
<html>
<head><title>Webwork Form Example</title></head>
<body>
   <ww:form name="myForm" action="'formTest'" namespace="/" method="POST">
  <table>
    <ww:textfield label="First Name" name="'formBean.firstName'" value="formBean.firstName"/>
    <ww:textfield label="Last Name" name="'formBean.lastName'" value="formBean.lastName"/>
    <ww:submit value="Save Form"/>
  </table>
</ww:form>
</body>
-

´¦Àí¾­¹ýÈçÏÂ:

    -
  1. WebWork¼à¿ØÒÔ.action½áβµÄURI(¶¨ÒåÔÚweb.xmlÖÐ)
  2. -
  3. WebWorkÔڻ¶¨ÒåÖвéÕһformTest.
  4. -
  5. WebWork´´½¨formTest²¢µ÷ÓÃcom.opensymphony.webwork.example.FormActionµÄ·½·¨processForm(¶¨ÒåÔÚxwork.xmlÖÐ).
  6. -
  7. ¸Ã·½·¨´¦Àí³É¹¦²¢·µ»ØSUCCESS
  8. -
  9. WebWork½«·µ»ØÖµSUCCESSת»»³ÉµØÖ·formSuccess.jsp(¶¨ÒåÔÚb class="strong">xwork.xmlÖÐ)²¢Ö´ÐÐÖØ¶¨Ïò.
  10. -
-

°üº¬

ΪÁËÒ×ÓÚ¹ÜÀí´ó¹æÄ£¿ª·¢»î¶¯(°üº¬´óÁ¿»î¶¯ºÍÅäÖÃ), WebWorkÔÊÐíÔÚxwork.xmlÖаüº¬ÆäËûÅäÖÃÎļþ :

-
<xwork>
    <include file="webwork-default.xml"/>
    <include file="user.xml"/>
    <include file="shoppingcart.xml"/>
    <include file="product.xml"/>
    ....
</xwork>
-

±»°üº¬Îļþ±ØÐëÓëxwork.xmlµÄ¸ñʽÏàͬ(¾ßÓÐÏàͬµÄdoctype¼°ÆäËü)²¢·ÅÖÃÔÚÀà·¾¶ÖÐ(ͨ³£Î»ÓÚ/WEB-INF/classes»ò/WEB-INF/libµÄjarÎļþÖÐ).

±¾ÎĵĴ󲿷ÖÄÚÈÝÓÉMatt Dowell<matt.dowell@notiva.com>Ìṩ - - -
- - - - - - - -
Document generated by Confluence on Dec 14, 2004 16:37
- - \ No newline at end of file diff --git a/docs/docs.pdf b/docs/docs.pdf deleted file mode 100644 index 4bb5eee7a..000000000 Binary files a/docs/docs.pdf and /dev/null differ diff --git a/docs/index.jsp b/docs/index.jsp deleted file mode 100644 index 978dcab28..000000000 --- a/docs/index.jsp +++ /dev/null @@ -1,47 +0,0 @@ - - - WebWork - - - - - - - - - - -
- WebWork in Action - WebWork in Action is the first book entirely on WebWork. It covers everything up to version - 2.1.7 and - some features of 2.2. -
- - Java Open Source Programming : with XDoclet, JUnit, WebWork, Hibernate - WebWork is featured in several chapters of Java - Open Source Programming (review here). - - -
- -