帮助将ArrayList与我的resultSet一起使用

时间:2011-06-16 16:24:54

标签: java arrays jsp arraylist

我有一个resultSet,每次都有不同数量的结果,需要在我的页面上多次使用。目前,我将结果存储在ArrayList中,并计划循环遍历arraylist。我不知道有多少行所以这就是我到目前为止:

  while (result.next()) {    
      tmpTerms.add(term = (((result_data = result.getObject("val_internal_code"))==null || result.wasNull())?" ":result_data.toString()));
      tmpTerms.add(desc = (((result_data = result.getObject("val_external_representation"))==null || result.wasNull())?" ":result_data.toString()));
      tmpTerms.add(sorter = (((result_data = result.getObject("sorter"))==null || result.wasNull())?" ":result_data.toString()));
      tmpTerms.add(sDate = (((result_data = result.getObject("sDate"))==null || result.wasNull())?" ":result_data.toString()));
  }

好的,所以当我运行它时,系统打印: 代码:

[2011SP, Spring 2011, 1, 11-15-2010, 2011SU, Summer 2011, 1, 01-15-2011, 2011FL, Fall 2011, 1, 04-01-2011, 2010Q2, CE Qtr 2 2010 Dec - Feb, 2, 08-01-2010, 2011Q3, CE Qtr 3 2011 Mar - May, 2, 11-01-2010, 2011Q4, CE Qtr 4 2011 Jun - Aug, 2, 02-01-2011, 2011Q1, CE Qtr 1 2011 Sep-Nov, 2, 05-01-2011]

我不知道这是否是正确的做法,但它到目前为止工作,所以我现在要做的是使用我的allTerms arrayList,并将它们分成行,所以我想分开每一个将4个结果分成一行。 (因此它将是2011SP,2011年春季,1,11-15-2010作为一行等等),接下来,我需要将这些结果传输到HTML页面的某些部分。所以对于前:

<table class="t1">
  <tr>
    <td><!--Here I would want to show all rows from the allTerms arrayList with a "sorter" of 1--></td>
  </tr>
</table>
<table class="t2">
  <tr>
    <td><!--Here I would want to show all rows from the allTerms arrayList with a "sorter" of 1 and a term of ....SU (where '....' is the year) --></td>
  </tr>
</table>

2 个答案:

答案 0 :(得分:9)

这不完全正确。您需要创建一个表示单个实体的Javabean类(读取:包含单个数据库行的所有列数据的类)。

E.g。

public class Term {
    private String code;
    private String description;
    private int sorter;
    private Date date;

    // Add/generate getters, setters, equals, hashcode and other boilerplate.
}

并填写如下:

List<Term> terms = new ArrayList<Term>();
// ...

while (resultSet.next()) {
    Term term = new Term();
    term.setCode(resultSet.getString("val_internal_code"));
    term.setDescription(resultSet.getString("val_internal_representation"));
    term.setSorter(resultSet.getInt("sorter"));
    term.setDate(resultSet.getDate("sDate"));
    terms.add(term);
}

// ...
request.setAttribute("terms", terms);

然后,您可以使用JSTL / EL很好地访问它。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<table class="t1">
  <tr>
    <td>
      <c:forEach items="${terms}" var="term">
        <c:if test="${term.sorter == 1}">
          ${term.code}, ${term.description}, ${term.date}
        </c:if>
      </c:forEach>
    </td>
  </tr>
</table>
<table class="t2">
  <tr>
    <td>
      <c:forEach items="${terms}" var="term">
        <c:if test="${term.sorter == 1 and fn:endsWith(term.code, 'SU')}">
          ${term.code}, ${term.description}, ${term.date}
        </c:if>
      </c:forEach>
    </td>
  </tr>
</table>

另见:


无关问题,您遍历ResultSet时的方式并没有让我强烈感觉数据模型设计得当。确保您为其拥有的数据使用正确的列类型。确保您对列进行了正确的非null和键约束。我还会重新考虑列名称,并尝试更加自我记录和一致。

答案 1 :(得分:1)

假设您的数据中有不同数量的列,我将为您提供一个与@BalusC优秀的解决方案不同的解决方案。

如果您有不同数量的列,您可以使用键值数据结构的路线,即某种类型的地图,然后将这些地图存储在列表中。

ArrayList<HashMap<String, String>> rows = new ArrayList<HashMap<String,String>>();

while(resultSet.next()) {
    HashMap<String, String> term = new HashMap<String, String>();
    term.put("val_internal_code",resultSet.getString("val_internal_code"));
   term.put("val_internal_representation", resultSet.getString("val_internal_representation"));
    term.put("sorter",resultSet.getInt("sorter"));
    term.put("date",resultSet.getDate("sDate"));
    rows.add(term);
}

然后当你打印数据时:

for(HashMap<String, String> row : rows){
   for(String key : row.keySet()){
       System.out.println(row.get(key));
   }
   System.out.println("End of line");
}