JSF托管Bean

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

托管bean它是一个纯Java类,它包含一组属性和一组gettersetter方法。

以下是托管bean方法执行的常见功能:

  • 验证组件的数据

  • 处理组件触发的事件

  • 执行处理以确定应用程序必须导航的下一页

  • 它也可以作为JFS框架的模型。


JSF托管Bean示例

请看看下面一段示例代码 -

public class User {  
    private String name;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }   
}

您可以通过以下方式使用此bean

  • 通过配置成XML文件。

  • 通过使用注释。


通过XML文件配置托管Bean

<managed-bean>  
    <managed-bean-name>user</managed-bean-name>  
    <managed-bean-class>User</managed-bean-class>  
    <managed-bean-scope>session</managed-bean-scope>  
</managed-bean>

在xml文件配置bean是比较旧方法。 在这种方法中,我们必须创建一个名为faces-config.xml的xml文件,JSF提供了配置bean的标签。

在上面的例子中,我们列出了bean-namebean-classbean-scope。 所以,它可以在项目中访问。


使用注释配置托管Bean

import javax.faces.bean.ManagedBean;  
import javax.faces.bean.RequestScoped;  

@ManagedBean    // Using ManagedBean annotation  
@RequestScoped  // Using Scope annotation  
public class User {  
    private String name;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
         this.name = name;  
    }  
}

类中的@ManagedBean注解自动将该类注册为JavaServer Faces的资源。 这种注册的托管bean在应用程序配置资源文件中不需要托管bean配置项。

这是应用程序配置资源文件方法的替代方法,并减少配置托管bean的任务。
@RequestScoped注释用于提供托管的范围。 您可以使用注解来定义bean将被存储的范围。

您可以对bean类使用以下范围:

  • 应用程序(@ApplicationScoped):应用程序范围在所有用户中保持不变,与Web应用程序的交互。

  • 会话(@SessionScoped):会话范围在Web应用程序中的多个HTTP请求中保持不变。

  • 视图(@ViewScoped):在用户与Web应用程序的单个页面(视图)进行交互时,视图范围仍然存在。

  • 请求(@RequestScoped):在Web应用程序中的单个HTTP请求期间,请求范围仍然存在。

  • 无(@NoneScoped):表示未为应用程序定义作用域。

  • 自定义(@CustomScoped):用户定义的非标准作用域。 其值必须配置为java.util.Map,自定义范围很少使用。


急切管理Bean

托管bean默认是懒惰的。 这意味着,只有在从应用程序发出请求时才会去实例化bean。
如果想自动提前强制将bean实例化,那么可在应用程序启动时,可以强制将bean实例化并放置在应用程序(@ApplicationScoped)范围内。您需要将托管 bean 的eager属性设置为true,如以下示例所示:

@ManagedBean(eager=true)

相关问答

更多
  • 当托管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范围 ...