14

我在 JSP 中看到了如下代码

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

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

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

干杯,唐

4

5 回答 5

17

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

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

代码中的代码<%= %>返回一个布尔值,因此它将打印字符串“true”或“false”,这正是<c:if>标签要查找的内容。

于 2008-09-18T15:42:46.727 回答
11

你也可以使用类似的东西

<c:if test="${ testObject.testPropert == "testValue" }">...</c:if>
于 2008-12-05T00:41:47.080 回答
4

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

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

然后将执行 c:if 标签。

于 2008-09-18T15:38:02.463 回答
2

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

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

于 2008-09-18T15:15:12.970 回答
0

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

于 2008-09-18T15:37:18.270 回答