Ajuda com PrimeFaces

Boa tarde a todos,

sou novo no forum , entrei hoje, se algum puder me ajudar eu agradeço, estou desenvolvendo um sistema para postar materias de pescarias e preciso que quando o usuario clicar no botao “detalhes” seja redirecionado para outra pagina trazendo as informacoes daquela materia especifica , eu consegui fazer , mais com o p:dialog, queria que carregasse uma nova pagina, abaixo o codigo atual :

<h:column footerClass=“localmat5” headerClass=“localmat5”>
<f:facet name=“header”>Detalhes</f:facet>


<h:commandButton type=“button” value=“Detalhes” onclick=“descricaoDaLinha_#{mat.id}.show()” styleClass=“botaodetalhes”></h:commandButton>
<p:dialog modal="=true" header=“Detalhes da pescaria” widgetVar=“descricaoDaLinha_#{mat.id}” width=“900” height=“800” resizable=“false” showEffect=“clip” hideEffect=“clip” draggable=“false” styleClass=“dialogomat”>

<h:outputText value=“Local da matéria: “/>
<h:outputLabel value=”#{mat.pesqueiro.nome}” escape=“false” styleClass=“localmat” />

								<h:outputText value="Cidade: "/>
								<h:outputLabel value="#{mat.pesqueiro.cidade.nome}" escape="false"	styleClass="localmat" />  <br/> <br/>
							
								<h:outputText value="Estado: "/>
								<h:outputLabel value="#{mat.pesqueiro.cidade.estado.nome}" escape="false" styleClass="localmat" /><br/><br/>
								
								<h:outputText value="Data da pescaria: "/>
								<h:outputLabel value="#{mat.data}" styleClass="localmat2">
								<f:convertDateTime pattern="dd/MM/yyyy"/>
								</h:outputLabel><br/><br/>
								<div class="dialogomatt">
								<h:outputText value="#{mat.descricao}" escape="false" styleClass="dialogomatt"/>
								</div>
								</div>

use o atributo action do commandButton e no seu metodo do manegedBean você retorna uma string com o nome da página desejada, por exemplo:

<p:commandButton action="#{bean.metodo()}"/>
public String metodo(){

 //operações desejadas
 
 retrun "pagina.xhtml";
}

você tambem pode especificar a página diretamente no atributo:

<p:commandButton action="pagina.xhtml"/>

[quote=danilovteodoro]use o atributo action do commandButton e no seu metodo do manegedBean você retorna uma string com o nome da página desejada, por exemplo:

<p:commandButton action="#{bean.metodo()}"/>
public String metodo(){

 //operações desejadas
 
 retrun "pagina.xhtml";
}

você tambem pode especificar a página diretamente no atributo:

<p:commandButton action="pagina.xhtml"/> [/quote]

Sim , ate ai blz , consegui tambem redirecionar , mas e para pegar somente com aquele id, por exemplo no meu banco tenho 3 materias criadas eu quero que ao clicar no botao detalhes, trazesse tudo somente referente aquela materia ,

desde ja agradeco !

Nesse caso eu usaria o objeto materia como uma classe model , criaria uma uma classe de controlhe que possui o obj materia para ser meu bean e anotaria ele como @SessionScoped para ficar na sessão.

Nao sei que tecnologia você está usando mas imagino que tenha um metodo q retorna um obj materia do banco de dados.

@SessionScoped
@ManagedBean(name="mat")
public class MateriaCtrl {

    private Materia materia;
    @Inject
    private DaoMateira daoMateria; //classe de persistencia

    public MateriaCtrl() {
        materia = new Materia();
    }

    public Materia getMateria() {
        return materia;
    }

    public void setMateria(Materia materia) {
        this.materia = materia;
    }

    public DaoMateira getDaoMateria() {
        return daoMateria;
    }

    public void setDaoMateria(DaoMateira daoMateria) {
        this.daoMateria = daoMateria;
    }
    

    public String metodo(int id) {

      materia = daoMateria.getMateriaById(id); //metodo que retorna por Id 

        return "pagina2.xhtml";
    }
}

página 1:

<p:commandButton value="Detalhes" action="{mat.metodo(mat.id)}"/> 

página 2:

<div class="dialogomatt2"> 
<h:outputText value="Local da matéria: "/> 
<h:outputLabel value="#{mat.materia.pesqueiro.nome}" escape="false"	styleClass="localmat" /> <br/> <br/> 

<h:outputText value="Cidade: "/> 
<h:outputLabel value="#{mat.materia.pesqueiro.cidade.nome}" escape="false"	styleClass="localmat" /> <br/> <br/> 

<h:outputText value="Estado: "/> 
<h:outputLabel value="#{mat.materia.pesqueiro.cidade.estado.nome}" escape="false" styleClass="localmat" /><br/><br/> 

<h:outputText value="Data da pescaria: "/> 
<h:outputLabel value="#{mat.materia.data}" styleClass="localmat2"> 
<f:convertDateTime pattern="dd/MM/yyyy"/> 
</h:outputLabel><br/><br/> 
<div class="dialogomatt"> 
<h:outputText value="#{mat.materia.descricao}" escape="false" styleClass="dialogomatt"/> 
</div> 

Tópico movido para desenvolvimento web.

Blz!!
É o seguinte fiz um sistema que faz exatamente isso que vc quer, funciona assim!!

Em seu Bean vc cria um metodo visualizarDados, ou outro nome de sua preferência.

public String visualizarDados(){ return "visualizarDados";// no return vc informa a página onde serão impresso os dados, neste // caso visualizarDados.xhtml }
este será o metodo que vc chamará no action do botão Detalhes em sua tabela. pronto simples assim!!

[quote=danilovteodoro]Nesse caso eu usaria o objeto materia como uma classe model , criaria uma uma classe de controlhe que possui o obj materia para ser meu bean e anotaria ele como @SessionScoped para ficar na sessão.

Nao sei que tecnologia você está usando mas imagino que tenha um metodo q retorna um obj materia do banco de dados.

@SessionScoped
@ManagedBean(name="mat")
public class MateriaCtrl {

    private Materia materia;
    @Inject
    private DaoMateira daoMateria; //classe de persistencia

    public MateriaCtrl() {
        materia = new Materia();
    }

    public Materia getMateria() {
        return materia;
    }

    public void setMateria(Materia materia) {
        this.materia = materia;
    }

    public DaoMateira getDaoMateria() {
        return daoMateria;
    }

    public void setDaoMateria(DaoMateira daoMateria) {
        this.daoMateria = daoMateria;
    }
    

    public String metodo(int id) {

      materia = daoMateria.getMateriaById(id); //metodo que retorna por Id 

        return "pagina2.xhtml";
    }
}

página 1:

<p:commandButton value="Detalhes" action="{mat.metodo(mat.id)}"/> 

página 2:

[code]



<h:outputText value=“Cidade: “/>
<h:outputLabel value=”#{mat.materia.pesqueiro.cidade.nome}” escape=“false” styleClass=“localmat” />

<h:outputText value=“Estado: “/>
<h:outputLabel value=”#{mat.materia.pesqueiro.cidade.estado.nome}” escape=“false” styleClass=“localmat” />

<h:outputText value=“Data da pescaria: “/>
<h:outputLabel value=”#{mat.materia.data}” styleClass=“localmat2”>
<f:convertDateTime pattern=“dd/MM/yyyy”/>
</h:outputLabel>

[/code][/quote]

Tentei mais nao foi assim , vou passar o codigo melhor, nao sabia que tinha opcao Code, abaixo o xhtml

<h:dataTable width="705" border="1" styleClass="tabelaultmat" value="#{materiaBean.materias}" var="mat" >

						<h:column footerClass="localmat" headerClass="localmat4">
							<f:facet name="header">Capa</f:facet>
							<p:graphicImage value="#{mat.fotoCapa}" width="90"/>
						</h:column>

						<h:column footerClass="localmat" headerClass="localmat">
							<f:facet name="header">Local da materia</f:facet>
							<div class="testeitulo">
								<h:outputLabel value="#{mat.pesqueiro.nome}" escape="false"	styleClass="localmat" /><br/>
									
							</div>
						</h:column>

						<h:column footerClass="localmat3" headerClass="localmat3" id="localmat3">
							<f:facet name="header">Titulo</f:facet>
							<div class="testeitulo">
								<h:outputLabel value="#{mat.titulo}" styleClass="localmat3" />
							</div>
						</h:column>

						<h:column footerClass="localmat2" headerClass="localmat2">
							<f:facet name="header">Data da materia</f:facet>
							<div class="localmat2">
								<h:outputLabel value="#{mat.data}" styleClass="localmat2">
									<f:convertDateTime pattern="dd/MM/yyyy"></f:convertDateTime>
								</h:outputLabel>
							</div>
						</h:column>
						
						
						
						<h:column footerClass="localmat5" headerClass="localmat5">
							<f:facet name="header">Detalhes</f:facet>
							<div class="testeitulo5">
							<h:commandButton type="button" value="Detalhes" action="materiadetalhada.xhtml" styleClass="botaodetalhes" />
										</div>
						</h:column>

agora o bean

private Materia materia;
	private EntityManager entityManager;
	private GenericDAO<Materia> materiaDao;
	private int idpesqueiro;
	
	
	
	public GenericDAO<Materia> getMateriaDao() {
		return materiaDao;
	}

	public void setMateriaDao(GenericDAO<Materia> materiaDao) {
		this.materiaDao = materiaDao;
	}

	public int getIdpesqueiro() {
		return idpesqueiro;
	}

	public void setIdpesqueiro(int idpesqueiro) {
		this.idpesqueiro = idpesqueiro;
	}

	public MateriaBean() {
		this.entityManager = JPAUtil.getEntityManagerFactory().createEntityManager();
		this.materiaDao = new GenericDAO<Materia>(entityManager, Materia.class);
		this.materia = new Materia();
		this.materia.setData(GregorianCalendar.getInstance().getTime());
		this.materia.setPesqueiro(new GenericDAO<Pesqueiro>(entityManager, Pesqueiro.class).ler(2));
		Pesqueiro pesq = new Pesqueiro();
		pesq.setId(1);
		idpesqueiro = 1;
		this.materia.setPesqueiro(pesq);
	}
	
	public Materia getMateria() {
		return materia;
	}

	public void setMateria(Materia materia) {
		this.materia = materia;
	}

	public String salvar(){
		Pesqueiro pesq = new Pesqueiro();
		pesq.setId(idpesqueiro);
		materia.setPesqueiro(pesq);
		this.entityManager.getTransaction().begin();
		this.materiaDao.atualizar(materia);
		this.entityManager.getTransaction().commit();
		
		return "conhecapesqueiro.jsf";
	}

	public List<Materia> getMaterias(){
		return materiaDao.listarTodos("data desc");
	}
	
}

e agora o dao

protected EntityManager manager;
	protected Class<?> tipo;
	protected String nomeTabela;
	

	public GenericDAO(EntityManager manager, Class<?> tipo) {
		this.manager = manager;
		this.tipo = tipo;
		this.nomeTabela = JPAUtil.getTableName(tipo);
	}
	
	public void criar(T t) {
		manager.persist(t);
		manager.flush();
	}
	
	@SuppressWarnings("unchecked")
	public T ler(int codigo){
		return (T) manager.getReference(tipo, codigo);
	}
	
	public void remover(T t){
		manager.remove(t);
		manager.flush();
	}
	
	public void atualizar(T t){
		manager.merge(t);
		manager.flush();
	}

	@SuppressWarnings("unchecked")
	public List<T> listarTodos(int pagina, int quantidadePorPagina){
		Query query = manager.createQuery("SELECT x FROM " + nomeTabela + " x");
		query.setFirstResult(pagina);
		query.setMaxResults(quantidadePorPagina);
		return query.getResultList();
	}

peco desculpas por estar te incomodando !

quando clicou en detalhes nao trouxe nada , eu tenho 3 materias cadastradas e quando clicar queria que fosse para aquela pagina materiadetalhada.xhtml trazendo as informacoes da materia que ele clicou !

ja procurei em varios lugar nao achei

[quote=aprendizweb]Blz!!
É o seguinte fiz um sistema que faz exatamente isso que vc quer, funciona assim!!

Em seu Bean vc cria um metodo visualizarDados, ou outro nome de sua preferência.

public String visualizarDados(){ return "visualizarDados";// no return vc informa a página onde serão impresso os dados, neste // caso visualizarDados.xhtml }
este será o metodo que vc chamará no action do botão Detalhes em sua tabela. pronto simples assim!![/quote]

fiz , funcionou a parte do redirecionamento, porem assim vai mostrar todas as materias que tenho eu precisaria que mostrasse so que a que a pessoa clicou !

Então, da forma que te falei vc deveria listar os dados em uma tabela, selecionar uma linha e acionar o botão detalhes para redirecionar para a visualização daquela linha, como na imagem abaixo.

era isso mesmo que eu precisava , so que quando clico em detalhes ele traz as informcoes de todas as linhas entendeu ?
fiz assim :

public String visualizarMateria(){  
        return "materiadetalhada.jsf";
<h:commandButton value="Detalhes" action="#{materiaBean.visualizarMateria}" styleClass="botaodetalhes"/>

usa o dataTable do primefaces e deixa assim com o restante

<p:dataTable id="Materia" var="mat" value="#{materiaBean.materias}" rowKey="#{mat.id}"(adiciona aqui o id de sua entidade Materia) selection="#{materiaBean.materia}" selectionMode="single">

Cria um panel em sua materiadetalhada.xhtml como abaixo e testa.

[code]
<p:panel>
<f:facet name=“header”>Visualizar Material</f:facet>
<h:panelGrid columns=“2” cellpadding=“2” >

				<h:outputLabel value="Nome:" styleClass="rotulos"/>
				<h:outputLabel value="#{materiaBean.materia..pesqueiro.nome}" styleClass="rotulos2"/>
				
				<h:outputLabel value="Matricula" styleClass="rotulos"/>
				<h:outputLabel value="#{materiaBean.materia.pesqueiro.cidade.nome}" styleClass="rotulos2"/>
				
				<h:outputLabel value="Login" styleClass="rotulos"/>
				<h:outputLabel value="#{materiaBean.materia.pesqueiro.cidade.estado.nome}" styleClass="rotulos2"/>
				
        		
			</h:panelGrid>
			<f:facet name="footer">
			<p:commandButton action="#{materiaBean.editar}" value="Editar" icon="ui-icon-refresh"/>
			</f:facet>
            
	</p:panel>[/code]

[quote=aprendizweb]usa o dataTable do primefaces e deixa assim com o restante

<p:dataTable id="Materia" var="mat" value="#{materiaBean.materias}" rowKey="#{mat.id}"(adiciona aqui o id de sua entidade Materia) selection="#{materiaBean.materia}" selectionMode="single">

Cria um panel em sua materiadetalhada.xhtml como abaixo e testa.

[code]
<p:panel>
<f:facet name=“header”>Visualizar Material</f:facet>
<h:panelGrid columns=“2” cellpadding=“2” >

				<h:outputLabel value="Nome:" styleClass="rotulos"/>
				<h:outputLabel value="#{materiaBean.materia..pesqueiro.nome}" styleClass="rotulos2"/>
				
				<h:outputLabel value="Matricula" styleClass="rotulos"/>
				<h:outputLabel value="#{usuarioBean.materia.pesqueiro.cidade.nome}" styleClass="rotulos2"/>
				
				<h:outputLabel value="Login" styleClass="rotulos"/>
				<h:outputLabel value="#{usuarioBean.materia.pesqueiro.cidade.estado.nome}" styleClass="rotulos2"/>
				
        		
			</h:panelGrid>
			<f:facet name="footer">
			<p:commandButton action="#{materiaBean.editar}" value="Editar" icon="ui-icon-refresh"/>
			</f:facet>
            
	</p:panel>[/code][/quote]

o data do prime funciono tudo normal , o painel na tabela de materia detalhada tbm , so que nao traz nenhum informacao apareceu so o painel em branco

vai ver falta o corrigir o atributo rowKey em sua tabela, por exemplo se na sua entidade Materia estiver
private int idmateria seu atributo de ser rowKey="#{mat.idmateria}"

e dentro de seu panel deixa assim com um unico atributo e testa.

<h:outputLabel value="Nome:" styleClass="rotulos"/> <h:outputLabel value="#{materiaBean.materia.pesqueiro.nome}" />

[quote=aprendizweb]vai ver falta o corrigir o atributo rowKey em sua tabela, por exemplo se na sua entidade Materia estiver
private int idmateria seu atributo de ser rowKey="#{mat.idmateria}"

e dentro de seu panel deixa assim com um unico atributo e testa.

<h:outputLabel value="Nome:" styleClass="rotulos"/> <h:outputLabel value="#{materiaBean.materia.pesqueiro.nome}" /> [/quote]
vixi , o pior que ta tudo certinho do jeito que voce falo rsrs aparece o painel mais nao carrega nada
materiadetalhada:

[code]
<p:panel>
<f:facet name=“header”>Materia</f:facet>
<h:panelGrid columns=“2” cellpadding=“2” >

                <h:outputLabel value="Nome:" styleClass="rotulos"/>  
                <h:outputLabel value="#{materiaBean.materia.pesqueiro.nome}" styleClass="rotulos2"/>  
                  
            </h:panelGrid>  
        </p:panel>      
		[/code]

bean

	public String visualizarMateria(){  
        return "materiadetalhada.jsf";
	}

materia

<p:dataTable width="705" border="1" styleClass="tabelaultmat" value="#{materiaBean.materias}" var="mat" id="Materia" rowKey="#{mat.id}" selection="#{materiaBean.materia}" selectionMode="single" > <p:column footerClass="localmat5" headerClass="localmat5" > <f:facet name="header">Detalhes</f:facet> <div class="testeitulo5"> <h:commandButton value="Detalhes" action="#{materiaBean.visualizarMateria}" styleClass="botaodetalhes"/> </div> </p:column> </p:dataTable>

e na entidade esta somente com id mesmo