JSTL sql:查询变量

时间:2011-05-22 21:21:19

标签: java jsp jstl

我在JSP文件中编写了以下代码:

<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]参数异常的方法[first]:

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

我需要访问sql:query中的帐户变量,以便查看第一行是否存在。

3 个答案:

答案 0 :(得分:5)

<sql:query var='account' dataSource="jdbc/bank">

根据<sql:query> documentationaccountjavax.servlet.jsp.jstl.sql.Result class

<c:when test="${account.first() == false}">

根据班级&#39; javadoc,该类没有first()方法。但是有一个getRowCount() method。我建议改用它。

<c:when test="${account.rowCount == 0}">

答案 1 :(得分: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>

答案 2 :(得分:1)

实现这一点最简单的方法是使用第一个变量然后使用getFirst()方法实现DTO。

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

当你在JSP中调用它时,它应该看起来:

test="${!account.first}"

将调用account.getFirst()

您的SQL数据需要映射到此帐户对象,您将在其中进行所有验证,确保没有空值等。