根据this blog,JSF将无国籍。使用JSF的重点不在于它使保存和恢复状态成为一件苦差事。 JSF成为无国籍的重点是什么?能否请您提供一个有用的示例。
答案 0 :(得分:24)
首先,我想澄清一点,JSF并不完全是“无国籍”。 JSF只是增加了一个新功能,使开发人员能够按需创建无状态视图/表单。
状态保存在动态操作的表单中特别有用,例如有条件地ajax渲染的部分。它记住了基于ajax的回发形式的状态。换句话说,它是那些您绝对需要视图范围的托管bean而不是请求范围的托管bean的表单。如果静态表单绑定到请求范围的bean,则可以基于视图文件在每个请求的基础上轻松地重新创建状态,因此不一定需要保存。
状态保存在服务器端状态保存管理的情况下,但在服务器内存和会话创建方面成本。此外,它还有一个缺点,即在会话过期时回发期间会发生ViewExpiredException
。所有这一切都可以通过将状态保存管理设置为客户端来解决。但是,由于序列化,这又带来了网络带宽和性能降低的成本。
例如,如果大型网站覆盖“公共”和“受限制”部分,您希望推迟会话创建,直到用户实际登录为止。但是,如果您在公共场合有JSF登录表单部分,然后只需访问该页面即可创建会话。如果表单本身基本上没有动态状态并且绑定到请求范围的bean,则这是不必要的成本。
确实,如果您拥有最先进的硬件,这个成本可以忽略不计,但如果您拥有相对较多的访问者和/或相对较差的硬件,那么这个成本是不可忽视的。在这种情况下,测量就是知道。此外,并非总是可以完全无状态,您将失去动态操作视图/表单的好处和经验。但是,理论上你可以通过摆弄隐藏的输入字段和/或自定义请求参数来保持每个请求的状态。
值得注意的是,无状态还有一个额外的缺点,即如果有一个开放的XSS漏洞,理论上更容易执行CSRF攻击。幸运的是,使用JSF2 / Facelets已经很难有一个XSS漏洞了。唯一的方法是使用<h:outputText escape="false">
重新显示用户控制的数据。
答案 1 :(得分:6)
关键是只有在有实际状态需要维持时才能保持状态。
JSF的一个重大问题是扩展。
你基本上有两个选择JSF:
在服务器上存储状态 - 优点:更快的响应时间;缺点:您需要启动大量内存来处理超过2-300个用户“只是浏览”,例如在他们登录或向购物车添加任何内容之前
在客户端上存储状态 - 优点:删除内存限制;缺点:增加服务器带宽,因为每次都必须将组件树发送到客户端
无状态应该确保JSF可以用于有效地提供内容,而用户不需要维护状态。
还有其他改进,例如允许组件树在有意义的地方重用,但我们的想法是让应用程序更好地扩展。