Primefaces自动从selectOneMenu传递参数,而无需使用命令按钮

时间:2015-08-04 09:27:15

标签: ajax jsf jsf-2 primefaces

我想在不使用任何按钮或链接的情况下选择PF selectOneMenu中的值后立即从辅助bean调用操作。我已经看过这个问题了:

When to use valueChangeListener or f:ajax listener?

虽然非常有用,但我无法应用建议的业务逻辑,该逻辑只允许根据菜单中的选定值动态调用操作。我知道如何使用ajax在两个菜单之间呈现更改的值(其中一个菜单的值被更改)。上述问题中讨论的选项在我的案例中似乎不起作用,这使我更深入地了解EL和支持bean方法以更好地理解这些概念。

我尝试了两种方法来动态处理我的菜单参数。第一种是在EL中使用valueChangeListener ayttribute:

  <p:selectOneMenu id="Ctl" value="#{actionBean.department}"
    valueChangeListener="#{actionBean.ShowListDeptAct(event)}" onchange="submit()">                                                              
   <f:selectItem itemLabel="Dept A" itemValue="Dept A"/>
   <f:selectItem itemLabel="Dept B" itemValue="Debt B"/>
   <f:selectItem itemLabel="Dept C" itemValue="Dept C"/>
</p:selectOneMenu>

bean方法:

public void ShowListDeptAct(ValueChangeEvent event) {
    department = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("department");
    listDeptActions();
}
public String listDeptActions() {
    //department = getDepartment();
    deptActions = facade.findByDept(department);
    return "DeptAction";

这只会刷新页面,而bean方法甚至无法运行。

第二种方法是使用p ajax标签:

<p:selectOneMenu id="Ctl" value="#{actionBean.department}">
                                <a href="ActionMaster.xhtml"></a>
                                <f:selectItem itemLabel="Dept A" itemValue="Dept A"/>
   <f:selectItem itemLabel="Dept B" itemValue="Debt B"/>
   <f:selectItem itemLabel="Dept C" itemValue="Dept C"/>

 <p:ajax  listener="#{actionBean.ShowListDeptAct}"  oncomplete="submit()"/>
                            </p:selectOneMenu>

bean方法:

public void ShowListDeptAct(AjaxBehaviorEvent event) {
    department = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("department");
    listDeptActions();
}
public String listDeptActions() {
    //department = getDepartment();
    deptActions = facade.findByDept(department);
    return "DeptAction";
}

这导致了完全相同的行为,这让我觉得我的问题可能是我写作听众的错误。

EL应该将所选部门的名称传递给以下支持bean方法,这些方法将显示所选部门的数据的dataTable。支持bean方法:

在阅读了PF用户指南和这里的一些问题后,我不确定如何传递正确的EL或正确的支持bean方法来实现这一点。会很感激一些指导。谢谢!

1 个答案:

答案 0 :(得分:1)

当您使用Ajax时,始终牢记需要将哪个部分视图提交到服务器以及需要将哪个部分更新为响应非常重要。这是处理Ajax-Requests时的头号错误源。

对于process - 标记,这是使用属性update<f:ajax>指定的,在纯JSF execute中属性render和{{1使用。 阅读以了解这些工作方式非常有用: Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes

在您的第一次尝试中,您尝试从请求参数映射中获取参数,这不是一个好主意,因为每个请求参数的键将是发送的组件的ID。您必须知道组件的id才能获得值。如果可能,建议不要在服务器端使用组件ID,因为当封装命名容器发生更改并因此不可靠时,它们可能会更改。这也严重干扰了视图和程序逻辑的分离。 最好的尝试是将组件的值绑定到服务器端bean上的变量,就像您已经使用它们一样。

在第二次尝试中,process - 标记中的默认值<p:ajax>为空,因此没有组件的值发送到服务器。如果你写           并将<p:selectOneMenu>的值绑定到服务器上的变量,您可以使用doAction() - 方法中部门的值。