Problema com validação no JSF

8 respostas
ThiagoWorldCoder

Boa Tarde!!

Estou tentando fazer um login de usuário.

para os dois inputs, usuario e senha, eu estou especificando para que sejam campos obrigatórios. E para isso eu retorno o aviso logo embaixo dos inputs de cada um. Para fazer isso eu coloquei o required = true e requiredMessage=“Campo Obrigatorio!” no input de cada um.

Quando o usuário vai colocar o usuario e senha, e clica no botão entrar, e o usuario ou senha estão errados, eu coloco uma outra mensagem indicando esta falha. Logo abaixo do botão entrar mesmo.

Para esta validação de login ou senha errados, eu acessei o controller, e passei a mensagem para o FacesMessage e o FacesMessage para o FacesContext, a mensagem enviada aparece perfeitamente no h:messages.

O PROBLEMA: Quando o usuário esquece de colocar usuario ou senha, a mensagem de campo obrigatório aparece nos lugares corretos, porém, no h:messages que é da validação que eu fiz pelo controller, aparece as mensagens de campo obrigatório dos inputs também.

abaixo estão os meus códigos e também uma figura com o resultado da página que deu erro:

página de login

<!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:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
      <f:loadBundle basename="paginasCss" var="paginas" />
      <head>
      	<title>Testes</title>
      	
      	<link type="text/css" href="css/login.css" rel="stylesheet" />
      	<link type="text/css" href="css/padrao.css" rel="stylesheet" />
      </head>
      <body bgcolor="#B8B8B8">
      	<div class="login01">
      		<form jsfc="h:form" id="formLogin">
      		<fieldset class="fieldsetLogin"><br />
      				<label for="usuario">Usuario:</label><input jsfc="h:inputText" value="#{usuarioController.usuario.usuario}" size="30" id="usuario" required="true" requiredMessage="Campo Obrigatorio!" />
      				<span jsfc="h:message" for="usuario" class="inputSpan"></span>
      				<br /><br />
      				<label for="senha">Senha:</label><input jsfc="h:inputSecret" value="#{usuarioController.usuario.senha}" class="senha" size="30" id="senha" required="true" requiredMessage="Campo Obrigatorio!"/>
      				<span jsfc="h:message" for="senha" class="inputSpan"></span>
      				<br /><br />
      				<input jsfc="h:commandButton" type="submit" action="#{usuarioController.logar}" class="confirmar" value="Entrar" id="submit" />
      				<br />
      				<span jsfc="h:messages" for="formLogin" class="inputSpan"></span>
      			</fieldset>
      		</form>
      	</div>
      </body>
</html>

meu UsuarioController

package br.com.agenda.controller;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.NoResultException;

import br.com.agenda.dao.UsuarioDaoImp;
import br.com.agenda.entities.Usuario;

public class UsuarioController {

	private UsuarioDaoImp usuarioDaoImp;
	private Usuario usuario;
	
	public UsuarioController(){
		usuario = new Usuario();
	}
	
	public String logar(){

		String resultado = "logar";
		FacesContext context = FacesContext.getCurrentInstance();


		usuarioDaoImp = new UsuarioDaoImp();
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("usuario", usuario.getUsuario());
		params.put("senha", usuario.getSenha());
		try{
			this.setUsuario(usuarioDaoImp.pesquisarElemento("select a from Usuario a where a.usuario=:usuario and a.senha=:senha", params));
			if(this.getUsuario() == null){
				usuario = new Usuario();
				context.addMessage("formLogin", new FacesMessage("Usuario e/ou Senha incorreto!", null));
				resultado = "erro";
			}
		}catch(NoResultException he){
			he.printStackTrace();
		}

		return resultado;
		
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioDaoImp getUsuarioDaoImp() {
		return usuarioDaoImp;
	}

	public void setUsuarioDaoImp(UsuarioDaoImp usuarioDaoImp) {
		this.usuarioDaoImp = usuarioDaoImp;
	}
	
}

Qualquer ajuda é muito bem vinda!!!


8 Respostas

L

utilize o globalOnly=“true” no h:messages.

ThiagoWorldCoder

eu tentei usar o globalOnly=“true”, aí a mensagem parou de duplicar em baixo!!! perfeito!!

mas, agora ele não mostra a mensagem de erro que eu coloquei no FacesMessage!!

De qualquer forma muito obrigado, e quem souber solucionar esse outro problema eu agradeço!!!

evertonsilvagomesjav

Desculpa ai ressucitar o topico mas eu estou tendo o mesmo problema igualzinho, conseguiu resolver? Quando eu coloco o globalOnly=“true” para de duplicar mas tb para de exibir o FacesMessage =/

evertonsilvagomesjav

Alguem?

lindberg713

Posta o código de sua página e o trecho de codigo java onde você adiciona a msg ao FacesContext.

evertonsilvagomesjav

Aqui tem o rich:messages

<!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:h="http://java.sun.com/jsf/html"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets">

<head>
<link rel="stylesheet" type="text/css"
	href="#{facesContext.externalContext.requestContextPath}/css/vivo.css" />
</head>

<body>
	<div class="linhaTopo"></div>
	<div class="tudo">
		<div class="topo">
			<div class="logo"></div>
			<div class="nomeSistema"></div>
			<div class="clear"></div>
			<span id="idData" class="data">
					<h:form id="form">
						<a4j:poll id="poll" interval="1000" enabled="true" limitToList="true"
							 reRender="panelDataHora" />
						<a4j:outputPanel ajaxRendered="true" id="panelDataHora">
							<h:outputLabel id="labelHora" value="#{produtosDiaBB.dataAtual}">
								<f:convertDateTime
									pattern="EEEE, dd 'de' MMMM 'de' yyyy ' | 'HH:mm:ss"
									timeZone="America/Sao_Paulo" />
							</h:outputLabel>
						</a4j:outputPanel>
					</h:form>				
			</span>
		</div>
		<div class="conteudo">
			<ui:insert name="menu">
				<ui:include src="/pages/templates/menu.xhtml" />
			</ui:insert>
			<h:panelGroup styleClass="msgs_panelGroup" id="errors">
				<rich:messages layout="table" fatalClass="erro" infoClass="info" showDetail="true"
					warnClass="alerta" errorClass="erro" >
				</rich:messages>
			</h:panelGroup>
			<ui:insert name="corpo">
			</ui:insert>
			<div class="clear"></div>
		</div>
		<div class="rodape"></div>
	</div>
</body>
</html>
protected void addFacesMessage(Severity sev, final String msg)
	{
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(sev, "", msg));
	}
lindberg713

Cara, to tentando te ajudar mas preciso entender. Pelo que to vendo, vc me mandou a página do seu template. Preciso tb da sua página real, a página do body da sua tela. Nesta, nao tem nenhum botão de ação, nada uqe faça submit na sua página. Como vc ta fazendo submit? Isso ocorre quando a página é exibida ou quando o usuário clica em alguma coisa e faz o submit? Clica onde? A msg especifica é em qual componente? Nao vi requiredMessage nem requiredTrue em nenhuma tag. Cade o action do seu managedbean que é chamado adicionando a msg ao FacesContext?

evertonsilvagomesjav

Aqui esta a tela com o required e o requiredMessage estao no selectOneMenu de Produto

<!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:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:composite="http://java.sun.com/jsf/composite"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">

<ui:composition template="/pages/templates/templatePadrao.xhtml">
	<ui:define name="corpo">
		<h:form>
			<rich:panel styleClass="panelInvisivel">
				<fieldset>
					<legend>Selecione os critérios de consulta</legend>
					<table>
						<tr>
							<td>
								<fieldset style="width: 205px;">
									<legend>* Informe o período </legend>
									<table>
										<tr>
											<td><h:outputLabel value="De:" /></td>
											<td><rich:calendar datePattern="dd/MM/yyyy" value="#{produtosDiaBB.dataInicial}"
													monthLabels="#{produtosDiaBB.listLabelMes}">													
													</rich:calendar></td>
										</tr>
										<tr>
											<td><h:outputLabel value="Até:" /></td>
											<td><rich:calendar datePattern="dd/MM/yyyy"
													value="#{produtosDiaBB.dataFinal}"
													monthLabels="#{produtosDiaBB.listLabelMes}"></rich:calendar></td>
										</tr>
									</table>
								</fieldset>
							</td>
							<td style="width: 100px;"></td>
							<td>
								<table>
									<tr>
										<td><h:outputLabel value="*Produto:" /></td>
										<td><h:selectOneMenu style="width: 290px" required="true" requiredMessage="teste"
												value="#{produtosDiaBB.valueComboProduto}">
												<f:selectItem itemValue="" itemLabel="Selecione..." />
												<f:selectItems
													value="#{produtosDiaBB.listSelectItemProduto}" />
											</h:selectOneMenu></td>
									</tr>
									<tr>
										<td><h:outputLabel value="Tipo de Plano:" /></td>
										<td><h:selectManyListbox
												value="#{produtosDiaBB.listTiposPlanosSelecionados}"
												style="width : 290px; height : 60px;">
												<f:selectItems
													value="#{produtosDiaBB.listSelectItemTipoPlano}" />
											</h:selectManyListbox></td>
									</tr>
								</table>
							</td>
							<td style="width: 100px;"></td>
							<td>
								<table>
									<tr>
										<td><h:outputLabel value="*Interface:" /></td>
										<td><h:selectOneMenu style="width: 290px" 
												value="#{produtosDiaBB.valueComboInterface}">
												<f:selectItem itemValue="" itemLabel="Selecione..." />
												<f:selectItems
													value="#{produtosDiaBB.listSelectItemInterface}" />
											</h:selectOneMenu></td>
									</tr>
									<tr>
										<td><h:outputLabel value="Regional:" /></td>
										<td><h:selectManyListbox
												value="#{produtosDiaBB.listRegionaisSelecionadas}"
												style="width : 290px; height : 60px;">
												<f:selectItems
													value="#{produtosDiaBB.listSelectItemRegional}" />
											</h:selectManyListbox></td>
									</tr>
								</table>
							</td>
						</tr>
					</table>
				</fieldset>
				<br />
				<br />
				<h:panelGrid columns="4">
					<h:outputLabel value="RESULTADO DA CONSULTA DE PRODUTOS" />
					<rich:spacer width="558"></rich:spacer>
					<h:commandButton value="Exportar"
						actionListener="#{produtosDiaBB.exportaArquivoCSV}" />
					<h:commandButton value="Consultar"
						actionListener="#{produtosDiaBB.consultar}" />
				</h:panelGrid>
				<rich:separator lineType="solid" height="1" width="100%"
					align="center" />
				<br />
				<br />
				<br />
				<table>
					<tr>
						<td style="width: 100%;"><rich:dataTable
								id="dadosProdutosDia" rowIndexVar="linhaAtual"
								value="#{produtosDiaBB.listDataModelInteracaoDia}" var="item"
								rows="10" style=" width : 950px;">
								<rich:column id="columData">
									<f:facet name="header">
										<h:outputLabel value="Data" />
									</f:facet>
									<h:outputText value="" />
								</rich:column>

								<rich:column id="columInterface">
									<f:facet name="header">
										<h:outputLabel value="Interface" />
									</f:facet>
									<h:outputText value="#{item.inter.dsInterface}" />
								</rich:column>

								<rich:column id="columProduto">
									<f:facet name="header">
										<h:outputLabel value="Produto" />
									</f:facet>
									<h:outputText value="#{item.produto.dsProduto}" />
								</rich:column>

								<rich:column id="columPlano">
									<f:facet name="header">
										<h:outputLabel value="Plano" />
									</f:facet>
									<h:outputText value="#{item.tipoPlano.dsTipoPlano}" />
								</rich:column>

								<rich:column id="columRegional">
									<f:facet name="header">
										<h:outputLabel value="Regional" />
									</f:facet>
									<h:outputText value="#{item.regional.dsRegional}" />
								</rich:column>

								<rich:column id="columInteracoes">
									<f:facet name="header">
										<h:outputLabel value="Interações" />
									</f:facet>
									<h:outputText value="" />
								</rich:column>

								<rich:column id="columTipoConteudo">
									<f:facet name="header">
										<h:outputLabel value="Tipo Conteúdo" />
									</f:facet>
									<h:outputText value="#{item.tipoConteudo.dsTipoConteudo}" />
								</rich:column>

								<rich:column id="columSucesso">
									<f:facet name="header">
										<h:outputLabel value="Sucesso" />
									</f:facet>
									<h:outputText value="" />
								</rich:column>

								<rich:column id="columAbandonos">
									<f:facet name="header">
										<h:outputLabel value="Abandonos" />
									</f:facet>
									<h:outputText value="" />
								</rich:column>

								<rich:column id="columErros">
									<f:facet name="header">
										<h:outputLabel value="Erros" />
									</f:facet>
									<h:outputText value="" />
								</rich:column>

								<f:facet name="footer">
									<rich:datascroller id="paginacaoProdutosDia" align="center"
										for="dadosProdutosDia" />
								</f:facet>
							</rich:dataTable></td>
					</tr>
				</table>
				<h:outputLabel value="#{msg.campos_obrigatorios}" />
			</rich:panel>
		</h:form>
	</ui:define>
</ui:composition>
</html>

O submit ocorre quando clico em consultar.

Criado 18 de julho de 2008
Ultima resposta 6 de mar. de 2012
Respostas 8
Participantes 4