PreparedStatement中的JSF2.2 getter和setter

时间:2014-08-07 20:32:36

标签: java mysql jsf jsf-2.2

我是JSF的初学者,我正在尝试登录页面,但是从facelet获取数据时遇到问题。 bean在faces-config.xml中作为SessionScope进行管理。

public class LoginBean
{

    private String name;
    private String email;
    private String password;

    PreparedStatement ps;
    ResultSet rs;

    private String sqlName;
    private String sqlEmail;
    private String sqlPassword;

    public LoginBean() {
        initDB();
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public void initDB() {
        try{
            //load driver
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Driver loaded");

            //get connection
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/userdb", "root", "root");
            System.out.println("Connection estabilshed");

            String sqlQuery = "select name, email, password from users "+
                            "where email=? and password=?";

            ps = conn.prepareStatement(sqlQuery);


            ps.setString(1, getEmail());
            ps.setString(2, getPassword());


            rs = ps.executeQuery();

            if(rs.next()) {
                sqlName = rs.getString(1);
                sqlEmail = rs.getString(2).toString();
                sqlPassword = rs.getString(3).toString();

            }
            else {
                rs.close();

            }

        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public String checkLogin() throws SQLException {

        if(email.equalsIgnoreCase(sqlEmail)) {
            if(password.equals(sqlPassword)) {

                return "valid";
            }
            else {
                System.err.println("Password Invalid");
                return "invalid";
            }
        }
        else {

            System.err.println("Email Invalid");
            return "invalid";       
        }
    }
}

login.xhtml

            <h:inputText id="emailInputText" styleClass="inputText" required="true" 
                    value="#{loginBean.email}"/>
            <h:inputSecret id="passwordInputText" styleClass="inputSecret" required="true" 
                    value="#{loginBean.password}"/>


        <h:commandButton styleClass="commandButton" id="loginButton" value="Login" type="submit"
                    action="#{loginBean.checkLogin}"/>

        <div id="footer" class="clearfix">
            <p><span class="info">?</span><a href="#">Forgot Password</a> • <a href="#" >Register</a></p>
        </div>
    </h:form>

问题在于

ps.setString(1, getEmail());
ps.setString(2, getPassword());

都为空,checkLogin()将全部返回&#34;无效&#34;。 我不知道为什么会发生这种情况以及如何解决它。

P.S。对不起我糟糕的英语。谢谢你的回复。

1 个答案:

答案 0 :(得分:0)

applyValues 阶段负责设置请求中收到的值。

由于您尝试在构造函数中使用emailpassword,因此这些值将为null,因为容器没有时间应用这些值。这是在创建对象之后完成的。

有些选择是:

  • 使用@PostConstruct以便在 applyValues 完成后触发事件(不要这样做!)
  • checkLogin()事件中获取数据库中的值(我推荐)。

另一个问题是会话管理的bean只会被创建一次,所以你会遇到麻烦。

我建议您在checkLogin()内完成所有登录逻辑。

另外,如果您不需要,请不要使用@SessionScoped。使用@RequestScoped@ViewScoped保持简单。