1

我正在使用 JSF 创建一个应用程序。我遇到的问题是每次刷新页面时都会执行命令按钮的操作(ProjectEntityHandlerBean.insertNewProject),从而导致数据库中出现多个不需要的条目。我查看了一个相关的线程,但对我的情况没有帮助:

刷新页面时如何避免重新执行最后一个表单提交操作?

下面是 .xhtml 代码,bean 的代码。如果有人可以提供帮助,我将不胜感激...

public String insertNewProject()
{   
    System.out.println("Enter insert method");
    Project project = new Project();
    project.setProjectName(this.projectName);
    project.setDescription(this.description);
    project.setDuration(this.duration);
    ProjectHandler ph = new ProjectHandler();
    ph.create(project);
    return "viewid?faces-redirect=true";


}

<p:tab title="Insert">
            <h:form style="height: 500px; ">
                Insert new Project
                    <h:panelGrid border="2" columns="2" style="height: 200px; width: 383px; ">
                        <h:outputText value="project name"></h:outputText>
                        <h:inputText value="#{ProjectEntityHandlerBean.projectName}"></h:inputText>
                        <h:outputText value="project description"></h:outputText>
                        <h:inputText value="#{ProjectEntityHandlerBean.description}"></h:inputText>
                        <h:outputText value="project duration (Months)"></h:outputText>
                        <h:inputText value="#{ProjectEntityHandlerBean.duration}"></h:inputText>
                    </h:panelGrid>
                    <h:commandButton value="Submit" action="#{ProjectEntityHandlerBean.insertNewProject}"></h:commandButton>
            </h:form>       
        </p:tab>
4

3 回答 3

1

如果您发布数据,然后刷新页面,浏览器将重新发送数据。有些人会先发出警告。

防止这种情况的一种方法是使用 ajax 发布,但发布后的导航是有限的。Ajax 可以通过<p:ajax process="@form" update="@form"/>commandButton 的简单子级来启用,或者通过使用 primefaces 自己的 commandbutton 来启用<p:commandButton ajax="true" process="@form" update="@form"/>

于 2012-10-17T15:13:14.923 回答
1

始终对表单使用 Post-Redirect-Get 模式。

于 2012-10-18T08:50:11.543 回答
0

在任何 Web 应用程序中解决此问题的一般方法是将您的 POST 重定向到 GET 以显示结果。然后可以刷新 GET 而不会影响您的数据库。

于 2012-10-17T15:19:10.977 回答