当前位置: 首页 > 知识库问答 >
问题:

Primefaces在不使用命令按钮的情况下自动从selectOneMenu传递参数

洪飞扬
2023-03-14

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

何时使用valueChangeListener或F:Ajax侦听器?

  <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>
public void ShowListDeptAct(AjaxBehaviorEvent event) {
    department = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("department");
    listDeptActions();
}
public String listDeptActions() {
    //department = getDepartment();
    deptActions = facade.findByDept(department);
    return "DeptAction";
}

共有1个答案

蒋芷阳
2023-03-14

当您使用Ajax时,始终牢记视图的哪个部分需要提交给服务器,哪个部分需要更新作为响应,这一点非常重要。这是处理Ajax请求时的头号错误源。

对于 -标记,这是用属性processupdate指定的,在纯JSF 中使用属性executerender。这对于理解这些工作原理非常有帮助:理解PrimeFaces Process/Update和JSF f:Ajax execute/render属性

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

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

 类似资料:
  • 问题内容: 我已经进行了一些研究,发现的大多数示例都使用表单(显然用于用户输入)来收集数据,然后通过请求对象将其传递到另一个JSP页面。 我的问题是:如果未在HTML 标记中设置参数,是否可以在JSP页面之间传递参数? 问题答案: JSP页面无法分辨手动构造的GET URL之间的区别,例如: ,而不是类似的内容: 可以通过或 那是你要的吗

  • PrimeFaces的CommandButton允许指定图标: 但是,我需要根据JSF托管bean属性启用/禁用图标。 我试过了 这适用于选择不同的图标,但不允许完全禁用图标(即,在没有属性的情况下获得相同的渲染效果)。我可以在中返回一个空字符串,但PrimeFaces仍将渲染额外的

  • 我试图在一个for循环中创建按钮。在每个循环中,将i计数值作为命令值中的参数传递出去。因此,当从命令值调用函数时,我可以判断哪个按钮被按下并相应地操作。问题是,假设len是3,它将创建3个按钮,标题为“游戏1”到“游戏3”,但是当按下任何一个按钮时,打印值总是2,最后一次迭代。所以看起来按钮是作为单独的实体制作的,但是命令参数中的i值似乎都是一样的。下面是代码: 有没有办法在每次迭代时获取当前的i

  • 我可以使用此命令添加Jfram对象 然而,当我在一个单独的方法中编写这个时,我无法添加,因为“this”方法位于该对象内。 如何选择jframe而不是“this” 我不想创建新的jframe,因为已经有了

  • 问题内容: 我有2个按钮,分别名为“ ButtonA”,“ ButtonB”。如果要单击任何按钮,我希望程序打印“ hello,ButtonA”和“hello,ButtonB”。我的代码如下: 当我单击ButtonA时,会发生错误。 我理解此错误,但是如何将ButtonA的文本传递给lambda? 问题答案: 这应该工作: 有关更多信息,请查看Tkinter回调

  • 我使用Primeface 4.0和jsf 2.0。 我试图调用托管bean的一个方法,在旋转木马中的Primefaces commandbutton中,但它不起作用。该按钮似乎无法调用该方法。什么都没发生。。。 所以,我一直在寻找,但我找不到任何能帮助我解决这个问题的东西。 下面是我的代码: 页xhtml 以及管理bean的方法 OBS:May bean的范围是ViewScoped。 请 谢谢