Backing Beans
JSF使用 JavaBean 来达到程序逻辑与视图分离的目的,在JSF中的Bean其角色是属于Backing Bean,又称之为Glue Bean,其作用是在真正的业务逻辑Bean及UI组件之间搭起桥梁,在Backing Bean中会呼叫业务逻辑Bean处理使用者的请求,或者是将业务处理结果放置其中,等待UI组件取出当中的值并显示结果给使用者。
JSF将Bean的管理集中在faces-config.xml中,一个例子如下:
....
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.UserBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
....
<managed-bean-class>设定所要使用的Bean类,<managed-bean-name>设定之名称,可供我们在JSF页面上使用Expression Language来取得或设定Bean的属性,例如:
<h:inputText value="#{user.name}"/>
<managed-bean-scope>设定Bean的存活范围,您可以设定为request、session 与application,设定为request时,Bean的存活时间为请求阶最,设定为session则在使用者应用程序交互开始,直到关闭浏览器或显式的结束会话为止(例如登出程序),设定为application的话,则Bean会一直存活,直到应用程序关闭为止。
您还可以将存活范围设定为none,当设定为none时会在需要的时候生成一个新的Bean,例如您在一个method中想要生成一个临时的Bean,就可以将之设定为none。
在JSF页面上要取得Bean的属性,是使用 JSF表示语言 (Expression Language),要注意到的是,JSF表示语言是写成 #{expression},而 JSP表示语言 是写成 ${expression},因为表示层可能是使用JSP,所以必须特别区分,另外要注意的是,JSF的标签上的属性设定时,只接受JSF表示语言。
Beans的配置与设定
JSF预定义会读取faces-config.xml中关于Bean的定义,如果想要自行设置定义文件的名称,我们是在web.xml中提供javax.faces.CONFIG_FILES参数,例如:
<web-app>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>...
</web-app>
定义文件可以有多个,中间以 "," 区隔,例如:
/WEB-INF/navigation.xml,/WEB-INF/beans.xml
一个Bean最基本要定义Bean的名称、类与存活范围,例如:
....
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.UserBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
....
如果要在其它类中取得Bean对象,则可以先取得javax.faces.context.FacesContext,它代表了JSF目前的执行环境对象,接着尝试取得javax.faces.el.ValueBinding对象,从中取得指定的Bean对象,例如:
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding =
context.getApplication().createValueBinding("#{user}");
UserBean user = (UserBean) binding.getValue(context);
如果只是要尝试取得Bean的某个属性,则可以如下:
FacesContext context = FacesContext.getCurrentInstance();
ValueBinding binding =
context.getApplication().createValueBinding(
"#{user.name}");
String name = (String) binding.getValue(context);
如果有必要在启始Bean时,自动设置属性的初始值,则可以如下设定:
....
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.UserBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>name</property-name>
<value>caterpillar</value>
</managed-property>
<managed-property>
<property-name>password</property-name>
<value>123456</value>
</managed-property>
</managed-bean>
....
如果要设定属性为 null 值,则可以使用<null-value/>标签,例如:
....
<managed-property>
<property-name>name</property-name>
<null-value/>
</managed-property>
<managed-property>
<property-name>password</property-name>
<null-value/>
</managed-property>
....
当然,您的属性不一定是字符串值,也许会是int、float、boolean等等类型,您可以设定<value> 值时指定这些值的字符串名称,JSF会尝试进行转换,例如设定为true时,会尝试使用Boolean.valueOf()方法转换为boolean的 true,以下是一些可能进行的转换:
类型 转换
short、int、long、float、double、byte,或相应的Wrapper类 尝试使用Wrapper的valueOf()进行转换,如果没有设置,则设为0
boolean 或 Boolean 尝试使用Boolean.valueOf()进行转换,如果没有设置,则设为false
char 或 Character 取设置的第一个字符,如果没有设置,则设为0
String 或 Object 即设定的字符串值,如果没有设定,则为空字符串new String("")
您也可以将其它产生的Bean设定给另一个Bean的属性,例如:
....
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.UserBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>other</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.OtherBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>user</property-name>
<value>#{user}</value>
</managed-property>
</managed-bean>
....
在上面的设定中,在OtherBean中的user属性,接受一个UserBean类型的对象,我们设定为前一个名称为user的UserBean对象。
Beans上的List, Map
如果您的Bean上有接受List或Map类型的属性,则您也可以在配置文件中直接设定这些属性的值,一个例子如下:
....
<managed-bean>
<managed-bean-name>someBean</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.SomeBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>someProperty</property-name>
<list-entries>
<value-class>java.lang.Integer</value-class>
<value>1</value>
<value>2</value>
<value>3</value>
</list-entries>
</managed-property>
</managed-bean>
....
这是一个设定接受List类型的属性,我们使用<list-entries>标签指定将设定一个List对象,其中<value-class>指定将存入List的类型,而<value>指定其值,如果是基本类型,则会尝试使用指定的 <value-class>来作Wrapper类。
设定Map的话,则是使用<map-entries>标签,例如:
....
<managed-bean>
<managed-bean-name>someBean</managed-bean-name>
<managed-bean-class>
onlyfun.caterpillar.SomeBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>someProperty</property-name>
<map-entries>
<value-class>java.lang.Integer</value-class>
<map-entry>
<key>someKey1</key>
<value>100</value>
</map-entry>
<map-entry>
<key>someKey2</key>
<value>200</value>
</map-entry>
</map-entries>
</managed-property>
</managed-bean>
....
由于Map对象是以key-value对的方式来存入,所以我们在每一个<map-entry>中使用<key>与<value>标签来分别指定。
您也可以直接像设定Bean一样,设定一个List或Map对象,例如在JSF附的范例中,有这样的设定:
....
<managed-bean>
<description>
Special expense item types
</description>
<managed-bean-name>specialTypes</managed-bean-name>
<managed-bean-class>
java.util.TreeMap
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<map-entries>
<value-class>java.lang.Integer</value-class>
<map-entry>
<key>Presentation Material</key>
<value>100</value>
</map-entry>
<map-entry>
<key>Software</key>
<value>101</value>
</map-entry>
<map-entry>
<key>Balloons</key>
<value>102</value>
</map-entry>
</map-entries>
</managed-bean>
....
而范例中另一个设定List的例子如下:
....
<managed-bean>
<managed-bean-name>statusStrings</managed-bean-name>
<managed-bean-class>
java.util.ArrayList
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<list-entries>
<null-value/>
<value>Open</value>
<value>Submitted</value>
<value>Accepted</value>
<value>Rejected</value>
</list-entries>
</managed-bean>
....
分享到:
相关推荐
- **Managed Beans**:在JSF中用于封装业务逻辑的对象,这些对象由容器管理其生命周期。 #### 二、Managed Beans的作用 - **存储请求参数**:用于存储表单提交的数据。 - **存储结果数据**:存储来自业务逻辑的数据...
`@ManagedBean`注解标识这个类是一个JSF Managed Bean,`@SessionScoped`表示这个Bean的实例将在整个会话期间保持活跃。`login()`方法是当用户点击登录按钮时调用的,其中`validateCredentials()`是验证用户名和密码...
在 JSF 2 和 Spring 3 的集成中,我们通常会利用 Spring 提供的依赖注入机制来管理 JSF 的 Managed Beans,从而提高代码的可测试性和灵活性。以下是一些关键知识点: 1. **Spring 容器管理 JSF Managed Beans**: ...
例如,创建一个名为`StudentBean`的Managed Bean,其中包含学生的属性和对应的setter/getter方法,然后在JSF页面上通过输入框、按钮等组件与Bean交互,实现数据的增删改查。 3. **分页功能** 在处理大量数据时,...
- **概念**:ManagedBeans 是JSF中用于管理组件状态的一种机制,这些bean由JSF容器管理,并可以通过表达式语言(EL)在JSF页面中访问。 - **配置**:ManagedBeans 的配置通常位于 `faces-config.xml` 文件中,可以通过...
在整合JSF、Spring和Hibernate的过程中,首先,需要配置Spring的ApplicationContext,声明Bean定义,包括JSF Managed Beans、Service层接口及其实现、Hibernate SessionFactory等。接着,JSF页面通过Managed Bean...
1. **Spring Managed Beans**:将JSF的Managed Beans配置为Spring的Bean,由Spring容器来管理和注入。 2. ** faces-config.xml 配置**:在JSF配置文件中声明Spring Bean的查找机制,通常使用`<managed-bean>`的`...
- **Spring Managed Beans**: 将JSF中的Managed Beans替换为Spring的Managed Beans,可以通过Spring的ApplicationContext来管理Bean的生命周期,实现依赖注入。 - **FacesContext和Spring的交互**: 在JSF的生命周期...
这样,即使在JSF Managed Bean中调用数据库操作,也可以确保事务的一致性。 5. **模型对象**:通常,JSF Managed Beans会持有由Hibernate加载的业务对象。JSF事件和动作可以直接作用于这些对象,然后通过Spring的...
1. 配置Spring以管理JSF的Managed Beans,这可以通过Spring的` faces-config.xml` 和 `applicationContext.xml` 文件完成。 2. 使用Hibernate配置文件(如`hibernate.cfg.xml`)设置数据库连接,并定义实体类与...
3. **Managed Beans**: Managed Beans是JSF应用中的核心业务逻辑载体。它们是Java类,可以通过JSF生命周期进行管理,提供了在视图和控制层之间传递数据的方法。在学生管理系统中,会有一个或多个Managed Beans来处理...
在本章节中,我们将深入探讨JavaServer Faces (JSF) 中的托管Bean(Managed Beans)以及如何实现国际化(Internationalization,通常简写为i18n)。这些是JSF框架中的核心概念,对于构建功能丰富的、多语言支持的Web...
2. **JSF Managed Beans**:JSF中的Managed Bean是应用程序的主要组件,它们负责处理用户的请求并更新视图。在JSF的配置文件(如`faces-config.xml`)中,我们定义Managed Bean的名称、范围和实现类。当与Spring结合...
通过Spring的Bean定义,可以配置JSF Managed Beans和JPA实体,实现依赖注入。其次,Spring的AOP能力可以用来实现事务管理,确保数据库操作的原子性和一致性。 1. **JSF Managed Beans**:在JSF中,Managed Beans...
Managed Beans是JSF中的核心概念,它们作为业务逻辑的载体,可以被JSF框架自动管理。开发者可以定义属性和方法,实现后端逻辑,并通过EL(Expression Language)在视图层与之交互。 **5. EL表达式** EL是一种简洁的...
通过学习本教程,你将了解JSF的基础知识,包括如何创建简单的JSF页面、管理Bean、处理用户输入和使用AJAX功能。随着技能的提升,你可以进一步探索JSF的高级特性和最佳实践,以适应不断变化的Web开发需求。
7. **jsf实例**:在实际应用中,JSF实例通常指的是一个运行时的JSF应用程序,它包含了配置、组件、Managed Beans以及它们之间的交互。 在“Login”示例中,我们可能看到以下代码片段: ```xml <!-- login.xhtml --...
在提供的"JSF趙剣.pdf"文件中,可能会详细介绍以上概念以及更多关于如何实际操作JSF实例的步骤和技巧,包括如何配置环境、创建和使用Managed Beans、设计用户界面、处理表单提交以及调试和优化JSF应用程序的方法...
总的来说,这个"jspADD添加JSF项目实例"将引导我们深入理解JSF框架的各个方面,包括组件、生命周期、视图、EL、Managed Beans以及配置。通过实践,我们可以更好地掌握如何在实际项目中运用JSF,提升Web开发的效率和...