JSF托管bean(Managed Bean)

2019-04-28 07:40|来源: 网路

JSF 托管bean(Managed Bean)是JSF注册的常规Java Bean类。托管bean包含getter和setter方法,业务逻辑。JSF托管bean作为UI组件的Model。 它存储JSF xhtml页面使用的数据。借助JSF框架,可以从JSF页面访问托管Bean。
在JSF 1.2中,我们必须在JSF配置文件(如faces-config.xml)中注册受管理的bean。
从JSF 2.0可以使用注解注册管理bean。

使用XML配置

以下代码显示如何使用JSF管理的bean进行注册 -

<managed-bean>
  <managed-bean-name>helloWorld</managed-bean-name>
  <managed-bean-class>com.yiibai.test.HelloWorld</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean> 
<managed-bean>
  <managed-bean-name>message</managed-bean-name>
  <managed-bean-class>com.yiibai.test.Message</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

使用@ManagedBean注解

以下代码显示了如何使用注解来注册JSF托管的bean。

@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {

   @ManagedProperty(value="#{message}")
   private Message message;
   ...
}

@ManagedBean将bean标识为名称属性中指定的名称的托管bean。如果未指定name属性,那么托管bean名称将默认为简单的类名称,其中第一个字母小写。 在我们的情况下是helloWorld
如果eager设置为“true”,则在请求之前创建托管bean。如果使用“lazy”初始化,只有在请求时才会创建bean。

范围注解

范围注解设置受管Bean的范围。如果未指定范围,则bean将默认为请求范围。
我们可以将JSF bean范围设置为以下列表。

  • @RequestScoped bean只要HTTP请求响应就行。它根据HTTP请求创建,并在与HTTP请求相关联的HTTP响应完成时被销毁。

  • @NoneScoped bean与单个表达式语言(EL)求值时间一样长。 在EL求值评估时创建,并在EL求值评估后被销毁。

  • @ViewScoped bean只要用户在浏览器窗口中与同一JSF视图进行交互即可。 它根据HTTP请求创建,并在用户导航到其他视图时被销毁。

  • @SessionScoped bean只要HTTP会话生存。 它在第一个HTTP请求时创建,并在HTTP会话无效时被销毁。

  • @ApplicationScoped bean只要Web应用程序生存。 它在第一个HTTP请求或Web应用程序启动时创建,并且在@ManagedBean中设置属性eager = true,并在Web应用程序关闭时被销毁。

  • @CustomScoped bean只要在为此范围创建的自定义Map中的bean的条目生效。

@ManagedProperty注释

JSF是一个简单的静态依赖注入(DI)框架。 @ManagedProperty注释标记被托管的bean的属性以注入另一个受托管的Bean。

相关问答

更多
  • 当托管bean方法没有执行而没有错误跟踪时,可能的原因是什么? 你可以尝试像这里描述的那样打开日志记录。 您还可以使用一些浏览器调试工具查看来自服务器的ajax响应,它可能包含一些错误信息。 可能以相同的形式混合JSF组件和组件会导致问题吗? 不,共同的OF与JSF完全兼容。 在一些非常复杂的情况下,你可能会遇到一些问题,但我不认为你所描述的情况就是其中之一。 混合并导致问题? 混合它们是正常的。 是否有可能在具有许多OpenFaces弹出窗口的复杂表单上,ajax功能可能会出错? 当然可能在OF或甚至JS ...
  • JSF 1.0 / 1.1 只需将所需逻辑放在与JSF页面关联的请求作用域bean的构造函数中。 public Bean() { // Do your stuff here. } JSF 1.2 / 2.x 在请求或视图作用域bean上使用@PostConstruct注释方法。 它将在构建和初始化/设置所有托管属性和注入依赖项之后执行。 @PostConstruct public void init() { // Do your stuff here. } 如果您使用的是使用代理服务器( ...
  • 没有任何一个组成部分对此负责。 只是EL负责这一点。 如果表达式#{beanname}返回null,它将创建一个与托管bean名称相关联的表达式。 在您的特定情况下,解决此问题的常用方法是使用bean的构造函数或使用@PostConstruct注释的bean的公共方法。 public class Bean { public Bean() { // Put code here which is to be executed during construction, but befor ...
  • 不,没有。 JSF使用表达式语言(EL)来确定您按名称引用的类。 使用一个名为ELResolver的类,他接受传递的String,解释并做出适当的引用。 SpringBeanFacesELResolver类提供了两个框架之间的集成,拦截请求并将其传递给Spring的上下文,Spring处理提供ManagedBeans所需的依赖关系,然后ManagedBeans将其传递给JSF自己的ELResolver。 所以JSF需要bean的名称来知道要注入什么。 No, there isn't. JSF makes u ...
  • 不,这是不可能的。 @ManagedProperty适用于@ManagedBean类(JSF托管的bean)。 您只能使用@EJB或@Inject注入另一个EJB或CDI托管bean( @Named类)。 然而,从设计技术上讲,在像EJB这样的业务服务类中注入像JSF或CDI托管bean这样的前端类是没有意义的。 应该这样设计一个EJB,它可以在不改变的情况下将它们重用到一个完全不同的前端,比如JAX-RS webservice,甚至是普通的vanilla servlet。 一个EJB绝对不应该有任何jav ...
  • JSF并不是那样的。 视图中的表单字段(.jsf或其他)由bean中的字段和属性镜像。 当servlet在堆栈中进一步调用时,它们会被JSF自动填充。 这使得需要读取冗余的HTTP参数,除非浏览器从非基于JSF的表单登陆JSF页面。 因为像Spring-MVC这样的东西可以接受目标URI,并在将浏览器重定向到JSF驱动的URL之前建立与ManagedBean实例的连接。 JSF does not really work like that. The form fields in the view (.jsf ...
  • 你所问的模式并不是真正的JSF工作方式。 基于请求的框架(如Struts和Spring MVC )以及较旧的基于Model-2 Servlet / JSP的方法确实如此工作。 在JSF中,首先它是自动映射到请求URL的页面(视图)。 没有直接映射到URL的bean的概念,也没有一个bean的概念,它的框架强制与视图建立1:1关系。 虽然有支持bean的概念,但这是惯例。 对于JSF,所有的bean都是“辅助bean”,只是被视图引用。 BalusC在他的回答中概述了当今可用于从JSF中基于请求的框架获得某些 ...
  • 你不能以编程方式注入它。 但是,您可以通过编程方式获取它。 EJB也可以通过JNDI获得 。 通常,您会在服务器启动日志中找到打印的JNDI名称/别名。 至少JBoss / WildFly会这样做。 有不同的JNDI名称别名: java:global/APP_NAME[/MODULE_NAME]/EJB_NAME java:app/MODULE_NAME/EJB_NAME java:module/EJB_NAME 其中/APP_NAME是WAR或EAR应用程序的名称, /MODULE_NAME是EAR应用程 ...
  • 您可以在JSF2教程中学习,可以使用依赖注入功能。 在您的情况下,它将是关于向pageBean注入MasterBean实例。 我相信你可以在你的pageBean有这样的东西: @ManagedBean(name="pageBean") @ViewScoped public class pageBean { private String content; @ManagedProperty(value="#{MasterBean}") private MasterBean maste ...
  • 是在服务器启动期间还是在加载相关的JSF页面时? 只有@ManagedBean(eager=true) @ApplicationScoped将在服务器启动期间构建。 所有其他的将按需构建(即,在第一次访问时,而在所需范围内不存在实例)。 在服务器启动时自动构建请求/视图/会话范围bean是没有任何意义的,原因很简单,即每个HTTP请求,视图和会话都应该有自己的实例,而不是与应用程序中的其他人共享。 更重要的是,在服务器启动期间,没有任何可用的具体HTTP请求或会话。 也可以看看: 如何选择合适的bean范围 ...