Class AbstractSearchTool
- java.lang.Object
-
- org.apache.velocity.tools.view.PagerTool
-
- org.apache.velocity.tools.view.AbstractSearchTool
-
- Direct Known Subclasses:
AbstractSearchTool
@DefaultKey("search") @InvalidScope({"application","session"}) public abstract class AbstractSearchTool extends PagerTool
Abstract view tool for doing "searching" and robust pagination of search results. The goal here is to provide a simple and uniform API for "search tools" that can be used in velocity templates (or even a standard Search.vm template). In particular, this class provides good support for result pagination and some very simple result caching.
Usage:
To use this class, you must extend it and implement the executeQuery(Object) method.The setCriteria(Object) method takes an Object in order to allow the search criteria to meet your needs. Your criteria may be as simple as a single string, an array of strings, or whatever you like. The value passed into this method is that which will ultimately be passed into executeQuery(Object) to perform the search and return a list of results. A simple implementation might be like:
protected List executeQuery(Object crit) { return MyDbUtils.getFooBarsMatching((String)crit); }Here's an example of how your subclass would be used in a template:
<form name="search" method="get" action="$link.setRelative('search.vm')"> <input type="text"name="find" value="$!search.criteria"> <input type="submit" value="Find"> </form> #if( $search.hasItems() ) Showing $!search.pageDescription<br> #set( $i = $search.index ) #foreach( $item in $search.page ) ${i}. $!item <br> #set( $i = $i + 1 ) #end <br> #if ( $search.pagesAvailable > 1 ) #set( $pagelink = $link.setRelative('search.vm').addQueryData("find",$!search.criteria).addQueryData("show",$!search.itemsPerPage) ) #if( $search.prevIndex ) <a href="$pagelink.addQueryData('index',$!search.prevIndex)">Prev</a> #end #foreach( $index in $search.slip ) #if( $index == $search.index ) <b>$search.pageNumber</b> #else <a href="$pagelink.addQueryData('index',$!index)">$!search.getPageNumber($index)</a> #end #end #if( $search.nextIndex ) <a href="$pagelink.addQueryData('index',$!search.nextIndex)">Next</a> #end #end #elseif( $search.criteria ) Sorry, no matches were found for "$!search.criteria". #else Please enter a search term #endThe output of this might look like:
Showing 1-5 of 8
1. foo
2. bar
3. blah
4. woogie
5. baz
1 2 NextExample toolbox.xml configuration:
<tools> <toolbox scope="request"> <tool class="com.foo.tools.MySearchTool"/> </toolbox> </tools>- Since:
- VelocityTools 2.0
- Version:
- $Revision$ $Date$
- Author:
- Nathan Bubna
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classAbstractSearchTool.StoredResultsSimple utility class to hold a criterion and its result list.
-
Field Summary
Fields Modifier and Type Field Description static StringDEFAULT_CRITERIA_KEYprotected org.apache.velocity.runtime.log.LogLOGprotected static StringSTORED_RESULTS_KEYthe key under which StoredResults are kept in session-
Fields inherited from class org.apache.velocity.tools.view.PagerTool
DEFAULT_INDEX_KEY, DEFAULT_ITEMS_PER_PAGE, DEFAULT_ITEMS_PER_PAGE_KEY, DEFAULT_NEW_ITEMS_KEY, DEFAULT_SLIP_SIZE, DEFAULT_SLIP_SIZE_KEY, session, STORED_ITEMS_KEY
-
-
Constructor Summary
Constructors Constructor Description AbstractSearchTool()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract ListexecuteQuery(Object criteria)Executes a query for the specified criteria.ObjectgetCriteria()Return the criteria object for this request.StringgetCriteriaKey()ListgetItems()Gets the results for the given criteria either in memory or by performing a new query for them.protected ListgetStoredItems()Retrieves stored search items (if any) from the user's session attributes.protected AbstractSearchTool.StoredResultsgetStoredResults()Retrieves stored search results (if any) from the user's session attributes.voidreset()Sets the criteria and results to null, page index to zero, and items per page to the default.voidsetCriteria(Object criteria)Sets the criteria for this search.voidsetCriteriaKey(String key)voidsetLog(org.apache.velocity.runtime.log.Log log)protected voidsetStoredItems(List items)Stores current search items in the user's session attributes (if one currently exists) in order to do efficient result pagination.protected voidsetStoredResults(AbstractSearchTool.StoredResults results)Stores current search results in the user's session attributes (if one currently exists) in order to do efficient result pagination.voidsetup(javax.servlet.http.HttpServletRequest request)Sets the criteria *if* it is set in the request parameters.-
Methods inherited from class org.apache.velocity.tools.view.PagerTool
getCreateSession, getFirstIndex, getIndex, getIndexKey, getItemsPerPage, getItemsPerPageKey, getLastIndex, getNewItemsKey, getNextIndex, getPage, getPageDescription, getPageNumber, getPageNumber, getPagesAvailable, getPrevIndex, getSlip, getSlipSize, getSlipSizeKey, getTotal, hasItems, setCreateSession, setIndex, setIndexKey, setItems, setItemsPerPage, setItemsPerPageKey, setNewItemsKey, setRequest, setSlipSize, setSlipSizeKey
-
-
-
-
Field Detail
-
DEFAULT_CRITERIA_KEY
public static final String DEFAULT_CRITERIA_KEY
- See Also:
- Constant Field Values
-
STORED_RESULTS_KEY
protected static final String STORED_RESULTS_KEY
the key under which StoredResults are kept in session
-
LOG
protected org.apache.velocity.runtime.log.Log LOG
-
-
Method Detail
-
setLog
public void setLog(org.apache.velocity.runtime.log.Log log)
-
setup
public void setup(javax.servlet.http.HttpServletRequest request)
Sets the criteria *if* it is set in the request parameters.
-
setCriteriaKey
public void setCriteriaKey(String key)
-
getCriteriaKey
public String getCriteriaKey()
-
reset
public void reset()
Sets the criteria and results to null, page index to zero, and items per page to the default.
-
setCriteria
public void setCriteria(Object criteria)
Sets the criteria for this search.- Parameters:
criteria- - the criteria used for this search
-
getCriteria
public Object getCriteria()
Return the criteria object for this request. (for a simple search mechanism, this will typically be just a java.lang.String)- Returns:
- criteria object
-
getItems
public List getItems()
Gets the results for the given criteria either in memory or by performing a new query for them. If the criteria is null, an empty list will be returned.
-
getStoredItems
protected List getStoredItems()
Description copied from class:PagerToolRetrieves stored search items (if any) from the user's session attributes.- Overrides:
getStoredItemsin classPagerTool- Returns:
- the
Listretrieved from memory
-
setStoredItems
protected void setStoredItems(List items)
Description copied from class:PagerToolStores current search items in the user's session attributes (if one currently exists) in order to do efficient result pagination.Override this to store search items somewhere besides the HttpSession or to prevent storage of items across requests. In the former situation, you must also override getStoredItems().
- Overrides:
setStoredItemsin classPagerTool- Parameters:
items- theListto be stored
-
executeQuery
protected abstract List executeQuery(Object criteria)
Executes a query for the specified criteria.This method must be implemented! A simple implementation might be something like:
protected List executeQuery(Object crit) { return MyDbUtils.getFooBarsMatching((String)crit); }- Returns:
- a
Listof results for this query
-
getStoredResults
protected AbstractSearchTool.StoredResults getStoredResults()
Retrieves stored search results (if any) from the user's session attributes.- Returns:
- the
AbstractSearchTool.StoredResultsretrieved from memory
-
setStoredResults
protected void setStoredResults(AbstractSearchTool.StoredResults results)
Stores current search results in the user's session attributes (if one currently exists) in order to do efficient result pagination.Override this to store search results somewhere besides the HttpSession or to prevent storage of results across requests. In the former situation, you must also override getStoredResults().
- Parameters:
results- theAbstractSearchTool.StoredResultsto be stored
-
-