我设法得到一个原型,JSF2在这个tutorial之后开始在Googles AppEngine工作。现在我对ViewScoped ManagedBean有一些奇怪的行为:
@ManagedBean @ViewScoped
public class TestBean implements Serializable
{
private String text; //getter/setter
private List<String> texts; //getter
@PostConstruct public void init()
{
texts = new ArrayList<String>();
texts.add("Test");
text = new String();
}
public void save(ActionEvent ae)
{
texts.add(text);
text = new String();
}
}
这是我的.xhtml页面:
<h:body id="body">
<f:view contentType="text/html">
<h:form id="frm">
<p:panel>
<h:panelGrid columns="2" id="grid">
<p:inputText value="#{testBean.text}"/>
<p:commandButton value="Add" update=":frm:op @parent"
actionListener="#{testBean.save}" />
</h:panelGrid>
</p:panel>
<p:outputPanel id="op">
<p:dataTable var="v" value="#{testBean.texts}">
<p:column><h:outputText value="#{v}" /></p:column>
</p:dataTable>
</p:outputPanel>
</h:form>
</f:view>
</h:body>
这适用于本地部署(使用GAE的Eclipse工具),但如果我将其部署到GAE,如果我点击添加 -Button,则没有任何反应。范围(GAE)的其他测试在点击添加后显示以下内容:
@RequestScoped
:输入的文字不会消失,也不会添加到dataTable @ViewScoped
:输入的文字不会消失,也不会添加到dataTable @SessionScoped
:输入的文字消失,dataTable始终有两个条目:“测试”和最后输入的文本我在教程中有相同的设置
<context-param> //web.xml
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
//appengine-web.xml
<sessions-enabled>true</sessions-enabled>
更新1
以下是使用@ManagedBean @ViewScoped
注释的其他测试的结果:
在第一次请求(或手动刷新页面)期间,调用@PostConstruct init()
方法。如果我单击按钮没有发生,则会在app引擎日志中记录对test.jsf
的请求,但我的save()
方法中没有记录。 Firebug向我显示了对test.jsf
的POST请求以及以下答案:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error>
<error-name>class javax.faces.application.ViewExpiredException</error-name>
<error-message>
<![CDATA[viewId:/test.jsf - View /test.jsf could not be restored.]]>
</error-message>
</error>
<extension primefacesCallbackParam="validationFailed">
{"validationFailed":false}
</extension>
</partial-response>
更新2
我使用过mojarra-2.0.4但现在更新到2.0.6。同样的问题,但一个新观察:如果我清除所有Firefox缓存,ViewExpiredException
没有出现,但我只能向List<String>
添加1个元素。 @PostConstruct
仅调用一次,而不是每次点击按钮。
然后我尝试了myfaces-2.0.7,但得到了这个例外:
Uncaught exception from servlet
java.lang.NoClassDefFoundError: Could not initialize class
com.google.apphosting.runtime.security.shared.stub.javax.naming.InitialContext
我不确定我是否应该尝试使用myfaces,因为谷歌在他们的教程中明确提到了mojarra(2.0.4)。
参考
答案 0 :(得分:3)
通常情况下,我不回答我的问题,我只将此答案评为解决方法,而不是正确答案。事件,如果我不喜欢客户端状态保存,这似乎修复了奇怪的行为。但我必须详细检查一下:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
也许我们应该等到JAVASERVERFACES-1886得到解决。