JSF EL 表达式和 Java beans

JSF EL Expressions and Java beans

我有一个 JSF 项目,我正在尝试创建一个登录页面,我已经设法从数据库中获取用户名和密码并对其进行验证,我的项目有一个 Java bean、托管 bean 和DAO classes,当用户成功登录时,我想打印 Hello Mr.
< h:outputLabel value="#{mBLogin.user.firstName}" /> Hello Mr. 正在打印但名字没有,尽管在测试我的 DAO 时 class 我正在毫无问题地将名字打印到控制台!有人可以建议我做错了什么吗?

我的托管 bean class:

    @ManagedBean
    @SessionScoped
    public class MBLogin {

        User user = new User();
        LoginDAO loginDao = new LoginDAO();

        public String validteStudent() {
            boolean valid = loginDao.validateStudent(user.getUserId(), user.getPassword());
            if (valid) {
                user.getFirstName();
                HttpSession session = SessionUtils.getSession();
                session.setAttribute("username", user);
                return "admin";
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Incorrect Username and Passowrd", "Please enter correct username and Password"));
                return "login";
            }
        }

        public void setUser(User user) {
            this.user = user;
        }

        public User getUser() {
            return user;
        }
    }

我的Java豆子class:

    @Table(name = "students_info")
    public class User {

        @Column(name = "std_record_id")
        private int id;

        @Column(name = "std_id")
        private String userId;

        @Column(name = "first_name")
        private String firstName;

        @Column(name = "last_name")
        private String lastName;

        @Column(name = "web_password")
        private String password;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getUserId() {
            return userId;
        }

        public void setUserId(String userId) {
            this.userId = userId;
        }

        public String getPassword() {
            return password;
        }

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

    }

我的 DAO class :

    public class LoginDAO {

        static JKPlainDataAccess dataAccess = JKDataSourceFactory.getPlainDataAccess();
        User user;

        public boolean validateStudent(String userName, String password) {

            user = dataAccess.executeQueryAsSingleObject(User.class, "id,userId,firstName,lastName,password",
                    "SELECT std_record_id, std_id, first_name, family_name, web_password From  students_info WHERE std_id=? and web_password=?",
                    userName, password);
            JK.print("getAllEmployeeRecords() : ", user);
            if(user != null) {
                System.out.println(user.getFirstName());
                System.out.println(user.getLastName());
                return true;
            }
            return false;
        }

        public static void main(String[] args) {
            LoginDAO a = new LoginDAO();
            a.validateStudent("200663042001", "1234");
        }

    }

登录页面后我的xhtml页面:

<ui:composition template="/WEB-INF/layouts/default.xhtml">
     <ui:define name="content">
     WELCOME Mr. <h:outputLabel value="#{mBLogin.user.firstName}" />
    AND <h:outputLabel value="#{mBLogin.user.lastName}" />
    </ui:define>
 </ui:composition>

验证时,您似乎将用户作为会话属性,而没有将其分配给托管 Bean 字段:

session.setAttribute("username", user);

所以要么将它也分配给实例用户变量,要么简单地使用:

<ui:composition template="/WEB-INF/layouts/default.xhtml">
     <ui:define name="content">
     WELCOME Mr. <h:outputLabel value="#{username.firstName}" />
    AND <h:outputLabel value="#{username.lastName}" />
    </ui:define>
 </ui:composition>

更新

我建议将您的服务方式更改为:

public User validateStudent(..)

您实际 return 查询用户的位置,而不是在 DAO 中设置它..

因此您可以将 ManagedBean 方法更改为:

public String validteStudent() {
     User validatedUser = loginDao.validateStudent(user.getUserId(), user.getPassword());
     if (validatedUser != null) {
           this.user = validatedUser;
           HttpSession session = SessionUtils.getSession();
           session.setAttribute("username", user);
      ....