我们正在从jsf 1.2升级到jsf 2。 我们正在使用apache myfaces 2.1和富面4.3。
以下是xhtml代码:
迁移之前:
<h:selectBooleanCheckbox id="comp1" value="#{bean.select}">
<a4j:support event="onclick" ajaxSingle="true" actionListener="#{bean.processInput}" reRender="compId">
<f:param name="name" value="paramValue"/>
</a4j:support>
</h:selectBooleanCheckbox>
我们传递一个参数并在actionListener方法中接受参数:(String)context.getExternalContext().getRequestParameterMap().get("name1");
迁移后:
<h:selectBooleanCheckbox id="comp1" value="#{bean.select}">
<a4j:ajax event="click" listener="#{bean.processInput}" execute="@this" render="compId"/>
</h:selectBooleanCheckbox>
我想将参数传递给bean.processInput方法,该方法具有以下签名:
public void processInput(AjaxBehaviorEvent event){
根据这篇文章Issues in passing parameter in f:ajax,我们无法使用<f:param>
(它不起作用
另外)我们没有使用EL 2.2来排除方法签名中的传递参数。
由于我们不能使用context.getApplication()。evaluateExpressionGet由于我们的xhtml页面中的约束只有选项可用
使用<a4j:param name="" value="" assignTo=""/>.
但是这需要在bean中定义一个需要代码更改的变量。
所以我的问题是我们可以在第二种情况下将参数从UI传递给侦听器而不需要更改代码。
答案 0 :(得分:5)
您可以像这样使用f:attribute
:
<h:selectBooleanCheckbox id="comp1" value="#{bean.select}">
<a4j:ajax event="click" listener="#{bean.processInput}" execute="@this" render="compId"/>
<f:attribute name="name" value="paramValue" />
</h:selectBooleanCheckbox>
并在你的bean中使用它:
public void processInput(AjaxBehaviorEvent event)
{
System.out.println(event.getComponent().getAttributes().get("name"));
}
答案 1 :(得分:0)
确保f:attribute组件不是a4j:ajax的子组件。 它应该是h:selectBooleanCheckBox的直接子组件,如果不是侦听器则不会触发。