[ 
https://issues.apache.org/struts/browse/STR-3002?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Niall Pemberton resolved STR-3002.
----------------------------------

    Resolution: Not A Problem

Please ask user questions on the user list - Jira is for reporting bugs in the 
Struts framework - not in your application code:

  http://struts.apache.org/mail.html

Struts actions are not designed to be "thread safe" and the problem is cause by 
you storing the ActionMapping, HttpServletRequest  and HttpServletResponse in 
instance variables - you need to refactor your code to pass these objects to 
your convenience methods. For example, something like

    public ActionForward execute(ActionMapping mapping, ActionForm form, 
HttpServletRequest request, HttpServletResponse response) throws Exception {

        if (everythingIsOk) {
            return success(mapping);
        } else {
            retun failure(mapping);
        }
    }

    protected ActionForward success(ActionMapping mapping) throws Exception {
        return mapping.findForward("success");
    }


    protected ActionForward failure(ActionMapping mapping) throws Exception {
        return mapping.findForward("failure");
    }

 Closing as INVALID

> Mapping problem for 2 simultaneous actions
> ------------------------------------------
>
>                 Key: STR-3002
>                 URL: https://issues.apache.org/struts/browse/STR-3002
>             Project: Struts 1
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.3.5
>         Environment: Tomcat 5.5.9 - Mac OS X 10.4.8 - Struts 1.3.5 - Java 5.0
>            Reporter: Eric Arlotti
>
> I am experiencing a problem with Struts mapping for 2 actions that execute at 
> the same time : the 2 actions are mapped to the same JSP page although I have 
> defined 2 different JSP pages.
> My web site has a home page with a frameset of 2 frames : 
> <frameset>
>       <frame name="DocsFrame" src="GetDocs.do?set=base">
>       <frame name="CaddyFrame" src="GetCaddy.do?set=caddy">
> </frameset>
> The "GetDocs" action must retrieve all docs contained in a database, the 
> "GetCaddy" action must retrieve the docs in a subset of the database that we 
> call "Caddy".
> Both actions are defined to call the same type of Struts Action called 
> "ListDocsAction".
> Here is how I define the 2 actions in "struts-config.xml" :
>               <action
>                       path="/GetDocs"
>                       validate="false"
>                       scope="request"
>                       type="mydomain.actions.ListDocsAction">
>                       <forward name="success" path="/views/DocsList.jsp"/>
>                       <forward name="failure" path="/views/Error.jsp"/>
>               </action>
>               <action
>                       path="/GetCaddy"
>                       validate="false"
>                       scope="request"
>                       type="mydomain.actions.ListDocsAction">
>                       <forward name="success" path="/views/CaddyList.jsp"/>
>                       <forward name="failure" path="/views/Error.jsp"/>
>               </action>
> As you can see, in case of "success", the GetDocs action should be mapped to 
> the "DocsList.jsp" page and the GetCaddy action should be mapped to the 
> "CaddyList.jsp" page.
> What happens in reality is that the 2 actions are mapped to the same JSP page 
> (some time it's "DocsList.jsp", other time it's "CaddyList.jsp", it seems to 
> depend on which action has terminated first).
> It seems that the fact that the 2 actions execute almost simultaneously 
> provokes a weird behaviour in Struts mapping.
> For convenience, the class ListDocsAction extends an abstract class called 
> GenericAction that implements things that are common to all actions in my 
> project, like retrieving special parameters from the HttpServletRequest and 
> mapping to "success" or "failure". All actions that extends GenericAction 
> must call the "beginRequest" function first at the beginning of their 
> "execute" method. Here is what GenericAction looks like :
> -----------------------------------------------------
> public abstract class GenericAction extends Action {
>       private ActionMapping mapping = null;   
>       private HttpServletRequest request = null;
>       private HttpServletResponse response = null;
>       protected void beginRequest(ActionMapping theMapping, 
> HttpServletRequest theRequest, HttpServletResponse theResponse) {
>               this.mapping = theMapping;
>               this.request = theRequest;
>               this.response = theResponse;
>       }
>       protected ActionForward success() throws Exception {
>               return mapping.findForward("success");
>       }
>       
>       protected ActionForward failure() throws Exception {
>               return mapping.findForward("failure");
>       }
> }
> And here is what looks like the ListDocsAction class :
> -----------------------------------------------------
> public class ListDocsAction extends GenericAction {
>       public ActionForward execute(ActionMapping mapping, ActionForm form, 
> HttpServletRequest request, HttpServletResponse response) throws Exception {
>               beginRequest(mapping, request, response);
>               // do some request to the data base to retrieves docs
>               ....
>               
>               if (everythingIsOk) {
>                       return success();
>               }
>               else {
>                       retun failure();                
>               }
>       }
> }
> I have noticed that if I don't use the convenience method "success" and 
> "failure" in my ListDocsAction class but use mapping.findForward("success") 
> and mapping.findForward("failure") instead, the problem does not occur.
> Eric Arlotti
> [EMAIL PROTECTED]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to