Java и JSTL / EL: Как я могу сравнить два целых числа, хранящиеся в качестве атрибутов? - PullRequest
0 голосов
/ 06 апреля 2011

Я занимаюсь разработкой веб-приложения, и в моем классе есть три статические переменные, называемые AccountManagement, которые представляют три возможных состояния, которые могут быть достигнуты при нажатии на ссылку в электронном письме для активации учетной записи:

public final static int ACTIVATION_EXCEPTION_OCCURRED = -1;
public final static int ACTIVATION_CODE_INCORRECT = 0;
public final static int ACTIVATION_SUCCESSFUL = 1;    

При запуске они сохраняются в контексте в виде атрибутов с именами «ActivSuccessful», «ActivCodeIncorrect» и «ActivExceptionOccurn».Когда пользователь нажимает на ссылку в электронном письме, чтобы активировать учетную запись, запрос отправляется в AccountManagementServlet, и его / ее имя и результат проверки кода активации добавляются в качестве атрибутов в его сеанс (которыйсоздается, если у них его еще нет).Имена атрибутов: «firstName» и «ActivationStatus» (соответственно).Затем сервлет перенаправляет на Activation_status.jsp.

Проблема, с которой я столкнулся, заключается в том, что по какой-то причине операторы равенства EL в этой JSP не оцениваются, и я остаюсь с пустой страницей.

Я думаю, это потому, что я сохранил их как примитивные целые числа, и они извлекаются как объекты.Если так, как я могу привести их к целым числам для сравнения?И если это не проблема, кто-то может сказать мне, что это может быть?Если я заменю все атрибуты servletContext в приведенном ниже коде их соответствующими целыми числами, EL, кажется, приведёт атрибуты sessionScope к целым числам на основе наличия фактического целого числа, и код работает.Я не хочу жестко кодировать числа в jsp, поэтому, если кто-то может помочь мне здесь, я был бы благодарен.Вот код для JSP:

<c:choose>
            <c:when test="${sessionScope.activationStatus == servletContext.activationSuccessful}">
                Congratulations ${sessionScope.firstName}, you've activated your account!
            </c:when>
            <c:when test="${sessionScope.activationStatus == servletContext.activationCodeIncorrect}">
                Hi ${sessionScope.firstName}, this activation code is incorrect, please try clicking the link in the e-mail (or the copy and paste instructions) again. If you still end up here, <a href ="send_another_activation_code_page.html">you'll need to get another activation code</a>
            </c:when>
            <c:when test="${sessionScope.activationStatus == setvletContext.activationExceptionOccurred}">
                Hi ${sessionScope.firstName}, an error occurred during activation, please try clicking the link in the e-mail (or the copy and paste instructions) again. If you still end up here, most likely the time period to activate this account has expired. Don't fret, but you can sign up again (with the same e-mail, if you wish) <a href="index.html">here</a>!
            </c:when>

</c:choose>

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

${servletContext}${setvletContext}) недействительно. Вам нужен ${applicationScope}, который относится к отображению атрибутов ServletContext. См. Также главу Неявные объекты в руководстве по Java EE.


Несмотря на это, этот подход несколько странный. Я бы использовал перечисление.

public enum ActivationStatus {
    SUCCESSFUL, INCORRECT, EXCEPTION;
}

с

<c:when test="${activationStatus == 'SUCCESSFUL'}"></c:when>
<c:when test="${activationStatus == 'INCORRECT'}"></c:when>
<c:when test="${activationStatus == 'EXCEPTION'}"></c:when>
0 голосов
/ 06 апреля 2011

Вы можете сделать ${foo eq bar}, но я не думаю, что это решит вашу проблему. Я считаю, что == должно быть достаточно.

Я совершенно уверен, что вам не нужно обращаться к атрибутам запроса через контекст, и вы можете обращаться к ним напрямую: ${activationSuccessful}

Еще одно замечание, которое я вижу, это то, что в третьем примере вы ошиблись сервлетом:

setvletContext.activationExceptionOccurred

На вашем месте я бы сузил точную ошибку, распечатав значения:

<c:out value="${sessionScope.activationStatus}"/>
<c:out value="${activationSuccessful}"/>

и т.д.

Еще один вариант - обработать эту сторону сервера:

String welcomeMessage = // place if stmts, etc.
request.setAttribute("welcomeMessage", welcomeMessage);

или вы можете вернуть логическое значение:

boolean isSuccessful = // if stmt
request.setAttribute("isSuccessful", isSuccessful);

тогда

<c:if test="${isSuccessful}">

или

<c:if test="${isSuccessful eq true}">

IMO, ваши константы в jsp - это что-то вроде утечки.

...