jsp

位置:IT落伍者 >> jsp >> 浏览文章

使用JSP实现简易的SQL报表


发布日期:2024年08月28日
 
使用JSP实现简易的SQL报表

这个内容也是根据企业学员的要求准备的 其实这个小项目是刚毕业时候做的 很多时候我们希望执行下面的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框架

               

上一篇:JSP自定义标签执行顺序

下一篇:在JSP中访问各种数据库[1]