struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bryan Hunt <ad...@revoltingdigits.com>
Subject Re: some best practices questions
Date Wed, 07 Jul 2004 11:57:23 GMT
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: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Mime
View raw message