The only problem with this approach is that if you have validation rules
that apply to some of the fields you are trying to reinit, you will not be
able to get to your init() method (invoke phase), assuming that at least 1
validation fails. 
So you either do the validation manually in the invoke phase (would rather
not do that), or you put an immediate on the clear button, and do a render
response to skip the validation and conversion phase. Of course if you do
that, you will not refresh your components's value from the value binding
expressions, so replacing the backing bean that has the bound values is
useless. You have to either blank out the components's value one by one
(would rather not do that), or you do it recursively like Jon said (better
than nothing, but still I would have wanted to just replace my backing bean
in the request map, like I would have done in struts).
What do you think?
v.

-----Message d'origine-----
DeÂ: Korhonen, Kalle [mailto:[EMAIL PROTECTED] 
EnvoyÃÂ: mercredi, 27. avril 2005 23:50
ÃÂ: MyFaces Discussion
ObjetÂ: RE: resetting a form

And another thing is that reset != clear. We have a reset button on one page
but all the action does is it calls the page's backing bean init() again.

Kalle

> -----Original Message-----
> From: Aaron Bartell [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, April 27, 2005 12:07 PM
> To: 'MyFaces Discussion'
> Subject: RE: resetting a form
> 
> I was actually thinking the opposite.  As long as I can 
> remember back I have never used a form reset button (not even 
> when I was doing my web programming with RPG CGI or PHP).  I 
> guess I would look at the scenario for why the user would 
> ever want to clear a form.  Is it because they want to cancel 
> the current process they are going through, then give them a 
> cancel button. Is it because they want to start completely 
> over on the page? - I have never needed to do this in my life 
> as a web page consumer.  I might change a couple values in 
> some fields but I never use the form reset button the web 
> pages always provide.  Just seems so meaningless (and 
> dangerous because of data loss by accident), but maybe that 
> is just me.
> 
> Aaron Bartell
> http://mowyourlawn.com
> 
> -----Original Message-----
> From: Jon Travis [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, April 27, 2005 12:58 PM
> To: MyFaces Discussion
> Subject: Re: resetting a form
> 
> Isn't he talking about things which have inputs?  Clearing 
> the ID is just resetting a read-only parameter, which is a 
> little different than UIInput components.
> 
> What I've been using is a method which recurses through a 
> tree, checking if components are UIInputs.  If they are, it 
> just does component.setValue(null), and 
> component.setSubmittedValue(null).
> 
> It seems like this would be a _very_ common thing for people 
> to want to do, but I'm surprised I haven't found it or 
> something similar in any documentation I have (including Kito's book)
> 
> -- Jon
> 
> 
> On Apr 27, 2005, at 2:48 AM, CsÃk Norbert wrote:
> 
> > Check out my clear button. In faces-config I have a navigation rule 
> > for the "clear" outcome: from page.jspx to page.jspx. It 
> works for me.
> >
> >
> > public class PageBean  {
> >     private String id;
> >     private String name;
> >
> >     public PageBean() {
> >     }
> >     
> >     public String save() {
> >             FacesContext.getCurrentInstance().addMessage(null, new 
> > FacesMessage("Saved."));
> >             
> >             id = "15";
> >             
> >             return "success";
> >     }
> >     
> >     public String delete() {
> >             FacesContext.getCurrentInstance().addMessage(null, new 
> > FacesMessage("Deleted."));
> >             
> >             return clear();
> >     }
> >     
> >     public String clear() {
> >             id = "";
> >     
> >             return "clear";
> >     }
> >     
> >     public String editDetail() {
> >             FacesContext.getCurrentInstance().addMessage(null, new 
> > FacesMessage("Detail."));
> >             
> >             return "success";
> >     }
> >     
> >     public boolean isLoaded() {
> >             return getId() != null && !getId().equals("");
> >     }
> >
> >     public String getId() {
> >             return (id == null)
> >                     ?  
> > 
> (String)FacesContext.getCurrentInstance().getExternalContext().getRequ
> > e
> > stParameterMap().get("form:id")
> >                     : id
> >             ;
> >     }
> >
> >     public void setId(String id) {
> >             this.id = id;
> >     }
> >
> >     public String getName() {
> >             return name;
> >     }
> >
> >     public void setName(String name) {
> >             this.name = name;
> >     }
> > }
> >
> > And the JSF page:
> >
> > <?xml version='1.0' encoding='ISO-8859-2'?> <jsp:root 
> > xmlns="http://www.w3.org/1999/xhtml";
> >           xmlns:jsp="http://java.sun.com/JSP/Page"; version="2.0"
> >           xmlns:f="http://java.sun.com/jsf/core";
> >           xmlns:h="http://java.sun.com/jsf/html";>
> >   <f:view>
> >     <html>
> >       <jsp:output omit-xml-declaration="false"  
> > doctype-root-element="html"
> >
> > doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";
> >                   doctype-public="-//W3C//DTD XHTML 1.0 
> Strict//EN"/>
> >       <jsp:directive.page 
> contentType="text/html;charset=ISO-8859-2"/>
> >       <head>
> >         <meta http-equiv="Content-Type"
> >               content="text/html; charset=ISO-8859-2"/>
> >         <title>
> >           Page
> >         </title>
> >       </head>
> >       <body>
> >         <h:form id="form">
> >           <h:panelGrid columns="1">
> >             <h:messages layout="table"/>
> >             <h:panelGroup>
> >               <h:commandButton value="New" 
> action="#{PageBean.clear}"
> > immediate="true"/>
> >               <h:commandButton value="Save" 
> action="#{PageBean.save}"/>
> >               <h:commandButton value="Delete"  
> > action="#{PageBean.delete}"
> >                                immediate="true"  
> > rendered="#{PageBean.loaded}"/>
> >             </h:panelGroup>
> >                     
> >                     <h:inputHidden id="id" value="#{PageBean.id}"/>
> >                     
> >                     <h:panelGrid columns="2">
> >                             <h:outputLabel 
> style="color:red" value="NÃv"/>
> >                             <h:inputText 
> value="#{PageBean.name}" required="true"/>
> >                             <h:outputLabel value="ID"/>
> >                             <h:outputText value="#{PageBean.id}"/>
> >                             <h:outputLabel value="TÃpus"/>
> >                             <h:commandButton 
> action="#{PageBean.editDetail}" value="Szerkeszt"
> > disabled="#{!PageBean.loaded}"/>
> >                     </h:panelGrid>
> >                     
> >           </h:panelGrid>
> >         </h:form>
> >       </body>
> >     </html>
> >   </f:view>
> > </jsp:root>
> >
> >
> >
> > On 4/26/05, Vincent SEVEL <[EMAIL PROTECTED]> wrote:
> >>
> >>
> >>
> >> Hi, I am trying to figure out the best/simplest way to 
> reset a form 
> >> whose fields are associated with a backing bean. I have found one 
> >> incomplete solution and would like to hear from other people.
> >>
> >>
> >>
> >> I have got a person.jsp, which contains:
> >>
> >> Ã       Input text bound to #{person.lastname}, required=true
> >>
> >> Ã       Input text bound to #{person.firstname}
> >>
> >> Ã       Button bound to #{personPage.console} that displays the  
> >> content of
> >> the form in the console
> >>
> >> Ã       Button bound to #{personPage.reset} that blanks 
> out all the  
> >> fields
> >> from the form
> >>
> >>
> >>
> >> 1) Initially I just removed the "person" object from the 
> request map  
> >> and
> >> returned null from the reset action. This caused the form to be  
> >> reset, but
> >> also an validation error message to be displayed on the next page  
> >> about the
> >> first field not being filled (ie: it is required).
> >>
> >>
> >>
> >> 2) Then, I set immediate='true' on the reset button, and 
> rendered the
> >> response directly from the reset action (ie:
> >> FacesContext.getCurrentInstance().renderResponse()). 
> Although this  
> >> skipped
> >> the validation phase, it did not repopulate the components 
> from the  
> >> value
> >> binding expressions (ie: it does not blank out the form).
> >>
> >>
> >>
> >> 3) The only and last solution I can see at this time would be to
> >> findComponent() the lastname & firstname fields, blank them out  
> >> manually and
> >> renderResponse() immediately. But this extremely tedious 
> and error  
> >> prone.
> >>
> >>
> >>
> >> In short, I would like to deactivate validation and 
> conversion for  
> >> some
> >> special actions, but still feed from the backing bean during the  
> >> render
> >> phase. Any ideas?
> >>
> >>
> >>
> >> Thanks, source follows.
> >>
> >> Vincent
> >>
> >>
> >>
> >> person.jsp
> >>
> >> <f:view>
> >>
> >>             <h:messages styleClass="error" layout="table"  
> >> showDetail="true"
> >> showSummary="false" tooltip="true"/>
> >>
> >>             <h:form>
> >>
> >>                         Lastname: <h:inputText id="lastname"
> >> value="#{person.lastname}" required="true"/><p/>
> >>
> >>                         Firstname: <h:inputText id="firstname"
> >> value="#{person.firstname}"/><p/>
> >>
> >>                         <h:commandButton value="Console"
> >> action="#{personPage.console}"/>
> >>
> >>                         <h:commandButton value="Reset"  
> >> immediate="true"
> >> action="#{personPage.reset}"/>
> >>
> >>             </h:form>
> >>
> >> </f:view>
> >>
> >>
> >>
> >> public class Person {
> >>
> >>   private String lastname;
> >>
> >>   private String firstname;
> >>
> >> â
> >>
> >>
> >>
> >> public class PersonPage {
> >>
> >>
> >>
> >>   private Map getRequestMap() {
> >>
> >>     return
> >> 
> FacesContext.getCurrentInstance().getExternalContext().getRequ
> estMap() 
> >> ;
> >>
> >>   }
> >>
> >>
> >>
> >>   public String console() {
> >>
> >>     Person person = (Person) getRequestMap().get("person");
> >>
> >>     System.out.println(person.getLastname()+"  
> >> "+person.getFirstname());
> >>
> >>     return null;
> >>
> >>   }
> >>
> >>
> >>
> >>
> >>
> >>   public String reset() {
> >>
> >>     getRequestMap().remove("person");
> >>
> >>     FacesContext.getCurrentInstance().renderResponse(); // 
> will skip  
> >> the
> >> validation and conversion phases, but will not refresh from the  
> >> backing bean
> >>
> >>     return null;
> >>
> >>   }
> >>
> >> }
> >
> >
> > -- 
> >  CsÃk Norbert          http://norbert.web.elte.hu/
> >  ProgramtervezÅ matematikus
> >  Trilobita Informatikai Rt. - rendszertervezÅ fejlesztÅmÃrnÃk
> > ___ keep sm:)ing _________________________ooo__C( O O )L__ooo__
> > http://www.aion.hu/ - A csik.NET otthona
> > http://www.spreadfirefox.com/ - Rediscover the web
> > LÃgy pontos: MÃrj mikro-millimÃterben! JelÃlj krÃtÃval! 
> VÃgj baltÃval!
> 

Reply via email to