前文《JSP表格模板升级(1)--用Java反射动态指定方法和参数》已经实现了动态指定具体的业务方法,达到了一定的复用性,但现实使用中,一个仅有两列的列表是无法满足大多数显示要求的,于是本文对表格模板进行了改造,实现了一种列数可变的动态表格模板。
首先是数据结构的变化。由于表格从两列的Key-Value的形式变为可变列,所以数据结构应变为一对多的关系。为简单起见,笔者定义了一个Key-ValueList形式的类,代表一行的数据,其中“key”是一行的一个描述,笔者这里将其对应为表格中第一列的值。ValueList是一个列表,可以存储任意长度的字符串值:
package com.reports.charts.bean;
import java.util.List;
public classKeyValueListBean {
private String Key;
private List<String> Value;
public KeyValueListBean() {
}
public KeyValueListBean(String key,List<String>value) {
Key = key;
Value = value;
}
public String getKey() {
return Key;
}
public void setKey(String key) {
Key = key;
}
public List<String>getValue() {
return Value;
}
public void setValue(List<String> value) {
Value = value;
}
}
整个表格的所有数据最终组装成一个KeyValueListBean的List,List的第一个元素一般存储该表格的列头,将这个List放入request之后,在jsp代码中进行遍历:
<table id="tb_vColumn" style="border-color: #fff">
<tr bgcolor="#4F81BD"style="color: #fff;">
<!--遍历List的第一个元素,填充到表格的列头行-->
<th style="text-align: center">${list[0].key}</th>
<c:forEach items="${list[0].value}" var="ch">
<th style="text-align: center">${ch}</th>
</c:forEach>
</tr>
<!--从第二个元素开始遍历List,填充表格数据-->
<c:forEach items="${list}" var="row"varStatus="status" begin="1">
<tr bgcolor="${status.index%2 == 0?'#D0D8E8':'#E9EDF4'}">
<td align="center">${row.key}</td>
<c:forEach items="${row.value}" var="col">
<td align="center">${col}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
由于考虑到了方法的复用性,笔者这里使用的数据结构并不是贴切的。抛开别的因素,但就一个jsp表格模板来说,我们完全可以使用一个List<String>类型的List,或者干脆使用一个二维的字符串数组来传递数据,相应的代码大同小异,笔者就不赘述了,最终的表格效果类似下图所示:
jsp部分完整的示例代码如下:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
<%@ page import="com.reports.util.ReportFunctions"%>
<%@ page import="com.reports.util.SpringContextHolder"%>
<%@ page import="com.reports.charts.bean.KeyValueListBean"%>
<%@ page import="java.lang.reflect.Method"%>
<%@ page import="java.util.*"%>
<%
Stringzoneid = request.getParameter("zoneid");
if(zoneid==null) {
zoneid="000000";
}
String dateFrom = request.getParameter("dateFrom");
StringdateTo = request.getParameter("dateTo");
//此参数为前端传过来的一个以逗号间隔的字符串
String categories = request.getParameter("categories");
String deptProperty = request.getParameter("deptProperty");
String deptCode = request.getParameter("deptCode");
String deptNum = request.getParameter("deptNum");
String methodname = request.getParameter("method");
ReportFunctionsreportF = SpringContextHolder.getBean(ReportFunctions.class);
Methodmethod = null;
List<KeyValueListBean>list = null;
if(methodname.equals("deptCategoryByZoneid") ||
methodname.equals("elevMonitorByZoneid")||
methodname.equals("elevTestStatusByzoneid")) {
method= reportF.getClass().getMethod(methodname,String.class);
list= (List<KeyValueListBean>)method.invoke(reportF,zoneid);
}else if(methodname.equals("maintenanceTimelyCategory") ||
methodname.equals("maintenanceTimeQualify")) {
method= reportF.getClass().getMethod(methodname,String.class,String.class,String.class);
list= (List<KeyValueListBean>)method.invoke(reportF,zoneid,dateFrom,dateTo);
}else if(methodname.equals("elevAlarmRateByDept")){
List<String>lc = newArrayList<String>();
String[]ac = categories.split(",");
for(int i=0; i<ac.length;i++) {
lc.add(ac[i]);
}
method= reportF.getClass().getMethod(methodname,String.class,String.class,String.class,String.class,String.class,List.class);
list= (List<KeyValueListBean>)method.invoke(reportF,deptProperty,zoneid,dateFrom,dateTo,deptNum,lc);
}else {
List<String>lc = newArrayList<String>();
String[]ac = categories.split(",");
for(int i=0; i<ac.length;i++) {
lc.add(ac[i]);
}
method= reportF.getClass().getMethod(methodname,String.class,String.class,String.class,String.class,String.class,List.class);
list= (List<KeyValueListBean>)method.invoke(reportF,zoneid,dateFrom,dateTo,deptProperty,deptCode,lc);
}
/*自测数据
List<KeyValueListBean>list = new ArrayList<KeyValueListBean>();
List<String>tl = new ArrayList<String>();
tl.add("elemenet");
tl.add("atest");
tl.add("haha");
KeyValueListBeantemp = new KeyValueListBean("test", tl);
list.add(temp);
list.add(temp);
*/
request.setAttribute("list", list);
%>
<table id="tb_departCate"style="border-color: #fff">
<tr bgcolor="#4F81BD"style="color: #fff;">
<th style="text-align: center">${list[0].key}</th>
<c:forEach items="${list[0].value}" var="ch">
<th style="text-align: center">${ch}</th>
</c:forEach>
</tr>
<c:forEach items="${list}" var="row"varStatus="status" begin="1">
<tr bgcolor="${status.index%2 == 0?'#D0D8E8':'#E9EDF4'}">
<td align="center">${row.key}</td>
<c:forEach items="${row.value}" var="col">
<td align="center">${col}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
至此,我们的jsp表格模板已经接近完善,可以应对大部分的需求了,当然这个表格只是最基本的二维表格,而且样式也非常简单。对于复杂的表格,如果复用性比较高需要整理成模板,则按照本系列文章的思路来做是不成问题的,只不过数据结构和样式可能都会复杂一些。样式问题更简单,只要有了美工的设计,慢慢调呗~