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
DTOInForm
StrutsResumeSupport




JSPWiki v2.2.33

[RSS]


Hide Menu

POJOsToForms


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


This is from a discussion on the struts-user mailing list. I'm continuing it here because I want to propose a new idea:

Send your POJOs to the UI rather than converting them to ActionForms first.

By this, I mean to say that I'd like to retrieve and display POJOs on the UI, and then capture their information (as ActionForms) when saving the form. The reason I want to do this is because of Hibernate's Lazy Loading feature and formatting Dates. Basically, Hibernate allows you to load children of an object lazily (i.e. resumes of a User), when the getResumes() method is called.

The issue I'm seeing right now with lazily-loaded properties is that they're loaded when using BeanUtils.copyProperties() is called. I use this to convert POJOs to ActionForms, and consequently the getResumes() method is called. However, I don't want this. I'd rather the getResumes() method is called when I call it in my code (rather than by a 3rd party conversion utility). Therefore, I'm thinking that passing the POJO to the view is the best solution. Because I'm using the open-session-in-view pattern, those lazy collections are still available while the JSP is being rendered.

This solves another issue too. It's nice to format dates on the UI, and you need a real date on your form to do this, rather than a String value of a date that's already been converted.

One issue might be with checkboxes, but I can just use the Form for that, right? I haven't tried this yet, but I wanted to write my thoughts down and stir up some discussion on it beforehand.

You might also be interested in my blog entry on the subject.

Are you saying that you would populate the form manually in the view? ~ mojavelinux

I suggest looking at Struts' Nested taglib. It does set properties if complex DTO objects and does not require (semi)manual conversion between strings and actual data types. With little wrapper to BeanUtilities, which register Data handler with desired formatting pattern, it allows correct handling of dates. http://www.kgisoftware.com/roller/page/kosta/Weblog

Related Pages:

Comments:


I know it's not really useful to you, but WebWork gives you this natively. It's one of the big differences between WW and Struts, in that with WebWork you can make true model-driven actions, and then use them in your form.

For example a form field called "pet/name" will call getPet() - your existing model POJO - and then setName() on it. Your action then just needs to store the updated POJO. Very neat.

~ mike cannon-brookes


Matt, I have been actually meaning to ask you about this. I am trying to get a handle on how you are handling information passed down to the view. At this point in the game I am just passing my value object (are these supposed to be called DTOs now?) into my view. However, this brings me back to my first question to you. Consider the case where I want to display full name for a user. I would create a method getFullName() which would do a few tests to determine if the user has a first/middle/last name and then concat them together and split them out. I think, following your model, you would recommend putting this method in the UserForm object, but that would mean that I would have to transfer data from my user object into my UserForm object for use in the view. But then, would I still be able to get to the CompanyForm from the UserForm by using getCompany() in the UserForm? (nested forms). I am just trying to develop a standard here that I can use and I am floating around a bit.

~ mojavelinux


I'm beginning to think this is best done as it currently is in AppFuse, where all objects are translated to Action Forms (even nested lists of objects). The reason? Because then my view is not tied to my model. If I start using POJOs in my view, then I'm tightly coupling my model to my view. And besides, since I've already done it this way - there's really no more work to be done. I have a DateConverter that's not in AppFuse that might be useful for converting dates (it's pretty simple really). Here's an example:

public class DateConverter implements Converter {
    //~ Instance fields ========================================================

    protected Log log = LogFactory.getLog(ListConverter.class);

    //~ Methods ================================================================

    /**
     * Convert a String to a Date
     *
     * @param type the class type to output
     * @param value the object to convert
     */
    public Object convert(Class type, Object value) {
    	log.debug("entered 'convert' method...");
        // for a null value, return null
        if (value == null) {
            return null;
        } else {
            if (value instanceof String) {
            	log.debug("value (" + value + ") instance of String");
                try {
                    if (StringUtils.isEmpty(value.toString())) {
                	return null;
                    }
                    return DateUtil.convertStringToDate(value.toString());
                } catch (ParseException pe) {
                    pe.printStackTrace();
                }
            } else if (value instanceof Date) {
		log.debug("value (" + value + ") instance of Date");
                return DateUtil.convertDateToString((Date) value);
            }
        }

        throw new ConversionException("Could not convert "
                                      + value.getClass().getName() + " to "
                                      + type.getName() + "!");
    }
}
Of course, the DateUtil class would help too, but this will give you a simple idea of how to do date conversions. Just register this class in BaseManager.java.

~ MattRaible



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