I, for one and one only, think that this sort of thing is directly addressing the most common recurrent question on this list. So, if anything, this de-spams the list. Thanks for the suggestion.

At 04:57 AM 7/7/2004, you wrote:
Sorry if this is considered spamming the list ....

Speaking of storing stuff in session scope. I've developed what I think is a handy class which I think it useful for
when I want to store something like a search in a session variable.


For instance if I want to page through it ( using displaytags.org (10 out of 10)) or simply if I don't want to fetch
from the database time and time again.
By default the data expires on an hourly basis. And if a different combination of parameters is sent it expires
the cached stuff.


Here is the class

snip=
package ie.jestate.struts.client;

import java.util.Date;

/**
* @author Bryan Hunt
*/
//TODO:Perhaps I should be generating a MD5 or something but I can't see a good reason to use any more CPU


public class HashGenerator {

   private StringBuffer buffer;


/** * */ public HashGenerator() { super(); buffer = new StringBuffer(50); // TODO Auto-generated constructor stub }

   /**
    * @param urbanAreas
    */
   public void add(Integer[] array,String fieldname) {
       for (int i = 0; i < array.length; i++) {
           Integer integer = array[i];
           buffer.append(integer);
       }
       buffer.append(fieldname);
       buffer.append("-");
   }

   /**
    * @param priceRangeStart
    */
   public void add(Integer integer,String fieldname) {
       // TODO Auto-generated method stub
       buffer.append(integer);
       buffer.append(fieldname);
       buffer.append("-");
   }

   /**
    * @return
    */
   public String getHash() {

       //I append the hour onto the end of the string so that a hash will
       //only be good for a max of one hour.
       Date date = new Date();

       return buffer.toString()+ "-" + new Integer(date.getHours());
   }

}

=snip

And here is example usage.
snip=
/*
* Created on 24-Jun-2004
*/
package ie.jestate.struts.client;

import ie.jestate.struts.BaseAction;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

/**
* @author Bryan Hunt
 *
*/
public class ForSaleSearchAction extends BaseAction {

/* (non-Javadoc)
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public ActionForward execute(
ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {


//TODO: Database based initialization of the countries collection
DynaActionForm dynaform = (DynaActionForm) actionForm;
HttpSession session = request.getSession();
String forSalePropertiesSearchCheckSum = (String) session.getAttribute(Constants.FOR_SALE_CHECK_SUM);
String newForSalePropertiesSearchCheckSum = null;


       Integer[] urbanAreas = (Integer[]) dynaform.get("urbanAreas");
       Integer priceRangeStart = (Integer) dynaform.get("priceRangeStart");
       Integer priceRangeEnd = (Integer) dynaform.get("priceRangeEnd");
       Integer[] propertyTypes = (Integer[]) dynaform.get("propertyTypes");

HashGenerator hashGenerator = new HashGenerator();
hashGenerator.add(urbanAreas,"urbanAreas");
hashGenerator.add(priceRangeStart,"priceRangeStart");
hashGenerator.add(priceRangeEnd,"priceRangeEnd");
hashGenerator.add(propertyTypes,"propertyTypes");
newForSalePropertiesSearchCheckSum = hashGenerator.getHash();


if(forSalePropertiesSearchCheckSum != null && forSalePropertiesSearchCheckSum.equals(newForSalePropertiesSearchCheckSum)) {
System.out.println("Checksums match");
}


if (forSalePropertiesSearchCheckSum == null
|| !forSalePropertiesSearchCheckSum.equals(newForSalePropertiesSearchCheckSum)){


           Set forSaleProperties =
               findForSaleProperties(
                   urbanAreas,
                   priceRangeStart,
                   priceRangeEnd,
                   propertyTypes);

session.setAttribute(Constants.FOR_SALE_PROPERTIES_SEARCH_RESULT, forSaleProperties);
session.setAttribute(
Constants.FOR_SALE_CHECK_SUM,
newForSalePropertiesSearchCheckSum);
// TODO:Add logging functionality
System.out.println("Returning fresh search results");


       } else
       /*
                 if (

session.getAttribute("forSalePropertiesSearchCheckSum").equals(
                       forSalePropertiesSearchCheckSum))
                */
           {
           //This means that it is the same search, just called again.
           //TODO:Add logging functionality
           System.out.println("Returning cached search results");


}

       //TODO: Decent logging is needed here
       System.out.println(forSalePropertiesSearchCheckSum);
       System.out.println(newForSalePropertiesSearchCheckSum);
       System.out.println(" ---------------------------------------" );

       return actionMapping.findForward("success");
       }
}

=snip




Christina Siena wrote:

I recently developed an application with a complex UI. One of the pages required querying the database based on user selection and re-displaying the page with the retrieved data and any previous existing user selections. Four different fields can trigger a db query resulting in page re-display and validations can also result in page re-display. Each time the page is re-displayed, the "state" of the page must be "remembered" from the last time it was displayed. (still with me so far?) Most of the data re


--------------------------------------------------------------------- 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]



Reply via email to