Primefaces p:inplace:如何更优雅地传播 EL 表达式以进行实体合并

2023-12-08

我想分享以下强大的“hack”,用于获取已使用 p:inplace 编辑其值的实体。

我的问题是如何使用 p:inplace 或其他现有属性更优雅地实现这一点。

该技巧改编自 BalusC 在 Stackoverflow 上的建议:

JSF(和 PrimeFaces)如何将参数传递给 ManagedBean 中的方法

那里的问题涉及获取具有 p:inplace 编辑的 #{emp.firstName} 的 Employee 对象:

<h:outputText value="First name:"/>
<p:inplace id="firstname" editor="true">
 <p:ajax event="save" onsuccess="#{employeeController.saveName()}"/>
 <p:inputText id="firstName" value="#{emp.firstName}"  
              required="true" label="text"
              valueChangeListener="#{employeeController.firstNameChanged}">
 <p:ajax event="valueChange" listener="#{employeeController.onValueChangedStart}"/>
 </p:inputText>
</p:inplace>

BalusC的建议是:

假设您确实位于重复组件中,其中 #{emp} 已通过其 var 属性公开,您可以从值更改侦听器内的 EL 范围中获取它,如下所示:

FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();

这样做的问题是 EL 表达式(在本例中为 #{emp})是硬编码的,因此不可重用。

我现在成功地使用 p:inplace 的 id 来传播一个字符串,该字符串可以解析为侦听器中实体的 EL 表达式,但是因为不能使用点“.”。在 id 字符串中,我必须翻译每个“.”作为 hiphen '-',然后将其转换为侦听器中的有效 EL 表达式。这样我就可以传播非常复杂的 EL 表达式,然后我知道将哪个实体合并到数据库(或需要任何持久性操作)。

public static String policy_convert_id_to_el_expression(String $id) {
    if ($id == null) {
        throw new IllegalArgumentException("null String $id");
    }
    return $id.replaceAll("-", ".");
}

我有一系列深层值实体,它们包含特定的浅层值,例如 BooleanValue、FloatQuantity 等,每个都有一个特定类型的 getValue() 方法和一个通用的瞬态 getObject() 方法,并携带有关包装的浅值的其他持久元数据(例如单位、作者等)。

我有一个 ValueManager 支持 bean:

public void onInplaceSaveEvent(AjaxBehaviorEvent ae) {
    UIComponent component = ae.getComponent();
    String id = component.getId();
    String $el = policy_convert_id_to_el_expression(id);
    FacesContext context = FacesContext.getCurrentInstance();
    Value v = context.getApplication().evaluateExpressionGet(context, "#{" + $el + "}", Value.class);
..
// merge Value entity to database (catches change to shallow wrapped value) 
// and/or perform other persistence operations such as metadata updates
..

}

现在这是一个高度可重用的策略。

例如,我有一个带有 List getFloors() 的实体 OfficeBuilding,每个 BuildingFloor 都有一个深层 FloatQuantity getArea() 实体,其中 FloatQuantity 扩展了 Value。

在 dataTable 中,我使用 var=floor over value=#{officeBuilding.floors} 进行迭代,并就地编辑该区域的浅 .value:

<p:inplace 
 id="floor-area" 
 editor="true" 
 emptyLabel="UNDEF"
>
 <p:ajax 
  event="save" 
  update="@form" 
  listener="#{valueManager.onInplaceSaveEvent}"
  process="@this floor-area-value"
 />
 <p:inputText 
  id="floor-area-value" 
  value="#{floor.area.value}" 
 />
</p:inplace>

这可以封装为一个高度可重用且方便的复合组件 resources/util/inplaceValue.xhtml 因此:

<cc:interface>
  <cc:attribute name="value" type="com.example.entity.value.Value" required="true"/>
  <cc:attribute name="elid" required="true"/>
</cc:interface>

<cc:implementation>
    <p:inplace 
        id="#{cc.attrs.elid}" 
        editor="true" 
        emptyLabel="UNDEF"
        >
        <p:ajax 
            event="save" 
            update="@form" 
            listener="#{valueManager.onInplaceSaveEvent}"
            process="@this #{cc.attrs.elid}-value"
            />
        <p:inputText 
            id="#{cc.attrs.elid}-value" 
            value="#{cc.attrs.value.value}"                
            />
   </p:inplace>
</cc:implementation>

使用上面的示例,这被称为:

<util:inplaceValue elid="floor-area" value=#{floor.area}/>

只需记住在指定 elid 属性时要小心 所有出现的“.” EL 表达式中的内容被翻译为 hiphen“-”, 但它对于各种复杂的情况来说就像一个魅力,并且它节省了 大量的编码。它非常优雅,但仍然是一个 hack。

问:如何更好地将访问其值已被编辑的实体所需的 EL 表达式传播到侦听器?

我也有提出了 Primefaces 功能建议p:inplace 的新属性专门用于此目的。


None

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

Primefaces p:inplace:如何更优雅地传播 EL 表达式以进行实体合并 的相关文章

随机推荐

  • 为什么 read() 不能在 open() 函数中使用 'w+' 或 'r+' 模式

    当我使用带有 r 或 w 参数的打开时 它不想读取文本文件 内部文本文档 hello Python 代码示例 code with open file name r as o print o read output hello code wi
  • 安装时npm权限错误

    我正在尝试在我的服务器上安装 yeoman 但由于某种原因 我总是收到权限被拒绝的错误 npm install g yo root node bin yo gt root node lib node modules yo cli js gt
  • 上传多个文件并查询 Firestore DB - ReactJS

    我读了很多这样的帖子如何将多个文件上传到 Firebase 之前关于这个问题 我尝试了不同的选择 但无法得到结果 我正在使用 React Hook Form 来创建一个非常巨大的表单 现在我必须添加更多输入 以上传文件 并且需要帮助立即完成
  • 在 C# 中创建 CSV 文件

    我正在尝试创建一个 csv 文件 其中每个条目均由用户输入 输入一组值后 应继续输入下一组值 然而我似乎无法做到这一点 每次我运行该程序时 它都会替换以前的值 using System using System IO using Syste
  • 如何将 3D Python/NumPy 数组保存为文本文件?

    我必须启动大量计算 并且每次都必须保存 2D 文件文本 因此我想将结果 实时 存储为 3D 文本文件 每个切片对应一个计算结果 第一次计算没问题 但是当我进行第二次计算时 在 np loadtxt 步骤中 数组维度变成了二维 所以我无法达到
  • 带有文本文件的实体框架(没有数据库!)

    我习惯了表单和数据集 但现在我正在尝试 WPF 和实体框架 我的目标是使用实体框架填充 WPF 中的 DataGrid 但是 我没有数据库 我有简单的文本文件 其中包含我必须解析以填充我的实体的数据 但是 我收到诸如 实体类型 TableN
  • 比较 Chrome 和 Firefox 的字体大小问题

    我建立了一个网站 问题是 chrome 显示font size 1px比火狐浏览器还大 我尝试了几种方法来匹配字体大小 以 px 为单位指定 以 为单位将正文设置为 100 然后将元素设置为0 875em 这些都不起作用 它仍然在 Chro
  • “应用程序窗口预计有一个根视图控制器”条件外观

    我正在使用 Xcode 4 5 和 iOS6 为 iPhone 编写一个应用程序 我也在创建一个新的UIWindow能够管理状态栏的区域 在那里显示消息等 我正在使用故事板和我的appDelegate方法如下所示 BOOL applicat
  • 在 PHP 中通过电子邮件验证用户

    我实际上正在使用 PHP 创建一个 Web 应用程序并寻求验证用户的帮助 与某些网站一样 当您注册时 系统会向您发送一封包含确认链接的电子邮件 我如何在 PHP 中实现它 我只知道我必须使用 PHPmail 功能发送电子邮件 请帮忙 必要的
  • 将字符串中单词的每个实例加粗

    我试图将字符串中单词的每个实例加粗 并删除字符串中第一个单词实例之前的所有内容 我在用着str replace and stristr 这样做 但输出不符合预期 该单词的第一个实例之前的所有内容都被切断 但当我回显该字符串时 该单词的实例不
  • 任务之外的异常处理

    刚刚注意到奇怪的事情 要从新任务捕获调用者中的异常 lambda 必须标记为异步 即使 delegate 根本没有await 运算符 这真的有必要吗 try Task Run gt exception is not caught Task
  • 检查查询字符串 (PHP)

    例如 我使用查询字符串test php var 1 我如何检查用户之后是否输入任何内容 例如另一个字符串 如果我的后面有任何其他字符串 查询字符串 我尝试重定向到index phpvar请求参数 可以检查这个吗 例如 test php va
  • HTML5 / CSS3 带有部分边框的圆形

    是否可以仅使用 HTML5 CSS3 创建一个圆形 其边框仅围绕圆形一部分 如果没有 我可以使用什么技术来实现这种效果 我更喜欢使用纯 DOM 元素 但如果必须的话 我可以在画布上绘图或旋转 SVG 2023年解决方案 这个方法不需要 JS
  • 如何在 C# 中测试 COM 相关对象

    我正在尝试使用依赖于 COM 接口的对象进行 TDD 我考虑在进行开发测试时模拟 COM 接口 并在集成测试中真正做到这一点 但是 我无法模拟 COM 接口 我尝试使用 Moq 它引发了异常 System TypeLoadException
  • 获取 UINavigationController 向后滑动的进度

    我有两个viewControllers 两者都是UINavigationController From View1我可以点击UITableViewCell并前往View2 from View2我可以滑动返回View1 我想知道如何才能获得此
  • 在 iOS 7 导航栏下添加视图的最佳方法是什么

    在 ios7 上 许多应用程序 Apple Messages Facebook Messenger Calendar 的视图出现在 UINavigationBar 下 通常带有看似标准的动画 因为它看起来很标准并且看起来很像 UIToolB
  • Access2010 中的数据宏:触发器?

    我听说即将推出的 Access2010 具有数据宏功能 该功能将首次向 Access 数据引擎表添加类似触发器的功能 有人有这方面的进一步细节吗 例如 它们可以在代码中创建 ACEDAO SQL DDL 等 吗 如果从 Access 用户界
  • 使用 Process.Start() 和 Windows 任务计划程序时出现异常

    我编写了 C 控制台应用程序 该应用程序有时会尝试使用 7zip 特别是 7za exe 解压缩文件 当我手动运行它时 一切运行正常 但如果我在任务计划程序中设置一个任务并让它运行 它会抛出此异常 System ComponentModel
  • xml-flow NPM 包 - 意外的 XML 解析行为

    背景 我在用xml flownpm 包使用流解析 XML 问题是 xml 节点以意外的方式进行解析 我的目的是使用重复的 xml 节点解析一个巨大的 XML 文件 XML 文件可以是任何 URL 重复节点将从 UI 提供 我尝试使用具有所有
  • Primefaces p:inplace:如何更优雅地传播 EL 表达式以进行实体合并

    我想分享以下强大的 hack 用于获取已使用 p inplace 编辑其值的实体 我的问题是如何使用 p inplace 或其他现有属性更优雅地实现这一点 该技巧改编自 BalusC 在 Stackoverflow 上的建议 JSF 和 P