Dúvida sobre como passar um parâmetro de XHTML para XHTML em JSF

5 respostas
C

Olá, estou com o seguinte problema.
Tenho uma View de cadastro e outra de listagem, quando eu selecionar um item da lista e clicar no botão editar que fica ao lado de cada registro, o sistema deveria redirecionar para a mesma página que salva os registros populando os campos da mesma com os valores do respectivo objeto para assim serem feitas as alterações desejadas e salva-las.
Porém meu managed bean é @ViewScoped e pesquisando na internet descobri que ele perde todos os dados cada vez que passar de página na aplicação.
Existe algum meio de segurar estes dados para passá-los de uma view para outra e efetuar a opção de editar?

Obrigado.

ManagedBean

@ManagedBean(name = "userMB")
@ViewScoped
public class UserMB implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private UserForm form;
	private User selectedUser;
	private List<User> users = new ArrayList<User>();

public UserMB() {
		UserDAO dao = new UserDAOImpl();
		users = dao.listar();
		form = new UserForm();
	}

public String editar() throws IllegalAccessException,
			InvocationTargetException {
//REGRAS 
return "/protected/user/user.xhtml";
}

//GETS AND SETS

View de Listagem dos Registros

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- template="template/principal.xhtml" -->
<ui:composition template="../../template/principal.xhtml"
	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:p="http://primefaces.org/ui">
	<ui:define name="conteudo">
		<h:form id="form" prependId="false">
			<!-- <p:messages id="messages"/> -->
			<p:dataTable id="userDataTable" var="user" value="#{userMB.users}"
				paginator="true" rows="10"
				paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} 
					{NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
				rowsPerPageTemplate="5,10,15"
				emptyMessage="Nenhum registro encontrado!" >
				<f:facet name="header">
						Lista de Usuários
					</f:facet>

				<p:column>
					<f:facet name="header">
						<h:outputText value="ID" />
					</f:facet>
					<h:outputText value="#{user.id}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Nome do Usuário" />
					</f:facet>
					<h:outputText value="#{user.nomeUser}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Usuário" />
					</f:facet>
					<h:outputText value="#{user.usuario}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Role" />
					</f:facet>
					<h:outputText value="#{user.role}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="E-Mail" />
					</f:facet>
					<h:outputText value="#{user.email}" />
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Dt. Cadastro" />
					</f:facet>
					<h:outputText value="#{user.dtCadastro}">
						<f:convertDateTime pattern="dd/MM/yyyy" locale="pt_BR" />
					</h:outputText>
				</p:column>

				<p:column>
					<f:facet name="header">
						<h:outputText value="Ações"></h:outputText>
					</f:facet>
					<p:commandButton id="editarUsuario" icon="ui-icon-pencil"
						onclick="confirmacaoEditar.show()">
						<p:tooltip for="editarUsuario">Editar</p:tooltip>
						<f:setPropertyActionListener target="#{userMB.selectedUser}" value="#{user}" />
					</p:commandButton>

					<p:commandButton id="excluirUsuario" icon="ui-icon-minus"
						onclick="confirmacaoExcluir.show()">
						<p:tooltip for="excluirUsuario">Excluir</p:tooltip>
						<f:setPropertyActionListener target="#{userMB.selectedUser}"
							value="#{user}" />
					</p:commandButton>
				</p:column>
			</p:dataTable>

			<!-- MENSAGEM PARA CONFIRMAÇÃO DE EDIÇÃO DO USUÁRIO -->
			<p:confirmDialog id="confirmacaoDialogEditar"
				message="Tem certeza que deseja EDITAR este registro?"
				header="Confirmação" severity="alert" widgetVar="confirmacaoEditar">

				<p:commandButton id="confirmEditar" value="Sim"
					oncomplete="confirmacaoEditar.hide()"
					action="#{userMB.editar}" />
				<p:commandButton id="declineEditar" value="Cancelar"
					onclick="confirmacaoEditar.hide()" type="button" />
			</p:confirmDialog>

			<!-- MENSAGEM PARA CONFIRMAÇÃO DE EXCLUSÃO DO USUÁRIO -->
			<p:confirmDialog id="confirmacaoDialogExcluir"
				message="Tem certeza que deseja EXCLUIR este registro?"
				header="Confirmação" severity="alert" widgetVar="confirmacaoExcluir">

				<p:commandButton ajax="true" id="confirmExcluir" value="Sim"
					oncomplete="confirmacaoExcluir.hide()"
					actionListener="#{userMB.excluir}" update="form, userDataTable"/>
				<p:commandButton id="declineExcluir" value="Cancelar"
					onclick="confirmacaoExcluir.hide()" type="button" />
			</p:confirmDialog>

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

View de Salvar e Editar os Registros

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- template="template/principal.xhtml" -->
<ui:composition template="../../template/principal.xhtml"
	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:p="http://primefaces.org/ui">
	<ui:define name="conteudo">
		<h:form id="userForm" prependId="false">
			<p:messages id="messages" display="icon" />

			<p:panel id="painelUser">
				<f:facet name="header">
					Cadastro e Edição de Usuário
				</f:facet>
				<table width="100%">
					<tr valign="top">
						<td width="48%"><p:panelGrid styleClass="boxInterno"
								columns="2">
								<h:outputLabel for="usuario" value="Usuario: " />
								<p:inputText id="usuario" value="#{userMB.form.usuario}"
									label="usuario" required="true"/>

								<h:outputLabel for="senha" value="Senha: " />
								<p:inputText id="senha" value="#{userMB.form.senha}"
									label="senha" required="true"/>

								<h:outputText value="Role: " />
								<p:selectOneMenu required="true" value="#{userMB.form.role}">
									<f:selectItem itemLabel="Selecione Um" itemValue="" />
									<f:selectItem itemLabel="Administrador" itemValue="ADMIN" />
									<f:selectItem itemLabel="Usuário" itemValue="USER" />
								</p:selectOneMenu>
							</p:panelGrid></td>
						<td width="48%"><p:panelGrid styleClass="boxInterno"
								columns="2">
								<h:outputLabel for="nomeUser" value="Nome: " />
								<p:inputText id="nomeUser" value="#{userMB.form.nomeUser}"
									label="nomeUser" required="true"/>

								<h:outputLabel for="email" value="E-mail: " />
								<p:inputText id="email" value="#{userMB.form.email}"
									label="email" required="true"/>

								<h:outputLabel for="dtCadastro" value="Dt. Cadastro: " />
								<p:calendar disabled="true" required="true"
									value="#{userMB.form.dtCadastro}" id="dtCadastro">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</p:calendar>
							</p:panelGrid></td>
					</tr>
				</table>
				<f:facet name="footer">
					<p:commandButton action="#{userMB.salvar}" value="Salvar"
						icon="ui-icon-circle-check"/>
				</f:facet>
			</p:panel>

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

5 Respostas

H

Sim. Coloque o objeto no FlashScope.

JSF Exibindo Objeto e Mensagens após Redirect

C

Hebert Coelho:
Sim. Coloque o objeto no FlashScope.

JSF Exibindo Objeto e Mensagens após Redirect

Estou usando PrimeFaces, e gostaria de saber se é possível fazer usando @RequestScoped, esse esquema do flash me parece gambiarra!

Grato

H

cassyojr:
Estou usando PrimeFaces, e gostaria de saber se é possível fazer usando @RequestScoped, esse esquema do flash me parece gambiarra!

Grato

Gambiarra vai ser você utilizar SessionScoped ou colocar o objeto no HttpSession.

Bem, boa sorte aí por que até então o jeito correto que eu vi eu já te indiquei.

C

Hebert Coelho:
cassyojr:
Estou usando PrimeFaces, e gostaria de saber se é possível fazer usando @RequestScoped, esse esquema do flash me parece gambiarra!

Grato

Gambiarra vai ser você utilizar SessionScoped ou colocar o objeto no HttpSession.

Bem, boa sorte aí por que até então o jeito correto que eu vi eu já te indiquei.

Bem, eu falei @RequestSoped e não @SessionScoped, mas tudo bem. Obrigado pela dica, irei tentar.

H

cassyojr:
Hebert Coelho:
cassyojr:
Estou usando PrimeFaces, e gostaria de saber se é possível fazer usando @RequestScoped, esse esquema do flash me parece gambiarra!

Grato

Gambiarra vai ser você utilizar SessionScoped ou colocar o objeto no HttpSession.

Bem, boa sorte aí por que até então o jeito correto que eu vi eu já te indiquei.

Bem, eu falei @RequestSoped e não @SessionScoped, mas tudo bem. Obrigado pela dica, irei tentar.

Eu sei que você falou. Eu estou falando que assim como view, com request você também terá dificuldades. E eu escrevi supostas soluções e são as mais indicadas por aqui.

Nesse post foi feito como você quer por RequestScope. Nessa abordagem você tem que salvar todos os dados do objeto na tela, inclusive o ID.

Aplicação Web Completa JSF EJB JPA JAAS

Criado 2 de outubro de 2012
Ultima resposta 2 de out. de 2012
Respostas 5
Participantes 2