我有一个简单的授权页面,用户可以输入登录名和密码。根据用户输入的结果,我定义要显示的下一页。我在db中有一个包含id,用户登录名和密码以及用户角色的表,因此将根据将从记录的角色字段中检索的信息定义下一页,该信息对应于输入登录和传递。但是我在db中有一个表,其中包含一种用户的所有用户信息(大约10个字段)和另一个包含另一类用户信息的表(4个字段)。所以我的数据库有这样的结构:
Table 1:
id
login
pass
role
Table 2:
id(reference to id of table 1)
other fields....
Table 3:
id(reference to id of table 1)
other info....
我认为我的应用必须有一个托管bean(requestScope)用于授权,它将获取登录名和密码。该bean将具有用于提交授权表单的动作控制器。在该动作控制器中,我必须确定用户的角色,并根据该信息为具体类型的用户创建会话范围的托管bean(app将为不同类型的用户提供单独的托管bean)。此外,我还在该动作控制器中传递特定信息,以便为用户(用户ID)实例化会话范围bean。但是我可以在请求范围托管bean的操作方法中简单地实例化会话范围托管bean(在new
运算符的帮助下)吗?另外,我如何在另一个会话范围bean中使用一个会话范围bean的方法(假设我创建了2个负责不同服务的会话范围的托管bean,我如何调用另一个的方法)。
也许所描述的方法不适合这样的问题?如果是这样,您能否就更好的设计方法提出建议?
答案 0 :(得分:3)
从另一个
访问一个托管bean
要直接回答这个问题,通常使用@ManagedProperty
在另一个托管bean中注入一个托管bean。是的,它会自动创建bean,但这应该特别便宜。
但是我可以在请求范围托管bean的操作方法中简单地实例化会话范围托管bean(在新运算符的帮助下)吗?
是的,这是可能的。只需将托管bean名称作为密钥存储在ExternalContext#getSessionMap()
中。
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().put("bean", new Bean());
它将由#{bean}
提供,依此类推。这是一个好方法是否是第二个。
关于您的具体功能要求。我认为只有一个会话作用域的托管bean以及所需的数据作为属性会好得多。然后,您可以检查User
属性是否不是null
以确定用户是否已登录。您可以在此答案中找到一个bean示例:Programmatically control login with Servlet 3.0。