【问题标题】:Null values from form to managedbeans从表单到 managedbeans 的空值
【发布时间】:2013-06-30 17:26:54
【问题描述】:

我正在做我的第一个 JSF 应用程序并且我正在实现登录页面。但是当我提交带有登录名和密码的表单时遇到问题。我使用 JSF 2.0

我有以下表格:

<h:form>
            <h:panelGrid columns="2">
                <p:outputLabel for="txt_login" value="Login" />
                <p:inputText id="txt_login" value="#{loginBean.login}"/>
                <p:outputLabel for="txt_senha" value="Senha" />
                <p:inputText id="txt_senha" value="#{loginBean.senha}"/>
            </h:panelGrid>
            <h:panelGrid columns="2">
                <p:commandButton value="Login" action="#{loginBean.efetuaLogin}" />
                <p:commandButton value="Cancelar" action="cancelar" />
            </h:panelGrid>
</h:form>

还有 ManagedBean:

@ManagedBean
public class LoginBean {

private String login;
private String senha;

public String getSenha() {
    return senha;
}

public void setSenha(String senha) {
    System.out.println("SENHA = " + this.getSenha());
    this.senha = senha;
}

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    System.out.println("USER = " + this.getLogin());
    this.login = login;
}

public String efetuaLogin() {
    Usuario user = new Usuario(this.login, this.senha);
    System.out.println("USER = " + this.getLogin() + " SENHA = " + this.getSenha());
    UsuarioController.getInstance().save(user);
    return "sucesso";

}

public String cadastar() {
    Usuario user = new Usuario(this.login, this.senha);
    System.out.println("USER = " + this.login + " SENHA = " + this.senha);
    UsuarioController.getInstance().save(user);
    return "sucesso";
}

}

当提交这些表单时,我的托管 bean 将传递 null。为什么会这样?

【问题讨论】:

  • 由于你的 facelet 代码和你的 bean 代码都是有效的(虽然有时很奇怪),你应该在你的配置中寻找问题。显示的是你的 web.xml 和 faces-config.xml,如果你有后者。
  • 我将 更改为 现在正在设置字段。但我不明白为什么 primefaces 组件不起作用

标签: java jsf web-applications


【解决方案1】:

为 ManagedBean 添加范围,对于登录添加 @RequestScoped。您使用&lt;h:inputText 作为密码。密码请使用&lt;h:inputSecret/&gt;

【讨论】:

  • 我添加了@RequestScoped 但没有解决问题。 :( 是否需要在 faces-config.xml 上映射 managedbean 或使用注解就足够了?我将更改为 ,这只是一个测试。;)
  • xml 是 Annotaion 的替代品。注释就够了。
  • 您不应发布 cmets 作为答案。您的评论虽然对如何以更“主流”的方式构建代码进行了评论,但根本没有回答这个问题。并不是说 xml 配置可以替代注解驱动的配置,前者严格优先于后者,而后者,如果我没记错 JSF 规范,最终最终会转换为 xml。
【解决方案2】:

您打电话给System.out.println 太早了,因此您认为您收到了null,但事实并非如此。示例:

public void setSenha(String senha) {
    System.out.println("SENHA = " + this.getSenha());
    this.senha = senha;
}

应该是

public void setSenha(String senha) {
    this.senha = senha;
    System.out.println("SENHA = " + this.getSenha());
}

setLogin(String login) 相同

更新 #2 你的问题一定出在其他地方。检查您是否为 primefaces 使用了正确的命名空间

xmlns:p="http://primefaces.org/ui

据我所知,所有 primefaces 组件都为我工作。例如,这里是我的代码。尝试针对您发布的原始.xhtml 运行它。唯一的区别是我在上面告诉你的编辑和我的LoginBean 没有UsuarioController.getInstance().save(user);

import javax.faces.bean.ManagedBean;

@ManagedBean
public class LoginBean {

    private String login;
    private String senha;

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
        System.out.println("SENHA = " + this.getSenha());

    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
        System.out.println("USER = " + this.getLogin());
    }

    public String efetuaLogin() {
        User user = new User(this.login, this.senha);
        System.out.println("USER = " + this.getLogin() + " SENHA = " + this.getSenha());
        System.out.println("ACTUAL USER = " + user.getLogin() + " ACTUAL SENHA = " + user.getSenha());
        return "sucesso";
    }

    public String cadastar() {
        return "sucesso";
    }
}


public class User {
    private String login; 
    private String senha; 

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

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

    public User(String login, String senha) {
        this.login = login;
        this.senha = senha;
    }

    public User() {
    }
}

【讨论】:

  • 是的...一段时间后我看到了这个菜鸟代码,我放了其他 sysout efetuaLogin() 方法。但我也看到 primefaces 组件不能正常工作。我通过 更改了 和现在的字段正在设置。但我不明白为什么 primefaces 组件不起作用
  • 我按照你的建议做了...控制台输出是:USER = SENHA = USER = SENHA = ACTUAL USER = ACTUAL SENHA =
  • 您是否尝试在登录之前在输入框中添加值(我知道的愚蠢问题但请纵容我)?您使用的是什么版本的 primefaces?您可以发布您的 xhtml 和两个类的完整代码吗?整个事情都带有 import 语句。我不需要控制器。
  • 另外,这是一个 Maven 项目吗?你确定你有所有的 jar 文件吗?
  • 不,这不是 maven 项目。当然,如果我没有所有 jar 文件,其他 primefaces 将无法正常工作,例如 commandButton
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2023-03-05
  • 1970-01-01
  • 2015-06-25
  • 2020-03-11
  • 2011-08-07
  • 2018-09-20
相关资源
最近更新 更多