0

我有一个搜索应用程序。

我的搜索结果全部设置为传输对象中的属性。

在我的处理器 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 并避免使用上面的 scriptlet。但是,EL 和 JSTL 对我来说有点希腊化。

(1) 上述代码块的 jstl 等价物是什么?我是否需要对后端进行一些重大更改才能使用 JSTL/EL 实现相同的效果?

(2) 我在jsp中有一些javascript函数。他们会受到 JSTL 的影响吗?例如上面代码中的 loadDetails 函数和上面使用 TO 的 someFunc 函数。

(3) jstl/el中如何调用TO的标志函数

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

使用

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

不管用

我尝试使用

<c:when> 

然而,在上面单选按钮的 if else 代码中,我开始得到 3 行,每行 3 个按钮(9 个按钮)。

谢谢阅读!!

4

3 回答 3

2

首先为 jstl 导入 taglib<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 第二个..

  • if..else使用c:choosec: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.jarstandard.jar


JSTL 不会影响 java 脚本的行为。

于 2011-11-10T07:23:24.813 回答
1

因为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>

对于sizeloop

您可以使用fn:length()for 循环获得的大小,请参阅c:forEach

希望您可以操纵答案中的信息以获取确切的代码

于 2011-11-10T07:16:49.513 回答
1

<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 一样输出的文本。它只会在客户端有意义。

于 2011-11-10T07:26:04.843 回答