【问题标题】:What is viewstate in JSF, and how is it used?JSF 中的视图状态是什么,它是如何使用的?
【发布时间】:2011-02-24 00:59:47
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

标签: java jsf richfaces myfaces


【解决方案1】:

问题是:这个值怎么算 用过的?是否用于验证 提交时发送的值,以确保 同一个请求不会发送两次?

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

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

视图状态也可以加密以确保客户端不会更改它。

另外,它是如何计算的 - 我意识到 可以计算richfaces 不同于myfaces,而是一个想法 会很好。

每个组件都负责通过saveStaterestoreState 保持其状态(请参阅tutorial)。所以不同的组件套件会导致不同的视图状态。同样,不同的 JSF 实现可能会导致不同的视图状态。

【讨论】:

  • "要么将状态存储在服务器的内存中并将其绑定到会话,要么每次在请求/响应中对其进行序列化/反序列化。"如何选择一个而不是另一个?
  • @KorayTugay 在配置中有一个参数 javax.faces.STATE_SAVING_METHOD
  • “需要以一种或另一种方式维护跨请求的组件状态。”这种说法似乎不正确。至少没有解释为什么需要维护组件状态。此外,JSF 2.2 引入了无状态视图。
【解决方案2】:

如果您熟悉 JavaScript,您可以将 JSF 组件树想成有点像 HTML DOM,其中 HTML 页面定义初始状态,但您可以在运行时更改它。

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

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

UIView
 - UIForm
    - UICommand
    - UIInput

第二部分定义了组件的状态。由于 UIData 之类的组件,这些组件是分开的,其中子级可以(例如)拥有每行状态。这是通过StateHolder 机制编组/解组的。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 2011-09-03
    • 2011-01-19
    • 1970-01-01
    • 2021-05-10
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多