On 3/9/06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
> Hello Craig,
>
> thanks for your answer. The phase listener is the correct timepoint for
> the
> component creation, yet it will be executed repeatedly for each request so
> how
> can I avoid re-adding components to the view tree? Isn't there something
> like a
> servlet's init() method? Otherwise I'd still have to perform a check like
> findComponent() on each request which I do not really like.


The phase listener will only be invoked repeatedly if you ask for *all*
phases.  If you implement getPhaseId() like this;

    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

you will only get notified at the beginning and end of Render Response.

NOTE - even if you *are* listening to all phases, you can distinguish them
by calling event.getPhaseId() to see which phase you are in.

Thanks,
> Tom


Craig


Quoting Craig McClanahan <[EMAIL PROTECTED]>:
>
> > On 3/9/06, Tom Ziemer <[EMAIL PROTECTED]> wrote:
> > >
> > > Hi Craig,
> > >
> > > sorry, if this is totally OT, but I just posted a similar question in
> > > the sun forum: Where would you actually place the code you mentioned
> > > within a JSF component? I mean beginEncode() is called each time the
> > > page is requested so what can I do, if I only want to add a component
> > > once? I don't think that implementing NamingContainer and calling
> > > findComponent() is a really nice solution ...
> >
> >
> > I can point you at a real example, if you prefer :-).
> >
> > You know how most databases come with some sort of client application
> > that
> > lets you type in SELECT statements and then dynamically creates a table
> > (based on the column names returned by the query) to display the
> > responses?
> > I've got just such an example app (shale-sql-browser) in the Shale
> > nightly
> > builds[1].  Drop the war file onto your favorite servlet container, and
> > type
> > "select * from zip_codes" into the query field and submit the form.
> >
> > Although this particular example uses Shale's "prerender()" callback
> > method,
> > it is still easy to understand when you'd do this in terms of the
> > standard
> > JSF lifecycle:
> >
> > * RESTORE VIEW - JSF sees the incoming request and restores
> >   the previous component tree
> >
> > * APPLY REQUEST VALUES - JSF updates the local values of
> >   any input components, based on the request parameters.  In this
> >   case, it notices the values of the "query" parameter, which will
> >   contain the SELECT statement to execute.
> >
> > * PROCESS VALIDATIONS - JSF checks any validations.  None
> >   in this example.
> >
> > * UPDATE MODEL VALUES - JSF pushes values into the model.
> >   In this case, it pushes the local value of the "query" parameter
> >   into the "query" property of the backing bean (Query.java).
> >
> > * INVOKE APPLICATION - Grab the query string and actually
> >   execute it, creating a ResultSet.  Find the table component,
> >   and clear its old children.  Grab the ResultSetMetaData for
> >   the result set.  Dynamically construct child components for
> >   all of the database columns that were returned.
> >
> > * RENDER RESPONSE - Display the resulting component tree,
> >   which was partially created from the JSP page (it has an
> >   empty <h:table> component for the response data) and partially
> >   created by dynamic component creation.
> >
> > So, you'd typically operate on the input data during the action method
> > that
> > is called when the form is submitted, setting up the data to be used
> > later.
> > If you are going to redisplay the same page, you can also do the
> > component
> > creation at that point in time -- if you're navigating to a different
> > page,
> > you will need a phase listener listening for a "before render response"
> > event, because you need the second page's component tree to have been
> > created already.
> >
> > If you're doing that, though, just go ahead and use Shale and stick the
> > component creation into the prerender() method.  That way you won't have
> > to
> > worry about what the heck a "phase listener" is.
> >
> > Thanks,
> > > Tom
> >
> >
> > Craig
> >
> > [1] http://cvs.apache.org/builds/struts/nightly/struts-shale/
> >
> >
> > Craig McClanahan wrote:
> > > > On 3/9/06, Rivka Shisman <[EMAIL PROTECTED]> wrote:
> > > >> Hi friends,
> > > >>
> > > >>
> > > >>
> > > >> I need to dynamically build an input form that may contain various
> > > >> html:fields (i.e. html:text, html:select, html:radio etc).
> > > >>
> > > >> The type and name of the html:field will be determined at runtime
> > (from
> > > >> DB table).
> > > >>
> > > >> How can I do it using Struts and JSP?
> > > >
> > > >
> > > > Basically, you can not do this sort of thing with the Struts HTML
> > tags
> > > ...
> > > > but you could easily do it with JavaServer Faces components.  A
> > quick
> > > > snapshot to give you the idea of how it works:
> > > >
> > > >     HtmlForm form = ...; // Acquire a reference to the parent form
> > > component
> > > >
> > > >     HtmlOutputLabel label1 = new HtmlOutputLabel(); // Label for
> > > username
> > > > field
> > > >     label1.setValue("Username:");
> > > >
> > > >     HtmlInputText username = new HtmlInputText(); // Username field
> > > >     username.setId("username");
> > > >
> > > >     HtmlOutputLabel label2 = new HtmlOutputLabel(); // Label for
> > > password
> > > > field
> > > >     label2.setValue("Password:");
> > > >
> > > >     HtmlInputSecret password = new HtmlInputSecret(); // Password
> > field
> > > >     password.setId("password");
> > > >
> > > >     HtmlCommandButton submit = new HtmlCommandButton(); // Submit
> > button
> > > >     submit.setId("logon");
> > > >
> > > >     List children = form.getChildren();
> > > >     children.add(label1);
> > > >     children.add(username);
> > > >     children.add(label2);
> > > >     children.add(password);
> > > >     children.add(submit);
> > > >
> > > > There's lots more you can do, but this gives the basic flavor of
> > > dynamically
> > > > creating component hierarchies.
> > > >
> > > > Thanks
> > > >> Rivka
> > > >
> > > >
> > > > Craig
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Reply via email to