再来解释JSF中的MBean,其实MBean就是一个JavaBean,因此它有着和JavaBean相同的要求。
最后是MBean的配置,JSF的MBean需要在faces-config文件中做配置,配置方法如下:
2 |
< description >demo of config</ description > |
3 |
< display-name >userInfo</ display-name > |
4 |
< managed-bean-name >user</ managed-bean-name > |
5 |
< managed-bean-class >net.moon.beans.UserInfo</ managed-bean-class > |
6 |
< managed-bean-scope >session</ managed-bean-scope > |
对其中的managed-bean-name,managed-bean-class和managed-bean-scope做一下解释。
managed-bean-name是这一MBean的名字,用于其它位置的调用。
managed-bean-class是这一MBean的完整路径,用于指明该MBean的类文件位置。
managed-bean-scope是这一MBean的有效范围。
下面再对manage-bean-scope进行一下详细的解释,其有效取值为:application, session, request, none。很容易理解,它们的存活周期分别如下:
Name Scope
Application 整个应用
Session 整个对话
Request 整个请求
None 需要时,临时
大家知道,JSF是以JSP为基础的,那么,对于JSP的九大对象来说,这四种scope的信息到底是怎么存储的呢?
经过测试证明,scope为applicatoin的MBean的实例保存在ServletContext中,也就是JSP中的application中,因此我们可以用如下的方法得到某个类的引用:
1 |
FacesContext fc = FacesContext.getCurrentInstance(); |
2 |
UserInfo ui = (serInfo)fc.getExternalContext().getApplicationMap().get( "user" ); |
对session级别的MBean,我们可以用如下方法得到其引用:
1 |
FacesContext fc = FacesContext.getCurrentInstance(); |
2 |
UserInfo ub = (UserInfo)fc.getExternalContext().getSessionMap().get( "userInfo" ); |
当然,我们也可以用其它的方法得到session对象后,从session中取出实例。
对request级别的MBean,我们可从request对象中取得,代码如下:
1 |
FacesContext fc = FacesContext.getCurrentInstance(); |
2 |
HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest(); |
3 |
UserInfo ui = (UserInfo)request.getAttribute( "user" ); |
至于none类型的MBean,应该只能得到新的实例了。
当然,JSF提供了另外的访问MBean的方法,我们可以用如下的代码得到MBean的实例:
1 |
FacesContext context = FacesContext.getCurrentInstance(); |
2 |
ValueBinding binding = context.getApplication().createValueBinding( "#{user}" ); |
3 |
UserBean user = (UserBean) binding.getValue(context); |
也可用如下的代碼直接得到MBean的一個屬性:
1 |
FacesContext context = FacesContext.getCurrentInstance(); |
2 |
ValueBinding binding = context.getApplication().createValueBinding( "#{user.name}" ); |
3 |
String name = (String) binding.getValue(context); |