讲师中心 微信公众号
AI工具推荐 视频效率加速

ADF Faces中rendered属性导致按钮动态显示异常的解决方案

梦磊吖_7644

梦磊吖_7644

发布时间:2026-08-16 11:50:26

|

319人浏览过

|

来源于php中文网

原创

ADF Faces中rendered属性导致按钮动态显示异常的解决方案

本文详解ADF Faces中rendered属性在页面刷新时状态不一致的问题,指出其根本原因在于组件生命周期与视图状态管理机制的冲突,并推荐改用visible属性配合合理的数据初始化逻辑,确保UI元素显示状态稳定可靠。

本文详解adf faces中rendered属性在页面刷新时状态不一致的问题,指出其根本原因在于组件生命周期与视图状态管理机制的冲突,并推荐改用visible属性配合合理的数据初始化逻辑,确保ui元素显示状态稳定可靠。

在Oracle ADF Faces开发中,rendered属性常被用于控制组件是否参与JSF生命周期(即是否生成HTML DOM节点)。但正如本例所示:两个<commandmenuitem></commandmenuitem>通过rendered="#{pageFlowScope.DeliveryMainPageBean.show}"动态控制显隐,却在页面刷新后“消失不见”,即使后端业务数据未变更——这并非数据库或绑定逻辑错误,而是rendered的语义特性引发的典型陷阱。

问题根源分析

rendered="false"会使组件完全跳过JSF渲染阶段,不生成任何HTML,也不保留在组件树中。当后续条件变为true时,若仅靠局部刷新(如Partial Page Refresh),该组件因已从视图树中移除,无法自动重建,导致“有数据、无按钮”的现象。此外,当前showNotAssignedTop()方法中存在冗余逻辑:

public String showNotAssignedTop() {
    showPS22primary = 0; // 每次都重置为0
    showPS22second = 0;
    topNodeSelected(DeliveryNotAssignedItem.class);
    if(showPS22primary == 0){ // ❌ 恒成立,此判断无意义
        // ... 执行绑定调用
    }
    return null;
}

该if块永远执行,不仅降低可读性,还掩盖了变量初始化时机混乱的问题——showPS22primary和showPS22second在每次导航进入页面时被强制清零,再依赖绑定结果赋值,极易因绑定执行顺序、缓存或异步延迟导致状态不一致。

推荐解决方案:改用 visible + 清晰初始化

  1. 将 rendered 替换为 visible
    visible 属性仅控制CSS display 样式(none/inline),组件始终存在于组件树和DOM中,支持通过PPR平滑切换显隐,避免重建开销:

    <af:commandMenuItem text="First mail" id="cmi13"
        action="#{pageFlowScope.NotificationsBean.printUnsentMainNotifications}"
        visible="#{pageFlowScope.DeliveryMainPageBean.show}"/>
    <af:commandMenuItem text="Second mail" id="cmi14"
        action="#{pageFlowScope.NotificationsBean.printUnsentSecondaryNotifications}"
        visible="#{pageFlowScope.DeliveryMainPageBean.showTwo}"/>
  2. 重构Java逻辑:消除冗余重置,确保状态可预测
    在DeliveryMainPageBean的@PostConstruct或页面首次加载时初始化状态,而非在每次action方法中覆盖:

    @PostConstruct
    public void init() {
        // 首次初始化,避免重复覆盖
        if (showPS22primary == null) {
            evaluateShowFlags();
        }
    }
    
    private void evaluateShowFlags() {
        Object primaryResult = ADFBindingsUtil.executeOperationBinding("isShow");
        showPS22primary = ((Integer) primaryResult) > 0 ? 1 : 0;
    
        Object secondResult = ADFBindingsUtil.executeOperationBinding("isShowTwo");
        showPS22second = ((Integer) secondResult) > 0 ? 1 : 0;
    }
    
    // getter保持不变
    public boolean isShow() { return showPS22primary == 1; }
    public boolean isShowTwo() { return showPS22second == 1; }
  3. 调试验证技巧
    在页面中添加诊断输出,实时观测EL表达式求值结果:

    <af:outputText value="Debug: show=#{pageFlowScope.DeliveryMainPageBean.show}, showTwo=#{pageFlowScope.DeliveryMainPageBean.showTwo}" 
                   inlineStyle="color:red; font-size:x-small;"/>

注意事项与最佳实践

  • ✅ 优先使用 visible:对需要频繁切换显隐的UI控件(菜单项、按钮、面板),visible 是更安全、更高效的选择。
  • ⚠️ 慎用 rendered:仅在组件确实无需参与任何生命周期(如条件复杂、性能敏感且极少变化)时使用;修改后需触发完整页面刷新(window.location.reload())才能恢复。
  • ? 避免在Action方法中重置状态:action方法应专注业务流转,状态初始化应在构造、@PostConstruct或明确的init()中完成。
  • ? 启用ADF日志:在logging.properties中添加oracle.adf.view.rich=FINEST,可追踪组件渲染决策链。

通过以上调整,按钮将严格依据后端布尔值稳定显示,彻底解决刷新后“丢失”的问题,同时提升代码健壮性与可维护性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

9297

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

6462

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

5752

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1024

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

848

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1216

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2449

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19791

2023.08.03

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn