<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    牛仔褲的夏天

    JAVA是藍(lán)色的- online

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      30 隨筆 :: 5 文章 :: 15 評(píng)論 :: 0 Trackbacks

    單位里的查詢(xún)系統(tǒng)是基于struts的,在結(jié)果集顯示的處理上都是用 <logic:iterate id=".." indexId="id" name=".." scope="request"> 然后在<bean:write name=".." property=".."> 這樣子對(duì)付的,后來(lái)覺(jué)得比較麻煩,就寫(xiě)了一個(gè)顯示結(jié)果集的標(biāo)簽

    • 行記錄用HashMap保存
    • 結(jié)果集用Vector封裝
    • 表格的標(biāo)題等屬性用xml配置
    • dom4j解析xml文件
    • 輸出時(shí)根據(jù)配置合并多行內(nèi)的相同屬性列
    • 求和

    表格配置文件table-config.xml保存在/WEB-INF下



    用于表格配置的Table.java

    package tax.tags;

    import java.util.Vector;

    public class Table {
     
    private String name;
     
    private String width;
     
    private String title;
     
    private String groupby;
     
    private Vector<Column> columns;
     
    public Table(){
     }

     
    public Table(String name){
      
    this.name=name;
     }

     
    public Vector<Column> getColumns() {
      
    return columns;
     }

     
    public void setColumns(Vector<Column> columns) {
      
    this.columns = columns;
     }

     
    public String getName() {
      
    return name;
     }

     
    public void setName(String name) {
      
    this.name = name;
     }

     
    public String getTitle() {
      
    return title;
     }

     
    public void setTitle(String title) {
      
    this.title = title;
     }

     
    public String getWidth() {
      
    return width;
     }

     
    public void setWidth(String width) {
      
    this.width = width;
     }

     
     
    public String getGroupby() {
      
    return groupby;
     }

     
    public void setGroupby(String groupby) {
      
    this.groupby = groupby;
     }

     
    public String toString(){
      StringBuffer buf
    =new StringBuffer();
      buf.append(
    "Name:").append(name).append("\n");
      buf.append(
    "Width:").append(width).append("\n");
      buf.append(
    "Title:").append(title).append("\n");
      buf.append(
    "Groupby:").append(groupby).append("\n");
      
    for(int i=0;i<columns.size();i++){
       Column column
    =columns.elementAt(i);
       buf.append(
    "column name:").append(column.getName()).append("\n");
       buf.append(
    "       header:").append(column.getHeader()).append("\n");
       buf.append(
    "       width:").append(column.getWidth()).append("\n");
       buf.append(
    "       sum:").append(column.isSum()).append("\n");
       buf.append(
    "       bind:").append(column.isBind()).append("\n");
      }

      
    return buf.toString();
     }

    }




    class Column{
     
    private String name;
     
    private String width;
     
    private String header;
     
    private String map;
     
    private boolean sum;
     
    private boolean bind;

     
    public Column(){
      sum
    =false;
      bind
    =false;
     }

     
    public boolean isBind() {
      
    return bind;
     }

     
    public void setBind(boolean bind) {
      
    this.bind = bind;
     }

     
    public String getHeader() {
      
    return header;
     }

     
    public void setHeader(String header) {
      
    this.header = header;
     }

     
    public String getName() {
      
    return name;
     }

     
    public void setName(String name) {
      
    this.name = name;
     }

     
    public boolean isSum() {
      
    return sum;
     }

     
    public void setSum(boolean sum) {
      
    this.sum = sum;
     }

     
    public String getWidth() {
      
    return width;
     }

     
    public void setWidth(String width) {
      
    this.width = width;
     }

     
    public String getMap() {
      
    return map;
     }

     
    public void setMap(String map) {
      
    this.map = map;
     }

    }


     

    用dom4j解析table-config.xml的Dom4jTable.java,因?yàn)橛玫搅藊path,所以把jaxen-1.1-beta-6.jar也要拷貝到/web-inf/lib里面去

    package tax.tags;

    import java.util.List;
    import java.util.Vector;

    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.SAXReader;

    public class Dom4jTable {
     String tableName;

     
    public Dom4jTable() { }

     
    public Dom4jTable(String tableName) {
      
    this.tableName = tableName;
     }


     
    public Document parse(String xmlpath) throws DocumentException {
      SAXReader reader 
    = new SAXReader();
      Document doc 
    = null;
      doc 
    = reader.read(xmlpath);
      
    return doc;
     }


     
    public Table getTable(Document doc) {
      Table table;
      String xpath 
    = "//table[@name='" + tableName + "']";
      Node node 
    = doc.selectSingleNode(xpath);
      
    if (node == null{
       table 
    = null;
      }
     else {
       table 
    = new Table(tableName);
       table.setWidth(getValue(node,
    "@width"));
       table.setTitle(getValue(node,
    "title"));
       table.setGroupby(getValue(node,
    "groupby"));
       Vector
    <Column> columns = new Vector<Column>();
       Node nodeColumns 
    = node.selectSingleNode("columns");
       List list 
    = ((Element) nodeColumns).elements();
       
    for (int i = 0; i < list.size(); i++{
        Column column 
    = new Column();
        Element element 
    = (Element) list.get(i);
        column.setName(getValue(element,
    "name"));
        column.setHeader(getValue(element,
    "header"));
        column.setWidth(getValue(element,
    "width"));
        column.setMap(getValue(element,
    "map"));
        column.setBind(Boolean.parseBoolean(getValue(element,
    "bind")));
        column.setSum(Boolean.parseBoolean(getValue(element,
    "sum")));
        columns.add(column);
       }

       table.setColumns(columns);
      }

      
    return table;
     }

     
    private String getValue(Node node,String name){
      String value
    =node.valueOf(name);
      
    if(value.equals("")){
       value
    =null;
      }

      
    return value;
     }

    }



    自定義標(biāo)簽ShowTableTag.java,寫(xiě)的有點(diǎn)亂,還好能用,本來(lái)用sax解析xml的,后來(lái)改為dom4j的

    package tax.tags;

    import java.math.BigDecimal;
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.TreeMap;
    import java.util.Vector;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.TagSupport;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLReaderFactory;

    public class ShowTableTag extends TagSupport {
     
    private static final long serialVersionUID = 1L;

     
    private Log log = LogFactory.getLog(this.getClass());

     
    private String vectorName;

     
    private String tableName;

     
    private boolean displaySN = false;

     
    private Vector<HashMap> data = null;

     
    public int doStartTag() throws JspException {
      
    return TagSupport.SKIP_BODY;
     }


     
    public int doEndTag() throws JspException {
      String newline 
    = "\n";
      
    boolean getsum=false;
      JspWriter out 
    = pageContext.getOut();
      StringBuffer buf 
    = new StringBuffer();
      
    if (data == null || data.size() == 0{
       buf.append(
    "There is no result available.");
      }
     else {
    //   取表格的各項(xiàng)屬性設(shè)置
       Table table = getTableConfigByDom4j();
    //   取表格的各列,然后存入cols數(shù)組
       Vector columns = table.getColumns();
       Column[] cols
    =new Column[columns.size()];
       BigDecimal[] sum
    =new BigDecimal[columns.size()];
       
    for(int i=0;i<columns.size();i++){
        cols[i]
    =(Column)columns.elementAt(i);
        
    if(cols[i].isSum()) getsum=true;
        sum[i]
    =new BigDecimal(0);
       }

       
    /////////////////////////////////////////////////////////////////////////////////////////
    //   如果table沒(méi)有設(shè)置title, 就不打印這部分
       if(table.getTitle()!=null){
        buf.append(
    "<DIV id=tag_head><div class=label>").append(newline);
        buf.append(table.getTitle()).append(
    "</div></div><div id=tag_body>");
        buf.append(newline);
       }

       
       buf.append(
    "<div class=content>").append(newline);
       buf.append(
    "<table border=1 cellPadding=0 cellSpacing=0 ");
       buf.append(
    "borderColorLight=#000000 borderColorDark=#f8f7f5 width=\"");
       buf.append(table.getWidth()).append("\">").append(newline);
       buf.append("<tr class=tablehead>").append(newline);
       
    //   如果標(biāo)簽中的displaySN為true, 則打印序號(hào)列
       if (displaySN) {
        buf.append(
    "<th>序號(hào)</th>").append(newline);
       }


    //   打印table的th欄
       for (int i = 0; i < cols.length; i++{
        buf.append(
    "<th");
        
    if (cols[i].getWidth() != null){
         buf.append(
    " width=").append(cols[i].getWidth());
        }

        buf.append(
    ">").append(cols[i].getHeader()).append("</th>");
        buf.append(newline);
       }

       buf.append(
    "</tr>").append(newline);


    //   由table的groupby屬性產(chǎn)生key_group<Integer,Integer>
    //   第一個(gè)Integer是行號(hào),從1開(kāi)始
    //   第二個(gè)Integer是跨度span,即連續(xù)相同的key的數(shù)量
       Hashtable key_group = getKeyGroup(table.getGroupby());
       
       
    int rowid = 0//行號(hào)
       int distid = 0//捆綁相同key行后的行號(hào)
       Iterator<HashMap> it = data.iterator();
       
    while (it.hasNext()) {
        buf.append(
    "<tr class=tablepad>").append(newline);
        
        rowid
    ++;
        
    //    根據(jù)行號(hào)從key_group中取得pan值, span可能為null  
        Integer span=(key_group==null?null:(Integer)key_group.get(new Integer(rowid)));

    //     顯示序號(hào)
        if (displaySN) {
         
    if(key_group==null){
          
    //key_group為null表示table中不用合并相同的行
          buf.append("<td>").append(rowid).append("</td>");
         }
    else if(span!=null){
          buf.append(
    "<td rowspan=").append(span).append(">");
          buf.append(
    ++distid).append("</td>").append(newline);
         }

        }

    //    取得這一行的記錄
        HashMap row = (HashMap)it.next();
        
    for (int i = 0; i < cols.length; i++{
    //     取得td中應(yīng)該顯示的內(nèi)容
         String td = (String) row.get(cols[i].getName());
         
    if(cols[i].isSum()){
          sum[i]
    =sum[i].add(new BigDecimal(td));
         }

         
    if(cols[i].getMap()!=null){
          TreeMap map 
    = (TreeMap) pageContext.getServletContext()
            .getAttribute(cols[i].getMap());
          td
    =(String)map.get(td);
         }

         
    if (td == null) td = "&nbsp;";
    //     區(qū)別這個(gè)列的bind屬性確定是否要合并顯示
         if(!cols[i].isBind()||key_group==null){
          buf.append(
    "<td>");
          buf.append(td).append(
    "</td>").append(newline);
         }
    else if(span!=null){
          buf.append(
    "<td rowspan=").append(span).append(">");
          buf.append(td).append(
    "</td>").append(newline);
         }

        }

        buf.append(
    "</tr>").append(newline);
       }

       
    //如果需要打印合計(jì)數(shù),增加一行
       if(getsum){
        buf.append(
    "<tr class=tablepad>");
        
    if(displaySN){
         buf.append(
    "<td>&nbsp</td>");
        }

        
    for(int i=0;i<cols.length;i++){
         
    if(cols[i].isSum()){
          buf.append(
    "<td>").append(sum[i]).append("</td>").append(newline);
         }
    else{
          buf.append(
    "<td>&nbsp</td>").append(newline);
         }

        }

        buf.append(
    "</tr>").append(newline);
       }

       buf.append(
    "</table>").append(newline);
       buf.append(
    "</div></div>");
      }

      
    try {
       out.println(buf.toString());
      }
     catch (Exception e) {
       log.error(
    "e");
       
    return TagSupport.SKIP_PAGE;
      }

      
    return TagSupport.EVAL_PAGE;
     }



     
    private Hashtable getKeyGroup(String key) {
      
    if(key==nullreturn null;
    //  返回Hashtable, 鍵-從1開(kāi)始的行號(hào). 值-從這行開(kāi)始連續(xù)的rowspan值.
      Hashtable<Integer, Integer> ht = new Hashtable<Integer, Integer>();
      Iterator it 
    = data.iterator();
      
    int count = 0;
      
    int start = 0;
      
    int current = 0;
      String value 
    = "", prevalue = "";

      
    while (it.hasNext()) {
       current
    ++;
       HashMap row 
    = (HashMap) it.next();
       value 
    = (String) row.get(key);
       
    if (value.equals(prevalue))
        count
    ++;
       
    else {
        ht.put(
    new Integer(start),new Integer(count));
        prevalue 
    = value;
        count 
    = 1;
        start
    =current;
       }

      }

      ht.put(
    new Integer(start),new Integer(count));
      ht.remove(
    new Integer(0));
      
    return ht;
     }


     
    private Table getTableConfigBySax() {
      Table table 
    = null;
      SaxTable sax 
    = new SaxTable();
      sax.setTableName(tableName);
      String xmlfile 
    = pageContext.getServletContext().getRealPath(
        
    "WEB-INF/table-config.xml");
      
    try {
       XMLReader xdr 
    = XMLReaderFactory
         .createXMLReader(
    "org.apache.xerces.parsers.SAXParser");
       xdr.setContentHandler(sax);
       xdr.parse(xmlfile);
      }
     catch (Exception e) {
       log.error(e);
      }

      table 
    = sax.getTable();
      
    return table;
     }


     
    private Table getTableConfigByDom4j(){
      Dom4jTable dt 
    = new Dom4jTable(tableName);
      Document doc 
    = null;
      String xmlPath 
    = pageContext.getServletContext().getRealPath(
        
    "WEB-INF/table-config.xml");
      
    try {
       doc 
    = dt.parse(xmlPath);
      }
     catch (DocumentException e) {
       log.error(e);
       
    return null;
      }

      Table table 
    = dt.getTable(doc);
      
    return table;
     }

     
     
    public String getTableName() {
      
    return this.tableName;
     }


     
    public void setTableName(String tableName) {
      
    this.tableName = tableName;
     }


     
    public String getVectorName() {
      
    return this.vectorName;
     }


     
    public void setVectorName(String vectorName) {
      
    this.vectorName = vectorName;
      Object o 
    = pageContext.getRequest().getAttribute(vectorName);
      
    if (o != null{
       data 
    = (Vector<HashMap>) o;
      }
     else {
       data 
    = null;
      }

     }


     
    public void setDisplaySN(boolean sn) {
      displaySN 
    = sn;
     }


     
    public boolean isDisplaySN() {
      
    return displaySN;
     }

    }




    在標(biāo)簽庫(kù)app.tld中的這一段tag定義

     <tag>
      
    <name>showTable</name>
      
    <tagclass>tax.tags.ShowTableTag</tagclass>
      
    <bodycontent>empty</bodycontent>
      
    <info>
       extract the date from a vector and present date in table
      
    </info>
      
    <attribute>
       
    <name>vectorName</name>
       
    <required>true</required>
       
    <rtexprvalue>true</rtexprvalue>
      
    </attribute>
      
    <attribute>
       
    <name>tableName</name>
       
    <required>true</required>
       
    <rtexprvalue>true</rtexprvalue>
      
    </attribute>
      
    <attribute>
       
    <name>displaySN</name>
       
    <required>false</required>
       
    <rtexprvalue>true</rtexprvalue>
      
    </attribute>
     
    </tag>



    最后就可以在jsp文件中使用了,例如:

    <app:showTable tableName="jcgl_dzjk" vectorName="data" displaySN="true"/>



    還沒(méi)有在標(biāo)簽里做分頁(yè)的處理,以后在加工吧

    posted on 2006-03-10 13:12 luckyrobbie 閱讀(1159) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Struts & Hibernate

    評(píng)論

    # re: 顯示結(jié)果集的標(biāo)簽 2006-03-10 13:31 xfan
    用display這些標(biāo)簽不就可以了嗎,多個(gè)配置文件麻煩  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产AV无码专区亚洲AV手机麻豆| 国产一区二区三区亚洲综合| 69pao强力打造免费高清| 国产成人A人亚洲精品无码| 精品国产呦系列在线观看免费| 亚洲欧洲精品成人久久奇米网| 免费福利在线观看| 亚洲第一页日韩专区| 无人视频免费观看免费视频 | 亚洲国产婷婷综合在线精品| 国产91成人精品亚洲精品| 午夜国产大片免费观看| 国产精品亚洲专区一区| 亚洲精品美女久久久久99小说| 新最免费影视大全在线播放| 亚洲中文无韩国r级电影 | 日韩一区二区a片免费观看| 亚洲人成日本在线观看| 日韩精品成人无码专区免费 | 亚洲av中文无码乱人伦在线r▽| 女人隐私秘视频黄www免费| 亚洲AV日韩AV永久无码久久| 99精品在线免费观看| 亚洲婷婷综合色高清在线| 免费精品国偷自产在线在线| 亚洲中文无码永久免| 国产麻豆免费观看91| 香蕉视频免费在线| 国产成人亚洲影院在线观看| 久久精品国产免费一区| 在线免费观看亚洲| 无码少妇一区二区浪潮免费| 久久精品国产亚洲AV天海翼| 亚洲福利在线播放| a级毛片免费完整视频| 亚洲码在线中文在线观看| 成人免费a级毛片无码网站入口| 麻豆亚洲AV成人无码久久精品| 亚洲日韩在线中文字幕第一页 | 亚洲精品国产综合久久久久紧| 免费一级肉体全黄毛片|