Dúvida com JSF

Pessoal, estou começando a estudar JSF e tenho algumas dúvidas:

Como faço para separar minhas Actions em 1 classe e os Gets e Sets em outra classe ??? pois todos os exemplos que achei estão tudo em uma classe só!!!

Tentei fazer, mas está dando erro:

VO

public class VOAtendimento {

	private String titulo;
	private String descricao;
	private String data;
	
	
	//Construtor
	public VOAtendimento(){
		
	}


	//Get and Set
	public String getData() {
		return data;
	}

...

DAO

 public String buscar(VOAtendimento vo) throws SQLException {
        String result_busca = BUSCA_INVALIDA;
        try {
        	stm = con.createStatement();
        	rs = stm.executeQuery("SELECT titulo, " +
        			"                     descricao, " +
        			"                     data_perg " +
        			"                FROM pergunta " +
        			"               WHERE titulo = '"+ vo.getTitulo() +"'");
        	if (rs.next()) {
        		vo = new VOAtendimento();
	            vo.setTitulo	(rs.getString(1));
	            vo.setDescricao	(rs.getString(2));
	            vo.setData		(rs.getString(3));
	            result_busca = BUSCA_VALIDA;
        	}
        	else
        		result_busca = BUSCA_INVALIDA;
        	
        	rs.close();
        	stm.close();
        } catch (SQLException e) {
          System.err.println ("Erro: "+e);
        }
        return result_busca;
    }

JSP

<body>
    <f:view>
       <h:form>
          <center><h2> Busca </h2></center>
          <br>
          Digite o Título:
          <h:inputText id="titulo" value="#{atendimento.titulo}"/>
          <h:commandButton value="OK"     action="#{daoatendimento.buscar}"/>
        </h:form>
        <br>
        <h:outputLink value="index.jsf">
          <f:verbatim>voltar</f:verbatim>
        </h:outputLink>
    </f:view>
  </body>

ERRO

javax.servlet.ServletException: #{daoatendimento.buscar}: javax.faces.el.MethodNotFoundException: buscar: pkg.DAOAtendimento.buscar()
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

Cara, primeiro, geralmente, agente usa o mesmo objeto para recuperar os valores e executar as ações. O famosos ManagedBean do JSF.

A idéia e vc ter os get’s e set’s nele, pois o JSF usa isso para injetar os valores do seu JSP dentro do seu ManagedBean.

Tudo que não for chamado dentro de action ele vai procurar pelo get e set (no seu exemplo, ele vai tentar fazer um atendimento.setTitulo na hora do submit)

Se vc direciona um action para um outro ManegedBean, os valores vão pra um lugar, e a ação para outro. Assim fica complicado recuperar os valores.

Tenta fazer tudo no mesmo ManegedBean, depois vc vai incrementando aos poucos.

Abraço.

[quote=sapulha]Cara, primeiro, geralmente, agente usa o mesmo objeto para recuperar os valores e executar as ações. O famosos ManagedBean do JSF.

A idéia e vc ter os get’s e set’s nele, pois o JSF usa isso para injetar os valores do seu JSP dentro do seu ManagedBean.

Tudo que não for chamado dentro de action ele vai procurar pelo get e set (no seu exemplo, ele vai tentar fazer um atendimento.setTitulo na hora do submit)

Se vc direciona um action para um outro ManegedBean, os valores vão pra um lugar, e a ação para outro. Assim fica complicado recuperar os valores.

Tenta fazer tudo no mesmo ManegedBean, depois vc vai incrementando aos poucos.

Abraço.[/quote]

Deixando tudo em uma classe funciona corretamente!!!

Minha intenção em fazer separado é porque qdo aprendi MVC, eu fazia assim: VO(get e set) - DAO(actions) - ACT(controller) e JSP e fica mais fácil de se dar manutenção!!!

Valew, caso tenha algum material de JSF, por favor envie pra mim!!!

Ah, quais os frameworks q vc usa nos seus projetos ??

Legal cara. Então, nos meus projetos eu utilizo JSF + JBoss SEAM + EJB 3

O JBoss SEAM tem um mecanismo de bi-injeção que facilita bastante na hora de usar JSF, dá uma olhada nele quando tiver um tempo.

Quanto ao MVC, tem como vc utilizar com JSF tb, existem maneiras de vc fazer isso, como por exemplo, utilizar o ManagedBean pra recuperar os dados do seu formulário, e repassar pros seus Bussiness Components, e daí pra frente DAO e etc…

Mais o mais importante é não disperdiçar esforço além do necessário. Utilize aquilo que atende o seu projeto, sem deixar de lado as boas práticas, é claro.

Sugiro colocar o método buscar numa classe separada do managedBean, inclusive em um pacote só para acesso a banco.

Márcio

[quote=marcioa1]Sugiro colocar o método buscar numa classe separada do managedBean, inclusive em um pacote só para acesso a banco.
Márcio[/quote]

Desculpe-me pela falta de conhecimento, mas teria como exemplificar ???

Crie um pacote para receber as classes de banco de dados. Para cada Entidade do seu sistema, crie uma classe, por exemplo BdPessoa. Dentro desta classe coloque os métodos gravar, buscar, todos e demais métodos de acesso ao banco.
O seu managedBean deve ficar em um pacote separado, por exemplo mb . Dentro do seu managedBean, vode instancia um objeto do tipo BdPessoa, e chama os métodos de dentro do seu managedBeans.

Espero ter esclarecido,

Márcio

[quote=sapulha]Legal cara. Então, nos meus projetos eu utilizo JSF + JBoss SEAM + EJB 3

O JBoss SEAM tem um mecanismo de bi-injeção que facilita bastante na hora de usar JSF, dá uma olhada nele quando tiver um tempo.

Quanto ao MVC, tem como vc utilizar com JSF tb, existem maneiras de vc fazer isso, como por exemplo, utilizar o ManagedBean pra recuperar os dados do seu formulário, e repassar pros seus Bussiness Components, e daí pra frente DAO e etc…

Mais o mais importante é não disperdiçar esforço além do necessário. Utilize aquilo que atende o seu projeto, sem deixar de lado as boas práticas, é claro.[/quote]

Cara, vc teria tutoriais ou sabe links de alguns para essas duas coisas:

1 - JSF em MVC
2 - JBoss Seam

Valew

Aproveitando o topico:

  1. Tb to começando a brincar com JSF

  2. Configurei meu tomcat pra me dar uma conexao com o banco via JNDI, to recuperando ela no meu bean, beleza. To querendo agora ter um bean que cuida das conexoes (session ou application) e que os outros beans, qdo forem trabalhar com banco, solicitem a este bean de banco.
    O X da questao é que nao consigo recuperar o bean de banco dentro dos outros beans normais.

2.1) Será que nao tem como injetar esse bean nos outros? Só com Spring?

Valeu.

BTW, achei como “injetar” um bean…

<managed-bean>
   <managed-bean-name>exampleForm</managed-bean-name>
   <managed-bean-class>org.jia.examples.TestForm</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
   <managed-property>
   	<property-name>user</property-name>
   	<value>#{newUser}</value>
   </managed-property>
</managed-bean>