2014-12-28 4 views
2

У меня есть страница index.jsp, в которой некоторые элементы включаются/выключаются в зависимости от того, вошел ли пользователь в систему или нет.Сравнение строк в Struts2 <s:if> Тег

<head> 
    <s:set var="accessType" value="GUEST" /> 
    <s:if test="#session.containsKey('currentAccessType')"> 
     <s:set var="accessType" value="#session.currentAccessType" /> 
    </s:if> 
</head> 

<body> 
    <nav> 
     <s:if test="#accessType.equals('GUEST')"> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Login</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:if> 

     <s:else> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Control Panel</a></li> 
       <li><a href="#">Logout</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:else> 
    </nav> 
</body> 

The accessType установлен в GUEST. Однако он вводит else-блок, даже если пользователь еще не вошел в систему.

Я совершил ошибку в сравнении строк?

UPDATE:
Я удалил сессионную часть из index.jsp просто посмотреть и теперь выглядит следующим образом:

<head> 
    <s:set var="accessType" value="GUEST" /> 
    <!-- removed session code for testing --> 
</head> 

<body> 
    <nav> 
     <s:if test="#accessType.equals('GUEST')"> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Login</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:if> 

     <s:else> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Control Panel</a></li> 
       <li><a href="#">Logout</a></li> 
       <li><a href="http://www.mywebsite.com" target="_blank">Main Site</a></li> 
      </ul> 
     </s:else> 
    </nav> 

    <br /> 

    Access type is <s:property value="#accessType" />. 
</body> 

Проблема:

  1. Состояние вступает <s:else> блок.
  2. Тип доступа не печатает (как-то не устанавливается).
+0

Ошибка может быть «NullPointerException», после чего вы вводите тег 's: else'. Покажите, как вы поместили переменную в сеанс. –

+0

Hi @RomanC, я отредактировал сообщение для вашего отзыва. – silver

ответ

1

Вы сравниваете строку в операторах s:if и хорошо работали в тестовом файле, когда вы использовали строковое значение для переменной. Итак, "'GUEST'" работал. Без кавычек OGNL пытается проанализировать значение в двойных кавычках, и если он не может найти переменную с именем GUEST в стек значений, она возвращает null. Затем вы попытались напечатать это значение, которое преобразуется в пустую строку. Вы также жестко закодировали значение 'GUEST' в JSP, это не хорошо.

Решение: бизнес-логику вы не должны писать в JSP. Вы должны определить переменную сеанса в действии и получить доступ к этой переменной сеанса внутри JSP вместо переопределения значения переменной на основе некоторого логического условия.

<head> 
<!-- 
    <s:set var="accessType" value="GUEST" /> 
    removed session code for testing --> 
</head> 

<body> 
    <nav> 
     <s:if test="#session.currentAccessType.equals('GUEST')"> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Login</a></li> 
       <li><a href="http://www.iacademy.edu.ph" target="_blank">Main Site</a></li> 
      </ul> 
     </s:if> 

     <s:else> 
      <ul> 
       <li><a href="index.jsp">Home</a></li> 
       <li><a href="#">Control Panel</a></li> 
       <li><a href="#">Logout</a></li> 
       <li><a href="http://www.iacademy.edu.ph" target="_blank">Main Site</a></li> 
      </ul> 
     </s:else> 
    </nav> 

    <br /> 

    Access type is <s:property value="#session.currentAccessType" />. 
</body> 
+0

Я вижу, поэтому значение «ГОСТЬ» должно поступать из бэкэнд. Если пользователь впервые просматривает index.jsp, как приложение будет знать, что он гость? Нужно ли использовать перехватчик для установки этого значения? – silver

+1

Struts в MVC framework, сначала вы вызываете контроллер, а затем визуализируете представление, не вызываете JSP напрямую. В действии (контроллере) вы определяете переменную сеанса. –

+0

Эй, я думал о «вызове контроллера». У меня есть 'index.jsp' в' 'моей' web.xml', поэтому он переходит в JSP каждый раз, когда я запускаю его в Eclipse. Как я могу назвать контроллер? – silver

0

Я нашел преступника.

Чтобы установить значение Строка Struts2 вар, эта строка:

<s:set var="accessType" value="GUEST" />

Должно быть:

<s:set var="accessType" value="'GUEST'" />

Одиночные кавычки (»«) должны окружать строковый литерал при размещении внутри атрибут value="".

Проверка была правильной.