Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Tip
titleAdding New FAQs

Each FAQ should be cross-referenced from a relevant page in one of the guides. (If a relevant page in the guide is missing, then we probably need to create one!) Each question should be a new page. Answers should be concise and focused. If an answer seems long, or seems like it could relate to more than one section, then the question might be addressing more than one concern.

FAQs can also be "mini-HOWTOs". As long as the question and answer are focused on a single concern, length is not an issue.


Excerpt

Migrating

General

HOWTO

Configuration

Accessing Resources

Per-Page Settings

Interceptors

Validation

Localization

General

What are the default variables in the value stack? (accessible using #foo)
attr (scans the request, session, and application attributes, in that order)
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:

Code Block

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

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 :

Code Block

#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:

Code Block

html tag i use to do:

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

...

...

Code Block

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

Code Block

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

Code Block

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

...

Type Conversion

Value Stack

Tags

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):

Code Block

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:

Code Block

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

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

Code Block

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

Code Block

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

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

POJOs

Spring

Velocity

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

...

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

Ajax/Dojo

Issues in Specific Environments

Extensions

Portlet Support(JSR168)

Migrating


Errata?

Tip

To suggest a change or a correction to any part of the documentation, log in and leave a comment on the appropriate page. We are always looking for help with the documentation!

Next: Cookbook

...