Ohhhh vida... (JSF)

14 respostas
J

Pessoal estou com o seguinte problema.

Tenho uma página que deverá ter uns 100 campos inputText. Então o que fiz… criei um VO com os atributos e dei um get/set no meu objeto no MB - só nele.

Na página busquei os dados da seguinte forma <h:inputText value=#{meuBean.vo.propriedade}. Até aqui do bem. Funcionou que é uma blz. Agora quando tento atualizar os dados, o JSF não atualiza os atributos do MB - de forma alguma.

A pergunta é a seguinte, com JSF eu tenho que ter um get/set para cada atributo da minha página ? Eu não poderia ter um get/set só para o objeto em questão e o JSF atualiza os atributos no meu objeto ?

Desde já, obrigado.

[],s

14 Respostas

alias

Eu já fiz dessa forma. E funcionou.

Posta o resto do código pra gente dar uma olhada.

J

Obrigado pelo retorno.

Vou colocar tudo para que não haja dúvida… pois já quebrei a cabeça com isso… Se alguém puder ajudar… ficarei muito agradecido.

Veja…
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>F1Brasil</display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<context-param>
		<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
		<param-value>.jspx</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>client</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.validateXml</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.verifyObjects</param-name>
		<param-value>false</param-value>
	</context-param>
	<context-param>
		<param-name>org.richfaces.SKIN</param-name>
		<param-value>ruby</param-value>
	</context-param>
	<filter>
		<display-name>RichFaces Filter</display-name>
		<filter-name>richfaces</filter-name>
		<filter-class>org.ajax4jsf.Filter</filter-class>
		<init-param>
			<param-name>createTempFiles</param-name>
			<param-value>false</param-value>
		</init-param>
		<init-param>
			<param-name>maxRequestSize</param-name>
			<param-value>500000</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>richfaces</filter-name>
		<servlet-name>Faces Servlet</servlet-name>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
	</filter-mapping>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	<context-param>
		<param-name>javax.faces.CONFIG_FILES</param-name>
		<param-value>
			/WEB-INF/faces-managed-beans.xml,
			/WEB-INF/faces-navigations.xml, /WEB-INF/faces-services.xml,
			/WEB-INF/faces-dao.xml
		</param-value>
	</context-param>

</web-app>

test.jspx

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:jsp="http://java.sun.com/JSP/Page"
	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:c="http://java.sun.com/jstl/core"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:a4j="http://richfaces.org/a4j" template="templates/template.jspx">

	<ui:define name="content">
		<rich:messages styleClass="errorClass" showSummary="true"
			showDetail="true" ajaxRendered="true" globalOnly="true"
			tooltip="true" />
		<a4j:form>
			<h:outputText value="Código" />
			<h:inputText value="#{pilotoBean.piloto.idPiloto}" />

			<h:outputText value="Nome" />
			<h:inputText value="#{pilotoBean.piloto.nome}" />

			<h:outputText value="Equipe" />
			<h:inputText value="#{pilotoBean.piloto.idEquipe}" />


			<a4j:commandButton value="Salvar"
				action="#{pilotoBean.salvaParticipante}" />
		</a4j:form>
	</ui:define>
</ui:composition>

o MB.

package presentation;

import service.PilotoService;
import vo.Piloto;

public class PilotoBean extends BaseBean {

	private Piloto piloto = new Piloto();
	private PilotoService pilotoService;

	public Piloto getPiloto() {
		try {
			piloto = getPilotoService().buscaPiloto(1);
		} catch (Exception e) {
			addError(e.getMessage());
		}
		return piloto;
	}

	public void setPiloto(Piloto piloto) {
		this.piloto = piloto;
	}

	public PilotoService getPilotoService() {
		return pilotoService;
	}

	public void setPilotoService(PilotoService pilotoService) {
		this.pilotoService = pilotoService;
	}

	public void salvaParticipante() {
		try {
			getPilotoService().salvaPiloto(piloto);
		} catch (Exception e) {
			addMessage(e.getMessage());
		}
	}
}

e o VO.

package vo;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Piloto implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int idPiloto;

	private String nome;

	private int idEquipe;

	private static final long serialVersionUID = 1L;

	public Piloto() {
		super();
	}

	public int getIdPiloto() {
		return this.idPiloto;
	}

	public void setIdPiloto(int idPiloto) {
		this.idPiloto = idPiloto;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getIdEquipe() {
		return idEquipe;
	}

	public void setIdEquipe(int idEquipe) {
		this.idEquipe = idEquipe;
	}

}
G

se possivel poste os fontes, fica dificil ajudar assim …
edit: vc ja posto …
vc n precisa ter um get/set pra cada atributo (vo) do seu objeto no mb, somente um get/set pro objeto. Ex:

public class VO(){
 private String alguma_coisa;
 ... atributos
}
public class meuBean(){

private VO vo = new VO();

geters e setters vo 

... metodos
}
G

primeiro kra … vc n precisa serialisar nada, n tem pq … tu ta dando um new no cara, n tem pq seraliza nada …

qnt ao resto do teu codigo parece ta certo, mas qnd eu tive um tempo eu olho com mais calma…

alias

Cara, tô sem meus fontes aqui pra poder dar uma comparada, mas a titulo de chute…voce tentou usar hum h:form?esse a4j:form tem umas viadagens…

No mais seu codigo tá todo certinho…

J

Não sei se isso ajuda a resolver o problema, mas por incrível… ele salva só o último atributo… Os outros não salva nem por reza brava…

Já fiz até um despacho aqui de galinha preta… mas a coisa ruim não conserta…

alias

Javas_Man:
Não sei se isso ajuda a resolver o problema, mas por incrível… ele salva só o último atributo… Os outros não salva nem por reza brava…

Já fiz até um despacho aqui de galinha preta… mas a coisa ruim não conserta…

essa situação ocorreu com o h:form?

ah…outro chutao meu, me desculpe mas estou dando essas “dicas” só com o que eu lembro de cabeça :lol:…mas altere tambem o botão para um h:commandbutton

J

Pois é… isso ocorreu tanto com a4j:form quanto com o h:form.

alias

qual é o escopo do seu mb?

J

já testei tanto como request quanto session.

alias

Caramba…que Deus me ajude com essa sugestao,hehehe…tente alterar no seu web.xml o STATE_SAVING_METHOD para server

J

Nada… já testei só com o richfaces e o JPA e nada…

Deve ser algum bug.

alias

Entao, desculpe…mas nao sei… :oops:

bruno_arueira

Tente utilizar a tag a4j:support nos inputText, que deve funcionar!

Vide exemplo abaixo:

<h:outputText value="Código" />  
<h:inputText value="#{pilotoBean.piloto.idPiloto}">
   <a4j:support ajaxSingle="true" event="onblur" />
</h:inputText>

Até,

Criado 12 de fevereiro de 2009
Ultima resposta 12 de fev. de 2009
Respostas 14
Participantes 4