什么是JSF 2.0中的STATE_SAVING_METHOD参数

时间:2011-12-12 08:23:03

标签: jsf-2

我无法理解web.xml中此行的功能

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

我已经读过NetBeans默认是客户端。我刚遇到一个问题,我的应用程序中有很多bean,而<param-value>已设置为client,所以我得到了

  

java.io.NotSerializableException

错误虽然我的bean是Serializable(即他们实现了Serializable接口。)。我的bean在 @ViewScope 中。但是当我把它改成服务器时,事情就会起作用。为什么?使用客户端和服务器时有什么区别。任何人都可以借助一个例子来解释我。

由于

2 个答案:

答案 0 :(得分:56)

java.io.NotSerializableException

这种异常通常在根本原因中显示一条消息,该消息显示未实现Serializable的类的完全限定类名。您应该密切关注此消息,以了解它正在讨论哪个类,然后让它相应地实现Serializable

通常,只使 您的托管bean类可序列化并不总是足够的。您还需要确保其每个属性也可序列化。大多数标准类型(例如StringLong等)都已实现Serializable。但是(自定义)复杂类型(如嵌套bean,实体或EJB)也应该是可序列化的。如果某些内容无法真正实现为Serializable,例如InputStream,那么您应该重新设计模型或将其设为transient(并请记住它将是null反序列化后。)


  

使用客户端和服务器时有什么区别

首先是一些背景信息:Why JSF saves the state of UI components on server?

主要技术差异是client设置将整个视图状态存储为生成的HTML输出中javax.faces.ViewState隐藏输入字段的值,并且server设置存储它在会话中以及唯一ID,该ID又被引用为javax.faces.ViewState隐藏输入字段的值。

因此,设置为client会增加网络带宽使用量,但会降低服务器内存使用量,而设置为server会相反。但是,设置为client还有一个额外的功能优势:它会在会话过期或客户端打开过多视图时阻止ViewExpiredException

答案 1 :(得分:13)

javax.faces.STATE_SAVING_METHOD参数用于指定状态应保存的位置。

如果要在服务器上保存状态(这是JavaServer Faces参考实现中的默认值),请将param-value值指定为server

否则,要在客户端保存状态,我们可以在client中指定param-value

如果状态保存在客户端上,则整个视图的状态将呈现在页面上的隐藏字段中。