Jsf - validar login campos requeridos

Olá
Bom dia!

Preciso validar esse meu login da seguinte maneira :
Nao posso fazer login sem preencher os inputs
ou seja teria que apresentar uma mensagem de requerido nos dois input caso o usuario queira
submeter a pagina sem preencher os campos.

Como faria isso?

Estou enviando o jsp e o bean.

Grato

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

<ui:composition template="/templates/common.jsp">
       <ui:define name="body">
           <h:form id="formLogin">
            <h:panelGrid columns="1" id="LoginGrid">

                      <h:panelGrid columns="2">
                           <h:outputLabel id="labelUsu" value="Usuario:"
binding="#{formLogin.labelUsu}"></h:outputLabel>
                       <h:inputText id="inputUsu"
binding="#{formLogin.inputUsu}"></h:inputText>
                  </h:panelGrid>
                      <h:panelGrid columns="2">
                           <h:outputLabel id="labelPwd" value="Senha:"
binding="#{formLogin.labelPwd}"></h:outputLabel>
                       <h:inputSecret  id="inputSenha" size="15"
binding="#{formLogin.inputSenha}" ></h:inputSecret>
                  </h:panelGrid>
          </h:panelGrid>


          <h:panelGrid columns="2">
               <h:commandButton id="botaoSalvar" value="Enviar"
action="formularioPai">         </h:commandButton>
          </h:panelGrid>


               </h:form>
       </ui:define>
 </ui:composition>
</html>




=====================================bean================================================

package br.com.bicbanco.lab.mb;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.component.UISelectItem;
import javax.faces.component.UISelectItems;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlInputTextarea;
import javax.faces.component.html.HtmlOutputLabel;
import javax.faces.component.html.HtmlSelectBooleanCheckbox;
import javax.faces.component.html.HtmlSelectManyCheckbox;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;

import org.richfaces.component.html.HtmlCalendar;

import br.com.bicbanco.lab.vo.EstadoVO;

public class formLogin {

       private HtmlInputText inputUsu   =  new HtmlInputText();
       private HtmlOutputLabel labelUsu =  new HtmlOutputLabel();
       private HtmlInputText inputSenha =  new HtmlInputText();
       private HtmlOutputLabel labelPwd =  new HtmlOutputLabel();

       public String salvarFormulario(){
               return "goValida";
       }



       public formLogin () {

       }





       public HtmlInputText getInputUsu() {
               return inputUsu;
       }





       public void setInputUsu(HtmlInputText inputUsu) {
               this.inputUsu = inputUsu;
       }





       public HtmlOutputLabel getLabelUsu() {
               return labelUsu;
       }





       public void setLabelUsu(HtmlOutputLabel labelUsu) {
               this.labelUsu = labelUsu;
       }





       public HtmlInputText getInputSenha() {
               return inputSenha;
       }





       public void setInputSenha(HtmlInputText inputSenha) {
               this.inputSenha = inputSenha;
       }





       public HtmlOutputLabel getLabelPwd() {
               return labelPwd;
       }





       public void setLabelPwd(HtmlOutputLabel labelPwd) {
               this.labelPwd = labelPwd;
       }






}

Vamos la então saca essa

<h:inputText id=“user” value="#{userLogin.usuario}" required=“true” immediate=“true” requiredMessage=“Campo requerido” maxlength=“10” />

blz ???

claro que para aparecer a mensagem vc precisa colocar tbm isso

<h:message for=“user” />

tudo junto fica assim

<h:inputText id=“user” value="#{userLogin.usuario}" required=“true” immediate=“true” requiredMessage=“Campo requerido” maxlength=“10” />
<h:message for=“user” />

Abraço e boa programação.

Fiz assim:
<h:inputText id=“inputUsu” size=“15” maxlength=“15” binding="#{formLogin.inputUsu}" required=“true” requiredMessage=“o campo Usuário deve ser preenchido”></h:inputText><h:message for=“inputUsu”/></h:message>

Estou tendo esse erro ao executar o jsp:

o que poderia ser ?

Grato

=======================erro===============

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at com.sun.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:232)
at com.sun.facelets.compiler.Compiler.compile(Compiler.java:104)
at com.sun.facelets.impl.DefaultFaceletFactory.createFacelet(DefaultFaceletFactory.java:192)
at com.sun.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:141)
at com.sun.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:93)
at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:503)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:553)
at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

tente remover os ascentos e testar denovo !

Tirei a acentuação e Quando adiciono a tag de validação ele me da o seguinte erro:

Error Parsing /pages/login.jsp: Error Traced[line: 18] The element type “h:panelGrid” must be terminated by the matching end-tag “</h:panelGrid>”.

Se tirar as tag as propiedades de validacao ele funciona ok

saberia me dizer o que esta rolando ?

Segue o jsp com o um inpuText.

Grato

<ui:composition template="/templates/common.jsp">
<ui:define name=“body”>
<h:form id=“formLogin”>
<h:panelGrid columns=“1” id=“LoginGrid”>

	       <h:panelGrid columns="2">
	            <h:outputLabel id="labelUsu" value="Usuario:" binding="#{formLogin.labelUsu}" ></h:outputLabel>
            	<h:inputText id="inputUsu" size="15" maxlength="15" binding="#{formLogin.inputUsu}" required="true" requiredMessage="o campo Usuario deve ser preenchido"></h:inputText><h:message for="inputUsu"/></h:message>
           </h:panelGrid>
       </h:panelGrid>


       <h:panelGrid columns="2">
      	<h:commandButton id="botaoSalvar" value="Enviar"  action="formularioPai">  	</h:commandButton>
       </h:panelGrid>


	</h:form>
</ui:define>

</ui:composition>

substitui <h:message for=“inputUsu”/></h:message> por <h:message for=“inputUsu”></h:message> ou <h:message for=“inputUsu”/>

up

aew amigo tira o codigo deste exemplo que tou passando pra ti, aqui ta funcionando legal a validações de requirido.
espero que ajude.[code]

<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://richfaces.org/a4j” prefix=“a4j” %>
<%@ taglib uri=“http://java.sun.com/jstl/core” prefix=“c” %>
<%@ taglib uri=“http://richfaces.org/rich” prefix=“rich” %>

<html>
<head>
<title></title>
<link rel=“StyleSheet” type=“text/css” href="/css/tabelas.css" media=“screen”>
</head>
<body>
<f:view>
<f:loadBundle basename=“com.Lgweb.Tcc.Model.messages” var=“msg”/>
<h:form>
<c:import url="/topo.jsp"></c:import>
<rich:separator width=“967”></rich:separator>
<h:panelGrid columns=“2” width=“800”>
<h:column>
<c:import url="/leftBar.jsp"></c:import>
</h:column>
<h:column>
<rich:panelBar height=“400” width=“900”>
<rich:panelBarItem label="#{msg.cadastrarusuario}">
<h:panelGrid columns=“3” width=“732”>
<h:outputText value="#{msg.codigo}"></h:outputText>
<h:inputText value="#{usuario.usuario.usuarioid}" styleClass=“select” ></h:inputText>
<h:inputHidden value=""></h:inputHidden>

				   	&lt;h:outputText value="#{msg.nome}"&gt;&lt;/h:outputText&gt;
				   	&lt;h:inputText value="#{usuario.usuario.nome}" styleClass="select"label="Numeração" maxlength="2" required="True" requiredMessage="#{msg.obrigatorio}" id="nome" style=" width : 425px;"&gt;
				   	&lt;/h:inputText&gt;
				   	&lt;h:message for="nome" styleClass="erro"&gt;&lt;/h:message&gt;
				   							   	
				   &lt;h:outputText value="#{msg.sobrenome}"&gt;&lt;/h:outputText&gt;
				   	&lt;h:inputText value="#{usuario.usuario.sobrenome}" styleClass="select"label="Numeração" maxlength="2" required="True" requiredMessage="#{msg.obrigatorio}" id="sobrenome" style=" width : 426px;"&gt;
				   	&lt;/h:inputText&gt;
				   		&lt;h:message for="sobrenome" styleClass="erro"&gt;&lt;/h:message&gt;
				   		
				    &lt;h:outputText value="#{msg.setor}"&gt;&lt;/h:outputText&gt;
				   	&lt;h:inputText value="#{usuario.usuario.setor}" styleClass="select"label="Numeração" maxlength="2" required="True" requiredMessage="#{msg.obrigatorio}" id="setor" style=" width : 201px;"&gt;
				   	&lt;/h:inputText&gt;
				   	&lt;h:message for="setor" styleClass="erro"&gt;&lt;/h:message&gt;
				   		
				   	&lt;h:outputText value="#{msg.login}"&gt;&lt;/h:outputText&gt;
				   	&lt;h:inputText value="#{usuario.usuario.login}" styleClass="select"label="Numeração" maxlength="2" required="True" requiredMessage="#{msg.obrigatorio}" id="login"&gt;
				   	&lt;/h:inputText&gt;
				   	&lt;h:message for="login" styleClass="erro"&gt;&lt;/h:message&gt;	
				   	
				   	&lt;h:outputText value="#{msg.senha}"&gt;&lt;/h:outputText&gt;
				   	&lt;h:inputSecret value="#{usuario.usuario.senha}" styleClass="select"label="Numeração" maxlength="2" required="True" requiredMessage="#{msg.obrigatorio}" id="senha" size="10"&gt;
				   &lt;/h:inputSecret&gt;
				   	&lt;h:message for="senha" styleClass="erro"&gt;&lt;/h:message&gt;
				   	
				   	&lt;h:outputText value="#{msg.perfil}"&gt;&lt;/h:outputText&gt;	
				   	&lt;h:selectOneMenu value="#{usuario.changeValue}" style=" width : 136px;" styleClass="select"&gt;
				   		&lt;f:selectItems value="#{usuario.lista}"/&gt;
				   	&lt;/h:selectOneMenu&gt;	
				   	&lt;h:inputHidden value=""&gt;&lt;/h:inputHidden&gt;
				   	&lt;h:outputText value="#{msg.data}"&gt;&lt;/h:outputText&gt;	
				   	&lt;rich:calendar id="data1" styleClass="select" value="#{usuario.usuario.datainclusao}" style=" width : 135px;" datePattern="dd/mm/yyyy" required="true" requiredMessage="#{msg.obrigatorio}"&gt;&lt;/rich:calendar&gt;
				   	&lt;h:message for="data1" styleClass="erro"&gt;&lt;/h:message&gt;	   
				   &lt;/h:panelGrid&gt;
				   &lt;/rich:panelBarItem&gt;
				   &lt;/rich:panelBar&gt;
				   &lt;/h:column&gt;
				   &lt;/h:panelGrid&gt;
			 &lt;center&gt;
				   &lt;h:commandButton action="#{usuario.create}" value="#{msg.salvar}" type="submit" styleClass="botoes"&gt;&lt;/h:commandButton&gt;
				   &lt;h:commandButton action="Menu" value="#{msg.menu}" styleClass="botoes"&gt;&lt;/h:commandButton&gt;
				   &lt;rich:separator width="969"&gt;&lt;/rich:separator&gt;
			&lt;c:import url="/Statusbar.jsp"&gt;&lt;/c:import&gt;
	 		&lt;/center&gt;
	 		
	 		
	 &lt;/h:form&gt;
		
	&lt;/f:view&gt;
&lt;/body&gt;	

</html>

[/code]