I guess my (first) problem is simpler than this discussion, I'll try to
explain:

When I submit my form, I expect my page properties to be updated during
rewind automatically, without me having to write any java code to make that
happen. But so far I haven't understood how this happens. I include here a
simple code example that I think illustrates my problem quite well. Why is
my collection always empty when the form listener is reached? If I run the
initItems() method on both rewind and render, the values from the request
parameters are written into the page properties.

My ultimate question is: Do I really have to get the items list from the
database during rewind? Isn't there a way to avoid this, making tapestry
automatically build the items collection from the request parameters? As I
wrote in another similar post on the list about DataSqueezer, I've tried
creating a datasqueezer for this, but the collection is still showing up
empty.

My HTML file:

--------------------------------------------------------------------------

<body jwcid="@Body">

<form jwcid="@Form" listener="listener:formListener">

    <span jwcid="@For" source="ognl:items" value="ognl:currentItem">
      <span jwcid="@Insert" value="ognl:currentItem.name"/><br>
       <input type="text" jwcid="@TextField" value="ognl:currentItem.name"/>
       <br>
    </span>

<input type="button" jwcid="@Submit" value="Submit form now"/>

</form>
</body>

-------------------------------------------------------------

<page-specification class="Test">
    <property name="items"/>
    <property name="currentItem"/>
</page-specification>

-------------------------------------------------------------


public abstract class Test extends BasePage implements
PageBeginRenderListener {

  static Log log = LogFactory.getLog(Test.class);

  public abstract Collection getItems();
  public abstract void setItems(Collection c);

  public void pageBeginRender(PageEvent event) {

    if (!getRequestCycle().isRewinding()) {
      initItems();
    }
    else {
      if (getItems() == null) {
        setItems(new Vector());
      }
    }
  }

  public void formListener(IRequestCycle cycle) {
    Collection items = getItems();
    for (Iterator iter = items.iterator(); iter.hasNext();) {
      Item currItem = (Item) iter.next();
      log.debug("Current item id: " + currItem.getId() + ", name: " +
currItem.getName());
    }
  }

  private void initItems() {
    Collection items = new Vector();

    items.add(new Item(new Long(1), "Item 1"));
    items.add(new Item(new Long(2), "Item 2"));

    setItems(items);
  }
}







On 2/15/06, Ryan <[EMAIL PROTECTED]> wrote:
>
> You may want to look at the method prepareForRender(). This is the
> method that handles binding of properties to form values. It is also
> called just before the component is rendered and in the order in which
> they are rendered on the page (where pageBeginRender is called before
> anything renders and is called in an undefined order). Also note that
> prepareForRender is not called if the component is not rendered (for
> instance if it is in an @Conditional that evaluates to false).
>
> I have received the best results from using pageBeginRender for
> initializing page properties that are static (ie known at all times
> during render, for instance a property select model property) and
> using prepareForRender in other times.
>
> Ryan
>
> On 2/14/06, Inge Solvoll <[EMAIL PROTECTED]> wrote:
> > I would like to provoke some debate on whether this is a good design
> pattern
> > or not:
> >
> > public void pageBeginRender(PageEvent event) {
> >   initState();
> >   readItemsFromDatabase();
> > }
> >
> > private Collection readItemsFromDatabase() {
> >   return getDatabaseConnection().getItems();
> > }
> >
> > private void initState() {
> >   // Init all crucial page state here
> > }
> >
> > My problem is that some ids in hidden inputs are needed by the initState
> > method. These values are not available in the pageBeginRender method
> during
> > rewind, because the Hidden components containing them haven't been
> rendered
> > yet. I need this state information on a per-request basis, not
> per-session,
> > so it is not possible to persist the page property. So far, I'm solving
> this
> > by using good-old request parameters, and reading them the old servlet
> way
> > in the pageBeginRender method like this:
> >
> > String crucialId = getRequest().getParameter("crucialId");
> > page.setCrucialId(new Long(crucialId));
> >
> > I generally run into a lot of problems trying to find a good pattern for
> > setting up data to fit with the RequestCycle. I have ended up doing the
> > database reading in the pageBeginRender method, meaning that my data for
> the
> > page is being read on every single rewind and render. I find it a bit
> hard
> > to understand how to achieve this:
> >
> > On render:
> > - Read data from database and set page properties
> >
> > On rewind:
> > - Create non-null, empty, page properties ready to be populated from the
> > request.
> >
> > My rewind step here often fails, and I don't see why. My page properties
> > don't seem to be populated, when I leave them as, say, a non-null empty
> > java.util.Collection to be populated with items from the request.
> >
> > Long and not very concentrated post, I actually don't know where to
> start
> > here :)
> >
> > Inge
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Reply via email to