热门标签 | 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?

  • 推荐阅读
    • WebSocket与Socket.io的理解
      WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
    • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
    • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
      本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
    • JavaWeb中读取文件资源的路径问题及解决方法
      在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
    • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
    • 如何使用Java获取服务器硬件信息和磁盘负载率
      本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
    • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
    • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
    • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
    • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
    • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
    • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
    • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
    • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
    • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
    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社区 版权所有