You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by "V. Cekvenich" <vi...@users.sourceforge.net> on 2002/09/21 17:59:34 UTC

Re: How to remove ActionForm with session scope from the session obje ct

Code at your request:
(by the way, thi comes in handy lon larger scale projects, it auto 
cleans up sesion beans for your, so you can put more users per box).

V.

package com.rd;

import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.util.*;

/**
  *  TC@baseBeans.com
  *
  *
  */
public abstract class ScopedAction extends Action {


	public static String TOKEN_KEY = ScopedAction.class.getName() + ".TOKEN";
	public static String ATTRIBUTES_KEY = ScopedAction.class.getName() + 
".ATTRIBUTES";

	/**
	 *
	 *
	 */
	private void _init(ActionContext context) {
		HashMap map = new HashMap();
		context.setSessionAttribute(ATTRIBUTES_KEY, map);
		init(context);
	}


	/**
	 *
	 *
	 */
	public abstract void init(ActionContext context);


	/**
	 * Do any cleanup necessary within the session and application context.
	 * The destroy event happens when the action is loosing
	 * focus within the application.  Is is possible for the action to gain
	 * control again, therefore, the destroy event may be called more than
	 * once during an application.
	 *
	 */
	public abstract void destroy( ActionMapping map, HttpServletRequest 
req, HttpServletResponse res);

	/**
	 *
	 */
	protected void _destroy( ActionMapping map, HttpServletRequest req, 
HttpServletResponse res ) {
		req.getSession().removeAttribute(ATTRIBUTES_KEY);
		destroy( map, req, res );
	}

	/**
	 *
	 *
	 *
	 */
	public ActionForward execute( ActionMapping map, ActionForm form, 
HttpServletRequest req, HttpServletResponse res) {


		// create the context
		ActionContext context = new ActionContext();
		context.map  = map;
		context.form = form;
		context.req  = req;
		context.res  = res;

		/**
		 * call init if this is the first time since the last destroy
		 *
		 */
		if (beginScope(context)) {
			
			// tell the old action to destroy itself
			ActionMapping oldScopeOwner =
				(ActionMapping) context.getSessionAttribute(TOKEN_KEY);

			if (oldScopeOwner != null) {
				
				String actionClassName = oldScopeOwner.getType();
				
				// we must instantiate the previous owner to invoke its destroy method
				try {
					Class actionClass = Class.forName(actionClassName);
					Object subject = actionClass.newInstance();
					if (subject instanceof ScopedAction) {
						((ScopedAction) subject)._destroy(oldScopeOwner, req, res);
					}
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InstantiationException e) {
					e.printStackTrace();
				}
			}

			// take ownership the action scoping token
			context.setSessionAttribute(TOKEN_KEY, map);
			_init(context);
		}
		execute(context);
		return context.forward;
	}


	/**
	 *
	 */
	public abstract void execute(ActionContext context);


	/**
	 * true if the current session is being handed off to this
	 * action.  After the hand off, this action will own the "action
	 * scope", i.e., be the action considered as current.
	 *
	 */
	private boolean beginScope(ActionContext context) {

		ActionMapping scopeOwner =
			(ActionMapping) context.getSessionAttribute(TOKEN_KEY);

		// if there is no previous owner, we are initializing
		if ( scopeOwner == null )
			return true;
		
		String lastAction = scopeOwner.getPath();
		String currentAction = context.map.getPath();
		System.out.println(lastAction + " " + currentAction);
		if (!currentAction.equals(lastAction))
			return true;
		else
			return false;
	}
}

ackage com.rd;

import java.util.*;

/**
  *
  *
  */
public class ActionContext {

	public org.apache.struts.action.ActionMapping map;
	public javax.servlet.http.HttpServletRequest req;
	public javax.servlet.http.HttpServletResponse res;
	public org.apache.struts.action.ActionForm form;
	public org.apache.struts.action.ActionForward forward;
	
	public Object getSessionAttribute(String key) {
		return req.getSession(true).getAttribute(key);
	}
	
	public void setSessionAttribute(String key, Object value) {
		req.getSession(true).setAttribute(key, value);
	}	

	/**
	 *
	 */
	public void setAttribute(String key, Object value) {
		HashMap hmap = (HashMap)req.getSession().getAttribute( 
ScopedAction.ATTRIBUTES_KEY );
		hmap.put(key,value);
	}

	/**
	 *
	 */
	public Object getAttribute(String key) {
		HashMap hmap = (HashMap)req.getSession().getAttribute( 
ScopedAction.ATTRIBUTES_KEY );
		return hmap.get(key);
	}

}


Hoang, Hai wrote:
> Vic,
> 
> This is exactly what I am talking about but is there any sample codes for
> this "token" sharing algorithm where I can use?
> 
> Thanks,
> 
> Hai
> 
> -----Original Message-----
> From: V. Cekvenich [mailto:vicc@users.sourceforge.net] 
> Sent: Friday, September 20, 2002 2:57 PM
> To: struts-user@jakarta.apache.org
> Subject: Re: How to remove ActionForm with session scope from the session
> obje ct
> 
> http://www.mail-archive.com/mvc-programmers@basebeans.com/msg00124.html
> 
> Read part about 5th scope.
> 
> V.
> 
> Hoang, Hai wrote:
> 
>>I've a number of forms with session scope and I want to remove them from
> 
> the
> 
>>session object when I am no longer used them.  The trick is how to find
> 
> out
> 
>>when they are no longer being used?  For example, let say I've 10
>>actionForms associated with 10 jsp page.  If I am on page number 1
>>therefore, page 9-10 is not being used and I can just loop through it a
>>remove the corresponding actionForms from the session object.  If I am
> 
> page
> 
>>number 2 then I loop through page 1 and 8-10 and so on.  Is there a better
>>way for me to do this?  Thanks
>>
>>Hai Hoang
>>
>>
>>
>>_________________________________________________________________________
>>Introducing the all new and improved continental.com.  With a totally new 
>>personalized design, it's the best place to go. Before you go.
>>
>>Continental Airlines. Work Hard. Fly Right.
>>
>>http://www.continental.com
>>
>>
> 
> 
> 
> 
> 
> --
> To unsubscribe, e-mail:
> <ma...@jakarta.apache.org>
> For additional commands, e-mail:
> <ma...@jakarta.apache.org>




--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>