jsf – 从请求范围的bean访问会话范围的bean

我正在尝试使用在IceFaces页面上找到的模式.(我没有使用IceFaces,使用PrimeFaces)

在这种情况下,我有两个豆:

UserController和Usermodel

在我的UserModel上,我有一个UserVO实例(由另一个程序员创建).
在我的UserController上我有这个:

@ManagedBean
@RequestScoped
public class UserController implements Serializable
{

    private static final long serialVersionUID = 1L;
    private UserBO bo;
    private UserModel model;

    public UserController()
    {
        bo = new UserBO();
        model = new UserModel();
    }

    public void Login() throws IOException
    {
        model.setUserVo(bo.executeLogin(model.getUserVo()));
        ExternalContext externalContent = FacesContext.getCurrentInstance().getExternalContext();
        if (!model.getUserVo().isError())
        {
            model.setLoggedIn(true);
            externalContent.getSessionMap().put("userSession", model);
            externalContent.redirect(externalContent.getRequestContextPath() + "/views/request/search.html");
        } else
        {
            model.setLoggedIn(false);
            FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, model.getUserVo().getMessage(), model.getUserVo().getLogin());
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
        }
    }

    public UserBO getBo()
    {
        return bo;
    }

    public void setBo(UserBO bo)
    {
        this.bo = bo;
    }

    public UserModel getModel()
    {
        return model;
    }

    public void setModel(UserModel model)
    {
        this.model = model;
    }
}

正如您所看到的,我创建了一个UserModel的新实例,并使用从bo.executeLogin()返回的内容设置它并且它正在工作,我的对象被返回.

为了确保用户已登录,我的UserModel上有一个属性:

@ManagedBean
@SessionScoped
public class UserModel
{

    private UserVO userVo;
    private Boolean loggedIn = false;

    public UserModel()
    {
        userVo = new UserVO();
    }

    public UserVO getUserVo()
    {
        return userVo;
    }

    public void setUserVo(UserVO userVo)
    {
        this.userVo = userVo;
    }

    public Boolean getLoggedIn()
    {
        return loggedIn;
    }

    public void setLoggedIn(Boolean loggedIn)
    {
        this.loggedIn = loggedIn;
    }

我有一个template.xhtml:

<ui:fragment rendered="#{userModel.loggedIn}">
            <ui:include src="../includes/top.xhtml"/>
</ui:fragment>

事情是,它不工作,没有获取loggedIn属性值.

我的猜测是访问这种方式我有点创建UserModel的新实例,如果是这样,这是一个问题,因为我的UserController不是会话作用域,只有UserModel

编辑

而不是使用这个loggedIn属性,我知道我可以简单地检查是否设置了UserModel userVo属性,但问题是关于会话范围的bean,我无法从UserController访问它,因为它不是作用域会话,因此设置它每个页面都会使用我的template.xhtml.

最佳答案
而不是在UserController中创建新的UserModel实例,而是使用@ManagedProperty注入它.

在UserController中:

@ManagedProperty(value="#{userModel}")
private UserModel model;

// add getter and setter for userModel (important!)

然后,您不必在构造函数中实例化它,并始终在控制器中获取UserModel的会话范围实例.

更新:

我认为您使用严格的MVC方法使登录过程变得复杂.在JSF中,模型,视图和控制器之间的边界有些模糊或重叠.

我建议阅读this interesting question and answers,尤其是this answer,了解有关该主题的更多信息.

至于你的具体问题.我不太确定是什么原因,但你应该避免的是自己实例化托管bean并且使用注入和自我初始化的bean实例.

我也建议将你的bean合并到一个bean中.然后你没有循环依赖和空引用的问题.

转载注明原文:jsf – 从请求范围的bean访问会话范围的bean - 代码日志