JSF框架整理(一)

article/2025/9/14 4:10:44

一、框架简介

        JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架,它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发。

典型的JSF应用程序包含下列部分:

  • 一组JSP页面

  • 一组后台bean(为在一个页面上的UI组件定义的属性和函数的JavaBean组件)

  • 应用程序配置资源文件(定义页面导航规则、配置bean和其它的自定对象,如自定义组件)

  • 部署描述文件(web.xml)

  • 一组由应用程序开发者创建的自定义对象(有可能)

  • 一些可能包含自定义组件、约束、转换器或者监听器的对象

  • 为在页面中表现自定义对象的一组自定义tag

包含JSP页面的JSF应用程序也使用由为了表现UI组件和在页面上的其他对象的JSF技术而定义的标准的tag库。

二、JSF生命周期

JSF(JavaServer Faces)应用程序框架的简单程序是自动管理生命周期阶段,并允许您手动管理。JSF(JavaServer Faces)应用程序的生命周期从客户端对页面发出HTTP请求时开始,并在服务器响应页面时结束。

JSF生命周期分为两个主要阶段:

  • 执行阶段
  • 渲染阶段

1. 执行阶段

在执行阶段,当第一次请求时,构建或恢复应用程序视图。 对于其他后续请求,执行其他操作,如应用请求参数值,对组件值执行转换和验证,受托管的bean将使用组件值进行更新,并调用应用程序逻辑。
执行阶段被进一步分成以下子阶段。

  • 恢复视图阶段
  • 应用请求值阶段
  • 流程验证阶段
  • 更新模型值阶段
  • 调用应用阶段
  • 渲染响应阶段

      a:恢复视图阶段

       当客户端请求一个JavaServer Faces页面时,JavaServer Faces实现开始恢复视图阶段。 在此阶段,JSF将视图中的组件构建为请求页面,线性事件处理程序和验证器的视图,并将视图保存在FacesContext实例中。

       如果对该页面的请求是回发,那么与该页面相对应的视图已经存在于FacesContext实例中。 在此阶段,JavaServer Faces实现通过使用保存在客户端或服务器上的状态信息来还原视图。

      b:应用请求值阶段

       在此阶段,在回发请求期间恢复组件树。 组件树是表单元素的集合。树中的每个组件通过使用其decode(processDecodes())方法从请求参数中提取其新值。 之后,该值将本地存储在每个组件上。

  • 如果任何解码方法或事件侦听器在当前FacesContext实例上调用了renderResponse方法,则JavaServer Faces实现将跳过“渲染响应”阶段。
  • 如果任何事件在此阶段已排队,则JavaServer Faces实现将事件广播到有兴趣的监听器。
  • 如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete()方法。
  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

     c:流程验证阶段

      在此阶段,JavaServer Faces通过使用其validate()方法来处理在组件上注册的所有验证器。 它检查指定验证规则的组件属性,并将这些规则与为组件存储的本地值进行比较。 JavaServer Faces还完成了没有将immediate属性设置为true的输入组件的转换。

  • 如果任何验证方法或事件侦听器在当前FacesContext上调用了renderResponse方法,则JavaServer Faces实现将跳过“渲染响应”阶段。
  • 如果应用程序需要重定向到不同的Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete方法。
  • 如果事件在此阶段已排队,则JavaServer Faces实现将它们广播给有兴趣的监听器。
  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

      d:更新模型值阶段

        确保数据有效后,它遍历组件树,并将相应的服务器端对象属性设置为组件的本地值。 JavaServer Faces实现只更新输入组件的value属性指向bean属性。 如果本地数据无法转换为bean属性指定的类型,生命周期将直接前进到“渲染响应”阶段,以便重新呈现页面并显示错误。

  • 如果任何updateModels方法或任何监听器在当前FacesContext实例上调用了renderResponse()方法,则JavaServer Faces实现将跳过“渲染响应”阶段。
  • 如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete()方法。
  • 如果任何事件在此阶段已排队,JavaServer Faces实现将它们广播到有兴趣的监听器。
  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

       e:调用应用阶段

         在此阶段,JSF处理应用程序级事件,例如提交表单或链接到另一个页面。
现在,如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JSF组件的响应,则可以调用FacesContext.responseComplete()方法。

之后,JavaServer Faces实现将控制转移到“渲染响应”阶段。

      f:渲染响应阶段

      这是JSF生命周期的最后阶段。 在此阶段,JSF将构建视图并将权限委托给相应的资源来呈现页面。

  • 如果这是初始请求,则页面上表示的组件将被添加到组件树中。
  • 如果这不是初始请求,组件已经添加到树中,不需要再添加。
  • 如果请求是回应,并且在应用请求值阶段,过程验证阶段或更新模型值阶段期间遇到错误,则在此阶段将再次呈现原始页面。

   如果页面包含h:messageh:messages标签,页面上会显示任何排队的错误消息。
在渲染视图的内容之后,保存响应的状态,以便后续请求可以访问它。 恢复视图阶段可以使用保存的状态。

 

2. 渲染阶段

在此阶段,请求的视图作为对客户端浏览器的响应。 视图渲染是以HTML或XHTML生成输出的过程。 所以,用户可以在浏览器看到它。

在渲染过程中采取以下步骤。

  • 当客户端对index.xhtml网页进行初始请求时,编译应用程序。
  • 应用程序在编译后执行,并为应用程序构建一个新的组件树,并放置在FacesContext中。
  • 使用由EL表达式表示的组件和与其关联受托管bean属性填充组件树。
  • 基于组件树。 建立了新的视图。
  • 该视图作为响应呈现给请求客户端。
  • 组件树被自动销毁。
  • 在后续请求中,重新构建组件树,并应用已保存的状态。

三、JSF托管Bean

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

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

  • 验证组件的数据
  • 处理组件触发的事件
  • 执行处理以确定应用程序必须导航的下一页
  • 它也可以作为JFS框架的模型。

1、JSF托管Bean示例:

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

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

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

  • 通过配置成XML文件。
  • 通过使用注释。

   a:通过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。 所以,它可以在项目中访问。

   b:使用注释配置托管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配置项。

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

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

@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {@ManagedProperty(value="#{message}")private Message message;...
}

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

  • 应用程序(@ApplicationScoped):应用程序范围在所有用户中保持不变,与Web应用程序的交互。( bean只要Web应用程序生存。 它在第一个HTTP请求或Web应用程序启动时创建,并且在@ManagedBean中设置属性eager = true,并在Web应用程序关闭时被销毁)。
  • 会话(@SessionScoped):会话范围在Web应用程序中的多个HTTP请求中保持不变。(bean只要HTTP会话生存。 它在第一个HTTP请求时创建,并在HTTP会话无效时被销毁)。
  • 视图(@ViewScoped):在用户与Web应用程序的单个页面(视图)进行交互时,视图范围仍然存在。(bean只要用户在浏览器窗口中与同一JSF视图进行交互即可。 它根据HTTP请求创建,并在用户导航到其他视图时被销毁)。
  • 请求(@RequestScoped):在Web应用程序中的单个HTTP请求期间,请求范围仍然存在。(bean只要HTTP请求响应就行。它根据HTTP请求创建,并在与HTTP请求相关联的HTTP响应完成时被销毁)。
  • 无(@NoneScoped):表示未为应用程序定义作用域。(bean与单个表达式语言(EL)求值时间一样长。 在EL求值评估时创建,并在EL求值评估后被销毁)。
  • 自定义(@CustomScoped):用户定义的非标准作用域。 其值必须配置为java.util.Map,自定义范围很少使用。(bean只要在为此范围创建的自定义Map中的bean的条目生效)。

急切管理Bean

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

@ManagedBean(eager=true)

@ManagedProperty注释

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

2、如何进行bean注入

我们先定义一个消息bean,它有一个字符串属性来存储消息。

@ManagedBean(name="message")
@SessionScoped
public class MessageBean implements Serializable {private static final long serialVersionUID = 1L;private String sayWelcome = "Welcome to JSF 2.0";

然后我们再定义另一个托管bean,并使用@ManagedProperty注解注入MessageBean

@ManagedBean
@SessionScoped
public class UserBean implements Serializable {private static final long serialVersionUID = 1L;@ManagedProperty(value="#{message}")private MessageBean messageBean;public void setMessageBean(MessageBean messageBean) {this.messageBean = messageBean;}

实例:

     创建一个名为: InjectManagedBeans 的工程,并加入以下文件代码。
以下是文件:UserBean.java 中的代码 

package com.yiibai;import java.io.Serializable;import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;@ManagedBean
@SessionScoped
public class UserBean implements Serializable {private static final long serialVersionUID = 1L;@ManagedProperty(value="#{message}")private MessageBean messageBean;public void setMessageBean(MessageBean messageBean) {this.messageBean = messageBean;}private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSayWelcome(){//check if null?if("".equals(name) || name ==null){return "";}else{return messageBean.getSayWelcome() + name;}}}

以下是是文件:index.xhtml 中的代码 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"      xmlns:h="http://java.sun.com/jsf/html"><h:body><h:form><h:inputText id="name" value="#{userBean.name}"></h:inputText><h:commandButton value="Welcome Me"><f:ajax execute="name" render="output" /></h:commandButton><h2><h:outputText id="output" value="#{userBean.sayWelcome}" /></h2>  </h:form></h:body>
</html>

以下是文件:MessageBean.java 中的代码 

package com.yiibai;
import java.io.Serializable;import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;@ManagedBean(name="message")
@SessionScoped
public class MessageBean implements Serializable {private static final long serialVersionUID = 1L;private String sayWelcome = "Welcome to JSF 2.0";public String getSayWelcome() {return sayWelcome;}public void setSayWelcome(String sayWelcome) {this.sayWelcome = sayWelcome;}}

运行测试结果:

Tomcat启动完成后,在浏览器地址栏中输入以下URL。

http://localhost:8084/InjectManagedBeans/

运行结果如下所示 


http://chatgpt.dhexx.cn/article/BOGbgKFN.shtml

相关文章

JSF简介

JSF简介 一、 什么是 JSF &#xff1a; JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法&#xff0c;从而简化了开发。 JavaServer Faces于2004年三月1.0版正式提出&#xff0c;清楚的将Web应…

JSF概述

1. JSF简洁 JSF是一种以组件为中心&#xff0c;遵循MVC设计模式的一种框架。 Web引用程序开发人员划分&#xff1a;网页设计人员应用程序设计人员UI组件设计人员 所有与应用程序都由一个前端控制器(FacesServlet)来处理 2. JSF声明周期 FacesServlet充当用户和JSF应用程序之间的…

ztree项目

思路&#xff1a; 创建一个登陆 登陆上去 就是树 每个是的根节点有他所要展示的内容 表 可以有无数个 主要说的是创建树的表 这个是树的一个表 id 是 节点 name 名字 pid 根节点 url 路径 树的页面 后台通过登陆转的页面 转页面 在前台打印出你想要的数据 前台页面 退出 /*…

ztree使用

官方文档地址 http://www.treejs.cn/v3/main.php#_zTreeInfo 各种参数 http://www.treejs.cn/v3/api.php 简单静态调用 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><link href"https://cdn…

zTree 简介

zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。 zTree 是开源免费的软件&#xff08;MIT 许可证&#xff09;。如果您对 zTree 感兴趣或者愿意资助 zTree 继续发展下去&#xff0c;可以进行捐助。 zTree v3.0 …

ztree 详解

官网:http://www.treejs.cn/v3/demo.php#_101 里面有例子和demo,齐全。 zTree是一个基于jQuery的树形列表生成控件。 切换语言,点击下载,里面有各种demo: 里面各种demo,比博客写的好。 <!DOCTYPE html> <html lang="en"><head><meta ch…

zTree的简单使用1.0

2018/10/10 北京朝阳.冠城大厦17楼 这里是引用 zTree 简介 zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。 zTree 是开源免费的软件&#xff08;MIT 许可证&#xff09;。如果您对 zTree 感兴趣或者愿意资助 zT…

ZTree基本使用及本人详解

文章目录 ZTree树简介简介ZTree的特点练习ztree之前的小建议ZTree文件介绍ZTree的配置介绍 ZTree使用案例需求1&#xff1a;前端初始化数据&#xff08;标准json数据&#xff09;前端代码 需求2&#xff1a;后端查询ztree数据&#xff08;简单JSON数据&#xff09;需求3&#x…

ztree 使用教程

zTree 是一个依靠 jQuery 实现的多功能 “树插件”。被广泛应用在系统的权限管理中&#xff0c;本文讲解zTree的一般应用 zTree 官网 http://www.treejs.cn/v3/main.php#_zTreeInfo 1、zTree 官网下载 ztree 下载好后放到项目相关目录下 2、编写相关代码 引入相关js 、 css …

@PersistenceContext和@Autowired在EntityManager上应用的不同

首先PersistenceContext是jpa专有的注解&#xff0c;而Autowired是spring自带的注释 上方图片的意思就是EntityManager不是线程安全的&#xff0c;当多个请求进来的时候&#xff0c;spring会创建多个线程&#xff0c;而PersistenceContext就是用来为每个线程创建一个EntityMana…

java:spring:注解:@PersistenceContext和@Resource

PersistenceContext private EntityManager em; 注入的是实体管理器&#xff0c;执行持久化操作的&#xff0c;需要配置文件persistence.xml。 注入一堆保存实体类状态的数据结构&#xff0c;针对实体类的不同状态(四种,managedh或detached等)可以做出不同的反应(merge,persis…

@PersistenceContext和@Autowired在EntityManager上应用的区别。

在使用SpringJPA的时候&#xff0c;经常看到如下代码&#xff1a; PersistenceContext private EntityManager entityManager;于是就有些好奇&#xff0c;这个PersistenceContext是几个意思&#xff0c;如果是实体注入的话&#xff0c;统一采用 Autowired不可以吗&#xff1f;…

JAVAEE容器如何管理EntityManager和PersistenceContext

2019独角兽企业重金招聘Python工程师标准>>> 容器托管EntityManager PersistenceContext&#xff0c;存放unitName指向的DataBase对应的EntityBean实例集合&#xff0c;以及对这些实例进行生命周期管理 PersistenceContext( name"entityManagerNa…

An attempt was made to call the method javax.persistence.PersistenceContext.synchronization()

报错 解决办法 1、 2、 3、 4、 5、 别忘了最后点击 Apply 然后在点击ok 重启完事 6、 如果都不行的话 It was loaded from the following location: 就去这个提示下的位置 把它报错的包删除 从新加载Maven即可&#xff01;&#xff01;

Spring各种注解 @PersistenceContext和@Resource @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

这里记录各种spring注解 DataAllArgsConstructorNoArgsConstructorBuilder Data 使用这个注解&#xff0c;就不用再去手写Getter,Setter,equals,canEqual,hasCode,toString等方法了&#xff0c;注解后在编译时会自动加进去。 AllArgsConstructor 使用后添加一个构造函数&…

SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

SpringDataJPAHibernate框架源码剖析系列文章&#xff1a; SpringDataJPAHibernate框架源码剖析&#xff08;一&#xff09;框架介绍SpringDataJPAHibernate框架源码剖析&#xff08;二&#xff09;框架整合 之 EntityManagerFactory的构建SpringDataJPAHibernate框架源码剖析…

@PersistenceContext 注解在spring中代理

PersistenceContext private EntityManager em;springBoot 2.x 这里注入的是EntityManager的代理类&#xff0c;注入的代理类是单例的&#xff0c;所以是线程安全的 在调用EntityManager的方法时 其实是调用代理类 SharedEntityManagerInvocationHandler中的invoke方法 在这…

JPA之EntityManager踩坑笔记:更改PersistenceContext

一、原因&#xff1a;项目中配置两个Spring JPA的数据源&#xff0c;使用EntityManager的时候默认是选择第一个&#xff0c;导致查询不到第二个数据源的数据。 二、Spring JPA多数据源怎么使用EntityManager 1. Spring JPA多数据源的配置请查看此文章&#xff1a;SpringData …

Spring Data JPA 之 理解 Persistence Context 的核心概念

21 理解 Persistence Context 的核心概念 21.1 Persistence Context 相关核心概念 21.1.1 EntityManagerFactory 和 Persistence Unit 按照 JPA 协议⾥⾯的定义&#xff1a;persistence unit 是⼀些持久化配置的集合&#xff0c;⾥⾯包含了数据源的配置、EntityManagerFacto…

JPA中为什么EntityManager 的注解要用@PersistenceContext

在使用SpringJPA的时候&#xff0c;看到如下代码 PersistenceContextprivate EntityManager entityManager; 于是就有些好奇&#xff0c;这个PersistenceContext是几个意思&#xff0c;如果是实体注入的话&#xff0c;统一采用 Autowired可以吗&#xff1f;于是上网查了下&am…