簡體   English   中英

PreparedStatement中的JSF2.2獲取器和設置器

[英]JSF2.2 getter and setter in PreparedStatement

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

            <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());

均為null, checkLogin()始終返回“無效”。 我不知道為什么會這樣以及如何解決。

PS對不起,我的英語不好。 謝謝您的回復。

applyValues階段負責設置請求中接收的值。

由於您嘗試在構造函數中使用emailpassword ,因此這些值將為null,因為容器沒有時間應用這些值。 這是創建對象之后完成的。

一些選項是:

  • 使用@PostConstruct以便在applyValues完成后觸發事件(不要這樣做!)
  • 在您的checkLogin()事件中(我建議)從數據庫中獲取值。

另一個問題是,會話管理的Bean僅創建一次,因此您將遇到麻煩。

我建議您在checkLogin()內部執行所有登錄邏輯。

另外,如果不需要,請不要使用@SessionScoped 使用@RequestScoped@ViewScoped保持簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM