我正在尝试使用在 IceFaces 页面上找到的模式。(我没有使用 IceFaces,使用 PrimeFaces)
在这种情况下,我有两个豆子:
用户控制器 和用户模型
在我的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 。