package com.frameworkset.common.tag.pager.tags; import java.io.Serializable; import java.lang.reflect.Array; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Stack; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; import org.apache.log4j.Logger; import org.frameworkset.util.ClassUtil; import org.frameworkset.util.ClassUtil.ClassInfo; import org.frameworkset.util.ClassUtil.PropertieDescription; import com.frameworkset.common.poolman.SQLExecutor; import com.frameworkset.common.poolman.SQLParams; import com.frameworkset.common.poolman.SetSQLParamException; import com.frameworkset.common.tag.pager.DataInfo; import com.frameworkset.common.tag.pager.DefaultDataInfoImpl; import com.frameworkset.common.tag.pager.IgnoreParam; import com.frameworkset.common.tag.pager.ListInfoDataInfoImpl; import com.frameworkset.common.tag.pager.ObjectDataInfoImpl; import com.frameworkset.common.tag.pager.parser.PagerTagExport; import com.frameworkset.platform.cms.driver.callback.CMSCallBack; import com.frameworkset.platform.cms.driver.callback.CMSCallBackUtil; import com.frameworkset.platform.cms.driver.jsp.CMSServletRequest; import com.frameworkset.platform.cms.driver.jsp.InternalImplConverter; import com.frameworkset.util.ListInfo; import com.frameworkset.util.SimpleStringUtil; import com.frameworkset.util.StringUtil; /** * 页面信息上下文,对分页的所有信息进行封装 * <p> * Title: com.frameworkset.common.tag.pager.tags.PagerContext.java * </p> * * <p> * Description: * </p> * * <p> * Copyright (c) 2006.10 * </p> * * <p> * Company: chinacreator * </p> * * @Date 2007-2-1 10:04:58 * @author biaoping.yin * @version 1.0 */ public class PagerContext // extends BaseSQLParamManager implements FieldHelper, PagerInfo, Serializable { /** * 数据库查询语句属性 */ protected String statement = ""; /** * 用于定义标签属性 */ protected boolean moreQuery = false; /** * 用于定义最终的实际的more值(从moreQuery和listInfo获取值:标签设置了moreQuery属性并且是数据库查询则取moreQuery的值,如果从listInfo识别则取listInfo中isMore值) */ protected boolean more = false; protected String dbname; protected String cookieid; private boolean inited = false; private Object actual; public Object getActual() { return actual; } public void setActual(Object actual) { this.actual = actual; } private Tag tag; private SQLExecutor sqlExecutor; private final static Logger log = Logger.getLogger(PagerContext.class); private HttpServletRequest request; private HttpServletResponse response; private HttpSession session; private PageContext pageContext; /** * 保存先前的pagerContext,以便标签执行完毕后清除 */ private Object oldPagerContext; /** * jquery内容容器 */ private String containerid ; /** * jquery内容选择器 */ private String selector; /** * 当notify标签出现在list标签中时,为了避免 * 重复解析notify标签,将notifyed属性设置为true * */ private boolean notifyed = false; public PagerContext(HttpServletRequest request, HttpServletResponse response, PageContext pageContext, Tag tag) { this.request = request; this.session = request.getSession(false); this.response = response; this.pageContext = pageContext; this.tag = tag; } static final String // scope values PAGE = "page", REQUEST = "request", // index values CENTER = "center", FORWARD = "forward", HALF_FULL = "half-full"; /** * items:总的记录条数 */ private long items = 0; /** * offset:当前页面第一条记录id值, 例如offset=80表示当前页面第一条记录id值为80 */ private long offset = 0; private long itemCount = 0; private boolean descfromrequest = false; private boolean desc = true; private boolean defaultDesc = true; public boolean isDefaultDesc() { return defaultDesc; } public void setDefaultDesc(boolean defaultDesc) { this.defaultDesc = defaultDesc; } private String sortKey = null; boolean isList = false; private DataInfo dataInfo = null; private String field = ""; private String width = null; private String title = null; private String id; /** * pagerTag中的index属性重命名为navindex */ private String navindex = null; /** * 页面中已经放置的导航索引个数 */ Stack indexs; private int maxItems = DEFAULT_MAX_ITEMS; /****************************************************************** * ListTag 属性区 * ******************************************************************/ private int index = -1; protected String sessionKey = null; protected String requestKey = null; protected String pageContextKey = null; /** * 定义dataSet的获取范围 */ protected static final String SESSION_SCOPE = "session"; protected static final String REQUEST_SCOPE = "request"; protected static final String ACTUAL_SCOPE = "actual"; protected static final String PAGECONTEXT_SCOPE = "pageContext"; protected static final String COLUMN_SCOPE = "column"; protected static final String DB_SCOPE = "db"; protected static final String CELL_SCOPE = "cellscope"; /************************************************* * 当值对象属性colName对应的类型为Collection时,* 本标签将该collection作为数据源, * * 循环嵌套输出collection中的对象属性 * property下级属性名称 *************************************************/ /** * 列名 */ protected String colName; /** * 下级属性名称 */ protected String property; /** * 内容管理补充常量,内容管理系统发布时需要用到的范围 */ protected static final String CMS_SCOPE = "cms"; protected String commitevent; /****************************************************************** * DetailTag 属性区 * ******************************************************************/ /** * 初始化上下文 * * @throws LoadDataException */ public void init() throws LoadDataException { if (!inited) { /* * id的值为“pager“,备份先前的页面得上下文环境,然后再将当前得上下文设置到request或pageContext中 */ if (REQUEST.equals(scope)) { String t_id = "pagerContext."; if (this.id != null && !id.trim().equals("")) t_id += id; else t_id += DEFAULT_ID; this.oldPager = (PagerContext) request.getAttribute(t_id); request.setAttribute(t_id, this); } if (!ListMode())// :log如果是分页模式,初始化上下文 { initContext(); } else // :log如果是列表模式,直接设置dataInfo信息即可 setDataInfo(); if (this.tag instanceof PagerDataSet) { /** * 如果是内容管理的频道文档分页列表的话,需要保存页面的上下文 * 因为生成分页导航的标签index需要使用到pagerContext对象实例 * * */ String t_id = "pagerContext."; if (request instanceof CMSServletRequest) { CMSServletRequest cmsRequest = (CMSServletRequest) request; t_id += cmsRequest.getContext().getID(); } else if (this.id != null && !id.trim().equals("")) { t_id += id; this.oldPagerContext = request.getAttribute(t_id); } else { t_id += DEFAULT_ID; this.oldPagerContext = request.getAttribute(t_id); } this.request.setAttribute(t_id, this); // this.setId(id); } inited = true; } } /** * 设置排序关键字 * * @param string */ public void setSortKey(String sortKey) { this.sortKey = sortKey; // String sortKey_key = this.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) // setSortKey(t_sortKey); } /** * 获取排序关键字 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 boolean getDesc() { return desc; } public void setDesc(boolean desc) { this.desc = desc; // // 设置是否是升序还是降序 // String desc_key = this.getKey("desc"); // // String t_desc = request.getParameter(desc_key); // if(t_desc != null && t_desc.equals("false")) // desc = false; // else if(t_desc != null && t_desc.equals("true")) // desc = true; } boolean ListMode() { // if(isList == null || isList.trim().length() == 0) // return false; return isList; } /** * @param string */ public void setIsList(boolean isList) { this.isList = isList; } public final DataInfo getDataInfo() { return this.dataInfo; } /** * @return String[] */ public String[] getFields() { if (field == null) return null; return StringUtil.split(field, ","); } /** * @param string */ public void setWidth(String string) { width = string; } /** * @return String[] */ public String[] getWidths() { if (width == null) return null; return StringUtil.split(width, ","); } public void setField(String field) { this.field = field; } public void setTitle(String title) { this.title = title; } /** * @return String[] */ public String[] getTitles() { if (title != null) return StringUtil.split(title, ","); return null; } public void setDataInfo(DataInfo dataInfo) { this.dataInfo = dataInfo; } public boolean isWapflag() { return wapflag; } /** * 标识是否是wap应用 */ private boolean wapflag = false; public void setWapflag(boolean wapflag) { this.wapflag = wapflag; } /** 处理上下翻页触发form提交事件,本属性指定需要提交的form表单名称 */ private String form = null; /** * Description: * * @return String */ public String getForm() { return form; } public void setForm(String form) { this.form = form; } public String getId() { return this.id; } /** * idOffsetParam:定义从request中获取offset值得属性名称,例如:pager.offset */ private String idOffsetParam = DEFAULT_ID + OFFSET_PARAM; public static final String DEFAULT_ID = "pager"; public static final String OFFSET_KEY = "offset"; public static final String DESC_KEY = "desc"; public static final String SORT_KEY = "sortKey"; public static final String PAGE_SIZE = "PAGE_SIZE"; public static final String OFFSET_PARAM = "." + OFFSET_KEY; public final void setId(String sid) { this.id = sid; if (id == null || id.trim().equals("")) { idOffsetParam = DEFAULT_ID + OFFSET_PARAM; } else idOffsetParam = id + OFFSET_PARAM; } /** * pageNumber:当前是在第几页 */ private long pageNumber = 0; /** * 获取当前页所在的页面数 * * @return int */ final long getPageNumber() { return pageNumber; } /** * 获取数据源的记录总数 * * @return int */ final long getItemCount() { return (items != 0 ? items : itemCount); } /** * 获取页面总数量 * * @return int */ final long getPageCount() { return pageNumber(getItemCount()); } /** * 显示的数据字段名称 */ private static final int DEFAULT_MAX_ITEMS = Integer.MAX_VALUE, DEFAULT_MAX_PAGE_ITEMS = 10, DEFAULT_MAX_INDEX_PAGES = 10; /** * 每页显示的最大记录条数 */ private int maxPageItems = DEFAULT_MAX_PAGE_ITEMS; /** * 保持pager标签和list标签maxPageItems属性设定的页面记录大小 */ private int customMaxPageItems; private int maxIndexPages = DEFAULT_MAX_INDEX_PAGES; /** * 功能说明:计算当前页面编号 * * @param offset * @return int */ private final long pageNumber(long offset) { return (offset / maxPageItems) + (offset % maxPageItems == 0 ? 0 : 1); } /** * 获取最后一页的页码,比如共有5页,返回4。如果只有0页则返回0; * * @return int */ public long getLastPageNumber() { return Math.max(0, getPageCount() - 1); } public long getLastOffset() { return maxPageItems * getLastPageNumber(); } /** 当需要保存数据时是否提示保存,与form属性配合使用 */ private boolean promotion = false; /** * Description: * * @return String */ public boolean getPromotion() { return promotion; } public void setPromotion(boolean promotion) { this.promotion = promotion; } private StringBuilder queryString = null; /** * 获取页面查询参数 * * @return String */ public String getQueryString() { return queryString == null ? "" : queryString.toString(); } /** * 页面上包含参数个数 */ private int params = 0; /** * 判断当前页面是否包含参数 * * @return */ public boolean hasParams() { return params != 0; } /* * Tag Variables */ private StringBuilder uri = null; /** * 页面地址串 * * @return */ public String getUri() { return uri.toString(); } /** * Description:获取页面查询的参数 * * @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:获取页面查询的参数 * * @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; } /** * 获取唯一的参数名称 * * @param oringine * @return String 参数名称 */ public String getKey(String oringine) { if (id == null || id.trim().equals("")) { return DEFAULT_ID + "." + oringine; } else return id + "." + oringine; } /** * 获取唯一的参数名称 * * @param oringine * @return String 参数名称 */ public static String getKey(String id,String oringine) { if (id == null || id.trim().equals("")) { return DEFAULT_ID + "." + oringine; } else return id + "." + oringine; } /** * 获取唯一的参数名称 * * @param oringine * @return String 参数名称 */ public static String getDefultKey(String oringine) { return getKey(null,oringine); } /** * * Description:生成自定义的翻页索引的链接地址 * * @param formName * 表单名称 * @param params * 页面请求参数 * @param promotion * 提交表单时是否需要提示信息 * @param forwardUrl * 直接跳转页面地址, 当promotion为true时,弹出提示是否提交数据, 选是时提交,否则直接跳转到该属性指定的页面 * @return String String */ protected String getCustomUrl(String formName, String params, boolean promotion, String forwardUrl, String id) { String customFirstUrl = "javascript:bboss.pager.pageSubmit('" + formName + "','" + params + "','" + forwardUrl + "'," + promotion + ",'" + id + "')"; return customFirstUrl; } /** * 获取第i页的页面url * * @param i * @return String */ final String getPageUrl(long i) { // 判断当要获取的页面url是当前页时,返回空链接 if (i == this.pageNumber)// || i == (this.getPageCount() - 1)) return ""; // 不需要反转排序顺序 return getOffsetUrl(maxPageItems * i, this.getSortKey(), this.getDesc()); } /** * 获取第i页的页面url * * @param i * @return String */ final String getTruePageUrl() { // 不需要反转排序顺序 return getUrlWithoutOffset( this.getSortKey(), this.getDesc()); } /** * 获取带pageOffset、sortKey参数的url * * @param pageOffset * @param sortKey * added by biaoping.yin on 2005-02-03 * @return String */ public final String getOffsetUrl(long pageOffset, String sortKey, boolean desc) { int uriLen = uri.length(); // this.addParam(idOffsetParam,pageOffset + ""); uri.append(params == 0 ? '?' : '&').append(idOffsetParam).append('=') .append(pageOffset); if (sortKey != null) uri.append("&").append(getKey("sortKey")).append("=").append( sortKey); uri.append("&").append(getKey("desc")).append("=").append(desc + ""); String offsetUrl = uri.toString(); uri.setLength(uriLen); return offsetUrl; } /** * 获取带pageOffset、sortKey参数的url * * @param pageOffset * @param sortKey * added by biaoping.yin on 2005-02-03 * @return String */ public final String getUrlWithoutOffset( String sortKey, boolean desc) { int uriLen = uri.length(); uri.append(params == 0 ? '?' : '&').append(idOffsetParam).append('=') .append(0); if (sortKey != null) uri.append("&").append(getKey("sortKey")).append("=").append( sortKey); uri.append("&").append(getKey("desc")).append("=").append(desc + ""); String offsetUrl = uri.toString(); uri.setLength(uriLen); return offsetUrl; } /** * 获取pageOffset开始到pageOffset+maxPageItems的记录所在的页码 * * @param pageOffset * @return Integer */ public final Long getOffsetPageNumber(long pageOffset) { return new Long(1 + pageNumber(pageOffset)); } /** * 计算下一页记录起始位置 * * @return int */ public final long getNextOffset() { return offset + maxPageItems; } /** * 判断是否有下一页 * * @return boolean */ public final boolean hasNextPage() { if(!this.isMore()) { boolean hasNextPage = (getItemCount() > getNextOffset()); return hasNextPage; } else { //当页记录数 if(this.getDataResultSize() < this.getMaxPageItems()) return false; else return true; } } /** * 判断是否有上一页 * * @return boolean */ public final boolean hasPrevPage() { return (offset > 0); } /** * 计算上一页记录的起始位置 * * @return int */ public final long getPrevOffset() { return Math.max(0l, offset - maxPageItems); } /** * 判断页面page是否存在 * * @param page * @return boolean */ public final boolean hasPage(long page) { return (page >= 0 && getItemCount() > (page * maxPageItems)); } public final boolean nextItem() { boolean showItem = false; if (itemCount < maxItems) { showItem = (itemCount >= offset && itemCount < (offset + maxPageItems)); itemCount++; } return showItem; } public final long getOffset() { return offset; } protected final boolean isIndexNeeded() { return (offset != 0 || getItemCount() > maxPageItems); } public final String getCurrentUrl() { String ret = getOffsetUrl(getPageNumber() * maxPageItems, getSortKey(), getDesc()); return ret; // return new // Input().setType(Input.HIDDEN).setValue(URLEncoder.encode(ret)).setName("curUrl").toString(); } static final String PARAMETER = "parameter"; static final String ATTRIBUTE = "attribute"; public int getParams() { return this.params; } /** * 从request中获取参数值, 并且添加到参数串中 Description: * * @param name * @param type * void */ public final void addParamByRequest(String name, String type, Object defauleValue, boolean encode,int encodecount) { if (type == null) return; String value = null; if (type.equals(PARAMETER)) { value = request.getParameter(name); } else if (type.equals(ATTRIBUTE)) { value = (String) request.getAttribute(name); } if (value != null) { // value = value.trim(); if (encode) { // name = URLEncoder.encode(name); // value = URLEncoder.encode(value); value = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value); params++; } else if (defauleValue != null) { // value = value.trim(); if (encode) { // name = URLEncoder.encode(name); // value = URLEncoder.encode(defauleValue.toString()); value = SimpleStringUtil.urlencode(defauleValue.toString(), "UTF-8",encodecount); } else { value = defauleValue.toString(); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value.toString()); params++; } } /** * 从request中获取参数值, 并且添加到参数串中 Description: * * @param name * @param type * void */ public final void addParamsByRequest(String name, boolean encode,int encodecount) { String values[] = null; values = request.getParameterValues(name); if (values != null) { for(int i = 0; values != null && i < values.length; i ++) { String value = values[i]; // value = value.trim(); if (encode) { // name = URLEncoder.encode(name); // name = name; // value = URLEncoder.encode(value); value = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value); params++; } } } /** * 从request中获取参数值, 并且添加到参数串中 Description: * * @param name * @param type * void */ public final void addBeanParams(String name, boolean encode,String scope,int encodecount) { Object bean = request.getAttribute(name); if(bean == null) return ; if(bean instanceof Map) { mapParamsAppend((Map) bean, name, encode, scope,encodecount); } else { beanParamsAppend( bean, name, encode, scope,encodecount); } } private final void beanParamsAppend(Object bean,String name, boolean encode,String scope,int encodecount) { // BeanInfo beanInfo; // try { // // beanInfo = Introspector.getBeanInfo(bean.getClass()); // } catch (IntrospectionException e1) { // return; // } ClassInfo beanInfo = ClassUtil.getClassInfo(bean.getClass()); List<PropertieDescription> attributes = beanInfo.getPropertyDescriptors(); if(attributes == null || attributes.size() <=0) return ; // Method m = null; // Field field= null; for(PropertieDescription f:attributes) { name = f.getName(); if(!f.canread()) continue; IgnoreParam ignore = f.findAnnotation(IgnoreParam.class); if(ignore != null) { continue; } Object v = null; try { v = f.getValue(bean); } catch (Exception e) { continue; } if(v == null) continue; if(!v.getClass().isArray()) { String value = String.valueOf(v); // value = value.trim(); if (encode) { // value = URLEncoder.encode(value); value = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value); params++; } else //处理数组值 { int size = Array.getLength(v); if(size == 0) continue; for(int i = 0; i < size; i ++) { Object v_ = Array.get(v, i); String value = String.valueOf(v_); if (encode) { // value = URLEncoder.encode(value); value = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value); params++; } } } } private final void mapParamsAppend(Map bean,String name, boolean encode,String scope,int encodecount) { if(bean.isEmpty()) return; Iterator<Map.Entry> it = bean.entrySet().iterator(); while(it.hasNext()) { Map.Entry entry = it.next(); Object v = entry.getValue(); if(v == null) continue; name = String.valueOf(entry.getKey()); if(!v.getClass().isArray()) { String value = String.valueOf(v); // value = value.trim(); if (encode) { // value = URLEncoder.encode(value); value = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value); params++; } else //处理数组值 { int size = Array.getLength(v); if(size == 0) continue; for(int i = 0; i < size; i ++) { Object v_ = Array.get(v, i); String value = String.valueOf(v_); if (encode) { value = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); // value = URLEncoder.encode(value); } addQueryParam(name, value); uri.append(params == 0 ? '?' : '&').append(name).append('=') .append(value); params++; } } } } public final void addQueryParam(String name, String value) { queryString.append(params == 0 ? "" : "&").append(name).append('=') .append(value); } public final void addParam(String name, String value, Object defaultValue, boolean encode,int encodecount) { // String[] values = null; if (value == null) { value = request.getParameter(name); if (value == null) value = (String) request.getAttribute(name); // if(value != null) // values = new String[] {value}; } // else // values = new String[] {value}; if (value != null) { // value = value.trim(); String tempName = ""; String tempValue = ""; if (encode) { // tempName = URLEncoder.encode(name); tempName = name; // tempValue = URLEncoder.encode(value); tempValue = SimpleStringUtil.urlencode(value, "UTF-8",encodecount); } else { tempName = name; tempValue = value; } uri.append(params == 0 ? '?' : '&').append(tempName).append('=') .append(tempValue); addQueryParam(tempName, tempValue); // queryString.append(params == 0 ? "" : // "&").append(name).append('=').append(values[i]); params++; // for(int i = 0; i < values.length; i ++) // { // System.out.println("values[" + i + "]:" + values[i]); // // // } } else if (defaultValue != null) { String tempName = ""; String tempValue = ""; if (encode) { // tempName = URLEncoder.encode(name); tempName = name; // tempValue = URLEncoder.encode(defaultValue.toString()); tempValue = SimpleStringUtil.urlencode(defaultValue.toString(), "UTF-8",encodecount); } else { tempName = name; tempValue = defaultValue.toString(); } uri.append(params == 0 ? '?' : '&').append(tempName).append('=') .append(tempValue); addQueryParam(tempName, tempValue); // queryString.append(params == 0 ? "" : // "&").append(name).append('=').append(values[i]); params++; } // else { // /** // * 为了如下情况,暂时不需要,如有需要即可打开 // */ // //// String[] values = // pageContext.getRequest().getParameterValues(name); // //// // //// if (values != null) { // //// name = URLEncoder.encode(name); // //// for (int i = 0, l = values.length; i < l; i++) { // //// value = URLEncoder.encode(values[i]); // //// uri.append(params == 0 ? '?' : '&') // //// .append(name).append('=').append(value); // //// // //// params++; // //// } // //// } // // // // value = (String)pageContext.getRequest().getAttribute(name); // // //value = (String)pageContext.getRequest().getgetAttribute(name); // // //System.out.println(name + ":"+value); // if (value != null) // { // name = URLEncoder.encode(name); // value = URLEncoder.encode(value); // // uri.append(params == 0 ? '?' : '&') // .append(name).append('=').append(value); // // params++; // // } // // } } private String scope = null; public final String getScope() { return scope; } /** * pageNumberInteger:封装当前页页码的对象 */ private Long pageNumberInteger = null; /** * 分析需要导出参数的分析类 */ private PagerTagExport pagerTagExport = null; private Object oldPager = null; private Object oldOffset = null; private Object oldPageNumber = null; final void initContext() throws LoadDataException { String offsetParam = null; // PagineContext context = null; /** * 如果是内容管理系统发布频道概览的情况,offset参数通过发布的上下文传提过来 */ CMSServletRequest cmsrequest = InternalImplConverter .getInternalRequest(request); CMSCallBack cmsCallBack = null; if (cmsrequest != null && !ListMode()) { cmsCallBack = CMSCallBackUtil.getCMSCallBack(cmsrequest); offsetParam = cmsCallBack.initContext(this.getMaxPageItems()); // context = (PagineContext) cmsrequest.getContext(); // if (!(context instanceof ContentContext)) /** // * // * 如果当前环境是在发布文档,则文档中不允许进行概览分页,但是在项目中有的情况下用分页的属性来获取文档的头几条 这种情况是不允许的 // */ // { // context.setMaxPageItems(this.getMaxPageItems()); // offsetParam = context.getOffset() + ""; // } else { // context.getPublishMonitor().addFailedMessage( // "文档细览页面中的概览标签不允许将isList设置为false", // context.getPublisher()); // } } else { offsetParam = request.getParameter(idOffsetParam); if (offsetParam == null) { offsetParam = (String) request.getAttribute(idOffsetParam); } } /** * 初始化offset */ if (offsetParam == null) offset = 0; if (offsetParam != null || !ListMode()) { try { if (offsetParam != null) offset = Math.max(0l, Long.parseLong(offsetParam)); setDataInfo(); long newPageCount = pageNumber(offset); if(!this.isMore()) { long lastPagerNumber = getLastPageNumber(); if (newPageCount > lastPagerNumber) { offset = lastPagerNumber * getMaxPageItems(); // /** // * 重新获取数据,如果数据库底层能够处理这个问题,将不需要重新获取数据 // */ // setDataInfo(); } } if(cmsCallBack != null && cmsrequest != null) { cmsCallBack = CMSCallBackUtil.getCMSCallBack(cmsrequest); cmsCallBack.initContextData(offset,(int)newPageCount, this.getTotalSize()); } // if (context != null && !(context instanceof ContentContext)) { // context.setOffset(offset); // /** // * 如果当前的页码和offset有变化需要更新context中的值 // */ // context.setCurrentPageNumber((int) newPageCount); // context.setTotalSize(this.getTotalSize()); // } else if (context instanceof ContentContext) { // // context.getPublishMonitor().addFailedMessage("文档细览页面中的概览标签不允许将isList设置为false",context.getPublisher()); // } // if (isOffset) 于2004/4/30注释 itemCount = offset; } catch (NumberFormatException ignore) { ignore.printStackTrace(); } } else { setDataInfo(); } // this.addQueryParam(idOffsetParam,offset + ""); pageNumber = pageNumber(offset); pageNumberInteger = new Long(1 + pageNumber); if (REQUEST.equals(scope)) { /* * id的值为“pager“,备份先前的页面 */ // oldPager = request.getAttribute(id); // request.setAttribute(id, this); if (pagerTagExport != null) { String name; if ((name = pagerTagExport.getPageOffset()) != null) { oldOffset = request.getAttribute(name); request.setAttribute(name, new Long(offset)); } if ((name = pagerTagExport.getPageNumber()) != null) { oldPageNumber = request.getAttribute(name); request.setAttribute(name, pageNumberInteger); } } } else { if (pagerTagExport != null) { String name; if ((name = pagerTagExport.getPageOffset()) != null) { /** * offset:当前页面第一条记录id值, 例如offset=80表示当前页面第一条记录id值为80 */ oldOffset = pageContext.getAttribute(name); pageContext.setAttribute(name, new Long(offset)); } if ((name = pagerTagExport.getPageNumber()) != null) { /** * offset:当前页面第一条记录id值, 例如offset=80表示当前页面第一条记录id值为80 */ oldPageNumber = pageContext.getAttribute(name); pageContext.setAttribute(name, pageNumberInteger); } } } } private String data = null; /** * 获取数据获取类在request中的存放名称 * * @return String 数据获取类在request中的存放名称 */ public String getData() { return data == null ? "dataInfo" : data; } public final int getMaxPageItems() { return maxPageItems; } /** * 初始化数据获取接口 * * @param dataType * 接口在配置文件对应的名称属性 */ public void setDataInfo() throws LoadDataException { if (this.tag instanceof PagerTag) { String dataType = this.getData(); // 检测是否设置数据库查询语句,如果设置则直接构建针对数据库实现的缺省DataInfo接口, // 否则从request缓冲中获取DataInfo接口 if (statement != null && !statement.equals("")) { DefaultDataInfoImpl dataInfo_ = new DefaultDataInfoImpl(); this.dataInfo = dataInfo_; try { dataInfo_.setMoreQuery(moreQuery); this.setMore(moreQuery); dataInfo.initial(statement, dbname, getOffset(), getMaxPageItems(), ListMode(), request, this .getSQLParams()); } catch (SetSQLParamException e) { throw new LoadDataException(e); } if (!ListMode() ) { long totalsize = dataInfo.getItemCount(); if(!dataInfo.isMore()) setItems(totalsize); } } else { Object dataInfo_temp = request.getAttribute(dataType); if(dataInfo_temp instanceof DataInfo) { dataInfo = (DataInfo) dataInfo_temp; if (dataInfo == null) { log.info("请检查DataInfo对象已经设置正确"); return; } /** * 如果是直接的缺省的数据库实现,调用该实现的初始化方法, 否则调用通用的初始化方法 */ if (dataInfo instanceof DefaultDataInfoImpl) dataInfo.initial(null, null, getOffset(), getMaxPageItems(), this.ListMode(), // String sortKey, // boolean desc, request); else { dataInfo.initial(getSortKey(), this.desc, getOffset(), getMaxPageItems(), this.ListMode(), request); } } else if(PagerContext.isPagerMehtod(request) ) { if(dataInfo_temp != null && dataInfo_temp instanceof ListInfo) this.dataInfo = new ListInfoDataInfoImpl((ListInfo)dataInfo_temp); } // 如果是分页模式设置记录总数 if (dataInfo != null && !ListMode()) { long totalsize = dataInfo.getItemCount(); this.setMore(dataInfo.isMore()); if(!dataInfo.isMore()) setItems(totalsize); } } } else if (this.tag instanceof PagerDataSet) { // PagerDataSet listTag = (PagerDataSet)tag; /** * 判断是否是嵌套列表,如果是嵌套列表则可设置如下属性: colName,property,sortKey,desc */ // System.out.println("this:" + this); if (getColName() != null) { try { load(COLUMN_SCOPE); } catch (LoadDataException e) { // log.info(e.getMessage()); throw e; // return SKIP_BODY; } } else if (statement != null && !statement.equals("")) { try { load(DB_SCOPE); } catch (LoadDataException e) { // log.info(e.getMessage()); // return SKIP_BODY; throw e; } } else if (requestKey != null) { try { load(REQUEST_SCOPE); // data = request.getAttribute(listTag.requestKey); } catch (LoadDataException e) { // log.info(e.getMessage()); // return SKIP_BODY; throw e; } } else if (this.actual != null) { try { load(ACTUAL_SCOPE); // data = request.getAttribute(listTag.requestKey); } catch (LoadDataException e) { // log.info(e.getMessage()); // return SKIP_BODY; throw e; } } else if (sessionKey != null) try { load(SESSION_SCOPE); } catch (LoadDataException e1) { // log.info(e1.getMessage()); // return SKIP_BODY; throw e1; } else if (pageContextKey != null) { try { load(PAGECONTEXT_SCOPE); } catch (LoadDataException e2) { // log.info(e2.getMessage()); // return SKIP_BODY; throw e2; } } else if (CMSCallBackUtil.isCMSListTag(tag)) { CMSCallBack callback = CMSCallBackUtil.getCMSCallBack(); this.dataInfo = callback.getCMSDataInfo(tag,request,getSortKey(), this.desc, getOffset(), getMaxPageItems(), this.ListMode()); // CMSListTag cmsListTag = (CMSListTag) tag; // CMSBaseListData dataInfo = CMSTagUtil // .getCMSBaseListData(cmsListTag.getDatatype()); // /** // * 最新cms需要放开注释的代码 // * https://github.com/bbossgroups/bboss-cms.git // * */ // Map<String,Object> params = cmsListTag.getParams(); // if(params != null) // { // if(!params.containsKey("doctype") && cmsListTag.getDocType() != null) // { // params.put("doctype", cmsListTag.getDocType() ); // } // else // { // // } // dataInfo.setOutlineInfo(cmsListTag.getSite(), cmsListTag // .getChannel(), cmsListTag.getCount(), params); // // // } // else // { // dataInfo.setOutlineInfo(cmsListTag.getSite(), cmsListTag // .getChannel(), cmsListTag.getCount(), cmsListTag.getDocType()); // } // /** // * 旧的cms使用以下代码,后续需要屏蔽dataInfo.setOutlineInfo(cmsListTag.getSite(), cmsListTag // .getChannel(), cmsListTag.getCount()); // // dataInfo.setOutlineInfo(cmsListTag.getSite(), cmsListTag // .getChannel(), cmsListTag.getCount());*/ // if (cmsListTag.getDocumentid() != null) // dataInfo.setDocumentid(cmsListTag.getDocumentid()); // // dataInfo.initial(getSortKey(), this.desc, getOffset(), // getMaxPageItems(), this.ListMode(), request); // this.dataInfo = dataInfo; // 如果是分页模式设置记录总数 if (!ListMode()) { setItems(dataInfo.getItemCount()); } } else { try { load(CELL_SCOPE); } catch (LoadDataException e2) { // log.info(e2.getMessage()); // return SKIP_BODY; throw e2; } } } } public SQLParams getSQLParams() throws SetSQLParamException { if (this.getSQLExecutor() != null) return this.getSQLExecutor().getSQLParams(); return null; } // protected PagerDataSet searchDataSet(Tag obj,Class clazz) { // PagerDataSet dataSet = null; // // if (this.getIndex() < 0) { // dataSet = // (PagerDataSet)BaseTag.findAncestorWithClass(obj, clazz); // } else { // //int idx = index(); // java.util.Stack stack = // (java.util.Stack) request.getAttribute( // PagerDataSet.PAGERDATASET_STACK); // dataSet = (PagerDataSet) stack.elementAt(this.getIndex()); // } // return dataSet; // } public static Object getCOLUMNValue(Tag tag,String colName,String property) { Object data = null; PagerDataSet dataSet = ((PagerDataSet) tag).searchDataSet(tag, PagerDataSet.class); // System.out.println("dataSet:" + dataSet); // System.out.println("dataSet.getRowid():" + dataSet.getRowid()); /** * 根据调用getProperty()方法返回值判断当前列是否为bean 如果为空,表示字段为collection * * 否则表示字段是一个javabean,getProperty()返回的值为该对象的一个属性,类型为collection */ if (property == null) { data = dataSet.getValue(dataSet.getRowid(), colName); // System.out.println("dataInfo.size:" + dataInfo.size()); } else { data = dataSet.getValue(dataSet.getRowid(), colName, property); } return data; } protected void load(String scope) throws LoadDataException { Object data = null; if (scope.equals(REQUEST_SCOPE) ) { // dataInfo = (Collection)request.getAttribute(requestKey); data = request.getAttribute(requestKey); } else if(scope.equals(ACTUAL_SCOPE)) { data = this.actual; } else if (scope.equals(DB_SCOPE)) { // this.dataInfo = new DefaultDataInfoImpl(); /** * 如果是直接的缺省的数据库实现,调用该实现的初始化方法, 否则调用通用的初始化方法 */ DefaultDataInfoImpl dataInfo_ = new DefaultDataInfoImpl(); this.dataInfo = dataInfo_; try { dataInfo_.setMoreQuery(moreQuery); this.setMore(moreQuery); dataInfo.initial(this.statement, this.dbname, getOffset(), getMaxPageItems(), this.ListMode(), // String sortKey, // boolean desc, request, this.getSQLParams()); } catch (SetSQLParamException e) { throw new LoadDataException(e); } // // 如果是分页模式设置记录总数 if (!ListMode()) { long totalsize = dataInfo.getItemCount(); if(!dataInfo.isMore()) setItems(totalsize); } return; } else if (session != null && scope.equals(SESSION_SCOPE)) { data = session.getAttribute(sessionKey); } else if (scope.equals(PAGECONTEXT_SCOPE)) { data = pageContext.getAttribute(pageContextKey); } else if (scope.equals(COLUMN_SCOPE)) { // PagerDataSet dataSet = ((PagerDataSet) tag).searchDataSet(tag, // PagerDataSet.class); // // // System.out.println("dataSet:" + dataSet); // // System.out.println("dataSet.getRowid():" + dataSet.getRowid()); // /** // * 根据调用getProperty()方法返回值判断当前列是否为bean 如果为空,表示字段为collection // * // * 否则表示字段是一个javabean,getProperty()返回的值为该对象的一个属性,类型为collection // */ // // if (getProperty() == null) { // // data = dataSet.getValue(dataSet.getRowid(), getColName()); // // // System.out.println("dataInfo.size:" + dataInfo.size()); // } else { // data = dataSet.getValue(dataSet.getRowid(), getColName(), // getProperty()); // } data = getCOLUMNValue(tag,getColName(),getProperty()); } else if (scope.equals(CELL_SCOPE)) { if(request instanceof CMSServletRequest) { CMSServletRequest cmsRequest = (CMSServletRequest) request; CMSCallBack callback = CMSCallBackUtil.getCMSCallBack(cmsRequest); data = callback.getCMSCellData(); // // CMSDetailDataLoader dataLoader = // // (CMSDetailDataLoader)request.getAttribute("dataset." // // + cmsRequest.getContext().getID()); // // CMSDetailDataLoader dataLoader = cmsRequest.getContext() // .getCMSDetailDataLoader(); // try { // if (dataLoader == null) // return; // data = dataLoader.getContent((ContentContext) cmsRequest // .getContext()); // } catch (CMSDataLoadException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } else { PagerDataSet dataSet = ((PagerDataSet) tag).searchDataSet(tag, PagerDataSet.class); data = dataSet.getValue(dataSet.getRowid()); } } else throw new LoadDataException("load data from " + scope + " error"); if (data == null) throw new LoadDataException("load data from " + scope + " :dataInfo == null or dataInfo.size() == 0"); // try { // if(data instanceof Collection) // loadClassData((Collection)data); // else if(data instanceof Iterator) // loadClassData((Iterator)data); // else if(data instanceof Object[]) // { // loadClassData((Object[])data); // } // else if(data instanceof DefaultDataInfoImpl) // loadClassData(data); // } catch (LoadDataException e) { // log.info(e.getMessage()); // //e.printStackTrace(); // } // boolean islistinfo = (data instanceof ListInfo); if(!PagerContext.isPagerMehtod(request)) { this.dataInfo = new ObjectDataInfoImpl(data); } else { if( data instanceof ListInfo) { this.dataInfo = new ListInfoDataInfoImpl((ListInfo)data); // 如果是分页模式设置记录总数 if (!ListMode()) { long totalsize = dataInfo.getItemCount(); if(!dataInfo.isMore()) setItems(totalsize); } } else { this.dataInfo = new ObjectDataInfoImpl(data); } } } public final void setItems(long value) { items = value; } public final long getItems() { return items; } /** * 获取带sortKey参数的url,及列表标题排序链接 * * @param sortKey * added by biaoping.yin on 2005-02-03 * @return String */ public final String getUrl(String sortKey, boolean desc) { int uriLen = uri.length(); // this.addParam(idOffsetParam,pageOffset + ""); uri.append(params == 0 ? '?' : '&').append(getKey("sortKey")).append( "=").append(sortKey); uri.append("&").append(getKey("desc")).append("=").append(desc + ""); String offsetUrl = uri.toString(); uri.setLength(uriLen); return offsetUrl; } /** * 获取索引页的开始页码 * * @return int */ final long getFirstIndexPage() { long firstPage = 0; long halfIndexPages = maxIndexPages / 2; if (FORWARD.equals(navindex)) { firstPage = Math.min(pageNumber + 1, getPageCount()); } else if (!(HALF_FULL.equals(navindex) && pageNumber < halfIndexPages)) { long pages = getPageCount(); if (pages > maxIndexPages) { // put the current page in middle of the index firstPage = Math.max(0, pageNumber - halfIndexPages); long indexPages = pages - firstPage; if (indexPages < maxIndexPages) firstPage -= (maxIndexPages - indexPages); } } return firstPage; } /** * 获取索引页的终止位置 * * @param firstPage * @return int */ final long getLastIndexPage(long firstPage) { long pages = getPageCount(); long halfIndexPages = maxIndexPages / 2; long maxPages; if (HALF_FULL.equals(navindex) && pageNumber < halfIndexPages) { maxPages = pageNumber + halfIndexPages; } else { maxPages = firstPage + maxIndexPages; } return (pages <= maxPages ? pages : maxPages) - 1; } /** * 获取第i页的页码 * * @param i * @return Integer */ final Long getPageNumber(long i) { if (i == pageNumber) return pageNumberInteger; return new Long(1 + i); } public void setScope(String scope) { this.scope = scope; } public final void setMaxIndexPages(int value) { maxIndexPages = value; } public final int getMaxIndexPages() { return maxIndexPages; } public String getNavindex() { return navindex; } public void setNavindex(String navindex) { this.navindex = navindex; } private String url = null; private boolean isOffset; public final String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public void setUri() { String baseUri; if (url != null) { baseUri = url; } else { baseUri = request.getRequestURI(); // System.out.println(baseUri); int i = baseUri.indexOf('?'); if (i != -1) baseUri = baseUri.substring(0, i); } if (uri == null) uri = new StringBuilder(baseUri.length() + 32); else uri.setLength(0); if (queryString == null) queryString = new StringBuilder(32); else // 修正bug,清空queryString内容,否则queryString将不断累积 queryString.setLength(0); uri.append(baseUri); } public void release() { if (REQUEST.equals(scope)) { restoreAttribute(request, id, oldPager); request.removeAttribute(getData()); oldPager = null; if (pagerTagExport != null) { String name; if ((name = pagerTagExport.getPageOffset()) != null) { restoreAttribute(request, name, oldOffset); oldOffset = null; } if ((name = pagerTagExport.getPageNumber()) != null) { restoreAttribute(request, name, oldPageNumber); oldPageNumber = null; } } } else { if (pagerTagExport != null) { String name; if ((name = pagerTagExport.getPageOffset()) != null) { restoreAttribute(pageContext, name, oldOffset); oldOffset = null; } if ((name = pagerTagExport.getPageNumber()) != null) { restoreAttribute(pageContext, name, oldPageNumber); oldPageNumber = null; } } } } public static void restoreAttribute(PageContext pageContext, String name, Object oldValue) { if (oldValue != null) pageContext.setAttribute(name, oldValue); else pageContext.removeAttribute(name); } public static void restoreAttribute(ServletRequest request, String name, Object oldValue) { if (oldValue != null) request.setAttribute(name, oldValue); else request.removeAttribute(name); } public void setIsOffset(boolean isOffset) { this.isOffset = isOffset; } public boolean isOffset() { return isOffset; } public void setMaxItems(int maxItems) { this.maxItems = maxItems; } public void setMaxPageItems(int maxPageItems) { this.maxPageItems = maxPageItems; } public void setCustomMaxPageItems(int customMaxPageItems) { this.customMaxPageItems = customMaxPageItems; } public void setData(String data) { this.data = data; } /** * 输出当前页面实际结果集记录数 * * @see com.frameworkset.common.tag.pager.tags.PagerInfo#getDataSize() */ public int getDataSize() { return dataInfo == null ? 0 : dataInfo.getDataSize(); } /** * 输出当前页面数据库原始记录条数,可能经过应用程序处理数据记录会发生变化,可以通过getDataSize方法获取实际当页记录数 * * @see com.frameworkset.common.tag.pager.tags.PagerInfo#getDataSize() */ public int getDataResultSize() { return dataInfo == null ? 0 : dataInfo.getDataResultSize(); } /** * 获取页面的总记录数 * * @return */ public long getTotalSize() { return dataInfo == null ? 0 : dataInfo.getItemCount(); } public String getPageContextKey() { return pageContextKey; } public void setPageContextKey(String pageContextKey) { this.pageContextKey = pageContextKey; } public String getRequestKey() { return requestKey; } public void setRequestKey(String requestKey) { this.requestKey = requestKey; } public String getSessionKey() { return sessionKey; } public void setSessionKey(String sessionKey) { this.sessionKey = sessionKey; } public String getColName() { return colName; } public void setColName(String colName) { this.colName = colName; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public void setIndex(int index) { this.index = index; } public int getIndex() { return index; } public String getCommitevent() { return commitevent; } public void setCommitevent(String commitevent) { this.commitevent = commitevent; } public String getDbname() { return dbname; } public void setDbname(String dbname) { this.dbname = dbname; } public String getStatement() { return statement; } public void setStatement(String statement) { this.statement = statement; } public SQLExecutor getSQLExecutor() { return sqlExecutor; } public void setSQLExecutor(SQLExecutor sqlExecutor) { this.sqlExecutor = sqlExecutor; } 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; } /** * @return the cookieid */ public String getCookieid() { return cookieid; } /** * @param cookieid the cookieid to set */ public void setCookieid(String cookieid) { this.cookieid = cookieid; } /** * @return the customMaxPageItems */ public int getCustomMaxPageItems() { return customMaxPageItems; } public boolean isNotifyed() { return notifyed; } public void setNotifyed(boolean notifyed) { this.notifyed = notifyed; } /**********************bboss mvc分页结合功能需要的方法 开始**************************************************/ public static String HandlerMapping_pathWithinHandlerMapping = "org.frameworkset.web.servlet.HandlerMapping.pathWithinHandlerMapping"; public static String getPathwithinHandlerMapping(HttpServletRequest request) { String urlpath = (String) request.getAttribute(HandlerMapping_pathWithinHandlerMapping); if(urlpath != null && urlpath.startsWith("/") ) { urlpath = request.getContextPath() + urlpath; } return urlpath; } public static String HandlerMapping_requesturi = "org.frameworkset.web.servlet.HandlerMapping.requesturi"; public static String getHandlerMappingRequestURI(HttpServletRequest request) { String urlpath = (String) request.getAttribute(HandlerMapping_requesturi); return urlpath; } public static String HandlerMapping_HandlerMappingPath = "org.frameworkset.web.servlet.HandlerMapping.HandlerMappingPath"; public static String getHandlerMappingPath(HttpServletRequest request) { return (String) request .getAttribute(HandlerMapping_HandlerMappingPath); } public static String HandlerMapping_PAGER_METHOD_FLAG = "org.frameworkset.web.servlet.HandlerMapping.PAGER_METHOD_FLAG"; public static boolean isPagerMehtod(HttpServletRequest request) { Object value = request.getAttribute(HandlerMapping_PAGER_METHOD_FLAG); if(value == null) return false; return (Boolean)value; } public static String HandlerMapping_PAGER_PAGESIZE_FLAG = "org.frameworkset.web.servlet.HandlerMapping.PAGER_PAGESIZE_FLAG"; public static int getControllerPagerSize(HttpServletRequest request) { Object value = request.getAttribute(HandlerMapping_PAGER_PAGESIZE_FLAG); if(value == null) return PagerTag.DEFAULT_MAX_PAGE_ITEMS; return (Integer)value; } public static String HandlerMapping_PAGER_CUSTOM_PAGESIZE = "org.frameworkset.web.servlet.HandlerMapping.PAGER_CUSTOM_PAGESIZE"; /** * 获取自定义分页参数 * @param request * @return */ public static int getCustomPagerSize(HttpServletRequest request) { Object value = request.getAttribute(HandlerMapping_PAGER_CUSTOM_PAGESIZE); if(value == null) return PagerTag.DEFAULT_MAX_PAGE_ITEMS; return (Integer)value; } public static String HandlerMapping_PAGER_COOKIEID = "org.frameworkset.web.servlet.HandlerMapping.PAGER_COOKIEID"; public static String getControllerCookieID(HttpServletRequest request) { return (String)request.getAttribute(HandlerMapping_PAGER_COOKIEID); } /**********************bboss mvc分页结合功能需要的方法 结束**************************************************/ public boolean isMoreQuery() { return moreQuery; } public void setMoreQuery(boolean moreQuery) { this.moreQuery = moreQuery; } public boolean isMore() { return more; } public void setMore(boolean more) { this.more = more; } public boolean isDescfromrequest() { return descfromrequest; } public void setDescfromrequest(boolean descfromrequest) { this.descfromrequest = descfromrequest; } }