JSTL sql: переменная запроса - PullRequest
7 голосов
/ 23 мая 2011

Я написал следующий код в файле 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: Невозможно найти метод [first] с [0] исключение параметров:

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

Мне нужен доступ к переменной учетной записи в запросе sql:, ​​чтобы я мог проверить, существует ли первая строка.

Ответы [ 3 ]

5 голосов
/ 23 мая 2011
<sql:query var='account' dataSource="jdbc/bank">

Согласно <sql:query> документации , account представляет собой javax.servlet.jsp.jstl.sql.Result класс .

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

Согласно классу'Javadoc, этот класс не имеет first() метода.Однако существует метод getRowCount() .Я бы предложил использовать это вместо.

<c:when test="${account.rowCount == 0}">
3 голосов
/ 23 мая 2011

Прежде всего, я настоятельно рекомендую вам НИКОГДА не использовать скриптлеты .Если бы вы переписали этот пример как сервлет Java, у вас по крайней мере была бы проверка во время компиляции, и это также дало бы вам возможность написать тест логики 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 голос
/ 23 мая 2011

Самый надежный способ реализовать это - реализовать DTO с первой переменной, а затем с методом getFirst ().

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

И когда вы вызываете его в JSP, это должно выглядеть так:

test="${!account.first}"

, который будет вызывать account.getFirst ()

Ваши данные SQL должны быть сопоставлены с этим объектом учетной записи, в котором вы будете выполнять всю проверку, убедитесь, что нет нулевых значений и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...