`
valentiy
  • 浏览: 4492 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

区别JSF中不同种类的Managed-Bean

    博客分类:
  • JSF
阅读更多

       本文在实际应用中引起了我很多思考,也从中获益不少,特此转帖,此贴转自Aom社区,感谢译者Patrick Deng。

 

      JSF拥有一个简单的依赖注入(IoC)容器,称为JSF Managed Bean Facility(MBF)。虽然它具备了详细的XML配置语法,但并不及Spring BeanFactory, PicoContainer, 或JBoss Microcontainer等IoC容器那么壮健。MBF具有一个IoC容器的基本功能,提供了依赖注入等特性。

      在JSF MBF的管理之下的POJO通常都被称为Managed-Bean(托管Bean)。但如果你试图创建一个可维护的JSF Web应用(或portlet),你就需要区分开不同种类的Managed-Bean。这种做法同时也保证了在JSF中实现MVC模式的清晰分离概念。

 

Managed-Bean类型 昵称 典型的有效域
Model Managed-Bean model-bean session

描述: 这种类型的Managed-Bean充当MVC设计模式中的"模型(Model)"部分。当你看到"模型"一词————可以把它想象为"数据"。一个JSF的model-bean应该是一个遵循JavaBean规范的,以getter/setter方式封装了各种属性的普通JAVA对象。model-bean最常见的使用场景是作为一个数据库实体,或简单地代表了数据库查询结果集中的一系列行数据。

Backing Managed-Bean backing-bean request

描述: 这种类型的Managed-Bean充当MVC设计模式中的"视图(View)"部分。backing-bean的目的是支持UI逻辑,(通常)与一个JSF视图或Facelet聚合中的JSF表单保持一一对应的关系。虽然它通常具有一些遵循JavaBean风格并关联了getter/setter的属性,但这些属性是对应"视图"中的值,而不对应底层的应用数据模型。JSF的backing-bean可以具有JSF的actionListener和valueChangeListener方法。

Controller Managed-Bean controller-bean request

描述: 这种类型的Managed-Bean充当MVC设计模式中的"控制器(Controller)"部分。controller bean的目的是执行某些业务逻辑并返回一个导航结果给JSF的导航处理器。JSF controller-bean通常具有JSF的action方法(而不是actionListener方法)

Support Managed-Bean support-bean session / application

描述: 这种类型的bean为MVC设计模式中的"视图(View)"部分中的一个或多个视图提供"支持"。典型的应用场景是提供一个ArrayList<SelectItem>给JSF的h:selectOneMenu下拉列表,而且这个下拉列表将在多个JSF视图中出现。如果这个下拉列表的数据是用户特定的,那么这个bean就应该放在session范围中。但是,如果数据是提供给所有用户的(例如一个选择省份的下拉列表),那么这个bean就应该放在application范围中。

Utility Managed-Bean utility-bean application

描述: 这种bean为一个或多个JSF视图提供"工具"。例如一个能在多个Web应用中复用的FileUpload bean。

 

       

     进行这种区分的一个主要好处是松耦合。你会问:这是虾米?那么,让我们先看一个紧耦合的例子,在这里MVC的概念被拼凑(或者说混淆)在单一的Managed-Bean中:

 

 

public class ModelAndBackingAndControllerBean {

	private String fullName; // model-bean property
	private boolean privacyRendered; // backing-bean property

	// model-bean getter
	public String getFullName() {
		return fullName;
	}
	
	// model-bean setter
	public void setFullName(String fullName) {
		this.fullName = fullName;
	}

	// backing-bean getter
	public boolean isPrivacyRendered() {
		return privacyRendered;
	}

	// backing-bean setter
	public void setPrivacyRendered(boolean privacyRendered) {
		this.privacyRendered = privacyRendered;
	}

	// backing-bean actionListener for UI support logic
	public void togglePrivacySection(ActionEvent actionEvent) {
		privacyRendered = !privacyRendered;
	}

	// controller-bean business logic
	public String submit() {
		System.out.println("fullName=" + fullName);
		return "success";
	}
}

 

  

    这种写法的问题是由于它充当model-bean,整个bean必须放在session范围。并且,当你想使用伪装的模型数据(mock model data)进行单元测试,你会发现根本行不通。因此为了修正这些问题,并实现松耦合,我们应该使用三个独立的Java类:

   

public class ModelBean {

	private String fullName;

	public void setFullName(String fullName) {
		this.fullName = fullName;
	}

	public String getFullName() {
		return fullName;
	}
}

public class BackingBean {

	private boolean privacyRendered;

	public void setPrivacyRendered(boolean privacyRendered) {
		this.privacyRendered = privacyRendered;
	}

	public boolean isPrivacyRendered() {
		return privacyRendered;
	}

	public void togglePrivacySection(ActionEvent actionEvent) {
		privacyRendered = !privacyRendered;
	}

}

public class ControllerBean {

	private ModelBean modelBean;
	
	public ModelBean getModelBean() {
		return modelBean;
	}

	public void setModelBean(ModelBean modelBean) {
		// Dependency injected from the JSF managed-bean facility
		this.modelBean = modelBean;
	}

	public String submit() {
    	System.out.println("fullName=" + getModelBean().getFullName());
        return "success";
    }

}

 

 

    现在这些bean实例将属于不同的类,可以分别保持在合适的有效域中。model-bean可以放在session范围,backing-bean和controller-bean可以放在request范围,因而节省了服务器的内存资源。

    最后,我们可以使用JSF MBF提供的依赖注入特性来把model-bean注入到controller-bean中。下面是WEB-INF/faces-config.xml配置文件示例,其中#{modelBean} EL表达式即为注入的配置:

  

   

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
	version="1.2">
	<managed-bean>
		<managed-bean-name>modelBean</managed-bean-name>
		<managed-bean-class>myproject.ModelBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	<managed-bean>
		<managed-bean-name>backingBean</managed-bean-name>
		<managed-bean-class>myproject.BackingBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>
	<managed-bean>
		<managed-bean-name>controllerBean</managed-bean-name>
		<managed-bean-class>myproject.ControllerBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>modelBean</property-name>
			<value>#{modelBean}</value>
		</managed-property>
	</managed-bean>
</faces-config>

 

   

分享到:
评论

相关推荐

    JSF技术总结文档.doc

    在这个配置中,`managed-bean-name`指定了Bean的名称,`managed-bean-class`指定了对应的类,而`managed-bean-scope`定义了Bean的作用域,可以是`request`、`session`或`application`。`request`作用域的Bean仅在...

    JSF 资源 managed bean 课件

    ### JSF Managed Beans知识点概述 ...合理利用Bean的不同作用域以及与JSF框架的紧密集成,能够显著提高应用程序的性能和可维护性。同时,参考提供的学习资源和实践案例,可以帮助初学者快速掌握这些关键技术点。

    JSF2-Using-Spring

    @ManagedBean(name = "userBean") @RequestScoped public class UserBean { private UserService userService; // 使用@Autowired注解注入userService @Autowired public void setUserService(UserService ...

    一个简单的jsf例子------JSF2学习笔记1

    在JSF2中,可以通过注解如`@ManagedBean` 和 `@ViewScoped` 来轻松创建和配置bean。例如,我们可以定义一个名为`UserBean` 的bean,用于处理用户的登录信息。 4. **EL表达式** Expression Language (EL) 是JSF中的...

    jsf-api-2.0.3.jar.zip_jsf api_jsf jar包_jsf-api-2.0.3.jar_jsf-api

    `jsf-api-2.0.3.jar` 包含的API接口定义了JSF的各种核心接口,例如`FacesContext`、`UIComponent`、`ManagedBean`等,这些都是构建JSF应用程序的基础。开发者可以引用这些接口来创建自定义组件,实现事件监听器,...

    JSF2整合Spring3------JSF学习笔记4

    import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import org.springframework.beans.factory.annotation.Autowired; @ManagedBean(name = "userBean") @SessionScoped public ...

    JSF+spring+hibernate整合实例

    在`User`类中,`setName()`方法调用了`userManager.getChangedName()`,这意味着我们需要将Spring管理的`UserManager`注入到JSF的Managed Bean中。 为了实现这一点,我们在`faces-config.xml`中配置了`User` ...

    jsf-by-example-源码.rar

    在JSF应用中,我们可以创建Managed Beans并使用注解(如`@ManagedBean`、`@SessionScoped`)来定义其生命周期和作用域。 **5. 视图和导航** 在JSF中,视图由`.xhtml`文件定义,它们使用JSF组件和EL表达式。导航则...

    jsf传递参数的说明

    在JSF的配置文件(如faces-config.xml)中,你可以直接将参数注入到Managed Bean的属性中。比如: ```xml &lt;managed-bean&gt; &lt;managed-bean-name&gt;paramBean&lt;/managed-bean-name&gt; &lt;managed-bean-class&gt;...

    java面试知识点总结--JSF界面控制层技术.pdf

    - 在JSF中,通常使用`&lt;managed-bean&gt;`标签来声明和配置Bean。例如: ```xml &lt;managed-bean&gt; &lt;managed-bean-name&gt;checkNumber&lt;/managed-bean-name&gt; &lt;managed-bean-class&gt;jsf1.CheckNumber&lt;/managed-bean-class&gt; ...

    ADF培训_10_JSFIntroduction_2009

    在JSF中,Managed Beans可以在faces-config.xml中定义,而在ADF中,它们可以在adfc-config.xml(针对ADF任务流元数据)中定义。Managed Beans有多种范围,如Application、Session、Request,以及特定于ADF的Backing...

    jsf+spring

    - 在JSF页面中使用Spring管理的bean,可以通过`&lt;f:managedProperty&gt;`标签或EL表达式引用bean。 - 如果需要,配置Spring MVC和JSF的集成,例如设置DispatcherServlet和FacesServlet的映射。 5. **示例代码** - ...

    JSF-2-Hello-World-Example.zip

    在JSF中,可以使用`@ManagedBean`和`@RequestScoped`等注解来声明和管理Bean。 4. **EL (Expression Language)**:用于在视图层和后台Bean之间进行数据绑定的表达式语言。例如,`#{bean.message}`可以获取或设置...

    JFS示例代码,可以看看

    &lt;managed-bean-class&gt;javabeat.net.jsf.JavaBeatJsfBean&lt;/managed-bean-class&gt; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; &lt;/managed-bean&gt; &lt;managed-bean&gt; &lt;managed-bean-name&gt;userInfo&lt;/managed-bean...

    JSF2.0-hello-world-example-2.1.7.zip

    在JSF中,这类bean通常用`@ManagedBean`和`@RequestScoped`注解标记,以便JSF能够管理和实例化它们。 - **后端逻辑**:在managed bean中,可能会有一个方法处理用户的提交,比如一个名为`sayHello()`的方法,该方法...

Global site tag (gtag.js) - Google Analytics