這篇文章主要介紹“如何使用JSP實現簡易的SQL報表”,在日常操作中,相信很多人在如何使用JSP實現簡易的SQL報表問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用JSP實現簡易的SQL報表”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
這個內容也是根據企業學員的要求準備的. 其實這個小項目是剛畢業時候做的, 很多時候我們希望執行下面的SQL/HQL然后得到一個HTML表格輸出
輸入: select ID as 編號, NAME as 姓名, AGE as 年齡 from XXX
輸出:
編號 | 姓名 | 年齡 |
要求是如果SQL變動, 仍然要顯示出來所有的別名字段信息和數據.
因為現在Hibernate用的比較廣泛, 所以優先考慮用Hibernate來實現, 結果發現如果是實體映射查詢語句, 可以方便的用:List
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 = session.createQuery(hql); for(int i =0; i < args.length; i++) { query.setParameter(i, args[i]); } List list = query.list(); list.add(0, query.getReturnAliases()); return list; } }); // Hibernate做count計算返回一般都是對象 return list; } |
測試代碼:
Listlist = dao.queryAllForReport("select id as 編號, name as 登錄名, address as 地址, realName from User"); System.out.println(list.size()); for(Object[] row : list) { for(Object v : row) { System.out.print(v + "\t"); } System.out.println(); } |
***不得不回到JDBC, 用 ResultSet和ResultSetMetaData實現了這個功能, 詳細代碼(自己進行修改即可實現)如下:
﹤%@ page language="java" import="java.util.*, java.sql.*" pageEncoding="UTF-8"%﹥
﹤%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %﹥
﹤!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"﹥
﹤html﹥
﹤head﹥
﹤title﹥SQL報表﹤/title﹥
﹤meta http-equiv="pragma" content="no-cache"﹥
﹤meta http-equiv="cache-control" content="no-cache"﹥
﹤meta http-equiv="expires" content="0"﹥
﹤/head﹥
﹤body﹥
﹤form action=""﹥
﹤textarea name=sql cols=80 rows=10﹥${param.sql}﹤/textarea﹥﹤br﹥
﹤input type=submit value=查詢﹥
﹤/form﹥
﹤c:if test="${!empty param.sql}"﹥
﹤%
//new oracle.jdbc.driver.OracleDriver();
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.41:1521:xe", "hr", "hr");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(request.getParameter("sql"));
if(rs == null) {
stmt.close();
conn.close();
return;
}
// 取列名
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
ArrayList colNames = new ArrayList();
for(int i = 1; i ﹤= cols; i++) {
colNames.add(meta.getColumnLabel(i));
}
request.setAttribute("colNames", colNames);
%﹥
﹤table border="1" cellpadding="0" width="100%" bordercolor="#000000" align=center ﹥
﹤tr﹥
﹤c:forEach items="${colNames}" var="c"﹥
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥
﹤%
while(rs.next()) {
colNames.clear();
for(int i = 1; i ﹤= cols; i++) {
Object value = rs.getObject(i);
System.out.println(value.getClass());
// TODO 更多格式化控制
if(value instanceof java.sql.Date) {
value = rs.getTimestamp(i);// 取出精確日期
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy年MM月dd日HH點mm分ss秒EEE");
value = df.format(value);
}
if(value instanceof java.math.BigDecimal) {
java.math.BigDecimal v = (java.math.BigDecimal)value;
value = v.doubleValue();
// 要求輸出時候最少顯示兩位小數, 最多輸出小數點后3個數
java.text.NumberFormat format = java.text.NumberFormat.getInstance();// 只對小數格式化
format.setMaximumFractionDigits(2);// 最多3位小數
format.setMinimumFractionDigits(1);// 最少2位小數
value = format.format(value);// ==﹥ String
}
colNames.add(value);
}
request.setAttribute("colNames", colNames);
%﹥
﹤tr﹥
﹤c:forEach items="${colNames}" var="c"﹥
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥
﹤%
}
rs.close();
stmt.close();
conn.close();
%﹥
﹤/table﹥
﹤/c:if﹥
﹤/body﹥
﹤/html﹥
用到了JSTL和EL, 總的來說要改版還是很方便的. 但是運行需要比較高的Tomcat版本, 如5.5以上, 并需要JSTL類庫. 不過, 類似的模版項目開源框架應該是很多很多的, 例如眾多的Report框架.
到此,關于“如何使用JSP實現簡易的SQL報表”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。