Hmm, can you send some code? What kind of validation do you use? Serverside or js? I suppose it happens because the validation-whatsoever send the user directly to use jsp bypassing the action.
If you need a quick and dirty solution, alter you preExecute method to put the objects into the session instead of the request scope. If you want to make it less dirty add a check whether they already are there: if (req.getSession().getAttribute("objHospitals")==null) req.getSession.setAttribute("objHospitals", staticObjHospitalsVariable); For the proper solution you should show your code and struts-config parts, so we can work out the best solution. regards Leon P.S. are you on struts 1.x or 2.x? On 1/4/07, Daniel Chacón Sánchez <[EMAIL PROTECTED]> wrote:
Leon!!! something happen... I applied your solution putting the objects in the request in the preExecute method of the base action, and all works fine, but... when the user made a mistake, for example leave a required field in blank, and the ActionErrors validate method of the ActionForm return the errors, the jsp launch the following exception: javax.servlet.jsp.JspException: Cannot find bean under name objHospitals This only happen when the method validate of the actionErrors returns an error, why the request is lost or why the jsp don´t found the object? How can I solve this problem, thanks!!! Hope you can answer Leon 2007/1/2, Leon Rosenberg <[EMAIL PROTECTED]>: > > u welcome :-) > L > > On 1/2/07, Daniel Chacón Sánchez <[EMAIL PROTECTED]> wrote: > > Thanks Leon!!!, I got it!!! > > > > 2007/1/2, Leon Rosenberg < [EMAIL PROTECTED]>: > > > > > > On 1/2/07, Daniel Chacón Sánchez <[EMAIL PROTECTED]> wrote: > > > > Thanks > > > > > > > > Leon, about using the servlet context, I read that on a distributed > > > > application the share information of the servlet context is not > > > entererly > > > > global right?: > > > > > > Right, but since the data is readonly its ok to have a copy per > > > webserver, right? It doesn't harm you to put one data-object (even a > > > complex one) in the application scope. If you need to check for > > > updates periodically you could make use of the subject-observer > > > pattern and notify the webservers from the business layer via > > > rmi/corba/jms/whatever to renew their data or just check if the data > > > is still valid and replace it if needed periodically in a separate > > > daemon thread. > > > > > > > > > > > *"...In the case of a web application marked "distributed" in its > > > deployment > > > > descriptor, there will be one context instance for each virtual > machine. > > > In > > > > this situation, the context cannot be used as a location to share > global > > > > information (because the information won't be truly global). Use an > > > external > > > > resource like a database instead."* > > > > > > > > > > > > About the second solution that you gave to me, I do not understand, > you > > > said > > > > that for example in my BaseAction Class create a method to put the > > > objects > > > > in the request? The problem is that in every request the application > > > will go > > > > to the database to load the objects and then put them on the > request! > > > What I > > > > do not understand is how to put the objects in the request without > have > > > to > > > > go the database each time that a request is made and the method in > the > > > > BaseAction is call. > > > > > > BaseAction extends Action{ > > > private static Data1Class data1; > > > private static Data2Class data2; > > > .... > > > > > > static{ > > > data1 = createData1FromDB(); > > > data2 = createData2FromDB(); > > > } > > > > > > //now in my actions i have my own execute method, you may have > > > something //similar: > > > protected void preProcessExecute( > > > ActionMapping mapping, > > > ActionForm af, > > > HttpServletRequest req, > > > HttpServletResponse res) > > > throws Exception{ > > > > > > req.setAttribute("data1", data1); > > > req.setAttribute("data2", data2); > > > ......... > > > } > > > > > > protected void postProcessExecute( > > > ActionMapping mapping, > > > ActionForm af, > > > HttpServletRequest req, > > > HttpServletResponse res) > > > throws Exception{ > > > > > > } > > > > > > public abstract ActionForward myExecute( > > > ActionMapping mapping, > > > ActionForm af, > > > HttpServletRequest req, > > > HttpServletResponse res) > > > throws Exception; > > > > > > > > > public final ActionForward execute( > > > ActionMapping mapping, > > > ActionForm bean, > > > HttpServletRequest req, > > > HttpServletResponse res) > > > throws Exception { > > > > > > > > > preProcessExecute(mapping, bean, req, res); > > > ActionForward forward = myExecute(mapping, bean, req, > > > res); > > > postProcessExecute(mapping, bean, req, res); > > > return forward; > > > } > > > } > > > > > > You just have to ensure, that when an Action overwrites preProcess it > > > calls super.preProcess. > > > The advantage of this method is, that actions at the end of the > > > hierarchy have a chance to overwrite the data by the base action, > > > which is quite useful for internationalization and such. > > > > > > Same rules for updates as for servletContext apply. > > > > > > regards > > > Leon > > > > > > > > > > > > > > 2007/1/2, Leon Rosenberg <[EMAIL PROTECTED] >: > > > > > > > > > > The easiest way is to initialize the data once in the > > > > > init(ServletConfig) method of the servlet and put them into the > > > > > application scope (servletcontext). The struts tags will be able > to > > > > > access the data directly, so you don't need to change a bit. > > > > > Of course the data structures theirself must be threadsafe to > access, > > > > > which shouldn't be a problem if you are only reading them. > > > > > > > > > > Alternatively you can perform this in a static initializer in a > action > > > > > and put them in the request scope of each request (if you have a > > > > > common code block all actions are passing through, like > authorization) > > > > > or into the application scope on first request (which would need a > bit > > > > > of synchronization with double checked locking) > > > > > > > > > > regards > > > > > leon > > > > > > > > > > On 1/2/07, Daniel Chacón Sánchez <[EMAIL PROTECTED]> wrote: > > > > > > Hi all, I'm using struts framework on my application, but I have > a > > > > > > perfomance question. > > > > > > > > > > > > When my application starts I load objects in session that may or > may > > > not > > > > > > will be used (depends on what the user does), for example I > load > > > the > > > > > health > > > > > > centers, hospitals, countries, etc, that will be available for > the > > > users > > > > > in > > > > > > html:selects, I know that to had many objects in session is not > > > good, in > > > > > > fact each time the user click on one application option (menu) > all > > > the > > > > > > objects in session are erased, except the ones that I load on > the > > > start > > > > > of > > > > > > the application. Is there a way (maybe a pattern) to load this > > > objects > > > > > in > > > > > > the moment that are needed, and not load all at the start of the > > > > > > > application. This object are use on differents modules so I load > > > them on > > > > > the > > > > > > start of the aplication and put them in sesion for not to go to > the > > > > > database > > > > > > each time I need to load them on a html:select. > > > > > > > > > > > > any solution, idea? or that is the only way? > > > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > 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] > > > > > > > > > > > > --------------------------------------------------------------------- > 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]