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