Chamando método automaticamente ao passar parametros via url

Olá boa tarde,

realizo em minha aplicação uma passagem de parametro e os capturo dessa forma:

<f:view> <f:metadata> <f:viewParam name="id" value="#{meuBean.id}" /> </f:metadata> </f:view>

Gostaria que depois de receber esse parametro, um método fosse imediatamente chamado. Existe algum modo de fazer isso?

Abraços.

OBS: Estou utilizando primefaces 3.

tenta fazer assim

[code]public construtorDaClasse(){
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();

	if(!request.getParameter("PARAMETRO").isEmpty()){
		seuMetodo();
	}
}

[/code]

Não deu certo. Por hora, coloquei a chamada ao método dentro do set do ID. Funciona, mas eu creio que isso pode gerar problemas futuros, principalmente de desempenho se o ID for reutilizado para outro fim.

INFO: Exception when handling error trying to reset the response.
com.sun.faces.mgbean.ManagedBeanCreationException: Não é possível criar instância para·a classe: consultas.meuBean.
	at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
	at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
	at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
	at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
	at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
	at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
	at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
	at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:103)
	at com.sun.el.parser.AstValue.getValue(AstValue.java:179)
	at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
	at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:413)
	at org.primefaces.component.menu.BaseMenuRenderer.encodeTieredMenuContent(BaseMenuRenderer.java:119)
	at org.primefaces.component.menu.BaseMenuRenderer.encodeTieredSubmenu(BaseMenuRenderer.java:184)
	at org.primefaces.component.menu.BaseMenuRenderer.encodeTieredMenuContent(BaseMenuRenderer.java:141)
	at org.primefaces.component.menubar.MenubarRenderer.encodeMarkup(MenubarRenderer.java:63)
	at org.primefaces.component.menu.BaseMenuRenderer.encodeEnd(BaseMenuRenderer.java:40)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.NullPointerException
public meuBean() {
        FacesContext contexto = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) contexto.getExternalContext().getRequest();
        id = Integer.valueOf(request.getParameter("id").toString());

        if (id>0) {
            teste();
        }
    }
public final void teste() {
        System.out.println("Entrei...");
    }

Abraços.

crisirado

Coloca a class bean ai… para facilitar :slight_smile:

abras

Uma dúvida, porque vc precisa chamar o método atráves de parâmetros via url?
Qual tipo de situação vc utiliza isto?

Olá MarcoQuadros030810, o bean não tem muito segredo, mas hoje está bem grande, então vou tentar resumir o Bean.

@ManagedBean(name = "HistoricoPessoasBean")
@ViewScoped
public class HistoricoPessoasBean {

    private LazyDataModel<HistoricoPessoasView> historicoPessoas;
    private Integer id;
    
    @EJB
    private HistoricoPessoasFacadeLocal HistoricoPessoasDAO;

    public HistoricoPessoasBean() {
    }

    @PostConstruct
    void init() {     

        if (id > 0) {
            visualizarHistorico();
        }else{
          buscarhistoricoPessoas();
      }
    }


    public void buscarhistoricoPessoas() {
	//Gera lista de pessoas        
    }

    public void visualizarHistorico() {
    //busca todos os dados a partir do id recebido
    }


public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
        init();
    }
       
}

Respondendo o questionamento do rafaduka. Tenho uma lista de pessoas e é possível você escolher uma pessoa da lista para ver o histórico de informações dela. Eu preciso do id dessa pessoa e quando passar para a página de visualização de histórico(outro .xhtml) trazer parte desses dados carregados, mas antes preciso realizar uma busca por esse dados. Digo parte, porque a visualização tem alguns botões que abrem alguns <p:dialog>.

Sim, eu uso o mesmo bean para isso, se por ventura houver esse questionamento. Por hora eu estou chamando no método set o método init(), mas me incomoda isso porque setters e getters pelo menos no que me passaram não pode ter chamada de funções ou outros tipos de código. Funciona, mas acho que não é o ideal.

Abraços.

Com JSF, você consegue chamar o método direto no link.
Exemplo:[code]<p:dataTable value="#{historicoPessoasBean.listaPessoas}" var=“var”>

<p:column>
   #{var.idPessoa}
</p:column>

<p:column>
   #{var.nomePessoa}
</p:column>

<p:column> 
  //link para chamar seu método, sem necessidade de chamar na URL.
  <p:commandLink action="#{historicoPessoasBean.visualizarHistorico(var.idPessoa)}" /> 
</p:column>

</p:dataTable>[/code]Aqui 4 maneiras de passar o atributo com JSF

rafaduka,

nesse caso e nos demais exemplos todos trabalham com @SessionScoped, então os dados se mantem mesmo mudando de página. No meu caso estou usando @ViewScoped, por isso eu passo um id por URL e tento buscar todos os dados .

Mesmo assim, valeu rafaduka.

Abraços.

crisirado, é claro que perde o id, vc está navegando “orientado à páginas” com ViewScope.
(infelizmente isso é um vício dos desenvolvedores quando se trabalha com JSF)

“Navegue entre views orientada à estados e não à páginas”, vc insere a inteligência e controle nos managed beans. mais informações.

Assim continua trabalhando com ViewScope sem perder seus dados.