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