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