Personally, I like to keep my ActionForms as dumb as possible (I actually
use DynaValidatorActionForms). I see them as simple data transport
mechanism. When ever I have to prepopulate the ActionForm for a "prepare"
type of Action I do it within a the Action class (not explicitely - I
delegate to a service layer to handle this).

For me, this keeps things separate, simple and cohesive.

robert

> -----Original Message-----
> From: Phase Web and Multimedia [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, January 14, 2003 10:12 AM
> To: Struts Users Mailing List
> Subject: RE:Collection Population Post-Validation Best Practice
>
>
> Greetings again,
>
> I appreciate the afformentioned approaches (Robert, Karim, Puneet). I find
> Roberts to be the most logical, simple and clean for myself. I use
> LookupDispatchAction so this would actually be easy to do. I was
> getting the
> loop for the very reason you mentioned :-D. It was a test app to
> see how to
> address the problem of populating collections post validation and I was
> calling the process Action.
>
> So the practice would be to separate the entry Action from the process
> Action. Use the entry action as your input for errors and it will have the
> logic to populate your collections prior to showing the page.
>
> It also seems to me that the ActionForm does not exclude us from making
> calls to our business logic from within the validate method. So if I have
> any standard prepopulation (post validation)... I can just call my logic
> classes and set the appropriate members of the ActionForm from within the
> validate prior to the ActionErrors returning to the input page.
>
> Something like (with validator):
>
> public MyActionForm extends ValidatorActionForm {
>
> ...
>
> public void setMyCollection(ArrayList myCollection) {
>
>       this.myCollection = myCollection;
>
> }
>
> ...
>
> public ActionErrors validate(
>       ActionMapping mapping,
>       HttpServletRequest request)
> {
>
> // run my validator validation and capture error
> ActionErrors errors = super.validate(mapping,request);
>
> // run my own validation
> if (x != 5) {
>
>       errors.add("myErrorMessage",
>               new ActionError("my.custom.error"));
>
> }
>
> if (errors.empty())
> {
>        return null;
> } else {
>       ...
>       // populate ActionForm collections here and return errors
>       this.myCollection = MyLogicClass.getMyCollection();
> //retrieves Collection
>
>       return errors;
> }
>
>
> }
>
> }
>
> So then here is the final question:
> Is it appropriate practice to have logic classes being called in the
> validate method to populate collections in the form? What's the official
> position?
>
> Thanks,
> Brandon Goodin
> Phase Web and Multimedia
> P (406) 862-2245
> F (406) 862-0354
> [EMAIL PROTECTED]
> http://www.phase.ws
>
>
> -----Original Message-----
> From: Karim Saloojee [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, January 14, 2003 5:41 AM
> To: Struts Users Mailing List
> Subject: Re: [Our Practice]Collection Population Post-Validation Best
> Practice
>
>
> Hi
>
> What we have done is introduce a ListManager class. This is a singleton
> object that is accessible from the form via its superclass (our custom
> superclass).
>
> What we have done in our form is have two fields for a
> collection, i.e. our
> dropdown list. The first field is used to populate the values of the list
> and the second is used to store the selected value.
>
> E.G.:
> public Collection getListOfPeople() {
>   return ListManager.getInstance().getPeople();
> }
>
> public String getSelectedPerson() {
>   return selectedPerson;
> }
>
> public void setSelectedPerson(String selectedPerson) {
>   this.selectedPerson = selectedPerson;
> }
>
> Our JSP is coded so that the setup of the dropdown calls getListOfPeople()
> and the selected item populates setSelectedPerson(). The taglib
> allows this
> Struts 1.1 b2.
>
> This allows us to store the forms in the request and never have to worry
> about pre-populating them, this seems to work very well for us.
>
> I would appreciate feedback wrt this approach.
>
> Regards,
> Karim
>
>
>
> ----- Original Message -----
> From: "Puneet Agarwal" <[EMAIL PROTECTED]>
> To: "Struts Users Mailing List" <[EMAIL PROTECTED]>;
> <[EMAIL PROTECTED]>
> Sent: Tuesday, January 14, 2003 1:41 PM
> Subject: Re: [Our Practice]Collection Population Post-Validation Best
> Practice
>
>
> > Even we had a similar problem in our application:
> >
> > Agree that making the ActionForm scope to be "session" may
> cause problems,
> > but storing the information in request scope and copying all that
> > information in html and then sending it back to the server
> again may cause
> > extra network traffic.
> >
> > We adopted following workaround for this.
> >
> > 1.  Make most of the ActionForm scope as "session", and write a cleaning
> > mechanism which could keep cleaning up the HTTP session on some basis.
> >   What we adopted was "as soon as the user shall operate on the top drop
> > down menu of the application, it shall remove any ActionForms more than
> last
> > 5.(This "5" was configurable). This keeps the HTTP session lighter.
> >
> > 2. For the screens that have ActionForm scope defined as "request", some
> > information was stored in HTML hidden variables but there was special
> > mechanism for collection objects. For every such screen one object was
> > stored in HTTP session and this object stored all collection objects.
> >
> > Hope you too find this solution good for your application.
> >
> > Regards
> > Puneet
> >
> > ----- Original Message -----
> > From: "Phase Web and Multimedia" <[EMAIL PROTECTED]>
> > To: "Struts User List" <[EMAIL PROTECTED]>
> > Sent: Tuesday, January 14, 2003 12:31 AM
> > Subject: Collection Population Post-Validation Best Practice
> >
> >
> > > In the past I have not done any validation in my ActionForm so I have
> > never
> > > ran across this problem. I read a post from a while back
> regarding this
> > but
> > > the feedback was fairly obscure. I also read in "Struts In Action"
> > regarding
> > > this problem. But, the solutions were a little vague. So, I am looking
> for
> > > some creative specificity.
> > >
> > > Problem:
> > >
> > > I prepopulate some collections in an ActionForm through an
> Action class
> > > before I display the jsp form. I use the collections that I
> populate in
> > the
> > > form to create the drop down (<html:options collection="foo">). Upon
> > > submittal of the jsp form and a failed validate in my ActionForm i
> return
> > > back to the jsp page and my collections are not available/null (of
> course)
> > > because my form is set in request scope. Following are a few possible
> > > solutions ,that came to mind, for re-populating my
> collections prior to
> > > being sent back to ActionMapping's input. I am just wondering which is
> the
> > > best or if there are some better solutions.
> > >
> > > 1) Specify the form as a session scope - I don't really want
> to do this
> > > because I am concerned that as the usage volume goes up I am
> potenially
> > > going to be passing around large complex objects in the session. I
> prefer
> > to
> > > keep it in the request.
> > >
> > > 2) Call my logic classes that populate the collections set the values
> > > (setXXX(), getXXX())from within the validate method prior to returning
> the
> > > ActionErrors. - I am not sure how this would work using
> Validator. Can I
> > > override validate when extending ValidatorActionForm and call
> super() to
> > > make sure that the Validator validation is called and then
> run my logic
> > > classes to repopulate the form?
> > >
> > > 3) Set my ActionMapping's input to go to the Action url
> rather than the
> > jsp
> > > (This was a suggestion in "Struts In Action") - I tried this but I get
> > some
> > > looping and ultimately a StackOverflowError. See Following:
> > >
> > > java.lang.StackOverflowError
> > > at java.util.HashMap.hash(HashMap.java:257)
> > > at java.util.HashMap.removeEntryForKey(HashMap.java:518)
> > > at java.util.HashMap.remove(HashMap.java:507)
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(Ap
> plicationH
> > > ttpRequest.java:231)
> > > ...
> > >       at
> > >
> >
> javax.servlet.ServletRequestWrapper.removeAttribute(ServletRequest
> Wrapper.ja
> > > va:340)
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationD
> ispatcher.
> > > java:676)
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationDispatcher.doForward(Applicati
> onDispatch
> > > er.java:431)
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationDispatcher.forward(Application
> Dispatcher
> > > .java:355)
> > > at
> > >
> >
> org.apache.struts.action.RequestProcessor.doForward(RequestProcess
> or.java:10
> > > 33)
> > > at
> > >
> >
> org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesReque
> stProcesso
> > > r.java:269)
> > > at
> > >
> >
> org.apache.struts.action.RequestProcessor.internalModuleRelativeFo
> rward(Requ
> > > estProcessor.java:980)
> > > at
> > >
> >
> org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelati
> veForward(
> > > TilesRequestProcessor.java:336)
> > > at
> > >
> >
> org.apache.struts.action.RequestProcessor.processValidate(RequestP
> rocessor.j
> > > ava:950)
> > > at
> > >
> >
> org.apache.struts.action.RequestProcessor.process(RequestProcessor
> .java:255)
>
> > > at
> org.apache.struts.action.ActionServlet.process(ActionServlet.java:1422)
> > > at
> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:523)
> > > at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
> > > at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> > > ...
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationD
> ispatcher.
> > > java:683)
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationDispatcher.doForward(Applicati
> onDispatch
> > > er.java:431)
> > > at
> > >
> >
> org.apache.catalina.core.ApplicationDispatcher.forward(Application
> Dispatcher
> > > .java:355)
> > > at
> > >
> >
> org.apache.struts.action.RequestProcessor.doForward(RequestProcess
> or.java:10
> > > 33)
> > > at
> > >
> >
> org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesReque
> stProcesso
> > > r.java:269)
> > > at
> > >
> >
> org.apache.struts.action.RequestProcessor.internalModuleRelativeFo
> rward(Requ
> > > estProcessor.java:980)
> > > at
> > >
> >
> org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelati
> veForward(
> > > TilesRequestProcessor.java:336)
> > >
> > > 4) Make sure I have an html representation of the collection
> in a form -
> > > This idea just seems preposterous.
> > >
> > > Thanks ahead of time for the info.
> > >
> > > Brandon Goodin
> > > Phase Web and Multimedia
> > > P (406) 862-2245
> > > F (406) 862-0354
> > > [EMAIL PROTECTED]
> > > http://www.phase.ws
> > >
> > >
> > >
> > > --
> > > To unsubscribe, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > > For additional commands, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > >
> > >
> >
> >
> > --
> > To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
> >
>
>
>
> --
> To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
>
>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to