Obtendo valores de um formulário JSF

6 respostas
F

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:

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";
		}
	}
}
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

6 Respostas

F

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”’.

F

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

H

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 = "";
F

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

F

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.

F

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

Criado 7 de outubro de 2011
Ultima resposta 12 de out. de 2011
Respostas 6
Participantes 3