Raible's Wiki
Raible Designs AppFuseHomepage- Korean - Chinese - Italian - Japanese QuickStart Guide User Guide Tutorials Other ApplicationsStruts ResumeSecurity Example Struts Menu
Set your name in
UserPreferences
Referenced by
JSPWiki v2.2.33
Hide Menu |
One of the things I've recently added to AppFuse is the ability to generate indexed-property-ready ActionForms using XDoclet. It's pretty simple really - if you're using XDoclet, you can add it too with the following steps: Step 1: Add the following code to the bottom of your struts_form.xdt file. NOTE: You will need Velocity JARs in your classpath for this modified template to work. /** * @see org.apache.struts.action.ActionForm#reset(org.apache.struts.action.ActionMapping, * javax.servlet.http.HttpServletRequest) */ public void reset(ActionMapping mapping, HttpServletRequest request) { // reset any boolean data types to false <XDtStrutsForm:forAllFormFields> <XDtType:ifIsOfType value="return-type" type="java.lang.Boolean,boolean" extent="concrete-type"> this.<XDtMethod:propertyName/> = false; </XDtType:ifIsOfType> </XDtStrutsForm:forAllFormFields> <XDtClass:ifHasClassTag tagName="struts.form" paramName="indexedProperties" value="true"> <XDtStrutsForm:forAllFormFields> <XDtType:ifIsOfType value="return-type" type="java.util.List,java.util.Set" extent="concrete-type"> <XDtVelocity:generator> #set( $method = $currentMethod.name) ## trim off the 'get' #set( $objectName = $method.substring(3, $method.lastIndexOf('s'))) </XDtVelocity:generator> this.<XDtMethod:propertyName/> = org.apache.commons.collections.ListUtils.lazyList(new java.util.ArrayList(), new ObjectFactory("<XDtVelocity:getVariable name="objectName"/>")); </XDtType:ifIsOfType> </XDtStrutsForm:forAllFormFields> </XDtClass:ifHasClassTag> } <XDtClass:ifHasClassTag tagName="struts.form" paramName="indexedProperties"> /** * <code>ObjectFactory</code> - used if indexed properties exist on this form. * * @see org.apache.commons.collections.ListUtils */ class ObjectFactory implements org.apache.commons.collections.Factory { private String name; /** * Create a new instance of the specified object */ public Object create() { Class c = null; try { c = Class.forName("org.appfuse.webapp.form." + name + "Form"); return c.newInstance(); } catch (Exception e) { System.err.println("Error instantiating class: " + c.getName()); throw new RuntimeException(e); } } public ObjectFactory(String name) { this.name = name; } } </XDtClass:ifHasClassTag> Step 2: For the generated Forms that have indexed properties (i.e. those with Hibernate many-to-one associations), add an attribute to the @struts.form tag: indexedProperties="true". If you name your Lists as plural forms of your Objects, everything should work fine. For instance, if you have a list of User objects, your List should be named "users" with appropriate getters and setters:
This stuff works really slick with Hibernates ability to Lazy load objects. In AppFuse the BaseAction has a convertLists() method that allows easy conversion from your indexed Forms to indexed POJOs and vise-versa.
|