热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:没有@ViewScoped的JSF

篇首语:本文由编程笔记#小编为大家整理,主要介绍了没有@ViewScoped的JSF相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了没有@ViewScoped的JSF相关的知识,希望对你有一定的参考价值。



我已经使用JSF多年了,在下一个项目中,我们旨在使Web层尽可能地无状态。我正在探索的一种可能性是删除@ViewScoped豆,改为使用@RequestScoped(根据需要再加上一个或两个@SessionScoped豆)。对于带有AJAX,数据表和条件渲染的复杂页面,这很麻烦。我的问题是:JSF(和PrimeFaces)在无状态Web Bean上的性能如何?这是我应该继续探索的东西,还是@ViewScope现在如此基础以至于不值得付出努力?

[我很高兴在撰写此问题时以“基于主要观点”的形式将其关闭,但是我希望并非如此,我对@ViewScope解决的特定问题以及我所采用的历史解决方法感兴趣不得不通过忽略@ViewScoped重新引入。

答案

JSF(和PrimeFaces)如何与无状态Web Bean配合使用?

在技术上是可行的。

[JSF主要使用视图状态来跟踪UIInputUICommand组件的“禁用”,“只读”和“渲染”属性以及“提交的值”,“本地值”和“已验证?” EditableValueHolder组件的状态(由EditableValueHolder等实现)。

对于“ disabled”,“ readonly”和“ rendered”属性,如果它们表示一个EL表达式,那么JSF将在处理表单提交请求时重新检查它。下面是一个基本示例:

UIInput











首先单击“切换”按钮,然后单击“提交”按钮。如果是视图作用域的bean,它将很好地工作。但是,如果在此处用@Named
@ViewScoped
public class Bean implements Serializable {
private static final long serialVersiOnUID= 1L;
private boolean toggled;
public void toggle() {
this.toggled = !toggled;
}
public void submit() {
System.out.println("Submitted");
}
public boolean isToggled() {
return toggled;
}
}
替换@ViewScoped,则它将失败,因为在回发请求期间JSF需要解码“提交”按钮时,@RequestScoped默认返回到toggled,因此其[ C0]属性将评估false,最终JSF不会将操作事件排队。

在这种情况下,您需要确保自己在请求范围的Bean的(后)构造过程中将属性预先初始化为期望值。一种方法是在ajax更新的组件中为此使用隐藏的输入字段。这是调整后的示例:

rendered

false

注意:










不幸地将不起作用,因为它仅更新模型值之后动作事件要排队。即使没有@Named
@RequestScoped
public class Bean {
@Inject @ManagedProperty("#{param.toggled}")
private boolean toggled;
public void toggle() {
this.toggled = !toggled;
}
public void submit() {
System.out.println("Submitted");
}
public boolean isToggled() {
return toggled;
}
}
这顺便带给了我关于OmniFaces的新的想法。

有了这些更改,它将可以正常工作。

但是,由于最初在视图范围内的状态(immediate="true"属性)现在已成为请求参数,因此它已完全暴露给世界,因此也容易受到黑客的篡改。希望先调用“提交”按钮而无需先调用“切换”按钮的黑客现在可以简单地手动添加请求参数。是否令人满意取决于您的应用程序的业务需求,但是比通常情况下,完全不希望如此。

这是JSF试图通过提供将这些敏感属性放入toggled bean中的可能性来保护您的方法。


这对于带有AJAX,数据表和条件渲染的复杂页面来说是麻烦的

是正确的,但在技术上仍不可行。您只需要通过手动填充的隐藏输入字段手动携带分页,排序和过滤的状态,如上所示。 toggled=true支持将这些状态绑定到Bean属性。例如:

@ViewScoped

您可以按照前面的说明将它们复制到字段中(确保已被 first="#{bean.first}"
sortField="#{bean.sortField}"
sortOrder="#{bean.sortOrder}"
filterBy="#{bean.filterBy}">
...

覆盖!),最后通过和/或抓取它们。

实际上,您是通过这种方式从头开始通过@ManagedProperty隐藏输入字段与@PostConstruct bean的结合来重塑当前已经完成的工作。那么,为什么不立即使用它呢? :)

如果您最关心的是内存使用情况,那么您需要以如下方式精心设计bean:将视图范围状态存储在javax.faces.ViewState bean中,并且将请求范围限定为[only]状态存储在@ViewScoped bean中。例如,将数据模型放入请求范围的Bean中,将分页/排序/过滤的状态放入视图范围的Bean中是完全可以的。您可能还需要考虑@ViewScoped,因为当页面被卸载时,它立即破坏视图状态和物理bean。就是说,考虑到这个问题,我已经@RequestScoped验证并改进了OmniFaces @ViewScoped库,以确保它也完全支持@ViewScoped的无状态视图以及新的集成测试。 OptimusFaces的优点是,您不再需要手动担心会出现分页/分类/过滤状态。 OptimusFaces会为您担心。另请参见:

just a few hours ago
    OptimusFaces

  • Why JSF saves the state of UI components on server?

  • 推荐阅读
    • 解决Bootstrap DataTable Ajax请求重复问题
      在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
    • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
    • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
    • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
    • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
    • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
    • 本文介绍了如何在AX2012中通过自定义查询在数据网格视图中显示所有记录的方法。 ... [详细]
    • Web开发框架概览:Java与JavaScript技术及框架综述
      Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
    • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
    • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
    • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
    • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
    • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
    • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
    • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
    author-avatar
    zhefu
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有