Sorry, Andrew! I am a little bit slow. Please review it if I understand
what you told me with the following code.
public abstract class ActionBase extends Action {
protected abstract void process() throws Exception;
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest req,
HttpServletResponse resp) {
ActionContext ac = new ActionContext(mapping, form, req, resp);
process(ac);
}
public HttpServletRequest getRequest(ActionContext ac) {
return ac.getRequest();
}
........
}
----- Original Message -----
From: "Andrew Hill" <[EMAIL PROTECTED]>
To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
Sent: Friday, July 04, 2003 2:42 AM
Subject: RE: extending Action problems
> Yes, this is a quite annoying feature of the singleton nature of Actions
> (and given the efficiency of modern JVMs at instantiating and garbage
> collecting there is jolly good argument for changing the RequestProcessor
to
> instantiate new instances of Action for each request (and do feel free to
> try this at home kids!) - though Im getting off topic here).
>
> One way of dealing with this is to create a bean (or bean like object)
that
> has the getters and setters you need, and to pass this to any method in
your
> action that needs it. You instantiate the object at the start of perform()
> (or execute() method in struts1.1) and then pass the reference to methods.
>
> In my app I have an object for this task which I named ActionContext -
this
> basically just wrapped a Hashmap into which I could insert/retrieve stuff
> with ActionContext.setAttribute, getAttribute, and I also has specific
> getters for the perform signature objects you mentioned - ActionForm,
> ActionMapping, HttpServletRequest and HttpServletResponse references -
> (which are passed to its constructor) - so you still have to pass one
> reference around as a parameter - but its a lot less typing than 4 - and
its
> a great place for putting other stuff as well that is internal to the
action
> (and for which you would rather not use the request attributes for reasons
> of scoping purity). And of course since the object is instantiated in the
> action and is only used in that thread and is garbage collected at the
end,
> it does not suffer the thread safety constraints you encountered.
>
> <btw>
> If you want to store other stuff in it you may decide Hashmaps are a bit
on
> the heavy side - in which case you could have a superclass for your
> 'ActionContext' that has getters for request,mapping,response,actionform
and
> instantiate classes (inner classes perhaps) in your Actions that add
extra
> properties specific to the needs of the action.
> </btw>
>
> <drop-name celebrity="Ted Husted">
> Actually I vaguely recall Ted mentioning in a reply to some post of mine
> that he used a similar technique quite often - but it may have been
someone
> else so don't quote me on that!
> </drop-name>
>
>
> -----Original Message-----
> From: Billy Ng [mailto:[EMAIL PROTECTED]
> Sent: Friday, 4 July 2003 17:06
> To: Struts Users Mailing List
> Subject: extending Action problems
>
>
> I make a mistake on extending the Action. I have the following code to
set
> the parameters in the perform() to the setters. At first, I wanted
> whichever the classes that extends ActionBase can get the parameters by
> simply calling the getters. However, the Action is a singleton, the
> instance variables will be used by all actions. Anybody can give me
> suggestion to make the getters to return the mapping, form, req, and resp
as
> local variables?
>
> Thanks!
>
> public class ActionBase extends Action {
>
> private ActionMapping mapping;
> private ActionForward actionForward;
> private ActionForm form;
> private HttpServletRequest req;
> private HttpServletResponse resp;
> private String view;
>
> protected void process() throws Exception {}
>
> public ActionForward perform(ActionMapping mapping,
> ActionForm form,
> HttpServletRequest req,
> HttpServletResponse resp) {
>
> setActionMapping();
> setActionForm(data);
> setRequest(req);
> setResponse(resp);
> process();
> }
>
> protected void setActionMapping(ActionMapping mapping) {
> this.mapping = mapping;
> }
>
> protected ActionMapping getActionMapping() {
> return this.mapping;
> }
>
> protected void setRequest(HttpServletRequest req) {
> this.req = req;
> }
>
> protected HttpServletRequest getRequest() {
> return this.req;
> }
>
> protected void setResponse(HttpServletResponse resp) {
> this.resp = resp;
> }
>
> protected HttpServletResponse getResponse() {
> return this.resp;
> }
> }
>
>
> ---------------------------------------------------------------------
> 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]