Popular Bean em JSF

8 respostas
R

Olá a todos.

Eu estou desenvolvendo uma pequena aplicação utilizando JSF e estou com uma pequena dúvida. Eu possuo um JavaBean com 3 propriedades (id, nome e endereço). Eu gostaria de entrar com os dados no formulário e ao submeter a página eu gostaria que me JavaBean fosse populado automaticamente. É possível fazer isto ou eu devo criar um método get/set para todas as minhas propriedades na classe Service e setá-los manualmente no bean?

Desde já agradeço a ajuda de todos.

8 Respostas

gilliard_santos

Olá Ricardo, uma das grandes facilidades do jsf é justamente fazer esse povoamento de forma automatica. Vou considerar que esse seu objeto é referente a uma pessoa, mas isso nao importa, é só mesmo para facilitar o exemplo.
basta colocar nos seus inputs assim:

<h:inputText value="#{ManagedBeanName.pessoa.endereco}"/>

Nesse exemplo estou supondo que voce tenha um managed bean registrado com o nome “ManagedBeanName” e nele voce tem um get e um set para um objeto pessoa e esse objeto pessoa tem um atributo chamado endereço (e também tem seus gets e sets).

O valor que voce colocar nesse input será automaticamente setado no atributo endereço do objeto pessoa do seu managed bean. Aí voce vai aplicando o mesmo esquema para os demais campos, e no final das contas o seu objeto pessoa vai estar totalmente populado sem voce precisar chamar nenhum set diretamente.
Espero que tenha ajudado.

R

Pois então gilliard_santos, eu estou fazendo da seguinte forma:

Na minha JSP (Form.jsp), o código é o seguinte:

...
	<h:form id="form">

	<h:inputHidden value="#{form.userContact.userContactId}">
		<f:convertNumber/>
	</h:inputHidden>

	<table align="center" class="form">
	<tr>
		<th colspan="2"><h:outputLabel value="#{text['form.info']}"/></th>
	</tr>
	<tr>
		<td><h:outputLabel for="userContactName" value="#{text['form.name']}"/></td>
		<td><h:inputText value="#{form.userContact.userContactName}" id="userContactName" size="40" maxlength="40"/></td>
	</tr>
	<tr>
		<td><h:outputLabel for="userContactAddress" value="#{text['form.address']}"/></td>
		<td><h:inputText value="#{form.userContact.userContactAddress}" id="userContactAddress" size="40" maxlength="40"/></td>
	</tr>
	<tr>
		<td><h:outputLabel for="userContactBirthday" value="#{text['form.birthday']}"/></td>
		<td><h:inputText value="#{form.userContact.userContactBirthday}" id="userContactBirthday" size="15" maxlength="10"/></td>
	</tr>
	<tr>
		<td> </td>
		<td>
			<h:commandButton value="#{text['button.save']}" action="#{form.save}" id="save" immediate="true"/> 
			<h:commandButton value="#{text['button.cancel']}" id="cancel" immediate="true"/></td>
	</tr>
	</table>
	</h:form>
...

E a classe de acesso à camada web (ServiceManager.java) está da seguinte forma:

public class UserContactForm {

	/** Objeto que armazena os dados do contato. */
	private UserContact userContact;

	public String save() {
		System.out.println(userContact.getUserContactName());
		System.out.println(userContact.getUserContactAddress());
		System.out.println(userContact.getUserContactBirthday());
		// this.serviceManager.save(userContact);
		return "success";
	} // Finaliza o método save.

	/**
	 * Retorna o objeto que armazena os dados do contato.
	 *
	 * @return Objeto que armazena os dados do contato.
	 */
	public UserContact getUserContact() {
		return userContact;
	} // Finaliza o método getUserContact.

	/**
	 * Seta o objeto que armazena os dados do contato.
	 *
	 * @param userContact Seta o objeto que armazena os dados do contato.
	 */
	public void setUserContact(UserContact userContact) {
		this.userContact = userContact;
	} // Finaliza o método setUserContact.

} // Finaliza a classe UserContactForm.

Porém ao efetuar uma chamada ao método save os dados são todos impressos como null, ou seja, os dados não estão sendo setados em meu bean.

Você conseguiu visualizar o que estou fazendo de errado?

Alguém possui mais alguma sugestão?

gilliard_santos

coloque um h:messages na sua pagina para ver se nao esta dando nenhum erro de validacao/conversao (apesar que isso geralmente nem deixaria a execucao chegar na sua action).
faça esse teste e veja se aparece algum erro.

R

Não foi emitida nenhuma mensagem de erro.

gilliard_santos

Opa, acho que é algo que eu nao tinha visto (preguiça de usar a barra de rolagem hehehe, foi mal)…
tira esse immediate=“true” dos teus commandButtons.

R

Olá, ao que me parece agora funcionou sim, mas estou tendo problemas agora com a conversão de tipos.

O erro que está aparecendo é:

INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been display
ed.
sourceId=j_id_jsp_794008061_1:userContactBirthday[severity=(ERROR 2), summary=(/
form.jsp(55,3) '#{form.userContact.userContactBirthday}' java.lang.IllegalArgume
ntException: argument type mismatch), detail=(/form.jsp(55,3) '#{form.userContac
t.userContactBirthday}' java.lang.IllegalArgumentException: argument type mismat
ch)]

O código na página JSP está da seguinte forma:

<td>
			<h:inputText id="userContactBirthday" value="#{form.userContact.userContactBirthday}" size="15" maxlength="10">
				<f:convertDateTime pattern="dd/MM/yyyy" />
			</h:inputText>
		</td>

E o objeto userContactBirthday é do tipo Calendar.
E no formulário eu entro com a data da seguinte forma: 14/11/2006

Alguma sugestão de como solucionar o problema?

gilliard_santos

esse f:convertDateTime converte a string q vc deu entrada para o tipo java.util.Date. Se voce quiser mesmo utilizar o tipo calendar vai ter que fazer um conversor próprio. Ou entao, uma alternativa mais simples é voce mudar o tipo do seu atributo para java.util.Date

R

gilliard_santos muito obrigado pela ajuda.

Funcionou certinho.
valeu ae

Criado 13 de novembro de 2006
Ultima resposta 14 de nov. de 2006
Respostas 8
Participantes 2