序言

在JAVA社区里,WEB应用的开发一直存在开发难的问题。从开始的最简单的CGI程序,到JSP,SERVLET。虽然说JSP/SERVLET的出现大大减轻了开发的难度,但稍微复杂点的WEB应用,就会产生大量重复代码,后来为了解决这些问题,先后出现了诸如Struts, Spring等优秀的框架,并得到了很大推广。在这些基础上,Java社区进程(Java Community Process:JCP),包括Sun Microsystems、Oracle、Borland、BEA、IBM以及一群业内知名的Java和Web专家,开始制作JSF规范请求,最初的Java规范请求(JSR127)起始于2001年中期,并于2004年3月,正式公开发布了JavaServer Faces规范和参考实现。

什么是 JSF?

JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的标准 Java 框架。它的目的是简化WEB应用程序的开发。它基于组件技术,并提供了以此为中心来开发 Java Web 用户界面的方法,从而简化开发。JSF框架体系完美地集成了具有良好构建的模型-视图-控制器 (MVC) 设计模式,确保了应用程序具有良好的可维护性。另外,因为JSF 是由 Java Community Process (JCP) 开发的一种 Java 标准,所以完全可以得到各大开发工具供应商的支持,为 JavaServer Faces 提供易于使用的、高效的可视化开发环境。

JSF的体系结构

上面提到了JSF体系框架中的模型-视图-控制器 (MVC) 设计模式。我们具体来看看。典型的JSF应用:用户请求JSF页面,首先会统一把请求交由FacesServlet(Controller),FacesServlet里经过一系列的处理,调用业务模型(Model)处理,最后把JSP页面内容(View)展现给用户。

JSF的生命周期:

JSF把整个用户请求明确地分成了6个阶段,每个阶段完成不同的任务。一个典型JSF请求分成以下6个阶段:

  1. Restore View Phase:重载视图阶段
  2. Apply Request Values Phase:应用请求值阶段这个阶段主要做2件事:第一,把用户提交的数据设置到组件中去;第二,把用户事件(比如按下按钮等)加到事件队列。
  3. Process Validations Phase:数据检查阶段这个阶段主要做数据的合法性检查,如果用户输入了非法数据,则在画面上显示相应的错误消息。
  4. Update Model Values Phase:更新模型值阶段把组件里的值设置到Model中去。
  5. Invoke Application Phase:用户业务逻辑阶段主要处理用户按钮事件等,调用业务逻辑处理(action)。
  6. Render Response:重画画面阶段画面描画和展现。

为了便于理解,用下面2个图加以说明:
JSF的生命周期 概要图

JSF的生命周期(详细):


备注1:重载视图组件树(Component Tree)
备注2:如果设置了按钮等的immediate属性设置为true,且被提交的数据格式正确无误的情况下,则把用户提交的数据设置到组件(Components)中去,如果有Converter等,则调用Converter做变换。
另外:processValidators阶段(immediate为false),如果有Converter等,且被提交的数据格式正确无误,则调用Converter做变换。
备注3:把组件里的值设置到BackingBean。
备注4:Action Event处理。

从上图可以看出,组件在JSF里起着中心关键的作用。基本上所有的处理都是围绕着组件为中心。

但对于一般开发人员,他们可以不用关心组件的实现,只专注于业务逻辑(Model)方面的处理就行了。从用户请求到业务逻辑(Action Event)处理,JSF框架几乎为我们作了所有的其他工作。我们除了在JSP里写几个关联标签之外(如:<h:outputText value="#{mybean.userName}" />把用户名关联到Mybean中username属性;<h:commandButton action="#{mybean.onLogin}" />把该按钮事件关联到Mybean中的onLogin方法),可以完全不用管这个请求是怎么调用我们的业务逻辑处理的。

JSF中的组件

JSF除了提供了一系列的标准组件之外,还提供了接口供开发者开发自己的组件。

JSF组件的实现也非常灵活,一个JSF组件一般由(标签:Tag,组件:Component, 描画器:Renderer)三部分组成。它同样体现了MVC的设计思想,作到了数据和显示的分离。同一套组件,可以由不同的描画器(Renderer)描画,从而展现给用户不同的界面。

总结:

JSF在不牺牲开发能力和灵活性的前提下提供高效的以组件为中心的开发,使得以JSF开发的WEB应用具有高度的可扩展性,解决了Java Web 开发中的许多历史问题,大大降低了开发难度。同时由于它的开放性和标准性,将得到越来越多的开发商和开发人员的青睐。

JSF MVC 流程相关推荐

  1. Spring源码——MVC流程

    前言 最近回顾了一下Spring源码,准备用思维导图的方式简单的将整个源码内容的流程展示出来,思维导图.图片等文件更新在https://github.com/MrSorrow/spring-frame ...

  2. SpringMVC学习笔记(一):mvc流程和思路

    spring mvc框架是一个mvc框架,通过实现mvc很好的将数据.业务.展现进行分离 spring MVC 的设计围绕DispatcherServlet 展开的, 由DispatcherServl ...

  3. 实现spring mvc流程

    2019独角兽企业重金招聘Python工程师标准>>> 首先,配置web.xml文件来启动spring <?xml version="1.0" encodi ...

  4. 高手都这么给 Spring MVC 做单元测试!

    作者:alanshelby 来源:zhuanlan.zhihu.com/p/43260823 「一.前言」 在前面的章节我们介绍过 Junit 的使用,也了解过 spring-test,今天我们来了解 ...

  5. Spring MVC系列[1]—— HelloWorld

    1.导入jar包 ioc mvc 复制spring-mvc.xml到src目录下. 2.web.xml <?xml version="1.0" encoding=" ...

  6. Spring MVC测试框架

    原文链接:http://jinnianshilongnian.iteye.com/blog/2004660 Spring MVC测试框架详解--服务端测试 博客分类: springmvc杂谈 spri ...

  7. 我记录网站综合系统 -- 技术原理解析[3:我记录框架处理流程]

    要分析我记录的整个处理流程,先从wojilu的初始化入口,看看wojilu在初始化的时候到底做了些什么事情. 相关代码:wojilu.Web\Global.asax 1 void Applicatio ...

  8. SpringIOC、DI、AOP、MVC总结、时序图

    一.IOC容器初始化 IOC 容器的初始化包含了BeanDefinition资源文件Resource定位.解析加载和注册三个步骤.  步骤依次为 : 读取资源文件为InputStream --> ...

  9. Spring MVC讲解

    什么是MVC Spring MVC流程 什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织 ...

最新文章

  1. 一个“退学生”到CTO的逆袭之路
  2. python3 raise 抛出异常
  3. 以面向对象的思想实现数据表的添加和查询,JDBC代码超详细
  4. SpringMVC拦截器2(资源和权限管理)(作为补充说明)
  5. mqtt连接失败_Netty实战:如何让单机下Netty支持百万长连接?
  6. Zabbix5.0监控系统安装详解
  7. arrylist输入_创建一个ArrayList对象利用Add方法为其添加元素在文本框中输入数据在ArrayList查找?...
  8. 刻奇·缩减·博客——当今中国博客文化之批判
  9. 4 WM配置-主数据-定义编码范围
  10. tnsping通oracle连不上,TNS配置正确,而tnsping不通
  11. elementui表格宽度适应内容_element ui 表格高度自适应
  12. python 通配符域名_LeetCode-python 44.通配符匹配
  13. Docker 方式 MySQL 主从搭建
  14. queryrunner对于数据库的快速操作
  15. Tableau教程——一
  16. 用计算机运算符编写检索式,检索式
  17. 334个地级市名单_中国各级行政区划数量,统计到乡镇一级
  18. 简单易懂的现代魔法……原来是C++啊
  19. 添加源显示未找到使用主机服务器,未能找到主机指定使用服务器
  20. android Room框架学习

热门文章

  1. php intval trim,php数据入库前清理 注意php intval与mysql的int取值范围不同_PHP教程
  2. cookie跨域_跨域问题的复现与整理
  3. 计组之指令系统:3、CISC和RISC
  4. 操作系统之进程管理:17、死锁
  5. 【数据库题型大总结】简答题总结
  6. 谈谈我国电子商务中的安全问题
  7. twisted系列教程十四— pre-fireed deferred
  8. shell判断数组内是否包含某成员,获取数组长度
  9. 队列的链式存储结构及实现
  10. 转载:JDBC连接数据库教程,postgreSQL