【问题标题】:how can I change special jsp scriptlet to jstl?如何将特殊的 jsp scriptlet 更改为 jstl?
【发布时间】:2011-05-22 17:56:47
【问题描述】:

我想将我的 jsp 页面中的所有 scriptlet 更改为 jstl, 如何将此代码更改为 jstl

    <%     Map validationResults = (HashMap) request.getAttribute("validationResults");%> 
    <% if (validationResults != null) {
           if (validationResults.containsKey("userName")) {  //how can i chage this line to jstl ?
    %>
    <%=((ValidationResult) (validationResults.get("userName"))).getDetails()%> //how can i chage this line to jstl too ?
  <%}%>
 <%}%>

我的 JSTL

<c:set var="validationResults" value="validationResults" scope="request"></c:set>
   <c:if test="validationResults != null">   
  //how can i change the code of map here? 
   </c:if>

还有一个包含 Group 对象列表的 ArrayList 的问题,在循环中我想获取每个 Group 对象并检查 Group 对象中的特定方法,如何通过 jstl 访问这些方法??

我想更改此代码

    <%List<Group> allGroupList = new ArrayList<Group>();
        allGroupList = (ArrayList) request.getAttribute("groups");%>

       <% for (int index = 0; index < allGroupList.size(); index++) {%>
       <%Group aGroup = (Group) allGroupList.get(index);%>
        <label ><%=aGroup.getGroupEName()%></label>
        <%if (aGroup.isIsUserGroup()) {%>
        <input type="checkbox" name="group" value="<%=aGroup.getGroupNo()%>" CHECKED />
         <%} else {%>
         <input type="checkbox" name="group" value="<%=aGroup.getGroupNo()%>"  />
       <%}%>
   <%}%>

这是我修改后的代码:

<jsp:useBean id="GroupBean" class="ps.iugaza.onlineinfosys.entities.Group" type="ps.iugaza.onlineinfosys.entities.Group" scope="reqeust">
<c:set var="allGroupList" value="groups" scope="request"></c:set>
<c:forEach var="grp" items="${allGroupList}" varStatus="status">
        //?????? what should i do ?
 </c:forEach>

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:

    第一部分

    JSTL 和 EL 仅适用于遵循 Java Bean 约定的方法。如果你真的想走这条路,那么你可以在你的map 周围循环。

    <c:forEach items="${requestScope.validationResults}" var="mapEntry" varStatus="index">
        <c:if test="${mapEntry.key == 'userName'}">
            <tr>
                <td>${mapEntry.value.details}</td>
            </tr>
        </c:if>
    </c:forEach>
    

    另一种方法是从地图中获取userName,并检查它是否为null,然后做任何你想做的事情。这确实是一个更好的主意。

    <c:if test="${requestScope.validationResults['userName'] != null}">
        <tr>
            <td>${requestScope.validationResults['userName'].details}</td>
        </tr>
    </c:if>
    

    第二次

    <c:forEach var="grp" items="${requestScope.groups}" varStatus="status">
        <label>${grp.groupEName}</label>
        <input type="checkbox" name="group" value="${grp.groupNo}" ${grp.isUserGroup ? 'checked' : ''} />
    </c:forEach>
    

    【讨论】:

    • 代码没有任何非渲染魔法,所以完全可以在 jstl 中执行此操作,恕我直言。
    • @heikkim:已更新。之前没有进入逻辑流程。 ;)。无论如何,感谢您指出。
    • @Adeel Ansari - 在第二个示例中发生了异常:当我想访问 ${grp.groupEName} 和 ${grp.groupNo} 中的 Group 对象的属性时,异常会引发属性没有定义,这是明智的,我认为我们应该将列表中的对象强制转换为组?如何做到这一点?
    • @Alaa:这不应该是一个转换问题,这应该在这里打印toString() 字符串值。尝试使用更新后的代码(我刚刚更新了它)。并确保您的 GroupBean 中有这两个属性,并确保您的请求中有 groups 作为属性。
    • @Adeel - woooow 第二个工作正常,关于第一个,你尝试了第二种方法并在 中创建 requsetScope.validationResults 但与第一次发生:javax.el.PropertyNotFoundException:在 java.lang.String 类型上找不到属性“用户名”
    【解决方案2】:

    至于 1),您必须通过操作/控制器填充您的 request,并有一个 JSTL 脚本来遍历您的地图,如下所示:

    警告: 未经测试

    <c:if test="${requestScope.validationResults != null}">
        <c:forEach var="entry" items="${requestScope.validationResults}">
            <c:if test="${entry.key == 'userName'}">
                Result: ${entry.value.details};
            </c:if>
        </c:forEach>
    </c:if>
    

    Adeel Ansari 为您回答了 2 号问题。

    【讨论】:

    • @The Elite:在我第一次尝试之后,我也在循环方式上工作。但这似乎不是一个好主意。
    • @Adeel Ansari,自从我做 JSTL 以来已经有很多年了,你是对的......我的更“循环”。
    • 我更喜欢使用传统的高性能脚本,而不是通过所有的地图来满足我的需求。
    • @Alaa,性能与否...我强烈反对编写脚本。 JSP 必须仅用作表示层。
    • @Alaa:我同意“精英绅士”的百分之几。如果您无法按照我向您展示的方式进行操作,并且您不喜欢使用循环一。那么最好把它放到某个 Java 类中,然后在 JSP 中简单地编写表示的东西。