我在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中的帐户变量,以便查看第一行是否存在。
答案 0 :(得分:5)
<sql:query var='account' dataSource="jdbc/bank">
根据<sql:query>
documentation,account
是javax.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数据需要映射到此帐户对象,您将在其中进行所有验证,确保没有空值等。