<jsp:param name =“foo”>在包含的JSF页面中#{param.foo}不可用</jsp:param>

时间:2012-09-12 05:44:54

标签: jsp jsf parameters el jsf-1.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上找到了这个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需要复制命令链接定义才能更改样式类。我想知道,如果任何其他参数通过,那么它可能会增加重复代码。我的问题是

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

2 个答案:

答案 0 :(得分:1)

“按设计”失败。有关技术背景故事,另请参阅JSF issue 629,其摘要如下:

  

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

     
      
  • 主要是,如果没有这方面的话,这将不会在1.1中起作用   修复的效果,以使RI在较旧版本的Tomcat中工作。如   一旦删除该修复程序,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'}" />

答案 1 :(得分:-1)

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