Não Consigo Chamar o metodo da ManagedBean

16 respostas
jsfjava
M

Sou iniciante com JSF então espero que entendam minhas dificuldades rs.

Criei um arquivo .xhtml e o mesmo chamando um metodo da ManagedBean porém não está dando certo.

CODIGOS ABAIXO:

Page.xhtml

<h:head />
<h:body>
<h:form>
<h:panelGrid>

Cadastramento de Contatos

Nome:<h:inputText value="#{ContatoBean.contato.nome}"/>
		Sobrenome:<h:inputText value="#{ContatoBean.contato.sobrenome}"/>
		Email:<h:inputText value="#{ContatoBean.contato.email}"/>
		
		<h:commandButton value="Cadastrar" 
			action="ContatoBean.imprimeContato"/>
	</h:panelGrid>
</h:form>

</h:body>

  • MANAGED BEAN

import javax.annotation.ManagedBean;

@ManagedBean

public class ContatoBean {

//MEMBROS

private Contato contato = new Contato();
//METHODS
public void imprimeContato(){
	System.out.println("Something");
}

//GGAS
public void setContato(Contato contato) {
	this.contato = contato;
}
public Contato getContato() {
	return contato;
}

}

– CONTATO

public class Contato {

private String nome;
private String sobrenome;
private String email;



//GGAS
public String getEmail() {
	return email;
}
public void setEmail(String email) {
	this.email = email;
}
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getSobrenome() {
	return sobrenome;
}
public void setSobrenome(String sobrenome) {
	this.sobrenome = sobrenome;
}

}

16 Respostas

M

Bom dia, na action do seu botão você tem que por o seu método entre #{}

Quando você quer passar um método na action, ele obrigatoriamente deve retornar uma String, essa String é a página, exemplo : return “index.xhtml”

Se você quer continuar na mesma página, então retorne null.

Você falou que a sua classe é um ManagedBean, por padrão, para referenciar um ManagedBean a primeira letra da primeira palavra vem sempre em minuscula (camelCase), então é contatoBean e não ContatoBean.

Você pode mudar a forma de referenciar o seu ManagedBean.

@ManagedBean(“contato”)

M

Obrigado pela resposta.

Eu fiz isso mas apresentou o erro abaixo:

javax.servlet.ServletException: /main/resources/page.xhtml @11,59 value="#{ContatoBean.contato.nome}": Target Unreachable, identifier [ContatoBean] resolved to null

javax.faces.webapp.FacesServlet.service(FacesServlet.java:683)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Alem da dúvida acima. Estou lendo o livro da Casa do código e no mesmo ele coloca o {#ContatoBean.contato.nome} minusculo mesmo a classe sendo nomeada maiúscula. está correto

M

Ignorar o que eu mencionei acima. Não li com atenção !!!

OBRIGADO !

M

Não foi falta de atenção sua não, eu acabei de editar a resposta

Eu estava só complementando.

Editei ao mesmo tempo que você enviou a mensagem.

M

alterei para


Nome:<h:inputText value="#{contato.contato.nome}"/>
Sobrenome:<h:inputText value="#{contato.contato.sobrenome}"/>
Email:<h:inputText value="#{contato.contato.email}"/>

<h:commandButton value="Cadastrar"
			action="#{contato.imprimeContato}"/>

e mesmo assim persiste o erro. =(

javax.servlet.ServletException: /main/resources/page.xhtml @11,55 value="#{contato.contato.nome}": Target Unreachable, identifier [contato] resolved to null

javax.faces.webapp.FacesServlet.service(FacesServlet.java:683)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
M

Você esta referenciando como contato, você alterou a anotação no seu ManagedBean?

Se você quee referenciar como contato, você tem que fazer: @ManagedBean("contato). Pois se você não definir como vai referenciar, por padrão seguirá a forma camelCase

M

Eu defini como @ManagedBean(“contatoMB”) para melhor legibilidade, redefini as referencias na classe mas mesmo assim o erro persistiu.

Para melhor entendimento, segue abaixo as classes alteradas.

@ManagedBean(“contatoMB”)
public class ContatoBean implements Serializable{

private static final long serialVersionUID = 1L;
//MEMBROS
private Contato contato = new Contato();


//METHODS
public String imprimeContato(){
	System.out.println("Something");
	return null;
}

//GGAS
public void setContato(Contato contato) {
	this.contato = contato;
}
public Contato getContato() {
	return this.contato;
}

}

– xHTML

<h:head />
<h:body>
<h:form>
<h:panelGrid>

Cadastramento de Contatos

Nome:<h:inputText value="#{contatoMB.contato.nome}"/>
		Sobrenome:<h:inputText value="#{contatoMB.contato.sobrenome}"/>
		Email:<h:inputText value="#{contatoMB.contato.email}"/>
		
		<h:commandButton value="Cadastrar"
			action="#{contatoMB.imprimeContato}"/>
	</h:panelGrid>
</h:form>

</h:body>

M

Desculpa,eu cometi um equivoco, estou respondendo pelo celular ai me perdi kk

A anotação é @ManagedBean(name = “contatoMB”) e não @ManagedBean(“contatoMB”)

M

Ao tentar nomear @ManagedBean(name=“contatoMB”) ele me forçou a colocar@ManagedBean(value=“contatoMB”)

é normal?

M

Tem duas anotações @ManagedBean, um no pacote javax.annotation e outro javax.faces.bean

o javax.annotation te obriga a usar value

M

Tem diferença entre a utilização das duas?

M

Bom… Eu utilizei a anotação @ManagedBean no meu primeiro exercício de JSF e foi do pacote javax.faces.bean
Na segunda aula até hoje, eu utilizo a anotação @Named, que é do CDI (Logo irá ver o que é).

Enfim, deve ter diferenças sim

M

Perfeito,
Fiz a alteração e agora ao executar ele apresenta outro erro =(

Type Status Report

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

M

É a primeira vez que você tenta rodar uma aplicação com JSF?
Se for, deve ser problema de mapeamento do servidor.

M

Sim, estou pensando que é algum problema de configuração.

Meu passo a passo foi o seguinte.

  • Criei o servidor TomCat corretamente. (Marquei a opção use TomCat Instalation)
  • Criei um Dynamic Web Project, selecionando JSF (Porem deu erro para baixar os jars
    automaticamente então eu baixei manualmente, JSF 2.0)
  • Adicionei os external Jars para o Projeto (jsf-api-2.0.0 e jsf-impl-2.0.0)
  • Criei as classes conforme acima e só.
M

Inicia o servidor e acesse a url localhost:8080, se aparecer uma tela escrito Apache Tomcat, é porque o Tomcat esta funcionando

Criado 27 de outubro de 2017
Ultima resposta 27 de out. de 2017
Respostas 16
Participantes 2