/*****************************************************************************
* *
* This file is part of the tna framework distribution. *
* Documentation and updates may be get from biaoping.yin the author of *
* this framework *
* *
* Sun Public License Notice: *
* *
* The contents of this file are subject to the Sun Public License Version *
* 1.0 (the "License"); you may not use this file except in compliance with *
* the License. A copy of the License is available at http://www.sun.com *
* *
* The Original Code is tag. The Initial Developer of the Original *
* Code is biaoping yin. Portions created by biaoping yin are Copyright *
* (C) 2000. All Rights Reserved. *
* *
* GNU Public License Notice: *
* *
* Alternatively, the contents of this file may be used under the terms of *
* the GNU Lesser General Public License (the "LGPL"), in which case the *
* provisions of LGPL are applicable instead of those above. If you wish to *
* allow use of your version of this file only under the terms of the LGPL *
* and not to allow others to use your version of this file under the SPL, *
* indicate your decision by deleting the provisions above and replace *
* them with the notice and other provisions required by the LGPL. If you *
* do not delete the provisions above, a recipient may use your version of *
* this file under either the SPL or the LGPL. *
* *
* biaoping.yin (yin-bp@163.com)
* *
*****************************************************************************/
package com.frameworkset.common.tag.pager.tags;
import java.io.OutputStream;
import java.util.Stack;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import org.apache.log4j.Logger;
import org.frameworkset.web.servlet.support.RequestContext;
import com.frameworkset.common.poolman.SQLExecutor;
import com.frameworkset.common.tag.BaseTag;
import com.frameworkset.common.tag.pager.DataInfo;
import com.frameworkset.common.tag.pager.model.MetaDatas;
import com.frameworkset.common.tag.pager.parser.PagerTagExport;
import com.frameworkset.common.tag.pager.parser.ParseException;
import com.frameworkset.common.tag.pager.parser.TagExportParser;
import com.frameworkset.util.StringUtil;
/**
* @author biaoping.yin
* @version 1.0 2005-2-3
*/
public class PagerTag extends BaseTag implements FieldHelper, PagerInfo {
private final static Logger log = Logger.getLogger(PagerTag.class);
protected boolean moreQuery = false;
// protected String pretoken = "#\\[";
// protected String endtoken = "\\]";
/**
* jquery内容容器
*/
private String containerid ;
/**
* jquery内容选择器
*/
private String selector;
/**
* 标识是否是wap应用
*/
private boolean wapflag = false;
// /**
// * 保存页面上所有的IndexTag的标签 Movied to PagerContext
// */
// Stack indexs;
// static final String PARAMETER = "parameter";
// static final String ATTRIBUTE = "attribute";
private DataInfo dataInfo = null;
static final String DEFAULT_ID = "pager";
/** 处理上下翻页触发form提交事件,本属性指定需要提交的form表单名称 */
private String form = null;
/** 当需要保存数据时是否提示保存,与form属性配合使用 */
private boolean promotion = false;
/**表单提交之前需要执行的事件*/
private String commitevent = null;
private String sortKey = null;
/**
* 如果需要导出数据到xml,pdf,word,excel,csv时 设置本属性为true,否则为false
*/
private boolean exportMeta = false;
/**
* 存放页面导出到文件时所有参数,当exportMeta为true时设置本变量
*/
protected MetaDatas metaDatas = null;
/**
* 输出数据到文件时需要保存页面上的数据集合堆栈
*/
protected Stack dataSets;
/**
* 显示的数据字段名称
*/
public static final int DEFAULT_MAX_ITEMS = Integer.MAX_VALUE,
DEFAULT_MAX_PAGE_ITEMS = 10, DEFAULT_MAX_INDEX_PAGES = 10;
private StringBuilder queryString = null;
protected PagerContext pagerContext;
static final String OFFSET_PARAM = ".offset";
static final String
// scope values
PAGE = "page", REQUEST = "request",
// index values
CENTER = "center", FORWARD = "forward", HALF_FULL = "half-full";
/*
* Tag Properties 定义跳转的url
*/
private String url = null;
private String index = null;
// /**
// * items:总的记录条数 to pagercontext
// */
// private long items = 0;
private int maxItems = DEFAULT_MAX_ITEMS;
private int maxPageItems = DEFAULT_MAX_PAGE_ITEMS;
private int maxIndexPages = DEFAULT_MAX_INDEX_PAGES;
// private boolean isOffset = false;
private boolean isOffset = true;
private String export = null;
private String scope = null;
// /*
// * Tag Variables
// */
// private StringBuilder uri = null;
// private int params = 0;
// /**
// * offset:当前页面第一条记录id值,
// * 例如offset=80表示当前页面第一条记录id值为80
// */
// private long offset = 0; to pagercontext
// private long itemCount = 0; to pagercontext
private String data = null;
/**
* 数据库查询语句属性
*/
private String statement = "";
/**
* 数据库连接池名称
*/
private String dbname = "";
// /**
// * pageNumber:当前是在第几页
// */
//
// private long pageNumber = 0;
// public int getParams()
// {
// return this.params;
// }
// /**
// * pageNumberInteger:封装当前页页码的对象
// */
// private Long pageNumberInteger = null;
/**
* idOffsetParam:定义从request中获取offset值得属性名称,例如:pager.offset
*/
private String idOffsetParam = DEFAULT_ID + OFFSET_PARAM;
/**
* 分析需要导出参数的分析类
*/
private PagerTagExport pagerTagExport = null;
private PagerContext oldPager = null;
private Object oldOffset = null;
private Object oldPageNumber = null;
private boolean desc = true;
private String pager_infoName = "pager_info";
// /**
// * Movied to PagerContext
// * @return
// */
// public boolean getDesc()
// {
// return desc;
// }
public void setDesc(boolean desc) {
this.desc = desc;
}
public PagerTag() {
id = DEFAULT_ID;
}
/**
* 设置排序关键字
*
* @param string
*/
public void setSortKey(String string) {
// String t_key = request.getParameter("sortKey");
// if(t_key != null && !t_key.trim().equals(""))
// sortKey = t_key;
// else
sortKey = string;
}
// /**
// * 获取排序关键字 Movied to PagerContext
// * Description:
// * @return
// * String
// */
// public String getSortKey()
// {
// // String t_key = request.getParameter("sortKey");
// // if(t_key == null )
// // t_key = (String)request.getAttribute("sortKey");
// // if(t_key != null && sortKey == null)
// // sortKey = t_key;
// return sortKey;
// }
public final void setId(String sid) {
super.setId(sid);
// OFFSET_PARAM = ".offset";
idOffsetParam = sid + OFFSET_PARAM;
}
public final void setUrl(String value) {
url = value;
}
public final String getUrl() {
return url;
}
public final void setIndex(String val) throws JspException {
if (!(val == null || CENTER.equals(val) || FORWARD.equals(val) || HALF_FULL
.equals(val))) {
throw new JspTagException(
"value for attribute \"index\" "
+ "must be either \"center\", \"forward\" or \"half-full\".");
}
index = val;
}
public final String getIndex() {
return index;
}
// public final void setItems(long value) {
//
// items = value;
// }
//
// public final long getItems() {
// return items;
// }
public final void setMaxItems(int value) {
maxItems = value;
}
public final int getMaxItems() {
return maxItems;
}
public final void setMaxPageItems(int value) {
maxPageItems = value;
}
// /**
// * Movied to PagerContext
// * @return
// */
// public final int getMaxPageItems() {
// return maxPageItems;
// }
public final void setMaxIndexPages(int value) {
maxIndexPages = value;
}
// public final int getMaxIndexPages() {
// return maxIndexPages;
// }
public final void setIsOffset(boolean val) {
isOffset = val;
}
public final boolean getIsOffset() {
return isOffset;
}
public final void setExport(String value) throws JspException {
if (export != value) {
try {
pagerTagExport = TagExportParser.parsePagerTagExport(value);
} catch (ParseException ex) {
throw new JspTagException(ex.getMessage());
}
}
export = value;
}
public final String getExport() {
return export;
}
public final void setScope(String val) throws JspException {
if (!(val == null || PAGE.equals(val) || REQUEST.equals(val))) {
throw new JspTagException("value for attribute \"scope\" "
+ "must be either \"page\" or \"request\".");
}
scope = val;
}
protected String sqlparamskey = "sql.params.key";
/**
* 标签开始时执行以下方法
*/
public int doStartTag() throws JspException {
// log.debug("id:" + id);
// if(id == null || id.trim().equals(""))
// {
// log.debug("DoStartTag id == null || id.trim().equals(\"\")");
pageContext.setAttribute(pager_infoName, this);
HttpServletRequest request = this.getHttpServletRequest();
HttpServletResponse response = this.getHttpServletResponse();
// 初始化页面上下文信息
this.pagerContext = new PagerContext(request, response,
this.pageContext,this);
// /*
// * id的值为“pager“,备份先前的页面得上下文环境,然后再将当前得上下文设置到request或pageContext中
// */
// if(REQUEST.equals(scope))
// {
// this.oldPager = (PagerContext)request.getAttribute(id);
// request.setAttribute(id,pagerContext);
// }
// }
// else
// {
// log.debug("DoStartTag pager_info_" + id);
// pageContext.setAttribute("pager_info_" + id,this);
// }
pagerContext.setIsList(this.isList);
pagerContext.setMoreQuery(moreQuery);
pagerContext.setField(this.field);
pagerContext.setForm(this.form);
pagerContext.setId(this.getId());
pagerContext.setNavindex(this.index);
pagerContext.setPromotion(this.promotion);
pagerContext.setScope(this.scope);
pagerContext.setTitle(this.title);
pagerContext.setMaxIndexPages(this.maxIndexPages);
pagerContext.setMaxItems(this.maxItems);
// Object object = request.getAttribute(data);
String baseUri = request.getRequestURI();
boolean isControllerPager = PagerContext.isPagerMehtod(request);
String cookieid = null;
if(isControllerPager)
{
// baseUri = PagerContext.getPathwithinHandlerMapping(request);
baseUri = PagerContext.getHandlerMappingRequestURI(request);
// String mappingpath = PagerContext.getHandlerMappingPath(request);
// cookieid = this.pagerContext.getId() == null ?PagerDataSet.COOKIE_PREFIX + mappingpath :PagerDataSet.COOKIE_PREFIX + mappingpath + "|" +this.pagerContext.getId();
cookieid = PagerContext.getControllerCookieID(request);
pagerContext.setUrl(baseUri);
// ListInfo mvcinfo = (ListInfo)object;
int controllerPagerSize = PagerContext.getControllerPagerSize(request);
// pagerContext.setMaxPageItems(mvcinfo.getMaxPageItems());
// pagerContext.setCustomMaxPageItems(mvcinfo.getMaxPageItems());
pagerContext.setMaxPageItems(controllerPagerSize);
pagerContext.setCustomMaxPageItems(PagerContext.getCustomPagerSize(request));
}
else
{
pagerContext.setUrl(url);
// cookieid = this.pagerContext.getId() == null ?RequestContext.COOKIE_PREFIX + baseUri :RequestContext.COOKIE_PREFIX + baseUri + "|" +this.pagerContext.getId();
cookieid = StringUtil.builderPagingSizeCookieName(this.pagerContext.getId(),baseUri );
int defaultSize = PagerDataSet.consumeCookie(cookieid,maxPageItems,request,pagerContext);
pagerContext.setCustomMaxPageItems(maxPageItems);
pagerContext.setMaxPageItems(defaultSize);
}
pagerContext.setCookieid(cookieid);
pagerContext.setWapflag(this.wapflag);
pagerContext.setWidth(this.width);
pagerContext.setIsOffset(this.isOffset);
pagerContext.setData(this.data);
pagerContext.setDbname(this.dbname);
pagerContext.setStatement(this.statement);
SQLExecutor sqlExecutor = (SQLExecutor)request.getAttribute(sqlparamskey);
pagerContext.setSQLExecutor(sqlExecutor);
// Object object = request.getAttribute(data);
// if(object instanceof ListInfo)
// {
// pagerContext.setUrl(PagerContext.getHandlerMappingPath(request));
// }
// else
// pagerContext.setUrl(url);
pagerContext.setCommitevent(this.commitevent);
pagerContext.setUri();
pagerContext.setContainerid(this.getContainerid());
pagerContext.setSelector(this.getSelector());
// params = 0;
// offset = 0;
// itemCount = 0;
// 设置是否是升序还是降序
String desc_key = pagerContext.getKey("desc");
String t_desc = request.getParameter(desc_key);
pagerContext.setDefaultDesc(desc);
if(t_desc != null)
{
if (t_desc.equals("false"))
desc = false;
else if (t_desc.equals("true"))
desc = true;
pagerContext.setDescfromrequest(true);
}
pagerContext.setDesc(desc);
// 设置排序关键字,首先通过request.getParameter获取
String sortKey_key = pagerContext.getKey("sortKey");
String t_sortKey = request.getParameter(sortKey_key);
// 如果获取到的sortKey为空时,通过request.getAttribute获取
if (t_sortKey == null)
t_sortKey = (String) request.getAttribute(sortKey_key);
// 如果上面获取到的sortKey不为null时,设置sortKey
if (t_sortKey != null)
pagerContext.setSortKey(t_sortKey);
try {
pagerContext.init();
} catch (LoadDataException e) {
if(e.getCause() == null)
log.info(e.getMessage());
else
log.info(e.getCause().getMessage());
// return SKIP_BODY;
}
catch (Throwable e) {
if(e.getCause() == null)
log.info(e.getMessage());
else
log.info(e.getCause().getMessage());
throw new JspException(e);
// return SKIP_BODY;
}
// //addParam("sortKey",getSortKey());
// //:log
// if(!pagerContext.ListMode())//:log如果是分页模式,初始化上下文
// {
// pagerContext.initContext();
// }
//
// else//:log如果是列表模式,直接设置dataInfo信息即可
// pagerContext.setDataInfo(pagerContext.getData());
// /**
// * 如果需要导出数据到文件,调用本方法进行初始化
// */
// this.setMeta();
return EVAL_BODY_INCLUDE;
}
public void setMeta() {
if (this.isExportMeta())
this.metaDatas = new MetaDatas();
}
// /**
// * Movied to PagerContext
// * @return
// */
// public String getUri()
// {
// return uri.toString();
// }
// /**
// * Moved to PagerContext
// */
// private static void restoreAttribute(ServletRequest request, String name,
// Object oldValue)
// {
// if (oldValue != null)
// request.setAttribute(name, oldValue);
// else
// request.removeAttribute(name);
// }
//
// /**
// * Moved to PagerContext
// * @param pageContext
// * @param name
// * @param oldValue
// */
// private static void restoreAttribute(PageContext pageContext, String
// name,
// Object oldValue)
// {
// if (oldValue != null)
// pageContext.setAttribute(name, oldValue);
// else
// pageContext.removeAttribute(name);
// }
/**
* 获取数据获取类在request中的存放名称
*
* @return String 数据获取类在request中的存放名称
*/
public String getData() {
return data == null ? "dataInfo" : data;
}
@Override
public void doFinally() {
try {
/**
* 恢复上下文环境旧得上下文环境,清除数据获取接口
*/
this.pagerContext.release();
this.commitevent = null;
this.form = null;
this.promotion = false;
// pretoken= null;
// endtoken= null;
sqlparamskey = "sql.params.key";
//
// if (REQUEST.equals(scope)) {
//
// PagerContext.restoreAttribute(request, id, oldPager);
//
// request.removeAttribute(getData());
// oldPager = null;
//
// // if (pagerTagExport != null) {
// // String name;
// // if ((name = pagerTagExport.getPageOffset()) != null) {
// // PagerContext.restoreAttribute(request, name, oldOffset);
// // oldOffset = null;
// // }
// //
// // if ((name = pagerTagExport.getPageNumber()) != null) {
// // PagerContext.restoreAttribute(request, name, oldPageNumber);
// // oldPageNumber = null;
// // }
// // }
//
// } else {
// if (pagerTagExport != null) {
// String name;
// if ((name = pagerTagExport.getPageOffset()) != null) {
// PagerContext.restoreAttribute(pageContext, name, oldOffset);
// oldOffset = null;
// }
//
// if ((name = pagerTagExport.getPageNumber()) != null) {
// PagerContext.restoreAttribute(pageContext, name, oldPageNumber);
// oldPageNumber = null;
// }
// }
// }
//
// // limit size of re-usable StringBuilder
// if (uri.capacity() > 1024)
// uri = null;
//
// // indexs = null;
// pageNumberInteger = null;
/**
* return EVAL_PAGE:继续分析结束标签后的页面代码
*/
// try
// {
// pageContext.getOut().print("<table width=\"100%\">");
// }
// catch(Exception e)
// {
// throw new JspException(e.getMessage());
// }
// release();
//begin clear some field by biaoping.yin on 2015.3.8
scope = null;
this.containerid = null;
this.selector = null;
this.moreQuery = false;
this.statement = "";
this.dbname = "";
this.isList = false;
//end clear some field by biaoping.yin on 2015.3.8
url = null;
index = null;
// items = 0;
maxItems = DEFAULT_MAX_ITEMS;
maxPageItems = DEFAULT_MAX_PAGE_ITEMS;
maxIndexPages = DEFAULT_MAX_INDEX_PAGES;
isOffset = true;
export = null;
// uri = null;
queryString = null;
// params = 0;
// offset = 0;
// itemCount = 0;
// pageNumber = 0;
// pageNumberInteger = null;
idOffsetParam = DEFAULT_ID + OFFSET_PARAM;
pagerTagExport = null;
oldPager = null;
oldOffset = null;
oldPageNumber = null;
} catch (Exception e) {
}
super.doFinally();
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public void release() {
url = null;
index = null;
// items = 0;
maxItems = DEFAULT_MAX_ITEMS;
maxPageItems = DEFAULT_MAX_PAGE_ITEMS;
maxIndexPages = DEFAULT_MAX_INDEX_PAGES;
isOffset = true;
export = null;
scope = null;
//
// uri = null;
queryString = null;
// params = 0;
// offset = 0;
// itemCount = 0;
// pageNumber = 0;
// pageNumberInteger = null;
idOffsetParam = DEFAULT_ID + OFFSET_PARAM;
pagerTagExport = null;
oldPager = null;
oldOffset = null;
oldPageNumber = null;
this.containerid = null;
this.selector = null;
this.moreQuery = false;
//begin clear some field by biaoping.yin on 2015.3.8
this.statement = "";
this.dbname = "";
//end clear some field by biaoping.yin on 2015.3.8
super.release();
}
public String getIdOffsetParam() {
return this.idOffsetParam;
}
/**
* @param string
*/
public void setWidth(String string) {
width = string;
}
/**
* @return String[]
*/
public String[] getWidths() {
return this.pagerContext.getWidths();
}
public static void main(String[] args) {
}
/**
* @return String[]
*/
public String[] getTitles() {
return this.pagerContext.getTitles();
}
/**
* @param string
*/
public void setTitle(String string) {
title = string;
}
String field = "";
String width = null;
String title = null;
/**
* @return String[]
*/
public String[] getFields() {
return this.pagerContext.getFields();
}
/**
* @param string
*/
public void setField(String string) {
field = string;
}
boolean isList = false;
// /** Movied to PagerContext
// * @return boolean 判断是否是列表模式
// */
// boolean ListMode() {
// // if(isList == null || isList.trim().length() == 0)
// // return false;
// return isList;
// }
/**
* @param string
*/
public void setIsList(boolean string) {
isList = string;
}
// /**
// * 获取数据获取类在request中的存放名称
// * @return String 数据获取类在request中的存放名称
// */
// public String getData() {
//
// return data == null?"dataInfo":data;
// }
/**
* @param string
*/
public void setData(String string) {
data = string;
}
/*
* (non-Javadoc)
*
* @see com.frameworkset.common.tag.BaseTag#generateContent()
*/
public String generateContent() {
return null;
}
/*
* (non-Javadoc)
*
* @see com.frameworkset.common.tag.BaseTag#write(java.io.OutputStream)
*/
public void write(OutputStream output) {
}
// /**
// * 获取页面查询参数 Movied to PagerContext
// * @return String
// */
// public String getQueryString()
// {
// return queryString == null?"":queryString.toString();
// }
// /**
// * Description:获取页面查询的参数 Movied to PagerContext
// * @return
// * StringBuilder
// */
// public String getQueryString(long offset,String sortKey,boolean desc) {
// String offsetString = "";
// if(queryString != null)
// {
// int length = queryString.length();
// queryString.append(params == 0 ? "" : "&")
// .append(idOffsetParam)
// .append('=')
// .append(offset);
//
// if(sortKey != null)
// queryString.append("&").append(getKey("sortKey")).append("=").append(sortKey);
// queryString.append("&").append(getKey("desc")).append("=").append(desc);
// offsetString = queryString.toString();
// queryString.setLength(length);
// }
// return offsetString;
// }
// /**
// * Description:获取页面查询的参数 Movied to PagerContext
// * @return
// * StringBuilder
// */
// public String getQueryString(String sortKey,boolean desc) {
//
// String offsetString = "";
// if(queryString != null && sortKey != null)
// {
// int length = queryString.length();
// queryString.append(params == 0 ? "" : "&")
// .append(getKey("sortKey")).append("=").append(sortKey);
// queryString.append("&").append(getKey("desc")).append("=").append(desc);
// offsetString = queryString.toString();
// queryString.setLength(length);
// }
// return offsetString;
// }
// /**
// * Movied to PagerContext
// * Description:
// * @return
// * String
// */
// public String getForm() {
// return form;
// }
/**
* Description:
*
* @param string
* void
*/
public void setForm(String string) {
form = string;
}
// /**
// * Movied to PagerContext
// * Description:
// * @return
// * String
// */
// public boolean getPromotion() {
// return promotion;
// }
/**
* Description:
*
* @param string
* void
*/
public void setPromotion(boolean string) {
promotion = string;
}
// /**
// * Movied to PagerContext
// * @return
// */
// public boolean hasParams()
// {
// return params != 0;
// }
/**
* @return Returns the dbname.
*/
public String getDbname() {
return dbname;
}
/**
* @param dbname
* The dbname to set.
*/
public void setDbname(String dbname) {
this.dbname = dbname;
}
/**
* @return Returns the statement.
*/
public String getStatement() {
return statement;
}
/**
* @param statement
* The statement to set.
*/
public void setStatement(String statement) {
this.statement = statement;
}
/**
* 输出当前页面记录条数
*
* @see com.frameworkset.common.tag.pager.tags.PagerInfo#getDataSize()
*/
public int getDataSize() {
return this.pagerContext == null ? 0 : pagerContext.getDataSize();
}
/**
* @return Returns the exportMeta.
*/
public boolean isExportMeta() {
return exportMeta;
}
/**
* @param exportMeta
* The exportMeta to set.
*/
public void setExportMeta(boolean exportMeta) {
this.exportMeta = exportMeta;
}
/**
* @return Returns the dataSets.
*/
public Stack getDataSets() {
return dataSets;
}
/**
* @param dataSets
* The dataSets to set.
*/
public void setDataSets(Stack dataSets) {
this.dataSets = dataSets;
}
/**
* @return Returns the metaDatas.
*/
public MetaDatas getMetaDatas() {
return metaDatas;
}
// /**
// * Movied to PagerContext
// * @return
// */
// public boolean isWapflag() {
// return wapflag;
// }
/**
* @param metaDatas
* The metaDatas to set.
*/
public void setMetaDatas(MetaDatas metaDatas) {
this.metaDatas = metaDatas;
}
public void setWapflag(boolean wapflag) {
this.wapflag = wapflag;
}
public String getPager_infoName() {
return pager_infoName;
}
public void setPager_infoName(String pager_infoName) {
this.pager_infoName = pager_infoName;
}
public String getCommitevent() {
return commitevent;
}
public void setCommitevent(String commitevent) {
this.commitevent = commitevent;
}
public String getSqlparamskey() {
return sqlparamskey;
}
public void setSqlparamskey(String sqlparamskey) {
this.sqlparamskey = sqlparamskey;
}
public String getContainerid()
{
return containerid;
}
public void setContainerid(String containerid)
{
this.containerid = containerid;
}
public String getSelector()
{
return selector;
}
public void setSelector(String selector)
{
this.selector = selector;
}
public boolean isMoreQuery() {
return moreQuery;
}
public void setMoreQuery(boolean moreQuery) {
this.moreQuery = moreQuery;
}
}