JSP虚拟主机,jsp空间,java空间,java虚拟空间JSP虚拟主机,jsp空间,java空间,java虚拟空间

JSP页面查询显示常用模式



作者:    文章来源:
发布日期:2007年04月12日
JSP页面查询显示常用模式

1.直接使用ResultSet
2.Value Object
3.hashmap  key,value
4.RowSet



------------------------
1.直接使用ResultSet
  最大众化的方法,
  原文中忽略了这一方法,偶给加上了
   代码略



2.
    使用Value Object。将每条记录均封装成JavaBean对象,把这些对象装入Collection传送给JSP显示

。这种方法的缺点是每一种查询都需要定义一个java class,并且将记录数据封装成java对象时也需要很

多额外的代码。
示例代码:


//查询数据代码
  Connection conn = DBUtil.getConnection();
  PreparedStatement pst = null;
  ResultSet rs = null;
  try{
    String sql=“select emp_code, real_name from t_employee where organ_id=?”;
    pst = conn.preparedStatement(sql);
    pst.setString(1, “101”);
    ResultSet rs = pst.executeQuery();
    List list = new ArrayList();
    Employee emp;
    while (rs.next()){
      emp = new Employee();
      emp.setReakName(rs.getString(“real_name”));
      emp.setEmpCode(rs.getString(“emp_code”));
      …
      list.add(emp);
    }
    return list;
  }finally{
    DBUtil.close(rs, pst ,conn);
  }


//jsp显示部分代码
<%
  List empList = (List)request.getAttribute(“empList”);
  if (empList == null) empList = Collections.EMPTY_LIST;
%>

<table  cellspacing="0" width=”90%”>
    <tr>  <td>代码</td> <td>姓名</td>  </tr>
<%
  Employee emp;
  for (int i=0; i< empList.size(); i++){
    emp = (Employee) empList.get(i);
%>
    <tr>  
      <td><%= emp.getEmpCode()%></td> 
      <td><%= emp.getRealName()%></td>  
    </tr>
<%
  }// end for
%>
</table>


3.
    使用hashmap作为数据容器。
具体做法:
1.    生成一个List对象(List list = new ArrayList() )。
2.    生成一个Map对象(Map map = new HashMap() )。使用Map封装一行数据,key为各字段名,value

为对应的值。(map.put(“USER_NAME”), rs.getString(“USER_NAME”))
3.    将第2 步生成的Map对象装入第1步的list对象中(list.add(map) )。
4.    重复2、3步直到ResultSet遍历完毕
在DBUtil. resultSetToList(ResultSet rs)方法中实现了上述过程(所有列名均使用大写),可参考使用。

HashMap map = null;

while(rs.next(){
map = new HashMap();
map.put("Field1",rs.getString("Field1"));
map.put("Field2",rs.getString("Field2"));
*****
map.put("fieldn",rs.getString("fieldn"));
}


以上是写死的,
可以使用ResultSetMetadata进行干净彻底的一次性封装,
可以取到rs中所有字段名

String name = null;
ResultSetMetaData rsmd = rs.getMetaData();
int num = rsmd.getColumnCount();
int i = 0;
while(rs.next()){
for(i=1;i<=num;i++){
name = rsmd.getColumnName(i);
map.put("name",rs.getString("rs"));
}/*end for*/
}/*end while*/


示例代码:


//查询数据部分代码:
  …
  Connection conn = DBUtil.getConnection();
  PreparedStatement pst = null;
  ResultSet rs = null;
  try{
    String sql=“select emp_code, real_name from t_employee where organ_id=?”;
    pst = conn.preparedStatement(sql);
    pst.setString(1, “101”);
    rs = pst.executeQuery();
    List list = DBUtil. resultSetToList(ResultSet rs);
    return list;
  }finally{
    DBUtil.close(rs, pst ,conn);
  }



//JSP显示部分代码
<%
  List empList = (List)request.getAttribute(“empList”);
  if (empList == null) empList = Collections.EMPTY_LIST;
%>

<table  cellspacing="0" width=”90%”>
    <tr>  <td>代码</td> <td>姓名</td>  </tr>
<%
  Map colMap;
  for (int i=0; i< empList.size(); i++){
    colMap = (Map) empList.get(i);
%>
  <tr>  
    <td><%=colMap.get(“EMP_CODE”)%></td> 
    <td><%=colMap.get(“REAL_NAME”)%></td>  
  </tr>
<%
  }// end for
%>
</table>


4.
    使用RowSet。
RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是

oracle.jdbc.rowset.OracleCachedRowSet。 OracleCachedRowSet实现了ResultSet中的所有方法,但与

ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭后仍然有效。

oracle的rowset实现在http://otn.oracle.com/software/content.html的jdbc下载里有,名称是

ocrs12.zip

示例代码:

//查询数据部分代码:
  import javax.sql.RowSet;
  import oracle.jdbc.rowset.OracleCachedRowSet;
  …
  Connection conn = DBUtil.getConnection();
  PreparedStatement pst = null;
  ResultSet rs = null;
  try{……
    String sql=“select emp_code, real_name from t_employee where organ_id=?”;
    pst = conn.preparedStatement(sql);
    pst.setString(1, “101”);
    rs = pst.executeQuery();
    OracleCachedRowSet ors = newOracleCachedRowSet();
    //将ResultSet中的数据封装到RowSet中
    ors.populate(rs);
    return ors;
  }finally{
    DBUtil.close(rs, pst, conn);
  }


//JSP显示部分代码
<%
  javax.sql.RowSet empRS = (javax.sql.RowSet) request.getAttribute(“empRS”);
%>

<table  cellspacing="0" width=”90%”>
    <tr>  <td>代码</td> <td>姓名</td>  </tr>
<%
  if (empRS != null) while (empRS.next() ) {
%>
  <tr>  
    <td><%= empRS.get(“EMP_CODE”)%></td> 
    <td><%= empRS.get(“REAL_NAME”)%></td>  
  </tr>
<%
  }// end while
%>
</table>


适用场合:
  1.ResultSet适合于短平快项目,纯JSP方案最适合

  2.value object
使用于定制的查询操作,个人认为该方法比较SB,而许多人却乐此不疲,
        如果使用struts,ibatis,hibernate等开发基本上属于此中模式,
          使用value object其实还是一个比较重量级的方案,如果不使用
         EJB或web sevice等分布式方案,确实没有使用value object的必要,
            大家都倡导轻量级的解决方案,为何不更轻松些,使用方法1或3,
            写一大堆value  bean,无论是从开发工作量和维护上都是一个噩梦

  3.HashMap充当数据容器
适用于多条查询语句或需要对查询结果进行处理的情况。
      该方法比较不错,灵活机动,适用范围广,
      纯JSP,EJB,WEB SERVICE均适用    
  4.RowSet
适合于单条查询语句,适用于快速开发。
          RowSet本身就是一种数据容器,其功能与hashmap差不多,
            方法3可以取代方法4








Copyright © 2002-2012 JSPCN.net. All rights reserved.
JSP中文网    备案号:粤ICP备09171188号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号