单击运行清除表单的JS函数的按钮后,无法恢复视图

时间:2012-02-03 17:50:15

标签: java javascript jsf primefaces viewexpiredexception

我的表格存在问题。该表单允许用户在一些文本框中输入信息,然后有2个按钮 - 搜索和重置。

表格代码:

<h:outputText value="Search by Author Name" styleClass="p" />

<div class="investigatorTab">

    <h:outputLabel for="firstName" rendered="true" value="First Name" />
    <h:inputText value="#{pubBacker.firstName}"></h:inputText>

    <h:outputLabel for="lastName" rendered="true" value="Last Name" />
    <h:inputText value="#{pubBacker.lastName}"></h:inputText>

</div>

<div class="buttons">
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" />
    <p:commandButton value="Reset" type="button" actionListener="#{pubBacker.clearEntries}" onclick="clearForm(this.form);" />
</div>

我遇到的问题是,如果我点击搜索按钮,它会将我带到结果页面,如果我返回搜索页面,它仍然包含我在文本字段中搜索过的数据,因为bean是会话作用域。我希望能够单击“重置”按钮,并清除文本字段中的数据。

目前使用下面的代码,如果我单击“重置”按钮,搜索按钮将不再起作用,并且在firebug控制台中它会给我这个错误

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class javax.faces.application.ViewExpiredException</error-name><error-message><![CDATA[viewId:/ccadmin/pubManagement.xhtml - View /ccadmin/pubManagement.xhtml could not be restored.]]></error-message></error></partial-response>

如果我从第二个onclick="clearForm(this.form);"中移除p:commandButton,则该表单可以正常使用。

为什么调用JS函数会使视图过期?

出版Bean:

@ManagedBean(name="pubBacker")
@SessionScoped
public class Publication {

    public Publication() {}

    public void clearEntries() {
        new Publication();
    }
}

1 个答案:

答案 0 :(得分:1)

您通过盲目循环form.elements显然正在清除表单中的所有元素。这样,JSF自动包含的javax.faces.ViewState隐藏输入字段也将被清除,因此JSF将检索空值,并且它将无法在服务器端找到关联的视图状态。这最终会以ViewExpiredException结尾。

我建议不要使用JS来清除表单,而只使用JSF。如果你有一个代表表格的模型,那就容易多了。

<div class="investigatorTab">
    <h:outputLabel for="firstName" rendered="true" value="First Name" />
    <h:inputText value="#{pubBacker.pub.firstName}"></h:inputText>

    <h:outputLabel for="lastName" rendered="true" value="Last Name" />
    <h:inputText value="#{pubBacker.pub.lastName}"></h:inputText>
</div>

<div class="buttons">
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" />
    <p:commandButton value="Reset" action="#{pubBacker.clear}" process="@this" update="@form" />
</div>

(注意process="@this",这不会处理表单的输入值,因此不会对其进行验证)

public void clear() {
    pub = new Pub();
}