okay i solved my own problem. 

I didn't realize that JSF magically retains my state even when my
managed bean is in request mode. Thanks JSF/MyFaces!

All i need to do is intialize my UIData value with a list from the
database the first time i access it.After that i update my UIData
value via the action that i call. Everytime UIData value is attempted
to be set it will see that it is not null and leave it alone. So, i
only hit my db once for the initial list and then after that only
intentionally. This allows me to be sure that the index object will be
what i am expecting it to be.

I think i am going to make this even easier by making sure that all
access to this page calls the #{categoryAdmin.init} action first. Then
i can even do away with the faux init wrapper.

...
  /**
   * @return Returns the categoryTable.
   */
  public UIData getCategoryTable() {
    return initCategoryTable(categoryTable);
  }
  /**
   * @param categoryTable The categoryTable to set.
   */
  public void setCategoryTable(UIData categoryTable) {
    this.categoryTable = initCategoryTable(categoryTable);
  }
  
  private UIData initCategoryTable(UIData categoryTable) {
    if(categoryTable.getValue() == null) {
      categoryTable.setValue(catalogService.getChildCategories(category));
    }
    return categoryTable;
  }
...

On 4/13/05, Brandon Goodin <[EMAIL PROTECTED]> wrote:
> wow, after looking at all the proposed solutions i wound up coming
> back to what i was doing before. Which is exactly what Srikanth
> recommended. Is there a reason why the rest of you chose such obscure
> routes to the getRowData?
> 
> Also it seems that no matter what i do the UIData property that my
> dataTable is bound too on my backing bean get's called twice. Once
> before the action is called and once after the action method is
> called. When i select an item with the commandLink I am only
> interested in the id of that element. It seems that i HAVE to load the
> whole list back in just to get the id from the selected index of the
> list. I prefer not to keep lists in my session scope and so my managed
> bean is request scope and i load lists only as i need them. But, the
> auto loading that is performed by JSF does not make this easy. Is
> there a way around this?
> 
> I currently have an init boolean for my UIData so that the list will
> only load once from my service layer. I would prefer that the List not
> have to be loaded when i select the commandLink. Like i said i'm only
> interested in the id. Also, the odd thing about grabbing the selected
> object using the getRowData (which looks up the index) is that the
> list i grab from my service layer may have been updated. So, then the
> index would return the wrong object. Does everyone simply load up all
> their lists into their managedbeans and store them in session scope?
> 
> It doesn't seem that developing something as simple as this should be
> so difficult.
> 
> Following is my code.
> 
> ...
> 
>   private CatalogService catalogService = null;
> 
>   private Category category = new Category();
> 
>   private UIData  categoryTable = new UIData();
>   private boolean categoryTableInit = false;
> 
>   /**
>    * no arg contructor
>    */
>   public CategoryAdminPresentation() {
>     this.catalogService =
> (CatalogService)ServiceFactory.getInstance().getService(CatalogService.class);
>   }
> 
>   public String child() {
> 
>     Category category = (Category)categoryTable.getRowData();
> 
>     // create parent category template
>     Category parentCategory = new Category();
>     parentCategory.setParentCategoryId(category.getCategoryId());
> 
>     categoryTable.setValue(catalogService.getChildCategories(parentCategory));
> 
>     return "child";
>   }
> 
>   /**
>    * @return Returns the categoryTable.
>    */
>   public UIData getCategoryTable() {
>     return initCategoryTable(categoryTable);
>   }
>   /**
>    * @param categoryTable The categoryTable to set.
>    */
>   public void setCategoryTable(UIData categoryTable) {
>     this.categoryTable = initCategoryTable(categoryTable);
>   }
> 
>   private UIData initCategoryTable(UIData categoryTable) {
> 
>     if(categoryTableInit==false) {
>       categoryTable.setValue(catalogService.getChildCategories(category));
>       categoryTableInit = true;
>     }
> 
>     return categoryTable;
> 
>   }
> 
>   /**
>    * @return Returns the category.
>    */
>   public Category getCategory() {
>     return category;
>   }
>   /**
>    * @param category The category to set.
>    */
>   public void setCategory(Category category) {
>     this.category = category;
>   }
> 
> ...
> 
> Thanks,
> Brandon
> 
> On 4/13/05, Brandon Goodin <[EMAIL PROTECTED]> wrote:
> > This rowData works okay, if you are using session... but there are
> > problems with this. Most of the time you want to query based on the ID
> > of your object. Not the index of the object location. If you database
> > changes behind the scenes and you query a list from the database, the
> > index may produce a different object. The important thing to me is to
> > get the ID for the query. I don't like to keep lists of objects in
> > session. That's weighty and pointless.  I appreciate the previous
> > contributions. I'm going to try them out later this evening.
> >
> > Please correct me if i'm wrong.
> >
> > Thanks,
> > Brandon
> >
> > On 4/13/05, Srikanth Madarapu <[EMAIL PROTECTED]> wrote:
> > > In your backing bean, you must have access to the model (of your table ), 
> > > just call   yourModel.getRowData() to get the current row's data or 
> > > yourModel.getRowIndex to the currenty row's index.
> > >
> > > -----Original Message-----
> > > From: Ray Clark [mailto:[EMAIL PROTECTED]
> > > Sent: Wednesday, April 06, 2005 10:46 PM
> > > To: [email protected]
> > > Subject: dataTable and commandButton question
> > >
> > > I'm sure this must have been asked before but I can't
> > > find it in the archives.  So please forgive me if it
> > > has been asked before.
> > >
> > > I have a dataTable with a commandButton rendered on
> > > each row.  When the commandButton is pressed I need
> > > it's managed bean method to know which row the button
> > > was pressed for.  So how can the method know which row
> > > to process?
> > >
> > > Thanks,
> > > Ray
> > >
> > > __________________________________
> > > Do you Yahoo!?
> > > Take Yahoo! Mail with you! Get it on your mobile phone.
> > > http://mobile.yahoo.com/maildemo
> > >
> >
>

Reply via email to