1、 Displaytag提供的默认的系统提示均为英文,有两种方法进行汉化:
1)、将displaytag-1.1.1.jar中自带的org/display/properties/displaytag.properties 文件拷贝到项目的classes目录下
用java提供的native2ascii工具将文件进行汉化,汉化后的内容重新保存为displaytag.properties文件
2)、将jar包中的displaytag.properties汉化后替换jar包中原来的文件
2、 <display:column property="email" /> //property指定了列表中包含的bean(actionForm或vo)中包含的属性的名称,大小写必须一致
<display:column title="email">[email protected]</display:column> //列表中指定任意的列,不包含在bean中,比如显示按钮、图片等
3、 先来给出第一个具体的例子(实现列包装:显示一列checkbox,点击标题栏的checkbox完成全选):
<display:column style="width:5%;text-align:center"
headerClass="dataHead" property="columnId"
title="<input type='checkbox' name='checkall' value='all' onclick='checkAll();' />" decorator="ainx.asiainfo.common.displaytag.CheckboxColumnWrapper" />
从该例可以看出:
1)、title属性定义了一个checkbox,点击后执行javascript函数checkAll()完成对checkbox的全选,该checkbox显示在该列的标题栏中
2)、headerClass属性指定了标题栏的css样式,dataHead是已经在css文件中定义了的
3)、property属性指定该列将要显示bean中的哪个变量的内容,大小写必须与bean中的定义一致
4)、各行都用了一个decorator将数据进行了包装,由ainx.asiainfo.common.displaytag.CheckboxColumnWrapper类实现了对该列数据的包装,该类具体内容如下:
package ainx.asiainfo.common.displaytag;
import javax.servlet.jsp.PageContext;
import org.displaytag.decorator.DisplaytagColumnDecorator;
import org.displaytag.exception.DecoratorException;
import org.displaytag.properties.MediaTypeEnum;
/**
* 用于丰富displaytag列显示的功能,在表格中显示一列checkbox
* @author lvping
*/
public class CheckboxColumnWrapper implements DisplaytagColumnDecorator {
/**
* 该列全部显示为checkbox,其value为该列带有的ID
*/
public Object decorate(Object arg0, PageContext arg1, MediaTypeEnum arg2) throws DecoratorException {
//arg0表示被包装的该列定义的property属性给定的值
//arg1表示pagecontext
//arg2表示……
String elementid = (String) arg0;
return "<input name=/"selected/" type=/"checkbox/" value=/""+elementid+"/" />";
//同理如果对于该列要显示为一个图片,可以返回”<input type=’image’ src=’…’ />”
}
}
4、 再给出第二个例子(前台分页+排序+分组功能):
<display:table class="data" cellpadding="0" sort="list" requestURI="/NetXpert/room/idcRoomAreaAction.do?actionType=doListIdcArea" pagesize="20" cellspacing="0" style="width:98%" name="areas">
<display:column property="roomname" sortable="true"
="1" title="所在机房"/></display:table>
从该例看出:
1)、table中的name属性指定了该表格的数据来自request的attribute中名称为"areas"的数据(即action中必须有如下的代码:
ArrayList alAreas = ……; //此处获取将要在列表中显示的数据
request.setAttribute("areas",alAreas);)
1)、table中的pagesize设定了表格中每页显示的记录个数
2)、table中的requestURI属性定义了每次分页时需要提交的请求
3)、table中的sort属性设为list,表示点击表中某列排序时可对整个表格排序
(Use 'page' if you want to sort only visible records, or 'list' if you want to sort the full list, or 'external' if the data is sorted outside displaytag)
4)、sortable属性设为true,则表示对该列支持排序(前台排序),显示出的该列的标题上会自动带有下划线,点击可排序
5)、
属性的设置表示对该列的数据自动分组,设为1表示该列数据为显示出的第一个分组1、 再给第三个例子(后台数据库分页)
<display:table class="data" cellpadding="0"
requestURI="/NetXpert/room/idcRoomShelfAction.do?actionType=doListIdcShelf" cellspacing="0" style="width:98%" name="shelfs" >
…… ……
</display:table>
从该例中可看出:
1)、table只设置了requestURI属性,没有设置pagesize属性,由requestURI指定的url来完成分页功能
2)、IdcRoomShelfAction.java中的相关函数的代码(红色部分的代码完成了分页):
public ActionForward doListIdcShelf(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
int page = 1; // 默认值:第1页
PaginatedListHelper paginaredList = new PaginatedListHelper();
// 获取页号
if (request.getParameter("page") != null
&& !"".equals(request.getParameter("page"))) {
page = Integer.parseInt(request.getParameter("page"));
}
paginaredList.setObjectsPerPage(20); // 默认每页显示15条记录,可以重新赋值
paginaredList.setPageNumber(page); // 设置页号
ArrayList voList = new IdcRoomShelfBo().selectShelf();
ArrayList formList = ((IdcRoomShelfForm) form)
.getFormListFromVOList(voList);
paginaredList.setFullListSize(formList.size()); // 记录总数
paginaredList.setList(formList); // 全部的数据集
paginaredList.getCurrentPageRecord(); // 获取当前页号需要的数据集
request.setAttribute("shelfs", paginaredList);
return mapping.findForward("shelfList");
}
3)、分页类的代码:(display1.1的发布已经能够支持后台数据库分页,但必须实现其提供的PaginatedList接口)
package com.asiainfo.idc.room.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//PaginatedList和SortOrderEnum为displaytag-1.1.1.jar提供的jar包中提供的类
import org.displaytag.pagination.PaginatedList;
import org.displaytag.properties.SortOrderEnum;
/**
* 针对displaytag标签扩展的后台分页功能
* @author lvping
*/
public class PaginatedListHelper implements PaginatedList {
private List list; // 数据集
private int pageNumber = 1;// 页号
private int objectsPerPage = 15;// 每页显示的记录数
private int fullListSize = 0;// 全部记录数
private String sortCriterion;
private SortOrderEnum sortDirection;
private String searchId;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getObjectsPerPage() {
return objectsPerPage;
}
public void setObjectsPerPage(int objectsPerPage) {
this.objectsPerPage = objectsPerPage;
}
public int getFullListSize() {
return fullListSize;
}
public void setFullListSize(int fullListSize) {
this.fullListSize = fullListSize;
}
public String getSortCriterion() {
return sortCriterion;
}
public void setSortCriterion(String sortCriterion) {
this.sortCriterion = sortCriterion;
}
public SortOrderEnum getSortDirection() {
return sortDirection;
}
public void setSortDirection(SortOrderEnum sortDirection) {
this.sortDirection = sortDirection;
}
public String getSearchId() {
return searchId;
}
public void setSearchId(String searchId) {
this.searchId = searchId;
}
/**
* 根据总的数据集和每页需要的首记录、尾记录索引,从总记录集中得到需要的记录集
* 这是一个取巧的分页方法,并非真正的根据每页请求拼sql进行查询,而是对于整个数据查询的结果从中取各页需要的数据集合,对于超大数据量的查询效率可能不会太高
*/
public void getCurrentPageRecord() {
ArrayList v = new ArrayList();
Iterator iterator = null;
try {
if (this.getList() != null) {
iterator = this.getList().iterator();
int i = 0;
int fromRow = 0;
int toRow = 0;
if (this.getPageNumber() == 1) { // 首页
fromRow = 1; // 从第一行开始
toRow = this.getObjectsPerPage();
} else {
fromRow = (this.getPageNumber() - 1)
* this.getObjectsPerPage() + 1;
toRow = fromRow + this.getObjectsPerPage();
}
if (toRow > this.getFullListSize()) // 如果尾行数超过list的大小
toRow = this.getFullListSize();
while (iterator.hasNext()) {
i++;
if (i < fromRow) {
iterator.next();
continue;
} else if (i > toRow) {
iterator.next();
continue;
} else {
v.add(iterator.next());
}
}
this.setList(v);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
1、 再来一个(列中的超链接):
<display:column style="width:10%;text-align:center"
headerClass="dataHead" property="shelfcode"
href="/NetXpert/room/idcRoomShelfAction.do?actionType=doEditIdcShelf&" paramId="shelfid" paramProperty="shelfid" title="机柜编码" />
从该例中看到:
1)、列的href属性定义了点击超链接后请求的url
2)、列的paramId属性定义了url后面带有的参数的名称
3)、列的paramProperty属性定义了url给出的参数值
4)、根据该列的定义,点击该列数据的超链接后,会跳转至如下的url:
/NetXpert/room/idcRoomShelfAction.do?actionType=doEditIdcShelf&shelfid=XXX (XXX为property属性指定的bean中的shelfcode的值)