Duvida simples jsf

5 respostas
fabioebner

Pessoal
imagine a seguinte situacao … na primeira pagina eu tenho uma lista de noticias (cada noticia em um link q chama uma pagina passando o numero daquela noticia) a proxima pagina recebe esse valor e mostra a noticia inteira na pagina

como eu era usuario de php eu faria assim:

na primeira pagina eu tenho um link <a href="mostar_noticia.php?cdNoticia=5">noticia de nunmero 4 </a>
e na outra pagina eu receberia assim: $sqlSelecionaNoticia = "select..... Where cd_noticia = ".$_REQUEST['cd_noticia'];

porem eu estava falando com um amigo meu e ele falou que em jsf nao se faz mais assim…o meu link vai chamar um manege bean na minha pagina(q mostra a noticia inteira) passando os parametros para ela…

eu nao consegui visualizar como se faz isso. como atraves de um link eu chamo outra pagina passando variaveis para ela e chamando determinado metodo passando essas variaveis…

eu sei q da para fazer usando <% Classe nome = new Classe(); nome.metodo(aqui faco o request dos atributos e tal)

mas nao sei se e assim q se usa pq geralmente para acessar metodos e tal eu utlizo o #{bean.metodo}

alguem ae entendeu o q eu falei? e pode me ajudar??
valeus

5 Respostas

L

Acho q dá pra vc usar um <h:comandLink/> que passe um valor para o handler de navegacao que encaminha para a pg que vc desejar
foi isso q eu entendi espero ter ajudado

Leozin

Fabio

o modelo orientado a componentes do JSF há bastante semelhanças de como você programaria em Swing

vamos analizar essa classe

public class NoticiaBean {
  private NoticiaService noticiaService;
  private Noticia noticiaSelecionada;

//getters e setters
}

uma vez você clicando numa noticia, você irá chamar um action ou um action listener. O que você poderia fazer era o seguinte

// quando você clicar num link de uma página, você acessaria esse método
public String selecionarNoticia() {
  Integer idNoticia = meuMetodoEncapsuladoPraPegarParamentro("idNoticia");
  noticiaSelecionada = noticiaService.buscarNoticiaPorId( idNoticia );
  return "sucesso";
}

// na outra página, ela vai chamar a el #{noticiaBean.noticiaSelecionada}
public Noticia getNoticiaSelecionada() {
  return noticiaSelecionada;
}
o teu commandLink da primeira página poderia ser assim (onde tem a lista de notícias)
<h:dataTable value="#{algumBean.todasNoticias}" var="noticia">
  <h:column>
     <h:commandLink action="#{noticiaBean.selecionarNoticia}">
     <f:param name="idNoticia" value="#{noticia.id}" />
  </h:commandLink
</h:column>

Resumindo:
- na tua primeira página, ele vai iterar sobre uma lista de notícias
- após isso, ele vai chamar um método no backing bean
- esse método (no caso o String selecionarNoticia) vai buscar no banco uma noticia de acordo com o Id que você passou
- após carregar essa propriedade, a outra página vai acessá-la

Uma vez você mexendo com JSF você não precisa se preocupar com request e response e afins. É tudo abstraído pra ti e o backing bean facilita pra caramba tudo isso

BONUS:

o método de encapsular o parâmetro passado (eu colocaria num backing bean abstrato, mas isso fica a teu gosto):
private Integer meuMetodoEncapsuladoPraPegarParamentro( String nomeParametro ) {
  return Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(nomeParametro));
}
fabioebner

Leozin.. cara eu fiz o seguinte:

agenda.java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.dnasolution.objeto;

import br.com.dnasolution.db.Conexao;
import br.com.dnasolution.service.AgendaService;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author Administrador
 */
public class Agenda {

    public static Integer getAgenda(String string) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    private String nmPessoa;
    private String nmAssunto;
    private String nmDescricaoAssunto;
    private String nmLocalCompromisso;
    private String dtCompromisso;

    public Agenda() {
    }
        private AgendaService agendaService;
        private Agenda agendaSelecionada;
        
    public Collection getAgenda() {
        Collection toReturn = new ArrayList();
        try {
            Connection conexao = Conexao.getInstancia().conectarDb();
            java.sql.Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM tb_agenda");

        } catch (Exception e) {

        }
        return toReturn;
    }

    public String getNmPessoa() {
        return nmPessoa;
    }

    public void setNmPessoa(String nmPessoa) {
        this.nmPessoa = nmPessoa;
    }

    public String getNmAssunto() {
        return nmAssunto;
    }

    public void setNmAssunto(String nmAssunto) {
        this.nmAssunto = nmAssunto;
    }

    public String getNmDescricaoAssunto() {
        return nmDescricaoAssunto;
    }

    public void setNmDescricaoAssunto(String nmDescricaoAssunto) {
        this.nmDescricaoAssunto = nmDescricaoAssunto;
    }

    public String getNmLocalCompromisso() {
        return nmLocalCompromisso;
    }

    public void setNmLocalCompromisso(String nmLocalCompromisso) {
        this.nmLocalCompromisso = nmLocalCompromisso;
    }

    public String getDtCompromisso() {
        return dtCompromisso;
    }

    public void setDtCompromisso(String dtCompromisso) {
        this.dtCompromisso = dtCompromisso;
    }

    public Agenda getAgendaSelecionada(Agenda agendaSelecionada) {
        return agendaSelecionada;
    }

    public String selecionarNoticia() {
        Integer idAgenda     = Agenda.getAgenda("cd_agenda");
        agendaSelecionada = agendaService.getAgendaById(idAgenda);
        return "sucesso";
    }
}
AgendaService.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.dnasolution.service;

import br.com.dnasolution.objeto.Agenda;

/**
 *
 * @author Administrador
 */
public class AgendaService {

    Agenda agenda = new Agenda();

    public AgendaService() {
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }
    
    public Agenda getAgendaById(int codigo){
        
        return agenda;
    }
  
}
AgendaBean.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.dnasolution.bean;

import br.com.dnasolution.objeto.Agenda;
import br.com.dnasolution.service.AgendaService;
import javax.faces.context.FacesContext;

/**
 *
 * @author Administrador
 */
public class AgendaBean {

    private AgendaService agendaService;
    private Agenda agendaSelecionada;
    private Integer idAgenda;

    /** Creates a new instance of NoticiaBean */
    public AgendaBean() {
    }

    public AgendaService getAgendaService() {
        return agendaService;
    }

    public void setAgendaService(AgendaService agendaService) {
        this.agendaService = agendaService;
    }

    public Agenda getAgendaSelecionada() {
        return agendaSelecionada;
    }

    public void setAgendaSelecionada(Agenda agendaSelecionada) {
        this.agendaSelecionada = agendaSelecionada;
    }

    // quando você clicar num link de uma página, você acessaria esse método
    public String selecionarAgenda() {
        idAgenda = meuMetodoEncapsuladoPraPegarParamentro("idAgenda");
        agendaSelecionada = agendaService.getAgendaById(idAgenda);
        return "sucesso";
    }

    public void setIdAgenda(Integer idAgenda) {
        this.idAgenda = idAgenda;
    }

    public Integer getIdAgenda() {
        return idAgenda;
    }

    private Integer meuMetodoEncapsuladoPraPegarParamentro(String nomeParametro) {
        return Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(nomeParametro));
    }
}
meu principal.jsf
<rich:dataTable var="agenda" value="#{montaCombo.agenda}" rows="6" columns="2" width="600" columnClasses="col" >
                                                    <f:facet name="header">
                                                     <h:column>
                                                        <h:outputText value="Compromisso(Local)"  /> (
                                                    </h:column>
                                                    <h:column>
                                                      <h:outputText value="Data" />
                                                    </h:column>
                                                    </f:facet>
                                                    <h:column>
                                                        <h:commandLink action="#{agendaBean.selecionarAgenda}" styleClass="fonte_menu">
                                                            <f:param name="idAgenda" value="#{agendaBean.idAgenda}" /> 
                                                        <h:outputText value="#{agenda.nm_assunto} "  /> (
                                                      <h:outputText value="#{agenda.nm_local_compromisso}" /> )
                                                      
                                                  </h:commandLink>
                                                    </h:column>
                                                    <h:column>
                                                      <h:outputText value="#{agenda.dt_compromisso}" />
                                                    </h:column>
                                                    <f:facet name="footer">
                                                      <h:outputText value="mais.." />
                                                    </f:facet>
                                                  </rich:dataTable>
no meu Faces-config eu so coloquei o AgendaBean com agendaBean e recebo o seguinte erro qdo clico no link
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: #{agendaBean.selecionarAgenda}: java.lang.NumberFormatException: For input string: "null"
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

javax.faces.FacesException: #{agendaBean.selecionarAgenda}: java.lang.NumberFormatException: For input string: "null"
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:107)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1198)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:184)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:162)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:350)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

javax.faces.el.EvaluationException: java.lang.NumberFormatException: For input string: "null"
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1198)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:184)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:162)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:350)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.lang.NumberFormatException: For input string: "null"
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
java.lang.Integer.parseInt(Integer.java:447)
java.lang.Integer.parseInt(Integer.java:497)
br.com.dnasolution.bean.AgendaBean.meuMetodoEncapsuladoPraPegarParamentro(AgendaBean.java:57)
br.com.dnasolution.bean.AgendaBean.selecionarAgenda(AgendaBean.java:43)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.el.parser.AstValue.invoke(AstValue.java:131)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1198)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:184)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:162)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:350)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.

--------------------------------------------------------------------------------

Apache Tomcat/6.0.14

agora tenho uma duvida.. aonde eu defino para qual pagina eu quero ir?? qdo clicar no link.. tem q ter ser no faces-config isso?

obrigado

Leozin

aqui tu poderia fazer assim:

<h:commandLink action="#{agendaBean.selecionarAgenda}" styleClass="fonte_menu"> <f:param name="idAgenda" value="#{agendaBean.idAgenda}" /> <h:outputText value="#{agenda.nm_assunto} " /> ( <h:outputText value="#{agenda.nm_local_compromisso}" /> ) </h:commandLink>

pra

<h:commandLink action="#{agendaBean.selecionarAgenda}" [b]value="#{agendaBean.idAgenda} (#{agenda.nm_assunto})"[/b] styleClass="fonte_menu"> <f:param name="idAgenda" value="#{agendaBean.idAgenda}" /> </h:commandLink>

E outra, o errro está acontecendo aqui:

Você debugou pra ver o que tá acontecendo ae?

Provavelmente o parâmetro está vindo nulo…

O teu dataTable está dentro de um h:form?

E quando usar o rich:dataTable utilize rich:column em vez de h:column

siga essas dicas e me diga que o erro continua

fabioebner

cara… entao eu fiz o debug sim… ele esta dando erro aqui:

private Integer meuMetodoEncapsuladoPraPegarParamentro(String nomeParametro) { return Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(nomeParametro)); }

porem qdo ele entra no metodo eu mando mostrar o valor da variavel nomeParametro e ele me monstra idAgenda normal… ta complicado…

cara seria pedir mto pra vc fazer um exemplo bem simples… um link feito na mao em uma pagina q chama outra pagina passando dois parametros… e um bean recebe esses dois parametros na proxima pagina. concatena alguma coisa e mostra na tela… por favor :stuck_out_tongue:

valeu

Criado 21 de janeiro de 2008
Ultima resposta 23 de jan. de 2008
Respostas 5
Participantes 3