我无法理解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 中。但是当我把它改成服务器时,事情就会起作用。为什么?使用客户端和服务器时有什么区别。任何人都可以借助一个例子来解释我。
由于
答案 0 :(得分:56)
java.io.NotSerializableException
这种异常通常在根本原因中显示一条消息,该消息显示未实现Serializable
的类的完全限定类名。您应该密切关注此消息,以了解它正在讨论哪个类,然后让它相应地实现Serializable
。
通常,只使 您的托管bean类可序列化并不总是足够的。您还需要确保其每个属性也可序列化。大多数标准类型(例如String
,Long
等)都已实现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
。
如果状态保存在客户端上,则整个视图的状态将呈现在页面上的隐藏字段中。