【问题标题】:JSTL equivalents to jsp tagsJSTL 等价于 jsp 标记
【发布时间】:2011-11-10 07:11:09
【问题描述】:

我有一个搜索应用程序。

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

在我的处理器 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 和字符串作为:

<%
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 个按钮)。

感谢阅读!!

【问题讨论】:

    标签: java jsp web-applications jstl scriptlet


    【解决方案1】:

    首先导入 jstl 的 taglib &lt;%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt; 第二个..

    • 对于if..else,请使用c:choosec:when / c:otherwise
    • 对于for,请使用c:forEach
    • 声明变量使用c:set
    • 要从会话中获取数据,请使用${pageContext.session.varName}。 (将 varName 替换为您要获取的会话数据的名称)
    • 要在循环中获取大小,请使用fn:length(dataList)。 (要使用这个你需要导入函数 taglib &lt;%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %&gt;

    要使用 jstl,您需要在项目中添加 2 个 jar,它们分别是 jstl.jarstandard.jar


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

    【讨论】:

      【解决方案2】:

      对于if ..else ...,您可以使用&lt;c:choose&gt;

      例如:

      <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

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

      【讨论】:

      • 谢谢。如果我遇到任何问题,我会加入 cmets。
      【解决方案3】:

      &lt;jsp:useBean/&gt;: 不需要了。

      第一个初始化局部变量的脚本:不再需要了。

      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>
      

      &lt;%=someTO.getSomeId()%&gt;:替换为${detail.someId}

      当然,您的 JavaScript 不会受到影响。对于 JSP(服务器端),JavaScript 只是像 HTML 一样输出的文本。它只会在客户端有意义。

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多