PHP的变量变量在JSTL中是模拟的

时间:2014-06-19 20:31:41

标签: java jsp jstl el

在PHP中,我们可以在Variable variables in PHP的帮助下执行以下操作:

$privateVar = 'Hello!';
$publicVar = 'privateVar';
echo $$publicVar; // Hello!

假设我们有以下Java代码:

request.setAttribute("privateVar", "Hello!");
request.setAttribute("publicVar", "privateVar");

我已尝试以下操作但发生错误。

${${publicVar}}

有没有人知道如何通过在JSP(JSTL)中仅使用privateVar来获取publicVar的值?

更新1

我有一个自定义标记,如果对象foo没有字段bar,则可以打印消息。 我知道我必须在案例中捕获异常,但我不想在JSP中处理异常。我想只在CustomTag文件中执行此操作。

<%-- JSP file --%>
<ctf:tagName varName="foo.bar" />

<%-- CustomTag file --%>
<%@ attribute name="varName" required="true" rtexprvalue="true"%>
<c:catch var="exception">
    <c:set var="valX" value="${${varName}}" scope="page"/>
</c:catch>
<c:if test="${exception != null}">Can't find getter for the VAR in the OBJ.</c:if>

更新2

JB Nizet 给了我答案,以下效果很好! :)

<c:set var="privateVar" value="Hello!" />
<c:set var="publicVar" value="privateVar" />
${pageScope[pageScope.publicVar]}

2 个答案:

答案 0 :(得分:0)

基础知识:

那不是JSTL而是Expression Language。而且您应该只使用一个${}评估程序。代码是:

${publicVar}

更多信息:


解决您的问题:

表达语言不允许这样做。您不能在任何范围(页面,请求,会话,应用程序)中拥有私有属性,因此您最多可以使用不同的名称设置属性两次但值相同。但是你可能会注意到,这没用。

答案 1 :(得分:0)

我不认为您可以像在PHP中一样直接执行此操作。相反,您可以更改属性以使用privateVar的值而不是名称,如下所示:

String privateVar = "Hello!";
request.setAttribute("privateVar", privateVar);
request.setAttribute("publicVar", privateVar);

这使您可以访问两个名称下的值,我认为这是您最接近的名称。如果您最终要在JSP上使用privateVar,则无需在请求中放置属性publicVar

最终你可能想重新考虑这里的设计,因为它在Java中并没有真正起作用。