什么是JSF 2.0中的STATE_SAVING_METHOD参数

我无法理解web.xml中这一行的function

<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接口)。 我的豆在@ViewScope 。 但是当我把它改成服务器时,事情就会起作用。 为什么? 当我使用客户端和服务器时有什么不同。 任何人都可以借助一个例子来解释我。

谢谢

 java.io.NotSerializableException 

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

通常, 让托pipe的bean类可串行化并不总是足够的。 您还需要确保它的每个属性都是可序列化的。 像StringLong等大多数标准types都已经实现了Serializable 。 但是(自定义的)复杂的types,比如嵌套的bean,实体或者EJB也应该是可序列化的。 如果某些东西不能像Serializable那样真正实现,比如InputStream ,那么你应该重新devise模型或者使其成为transient (并且记住在反序列化之后它将是null )。


当我使用客户端和服务器时有什么不同

首先介绍一些背景信息: 为什么JSF将UI组件的状态保存在服务器上?

主要的技术区别在于, client设置将整个视图状态存储为生成的HTML输出中的javax.faces.ViewState隐藏input字段的值,并且server设置将其存储在会话中以及唯一的ID将其引用为javax.faces.ViewState隐藏的input字段的值。

所以,设置到client增加networking带宽的使用量,但是会减less服务器的内存使用量,而对server设置则会相反。 然而,设置到client还有一个额外的function优势:当会话过期或客户端打开太多视图时,它会阻止ViewExpiredException

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

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

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

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