看了网上很多的文章,自己结合项目经验总结一下,加深理解JSF:
一、JavaServer Faces :是一个可以提供一组标准的、可重用GUI组件的Web应用程序开发框架。通过提供模型-视图-控制器设计模式的一个简洁实现,同时在不牺牲开发能力和灵活性的前提下提供高效的以组件为中心的开发,解决了 Java Web 开发的许多历史问题。
JSF的主要优势之一就是它既是Java Web用户界面标准又是严格遵循模型-视图-控制器 (MVC) 设计模式的框架。
(1)视图设计:JSF提供了一组丰富的、可重用的服务器端用户界面组件,并将组件与应用层的JavaBean绑定.
(2)模型设计:JSF技术做到了应用程序逻辑和表示的完全分离。根据页面中组件需要处理的业务逻辑而设计实现JavaBean程序来实现的。在JSF中使用JavaBean可以直接在JSF页面中声明或者在配置文件faces-config. xml中声明。
(3)控制器设计:JSF的控制器设计是在配置文件中完成的,相关的主要有两个文件:web.xml文件和faces- config.xml文件(均在WEB-INF目录下)。web.xml文件主要用于控制JSF的生命周期,实现部署描述符。faces- config.xml文件实现导航,在文件中控制页面之间的跳转流程。
JSF网页设计者只需要专注于页面的设计;应用程序开发者主要关心Model部分的JavaBean的开发;程序的流程控制则由faces-config.xml专门配置。
JSF 特点:
1.POJO
POJO是Plain Ordinary Java Objects的缩写不错,但是它通指没有使用Entity Beans的普通java对象,其中有一些属性及其getter setter方法的类。可以把POJO作为支持业务逻辑的协助类。“ 普通的对象缺少一个响亮的名字,因此我们给它们起了一个,并且取得了很好的效果。”——Martin Fowler
2.Managed Bean/Backing Bean
一般地,托管bean被用来表达用户输入,托管bean也是一个真正的IoC容器。当然,谈到IoC,大家肯定会想到目前比较流行的Spring框架,但还有另外两个实现了IoC的框架:HiveMind和PicoContainer,这是目前的三大IoC。
JSF关键特性:组键值与backingbean自动保持一致;
可以通过配置文件初始化属性值。
使用JSF,你现在可以将任何一个含有无参构造函数的Java类,通过将其引用到一个XML配置文件faces-config.xml中注册为一个托管bean。 例如一个Java类(或POJO),名为”User”。我们现在可以将这个Userbean注册到faces-config.xml中:
<managed-bean> <managed-bean-name>userBean</managed-bean-name> <managed-bean-class>com.primeton.jsf.test.User</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> |
我现在可以随时在我的JSF应用中使用这个叫做“userBean”的bean。这个是通过JSF EL表达式来完成的。例如,将一个JSF UI组件绑定到userBean的一个属性上,我可以使用表达式#{userBean.name}作为一个JSF UI组件的参数值。现在,我将userBean的name属性绑定到一个JSF inputText UI组件上:
<h:inputText value="#{userBean.name}"/> |
现在,当组件的值改变时,userBean.name属性也跟着改变。如果userBean.name先改变也是一样。两者将自动保持同步,这是JSF的关键特性。 JSF托管bean的另外一个很重要的特性是它可以通过配置文件来初始化属性。除了管理简单类型的属性,JSF的托管Bean功具还可以处理List和Map这样的属性。
总体上来说,Managed Bean其实就是一个Java类,只不过Java EE容器会将其看作是受管理的组件。 Managed Bean还可以使用容器提供的一些服务,这些服务大多与生命周期管理和资源注入有关。其他的Java EE技术(如JSF、EJB等)和CDI都是建立在Managed Bean这个基本定义之上,只不过增加了额外的服务而已。比如,JSFManaged Bean增加了生命周期范围、EJB Session Bean增加了对事务的支持,而上下文与依赖注入Contexts and Dependency Injection -CDI则增加了对依赖注入的支 持。
JSF2.0中的data都是从managed bean中取出来和放进去的。managed bean的生命周期即此bean可以生存多久。
3.IOC机制,实现POJO对象间的依赖注入(借鉴了spring的思想)
如上所述,托管bean被用来表达用户输入,托管bean也是一个真正的IoC容器。
对于IoC必不可少的一点是对处理生命周期的支持。实际上JSF的托管bean工具对处理生命周期的支持做得非常好,因为它要求为HTTP request定义一个明确的生命周期范围,而在其它IoC容器中,对于这一点的处理则更一般。
JSF有以下几种类型的生命周期范围:
request:这种类型的bean只会将它的值存储在一个单独的请求的整段时期内,对于在同一对象上的并发请求,会实例化一个新的版本。
session:这种类型的bean会被存储在session中,意味着这个bean的属性在多个请求期间会一直存在。对象存储在session中无疑是线程安全的,并且如果不被应 用程序显示的清除掉的话,当session过期后就会终止。
application:一个对象被创建为application范围,将在容器的整个生命周期内一直存在。
none:这种类型的托管bean不会被存储在任何地方,只有当需要它的时候才被创建。
限定条件如下:
using bean必须的生命周期小于或者等于被引用的needed bean
using bean必须具有setter方法,以needed bean作为参数
beans不能管理彼此的依赖。
4.组件/tags的使用
二、 事件驱动的JSF应用。
JSF应用就是Servlet/JSP应用,JSP 页面是 JSF 应用的用户接口。 JSF 区别于其它 servlet/JSP 应用的最重要的特点:事件驱动。
jsf应用是事件驱动的,通过写一个事件监听类来决定某事发生时(点击按钮ActionEvent、值变化 ValueChangeEvent)时有什么反应。 每当用户做任何事情,如点击按钮或者提交表单,都有事件产生。然后事件消息通过 HTTP 传到服务器。在服务器端,是一个配置了叫做 Faces servlet 的特 殊 servlet 的 WEB 容器。所有的HTTP请求都指向这个Faces servlet 。
那你怎样通过调用 Faces servelt 来处理每个 HTTP 请求呢?
-----配置描述文件 web.xml
<web-app>
<!-- Faces Servlet : 元素注册 Faces servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<!-- Faces Servlet Mapping:声明任何包含有 /faces/ 式样的请求地址,必须传递给 Faces servlet -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
</web-app>
在这个配置描述文件中有二个部分。 元素注册 Faces servlet , 元素声明任何包含有 /faces/ 式样的请求地址,必须传递给 Faces servlet 。
三、生命周期
JSF 程序生命周期的 6个阶段如下(注意每个阶段的事件处理):
恢复视图
应用请求的值
处理验证:
更新模型值
调用程序
进行响应
一个简单的例子(有项目目录) :http://www.iteye.com/topic/1056919