关闭

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

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



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:289331次
    • 积分:3730
    • 等级:
    • 排名:第8619名
    • 原创:60篇
    • 转载:5篇
    • 译文:8篇
    • 评论:164条
    文章分类
    最新评论