代码之家  ›  专栏  ›  技术社区  ›  Matthew Farwell

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

  •  26
  • Matthew Farwell  · 技术社区  · 16 年前

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

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

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

    另外,它是如何计算的-我意识到RichFaces的计算方式可能与我的Faces不同,但有一个想法是不错的。

    谢谢。

    2 回复  |  直到 13 年前
        1
  •  25
  •   ewernli    16 年前

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

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

    对于afaik,viewstate不用于检测双重提交,但如果附加时间戳或类似的东西,则可以检测到双重提交。

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

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

    每个组件负责用 saveState restoreState (见此 tutorial )所以不同的组件套件会导致不同的视图状态。同样,不同的JSF实现可能导致不同的视图状态。

        2
  •  12
  •   McDowell rahul gupta    16 年前

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

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

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

    UIView
     - UIForm
        - UICommand
        - UIInput
    

    第二部分定义了组件的状态。由于Uidata等组件的存在,它们是分开的,在这些组件中,子级可以拥有(例如)每行状态。这是通过 StateHolder 机制。

    推荐文章