【问题标题】:test attribute in JSTL <c:if> tagJSTL <c:if> 标签中的测试属性
【发布时间】:2010-09-10 17:46:29
【问题描述】:

我在一个 JSP 中看到了一些类似下面的代码

<c:if test="<%=request.isUserInRole(RoleEnum.USER.getCode())%>">
    <li>user</li>
</c:if>

我的困惑在于出现在test 属性值中的“=”。我的理解是 &lt;%= %&gt; 中包含的任何内容都会打印到输出中,但分配给 test 的值肯定是布尔值,那么为什么会这样呢?

对于加分,有没有办法改变上面的属性值,使其不使用scriptlet代码?据推测,这意味着使用 EL。

干杯, 唐

【问题讨论】:

  • 仅当它出现在 JSP 标记之外时才会打印到输出,如下面的答案所述。但是,它确实 被评估为字符串,而是转换为属性期望的任何类型。 &lt;c:if&gt; 标签的 test 属性是 boolean 类型,因此无论脚本返回什么表达式都将被强制转换为 boolean
  • 虽然有趣的是,如果您在 JSP 标记属性中混合字符串和 scriptlet,引擎会感到困惑并将整个值解释为字符串。也就是说,&lt;c:if test="abc&lt;%= true %&gt;"&gt; 不会执行 scriptlet,而是通过返回 falseBoolean.valueOf() 将字符串 abc&lt;%= true %&gt; 强制转换为布尔值。 stackoverflow.com/questions/8168821/…

标签: java jsp jstl


【解决方案1】:

JSP 标记库中的属性通常可以是静态的,也可以在请求时解析。如果它们在请求时被解析,JSP 将在运行时解析它们的值并将输出传递给标记。这意味着您可以将几乎任何 JSP 代码放入属性中,并且标记将根据产生的输出进行相应的行为。

如果您查看 jstl taglib 文档,您可以看到哪些属性是重用时间,哪些不是。 http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

【讨论】:

    【解决方案2】:

    本身将被发送到输出,在 JSTL 的上下文中它将被评估为字符串

    【讨论】:

      【解决方案3】:

      在计算 c:if 标记之前计算 之间的表达式。所以,假设 |request.isUserInRole|返回 |true|,您的示例将首先评估为:

      <c:if test="true">
          <li>user</li>
      </c:if>
      

      然后会执行 c:if 标签。

      【讨论】:

        【解决方案4】:

        test 属性查找以确定某事是否为真的所有内容都是字符串“true”(不区分大小写)。例如,以下代码将打印“Hello world!”

        <c:if test="true">Hello world!</c:if>
        

        &lt;%= %&gt; 中的代码返回一个布尔值,因此它将打印字符串“true”或“false”,这正是 &lt;c:if&gt; 标记所寻找的。​​p>

        【讨论】:

        • 严格来说,里面的代码不是返回的是String,而不是boolean吗?
        • @Don,request.isUserInRole()(在 中的那个)确实返回一个布尔值。希望这就是您要问的。
        • 实际上,&lt;c:if&gt; 的标记处理程序通过需要一个布尔值的 setter 方法接收 test 属性的值。处理程序不查找字符串“true”。相反,您的示例使用test="true" 的原因是因为EL 在设置属性之前将字符串true 强制转换为布尔值。强制按照以下规则进行:stackoverflow.com/questions/8168821/…
        【解决方案5】:

        你也可以使用类似的东西

        <c:if test="${ testObject.testPropert == "testValue" }">...</c:if>
        

        【讨论】:

        • 如果您在 JSTL 中嵌套引号,则需要对最里面的引号使用单引号(在这种情况下,围绕 'testValue')。
        猜你喜欢
        • 2011-07-04
        • 2018-01-02
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        相关资源
        最近更新 更多