dsweb-jsf-parte4.pdf
TRANSCRIPT
![Page 1: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/1.jpg)
Desenvolvimento de Software
para WEB
JSF (JavaServer Faces) – Parte 4
Prof. Regis Pires Magalhães
![Page 2: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/2.jpg)
Agradecimentos
• Agradecemos ao Prof. Fábio Dias (UFC Quixadá) por ter gentilmente cedido seus slides para adaptação e uso nesta disciplina.
![Page 3: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/3.jpg)
Conversão e Validação
![Page 4: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/4.jpg)
• A conversão trata da transformação de dados de formulários em objetos java.
• A validação trata da checagem de corretude dos resultados da conversão.
• Neste sentido, alguns passos são efetuados antes de atualizar o modelo de dados: ▫ A idéia é impedir que valores inválidos.
cheguem até a lógica de negócio.
Introdução
![Page 5: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/5.jpg)
• Para visualizar melhor o processo de conversão e validação, vamos visualizar em detalhes os passos seguidos desde a entrada de dados em um formulário até o preenchimento do bean com eles:
Visão Geral do Processo
![Page 6: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/6.jpg)
Visão Geral do Processo - Exemplo
![Page 7: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/7.jpg)
Conversão
![Page 8: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/8.jpg)
• Os dados submetidos por um usuário sempre são do tipo String
• Contudo, muitos desses dados devem ser transformados em outros tipos para serem armazenados no Modelo
• Se no Model o valor for um tipo primitivo ou um objeto Integer/Double/Float/BigInteger/BigDecimal, a conversão é direta
• Caso contrário, é necessário especificar um conversor: ▫ Pode ser um conversor básico já existente
Ex: datas e números
▫ Pode ser um conversor criado pelo desenvolvedor
Introdução
![Page 9: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/9.jpg)
• f:convertNumber: é um dos conversores básicos disponibilizados pela JSF para exibir números formatados.
• f:convertDateTime: é utilizada para exibir datas e horas segundo uma formatação. Os padrões utilizados são os da SimpleDateFormat.
• Também são usados para formatar dados exibidos.
Conversores Básicos
![Page 10: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/10.jpg)
Conversores Básicos
<h:inputText value="#{pagamentoBean.total}“>
<f:convertNumber minFractionDigits=“5"/>
</h:inputText>
<h:inputText value="#{pagamentoBean.numCartao}"/>
<h:inputText value="#{pagamentoBean.dataCartao}">
<f:convertDateTime pattern=“dd/MM/yyyy"/>
</h:inputText>
![Page 11: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/11.jpg)
• type pode ser: number(default), currency ou percent
Converter Number
<h:outputText value="#{bean.inteiro}">
<f:convertNumber type="percent"/>
</h:outputText>
<h:outputText value="#{bean.inteiro}">
<f:convertNumber type="currency" currencySymbol="$"/>
</h:outputText>
![Page 12: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/12.jpg)
• Se true, apenas a parte inteira é levada em consideração. Default é false.
Converter Number
<h:inputText value="#{bean.fracionario}">
<f:convertNumber integerOnly="true"/>
</h:inputText>
<h:inputText value="#{bean.fracionario}">
<f:convertNumber pattern="##0.00"/>
</h:inputText>
• Aplica o padrão de formatação no número similar ao da
DecimalFormat.
![Page 13: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/13.jpg)
• Número máximo/mínimo de casas decimais
Converter Number
<h:outputText value="#{bean.fracionario}">
<f:convertNumber maxFractionDigits="4"/>
</h:outputText>
<h:outputText value="#{bean.fracionario}">
<f:convertNumber minFractionDigits="4"/>
</h:outputText>
![Page 14: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/14.jpg)
• type: Especifica o tipo que será exibido, date, time ou both.
Converter Date Time
<h:outputText value="#{bean.data}">
<f:convertDateTime type="date" dateStyle="short" />
</h:outputText>
![Page 15: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/15.jpg)
• A tabela abaixo mostra alguns atributos utilizados pela tag f:convertDateTime
Converter Date Time
Atributo Descrição
type date (default), time ou both
dateStyle default, short, medium, long, or full
timeStyle default, short, medium, long, or full
pattern Padrão de formatação similar ao da SimpleDateFormat
locale Localidade de onde os padrões devem ser buscados
Valor Exemplo
short 30/05/11
medium 30/05/2011
long 30 de Maio de 2011
full Segunda-feira, 30 de Maio
de 2011
Valor Exemplo
short 15:01
medium 15:01:58
long 15h1min58s BRST
full 15h01min58s BRST
![Page 16: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/16.jpg)
Converter Date Time
<h:outputText value="#{bean.data}">
<f:convertDateTime pattern="dd.MM.yyyy HH:mm" />
</h:outputText>
![Page 17: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/17.jpg)
Converter Date Time
<h:inputText value="#{bean.data}">
<f:convertDateTime type="date" dateStyle="short" />
</h:inputText>
<h:inputText value="#{bean.data}">
<f:convertDateTime pattern=“dd/MM/yyyy" />
</h:inputText>
![Page 18: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/18.jpg)
• Quando um erro de conversão/validação ocorre, as seguintes ações são tomadas: ▫ O componente cuja conversão/validação falhou
posta uma mensagem e declara-se como inválido ▫ Pode-se usar tags para exibir esta mensagem
h:message Exibe mensagem para um componente em particular
h:messages Exibe mensagens para todos os componentes
• A implementação JSF recarrega a página atual após a fase de validações
Tratando Erros
![Page 19: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/19.jpg)
• Caso algum campo possua erro, deve-se mostrar a mensagem de erro ao lado do campo.
Tratando Erros - Mensagens Separadas
<h:panelGrid columns="2">
<h:outputText value="Total"/>
<h:panelGroup>
<h:inputText id="total“ value="#{pagamento.total}">
<f:convertNumber minFractionDigits=“5" />
</h:inputText>
<h:message for="total"/>
</h:panelGroup>
![Page 20: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/20.jpg)
Tratando Erros - Mensagens Separadas
<h:outputTextvalue="Número do Cartão:"/>
<h:inputText value="#{pagamento.numeroCartao}" />
<h:outputTextvalue="Data de Validade (mês/ano):"/>
<h:panelGroup>
<h:inputText id="data"value="#{pagamento.dataCartao}">
<f:convertDateTime pattern=“dd/MM/yyyy" />
</h:inputText>
<h:message for="data“/>
</h:panelGroup>
<h:commandButton value="Enviar" action="sucesso"/>
</h:panelGrid>
![Page 21: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/21.jpg)
Tratando Erros - Mensagens Separadas
![Page 22: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/22.jpg)
Tratando Erros - Mensagens Juntas
<fieldset>
<legend>Pagamento</legend>
<h:messages style="color: red"/>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Total"/>
<h:panelGroup>
<h:inputText id="total" value="#{pagamento.total}">
<f:convertNumber minFractionDigits=“5" />
</h:inputText>
</h:panelGroup>
...
</h:panelGrid>
</h:form>
</fieldset>
![Page 23: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/23.jpg)
Tratando Erros - Mensagens Juntas
![Page 24: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/24.jpg)
<h:inputText id="total" value="#{pagamento.total}"
label=“Valor inválido">
<f:convertNumber minFractionDigits=“5"/>
</h:inputText>
<h:message for="total"/>
<h:inputText id="data"
value="#{pagamento.dataCartao}" label="Data
inválida">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
<h:message for="data"/>
Modificando Mensagens de Erro
![Page 25: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/25.jpg)
Modificando Mensagens de Erro
![Page 26: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/26.jpg)
<h:inputText id="total" value="#{pagamento.total}"
converterMessage=“Valor inválido">
<f:convertNumber minFractionDigits=“5"/>
</h:inputText>
<h:message for="total"/>
<h:inputText id="data"
value="#{pagamento.dataCartao}”
converterMessage="Data inválida.">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
<h:message for="data"/>
Modificando Mensagens de Erro
![Page 27: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/27.jpg)
Modificando Mensagens de Erro
![Page 28: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/28.jpg)
Validação
![Page 29: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/29.jpg)
• O papel principal da validação é proteger o modelo:
▫ A validação ocorre em uma fase anterior à da atualização do modelo
▫ O modelo só é atualizado quando os dados estiverem devidamente validados
• O uso de validadores é similar ao de conversores:
▫ Adiciona-se uma tag f:validate___ no corpo do campo que se deseja validar
Introdução
![Page 30: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/30.jpg)
• Existem alguns validadores pré-definidos que podem ser incluídos no corpo das tags:
Validadores Pré-Definidos
Atributo Atributos Funcionamento
f:validateDoubleRange minimum, maximum Define uma faixa de valores double na
qual um valor deve estar contido
f:validateLongRange minimum, maximum Define uma faixa de valores long na
qual um valor deve estar contido
f:validateLength minimum, maximum Define uma faixa de tamanho de uma
string
• Adicionalmente, pode-se especificar que certos campos
são requeridos através do uso do atributo required
![Page 31: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/31.jpg)
Validadores Pré-Definidos
<h:inputText id="total" value="#{pagamento.total}"
validatorMessage="Valor total não pode ser menor que 5">
<f:validateLongRange minimum="5"/>
</h:inputText>
<h:inputText value="#{pagamento.numeroCartao}"
validatorMessage="Número do cartão deve possuir 13 caracteres.">
<f:validateLength minimum="13"/>
</h:inputText>
<h:inputText id="data" value="#{pagamento.dataCartao}"
required="true" requiredMessage="Campo data é obrigatório."/>
Mensagem de
validação personalizada Mensagem de requerimento
personalizada
![Page 32: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/32.jpg)
Tamanho de Strings e Faixa de Valores Numéricos
![Page 33: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/33.jpg)
• Em certos casos, é necessário deixar a validação de lado:
▫ Usuário clica no botão voltar ou cancelar
▫ Não deve ocorrer validação
• Em situações como essa, o comando deve ser executado antes da validação
▫ Ex: definir o atributo immediate da tag do botão para true
Pulando a Validação/Conversão
<h:commandButton value="Cancelar"
action="cancelar" immediate="true"/>
![Page 34: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/34.jpg)
Resumindo
• converterMessage: especificar que mensagem queremos que apareça caso ocorra um erro de conversão.
• requiredMessage: especificar que mensagem queremos que apareça quando o campo é obrigatório mas não foi informado.
• validatorMessage: especificar que mensagem queremos que apareça caso ocorra um erro de validação.
![Page 35: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/35.jpg)
Internacionalização
![Page 36: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/36.jpg)
• Ao implementar uma aplicação, é uma boa prática definir todas as strings em um arquivo central ▫ Facilita a manutenção
▫ Auxilia na internacionalização
• Para isso, JSF faz uso de um arquivo de propriedades ▫ Arquivo texto com extensão .properties
▫ Neste arquivo cada mensagem é mapeada na forma chave=valor
▫ Chave é o nome lógico
▫ Valor é o valor real da mensagem que será exibida
Arquivo de Mensagens
nome_Funcionario=Nome do funcionário:
erro.incluir.cliente=Erro ao incluir um cliente!
![Page 37: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/37.jpg)
• Criar os arquivos de mensagens para cada linguagem dentro de um pacote próprio para isso, por exemplo resources ou idiomas: ▫ Messages.properties
▫ Messages_pt_BR.properties
▫ Messages_en.properties
▫ Messages_es.properties
▫ Etc
• Dentro de cada arquivo no campo valor, é uma boa prática usar um padrão para nomeação das chaves. Por exemplo, use o padrão de chave nome_da_tela_campo ou nome_da_tela_mensagem.
• Separe os nomes que compõe as chaves por “_” ou “.”.
Arquivo de Mensagens
nome_Funcionario=Nome do funcionário:
erro.incluir.cliente=Erro ao incluir um cliente!
![Page 38: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/38.jpg)
• Vamos definir uma variável fixa que represente o arquivo de mensagens
▫ Todas as páginas podem acessá-la
▫ É configurada no faces-config.xml
Arquivo de Mensagens
![Page 39: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/39.jpg)
<application> ... <resource-bundle> <base-name>br.ufc.mensagens</base-name> <var>msgs</var> </resource-bundle> ... </application>
faces-config.xml
Arquivo de mensagens
![Page 40: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/40.jpg)
Arquivo de mensagens
automovel_descricao = Descrição do Automóvel:
erro.incluir.cliente = Erro ao incluir um cliente!
erro.descricao.invalida = Descrição inválida.
No pacote br.ufc, criar o arquivo: mensagens.properties:
![Page 41: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/41.jpg)
mensagens_pt_BR.properties
label_ano_fabricacao = Ano de Fabricação label_ano_modelo = Ano do Modelo label_preco = Preço label_km = Kilometragem label_obs = Observações
![Page 42: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/42.jpg)
exemplo.xhtml ... #{msgs.label_ano_fabricacao}: <h:inputText label="#{msgs.label_ano_fabricacao}" value="#{automovelBean.automovel.anoFabricacao}"/> #{msgs.label_ano_modelo}: <h:inputText label="#{msgs.label_ano_modelo}" value="#{automovelBean.automovel.anoModelo}"/> #{msgs.label_preco}: <h:inputText label="#{msgs.label_preco}" value="#{automovelBean.automovel..preco}" /> ...
![Page 43: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/43.jpg)
• O arquivo correspondente à localidade atual é carregado.
▫ Se o arquivo correspondente não existir, é utilizado o arquivo padrão.
• Pode-se modificar a localidade em 2 níveis para uma página:
▫ Uso do elemento View: Adicionando um atributo locale na tag <f:view locale=“pt_BR”>.
▫ Via programação:
FacesContext context = FacesContext.getCurrentInstance();
context.getViewRoot().setLocale(new Locale(“pt”, “BR”));
Arquivo de Mensagens
![Page 44: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/44.jpg)
• Uma vez carregado o arquivo, pode-se acessá-lo na página através de binding expressions:
Arquivo de Mensagens
<h:outputText value="#{msgs.nome_Funcionario}"/>
<h:inputText value=""/><br>
<h:outputText value="#{msgs['erro.incluir.cliente']}"/>
Mensagens contendo o ponto como separador
precisam ser definidas dentro de colchetes
nome_Funcionario=Nome do funcionário:
erro.incluir.cliente=Erro ao incluir um cliente!
![Page 45: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/45.jpg)
• Para acessar o arquivo .properties dentro da classe controller use a classe abaixo:
Arquivo de Mensagens
import java.util.ResourceBundle; import javax.faces.context.FacesContext; public class MensagemUtil { public static String getMensagem(String chave){ FacesContext context = FacesContext.getCurrentInstance(); ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg"); return bundle.getString(chave); } }
![Page 46: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/46.jpg)
Alterando Idioma Dinamicamente
@ManagedBean(name="idiomaController") @SessionScoped public class IdiomaController { private Locale correnteLocale = new Locale("pt", "BR"); public void setLocalePortugues(){ correnteLocale = new Locale("pt", "BR"); } public void setLocaleIngles(){ correnteLocale = new Locale("en", "US"); } public Locale getCorrenteLocale() { return correnteLocale; } public void setCorrenteLocale(Locale correnteLocale) { this.correnteLocale = correnteLocale; } }
![Page 47: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/47.jpg)
Alterando Idioma Dinamicamente
<h:body> <f:view locale="#{idiomaController.correnteLocale}"> <h:form> ... </h:form> </f:view> </f:body>
• Dentro da página template do facelet coloque:
![Page 48: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/48.jpg)
Validadores Pré-Definidos
<h:inputText id="total" value="#{pagamento.total}"
validatorMessage="#{msg['erro.numero.tamanho.invalido']}">
<f:validateLongRange minimum="5"/>
</h:inputText>
<h:inputText value="#{pagamento.numeroCartao}"
validatorMessage="#{msg['erro.total.valor.menor']}">
<f:validateLength minimum="13"/>
</h:inputText>
<h:inputText id="data" value="#{pagamento.dataCartao}"
required="true" requiredMessage="#{msg['requerido.data']}"/>
Mensagem de
validação personalizada Mensagem de requerimento
personalizada
erro.numero.tamanho.invalido=Número do cartão deve possuir 13 caracteres.
erro.total.valor.menor=Valor total não pode ser menor que 5.
requerido.data=Campo data é obrigatório.
![Page 49: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/49.jpg)
Mensagens padrões do JSF • Estão localizadas no pacote javax.faces, nos arquivos
“Messages_xx_XX.properties”.
▫ Ex: Messages.properties, Messages_pt_BR.properties
![Page 50: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/50.jpg)
Alterando as mensagens padrões
do JSF • Para mudar a mensagem de campo requerido do
JSF, precisamos criar um arquivo chamado Messages_pt_BR.properties dentro de um pacote chamado javax.faces e nesse arquivo colocar um valor para a chave javax.faces.component.UIInput.REQUIRED. ▫ javax.faces.component.UIInput.REQUIRED = Campo obrigatório. Informe-o!
• Com isso, todas as mensagens de campo requerido passariam a usar o texto que nós informamos, e não o texto padrão do JSF.
![Page 51: dsweb-jsf-parte4.pdf](https://reader034.vdocuments.com.br/reader034/viewer/2022051516/55cf98c7550346d033999cca/html5/thumbnails/51.jpg)
Exercício
1) Faça um cadastro de pessoa que use
Internacionalização, Conversão e Validação.
Adicione um campo data a classe Pessoa e
inclua no cadastro e atualização. Coloque os
campos como obrigatórios. Coloque todos os
textos das páginas, mensagens de conversão e
validação no arquivo de mensagem.