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

JSF Ajax调用应用程序未执行?

秋建义
2023-03-14

我有一个简单的facelets页面:

<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>Index</title>
</h:head>
<h:body>
    <h:form>
        <h:inputText id="firstname" value="#{fooBar.firstname}">
            <f:ajax event="keyup" render="echo" execute="myCommandButton"/>
        </h:inputText>
        <h:commandButton value="Submit" action="#{fooBar.fooBarAction()}" id="myCommandButton"/>
    </h:form>
    <br/>
    <h:outputText id="echo" value="#{fooBar.firstname}"/>
</h:body>
</html>

Foobar bean如下所示:

@ManagedBean
@ApplicationScoped
public class FooBar {

    private String firstname;

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getFirstname() {
        return firstname;
    }

    public void fooBarAction() {
        System.out.println("Foo bar action being executed!!!");
    }
}

-将有效的输入值推送到模型(如果组件连接到bean属性)。

-执行操作和操作侦听器(如果组件是操作)。

所以在这里,应该执行myCommandButton,不是吗?而组件的执行意味着要执行它的操作?

共有1个答案

周学义
2023-03-14

execute属性基本上告诉JSF在回发期间在JSF生命周期中处理哪些组件。即。它基本上告诉JSF它必须为哪些组件执行应用请求值、处理验证、更新模型值和调用应用程序阶段。应用请求值阶段将收集(解码)提交的HTML表单(输入和按钮)值。验证阶段将对提交的值运行转换/验证。update model values阶段将在backing bean中设置提交/转换/验证值。调用应用程序阶段将执行提交的操作。注意,关键是JSF将基于提交的HTML表单值来完成这些操作。

换句话说,execute属性完全是服务器端的。它不是你所期望的客户端。您似乎期望它告诉webbrowser提交指定的组件,就像您正在单击它一样。这不是事实。按钮值仅在实际被按下/单击/提交时通过JSF生命周期进行处理。

如果在execute属性中指定了按钮,并且JSF在处理生命周期期间确定按钮值实际上没有提交(即HTTP请求参数映射中完全没有该值),那么JSF将在apply request values阶段完全不对动作事件进行排队。因此在调用应用程序阶段不会调用任何内容。

<h:form>
    <h:inputText id="firstname" value="#{fooBar.firstname}">
        <f:ajax event="keyup" listener="#{fooBar.keyupListener}" render="echo" />
    </h:inputText>
    <h:commandButton value="Submit" action="#{fooBar.fooBarAction}" id="myCommandButton"/>
</h:form>
@ManagedBean
@RequestScoped
public class FooBar {

    private String firstname;

    public void keyupListener() {
        System.out.println("Keyup listener being executed");
    }

    public void fooBarAction() {
        System.out.println("Foo bar action being executed");
    }

    // ...
}
  • 了解PrimeFaces进程/更新和JSF f:Ajax执行/呈现属性
  • JSF如何处理动作侦听器?
 类似资料:
  • 当应用程序被强制退出时,似乎不会调用函数。我的印象是,无论应用程序处于何种状态,都会调用该函数,但似乎只有在应用程序已经在后台运行时才会调用该函数。如果应用程序尚未使用新的iOS 7远程通知后台模式运行,是否有办法在后台唤醒该应用程序?

  • 嗨,我得到了这个错误,当我试图运行反应应用程序在我真正的Android设备上通过:

  • 我们正在开发一个plone界面来使用来自Web应用程序的REST API服务。用户登录plone并能够访问REST API 问题1)我需要参考哪些Plone编程文档进行设计 查询:2)我需要参考学习的不同技术有哪些 请参阅随附的建议解决方案框图。 .

  • 我正在使用Firebase,并测试在应用程序处于后台时从服务器向应用程序发送通知。通知发送成功,它甚至出现在设备的通知中心上,但是当通知出现或者即使我单击它,我的FCMessagingService中的onMessageReceived方法也从未被调用。 当我在应用程序处于前台时进行测试时,调用了onMessageReceived方法,所有工作都很好。该问题发生在应用程序在后台运行时。 这是有意为

  • 我清楚地阅读了很多关于firebase推送通知行为的文档。当我的应用程序位于后台时,我可以在系统托盘上看到通知,但当应用程序位于前台时,不会触发“收到消息时”的回调。我可以看到我的应用程序上收到消息的日志。我试着用数据负载和没有数据负载的应用服务器进行通话。我的应用服务器正在使用php脚本来触发fcm API。下面是我正在使用的php脚本 以下是我在我的Android应用程序中使用的服务

  • 我试图完成的是解析来自Remotemessage的传入数据,并根据自定义标记对其进行不同的处理。例如,如果数据映射包含一个名为“my_custom_tag”的字段,我希望完全覆盖弹出的标准firebase消息并编写一个自定义消息。 问题是,当应用程序在后台运行时,我放入onMessageReceived的任何代码都不会被触发。当应用程序在前台运行时,它工作得很好,但如果应用程序在后台,它将不会检测