Mensagem de Erro Não some da tela

Pessoal

Sou iniciante no java ainda, estou no 4º semestre e não entendo muito bem de java, não dava muita atenção, mas agora ando apaixonado por JAVA… (principalmente depois que conheci o JSF)

Então, esse ainda é o meu primeiro ‘projeto’ era pra eu ter começado a fazer no início do semestre, mas bobiei como sempre e cá estou…no ‘desespero’

Estou fazendo um ‘estacionamento’ pra faculdade UNASP (Faculdade Adventista)

A mensagem de erro não some da tela, coloquei o f:validateLength e o required, e quando da erro, os erros não somem da tela, e vão somando mesmo atualizando a página (F5)

Por favor, quem puder colaborar eu agradeço muito

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

    <h:head>
        <title>TED Parker!</title>
        <h:outputStylesheet name="css/jsfcrud.css"/>
    </h:head>

    <h:body>
        <div id="container">

            <div id="header">
                <h:link outcome="/index" value="#{bundle.ViewClienteIndexLink}"/>  |  <h:link outcome="/cliente/Create" value="Cadastrar Clientes"/>  |  <h:link outcome="/veiculo/Create" value="Cadastrar Veículos"/>  |  <h:link outcome="/estacionar/List" value="Estacionar"/>
            </div>

            <div id="content">


                <ui:composition template="/template.xhtml">
                    <ui:define name="title">
                        <h:outputText value="#{bundle.CreateVeiculoTitle}"></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">
                                <f:validateLength minimum="8" >
                                    <h:outputLabel value="#{bundle.CreateVeiculoLabel_placa}" for="placa" />
                                    <h:inputText id="placa" value="#{veiculoController.selected.placa}" title="#{bundle.CreateVeiculoTitle_placa}" maxlength="10" validatorMessage="Campo Placa Necessário" />
                                </f:validateLength>

                                <f:validateLength minimum="4" >
                                    <h:outputLabel value="#{bundle.CreateVeiculoLabel_modelo}" for="modelo" />
                                    <h:inputText id="modelo" value="#{veiculoController.selected.modelo}" title="#{bundle.CreateVeiculoTitle_modelo}" maxlength="20" validatorMessage="Campo Modelo Necessário" />
                                    <h:outputLabel value="#{bundle.CreateVeiculoLabel_cor}" for="cor" />
                                    <h:inputText id="cor" value="#{veiculoController.selected.cor}" title="#{bundle.CreateVeiculoTitle_cor}" maxlength="20" validatorMessage="Campo Cor Necessário" />
                                    <h:outputLabel value="#{bundle.CreateVeiculoLabel_ano}" for="ano" />
                                    <h:inputText id="ano" value="#{veiculoController.selected.ano}" title="#{bundle.CreateVeiculoTitle_ano}" maxlength="4" validatorMessage="Campo Ano Necessário" />
                                    <!--<h:outputLabel value="#{bundle.CreateVeiculoLabel_id}" for="id" />
                                    <h:inputText id="id" value="#{veiculoController.selected.id}" title="#{bundle.CreateVeiculoTitle_id}" />-->
                                </f:validateLength>
                            </h:panelGrid>
                            <br />
                            <h:commandLink action="#{veiculoController.create}" value="#{bundle.CreateVeiculoSaveLink}" />
                            <br />
                            <br />
                            <h:commandLink action="#{veiculoController.prepareList}" value="#{bundle.CreateVeiculoShowAllLink}" immediate="true"/>
                            <br />
                            <br />

                        </h:form>
                    </ui:define>
                </ui:composition>
            </div>
            <div id="footer">
                Todos os direitos Reservados®
            </div>
        </div>


    </h:body>


</html>

E quais são os erros?

Então, os erros que aparecem sou eu quem faço de propósito, para cair nessas validações

[code]<f:validateLength minimum=“4” >

… maxlength=“10” validatorMessage=“Campo Placa Necessário” />[/code]

O erro aparece por exemplo, “CAMPO PLACA NECESSÁRIO” mas não some…

Bem, isso não é um erro - é a mensagem da validação. Depois de preencher o campo e submeter novamente, deveria sumir…

Pois é,

O problema é que se eu deixo o campo ‘NULO’ e mando ‘CADASTRAR’

Ele da o ERRO da validação… e esse erro se mantém na tela, mesmo eu apertando F5…

Em seguida, mesmo com o campo devidamente preenchido, ele da o mesmo erro, criando uma segunda msg do mesmo erro, e assim sucessivamente, somando os erros… :s

Então reveja sua tela e faça conforme o modelo:

<h:inputText>
   <f:validateLength>
</h:inputText>

pois o seu está ao contrário, com os inputs dentro do validate…

Hahahahaha!!!

Valeu cara!!

Agradeço a colaboração!!!

Deu certinho!

Se não for abusar muito da suaa boa vontade, tenho outra pra você

Após eu cadastrar um veículo, ou deletar um veículo, os dados do veículo ficam aparecendo nos inputText, como se eu fosse cadastrá-los…

Aí eu alterno entre os links e volto para o Create e some,

Meu professor disse que eu teria deixado alguma coisa na classe do tipo @Session @Cookies (como se fosse PHP), mas que eu saiba não deixei nada disso não…

[quote=Roselito Fávero da Silva]Então reveja sua tela e faça conforme o modelo:

<h:inputText>
   <f:validateLength>
</h:inputText>

pois o seu está ao contrário, com os inputs dentro do validate…[/quote]

Você tem que se certificar que o objeto “selected” do seu bean está zerado, quando for mostrar a tela para criar Cliente. Principalmente se o escopo do seu bean for @SessionScoped, ou @ViewScoped

Olha aí por gentileza


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package estacionamento.bean;

import estacionamento.Cliente;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author rgto777
 */
@Stateless
public class ClienteFacade extends AbstractFacade<Cliente> {
    @PersistenceContext(unitName = "teste2")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ClienteFacade() {
        super(Cliente.class);
    }
    
}

e

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package estacionamento.bean;

import estacionamento.Veiculo;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author rgto777
 */
@Stateless
public class VeiculoFacade extends AbstractFacade<Veiculo> {
    @PersistenceContext(unitName = "teste2")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public VeiculoFacade() {
        super(Veiculo.class);
    }
    
}

Eu estava me referindo ao seu bean veiculoController. Ele tem um atributo chamado selected, que tem que ser zerado quando for cadastrar um cliente.

package estacionamento.jsf;

import estacionamento.Veiculo;
import estacionamento.jsf.util.JsfUtil;
import estacionamento.jsf.util.PaginationHelper;
import estacionamento.bean.VeiculoFacade;

import java.io.Serializable;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;


@Named("veiculoController")
@SessionScoped
public class VeiculoController implements Serializable {


    private Veiculo current;
    private DataModel items = null;
    @EJB private estacionamento.bean.VeiculoFacade ejbFacade;
    private PaginationHelper pagination;
    private int selectedItemIndex;

    public VeiculoController() {
    }

    public Veiculo getSelected() {
        if (current == null) {
            current = new Veiculo();
            selectedItemIndex = -1;
        }
        return current;
    }

    private VeiculoFacade getFacade() {
        return ejbFacade;
    }
    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {

                @Override
                public int getItemsCount() {
                    return getFacade().count();
                }

                @Override
                public DataModel createPageDataModel() {
                    return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem()+getPageSize()}));
                }
            };
        }
        return pagination;
    }

    public String prepareList() {
        recreateModel();
        return "List";
    }

    public String prepareView() {
        current = (Veiculo)getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "View";
    }

    public String prepareCreate() {
        current = new Veiculo();
        selectedItemIndex = -1;
        return "Create";
    }

    public String create() {
        try {
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("VeiculoCreated"));
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String prepareEdit() {
        current = (Veiculo)getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "Edit";
    }

    public String update() {
        try {
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("VeiculoUpdated"));
            return "View";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String destroy() {
        current = (Veiculo)getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        performDestroy();
        recreatePagination();
        recreateModel();
        return "List";
    }

    public String destroyAndView() {
        performDestroy();
        recreateModel();
        updateCurrentItem();
        if (selectedItemIndex >= 0) {
            return "View";
        } else {
            // all items were removed - go back to list
            recreateModel();
            return "List";
        }
    }

    private void performDestroy() {
        try {
            getFacade().remove(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("VeiculoDeleted"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    private void updateCurrentItem() {
        int count = getFacade().count();
        if (selectedItemIndex >= count) {
            // selected index cannot be bigger than number of items:
            selectedItemIndex = count-1;
            // go to previous page if last page disappeared:
            if (pagination.getPageFirstItem() >= count) {
                pagination.previousPage();
            }
        }
        if (selectedItemIndex >= 0) {
            current = getFacade().findRange(new int[]{selectedItemIndex, selectedItemIndex+1}).get(0);
        }
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

    private void recreateModel() {
        items = null;
    }

    private void recreatePagination() {
        pagination = null;
    }

    public String next() {
        getPagination().nextPage();
        recreateModel();
        return "List";
    }

    public String previous() {
        getPagination().previousPage();
        recreateModel();
        return "List";
    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }

    public Veiculo getVeiculo(java.lang.Long id) {
        return ejbFacade.find(id);
    }
    
    @FacesConverter(forClass=Veiculo.class)
    public static class VeiculoControllerConverter implements Converter {

        @Override
        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            VeiculoController controller = (VeiculoController)facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "veiculoController");
            return controller.getVeiculo(getKey(value));
        }

        java.lang.Long getKey(String value) {
            java.lang.Long key;
            key = Long.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Long value) {
            StringBuilder sb = new StringBuilder();
            sb.append(value);
            return sb.toString();
        }

        @Override
        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Veiculo) {
                Veiculo o = (Veiculo) object;
                return getStringKey(o.getId());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: "+Veiculo.class.getName());
            }
        }

    }

}

Olhe as linhas entre 76 e 80… lá o veículo é zerado. Mas na sua página, não há uma chamada para este método, o prepareCreate. Então o veículo nunca é zerado, fica sempre o último editado.

Outra coisa, seu bean não segue boas práticas, não tem vários atributos declarados, apenas os getters e setters… funciona, mas fica difícil acompanhar, e com alguns frameworks pode dar problemas. Sei que você está iniciando, e por isso mesmo estou chamando sua atenção para isso.

=/

Tenho que chamar o método prepareCreate nas minhas páginas create.xhtml ??

Onde eu vejo um manual de boas práticas?

Ou melhor, quais livros eu leio pra entender melhor de JAVA?

Estou gostando disso cara, porém é foda, só carga da facul não incrementa muita coisa

Então sugiro que você estude esse livro:

Não é caro, e aborda até a parte de Spring, bem tranquilo. Aí você vai conseguir reestruturar seu projeto e acabar com suas dúvidas.