Zaw Than oo
Zaw Than oo

Reputation: 9935

Can EL value pass one to another in JSF and Facelets?

I would like to pass the EL one JSF page to Facelets template. Facelets template just understand EL value as string value. How can I pass EL String to Faceltes Template?

page1.xthml

<ui:include ..../>
<ui:param actionBeanMethod="#{EmployeeActionBean.deleteEmplayee(emp)}>

page2.xthml

<ui:include ..../>
<ui:param actionBeanMethod="#{DepartmentActionBean.deleteDepartment(dep)}>

In comfirmationTemplate.xml

    <a4j:commandLink onclick="#{rich:component('confirmation')}.show();return false">
        <h:graphicImage value="/img/delete.png" />
    </a4j:commandLink>
    <a4j:jsFunction name="submit" action="#{actionBeanMethod}"/>                    
    <rich:popupPanel id="confirmation" width="250" height="150">
       <f:facet name="header">Confirmation</f:facet>
       <h:panelGrid>
          <h:panelGrid columns="2">
             <h:graphicImage value="/img/alert.png" />
         <h:outputText value="Are you sure?" style="FONT-SIZE: large;" />
          </h:panelGrid>
          <h:panelGroup>
             <input type="button" value="OK" onclick="#{rich:component('confirmation')}.hide();submit();return false" />
         <input type="button" value="Cancel" onclick="#{rich:component('confirmation')}.hide();return false" />
          </h:panelGroup>
       </h:panelGrid>
    </rich:popupPanel>

I would like to change action of a4j:jsFuction dynamically.

    When page1.xhtm is call,
    <a4j:jsFunction name="submit" action="#{EmployeeActionBean.deleteEmplayee(emp)"/>

    When page2.xhtm is call,
    <a4j:jsFunction name="submit" action="#{DepartmentActionBean.deleteDepartment(dep)"/>

Can it possible?

Upvotes: 1

Views: 589

Answers (1)

BalusC
BalusC

Reputation: 1108982

You can't pass method expressions as <ui:param> value. It accepts only value expressions.

You basically need to create a custom taghandler which re-interprets the value expression as a method expression. From the current open source JSF component/utility libraries, the OmniFaces <o:methodParam> is the only one which does exactly that.

<o:methodParam name="methodParam" value="#{actionBeanMethod}" />
<a4j:jsFunction name="submit" action="#{methodParam}" />

You only need to register the Facelets include as a Facelets tag file and use it as

<my:confirmationTemplate actionBeanMethod="#{EmployeeActionBean.deleteEmplayee(emp)}" />

An alternative is to use a composite component instead.

Upvotes: 1

Related Questions