为什么第一个 AJAX 调用会重置我的视图参数?

2023-12-31

我无法找出为什么第一个 ajax 调用会导致再次调用我的视图参数的 setter,而每个后续调用都不会再次调用该 setter。

我有以下简单的视图 bean:

package test;

import java.io.Serializable;

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class TestController implements Serializable {

    private static final long serialVersionUID = 1L;

    String param;

    public String getParam() {
        return param;
    }

    public void setParam(String param) {
        System.out.println("param set to " + param);
        this.param = param;
    }
}

我还有一个非常基本的 .xhtml 页面,其中仅包含一个按钮:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">

<h:head></h:head>

<f:metadata>
    <f:viewParam id="param" name="param" value="#{testController.param}"/>
</f:metadata>

<h:form id="form">
  <h:commandButton id="button" value="Test">
    <f:ajax execute="@this"></f:ajax>
  </h:commandButton>
</h:form>

</html>

现在,当测试此页面时,我调用https://localhost:8443/test/test.xhtml?param=foo在我的浏览器中。正如我所料,日志声称视图参数已设置为“foo”。现在我陷入困境的是,当我第一次按下按钮时,日志再次声称 param 被设置为“foo”,证明设置器被再次调用。我不明白为什么ajax请求再次设置视图参数。让我感到困惑的是,任何后续的按钮单击都不会再次调用视图参数的设置器,特别是当第一次和所有后续调用看起来完全相同时。

所以我的问题是:

  • 为什么视图参数的 setter 在第一个 ajax 调用时被调用,但在后续调用中不被调用?
  • 有什么办法可以阻止这种行为吗?

我正在 Wildfly 19 上运行该示例,该示例使用 Mojarra 2.3.9.SP06(如果有任何帮助的话)。

EDIT 1:为了更清楚地说明,为什么这个问题与ajax调用后f:viewParam丢失 https://stackoverflow.com/questions/16734821。另一个问题询问为什么视图参数在第一次 ajax 调用后丢失以及如何始终发送它们。这是一个完全相反的问题:为什么视图参数总是第一次发送以及如何防止这种情况?

另一个问题的答案声称可以打电话FacesContext.getCurrentInstance().isPostback()。我知道这一点。虽然它当然可以在检测 ajax 调用的意义上起作用,并且使我能够不重置视图参数,但在这种情况下它不会prevent首先阻止调用视图参数的设置器。这就是我理想中想要达到的目标。我还愿意至少了解为什么在第一次 ajax 调用时对视图参数进行不同的处理。我想从概念上来说有些东西我还没有理解。

EDIT 2:我在下面提交了错误报告https://github.com/eclipse-ee4j/mojarra/issues/4714 https://github.com/eclipse-ee4j/mojarra/issues/4714.


您在概念上没有任何误解。我也不明白。

我目前仍在调查为什么在第一个且仅在第一个 ajax 回调上调用 setter 的原因。我本来期望它总是被调用或永远不会被调用。 @fuggerjaki61 的分析在某种程度上是正确的方向,但它似乎与围绕 null 或未提交值的更大问题有关。

可以在最简单的解决方案中阅读大量信息:OmniFaceso:viewParam https://showcase.omnifaces.org/components/viewParam代替f:viewParam

And use

<o:viewParam id="param" name="param" value="#{testController.param}"/>

(不要忘记声明xmlns:o="http://omnifaces.org/ui",但是自从你should;-) 无论如何都在使用 OmniFaces,我认为它已经存在了:-) )

从我读到的所有信息中我认为也许设置

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

也可以解决这个问题,但事实并非如此。在第一次 ajax 调用时,仍然使用旧值调用 setter,而在第二次及后续调用中,如果未提交,则仅显式将该值设置为 null。也不是你想要的。

更多细节

@fuggerjaki61 的解决方案可能有效,但我不确定其他情况下的后果,因为我还可以修复这个问题通过改变其他事情但打破其他情况。如果我尝试比较基础知识o:viewParam with f:viewParam提交的值(如@fuggerjaki61 在另一个答案中提到的)确实发挥了作用。它保存在本地o:viewParam

@Override
public String getSubmittedValue() {
    return submittedValue;
}

@Override
public void setSubmittedValue(Object submittedValue) {
    this.submittedValue = (String) submittedValue; // Don't delegate to statehelper to keep it stateless.
}

而在 f:viewParam 中,它被读取并设置到 stateHelper

@Override
public Object getSubmittedValue() {
    return getStateHelper().get(PropertyKeys.submittedValue);
}

/**
 * PENDING (docs)  Interesting that submitted value isn't saved by the parent
 * @param submittedValue The new submitted value
 */
@Override
public void setSubmittedValue(Object submittedValue) {
    getStateHelper().put(PropertyKeys.submittedValue, submittedValue);
} 

阅读这里的java文档,我个人会说,你的问题中的“为什么”对我来说看起来像是某个地方有一个错误(或遗漏),尚未确定,但要么是意外地,要么是通过明确解决的o:viewParam

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么第一个 AJAX 调用会重置我的视图参数? 的相关文章

  • 如何检索 jquery $.ajax 对象的responseJSON属性[重复]

    这个问题在这里已经有答案了 我有这个 JavaScript ajax ajax type GET url DBConnect php data dataType json success function data error functi
  • 表单未使用 AJAX 提交

    再次更新 如果有人关心的话 我之前发布的解决方案由于某种原因停止工作 我在 ajax 请求中包含了 beforeSend 并将验证表单的 js 部分粘贴到其中 现在就像一个魅力 form on submit function e e pre
  • AJAX jQuery.load 与 jQuery.get

    使用 jQuery 进行 AJAX 调用时 什么时候应该使用 load url data callback 方法 什么时候应该使用 jQuery get url data callback type 方法 首先这两个功能是完全不同的 loa
  • javax.faces.FacesException 无法找到 CDI BeanManager [重复]

    这个问题在这里已经有答案了 我在用 目标运行时间 野蝇14 0 动态网页模块版本 4 0 配置 动态网络模块4 0 爪哇1 8 JavaServer Faces 2 3 JSF 能力 JSF 配置文件 WEB INF faces confi
  • XMLHttpRequest、jQuery.ajax、jQuery.post、jQuery.get 之间有什么区别

    我如何找出最适合某种情况的方法 有人可以提供一些例子来了解功能和性能方面的差异吗 XMLHttpRequest是原始浏览器对象 jQuery 将其包装成更可用和简化的形式以及跨浏览器一致的功能 jQuery ajax是 jQuery 中的通
  • 在 Django 中处理 ajax json 对象 - 'QueryDict' 对象没有属性 'read' 错误

    我正在尝试解析 Django 视图中的 json 对象 该对象已通过 ajax 通过 post 方法从客户端传递过来 JS post update vendor merchandise types JSON stringify json o
  • Jquery:排除元素

    我有以下代码 document ready function a rel each function this qtip content text img class middle src i icon processing gif alt
  • JSF EL:instanceof 已保留但尚未实现?

    我在 JSF EL 中找到了 instanceof 运算符 但在使用时它会抛出异常 明明是保留了却没有执行 如果还没有比我当前使用的 JSF 1 2 更新的版本 那么它 可能 什么时候可用 关键词instanceof确实在 EL 中保留 参
  • 通过ajax POST提交两次表单

    插入到mysql using php通过文件调用AJAX 前insert语句php代码执行select查询到查找重复记录并继续insert statement Issue 从ajax调用php文件时 它执行了两次并得到作为重复记录的响应 好
  • C# 中服务器端代码的 ModalPopupExtender

    我做了一场噩梦 将 ModalPopupExtender 添加到表单很容易 您将其放在上面并告诉它两个所需的控件参数 PopupControlID MyModalPanel TargetControlID ButtonToLoadIt 它工
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 在对 VSTS API 的 Ajax 调用中使用 OAuth Bearer Token 而不是 PAT

    我已成功让我的 ASP NET MVC5 应用程序在服务器端用 C 读取和写入 VSTS 工作项 然而 为了获得最佳的用户体验 我真的想使用 Ajax 进行一些更新 我已经能够使用在我自己的帐户下创建的个人访问令牌 PAT 完美地完成此操作
  • 对话框不会关闭 primefaces

    我的其中一个页面上有一个对话框 打开很好 如果您使用页面上的按钮 它会关闭 效果很好 但是 如果您尝试 x 退出对话框 它将不会关闭 我相信这与我在对话框上有一个输入字段有关 但我不确定 如果这是一个骗局 我深表歉意 我找不到类似的帖子
  • AJAX 发送数据到 Node.js 服务器

    我尝试使用 AJAX 将数据发送到 Node js 服务器 但不断遇到同样的问题 即接收问题 这是客户端 JavaScript AJAX 代码 var objects function return new XMLHttpRequest f
  • 如何使用 AJAX/jQuery 显示打印内容?

    所以我试图理解整个 AJAX jQuery 的事情 现在 当我单独运行这个 PHP 脚本时 我必须等待并观察轮子旋转 直到循环完成然后加载 while row mysql fetch array res postcode to storm
  • 使用 Ajax 在输入时提交 Textarea,然后渲染部分内容而不刷新整个页面

    目前我正在尝试通过 JS 和 Ajax 在没有提交按钮的情况下发表评论 并且它有效 问题是当帖子提交时 页面重新加载到 post id comment页面 我希望它呈现部分内容 而不是刷新整个页面或将我带到不同的页面 我对 JS 不熟悉 任
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • FormData 中的 Blob 为 null

    我正在尝试通过远程 API 通过 ajax 在 android 中发送创建的照片 我在用着相机图片背景 https github com an rahulpandey cordova plugin camerapicturebackgrou
  • 添加选项以选择框而不用 Internet Explorer 关闭该框?

    我正在尝试构建一个包含多个下拉选择框的网页 这些下拉选择框在首次打开时异步加载其选项 这在 Firefox 下工作得很好 但在 Internet Explorer 下则不然 下面是我想要实现的目标的一个小例子 基本上 有一个选择框 ID 为
  • Ajax 如何在 JSF 上工作?

    我是 JSF 新手 但我对 ASP NET 及其 Ajax 功能有一些经验 我知道 JSF 有一些 Ajax 标签可以使用 Ajax 完成一些任务 但我想知道它是如何使用 Ajax 的 它使用 ASP NET 中的 ScriptManage

随机推荐

  • 性能计数器与 ETW

    性能计数器是 ETW 的一部分吗 如果不是 两者有什么区别 性能计数器和 ETW 是不同的技术 性能计数器不通过 ETW 公开 基本区别 性能计数器提供有关系统行为的高级指标 例如计时器 读取的字节和分配的对象 而 ETW 是一种诊断跟踪和
  • 设置字节数组中的特定位

    我想知道如何设置 16 字节数组 128 位 中的特定位 例如 如果我想设置数组中的第 9 位 我期望 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 如果我想设置第 125 位 00 00
  • 绘图时格式化 pd.Interval 类别

    我有类似的问题 question https stackoverflow com questions 53619746 python float argument must be a string or a number not panda
  • 将 pygame.Surface() 传输到 pygame.OPENGL 显示上

    如何将 pygame Surface 对象 blit 到 pygame OPENGL 显示并翻转显示 import pygame pygame init RES 640 480 display pygame display set mode
  • 使用 xgettext 从 JavaScript 中提取译者注释(在 Python 模式下)

    我有一个运行良好的命令 可以从我的所有 js 和 html 文件 只是下划线模板 中提取字符串 然而 它似乎不适用于翻译评论 例如 我的 js 文件之一中有此内容 TRANSLATORS The word manual stands for
  • QTextEdit背景颜色也改变滚动条的颜色

    我希望应用程序中的 QtextEdit 为绿色 因此我将样式表设置为 background color rgb 109 255 99 然而 这也会改变滚动条的背景颜色 即使当我在文本编辑中单击鼠标右键时 显示的菜单也是绿色的 这不是我所期望
  • 根据索引从 numpy 数组中获取子数组

    我有一个 numpy 数组向量 我想根据索引获得一个子集 import numpy as np input np array 1 2 3 4 5 6 7 8 9 10 index np array 0 1 0 0 0 0 1 0 0 1 获
  • 在Python中有效检查大量对象的欧几里德距离

    在路线规划算法中 我尝试根据到另一个节点的距离对节点列表执行过滤器 我实际上是从粗略的场景图中提取列表 我使用术语 单元 来指代简单场景图中的体积 我们从中获取了彼此靠近的节点列表 现在 我将其实现为 SSCCE version of th
  • .sass-cache 中的文件有什么用?

    第一次使用 Sass 后 我注意到它留下了一个目录 sass cache在我的工作目录后面 我似乎无法使用其中的文件 在散列子目录中 那么这个目录是做什么用的 我可以将它用作 VCS 之类的吗 删除安全吗 来自文档 http sass la
  • 可以粘贴 19 小时前的 Package-Lock.json 来修复“ValidationError:进度插件无效选项”(Vue 3)吗?

    我正在使用 Vue 3 并且 19 小时前我将项目的一个运行良好的版本推送到了 GitHub 大约5小时后 进入时出现以下问题npm run serve这导致了这些信息 gt email protected cdn cgi l email
  • 我真的需要指定 .gitattributes 中的所有二进制文件吗

    我读了Git 文档 https help github com en articles configuring git to handle line endings这表明我可以显式地将某些文件设置为文本 因此它们的行结尾会自动更改或作为二进
  • 如何在Python 3.7中构建一个简单的RSS阅读器?

    我在 Python 上构建了一个简单的 RSS 阅读器 但它不起作用 另外 我想获取每个帖子的特色图片源链接 但我没有找到方法 它向我显示错误 回溯 最近一次调用最后一次 文件 RSS reader py 第 7 行 在 feed titl
  • Python list.remove() 跳过列表中的下一个元素

    Python 但不会编程 这里是新手 我正在使用列表进行编程 并遇到了一个有趣的问题 width 2 height 2 Traverse the board def traverse x y The four possible direct
  • CSS 规则未被覆盖

    我遇到了一个奇怪的问题 CSS 规则似乎无法在 Mac 上的 Safari Chrome Firefox 上正确应用 给出以下 html 代码 table border 1 tr td Hello td tr table 然后以下 css
  • 正则表达式用值替换所有逗号

    我有一个如下所示的字符串 Doe John A 姓氏 名字 中间名首字母 我正在尝试编写一个正则表达式 将字符串转换为 Doe John A 但是 我必须考虑到该字符串的所有空格 因此 Doe John A 仍会转换为 Doe John A
  • 如何将分段计时器添加到 Google 表单中进行学校测验? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们使用 Google Forms 进行了英语语言测试 该测试分为 3 个部分 我们希望能够为每个部分设置时间 例如 A 部分 10
  • 在设备和应用商店上刷新 SQLITE3(核心数据)

    我有一个利用 Core Data SQLITE3 的应用程序 可以在模拟器中完美运行 但是我不明白如何更新设备上的数据库 我猜这与应用程序商店中的相同 我从应用程序中的 txt 文件更新数据库并创建数据库 此功能仅用于创建数据库 将在最终版
  • 为什么在 Default.png 期间状态栏仍然显示?

    我非常确定我已采取所有步骤将状态栏正确设置为隐藏 我在 info plist 文件 将 UIStatusBarHidden 设置为布尔值 TRUE 以及应用程序委托中的 applicationDidFinishLaunching 方法中执行
  • C++ vs2010 增加堆栈大小

    我正在使用 vs2010 c 来处理图像 我的图像是 1920 x 1200 的数组 我什至无法声明 unsigned short frame 1920 1200 由于堆栈溢出 如何增加堆栈大小 在 Visual Studio 中 您可以通
  • 为什么第一个 AJAX 调用会重置我的视图参数?

    我无法找出为什么第一个 ajax 调用会导致再次调用我的视图参数的 setter 而每个后续调用都不会再次调用该 setter 我有以下简单的视图 bean package test import java io Serializable