gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:23:54 26 4
gpt4 key购买 nike

我有这个简单的 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!!!");
}
}

所以我的期望是每当我在 inputText 字段中键入内容时看到文本 Foo bar action being executed,但事实并非如此。我错过了什么?

编辑:为什么我会期待这种行为?我正在读书Core JavaServer Faces并且在书中指出:

JSF 2.0 splits the JSF life cycle into two parts: execute and render.

Execute consists of: Restore View -> Apply Request Values -> Process Validations -> Update Model Values -> Invoke Application

When JSF executes a component on the server, it:

-Converts and validates the component 's value (if the component is an input).

-Pushes valid input values to the model (if the component is wired to a bean property).

-Executes actions and action listeners (if the component is an action).

所以在这里,myCommandButton 应该被执行,不是吗?一个组件的执行意味着它的 Action 被执行?

编辑 #2

此引文来自JavaServer Faces Complete Reference

If listener is not specified, the only action that will be invoked during the Invoke Application phase will be the one that corresponds to an ActionSource component listed in the execute attribute.

据我了解,在我的例子中,我有一个组件实现了ActionSource接口(interface)(myCommandButton),应该执行这个组件的action属性。但事实并非如此?

最佳答案

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

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

如果按钮在execute中指定属性和 JSF 在处理生命周期期间确定实际上未提交按钮值(即它在 HTTP 请求参数映射中完全不存在),那么 JSF 根本不会在应用请求值阶段对操作事件进行排队。因此在调用应用程序阶段不会调用任何东西。

<f:ajax>事件被触发,它实际上是作为 Action 源的封闭组件。因此,您应该在其上 Hook 所需的 Action 监听器。您可以使用 listener <f:ajax> 的属性为此。

<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");
}

// ...
}

另见:

关于ajax - JSF Ajax 调用应用程序未执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38026324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com