为什么JSF页面保留旧数据?

时间:2015-04-17 13:24:15

标签: jsf

我有一个简单的创建页面和保存按钮。我第一次运行应用程序时一切都很好但在此之后它保留了以前创建的值。

<ui:composition template="/template.xhtml">
    <ui:define name="title">
        <h:outputText value="#{bundle.CreateProjectsTitle}"></h:outputText>
    </ui:define>

    <ui:define name="body">
        <h:panelGroup id="messagePanel" layout="block">
            <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
        </h:panelGroup>

        <h:form>
            <h:panelGrid columns="2">
                <h:outputLabel value="#{bundle.CreateProjectsLabel_projectName}"
                               for="projectName"/>

                <h:inputText  id="projectName"
                              value="#{projectsController.selected.projectName}"
                              title="#{bundle.CreateProjectsTitle_projectName}"/>
            </h:panelGrid>
            <p:commandButton action="#{projectsController.create}"
                             value="#{bundle.CreateProjectsSaveLink}"
                             onclick="window.close()"/>
        </h:form>
    </ui:define>
</ui:composition>

2 个答案:

答案 0 :(得分:3)

由于projectsController是会话作用域,因此它会被实例化一次,并且只要会话处于活动状态,该实例就会保留。当您在其字段中输入值时,它们会一直保留,直到您更改它们为止。

您的选择

  • 将范围更改为@RequestScope,这样就会在每个请求上初始化bean
  • 可能在按钮操作完成后重置某些操作中所需的值

答案 1 :(得分:2)

页面上的值存储在绑定到页面的Java对象中。在这种情况下,projectsController

java对象根据您为它们定义的范围具有生命周期。因此,只要该范围持续,页面上的值将保留,除非您明确地对它们执行某些操作。

如果您希望每次提交页面时都重置页面,则应该将其设置为作用域。