2011-05-22 155 views
7

我写下面的代码在JSP文件:JSTL SQL:查询变量

<c:catch var="e"> 
    <% 
     int accountNumber = Integer.parseInt(request.getParameter("accountNumber")); 
     int depositAmount = Integer.parseInt(request.getParameter("depositAmount")); 
    %> 
    <sql:query var='account' dataSource="jdbc/bank"> 
     select * from account where AccountNumber=<%= accountNumber %>  
    </sql:query> 
    <c:choose> 
     <c:when test="${account.first() == false}"> 
      <p>Account not found</p> 
     </c:when> 
     <c:otherwise> 
      <h3>Deposit Made</h3> 
      <p>Account number: <%= accountNumber %></p> 
      <p>Deposit amount: <%= depositAmount %></p> 
      <p>New balance: </p> 
     </c:otherwise> 
    </c:choose> 
</c:catch> 


<c:if test="${e != null}"> 
    error 
</c:if> 

我遇到的问题是,下面的代码引发javax.el.MethodNotFoundException:无法找到方法[第一]用[0]参数异常:

<c:when test="${account.first() == false}"> 
    <p>Account not found</p> 
</c:when> 

我需要访问SQL帐户变量:查询,所以我可以检查,看看是否第一行存在。

回答

1

最万无一失的方法implemt这是实现一个DTO与第一变量,然后一个getFirst()方法。

public class account { 
    private String first; 
    public String getFirst(){ 
     return first; 
    } 
    .... 
} 

而当你在JSP中调用它,它看起来应该这样:

test="${!account.first}" 

它将调用account.getFirst()

你的SQL数据需要被映射到这个帐户对象,其中你会做所有的验证,确保不存在空值等

3

首先,我强烈建议你NEVER use scriptlets。如果你重写这个例子作为Java Servlet中,你至少有编译时检查,它也给你写的逻辑的JUnit测试的能力。

接下来,我绝对恨他们把<sql>扔进JSTL,这是对Model View Controller模式的公然漠视,因为您正在将数据访问代码放入前端。这使得维护的噩梦,所以我会重写使用Java Persistence API (JPA)或Hibernate框架是模型代码。

话虽这么说:如果你必须得到工作的例子,那么你的问题是,account.first()不是一个有效的方法调用。即使你只能再回到1分的结果,查询返回结果的列表。尝试如下所示。

<c:forEach var="account" begin="0" items="${account.rows}"> 
<h3>Deposit Made</h3> 
<p>${account.depositAmount}</p> 
</c:forEach> 
+1

这是一个家庭作业。我将很快学会如何使用MVC进行设置。我需要检查以确保结果集不是空的。我想出来的唯一方法是查看第一个元素,看它是否使用.first()返回true或false。我很困惑,为什么.first()不是有效的方法调用时,它是一个结果集的方法。无论如何,我仍然需要查看结果集是否有记录。如果没有,我需要显示一条错误消息。 – Brian 2011-05-22 22:30:47