2

在我的应用程序中,我使用的是 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>

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

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

        <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 以便我可以有单个命令链接定义?
4

2 回答 2

1

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

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

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

然而,有一种可能的解决方法,可以将<c:set>它复制到请求范围中,以便它在 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'}" />
于 2012-09-12T13:01:26.963 回答
-1

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

于 2012-09-12T06:14:52.097 回答