【问题标题】:PrimeFaces actionListener not calling beanPrimeFaces actionListener 不调用 bean
【发布时间】:2018-03-22 19:46:22
【问题描述】:

我正在尝试模仿PrimeFaces Dialog example。由于某种我无法找到的原因,我的 PrimeFaces 按钮似乎没有调用所需的托管 bean 方法:

            <h:form>
                <p:commandButton value="Open" icon="ui-icon-extlink" actionListener="#{myController.createDialog()}" />
            </h:form>

托管 bean:

@Named(value = "myController")
@ViewScoped
public class MyController implements Serializable {

    public void createDialog() {
        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%");
...

打印语句永远不会执行,就像监听器不工作一样。当我单击按钮时,没有响应。没有后端错误,没有 JS 错误,什么都没有。我只看到 some 请求已完成,因为我在用户通过授权层时登录。所以发生了一些事情,但似乎默默地失败了。

我尝试过的:

  • 将按钮移动到页面中的其他位置
  • 使用 id:

    <p:commandButton id="ex" value="Open" icon="ui-icon-extlink" actionListener="#{myController.createDialog()}" />
    <h:message for="ex" />
    
  • 删除ViewScoped

  • 在方法中需要javax.faces.event.ActionEvent

    public void createDialog(ActionEvent event) {
        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%");
    
  • 更改方法签名

    action="#{myController.createDialog(5)}"
    

    public void createDialog(int s) {
        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%");
    
  • 我什至尝试创建一个WEB-INF/faces-config.xml(我不希望这样做,并且根据PrimeFaces documentation 我不需要它):

      <?xml version='1.0' encoding='UTF-8'?>
       <faces-config version="2.2"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    
              http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
    <application>
        <action-listener>org.primefaces.application.DialogActionListener</action-listener>
        <navigation-handler>org.primefaces.application.DialogNavigationHandler</navigation-handler>
        <view-handler>org.primefaces.application.DialogViewHandler</view-handler>
    </application>
    
    <lifecycle>
        <phase-listener>org.primefaces.component.lifecycle.LifecyclePhaseListener</phase-listener>
    </lifecycle>
    

我检查过的其他答案是:123456


显然在PrimeFaces中使用actionListeners is not as correct as it should be... 有没有其他方法可以使用PrimeFaces组件?

【问题讨论】:

  • 我不确定,但我总是在我的 ActionListeners 中添加一个 ActionEvent 参数...会不会是问题所在?
  • 我认为这在 PrimeFaces 中没有必要......无论如何,我尝试添加 javax.faces.event.ActionEvent 并且它也不起作用

标签: jsf primefaces


【解决方案1】:

此对话框框架代码适用于我:

index.xhtml

<p:commandButton id="openDialogButton" value="open dialog" action="#{myBean.openDialog('origin')}">
    <!-- dialogReturn event: data could be passed, see page 587 in PF 6.1 manual. -->
    <p:ajax event="dialogReturn" listener="#{myBean.doSthOnDialogReturn}"/>
</p:commandButton>

myDialogPage.xhtml

<p:commandButton id="closeButtonDialog" value="close dialog"
   action="#{myBean.closeDialog('false')}"/>

<p:commandButton id="closeButtonDialog2" value="close dialog 2"
    action="#{myBean.closeDialog('true')}"
    ajax="false" validateClient="true"/>

注意:示例显示如何从对话框传递参数。您还可以注意到,第一个按钮确实只是返回,而第二个按钮首先进行验证。我认为这些东西很有用。

myBean.java

public void openDialog(String origin) {
    RequestContext.getCurrentInstance().openDialog("myDialogPage",
    options, null);
}

public void closeDialog(Boolean param) {
    RequestContext.getCurrentInstance().closeDialog(param);
}

public void doSthOnDialogReturn(SelectEvent event) {
    if ((Boolean) event.getObject()) { // retrieve param value
        doSth();
    }
}

WEB-INF/faces-config.xml

<application>
    <action-listener>
        org.primefaces.application.DialogActionListener
    </action-listener>

    <navigation-handler>
        org.primefaces.application.DialogNavigationHandler
    </navigation-handler>

    <view-handler>
        org.primefaces.application.DialogViewHandler
    </view-handler>
</application>

【讨论】:

  • 出于某种原因,这对我不起作用。我的faces-config.xml 和你的一样。我将p:commandButton 放在了h:form 内的索引中(我也在外面尝试过),并且从未调用过myBean.openDialog()... 肯定还有其他需要
  • 如果你使用我的例子,有一个错误,缺少参数所以而不是myBean.openDialog() 调用myBean.openDialog('origin') 是正确的。实际上,我想您已经注意到了……您使用的是哪个版本的 PrimeFaces?我用的是 6.1。
  • 我尝试使用 String 和 int 作为参数(我之前编辑过)。它是 6,2,最后一个。
【解决方案2】:

最后我看到了一些错误:

SEVERE - /page.xhtml @159,146 actionListener="#{myController.createDialog()}": Target Unreachable, identifier 'myController' resolved to null

启用错误消息显示的技巧是在faces-config.xml 中添加以下内容:

<factory>
    <exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
</factory>

检查this 后,我意识到我的beans.xml 文件不知何故被删除了(??)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多