网站建设
  简约型网页设计套餐998
  实惠型网站建设套餐2580
  综合型网站制作套餐4980
  网站改版与网站维护
  行业网站建设方案
  大型网站建设解决方案
  企业网站建设流程
  帝网科技网站设计与网站制作
建站FAQ
·网站空间问题解答
·企业邮箱问题解答
 
酷站欣赏
·房产酷站(379)
·综合门户(8 9)
·建筑装饰(603)
·手机通讯(354)
·生活购物(376)
·医疗保健(199)
·文化摄影(602)
·休闲体育(399)
>>更多酷站欣赏
网站优化
·Google(谷歌)优化   ·百度(BaiDu)优化
·雅虎(Yahoo)优化    ·Alexa排名优化   
·Google AdSense   ·DMOZ目录提交  
建站知识
·网站建设知识·网站名词解释·网站运营知识
·网络营销知识·搜索引擎知识·实用技术文摘
网站推广
百度网站推广 google网站推广
搜狐网站推广 网易网站推广
新浪网站推广   雅虎网站推广
  您当前位置: 当前位置:帝网科技 >> web开发 >> JSP专栏 >> 浏览文章
 
 
使用JSP实现简易的SQL报表
作者:佚名 来源:帝网科技 日期:2009年08月26日 点击数:


 这个内容也是根据企业学员的要求准备的. 其实这个小项目是刚毕业时候做的, 很多时候我们希望执行下面的SQL/HQL然后得到一个HTML表格输出:

  输入: select ID as 编号, NAME as 姓名, AGE as 年龄 from XXX

  输出:

  编号姓名年龄

  要求是如果SQL变动, 仍然要显示出来所有的别名字段信息和数据.

  因为现在Hibernate用的比较广泛, 所以优先考虑用Hibernate来实现, 结果发现如果是实体映射查询语句, 可以方便的用:List Query.getReturnAliases() 获得别名, 然而我们知道查询时有时候语句是很复杂的, 不全是HQL, 这时候用SQLQuery的时候, 惊讶的提示这个方法尚未实现(最新版的Hibernate 3.3 是否实现尚未测试), 用的版本是Hibernate 3.2, 对应的代码是:


 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;
  }

  测试代码:


List list = 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" style="border-collapse: collapse; "  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操作以提高数据库访问效率
·servlet 生成静态HTML的方法
·使用JSP实现简易的SQL报表
·浅析Servlet和Jsp中的多国语言显示
·JSP/Servlet/JSF:自定义标签的另类体
·使用JSP+javascript打造二级级联下
·实例:JSP结合XML+XSLT将输出转换HTML
·JSP教程:JSP页面跳转的实战规则
·关于JSP中的offsetparent
·JSP中errorPage设置方法
·JSP用bean获取各种参数
·JSP基础知识教程
·在Eclipse中部署Tomcat,并运行JSP
·jsp教程:深入浅出URL编码
·JSP技术优缺点深入分析(2)
·Jsp环境下ajax乱码问题的解决方法
·JSP技术优缺点深入分析(1)
·jsp上传组件smartupload介绍
·JSP中文字符乱码处理的2种方法
·jsp入门:Jsp运行原理
 
 

公司环境 | 合作伙伴 | 人才招聘 | 付款方式 | 关于我们

地址:广州市天河区中山大道中120号D805 电话:020-82529556 传真:020-82529556
广州帝网网络科技有限公司 版权所有 粤ICP备08119341号