JSTL-эквиваленты для JSP-тегов - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть приложение для поиска.

Результат моего поиска все устанавливается как свойства в объекте переноса.

В своем классе Java-процессора я помещаю TO в контекст:

ctx.putUserData("searchDetailsTO", searchDetailsTO);

Наряду с вышеуказанным объектом, несколько строк также устанавливаются так:

    ctx.putUserData("productName", productName);
    ctx.putUserData("productNameCriteria", productNameCriteria);
    ctx.putUserData("currency", currency);

В моем jsp я обращаюсь к TO как:

<jsp:useBean id="searchDetailsTO" scope="session" type="com.domain.SearchDetailsTO" />

и доступ к строкам как:

<%
String  productName =(String)session.getAttribute("productName");
String  productNameCriteria =(String)session.getAttribute("productNameCriteria");
String  currency =(String)session.getAttribute("currency");
int searchResultsSize = searchDetailsTO.getTotalResults();
SomeTO someTO = new SomeTO();
%>

И позже в jsp, используя выше TO и Strings как:

<%
if (productNameCriteria .equals("NAME_BEGINS")) { 
%> 
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_BEGINS" CHECKED/><b>Begins With</b>
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_CONTAINS" /><b>Contains</b>
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_IS" /><b>Exact Match</b>
<% 
} else if (productNameCriteria .equals("NAME_CONTAINS")) { 
%> 
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_BEGINS"/><b>Begins With</b>
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_CONTAINS" CHECKED/><b>Contains</b>
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_IS" /><b>Exact Match</b>                      
<% 
}
else { 
%>  
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_BEGINS"/><b>Begins With</b>
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_CONTAINS"/><b>Contains</b>
  <input type="radio" name="productNameCriteria" id="productNameCriteria" value="NAME_IS" CHECKED/><b>Exact Match</b>
<% 
}
%>  

А

<%
if (searchResultsSize > 0) {
for (int k = 0; k < searchDetailsTO.getResult().size(); k++) {
  someTO = (someTO) searchDetailsTO.getResult().get(k);
%>
<Table>
<TR>
<TD class="gridrow<%=k%2%>" align="center" style="style" width="120">
     <%=someTO.getSomething()%>
</TD>   
<TD class="gridrow<%=k%2%>" align="left" style="style" width="372">
  <A href="#"onclick="loadDetails('<%=someTO.getSomeId()%>', '<%=someTO.getSomethingMore()%>')"; ><%=someTO.getSomethingElse()%></A>
</TD>  
</TR>
</Table>
<%
} }
%>

и т.д.. и т.д.

Моя функция JavaScript также использует значение из TO. Что-то вроде:

function someFunc(){
       if(option=='goto' && !(pageNum>0 && pageNum<=<%=searchDetailsTO.getTotalPages()%>))
       {
  alert("Please enter valid Page# (Range 1 to <%=searchDetailsTO.getTotalPages()%>)");
       }

Я хочу переключиться на использование JSTL и EL и избегать использования скриптлетов, как указано выше. Тем не менее, EL и JSTL для меня греческий.

(1) Какими будут jstl-эквиваленты вышеуказанным кодовым блокам? Нужно ли мне делать какие-то серьезные изменения в моем бэкэнде, чтобы добиться того же, используя JSTL / EL ??

(2) У меня есть несколько функций javascript в jsp. Будут ли они затронуты JSTL? Например, Функция loadDetails в вышеприведенном коде и функция someFunc, которая использует в нем TO.

(3) Как вызывать функции флагов TO в jstl / el

<%
if(searchDetailsTO.isPrevious() || searchDetailsTO.isNext()) {      
%>  

с помощью

c:if test="${(searchDetailsTO.isPrevious()) or (searchDetailsTO.isNext())}"   

не работает

Я пытался использовать

<c:when> 

в коде if else для переключателей выше, однако, я начал получать 3 ряда по 3 кнопки (9 кнопок).

Спасибо за чтение !!

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Первый тег импорта для jstl <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Второй ..

  • Для if..else используйте c:choose и c:when / c:otherwise.
  • Для for используйте c:forEach.
  • Для объявления переменной используйте c:set
  • Для получения данных из сеанса используйте ${pageContext.session.varName}.(замените varName на имя данных сеанса, которые вы хотите получить)
  • Чтобы получить размер в цикле, используйте fn:length(dataList).(чтобы использовать это, вам нужно импортировать функции taglib <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>)

Чтобы использовать jstl, вам нужно добавить 2 jar в ваш проект, которые jstl.jar и standard.jar


JSTL не повлияет на поведение java-скрипта.

1 голос
/ 10 ноября 2011

<jsp:useBean/>: больше не нужно.

первый скрипт, инициализирующий локальные переменные: больше не нужно.

if / else if / else: заменено на

<c:choose>
    <c:when test="${productNameCriteria == 'NAME_BEGINS'}">

    </c:when>
    <c:when test="${productNameCriteria == 'NAME_CONTAINS'}">

    </c:when>
    <c:otherwise>

    </c:otherwise>
</c:choose>

Если ifтест перед циклом не нужен.Если вы хотите сохранить его, просто используйте

<c:if test="${!empty searchDetailsTO.result}">

Цикл: заменен на

<c:forEach var="detail" items="${searchDetailsTO.result}">

</c:forEach>

<%=someTO.getSomeId()%>: заменен на ${detail.someId}

Ваш JavaScript остаетсябез изменений, конечно.Для JSP (на стороне сервера) JavaScript - это просто текст для вывода как HTML.Это будет иметь смысл только на стороне клиента.

1 голос
/ 10 ноября 2011

для if ..else ... вы можете использовать <c:choose>

, например:

<c:choose>
      <c:when test="${productNameCriteria eq 'NAME_BEGINS'}">

      </c:when>
      <c:when test="${productNameCriteria eq 'NAME_CONTAINS'}">

      </c:when>
      <c:otherwise>

      </c:otherwise>

</c:choose>

Для size и loop

размер, который вы можете получить, используяfn:length() цикл см. c:forEach

Надеюсь, что вы можете манипулировать информацией из ответа, чтобы получить точный код

...