Obtendo valores de um formulário JSF

Olá. Eu estou estudando Java Server Faces, e estou tendo um problema ao obter os valores informados nos formulários na minha ManagedBean.

Após submeter os dados, na ManagedBean os valores dos campos estão nulos, e não sei por que…

Assim é minha JSF:

<h:form id="loginForm"> <table> <tr> <td><h:outputLabel value="Usuário: " for="usuario"/></td> <td> <h:inputText id="usuario" maxlength="20" value="#{loginBean.usuario}"/> </td> </tr> <tr> <td><h:outputLabel value="Senha: " for="senha"/></td> <td> <h:inputSecret id="senha" maxlength="10" value="#{loginBean.senha}"/> </td> </tr> <tr> <td colspan="2"> <h:commandButton type="submit" id="cmdConfirmar" value="OK" action="#{loginBean.acessar}"/> <h:commandButton type="reset" id="cmdLimpar" value="Limpar"/> </td> </tr> </table> </h:form>

Assim é minha LoginBean:

[code]public class LoginBean {
private String usuario;
private String senha;

public LoginBean() {
}

public String getUsuario() {
	return usuario;
}

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

public String getSenha() {
	return senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}

public String acessar() {
	try {
		if (usuario != null && !usuario.equals("") && senha != null && !senha.equals("")) {

			Usuario user = UsuarioDAO.buscaUsuario(usuario, senha);

			if (user != null) {
				return "success";
			} else {
				return "fail";
			}
		} else {
			return "fail";
		}
	} catch (Exception e) {
		e.printStackTrace();
		return "fail";
	}
}

}
[/code]

E meu faces-config.xml contém isso:

<managed-bean> <managed-bean-name>loginBean</managed-bean-name> <managed-bean-class>beans.LoginBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

No método acessar(), os atributos “usuario” e “senha” estão nulos. O que está faltando?

Obrigado pela ajuda!!
Felipe

Aparentemente, está tudo correto (por que você está usando html puro para a tabela ao inves de usar panelGrid?).
Mas, nunca precisei definir o ‘type’ de um commandButton não. Não sei se isso atrapalharia, mas só para ter certeza, retire ‘type=“submit”’.

Valeu pela dica… Eu removi o type=“submit”, mas não mudou nada…

Poderia não estar utilizando PanelGrid causando algum problema? Aparentemente não, certo?

Uma coisa que eu vi, ao mandar exibir o código fonte no browser, é que os nomes e IDs dos campos estão um pouco diferentes:

<input id="loginForm:usuario" type="text" name="loginForm:usuario" value="#{loginBean.usuario}" maxlength="20" />
<input id="loginForm:senha" type="password" name="loginForm:senha" value="" maxlength="10" />

Onde “loginForm” é o nome que eu dei no formulário que engloba os campos da tela:

<h:form id="loginForm">

Isso tem alguma influência?

Obrigado desde já,
Felipe

Cara, não tenho certeza mas, acho que o seu problema é que vc não inicializou os atributos usuario e senha. Tenta colocar no construtor algo como:

this.usuario = "";
this.senha = "";

Olá. Eu fiz conforme você sugeriu, inicializando os atributos no construtor da Bean:

public LoginBean() {  
    this.usuario = "";
    this.senha = "";
}  

Mas não resolveu… Só o que mudou é que agora, em vez de os atributos serem nulos, são vazios ( “” ).

Eu também tentei setar “” na declaração dos atributos:

private String usuario = "";
private String senha = "";

Mas também não resolveu…

Poderia ser alguma jar faltando no meu classpath? Atualmente eu tenho, não somente referenciadas no projeto, mas existentes na pasta lib do projeto:
jsf-api.jar
jsf-impl.jar
jstl-api-1.2
jstl-impl-1.2
mysql-connector-java-5.0.4-bin.jar
toplink-essentials.jar
toplink-essentials-agent.jar

Nenhum erro é exibido no console do Eclipse…

O que mais posso tentar?

Obrigado,
Felipe

Outra coisa estranha que eu percebo ao abrir a página de login no browser, é que o campo Usuário tem o seguinte texto: #{loginBean.usuario}

Isto é, o campo está aparecendo com este valor em vez de estar em branco… Para informar o login, eu preciso deletar este texto…

O campo senha está vazio, pois é um inputSecret.

Outra coisa que testei foi setar valores corretos nos atributos, para testar o método acessar() da minha bean. Ela funciona, e então o método retorna “succes”. Pelas navigation rules do faces-config.xml, eu deveria ser redirecionado para a tela principal do sistema após o login, mas está voltando para a tela de login… Assim são as Navigation Rules do meu faces-config.xml:

<navigation-rule>
	<from-view-id>/pages/login.jsf</from-view-id>
	<navigation-case>
		<from-action>#{loginBean.acessar}</from-action>
		<from-outcome>success</from-outcome>
		<to-view-id>/pages/inicio.jsf</to-view-id>
		<redirect/>
	</navigation-case>
	<navigation-case>
		<from-action>#{loginBean.acessar}</from-action>
		<from-outcome>fail</from-outcome>
		<to-view-id>/pages/errologin.jsf</to-view-id>
		<redirect/>
	</navigation-case>
</navigation-rule>
<navigation-rule>
	<from-view-id>/pages/inicio.jsf</from-view-id>
	<navigation-case>
		<from-action>#{loginBean.sair}</from-action>
		<from-outcome>success</from-outcome>
		<to-view-id>/pages/login.jsf</to-view-id>
		<redirect/>
	</navigation-case>
</navigation-rule>

Não sei se isso tem alguma coisa a ver com o problema, mas resolvi escrever isso também.

Alguém tem alguma sugestão?

Se for necessário, eu posso zipar meu projeto e enviar por e-mail para investigação… Não é um projeto grande, é basicamente um login com acesso ao banco de dados.

Abraço,
Felipe