Search code examples
jsfjavabeansmanaged-bean

JSF EL Expressions and Java beans


I have a JSF project and I am trying to create a login page, I have managed to get the username and password from the database and validate them, my project has a Java bean, managed bean and DAO classes, when the user successfully logs in, I would like to print Hello Mr.
< h:outputLabel value="#{mBLogin.user.firstName}" /> the Hello Mr. is printing but the name is not, although when testing my DAO class I'm printing the name to the console without any problem! Can someone advice what I am doing wrong?

My managed 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;
        }
    }

My Java Bean 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;
        }

    }

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

    }

my xhtml page after the login page:

<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>

Solution

  • When validating, you seem to put the user as the session attribute without assigning it to the Managed Bean field:

    session.setAttribute("username", user);
    

    So either assign it also to the instance user variable or simply use:

    <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>
    

    Update

    I would suggest changing your service method to:

    public User validateStudent(..)
    

    where you actually return the queried user instead of setting it in the DAO..

    And thus you would change the ManagedBean method to:

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