如何比较jsp/jstl的foreach循环中的两个字符串



我需要与foreach循环中的字符串进行比较。

我的开发环境:

1) MAC 10.11,

2) STS版本:3.7.3.发布

4) Spring Web MVC、

5) Pivotal tc Server Developer Edition v3.1

<c:set var="day" scope="session" value="${day}_${curId}"/>
<c:set var="new_day" scope="session" value="${2_456123}"/>

<c:if test="${day eq new_day}">
    <p> Both are same.      
</c:if>

但是这个系统在线上出现了问题

<c:if test="${day eq new_day}">

有人能指点一下吗?

谢谢&问候,

Arun Dhwaj

这是演示代码。

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<c:set var="day" scope="session" value="2"/>
<c:set var="curId" scope="session" value="456123"/>
<c:set var="day" scope="session" value="${day}_${curId}"/>
<c:set var="new_day" scope="session" value="2_456123"/>
<c:if test="${day eq new_day}">
     Both are same.      
</c:if>  

打印:两者相同
如果我将第5行更改为

<c:set var="new_day" scope="session" value="${2_456123}"/>  

这就是你发布的内容,然后我收到一条错误消息
包含无效的表达式:javax.el.ELE异常:无法解析表达式[${2_456123}]

问题很可能是由以下分配引起的

<c:set var="day" scope="session" value="${day}_${curId}"/>

在上面的行中,您将为变量day分配一个值,该值来自具有相同名称但不一定具有相同scope的另一个变量。换句话说,您可能已经有一个名为day的变量,它位于另一个作用域中。

默认作用域是页面作用域,然后按请求、会话和应用程序的顺序,因此,如果在页面或请求作用域中检索到名称为day的变量,则在执行测试时将考虑该变量,并且将忽略您在会话作用域中定义的变量。

你有两个选项

  1. 更改会话范围中定义的变量的名称,并在执行测试时使用该名称

    <c:set var="niceday" scope="session" value="${day}_${curId}"/>
    <c:if test="${niceday eq ...}">
    
  2. 指定c:if标签中使用的变量的范围

    <c:if test="${sessionScope.day eq ...}">
    

希望能有所帮助。

最新更新