代码之家  ›  专栏  ›  技术社区  ›  markzzz

JSF-获取SessionScoped Bean实例

  •  8
  • markzzz  · 技术社区  · 14 年前

    我的web应用程序上有这个配置。2个豆子:

    1°Bean-它检查登录;

    @ManagedBean(name="login")
    @SessionScoped
    public class Login {
        private String nickname;
        private String password;
        private boolean isLogged;
    
        public String getNickname() { return nickname; }
        public void setNickname(String newValue) { nickname=newValue; }
    
        public String getPassword() { return password; }
        public void setPassword(String newValue) { password=newValue; }
    
        public void checkLogin() {
            ... i check on db the nickname and the password ...
    
            if(USER EXIST) {
                isLogged=true;
            } else {
                isLogged=false;
            }
    
            return true;
        }
    }
    

    2°Bean-管理用户参数:

    @ManagedBean(name="user")
    @SessionScoped
    public class User {
        private String name;
        private String surname;
        private String mail;
    
        public User() {
            String[] record=null;
            Database mydb=Configuration.getDatabase();
            mydb.connetti();
            ArrayList<String[]> db_result=null;
            db_result=mydb.selectQuery("SELECT name, surname, mail, domicilio FROM users WHERE nickname='???????'");
    
            int i = 0;
            while (i<db_result.size() ) {
               record=(String[]) db_result.get(i);
               i++;
            }
        }
    
        ... getter and setter methods...
    }
    

    如您所见,我想知道如何在我的 login bean,这样我就可以在数据库上进行查询了。

    实际上,我需要获取当前会话bean登录的实例:如何获取它?我应该用一些像 session.getBean("login") :)

    希望这个问题是明确的:)

    2 回复  |  直到 14 年前
        1
  •  11
  •   BalusC    14 年前

    使用 @ManagedProperty 注入并使用 @PostConstruct 在bean构造之后访问它(因为在一个普通的构造函数中 null ).

    @ManagedBean
    @SessionScoped
    public class User {
    
        @ManagedProperty(value="#{login}")
        private Login login; 
    
        @PostConstruct
        public void init() {
            // Put original constructor code here.
        }
    
        // Add/generate getters/setters and other boilerplate.
    }
    

    也就是说,这不是正确的做法。你想反过来做。注入 User 在里面 Login 通过 @ManagedProperty(value="#{user}") 并在提交操作方法期间完成工作。

    您还想输入密码 WHERE 条款也一样。完全不需要将整个users表拖入Java的内存并逐个确定它。让DB来做这个工作,检查它是否返回0或一行。

        2
  •  8
  •   Peter O. Manuel Pinto    13 年前

    同时尝试使用以下代码:

        ExternalContext tmpEC;
        Map sMap;
        tmpEC = FacesContext.getCurrentInstance().getExternalContext();
        sMap = tmpEC.getSessionMap();
        login loginBean = (login) sMap.get("login");
    
    推荐文章