Tip | ||
---|---|---|
| ||
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. |
General
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)
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.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 :
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.
...
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:
...
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/DojoIssues in Specific EnvironmentsExtensions
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
...