首页
学习
活动
专区
圈层
工具
发布

取消按钮的JSF immediate ="true"不起作用

JSF immediate="true" 属性在取消按钮上不起作用的分析与解决方案

基础概念

JSF (JavaServer Faces) 中的 immediate 属性是一个重要的行为控制属性,它决定了一个组件在请求处理生命周期中的处理时机。

immediate="true" 的工作原理

正常情况下,JSF 请求处理生命周期包含以下阶段:

  1. 恢复视图
  2. 应用请求值
  3. 处理验证
  4. 更新模型值
  5. 调用应用
  6. 渲染响应

immediate="true" 时,组件会在"应用请求值"阶段(第2阶段)处理,而不是通常的"处理验证"阶段(第3阶段)。

取消按钮上 immediate="true" 不起作用的可能原因

  1. 表单验证阻止:即使取消按钮设置了 immediate="true",如果表单中有其他必填字段未通过验证,整个表单可能被阻止提交。
  2. 事件处理顺序问题:某些情况下,其他组件的值变更事件可能在取消按钮之前被处理。
  3. JSF 版本差异:不同版本的 JSF 对 immediate 属性的实现可能有细微差别。
  4. 嵌套表单问题:如果按钮位于嵌套表单中,可能会影响其行为。

解决方案

方案1:结合 process="@this" 使用

代码语言:txt
复制
<h:commandButton value="Cancel" action="#{bean.cancel}" 
                immediate="true" process="@this" />

方案2:使用 f:ajax 并跳过执行阶段

代码语言:txt
复制
<h:commandButton value="Cancel" action="#{bean.cancel}">
    <f:ajax execute="@this" immediate="true" />
</h:commandButton>

方案3:确保没有其他验证错误

检查表单中是否有其他组件设置了 required="true" 但未填写值。

方案4:使用 bypassUpdates 属性(JSF 2.2+)

代码语言:txt
复制
<h:commandButton value="Cancel" action="#{bean.cancel}" 
                immediate="true" bypassUpdates="true" />

最佳实践

  1. 对于取消/重置按钮,推荐组合使用 immediate="true"process="@this"
  2. 避免在取消按钮所在表单中设置严格的验证规则
  3. 考虑使用 h:buttonh:link 进行导航而非表单提交,如果是简单的页面跳转

应用场景

这种问题通常出现在:

  • 复杂表单的取消操作
  • 多步骤向导中的"上一步"按钮
  • 需要绕过验证的场景

示例代码

代码语言:txt
复制
<h:form id="myForm">
    <h:inputText id="name" value="#{bean.name}" required="true" />
    <h:message for="name" />
    
    <!-- 有效的取消按钮实现 -->
    <h:commandButton value="Cancel" action="#{bean.cancel}" 
                    immediate="true" process="@this" />
    
    <h:commandButton value="Submit" action="#{bean.submit}" />
</h:form>
代码语言:txt
复制
// 对应的托管bean方法
public String cancel() {
    // 取消逻辑
    return "cancel-outcome";
}

通过以上方法,可以确保取消按钮即使在表单验证失败的情况下也能正常工作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS - Swift UISearchController的取消按钮

UISearchController�的取消按钮 关于UISearchController�的设置就不多说了,可以参考《UISearchController�仿微信搜索框》或者自行上网查找。...情况 本人想实现微信通讯录上方的搜索框功能,但在搜索框的取消按钮的设置这个卡住,在网上搜了个遍,没有�合适的做法,经过不懈的探索,终于找到解决方案,遂前来记录一下。...方案 添加两个属性 // 记录是否已经找到取消按钮 lazy var hasFindCancelBtn: Bool = { return false }() // 定时器(用来定时查找取消按钮)...link: CADisplayLink = { CADisplayLink(target: self, selector: #selector(findCancel)) }() 提供查找并设置取消按钮的方法...link.invalidate() link.remove(from: RunLoop.current, forMode: .commonModes) hasFindCancelBtn = true

1.1K20
  • TypeScript 防抖函数封装:原理与实现

    防抖的应用场景 搜索框输入联想(避免每次输入都发送请求) 窗口大小调整事件 滚动事件处理 按钮频繁点击防止重复提交 TypeScript 实现防抖函数 下面我们来实现一个类型安全的防抖函数: /**...* 防抖函数封装 * @param fn 需要防抖的函数 * @param delay 防抖延迟时间(毫秒) * @param immediate 是否立即执行 * @returns 包装后的防抖函数...(默认为 false) 内部变量: timer:存储 setTimeout 的返回值,用于清除定时器 返回函数: 保持原始函数的 this 上下文和参数类型 每次调用都会清除之前的定时器 根据 immediate...number }) { console.log("Submitting:", data); } const debouncedSubmit = debounce(submitForm, 500, true...) 总结 本文介绍了: 防抖的概念和应用场景 使用 TypeScript 实现类型安全的防抖函数 如何扩展防抖函数的功能(取消、返回值处理) 防抖与节流的区别 通过 TypeScript 的泛型和类型系统

    29800

    跟着underscore学防抖

    想想这个需求也是很有道理的嘛,那我们加个 immediate 参数判断是否是立刻执行。...所以我们也要返回函数的执行结果,但是当 immediate 为 false 的时候,因为使用了 setTimeout ,我们将 func.apply(context, args) 的返回值赋给变量,最后再...return 的时候,值将会一直是 undefined,所以我们只在 immediate 为 true 的时候返回函数的执行结果。...最后我们再思考一个小需求,我希望能取消 debounce 函数,比如说我 debounce 的时间间隔是 10 秒钟,immediate 为 true,这样的话,我只有等 10 秒后才能重新触发事件,...现在我希望有一个按钮,点击后,取消防抖,这样我再去触发,就可以又立刻执行啦,是不是很开心?

    39520

    SpringBoot RabbitMQ

    RabbitMQ 介绍 RabbitMQ的流程是:生产者将消息发送到对应交换机上,交换机再将消息转发到绑定的队列上,消费者从绑定的队列获取消息进行消费。...该队列就相当于是一个延迟队列了 3、创建延迟交换机(其实也是普通交换机),和延迟队列绑定 4、给ImmediateQueue创建监听消费者,注意,延迟队列不要设置监听消费者,不然延迟队列就变成普通队列了,不起作用...# 开启发送确认 publisher-returns: true # 开启发送失败退回 template: mandatory: true listener:...multiple:是否批量. true:将一次性ack所有小于deliveryTag的消息。...multiple:是否批量. true:将一次性拒绝所有小于deliveryTag的消息。 requeue:是否重新入队列。

    62530

    Vue 侦听器 watch 扩展之立即触发回调、深度监听和注销

    : true } } } 上述写法用到了 handler 方法和 immediate 属性 1、handler 方法 原来我们 watch 中默认写的就是这个 handler,Vue 会去处理这个逻辑...,最终编译出来其实就是这个 handler 2、immediate 属性 指定 immediate: true 将立即以表达式的当前值触发回调,即在 wacth 中声明了 firstName 之后就会立即执行里面的...: true, deep: true } } } 设置 deep 为 true 后,监听器会一层层的往下遍历,给对象的所有属性都加上这个监听器,这样就可以监听到属性 a 了 但这样性能消耗会非常大... 选项时,不能在第一次回调时取消侦听给定的 property // 这会导致报错 var unwatch = vm....$watch( 'value', function () { doSomething() unwatch() }, { immediate: true } ) 如果仍想在回调内部调用一个取消侦听的函数

    2.7K10

    前端节流(throttle)和防抖动(debounce)

    举个常见的节流案例:我们把某个表单的提交按钮——button 设成每三秒内最多执行一次 click 响应;当你首次点击后,函数会无视之后三秒的所有响应;三秒结束后,button 又恢复正常 click...实现上,只需要设置一个定时器(setTimeout),并在定计时器启动后(如 3 秒后)执行这个回调函数;若在定时器启动前又有相同回调到来,便取消之前的定时器(clearTimeout)——之前的回调便取消了...——immediate:一个 boolean 参数,表示是否执行首次响应(默认是最后一次)。...(...args) { let callNow = immediate && !...若 immediate 被设成了 true 并且没有开启的计时器(!timeout),则能被callNow,便会立即执行 cb(不会在 setTimeout 里执行)。

    4.3K20

    JSF本地联调工具实践

    Tech 导读 JSF作为京东内部日常最常用的RPC组件,通过JSF扩展,为大家提供JSF扩展思路及本地联调实践。...图2 JSF本地联调工具调用关系 看过架构图大家会对工具有个大体的了解,利用redis的发布订阅模式来完成jsf请求到响应的数据传递工作。...3.1.2 序列化 这是几乎所有通过网络传输都需要考虑的问题,使用jsf时,jsf支持的序列化方式很多,在公司使用比较多的就是默认的方式msgpack和hessian。...这里就说道了jsf的扩展性,每次jsf调用过程都会经过一些列过滤器,无论是调用者还是提供者。 借助jsf官方文档上的图来看下。...给默认值 responseMessage = MessageBuilder.buildResponse(requestMessage); } //停止并取消订阅生产者监听

    1.7K20

    在应用退出时弹出确认提示框

    需求 在应用退出时(点击右上角的关闭按钮)弹出一个确认按钮可以说是一个最常见的操作了,例如记事本的“你是否保存”: ? 但这个功能在UWP上居然有点小复杂。这篇文章将解释如何实现这个功能。 2....CloseRequested 为了监视应用退出事件,我本来使用了CoreApplication.Exiting,但好像并不起作用,后来我就没再研究它的触发机制了。...这个事件会在用户点击窗体右上角的关闭按钮时触发,开发者可以在这个事件里处理保存数据、确认关闭等。最好在App.xaml.cs中的Window.Current.Activate();前后订阅这个事件。...break; } deferral.Complete(); }; private async Task SaveDataAsync() { } 在上面的代码中,如果点击取消按钮...,则将Handled设置为true以取消关闭。

    4.4K10

    数据透视表双击出的明细表很难用?

    最近有朋友在使用数据透视表双击出明细的时候遇到2个问题: 1、生成的明细表自动带了筛选,怎么取消筛选?...2、复制数据到生成的明细表后面时,怎么筛选按钮不起作用?...一、去掉筛选按钮 对超级表去掉筛选按钮有2个方法。...一是像普通表那样把筛选按钮点掉,如下图所示(如果你发现筛选按钮不起作用,那可能是你目前选中的单元格或区域不在明细表的范围内): 还有一个方法是,在表格菜单里直接取消勾选“筛选”项。...如果你粘贴数据不被自动纳入超级表范围,实际上你可以对超级表的范围进行手动扩展以包含你复粘贴的数据,拖动扩展按钮(超级表的右下角)即可,如下图所示: 如果你还不习惯操作超级表,也不想学,那也可以将超级表转换为普通表

    2.9K30
    领券