JSF 中什么是视图状态,如何使用它?
在 JSF 中,有一个与每个页面关联的视图状态,该视图状态与提交等来回传递。
我知道视图状态是使用页面上各种控件的状态计算的,您可以存储它客户端或服务器端。
问题是:如何使用这个值?它是否用于验证提交时发送的值,以确保同一请求不会发送两次?
另外,它是如何计算的 - 我意识到richfaces的计算可能与myfaces不同,但是一个想法会很好。
谢谢。
在 JSF 中,有一个与每个页面关联的视图状态,该视图状态与提交等来回传递。
我知道视图状态是使用页面上各种控件的状态计算的,您可以存储它客户端或服务器端。
问题是:如何使用这个值?它是否用于验证提交时发送的值,以确保同一请求不会发送两次?
另外,它是如何计算的 - 我意识到richfaces的计算可能与myfaces不同,但是一个想法会很好。
谢谢。
问题是:如何使用这个值?它是否用于验证提交时发送的值,以确保同一请求不会发送两次?
视图状态存在的原始原因是因为 HTTP 是无状态的。需要以某种方式维护跨请求的组件状态。将状态存储在服务器上的内存中并将其绑定到会话,或者每次在请求/响应中序列化/反序列化它。
AFAIK,视图状态不用于检测双重提交,但如果您附加时间戳或类似的东西,它可以。
还可以对视图状态进行加密,以确保客户端不会更改它。
另外,它是如何计算的 - 我意识到richfaces的计算可能与myfaces不同,但是一个想法会很好。
每个组件都负责使用 和 (请参阅本教程)持久保存其状态。因此,不同的组件套件会导致不同的视图状态。同样,不同的 JSF 实现可能会导致不同的视图状态。saveState
restoreState
如果你熟悉 JavaScript,你可以把 JSF 组件树想象成一个类似于 HTML DOM 的 JSF 组件树,其中 HTML 页面定义了初始状态,但你可以在运行时更改它。
视图技术(通常是JSP或Facelets)定义了初始状态,但之后可以通过编程方式对其进行操作。例如,可以添加组件或设置属性。为了使其正常工作,视图状态必须在请求之间持久化。
视图状态分为两部分。第一个定义组件树的结构:
UIView
- UIForm
- UICommand
- UIInput
第二部分定义组件的状态。由于像 UIData 这样的组件,这些是分开的,其中子级可以具有(例如)每行状态。这是通过国家持有者机制编组/取消编组的。