如何禁用 ViewState?

Posted

技术标签:

【中文标题】如何禁用 ViewState?【英文标题】:How to disable ViewState? 【发布时间】:2012-02-22 01:54:06 【问题描述】:

我从 MS 和 ASP.NET 进入 Java 世界,并在 Java 中寻找类似于 ASP.NET 的基于组件的 html 框架。在查看了互联网上的大量链接后,看起来 JSF2(带有 facelets)是最佳匹配(顺便说一句,这是真的吗?还是有其他更好的选择?)。

我现在在评估过程中遇到的问题是正确使用 JSF 的视图状态。我的最终使用场景是一个集群的 WEB 服务器,我不会有任何会话/服务器存储的对象,我不会将网络带宽用于虚拟视图状态(请参阅另一个人的相关问题 JSF Tuning )。

我学习了一些 JSF2 教程,并在设置 javax.faces.STATE_SAVING_METHOD = 客户端后将 ViewState 生成为 440 个字符的 HTML(我的天,页面仅包含 1 个虚拟文本输入和 1 个提交按钮)。在“提交时提交”中,我只需要来自文本输入(10 个字符)的文本,而不是虚拟视图状态(440 个字符)。

所以问题是 - 是否可以在 JSF2 中禁用视图状态?

相关链接:

ASP.NET 中的用例 - “禁用页面的视图状态”:http://www.ironspeed.com/articles/Disable%20View%20State%20for%20a%20Page/Article.aspx

在 *** 上没有帮助的答案:How to reduce javax.faces.ViewState in JSF

更新:相关链接(来自下面的 cmets):

JSF 2.0 partial state saving does not seem to work

“无状态 JSF”:http://industrieit.com/blog/2011/11/stateless-jsf-high-performance-zero-per-request-memory-overhead

【问题讨论】:

我不熟悉 ASP.NET,但是 JSF2 使用部分状态保存,以节省内存。您可能不需要禁用它。见***.com/a/4391494/456062 “是否可以在 JSF2 中禁用视图状态?”:可以,可以:industrieit.com/blog/2011/11/… BalusC,您的链接似乎切中要害。然而......它确实说需要深度黑客攻击,而 JSF 作者实际上未能抓住自 2004 年以来 JSF 演变的多年中真正重要的方面之一。 @XtraCoder 我喜欢 BalusC 的链接,但这似乎是对 JSF 真正目的的冒犯。我曾经也是一名 ASP.NET 开发人员,我对无状态 ASP.NET 也有同样的感觉,但不同之处在于,在 .NET 技术中没有其他众所周知的无状态网页浏览解决方案尚未过时。 Java 没有这个问题,因为有许多框架可以更自然地处理无状态网页,例如 JSP+Struts。 @XtraCoder 在我看来,一个好的框架是完善、​​简化和简化特定类型问题的解决方案,而不是试图糟糕地涵盖所有可能需要的解决方案。就像在餐馆一样,你会去一个有大量菜单但食物平庸的地方,还是去一个有小菜单但厨师非常注重制作美味的地方?后者往往更成功。 【参考方案1】:

JSF 是一个基于组件的框架,它是高度有状态的——所以你需要在某个地方的状态,要么通过网络发送到客户端并再次发布,要么在服务器端。所以 AFAIK 的答案是否定的,你不能禁用视图状态。但是您可以将其最小化 - 但是某些状态将始终需要存储。这个link 是相关的。

如果您正在寻找一个不那么有状态的 Java Web 框架 - 那么也许可以查看一些基于 Action 的框架,例如 Struts 或 Stripes,这样您就可以在 Request 范围内工作,而不需要存在(或重建)组件树在回发。 Play 框架一直受到好评——它是专门针对 RESTful 架构而设计的。我自己没有这方面的经验,但你可能想调查一下。取自 Play 网站:

简单的无状态 MVC 架构

您的一侧有一个数据库,另一侧有一个网络浏览器。为什么 你应该有一个介于两者之间的状态吗?

有状态和基于组件的 Java Web 框架可以很容易地 自动保存页面状态,但这带来了很多其他的 问题:如果用户打开第二个窗口会发生什么?如果 用户点击浏览器后退按钮?

【讨论】:

+1 以获得好的答案。 JSF 就其本质而言是有状态的。要求无国籍的 JSF 就像需要一只宠物猫但试图驯养一只美洲狮。是的,它可能需要付出很多努力,但最终你会得到一个非常不寻常且难以维护的美洲狮,这可能会在以后杀死你。理论上这是可能的,但为什么还要麻烦呢? Struts 或 Stripes 会更合适。【参考方案2】:

从 Mojarra 2.1.19 和 Mojarra 2.2.0-m10 开始,可以通过将 <f:view>transient 属性设置为 true 来禁用基于每个视图的状态保存。

<f:view transient="true">
    ...
    <h:form>
        ...
    </h:form>
    ...
</f:view>

另见:

JSF is going stateless What is the usefulness of statelessness in JSF?

【讨论】:

以上是关于如何禁用 ViewState?的主要内容,如果未能解决你的问题,请参考以下文章

解决webconfig中禁用掉ViewState造成服务器控件回传获取不到值问题

asp.net服务器控件的视图状态viewstate

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=&quo

当 Control 变为 Enable=False 时 ASP.Net ViewState 不起作用

__VIEWSTATE 持有啥?

如何在没有控制问题的情况下停用 ViewState