最近出了个问题,框架用ssh,可是分页有问题,页面属性无法传到action中,后来发现有两个同名的属性,所以action中得不到值.
代码:
web.xml
<jsp-config>
<taglib>
<taglib-uri>/tag/eoms-taglib</taglib-uri>
<taglib-location>/WEB-INF/tld/common.tld</taglib-location>
</taglib>
</jsp-config>
common.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>eoms</short-name>
<uri>/tag/eoms-taglib</uri>
<display-name>Eoms Taglib</display-name>
<description>Eoms Taglib</description>
<tag>
<name>page</name>
<tag-class>com.common.taglibs.PageTag</tag-class>
<body-content>JSP</body-content>
<description></description>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>order</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>image</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>para</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
PageTag.java
package com.common.taglibs;
import java.io.IOException;
import java.util.Enumeration;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
import org.springframework.web.context.WebApplicationContext;
import com.common.organize.user.UserSession;
import com.common.util.Page;
import com.common.LanguageUtil;
public class PageTag extends TagSupport {
private static final long serialVersionUID = 2L;
protected String name;// Page对象的名字
protected boolean image = true;// 是否显示图片
protected int order = 0;// 用于指定显示风格
protected Page page;
// private String currentUrl;// 当前页的URL
private boolean para = true;
HttpServletRequest request = null;
LanguageUtil langUtil = null;// 语言工具
String language = "";// 语言
public int doEndTag() throws JspException {
request = (HttpServletRequest) pageContext.getRequest();
page = (Page) request.getAttribute(name);// Page对象
if (page == null)
page = Page.EMPTY_PAGE;
WebApplicationContext appContext = (WebApplicationContext) pageContext
.getServletContext()
.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
langUtil = (LanguageUtil) appContext.getBean("sysLanguageUtil");
language = UserSession.getLanguagePrefernce(request);
// currentUrl = request.getRequestURL().toString();
try {
//--------add
pageContext.getOut().print(printSubmitJS());
if (para){
pageContext.getOut().print(printHiddenField());
//pageContext.getOut().print(getParamsFromCurrentURL(request, "start,size"));
}
//++++++++
pageContext.getOut().print(viewPage());
} catch (IOException ex) {
throw new JspTagException(ex.getMessage());
}
return EVAL_PAGE;
}
/**
* 取得分页的标签
*
* 按指定形式显示分页内容
* order为0,
* 表示完整形式,按如下顺序显示:
* 共计:18 分页:2 当前页:1 每页:10 首页 前页 后页 尾页 转到□
* order为1,
* 表示简洁形式,按如下顺序显示:
* 前页 后页 尾页 1/2
* order为2,
* 表示完整形式2,按如下顺序显示:
* 共计:18 每页:10 转到□ 首页 前页 后页 尾页 1/2
* @return 分页html
*/
public String viewPage() {
StringBuffer viewPage = new StringBuffer();
try {
switch (order) {
case 1:
viewPage.append(viewFirstPage()).append(viewPreviousPage())
.append(viewNextPage()).append(viewLastPage()).append(
viewTotalAndCurrent());
break;
case 2:
viewPage.append(viewTotal()).append(viewPageSize()).append(
viewGotoPage()).append(viewFirstPage()).append(
viewPreviousPage()).append(viewNextPage()).append(
viewLastPage()).append(viewTotalAndCurrent());
break;
default:
viewPage.append(viewTotal()).append(viewTotalPage()).append(
viewCurrentPage()).append(viewPageSize()).append(
viewFirstPage()).append(viewPreviousPage()).append(
viewNextPage()).append(viewLastPage()).append(
viewGotoPage());
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return viewPage.toString();
}
/**
* 显示一共有多少条记录
*/
private String viewTotal() {
return langUtil.getLanguageString("page totalsize", language) + ":"
+ page.getTotalSize() + " ";
}
/**
* 显示一共有多少页
*/
private String viewTotalPage() throws IOException {
return langUtil.getLanguageString("page pagecount", language) + ":"
+ page.getPageCount() + " ";
}
/**
* 显示当前是第几页
*/
private String viewCurrentPage() throws IOException {
return langUtil.getLanguageString("page curpagenum", language) + ":"
+ page.getCurPageNum() + " ";
}
/**
* 显示当前是第几页/一共有多少页
*/
private String viewTotalAndCurrent() throws IOException {
return page.getCurPageNum() + " / " + page.getPageCount()
+ " ";
}
/**
* 显示每页有多少条记录
*/
private String viewPageSize() throws IOException {
return langUtil.getLanguageString("page pagesize", language) + ":"
+ page.getPageSize() + " ";
}
private String printSubmitJS() {
StringBuffer js = new StringBuffer();
js.append("<SCRIPT LANGUAGE=\"JavaScript\">\n").append(
"function submitFormPage(start,size){\n").append(
"if(document.forms[0].start){\n").append(
"document.forms[0].start.value=start;\n").append(
"}\n").append(
"if(document.forms[0].size){\n").append(
"document.forms[0].size.value=size;\n").append(
"}\n").append(
"document.forms[0].submit();\n").append("}\n").append(
"</SCRIPT>\n");
return js.toString();
}
/**
* 显示首页
*/
private String viewFirstPage() {
StringBuffer firstPage = new StringBuffer();
firstPage.append("<span style=\"cursor:hand\" οnclick=\"submitFormPage('0','")
.append(page.getPageSize()).append("');\">");
if (image) {
firstPage.append("<img src=").append(getImageDir())
.append("first.gif>");
} else {
firstPage
.append(langUtil.getLanguageString("page first", language));
}
firstPage.append("</span>");
firstPage.append(" \n");
return firstPage.toString();
}
/**
* 显示上一页
*/
private String viewPreviousPage() {
StringBuffer previousPage = new StringBuffer();
if (page.hasPreviousPage()) {
previousPage.append(
"<span style=\"cursor:hand\" οnclick=\"submitFormPage('")
.append(page.getStartOfPreviousPage()).append("','")
.append(page.getPageSize()).append("');\">");
if (image) {
previousPage.append("<img src=").append(getImageDir()).append(
"previous.gif>");
} else {
previousPage.append("上一页");
}
previousPage.append("</span>");
}
previousPage.append(" \n");
return previousPage.toString();
}
/**
* 显示下一页
*/
private String viewNextPage() {
StringBuffer nextPage = new StringBuffer();
if (page.hasNextPage()) {
nextPage.append(
"<span style=\"cursor:hand\" οnclick=\"submitFormPage('")
.append(page.getStartOfNextPage()).append("','").append(
page.getPageSize()).append("');\">");
if (image) {
nextPage.append("<img src=").append(getImageDir()).append(
"next.gif>");
} else {
nextPage.append("下一页");
}
nextPage.append("</span>");
}
nextPage.append(" \n");
return nextPage.toString();
}
/**
* 显示尾页
*/
private String viewLastPage() {
StringBuffer lastPage = new StringBuffer();
int start = 0;
if (page.getPageCount() == 0) {
start = 0;
} else {
start = page.getPageSize() * (page.getPageCount() - 1);
}
lastPage.append(
"<span style=\"cursor:hand\" οnclick=\"submitFormPage('")
.append(start).append("','").append(page.getPageSize()).append(
"');\">");
if (image) {
lastPage.append("<img src=").append(getImageDir()).append(
"last.gif>");
} else {
lastPage.append("尾页");
}
lastPage.append("</span>");
lastPage.append(" \n");
return lastPage.toString();
}
/**
* 显示转到第几页
*/
private String viewGotoPage() {
StringBuffer gotoPage = new StringBuffer();
gotoPage
.append("转到")
.append(
"<SELECT name=\"jumpPage\" οnchange=\"JumpingPage('window',this,0)\">\n");
for (int i = 1; i <= page.getPageCount(); i++) {
if (i == page.getCurPageNum()) {
gotoPage.append(" <OPTION selected value=" + i + ">"
+ i + "</OPTION>\n");
} else {
gotoPage.append(" <OPTION value=" + i + ">" + i
+ "</OPTION>\n");
}
}
gotoPage.append("</SELECT>\n");
// 定义javascript方法JumpingPage()
gotoPage
.append("<SCRIPT LANGUAGE=\"JavaScript\">\n")
.append("function JumpingPage(targ,selObj,restore){\n")
.append(
" var start=eval((selObj.options[selObj.selectedIndex].value-1)*")
.append(page.getPageSize()).append(");\n").append(
"submitFormPage(start,'").append(page.getPageSize())
.append("');\n");
gotoPage.append(" if (restore) selObj.selectedIndex=0;\n");
gotoPage.append(" return ;\n");
gotoPage.append("}\n");
gotoPage.append("</SCRIPT>\n");
return gotoPage.toString();
}
/**
* 打印隐藏域
*
* @return
*/
private String printHiddenField() {
StringBuffer hidden = new StringBuffer();
hidden.append("<input type='hidden' name='start' value=''/>\n").append(
"<input type='hidden' name='size' value=''/>\n");
return hidden.toString();
}
/**
* 从URL中获取参数
*
* @param: request 客户端请求
* @param: exceptionParamNames 排除在外的参数
*/
private static String getParamsFromCurrentURL(HttpServletRequest request,
String exceptionParamNames) {
StringBuffer params = new StringBuffer();
Enumeration e = request.getParameterNames();
outer: while (e.hasMoreElements()) {
String key = (String) e.nextElement();
StringTokenizer st = new StringTokenizer(exceptionParamNames, ",");
while (st.hasMoreTokens()) {
String exceptionName = st.nextToken();
if (key.equals(exceptionName)) {
continue outer;
}
}
String value = request.getParameter(key);
// 修正存在空格的bug.
value = value.trim();
params.append("<input type='hidden' name='").append(key).append(
"' value='").append(value).append("'/>\n");
}
return params.toString();
}
/**
* @return
*/
private String getImageDir(){
String contextPath = request.getContextPath();
String curSkin = UserSession.getSkinPrefernce(request);
return contextPath+"/eoms-skins/"+curSkin+"/images/";
}
public void setName(String name) {
this.name = name;
}
public void setImage(String image) {
this.image = "true".equals(image);
}
public void setOrder(String order) {
if (order == null || "".equals(order))
this.order = 0;
else
this.order = new Integer(order).intValue();
}
public boolean isPara() {
return para;
}
public void setPara(boolean para) {
this.para = para;
}
}
Page.java
package com.common.util;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
/**
* 查询显示页面数据类,用来存放分页查询中每一页的数据.
* <p>s
* 页面数据类用来存放查询翻页过程中的数据,里面存放指定条数的数据,数据中包含哪了结果集中的部分数据。<br>
* 页面数据类中包含数据信息以及页面属性信息,其中包括开始的记录数和总记录数,页面大小等信息.
*
*
*/
public class Page implements Serializable {
public static int DEFAULTPAGESIZE = 10;
private static final long serialVersionUID = 1L;
public static final Page EMPTY_PAGE = new Page(Collections.EMPTY_LIST, 0,
0, 0);
// 结果数据列表
private List resultList = null;
// 页面开始记录数
private int start = 0;
// 结果总记录数
private int totalSize = 0;
// 页面数据大小.
private int pageSize = DEFAULTPAGESIZE;
/**
* 通过给定的参数构建页面数据对象.
*
* @param resultList
* 结果集数据列表
* @param start
* 数据集中第一个数据对象的编号.
* @param totalSize
* 总的数据记录数
* @param pageSize
* 页面数据大小
*/
public Page(List resultList, int start, int pageSize, int totalSize) {
this.resultList = resultList;
this.start = start;
this.totalSize = totalSize;
this.pageSize = pageSize;
}
/**
* 当前页面对象是否存在下一个页面对象.
*
* @return boolean 是否存在下一个页面对象
*/
public boolean hasNextPage() {
return (start + resultList.size()) < totalSize;
}
/**
* 当前页面对象是否存在前一个页面对象.
*
* @return boolean 是否存在前一个页面对象
*/
public boolean hasPreviousPage() {
return start > 0;
}
/**
* 当前页面对象的下一个页面对象的数据记录编号.
*
* @return int 下一个页面对象的数据记录编号.
*/
public int getStartOfNextPage() {
return start + resultList.size();
}
/**
* 取得当前页面对象的前一个对象页数.
*
* @return int 前一个对象页数
*/
public int getStartOfPreviousPage() {
return Math.max(start - pageSize, 0);
}
/**
* 取得总页数.
*
* @return int 总页数
*/
public int getPageCount() {
int ret = 0;
if (pageSize > 0) {
if (totalSize % pageSize == 0) {
ret = totalSize / pageSize;
} else {
ret = totalSize / pageSize + 1;
}
}
return ret;
}
/**
* 取得当前页数.
*
* @return int 当前页数
*/
public int getCurPageNum() {
int ret = 0;
if (pageSize > 0)
ret = start / pageSize + 1;
return ret;
}
/**
* 取得当前页数对象的数据列表的数据大小.
*
* @return int 数据大小
*/
public int getSize() {
return resultList.size();
}
/**
* 取得页面数据的大小.
*
* @return int 页数
*/
public int getPageSize() {
return pageSize;
}
/**
* 设置页面数据的大小.
*
* @param pageSize
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
/**
* 取得当前页面数据中的数据列表.
*
* @return List 数据列表
*/
public List getResultList() {
return resultList;
}
/**
* 设置数据对象中的数据列表.
*
* @param resultList
*/
public void setResultList(List resultList) {
this.resultList = resultList;
}
/**
* 取得当前页数据对象的第一个数据的编号.
*
* @return int 第一个数据的编号
*/
public int getStart() {
return start;
}
/**
* 设置当前页数据对象的第一个对象的数据的编号.
*
* @param start
*/
public void setStart(int start) {
this.start = start;
}
/**
* 取得所有数据的总记录数.
*
* @return int 所有数据的总记录数
*/
public int getTotalSize() {
return totalSize;
}
/**
* 设置数据的总记录数.
*
* @param totalSize
*/
public void setTotalSize(int totalSize) {
this.totalSize = totalSize;
}
}