Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Formulário não está sendo zerado novamente

Estou conseguindo inserir e listar os livros normalmente, entretanto quando eu insiro, o formulário não esvazia novamente. Gostaria de saber o que estou fazendo de errado. Como faz para o JSF zerar os formulários?

Segue o código do arquivo livro.xhtml

<p:fieldset legend="Dados do livro">
                <p:panelGrid columns="2">

                    <p:outputLabel value="Titulo:" for="titulo" />
                    <p:inputText id="titulo" value="#{livroBean.livro.titulo}"
                        required="True" requiredMessage="Título do livro obritório"
                        validatorMessage="Título não pode ser maior que 40 caracteres">
                        <f:validateLength maximum="40" />
                        <f:ajax event="blur" render="messages" />
                    </p:inputText>

                    <p:outputLabel value="ISBN:" for="isbn" />
                    <p:inputMask id="isbn" value="#{livroBean.livro.isbn}"
                        mask="999-9-99-999999-9">
                        <f:ajax event="keypress" render="messages" />
                    </p:inputMask>

                    <p:outputLabel value="Preço:" for="preco" />
                    <p:inputText id="preco" value="#{livroBean.livro.preco}"
                        validatorMessage="O preço precisa estar entre 1.00 e 1000.00">
                        <f:validateDoubleRange minimum="1.00" maximum="1000.00" />
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            cyrrencySymbol="R$" locale="pt-BR" />
                    </p:inputText>

                    <p:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                    <p:calendar id="dataLancamento"
                        value="#{livroBean.livro.dataLancamento.time}"
                        pattern="dd-MM-yyyy" mask="true" timeZone="America/Sao_Paulo">
                    </p:calendar>

                </p:panelGrid>
            </p:fieldset>


            <p:fieldset legend="Dados do Autor">
                <p:panelGrid columns="4">
                    <p:outputLabel value="Selecione Autor:" for="autor" />
                    <p:selectOneMenu value="#{livroBean.autorId}" id="autor">
                        <f:selectItems value="#{livroBean.autores}" var="autor"
                            itemLabel="#{autor.nome}" itemValue="#{autor.id}" />
                    </p:selectOneMenu>

                    <p:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}" 
                    process="@this autor" update="tabelaAutores">
                    </p:commandButton>

                    <p:commandLink value="ou cadastrar novo autor"
                        action="#{livroBean.formAutor}" immediate="true" update="@all"/>
                </p:panelGrid>


                <p:dataTable value="#{livroBean.autoresDoLivro}" var="autor"
                    id="tabelaAutores" emptyMessage="Nenhum autor">
                    <p:column>
                        <h:outputText value="#{autor.nome}" />
                    </p:column>

                    <p:column>
                        <p:commandLink value="X" action="#{livroBean.removeAutor(autor)}" update="tabelaAutores" process="@this"/>
                    </p:column>
                </p:dataTable>

            </p:fieldset>

            <p:commandButton value="Gravar" action="#{livroBean.gravar}" process="@form" update="@form :formTabelaLivros:tabelaLivros"/>

        </h:form>
2 respostas
solução!

Olá Gustavo,

Você sabe dizer qual é o Scopo do seu LivroBean? é comum utilizarmos o @RequestScoped (anotacao na classe), dessa forma o objeto é eliminado a cada request evitando que o formulário continue existindo, porém se você estiver utilizando ViewScoped ou SessionScoped o objetivo vai ficar na memória e o seu formulário vai continuar preenchido mesmo após o registro.

Uma outra alternativa seria zerar os atributos do seu bean após inserir um novo registro, porém é recomendado ajustar o scopo corretamente.

Olá Denis,

Obrigado pela resposta. Realmente, a minha classe estava com o escopo @ViewScoped. Por conta disso, o objeto se mantém.