tabletag.java
来自「displaytag-1.0修正版」· Java 代码 · 共 1,827 行 · 第 1/4 页
JAVA
1,827 行
/**
* Licensed under the Artistic License; you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://displaytag.sourceforge.net/license.html
*
* THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.displaytag.tags;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.LongRange;
import org.apache.commons.lang.math.Range;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.decorator.DecoratorFactory;
import org.displaytag.decorator.TableDecorator;
import org.displaytag.exception.DecoratorException;
import org.displaytag.exception.ExportException;
import org.displaytag.exception.FactoryInstantiationException;
import org.displaytag.exception.InvalidTagAttributeValueException;
import org.displaytag.exception.ObjectLookupException;
import org.displaytag.exception.WrappedRuntimeException;
import org.displaytag.export.BinaryExportView;
import org.displaytag.export.ExportView;
import org.displaytag.export.ExportViewFactory;
import org.displaytag.export.TextExportView;
import org.displaytag.model.Cell;
import org.displaytag.model.Column;
import org.displaytag.model.ColumnIterator;
import org.displaytag.model.HeaderCell;
import org.displaytag.model.Row;
import org.displaytag.model.RowIterator;
import org.displaytag.model.TableModel;
import org.displaytag.pagination.SmartListHelper;
import org.displaytag.properties.MediaTypeEnum;
import org.displaytag.properties.SortOrderEnum;
import org.displaytag.properties.TableProperties;
import org.displaytag.util.Anchor;
import org.displaytag.util.CollectionUtil;
import org.displaytag.util.DependencyChecker;
import org.displaytag.util.Href;
import org.displaytag.util.ParamEncoder;
import org.displaytag.util.RequestHelper;
import org.displaytag.util.RequestHelperFactory;
import org.displaytag.util.TagConstants;
/**
* This tag takes a list of objects and creates a table to display those objects. With the help of column tags, you
* simply provide the name of properties (get Methods) that are called against the objects in your list that gets
* displayed. This tag works very much like the struts iterator tag, most of the attributes have the same name and
* functionality as the struts tag.
* @author mraible
* @author Fabrizio Giustina
* @version $Revision: 1.99 $ ($Author: fgiust $)
*/
public class TableTag extends HtmlTableTag
{
/**
* name of the attribute added to page scope when exporting, containing an MediaTypeEnum this can be used in column
* content to detect the output type and to return different data when exporting.
*/
public static final String PAGE_ATTRIBUTE_MEDIA = "mediaType"; //$NON-NLS-1$
/**
* If this variable is found in the request, assume the export filter is enabled.
*/
public static final String FILTER_CONTENT_OVERRIDE_BODY = //
"org.displaytag.filter.ResponseOverrideFilter.CONTENT_OVERRIDE_BODY"; //$NON-NLS-1$
/**
* D1597A17A6.
*/
private static final long serialVersionUID = 899149338534L;
/**
* logger.
*/
private static Log log = LogFactory.getLog(TableTag.class);
/**
* RequestHelperFactory instance used for link generation.
*/
private static RequestHelperFactory rhf;
/**
* Object (collection, list) on which the table is based. This is not set directly using a tag attribute and can be
* cleaned.
*/
protected Object list;
// -- start tag attributes --
/**
* Object (collection, list) on which the table is based. Set directly using the "list" attribute or evaluated from
* expression.
*/
protected Object listAttribute;
/**
* actual row number, updated during iteration.
*/
private int rowNumber = 1;
/**
* name of the object to use for iteration. Can contain expressions.
*/
private String name;
/**
* property to get into the bean defined by "name".
* @deprecated Use expressions in "name" attribute
*/
private String property;
/**
* scope of the bean defined by "name". Use expressions in name instead
* @deprecated
*/
private String scope;
/**
* length of list to display.
*/
private int length;
/**
* table decorator class name.
*/
private String decoratorName;
/**
* page size.
*/
private int pagesize;
/**
* add export links.
*/
private boolean export;
/**
* list offset.
*/
private int offset;
/**
* sort the full list?
*/
private Boolean sortFullTable;
/**
* Request uri.
*/
private String requestUri;
/**
* Prepend application context to generated links.
*/
private boolean dontAppendContext;
/**
* the index of the column sorted by default.
*/
private int defaultSortedColumn = -1;
/**
* the sorting order for the sorted column.
*/
private SortOrderEnum defaultSortOrder;
/**
* Name of parameter which should not be forwarded during sorting or pagination.
*/
private String excludedParams;
/**
* Unique table id.
*/
private String uid;
// -- end tag attributes --
/**
* Map which contains previous row values. Needed for grouping
*/
private Map previousRow;
/**
* table model - initialized in doStartTag().
*/
private TableModel tableModel;
/**
* current row.
*/
private Row currentRow;
/**
* next row.
*/
private Map nextRow;
/**
* Used by various functions when the person wants to do paging - cleaned in doEndTag().
*/
private SmartListHelper listHelper;
/**
* base href used for links - set in initParameters().
*/
private Href baseHref;
/**
* table properties - set in doStartTag().
*/
private TableProperties properties;
/**
* page number - set in initParameters().
*/
private int pageNumber = 1;
/**
* Iterator on collection.
*/
private Iterator tableIterator;
/**
* export type - set in initParameters().
*/
private MediaTypeEnum currentMediaType;
/**
* daAfterBody() has been executed at least once?
*/
private boolean doAfterBodyExecuted;
/**
* The param encoder used to generate unique parameter names. Initialized at the first use of encodeParameter().
*/
private ParamEncoder paramEncoder;
/**
* static footer added using the footer tag.
*/
private String footer;
/**
* static caption added using the footer tag.
*/
private String caption;
/**
* Included row range. If no rows can be skipped the range is from 0 to Long.MAX_VALUE. Range check should be always
* done using containsLong(). This is an instance of org.apache.commons.lang.math.Range, but it's declared as Object
* to avoid runtime errors while Jasper tries to compile the page and commons lang 2.0 is not available. Commons
* lang version will be checked in the doStartTag() method in order to provide a more user friendly message.
*/
private Object filteredRows;
/**
* Sets the list of parameter which should not be forwarded during sorting or pagination.
* @param value whitespace separated list of parameters which should not be included (* matches all parameters)
*/
public void setExcludedParams(String value)
{
this.excludedParams = value;
}
/**
* Sets the content of the footer. Called by a nested footer tag.
* @param string footer content
*/
public void setFooter(String string)
{
this.footer = string;
}
/**
* Sets the content of the caption. Called by a nested caption tag.
* @param string caption content
*/
public void setCaption(String string)
{
this.caption = string;
}
/**
* Is the current row empty?
* @return true if the current row is empty
*/
protected boolean isEmpty()
{
return this.currentRow == null;
}
/**
* setter for the "sort" attribute.
* @param value "page" (sort a single page) or "list" (sort the full list)
* @throws InvalidTagAttributeValueException if value is not "page" or "list"
*/
public void setSort(String value) throws InvalidTagAttributeValueException
{
if (TableTagParameters.SORT_AMOUNT_PAGE.equals(value))
{
this.sortFullTable = Boolean.FALSE;
}
else if (TableTagParameters.SORT_AMOUNT_LIST.equals(value))
{
this.sortFullTable = Boolean.TRUE;
}
else
{
throw new InvalidTagAttributeValueException(getClass(), "sort", value); //$NON-NLS-1$
}
}
/**
* setter for the "requestURI" attribute. Context path is automatically added to path starting with "/".
* @param value base URI for creating links
*/
public void setRequestURI(String value)
{
this.requestUri = value;
}
/**
* Setter for the "requestURIcontext" attribute.
* @param value base URI for creating links
*/
public void setRequestURIcontext(boolean value)
{
this.dontAppendContext = !value;
}
/**
* Used to directly set a list (or any object you can iterate on).
* @param value Object
* @deprecated use setName() to get the object from the page or request scope instead of setting it directly here
*/
public void setList(Object value)
{
this.listAttribute = value;
}
/**
* Sets the name of the object to use for iteration.
* @param value name of the object to use for iteration (can contain expression). It also supports direct setting of
* a list, for jsp 2.0 containers where users can set up a data source here using EL expressions.
*/
public void setName(Object value)
{
if (value instanceof String)
{
// ok, assuming this is the name of the object
this.name = (String) value;
}
else
{
// is this the list?
this.list = value;
}
}
/**
* Sets the name of the object to use for iteration. This setter is needed for jsp 1.1 container which doesn't
* support the String - Object conversion. The bean info class will swith to this setter.
* @param value name of the object
*/
public void setNameString(String value)
{
this.name = value;
}
/**
* Sets the property to get into the bean defined by "name".
* @param value property name
* @deprecated Use expressions in "name" attribute
*/
public void setProperty(String value)
{
this.property = value;
}
/**
* sets the sorting order for the sorted column.
* @param value "ascending" or "descending"
* @throws InvalidTagAttributeValueException if value is not one of "ascending" or "descending"
*/
public void setDefaultorder(String value) throws InvalidTagAttributeValueException
{
this.defaultSortOrder = SortOrderEnum.fromName(value);
if (this.defaultSortOrder == null)
{
throw new InvalidTagAttributeValueException(getClass(), "defaultorder", value); //$NON-NLS-1$
}
}
/**
* Setter for object scope.
* @param value String
* @deprecated Use expressions in "name" attribute
*/
public void setScope(String value)
{
this.scope = value;
}
/**
* Setter for the decorator class name.
* @param decorator fully qualified name of the table decorator to use
*/
public void setDecorator(String decorator)
{
this.decoratorName = decorator;
}
/**
* Is export enabled?
* @param value <code>true</code> if export should be enabled
*/
public void setExport(boolean value)
{
this.export = value;
}
/**
* sets the number of items to be displayed in the page.
* @param value number of items to display in a page
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?