Hi Jeremy,
the following snippets should help you:
private ValueBinding getValueBinding(String expression)
{
return
FacesContext.getCurrentInstance().getApplication().createValueBinding(expression));
}
getValueBinding("#{encashmentDetail.encashmentExisting==true}")
regards,
Martin
On 12/21/05, Jeremy Sager <[EMAIL PROTECTED]> wrote:
> Well, I've gotten the setter method working just fine, but have run into
> another problem immediately.
>
>
> It's really the same problem, but instead of being inside a JSP I'm inside a
> regular Java method:
>
>
>
> public void setPane(HtmlPanelTabbedPane component){
>
> FacesContext context = FacesContext.getCurrentInstance();
>
> Application app = context.getApplication();
>
>
>
> if (pane == null){
>
> pane =
> (HtmlPanelTabbedPane)app.createComponent(TABBEDPANE);
>
> }
>
>
>
> if (tab == null){
>
> tab = (HtmlPanelTab)app.createComponent(PANELTAB);
>
> }
>
>
>
> numtimes ++;
>
> System.out.println("Numtimes = " + numtimes);
>
> tab.setLabel(Integer.toString(numtimes));
>
>
>
> System.out.println(tab.getLabel());
>
>
>
> }
>
>
>
> Now, what I get on the console if I've refreshed 3 times is:
>
>
>
> Numtimes = 3
>
> 3
>
>
>
> But what displays on the tab header is "1".
>
>
>
> Now, I realize this is happening because the tab itself is using the saved
> version that has been restored.
>
>
>
> To get around this, it seems to me like I will need to create a value
> binding for the tab itself, but it's not immediately clear how to do this.
>
>
>
> Now, I see the method in UIComponentBase:
>
>
>
> setValueBinding(java.lang.String name,
> javax.faces.el.ValueBinding binding)
>
>
>
> but... I need to pass in a ValueBinding object, and looking at the javadoc
> for the ValueBinding object, it's not at all clear what I need to do with
> it.
>
>
>
> I guess an alternative way to do this would be to completely recreate the
> tabbed pane every time and add the children back in, but then I'm going to
> lose the state of my child tabs, meaning if work has been done in more than
> one tab and I have to refresh, all that work will be lost, so that's not a
> realistic solution for me.
>
>
>
> What I really need to be able to do is query my child tab in a setter method
> and figure out whether I need to restore state or recreate it, which I can
> handle on my own no problem... I just need to figure out how to
> programmatically bind the tab so that I can get into its setter method.
>
>
>
> Jeremy Sager
>
> Data Communications Product Manager
>
> Chesapeake System Solutions
>
> 410.356.6805 x120
>
> [EMAIL PROTECTED]
>
>
>
>
>
> -----Original Message-----
>
> From: Martin Marinschek [mailto:[EMAIL PROTECTED]
>
> Sent: Monday, December 19, 2005 4:09 PM
>
> To: MyFaces Discussion
>
> Subject: Re: Component binding is not refreshed?
>
>
>
> Hi Jeremy,
>
>
>
> your conclusion is absolutely right. The getter of the method-binding
>
> will only be called once - then the component is recreated from the
>
> saved state, and will not be created by calling your getter.
>
>
>
> You'll understand this if you think about the state saving feature of
>
> JSF - if you would be able to provide a new component at every
>
> request, how would the state saving ever work?
>
>
>
> If you want to change your component, you'll need to provide a
>
> _setter_ for the component, and do the modifications there or in an
>
> action-method (which runs after the setter for the component has been
>
> called, so you can access the actual JSF component there). The setter
>
> will be called on every request!
>
>
>
> regards,
>
>
>
> Martin
>
>
>
> On 12/19/05, Jeremy Sager <[EMAIL PROTECTED]> wrote:
>
> >
>
> >
>
> >
>
> > Hey guys -
>
> >
>
> >
>
> >
>
> > Thanks in advance for your help.
>
> >
>
> >
>
> >
>
> > I have a panelTabbedPane that I am binding directly to a bean so that I
>
> can
>
> > create the pane programmatically.
>
> >
>
> >
>
> >
>
> > Here is the tag definition:
>
> >
>
> >
>
> >
>
> > <t:panelTabbedPane binding="#{editorPanelBean.pane}"/>
>
> >
>
> >
>
> >
>
> > Now, in my bean, I have the getPane() method. I have included the entire
>
> > class file here (don't worry, it's not big) except for the package and
>
> > import declarations. The IEditorPanelTabBean list can be safely ignored,
>
> > it's not being used.
>
> >
>
> >
>
> >
>
> >
>
> >
>
> > /**
>
> >
>
> > * @jsf.bean name="editorPanelBean" scope="session"
>
> >
>
> > */
>
> >
>
> > public class EditorPanelBean {
>
> >
>
> >
>
> >
>
> > private ArrayList<IEditorPanelTabBean> tabs = new
>
> > ArrayList<IEditorPanelTabBean>();
>
> >
>
> >
>
> >
>
> > private String TABBEDPANE =
>
> > "org.apache.myfaces.HtmlPanelTabbedPane";
>
> >
>
> > private String PANELTAB = "org.apache.myfaces.HtmlPanelTab";
>
> >
>
> >
>
> >
>
> > //private String TABBEDPANE =
>
> > HtmlPanelTabbedPane.class.getName();
>
> >
>
> > //private String PANELTAB = HtmlPanelTab.class.getName();
>
> >
>
> >
>
> >
>
> > private UIComponent pane = null;
>
> >
>
> > private HtmlPanelTab tab = null;
>
> >
>
> >
>
> >
>
> > private int numtimes = 0;
>
> >
>
> >
>
> >
>
> > public UIComponent getPane (){
>
> >
>
> > FacesContext context = FacesContext.getCurrentInstance();
>
> >
>
> > Application app = context.getApplication();
>
> >
>
> >
>
> >
>
> > if (pane == null){
>
> >
>
> > pane = app.createComponent(TABBEDPANE);
>
> >
>
> > }
>
> >
>
> >
>
> >
>
> > if (tab == null){
>
> >
>
> > tab = (HtmlPanelTab)app.createComponent(PANELTAB);
>
> >
>
> > }
>
> >
>
> >
>
> >
>
> > numtimes ++;
>
> >
>
> > System.out.println("Numtimes = " + numtimes);
>
> >
>
> > tab.setLabel(Integer.toString(numtimes));
>
> >
>
> >
>
> >
>
> > pane.getChildren().add(tab);
>
> >
>
> >
>
> >
>
> > return pane;
>
> >
>
> > }
>
> >
>
> >
>
> >
>
> > }
>
> >
>
> >
>
> >
>
> > Now, as you can see, it should be printing out to the console the value of
>
> > numtimes.
>
> >
>
> >
>
> >
>
> > When the page first loads, everything goes as expected. However, if I hit
>
> > the refresh button in my browser, nothing prints out to the console, and
>
> it
>
> > never hits the method in Eclipse's debug mode (which it does on initial
>
> > load).
>
> >
>
> >
>
> >
>
> > I have another tag, for a table, whose data is backed by a bean on the
>
> same
>
> > page (not the same jsp, but they are both imported by another "container"
>
> > page).
>
> >
>
> >
>
> >
>
> > <h:dataTable value="#{todoHandler.todoListModel}" var="list"
>
> >
>
> > first="#{todoHandler.firstRowIndex}"
>
> >
>
> > rows="#{todoHandler.noOfRows}"
>
> >
>
> > styleClass="view" rowClasses="tableRow">
>
> >
>
> >
>
> >
>
> >
>
> >
>
> > Now, the method ToDoHandler.getNoOfRows also has a sysout, which DOES
>
> print
>
> > to the console every time I refresh the page, so I know it's not that I'm
>
> > just getting some cached version or that my browser is bugging out.
>
> >
>
> >
>
> >
>
> > They are both session level beans as you can see:
>
> >
>
> >
>
> >
>
> >
>
> >
>
> > <managed-bean>
>
> >
>
> > <managed-bean-name>todoHandler</managed-bean-name>
>
> >
>
> > <managed-bean-class>(name
>
> > omitted).ToDoListHandler</managed-bean-class>
>
> >
>
> > <managed-bean-scope>session</managed-bean-scope>
>
> >
>
> > </managed-bean>
>
> >
>
> >
>
> >
>
> > <managed-bean>
>
> >
>
> > <managed-bean-name>editorPanelBean</managed-bean-name>
>
> >
>
> > <managed-bean-class>(name
>
> > omitted).EditorPanelBean</managed-bean-class>
>
> >
>
> > <managed-bean-scope>session</managed-bean-scope>
>
> >
>
> > </managed-bean>
>
> >
>
> >
>
> >
>
> >
>
> >
>
> > So. what gives? Does the component binding not refresh when the page is
>
> > reloaded, but the value binding does? I know this is a lot of information,
>
> > but I'd rather give too much than too little, and I appreciate any help I
>
> > can get as this has turned into a total blocker issue for me.
>
> >
>
> >
>
> >
>
> >
>
> > Jeremy Sager
>
> >
>
> > Data Communications Product Manager
>
> >
>
> > Chesapeake System Solutions
>
> >
>
> > 410.356.6805 x120
>
> >
>
> >
>
> > [EMAIL PROTECTED]
>
> >
>
> >
>
>
>
>
>
> --
>
>
>
> http://www.irian.at
>
>
>
> Your JSF powerhouse -
>
> JSF Consulting, Development and
>
> Courses in English and German
>
>
>
> Professional Support for Apache MyFaces
>
>
>
>
>
>
>
> Jeremy Sager
>
> Data Communications Product Manager
>
> Chesapeake System Solutions
>
> 410.356.6805 x120
>
> [EMAIL PROTECTED]
>
>
>
>
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces