You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Eric Arlotti (JIRA)" <ji...@apache.org> on 2007/02/09 12:22:16 UTC

[jira] Created: (STR-3002) Mapping problem for 2 simultaneous actions

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
earlotti@orkis.com

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


[jira] Resolved: (STR-3002) Mapping problem for 2 simultaneous actions

Posted by "Niall Pemberton (JIRA)" <ji...@apache.org>.
     [ 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
> earlotti@orkis.com

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