Versions Compared

Key

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


note
Tip
titleAdding New FAQs

Each question FAQ should be cross-referenced from a new page. Typically answers should link to content in the Reference. 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

...

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

Tags

Inversion of Control

Validation

Internationalization

Type Conversion

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)

...

Code Block
xmlxml

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

Localization

...

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>

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

  • ?

...

...

...

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="''">

...

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:

Code Block

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

POJOs

Spring

Velocity

...

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