什么是JSF中的viewstate,它是如何使用的?

时间:2010-05-26 07:02:25

标签: java jsf richfaces myfaces

在JSF中,有一个与每个页面关联的视图状态,它通过提交等来回传递。

我知道viewstate是使用页面上各种控件的状态计算的,并且您可以将其存储在客户端或服务器端。

问题是:这个值是如何使用的?是否用于验证在提交时发送的值,以确保不会发送相同的请求两次?

另外,它是如何计算的 - 我意识到富脸可能与myfaces的计算方式不同,但是一个想法会很好。

感谢。

2 个答案:

答案 0 :(得分:25)

  

问题是:这个价值如何   用过的?它是用于验证   提交时发送的值,以确保   相同的请求不会发送两次?

viewstate存在的原因是因为HTTP是无状态的。跨请求的组件状态需要以某种方式维护。您可以将状态存储在服务器上的内存中并将其绑定到会话,或者每次在请求/响应中对其进行序列化/反序列化。

AFAIK,视图状态不用于检测双重提交,但如果您附加时间戳或类似的东西,则可以使用它。

还可以对viewstate进行加密,以确保客户端不会更改它。

  

另外,如何计算 - 我意识到   可以计算丰富的面孔   不同于myfaces,但一个想法   会很好。

每个组件都有责任使用saveStaterestoreState来保持其状态(请参阅此tutorial)。因此不同的组件套件会导致不同的视图状态。类似地,不同的JSF实现可能会导致不同的视图状态。

答案 1 :(得分:12)

如果你熟悉JavaScript,你可以认为JSF组件树有点像HTML DOM,其中HTML页面定义了初始状态,但你可以在运行时改变它。

视图技术(通常是JSP或Facelets)定义了初始状态,但之后它可以以编程方式进行操作。例如,您可以添加component或设置property。为了使其正常工作,必须在请求之间保持视图状态。

视图状态分为两部分。第一个定义组件树的结构:

UIView
 - UIForm
    - UICommand
    - UIInput

第二部分定义组件的状态。由于像UIData这样的组件,它们是分开的,其中子项可以(例如)每行状态。这是通过StateHolder机制编组/解组的。