JSP表格模板升级(3)-- 可变列数的表格模板

17 篇文章 0 订阅
16 篇文章 0 订阅

        前文《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表格模板已经接近完善,可以应对大部分的需求了,当然这个表格只是最基本的二维表格,而且样式也非常简单。对于复杂的表格,如果复用性比较高需要整理成模板,则按照本系列文章的思路来做是不成问题的,只不过数据结构和样式可能都会复杂一些。样式问题更简单,只要有了美工的设计,慢慢调呗~



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值