2011-05-22 107 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