項目中要用到一些展示信息的表格,表頭不固定,表格內容是即時從後台取的;考慮到復用性,筆者用jsp編寫了一個表格模板,可以從 request中獲取List封裝的數據,然後通過JSTL結合EL表達式填充到模板。最後完成的jsp文件可以作為一個單獨的模塊,嵌入到任意其它jsp頁 面需要的位置。 首先是規劃一下表格的樣式: 為簡單起見,此處使用html的table等標簽構建了一個簡單的表格,表格背景隔行變色,整體顏色為藍色系。表格定義部分的核心代碼 如下: [html] <table style="width:100%;border:1px white solid"> <tr bgcolor="#4F81BD"style="color: #fff;"> <th style="text-align: center"><%=columns[0]%></th> <th style="text-align: center"><%=columns[1]%></th> </tr> <c:forEach items="${list}" var="row"varStatus="status"> <tr bgcolor="${status.index%2 == 0?'#D0D8E8':'#E9EDF4'}"> <td align="center">${status.current.key}</td> <td align="center">${row.value}</td> </tr> </c:forEach> </table> 此表格只有兩列,可用於顯示包含一組“鍵值對”的數據。代碼中的columns是jsp頁面中定義的一個java字符串數組,保存兩列 列頭的值,例如:“設備類型”、“數量”。數據行使用JSTL的forEach標簽來遍歷各條數據,其中list變量是存放在request中的List類型的 對象,List中存放了一組包含“鍵值對”的數據實體,筆者所用的數據實體是一個簡單的Bean: [java] package com.reports.charts.bean; public classKeyValueBean { private String key; private String value; public KeyValueBean() { } public KeyValueBean(String key, String value) { this.key = key; this.value = value; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value){ this.value = value; } } 模板中的取值方法用到了EL表達式,例如${list}表示取出request中的list對象。${status.current}和${row}其實指代的是同 一個東西,也就是當前遍歷的數據行,這裡使用兩種不同的寫法是為了給讀者提供更多實現方式的參考。關於EL表達式的詳細信息,可參考筆 者轉發的文章《JSP中的EL表達式詳細介紹》。 接下來的關鍵就是傳遞list的值放到request中了。一般J2EE項目中都使用了Struts、SpringMVC等mvc框架,常見的處理流程應該是客 戶端發送數據請求,Controller接收請求進行處理,取出並生成合適的數據存放到一個List中,然後轉發給View,也就是轉發給JSP頁面來顯示 。 然而基於其它的考慮,筆者希望這個jsp頁面可以不經過Controller而獨立運行,於是就需要將控制層移到jsp代碼中;完整的jsp模板 定義代碼如下: 其中,SpringContextHolder是筆者定義的一個獲取Spring管理的其它Bean的工具類,用這個類可以方便地在同一個項目所有運行Java 代碼的地方使用,詳見筆者的:《在JavaWeb應用中獲取Spring管理的Bean的方法》。ReportFunctions類是一個業務類,包含了許多具體業務 的代碼,除了本文的jsp模板中可以使用之外,在項目的其它許多控制類都會用到。或者換句話說,筆者此處是借用了項目中現有的一個業務類 ,抽象出了一個模板。我們將模板保存一下,例如保存為“_tb2ColParam.jsp”,然後帶著參數訪問或獲取這個jsp即可呈現出一個帶樣式的表 格:“_tb2ColParam.jsp?p=1024&columns=types|nums”。 [plain] <%@ 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="java.util.*"%> <%@ page import="com.reports.charts.bean.KeyValueBean"%> <% String[]columns = null; try{ columns= request.getParameter("columns").split("\\|"); }catch(NullPointerExceptione){ e.printStackTrace(); System.out.println("參數columns未賦值"); } if(null == columns){ columns= newString[]{"設備種類","數量"}; } Stringparam = request.getParameter("p"); ReportFunctionsreportF = SpringContextHolder.getBean(ReportFunctions.class); List<KeyValueBean>list = null; if(null != param){ list= report.method(param); }else{ System.out.println(“參數獲取失敗”); } if(0 == list.size()){ list.add(new KeyValueBean("暫未統計", "暫無數據")); } request.setAttribute("list", list); %> <table style="width:100%;border:1px white solid"> <tr bgcolor="#4F81BD"style="color: #fff;"> <th style="text-align: center"><%=columns[0]%></th> <th style="text-align: center"><%=columns[1]%></th> </tr> <c:forEach items="${list}" var="row"varStatus="status"> <tr bgcolor="${status.index%2 == 0?'#D0D8E8':'#E9EDF4'}"> <td align="center">${status.current.key}</td> <td align="center">${row.value}</td> </tr> </c:forEach> </table>