Visual JSF + Hibernate

Pessoal, depois de dias de pesquisas no google, tutoriais + tutoriais, resolvi pedir ajuda a comunidade:

Estou com uma duvida que pode ser bem idiota, porem ta acabando comigo. Estou desenvolvendo um projeto para web, entao tenho por exemplo, os Usuarios, contendo
–> Usuario (entidade)
–> UsuarioDAO (persistencia)

Usei o hibernate annotations, ele persiste tudo corretamente, porem estou com uma tremenda duvida na hora de passar os valores do meu formulario em JSF para o objeto DAO.

Em todos os tutoriais que tenho, vejo os inputfields assim:

... <h:inputText id="nome" value="#usuario.nome" /> <h:commandButton value="OK" action="#inserir" /> ...

onde obviamente, #usuario.nome se refere ao atributo da minha entidade, e o #inserir, e um método (action) que o proprio JSF cria em um arquivo .java com o mesmo nome do JSF, no meu caso CadUsuario.

no metodo criado dentro do meu arquivo .java, ta assim:

public String inserir() { UsuarioDAO dao = new UsuarioDAO(); Usuario u = new Usuario(); u.setLogin(usuario.login); u.setSenha(usuario.senha); dao.inserir(u); return null; }

Alguem pode me dizer onde estou errando, e qual a melhor maneira de colocar as informações que veio do meu Visual JSF para dentro do meu método no objeto de persistencia ?

So mais uma coisa: Sei que nao estou fazendo certo, pq voce ter que setar campo por campo como fiz acima

u.setLogin(usuario.login); u.setSenha(usuario.senha);

com certeza deve fugir completamente da razao de se usar esses frameworks, ou seja nao fazer tudo na unha.

Cara, na verdade você não precisa setar teu objeto como você está fazendo, só precisa instanciá-lo, o JSF popula o objeto pra você.

Outra coisa, não sei se está funcionando ou não, mas pelo que sei, não é desta maneira que você chamaria o “inserir” não.
Você deve fazer da mesma maneira que fez com os atributos ou seja:

...
&lt;h:inputText id="nome" value="#usuario.nome" /&gt;  
&lt;h:commandButton value="OK" action="#usuario.inserir" /&gt; 
...

Coloquei “usuario.” porque não sei qual é o nome do seu manageBean. Mas acredito que seja esse pois vc usou ele para o campo.

Se não tirei suas dúvidas, pergunta de novo hehehe

Entao cara, dois problemas que eu quebrei a cabeca pra caramba:

Parece que existe muita diferença entre JSF e Visual Web JSF, e no que vc me falou, as duas diferenças sao:

  1. value="#{usuario.login}" —> O Visual Web JSF nao aceita esse parametro VALUE.

  2. action="#{usuarioDAO.inserir}" -----> essa action no botao, o Visual Web SEMPRE cria um metodo dentro de um arquivo .java com o mesmo nome do meu jsf, no caso cadUser.java, com o parametro que eu fornecer na action, entao, ele cria la por exemplo

public String usuarioDAO.inserir() { ... }

o que obviamente resulta num erro grotesco.

Então,

Pra falar a verdade nunca ouvi o termo “Visual Web JSF”, mas sim que o JSF em si é basicamente utilizado pra camada de visualização mas também pra classe de negocio.

Agora, se você está dizendo que esse tal de “Visual Web JSF” não aceita o parametro VALUE, agora eu é que estou perdido iuhaiuahiauhihua

pior que eu quase nao acho referencia disso na net, as unicas que acho, sao relacionados ao NetBeans, no proprio site do Netbeans, o que me leva a crer que isso e uma tecnologia novíssima, e que deve ter sido criada exatamente pela propria equipe da NetBeans. Acho que vou tentar migrar tudo para JSF Puro, pra ver se assim eu consigo sucesso ! Valeu amigo !

Mas mesmo assim ainda fica a duvida: como persistir os dados do meu formulario para a minha classe DAO ?

Olha, levando em consideração esse Visual Web JSF, não sei dizer não. Usando JSF normal, eu diria que é só você chamar um método do teu manageBean na action do botão.

Então cara, entenda o Visual Web JSF como um plugin do Netbeans para desenvolvimento JSF.
Eu particularmente não gosto dele porque ele cria muito lixo, tipo esse de ao criar uma pagina jsf ele cria um bean e vai fazendo binding dos componentes que vc adiciona na tela.
Eu só utilizo a parte de edição visual da tela, mais os Managed Beans eu que faço como qualquer classe java.

Camarada, que tal colocar um bean no meio?

O que acontece: se não existir o usuário, o bean vai cria-lo para vc (automaticamente, seguindo o código). Todas as tarefas (insert, update, delete, select), serão chamadas pelo bean.
Ele será o controller do seu MVC, evitando que as entidades ou os DAOs executem tarefas que não são inerentes ao seu contexto.

public class UsuarioBean {

	private Usuario usuario;
	private UsuarioDAO usuarioDAO;
	protected DataModel usuarios;

	public UsuarioBean() {
	}

	public String adicionarUsuario() {
		return "addUser";
	}

	public String editarUsuario() {
		this.usuario = (Usuario) this.usuarios.getRowData();
		return "addUser";
	}

	public String excluirUsuario() {
		this.usuario = (Usuario) this.usuarios.getRowData();
		getUsuarioDAO().delete(usuario);
		this.usuario = null;

		return null;
	}

	public Usuario getUsuario() {
		if (usuario == null)
			usuario = new Usuario();
		return usuario;
	}

	public UsuarioDAO getUsuarioDAO() {
		if (usuarioDAO == null)
			usuarioDAO = new UsuarioDAO();
		return usuarioDAO;
	}

	public DataModel getUsuarios() {
		List&lt;Usuario&gt; lista = getUsuarioDAO().getAllAsList("nome");
		usuarios = new ListDataModel(lista);
		return usuarios;
	}

	public String salvarUsuario() {
		try {
			getUsuarioDAO().save(usuario);
		} catch (Exception e) {
			return "fail";
		}

		this.usuario = null;
		return "listUsers";
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
}

no JSF

	&lt;f:view&gt;
		&lt;h:form&gt;
			&lt;h2&gt;&lt;h:outputText value="#{label.newUser}" /&gt;&lt;/h2&gt;
			&lt;table&gt;
				&lt;tr&gt;
					&lt;td&gt;&lt;h:outputText value="#{label.name}" /&gt;&lt;/td&gt;
					&lt;td&gt;&lt;h:inputText value="#{usuarioBean.usuario.nome}" /&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td&gt;&lt;h:outputText value="#{label.email}" /&gt;&lt;/td&gt;
					&lt;td&gt;&lt;h:inputText value="#{usuarioBean.usuario.email}" /&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td&gt;&lt;h:outputText value="#{label.password}" /&gt;&lt;/td&gt;
					&lt;td&gt;&lt;h:inputSecret value="#{usuarioBean.usuario.password}" /&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td colspan="2" align="center"&gt;&lt;h:commandButton action="#{usuarioBean.salvarUsuario}"
						value="#{label.submit}" /&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/table&gt;
		&lt;/h:form&gt;
	&lt;/f:view&gt;