Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Main




JSPWiki v2.2.33

[RSS]


Hide Menu

XdocletActionForms


This is version 2. It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]


Should Xdoclet Generate Struts ActionForms?

In Appfuse, you may notice that the ActionForms are autogenerated from the model's entity beans using @struts xdoclet tags. After trying every which way to wrap my application design around this approach, it finally became obvious to me that this is one case xdoclet over steps it's bounds. Read on to find out why...


As much as it just seems so tempting and beautiful and quick, I truly, truly believe that generating ActionForms dynamically with xdoclet is just not the right way to go. I believe that the relationship between a model's entity beans and the ActionForms is a forced association, one of those things that you want to believe so badly that you will do whatever you can to make it seem like an association, when really there is little similarity at all.

Entities are almost exactly the same as ActionForms in many cases, but the exceptions are enough to prove they should not be parallel (and even Ted Husted thinks so, one example being http://husted.com/struts/tips/005.html but I have also read his comments elsewhere on the subject). ActionForms should be flexible to suit the view, not necessarily to suit the model. In fact, it is only your manager class (business delegate) that should care how you designed your ActionForms, so that even the DAO cares only about the entity design. Here are several reasons why xdoclet should not be used to make ActionForms from entities.

1. Most of the time, an ActionForm just holds the info from a entity bean, such as a link, but the main forms (the 20% that are used 80% of the time) are much more complex and don't just line up with a single entity. These ActionForms should be allowed to work for the view, not be dictated by the architecture of the model.

2. Forms can have nested beans, which must be ActionForms, not the associating entity or else you are back to the reason you create ActionForms in the first place, as a proxy. With xdoclet this just generates all sorts of a mess, because if you extend your xdoclet generated ActionForm, then you have to change the reference to the nested form to reference the extended class. Argh, messy.

3. Validation. It is very, very wrong (I believe) to use validation tags on your entity bean. On one form the date might have a range limitation, on another form it might not, but still be the same entity. xdoclet validation tags should go on the ActionForm class (an impossibility if you are generating the class dynamically, unless of course you transfer over the tags, but then other issues arise). Again, messy, messy.

...and all for what? To generate something that eclipse can make in 10 seconds!

Anyway, while it might suck, typing out an ActionForm isn't quite that hard and I think using xdoclet to generate them is just an indirection. You are most likely going to have to extend that generic ActionForm that xdoclet creates to provide extra methods anyway. For example, date handling needs a special object, nested forms need to have nested ActionForm objects and then there are collections. xdoclet just doesn't cut it here once you get into more complex apps (think event scheduler). I beat my head against the wall for hours until I just let go of ejbdoclet and then it all become very lucid. Your ActionForm is a very important view proxy to your entity beans, so don't try to get away with auto-generating it.

That is my 2 cents and it is hard to convince me otherwise at this point because of how much easier it has already been to work with struts forms, xdoclet and my persistence data by abandoning xdoclet. Plus, now my entity beans don't have struts tags in them, a very important separation of model and view. Oh, and if I move a field to a different table/entity bean, I don't have to go redesign my form necessrily, though I do have to modify my Manager, but that is okay, because both are part of the business, not the view. The view is still safe. While I am dying for someone to see the light, I can live with enjoying it alone for a while. Remember, you don't want to overdo things, and this is backing away from xdoclet where it is prudent to do so.



Go to top   More info...   Attach file...
This particular version was published on 06-Nov-2006 13:52:39 MST by Mojavelinux.