熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

使用JSP實現簡易的SQL報表

2013-11-15 12:20:07  來源: JSP教程 

  這個內容也是根據企業學員的要求准備的 其實這個小項目是剛畢業時候做的 很多時候我們希望執行下面的SQL/HQL然後得到一個HTML表格輸出:

  輸入: select ID as 編號 NAME as 姓名 AGE as 年齡 from XXX

  輸出:

編號 姓名 年齡      
  要求是如果SQL變動 仍然要顯示出來所有的別名字段信息和數據

  因為現在Hibernate用的比較廣泛 所以優先考慮用Hibernate來實現 結果發現如果是實體映射查詢語句 可以方便的用:List QuerygetReturnAliases() 獲得別名 然而我們知道查詢時有時候語句是很復雜的 不全是HQL 這時候用SQLQuery的時候 驚訝的提示這個方法尚未實現(最新版的Hibernate 是否實現尚未測試) 用的版本是Hibernate 對應的代碼是:

  DAO

/**
 * 根據查詢語句返回結果 並包含結果的列名
 * @param hql
 * @param args
 * @return
 */
public List queryAllForReport( final String hql final Object args) {
    List list = getHibernateTemplate()executeFind(new HibernateCallback() {
         public Object doInHibernate(Session session)
         throws HibernateException SQLException {
         Query query = sessioncreateQuery(hql);
        
         for(int i =; i < argslength; i++) {
             querysetParameter(i args[i]);
         }
        

         List list = querylist();
         listadd( querygetReturnAliases());
        
         return list;
         }
        });
   
    // Hibernate做count計算返回一般都是對象
   
    return list;       
}

  測試代碼:

List list = daoqueryAllForReport(select id as 編號
name as 登錄名 address as 地址 realName from User);

  Systemoutprintln(listsize());

for(Object[] row : list) {
    for(Object v : row) {
        Systemoutprint(v + \t);
       
    }
   
    Systemoutprintln();
}

  最後不得不回到JDBC 用 ResultSet和ResultSetMetaData實現了這個功能 詳細代碼(自己進行修改即可實現)如下:

﹤%@ page language=java import=javautil* javasql* pageEncoding=UTF%﹥
﹤%@ taglib prefix=c uri=http://javasuncom/jsp/jstl/core %﹥

﹤!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN
﹤html﹥
﹤head﹥

﹤title﹥SQL報表﹤/title﹥

﹤meta httpequiv=pragma content=nocache
﹤meta httpequiv=cachecontrol content=nocache
﹤meta httpequiv=expires content=﹥   


﹤/head﹥

﹤body﹥
﹤form action=
﹤textarea name=sql cols= rows=﹥${paramsql}﹤/textarea﹥﹤br﹥
﹤input type=submit value=查詢﹥
﹤/form﹥

﹤c:if test=${!empty paramsql}

   ﹤%
//new oraclejdbcdriverOracleDriver();
Connection conn = DriverManagergetConnection(jdbc:oracle:thin:@::xe hr hr);
Statement stmt = conncreateStatement();
ResultSet rs = stmtexecuteQuery(requestgetParameter(sql));

if(rs == null) {
stmtclose();
connclose();
return;
}

// 取列名
ResultSetMetaData meta = rsgetMetaData();
int cols = metagetColumnCount();
ArrayList colNames = new ArrayList();

for(int i = ; i ﹤= cols; i++) {
colNamesadd(metagetColumnLabel(i));
}

requestsetAttribute(colNames colNames);
%﹥
﹤table border=  cellpadding= style=bordercollapse: collapse;   width=% bordercolor=# align=center ﹥

﹤tr﹥
﹤c:forEach items=${colNames} var=c
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥

﹤%
while(rsnext()) {
colNamesclear();

for(int i = ; i ﹤= cols; i++) {
Object value = rsgetObject(i);
Systemoutprintln(valuegetClass());

// TODO 更多格式化控制
if(value instanceof javasqlDate) {
value = rsgetTimestamp(i);// 取出精確日期
javatextSimpleDateFormat df = new javatextSimpleDateFormat(yyyy年MM月dd日HH點mm分ss秒EEE);
value = dfformat(value);
}

if(value instanceof javamathBigDecimal) {
javamathBigDecimal v = (javamathBigDecimal)value;
value = vdoubleValue();
// 要求輸出時候最少顯示兩位小數 最多輸出小數點後個數
javatextNumberFormat format = javatextNumberFormatgetInstance();// 只對小數格式化
formatsetMaximumFractionDigits();// 最多位小數
formatsetMinimumFractionDigits();// 最少位小數
value = formatformat(value);// ==﹥ String
}

colNamesadd(value);
}

requestsetAttribute(colNames colNames);

%﹥
﹤tr﹥
﹤c:forEach items=${colNames} var=c
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥
﹤%

}

rsclose();
stmtclose();
connclose();
%﹥
﹤/table﹥
﹤/c:if﹥
﹤/body﹥
﹤/html﹥

  用到了JSTL和EL 總的來說要改版還是很方便的 但是運行需要比較高的Tomcat版本以上 並需要JSTL類庫 不過 類似的模版項目開源框架應該是很多很多的 例如眾多的Report框架


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20746.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.