Richfaces:Formulário Ajax interferindo em outro indevidamente

6 respostas
D

Olá para todos os “gujeiros” :lol: ,

Estou com o seguinte problema, tenho uma tela de cadastro de Pessoas ,no qual a classe Pessoa se relaciona com a classe Profissao, na tela de cadastro de Pessoas eu represento esse relacionamento não com um combobox, e sim , com um inputText cujo valor será alterado pela segunda janela de consulta e selecão de profissoes, esse processo de seleção da seleção está funcionando corretamente, porém, quando eu seleciono uma profissão todos os campos do formulario pessoa são atualizados, caso seja um novo cadastro, os dados se perdem pois os outros atributos da entidade pessoa “bindados” ao formulario, ainda não tiveram seus valores atribuidos, se for uma entidade já existente ( alteração de cadastro ) as alterações são perdidas.

Como eu poderia evitar isso :?:

Os dois formularios são compostos por um aj4:form dentro de um a4j:outputPanel, criei essas interfaces baseado neste aqui http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/

*estou usando facelets pra incorporar a tela de cadastro de profissoes como modalpanel dentro do cadastro de pessoas

para ser mais lúdico, estou enviando uma anexos com as imgens das telas :stuck_out_tongue: .

6 Respostas

rogeriuslima

Opa cara, blz?
Tem como vc postar o codigo da sua tela?
Eu “acho” que o problema pode estar no escopo do seu bean.

D

rogeriuslima:
Opa cara, blz?
Tem como vc postar o codigo da sua tela?
Eu “acho” que o problema pode estar no escopo do seu bean.

neste exato momento não da, no fim da tarde eu posto os codigos,
e os beans estao com escopo de sessao, no artigo do rponte eles estavam como request, e usava um componente do tomahawk pra salvar o estado.

vou pesquisar sobre isso.

D

o código como prometido!

profissaoCrud.xhtml

<?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">

<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:a4j="http://richfaces.org/a4j"
		xmlns:rich="http://richfaces.org/rich">
	<head>
		<style type="text/css">
	    	@IMPORT url("#{facesContext.externalContext.request.contextPath}/css/style.css");
	    </style>
	</head>
	<body>
	<ui:composition>
	<ui:param name="defaultBean" value="#{profissaoCrudBean}" />
	<ui:param name="naming" value="profissao" />
	
		<f:loadBundle basename="message" var="m" />
		 	 
		<!-- a4j:status for="mainOutputPanel#{naming}">
    			<f:facet name="start">
    				Start
        			<h:graphicImage value="ajax_process.png" />
    			</f:facet>
    			<f:facet name="stop">
       	 			<h:graphicImage value="ajax_stoped.png" />
       	 			Stop
    			</f:facet>

			</a4j:status-->
		
		<a4j:outputPanel ajaxRendered="true" id="mainOutputPanel#{naming}" >
			
			<a4j:form id="mainForm#{naming}">
				
				<!-- bloco de pesquisa -->
				<rich:panel id="searchlistBlock#{naming}" rendered="#{defaultBean.pesquisarState}">
					<f:facet name="header">
						Pesquisar
			        </f:facet>
				<h:panelGrid columns="1">
					<h:column>
						<h:outputText value="descrição" />
						<br/>
						<h:inputText value="#{profissaoCrudBean.descricao}" size="30" />
					</h:column>
					<h:column>
						<a4j:commandButton value="Pesquisar" action="#{profissaoCrudBean.pesquisar}"/>
						<a4j:commandButton value="Adicionar" action="#{profissaoCrudBean.prepareAdicionar}" immediate="true"/>
					</h:column>
				</h:panelGrid>
				
				<rich:spacer width="1" height="5" />
				<rich:datascroller align="left" for="userList" maxPages="10" />
				<rich:spacer height="30" />
		
				<rich:dataTable width="483" id="userList" rows="10" columnClasses="col" value="#{profissaoCrudBean.profissaos}" var="row">
					<f:facet name="header">
						<rich:columnGroup>
							<h:column>
								<h:outputText styleClass="headerText" value="descrição" />
							</h:column>
							<h:column>
								<h:outputText styleClass="headerText" value="salário base" />
							</h:column>
							<h:column>
							</h:column>
						</rich:columnGroup>
					</f:facet>
					<h:column>
						<h:outputText value="#{row.descricao}" />
					</h:column>
					<h:column>
						<h:outputText value="#{row.salarioBase}" />
					</h:column>
		
					<h:column>
						<span>
							<a4j:commandLink value="editar" action="#{profissaoCrudBean.prepareEditar}" immediate="true" rendered="#{relation==null}">
								<f:setPropertyActionListener value="#{row}" target="#{profissaoCrudBean.profissao}"/>
							</a4j:commandLink>
						</span>
						<span>
							<a4j:commandLink value="excluir" action="#{profissaoCrudBean.excluir}" immediate="true" rendered="#{relation==null}">
								<f:setPropertyActionListener value="#{row}" target="#{profissaoCrudBean.profissao}"/>
							</a4j:commandLink>
						</span>
						<span>
							<a4j:commandLink value="selecionar" immediate="true" rendered="#{relation!=null}" 
								oncomplete="Richfaces.hideModalPanel('profissoes')">
								<f:setPropertyActionListener value="#{row}" target="#{relation.profissao}"/>
							</a4j:commandLink>
						</span>
					</h:column>
				</rich:dataTable>
		
				</rich:panel>
				<!-- bloco de edição -->
				<rich:panel id="addUpdateBlock#{naming}" rendered="#{defaultBean.adicionarState or defaultBean.editarState}">
					
					<f:facet name="header">
						Dados da Profissao
			        </f:facet>
					<h:panelGrid columns="2" id="panel2" binding="#{profissaoCrudBean.panelForm}" columnClasses="odd-row,even-row">
		
						<h:outputLabel value="descrição"/>
						<h:column>
							<h:inputText value="#{profissaoCrudBean.profissao.descricao}" size="30" required="true" id="descricao"/>
							<br/>
							<h:message for="descricao" styleClass="error"/>
						</h:column>
			
						<h:outputLabel value="salário base"/>
						<h:column>
							<h:inputText value="#{profissaoCrudBean.profissao.salarioBase}" size="8" redisplay="true" id="salarioBase"/>
							<br/>
							<h:message for="salarioBase" styleClass="error"/>
						</h:column>
			
					</h:panelGrid>
					<a4j:commandButton value="Salvar" id="salvar" action="#{profissaoCrudBean.saveAndReturn}" rendered="#{relation==null}"/>
					<a4j:commandButton value="Salvar e Manter" id="salvarManter" action="#{profissaoCrudBean.saveAndKeep}" rendered="#{relation==null}"/>
					<a4j:commandButton value="Salvar e Selecionar" id="salvarSelecionar" oncomplete="javascript:if ('#{facesContext.maximumSeverity.ordinal}' == '0'){Richfaces.hideModalPanel('profissoes');}"
						action="#{profissaoCrudBean.saveAndSelect}" rendered="#{relation!=null}" >
						<f:setPropertyActionListener value="#{defaultBean.profissao}" target="#{relation.profissao}"/>
					</a4j:commandButton>
					<a4j:commandButton value="Voltar" id="voltar" action="#{defaultBean.voltar}" immediate="true"/>
					
				</rich:panel>
			</a4j:form>

		</a4j:outputPanel>

</ui:composition>
</body>
</html>

pessoaCrud.xhtml

<?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">

<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:a4j="http://richfaces.org/a4j"
		xmlns:rich="http://richfaces.org/rich">
	<head>
		<style type="text/css">
	    	@IMPORT url("#{facesContext.externalContext.request.contextPath}/css/style.css");
	    </style>
	</head>
	<body>
	<ui:composition>
	<ui:param name="defaultBean" value="#{pessoaCrudBean}" />
	<!--  a4j:keepAlive beanName="#{pessoaCrudBean}" /-->
	<ui:param name="naming" value="pessoa" />
	
		<f:loadBundle basename="message" var="m" />
		 	 
		
		<a4j:outputPanel ajaxRendered="true" id="#{naming}MainOutputPanel" >
			<!-- a4j:status for="#{naming}MainOutputPanel">
    			<f:facet name="start">
    				Start
        			<h:graphicImage value="ajax_process.png" />
    			</f:facet>
    			<f:facet name="stop">
       	 			<h:graphicImage value="ajax_stoped.png" />
       	 			Stop
    			</f:facet>

			</a4j:status-->
			<!--  h:outputText id="erro"/>
			<h:message for="erro" styleClass="erro"/>
			<h:outputText id="info" />
			<h:message for="info" styleClass="info" /-->
			<a4j:form id="#{naming}MainForm">
				
				 <h:messages  id="pessoaMessage" layout="table" tooltip="true"
				 showdetail="true" showsummary="true"
				 errorClass="error"
				 infoStyle="color:blue;"
				 rendered="#{facesContext.maximumSeverity.ordinal != 2}"/>
				
				<!-- bloco de pesquisa -->
				<rich:panel id="#{naming}SearchlistBlock" rendered="#{defaultBean.pesquisarState}">
					<f:facet name="header">
						Pesquisar
			        </f:facet>
				<h:panelGrid columns="1">
			<h:column>
				<h:outputText value="Nome:" />
				<br/>
				<h:inputText value="#{defaultBean.nome}" size="30" />
			</h:column>
			<h:column>
				<a4j:commandButton value="Pesquisar" action="#{defaultBean.pesquisar}"/>
				<a4j:commandButton value="Adicionar" action="#{defaultBean.prepareAdicionar}" immediate="true"/>
			</h:column>
		</h:panelGrid>
		<rich:spacer width="1" height="5" />
		<rich:datascroller align="left" for="userList" maxPages="10" />
		<rich:spacer height="30" />
		<rich:dataTable width="483" id="userList" rows="10"
			columnClasses="col" value="#{defaultBean.pessoas}" var="row">
			<f:facet name="header">
				<rich:columnGroup>
					<h:column>
						<h:outputText styleClass="headerText" value="Nome" />
					</h:column>
					<h:column>
						<h:outputText styleClass="headerText" value="endereco" />
					</h:column>
					<h:column>
						<h:outputText styleClass="headerText" value="telefone" />
					</h:column>
					<h:column>
					</h:column>
				</rich:columnGroup>
			</f:facet>
			<h:column>
				<h:outputText value="#{row.nome}" />
			</h:column>
			<h:column>
				<h:outputText value="#{row.endereco}" />
			</h:column>
			
			<h:column>
				<h:outputText value="#{row.telefone}" />
			</h:column>
					<h:column>
						<span>
							<a4j:commandLink value="editar" action="#{defaultBean.prepareEditar}" immediate="true" rendered="#{relation==null}">
								<f:setPropertyActionListener value="#{row}" target="#{defaultBean.pessoa}"/>
							</a4j:commandLink>
						</span>
						<span>
							<a4j:commandLink value="excluir" action="#{defaultBean.excluir}" immediate="true" rendered="#{relation==null}">
								<f:setPropertyActionListener value="#{row}" target="#{defaultBean.pessoa}"/>
							</a4j:commandLink>
						</span>
						<span>
							<a4j:commandLink value="selecionar" immediate="true" rendered="#{relation!=null}" oncomplete="Richfaces.hideModalPanel('#{naming}ModalPanel')">
								<f:setPropertyActionListener value="#{row}" target="#{relation.profissao}"/>
							</a4j:commandLink>
						</span>
					</h:column>
				</rich:dataTable>
		
				</rich:panel>
				<!-- bloco de edição -->
				<rich:panel id="#{naming}AddUpdateBlock" rendered="#{defaultBean.adicionarState or defaultBean.editarState}">
					<f:facet name="header">
						Dados da pessoa
					</f:facet>
					
					<h:panelGrid columns="2" id="panel2" binding="#{defaultBean.panelForm}" columnClasses="odd-row,even-row">
			<h:outputLabel value="nome"/>
			<h:column>
				<h:inputText value="#{defaultBean.pessoa.nome}" size="30" required="true" id="nome"/>
				<br/>
				<h:message for="nome" styleClass="error"/>
			</h:column>
			
			<h:outputLabel value="endereco: "/>
			<h:column>
				<h:inputText value="#{defaultBean.pessoa.endereco}" size="30" id="endereco"/>
				<br/>
				<h:message for="endereco" styleClass="error"/>
			</h:column>
			
			<h:outputLabel value="telefone: "/>
			<h:column>
				<h:inputText value="#{defaultBean.pessoa.telefone}" size="12" required="true" id="telefone"/>
				<br/>
				<h:message for="telefone" styleClass="error"/>
			</h:column>

			
			<h:outputLabel value="profissao" />
			<h:column>
				<h:panelGrid id="inputProfissao" columns="3">
					
						<h:inputText readonly="true" id="profissaoField" value="#{defaultBean.pessoa.profissao }" converter="object.converter"/>
						<a4j:commandButton value="A" immediate="true" onclick="Richfaces.showModalPanel('profissoes')"/>
						<a4j:commandButton value="X" immediate="true">
							<f:setPropertyActionListener value="#{null}" target="#{defaultBean.pessoa.profissao}"/>
						</a4j:commandButton>
					
				</h:panelGrid>
				<br/>
				<h:message for="profissao" styleClass="error" />
			</h:column>
			
			<h:outputText value="Nascimento:" />
			<h:column>
				<rich:calendar  value="#{defaultBean.pessoa.nascimento}" required="true" id="nascimento"/>
				<br/>
				<h:message for="nascimento" styleClass="error"/>
			</h:column>
			
			<h:outputText value="Status" />
			<h:column>
				<h:selectOneMenu id="status" value="#{defaultBean.pessoa.status}" >
					<f:selectItems value="#{comboHelper.statusCollection}"/>
				</h:selectOneMenu>
				<br/>
				<h:message for="status" styleClass="error"/>
			</h:column>
	
			<h:outputText value="comentario" />
			<h:column>
				<h:inputTextarea id="comentario" value="#{defaultBean.pessoa.comentario}" />
				<br/>
				<h:message for="comentario" styleClass="error"/>
			</h:column>
			
			
		</h:panelGrid>
					<a4j:commandButton value="Salvar" id="salvar" action="#{defaultBean.saveAndReturn}" rendered="#{relation==null}"/>
					<a4j:commandButton value="Salvar e Manter" id="salvarManter" action="#{defaultBean.saveAndKeep}" rendered="#{relation==null}"/>
					<a4j:commandButton value="Salvar e Selecionar" id="salvarSelecionar" oncomplete="javascript:if ('#{facesContext.maximumSeverity.ordinal}' == '0'){Richfaces.hideModalPanel('#{naming}ModalPanel');}"
						action="#{defaultBean.saveAndSelect}" rendered="#{relation!=null}" >
						<f:setPropertyActionListener value="#{defaultBean.pessoa}" target="#{relation.pessoa}"/>
					</a4j:commandButton>
					<a4j:commandButton value="Voltar" id="voltar" action="#{defaultBean.voltar}" immediate="true"/>
					
				</rich:panel>
			</a4j:form>

		</a4j:outputPanel>

		<rich:modalPanel id="profissoes" autosized="true">
    	<f:facet name="header">
        	<h:outputText value="buscar profissoes" />
    	</f:facet>
    	<f:facet name="controls">
        	<h:outputText value="X" style="cursor:pointer;font-style:bold" onclick="Richfaces.hideModalPanel('profissoes')" />
    	</f:facet>  	    
    	   <ui:include  src="profissaoCrud.xhtml">
    	   		<ui:param name="relation" value="#{defaultBean}" />
    	   </ui:include>
    	</rich:modalPanel>
    	
</ui:composition>
</body>
</html>
D

tentei usar a4j:keepalive, a4j:region e nada de solução

usando region envolta do campo de relacionamento, não limpa o formulario, mas tambem não o bendito campo!

D

rogeriuslima:
Opa cara, blz?
Tem como vc postar o codigo da sua tela?
Eu “acho” que o problema pode estar no escopo do seu bean.

ja postei o codigo, blz

kratera

A princípio evite usar o a4j: para o form, use o h: evita que o formulário renderize constantemente.

abraço.

Criado 23 de março de 2009
Ultima resposta 17 de set. de 2009
Respostas 6
Participantes 3