【问题标题】:<jsp:param name="foo"> is not available by #{param.foo} in included JSF page<jsp:param name="foo"> 在包含的 JSF 页面中 #{param.foo} 不可用
【发布时间】:2012-09-05 02:25:45
【问题描述】:

在我的应用程序中,我使用的是 JSF 1.2。我不想使用 facelets taglib,所以我包含了一个使用 jsp:include 属性的 JSP。我想将一个变量传递给子页面,它将决定样式类的值。下面是 parent.jsp 的代码

<f:view>
...
    <f:subview id="navigation">
        <jsp:include page="/subpage/child.jsp">
            <jsp:param value="page9" name="pageName"/>
        </jsp:include>
    </f:subview> 
...
</f:view>

子 jsp 是

            <f:subview id="navigation">
    ...
                <t:commandLink id="page9" value="mylink" action="#{manageBean.someAction}" 
                  styleClass="#{param.pageName == 'page9'?'stepLinkActive':'stepLink'}" />
    ...
            </f:subview>

在上面的代码步骤中,ActiveLink 类没有被应用到 myLink。事实上 #{param.pageName} 值是空白的。

我在 SO 上找到了这个 link,如果我使用下面的命令链接,它就可以工作

        <c:if test='${param.pagename eq "page9"}'>      
            <t:commandLink id="page9"
                value="#{msgs['DICT.ISSUE_CONTROL.SPECIAL_INFO']} "
                action="#{bondIssueBean.gotoModifyPage9}" styleClass="stepLinkActive" />
        </c:if>
        <c:if test='${param.pagename ne "page9"}'>      
            <t:commandLink id="page9"
                value="#{msgs['DICT.ISSUE_CONTROL.SPECIAL_INFO']} "
                action="#{bondIssueBean.gotoModifyPage9}" styleClass="stepLink" />
        </c:if>

我有很多 commandLinks 需要复制 commandlink 定义来改变样式类。我想知道,如果任何其他参数被传递,那么它可能会增加重复代码。我的问题是

  1. 为什么 JSF EL 不能识别参数值 - ${param.paramName}?我也尝试使用 #{param['pageName']} 访问参数变量,但没有运气。
  2. 如何替换上面的 if..else 以便我可以有单个命令链接定义?

【问题讨论】:

  • 试试 JSP EL 表示法:styleClass="${param.pageName == 'page9'?'stepLinkActive':'stepLink'}".
  • @BalusC 我期待你至少会评论我的问题.. :) 谢谢。关于您的建议,我收到 jsp 错误“根据标记文件中的 TLD 或属性指令,属性 styleClass 不接受任何表达式”
  • 好的。 child.jsp 中真的有另一个&lt;f:subview id="navigation"&gt; 吗?应该只有一个。删除它。
  • 哦不..我只是使用单子jsp..我会删除它
  • 我发现了一个解释原因的旧错误报告。我已经发布了答案。

标签: jsp jsf parameters el jsf-1.2


【解决方案1】:

您可以使用 #{request.pageName} EL 表达式访问传递的参数。这是区分大小写的,传递的参数存储在 request 对象中。

【讨论】:

  • 问题 1:&lt;jsp:param&gt; 绝对不会出现在 #{request} 中。问题 2:#{request} 在 JSP 中不可用,而仅在 Facelets 中可用。这整个答案都是错误的。
【解决方案2】:

它“按设计”失败了。有关技术背景故事,另请参阅JSF issue 629,总结如下:

在对这个问题进行一些讨论后,我们将把这个问题标记为 WONTFIX 原因如下:

  • 主要是,如果不是侧面,这在 1.1 中是行不通的 使 RI 在旧版本的 Tomcat 中工作的修复效果。作为 删除该修复程序后,jsp:param 将不再起作用。
  • 1.2 的修复非常危险,可能会出现意外 添加它会产生副作用。

但是,在 &lt;c:set&gt; 的帮助下,有一个可能的解决方法,它将它复制到请求范围中,以便它也可以在 JSF EL #{} 中使用。

<c:set var="param_pageName" value="${param.pageName}" scope="request" />
<t:commandLink id="page9" value="mylink" action="#{manageBean.someAction}" 
    styleClass="#{param_pageName == 'page9' ? 'stepLinkActive' : 'stepLink'}" />

【讨论】:

  • PerRfEcT !!!:) 这解释了一切。解决方法解决了我的问题。再次感谢@BalusC!我只是喜欢阅读您在 SO 上的答案,因为它们的内容..
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多