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

  • 推荐阅读
    • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
      本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
    • 猜字母游戏
      猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
    • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
    • Java序列化对象传给PHP的方法及原理解析
      本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
    • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
    • C# 7.0 新特性:基于Tuple的“多”返回值方法
      本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
    • 后台获取视图对应的字符串
      1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
    • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
    • 从零学Java(10)之方法详解,喷打野你真的没我6!
      本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
    • ASP.NET2.0数据教程之十四:使用FormView的模板
      本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
    • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
    • Spring特性实现接口多类的动态调用详解
      本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
    • [大整数乘法] java代码实现
      本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
    • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
    • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
    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社区 版权所有