preRenderView 禁用 ajax

2023-12-26

<ui:composition template="/WEB-INF/templates/base.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui">    
    <ui:define name="metadata">
        <f:metadata>
            <f:event type="preRenderView" listener="#{resetPassword.loadUser}" />
            <f:viewParam name="user" value="#{resetPassword.user}" />
        </f:metadata>
    </ui:define>

    <ui:define name="content">
        <h:form rendered="#{resetPassword.user != null}">
            <h:panelGrid class="form_panel" columns="2" width="596px">
                <h:outputLabel class="form_label" for="password" value="#{base['resetPassword.password']}" />
                <h:inputSecret class="form_inputText" id="password" value="#{resetPassword.password}">
                    <f:ajax event="keyup" execute="password" listener="#{resetPassword.validatePassword}" render="scorePanel complexity" />
                </h:inputSecret>

                (...) // Other labels and inputfields, no ajax
            </h:panelGrid>
        </h:form>
    </ui:define>
</ui:composition> 

我读过很多有关的问题preRenderView结合ajax-打电话。我遇到的主要问题是postback问题。不过,就我而言,ajax根本不会触发preRenderView。没有整体的f:event-标签,我的ajax-call 工作正常。

resetPassword.loadUser()将设置resetPassword.user,它不为空。我需要使用preRenderView代替@PostConstruct为了填补f:viewParam。提交表单时需要此参数。

为什么我的ajax- 事件中断时<f:event type="preRenderView" />被定义为?

Note: <ui:insert name="metadata" />在模板位于里面<h:head>.

Update

正如 BalusC 所评论的,该问题在这部分代码中不可见。

public void loadUser(ComponentSystemEvent event) {
    if(!FacesContext.getCurrentInstance().isPostback()) {
        user = (hash != null) ? userService.getByIdAndPwdResetHash(userId, hash) : null;
    }
}

此代码可能会返回null但没有(因为我的表格正在加载)。

public void validatePassword(AjaxBehaviorEvent event) {
    System.out.println("Ajax works"); // Just for testing purposes so far
}

我不知道要进一步添加什么,因为这几乎都是相关代码。


#{resetPassword}是请求范围并且user属性在 bean 的(后)构造期间未初始化。

JSF 将在应用请求值阶段,即重新评估rendered在处理提交的值之前,检查输入组件(这也包括其所有父组件)的属性,作为防止篡改请求的一部分。在您的情况下,父表单不会呈现,因此所有输入组件都不会被处理。

你基本上有两个选择:

  1. 做豆子@ViewScoped(或 CDI 等效项@ConversationScoped)。这样,只要您与相同的视图(或对话)交互,它就会存在。

  2. 执行初始化user在(后)构造函数中。预渲染视图为时已晚。由于您的 bean 已经在请求范围内,因此只需使用@ManagedProperty(或其本土的 CDI 等效项;Google 在“@HttpParam”上有结果)。

也可以看看:

  • commandButton/commandLink/ajax 操作/侦听器方法未调用或输入值未更新 https://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked/2120183#2120183- 第 5 点适用于您的情况
  • @Inject 通过 URL 将参数传递给 CDI @Named bean https://stackoverflow.com/questions/10058852/inject-to-pass-params-to-a-cdi-named-bean-via-url-gives-jboss-error-on-netbean/10059245#10059245- 包含自定义的具体示例@HttpParam注释作为 JSF 的 CDI 替代@ManagedProperty
  • ViewParam 与 @ManagedProperty(value = "#{param.id}") https://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-id/4889226#4889226- 更好地理解其生命周期的差异

无关对于具体问题,在操作(侦听器)方法中执行验证并不是正确的方法。代替<f:ajax listener>,使用正常的Validator您通过输入组件引用的validator属性或嵌套<f:validator>.

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

preRenderView 禁用 ajax 的相关文章

随机推荐

  • 使用 jQuery .append() 时在元素之间添加换行符或空格

    我有一组 jQuery 元素 可以通过调用以下命令从 DOM 中获取 some selector 我的所有元素都是 DIV 每个元素都在自己的行中 我的 DIV 设置为 CSS 除其他外 display inline block 这会阻止它
  • System.IO.File'不包含Unity3D中'AppendAllText'错误的定义?

    我对 Unity3d 非常陌生 并尝试打开一个现有项目 播放时显示以下错误 资产 脚本 DataAccess cs 39 30 错误CS0117 System IO File does not contain a definition fo
  • Laravel - 无法使用 storeAs 将文件保存到 public_path

    我无法将文件上传到 Laravel 5 4 中的 public path 文件夹 我不明白出了什么问题文档让它看起来很简单 https laravel com docs 5 4 filesystem file uploads request
  • WebClient:忽略 HTTP 500

    我正在编写一个程序 它从服务器检索一些数据 对其执行一些操作 并将输出保存到 csv 文件 我遇到的问题是服务器 我不负责 总是返回 HTTP 500 内部服务器错误 我已经与负责该问题的团队进行了交谈 虽然他们意识到了该错误 但他们表示该
  • 为什么不在生产环境中使用 Django 提供静态文件?

    我遇到了以下示例settings py if settings DEBUG urlpatterns static settings MEDIA URL document root settings MEDIA ROOT 并被告知 stati
  • PCL kd-tree 实现速度极慢

    我正在使用基于点云库 PCL 的 C 实现 kd 树最近邻 NN 搜索 该数据集包含约 220 万个点 我正在为每个其他点搜索 NN 点 搜索半径设置为 2 0 要完全计算出来 大约需要 12 个小时 我使用的是带有 4GB RAM 的 W
  • Windows 窗体在 Visual Studio 窗体设计器中消失了

    昨天我在 Visual Studio 的表单设计器中编辑了一个表单 当我今天回到它时 设计师什么也没展示 我可以打开属性窗口 选择所有不同的组成组件并编辑它们的属性 但它们没有显示 应用程序构建良好 表单可以照常运行 我尝试了几种不同的解决
  • 邮递员脚本:“pm 未定义”

    我尝试在 Postman 中编写一个预请求脚本 我想提出请求 所以我尝试使用pm sendRequest https www getpostman com docs postman scripts postman sandbox api r
  • Node.js 流/管道错误处理(错误时更改响应状态)

    我的 Cassandra 数据库中有数百万行 我想以 zip 文件的形式流式传输到客户端 不希望内存中存在巨大的 zip 文件 我正在使用 Cassandra Node 驱动程序中的 Stream 函数 通过管道传输到 Transforme
  • 参数不是 NaNunction,未定义

    我正在从 AngularJS 1 2 26 迁移到 1 3 2 并收到 这不是最好的错误消息 但看起来好像是说我的控制器未定义 我可以不再以这种方式定义控制器吗 错误 错误 areq 糟糕的论点 参数 welcomeController 不
  • 无法让 cocoon 在 Ruby on Rails 4 上工作

    在过去的几个小时里 我一直在努力让这个工作正常进行 但由于某种原因我做不到 我几乎完全按照 github 存储库链接上指示的步骤进行操作 我使用以下所有步骤创建了一个新应用程序 rails new demo app cd demo app
  • Firemonkey ScrollBox 错误

    我们在 Firemonkey 的 ScrollBox 组件中遇到了一个奇怪的错误 因为TGrid继承自TScrollBox它也会影响所有网格 在我们的一些开发机器上 一切正常 而在其他机器上 就会出现错误 我们未能检测到系统之间的任何模式
  • 在 /admin/ 安装 jinja2 TemplateDoesNotExist 后

    我已经安装了 jinja2 之后 DIRS 停止工作 我必须手动包含它们 更改 APP DIRS 没有帮助 模板看起来像这样 TEMPLATES BACKEND django template backends jinja2 Jinja2
  • LESS - 多个不同的类具有相同的风格?

    你会如何用 LESS 写出下面这种风格 nav a hover nav a focus footer a hover footer a focus fullscreen container a hover fullscreen contai
  • Ansible:如何将默认值应用于列表的每个复杂参数

    我有以下列表和默认变量 my list complex key1 val1 key2 val2 key3 val3 keyN valN key1 val1 key3 val3 keyN valN key2 default2 key3 def
  • 如何确定Microsoft Edge是否是默认浏览器?

    是否有可靠的编程方式来确定 Microsoft Edge 是默认浏览器 我知道一种选择是使用IApplicationAssociationRegistration QueryCurrentDefault https msdn microso
  • 如何在 Laravel 9 Validation 中实现上述验证?

    我正在尝试实现某些 Laravel 验证标准 但我很难实现这些标准 请同样帮助我 我正在使用 laravel 9 和 PHP 8 1 描述 我有一个 API 其中包含以下提到的输入 A 公司名称 必填b company number 根据条
  • 使用 telegram bot API 创建新组

    如何使用 Telegram 中的机器人创建新群组 据我所知 机器人本身无法做到这一点 那么是否有可能将机器人实现为常规程序user How Update 这就是我要的http t me polyglossia http t me polyg
  • 为数据网格行创建上下文菜单

    我有一个可能有很多行的数据网格 当用户右键单击其中一行时 我需要为每一行显示一个上下文菜单 并在用户单击该选项时执行一个操作 相同的操作 但根据当前选定的行不同的数据项 对此最好的策略是什么 我担心每一行的 ContextMenu 都太过分
  • preRenderView 禁用 ajax