JSF应用中,在web.xml里面配置了一个Servlet,叫做javax.faces.webapp.FacesServlet,于是可以知道,查看、了解一个请求的处理过程可以从这里开始。从官方网站上下载JSF的源代码,项目名比较古怪,叫做“mojarra”,我看的版本是1.2_12_b01.里面包含了两个子项目,一个是jsf-api,里面大多是接口以及少量关键类。另外一个项目叫做jsf-ri,对着这个"ri"邪念了半天之后,终于在兄弟提醒之下想明白了是reference implementation的意思。jsf-api是JavaEE标准的一部分,里面的类型包名都是以javax.faces开头的,而jsf-ri项目是sun针对JSF标准的一个参考实现,里面的类型的包名都是以com.sun.faces开头的。
1.FacesServlet初始化(FacesServlet#init)
系统启动的时候,会初始化FacesServlet,调用其中的init方法。里面主要做了两件事情,一个是初始化FacesContextFactory,另外一个是初始化Lifecycle对象。在jsf-api项目中,FacesServlet类是一个Servlet接口的实现类,而FacesContextFactory和Lifecycle都是接口。在jsf-ri项目中有这两个接口的实现类,分别是com.sun.faces.context.FacesContextFactoryImpl和com.sun.faces.lifecycle.LifecycleImpl类。一个想当然的事实:FacesServlet初始化的时候要根据一些配置来判断具体的FacesContextFactory和Lifecycle实现类是什么,也就是在这里,“JSF标准”和“JSF实现”接轨了。想来MyFaces等等的其他JSF实现应该不外乎两种方式,一种是改变FacesServlet的init方法中需要用到的配置的值,于是启用自己的FacesContextFactory实现和Lifecycle实现,后面的处理过程就全部走自己的逻辑了。第二种方法笨一点,可能性不大,就是把FacesServlet覆盖替换掉,其中也不需要读什么配置了,直接使用自己的实现类即可——不过这种做法估计不符合JSF规范,想来只有我等虾米民众能做的出来。主要代码如下:
1 facesContextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
2 LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
回头再来看初始化的结果,FacesContextFactory很明显是用来生产FacesContext这么个东西的。而FacesContext可以看做是一个RequestWrapper(注意这个FaceContext和ServletContext不一样,ServletContext是一个Web应用只有一个的全局对象,对应的是一个Web application,而一个FacesContext对应的是一个request,另外,RequestWrapper这个说法不严格,实际上FacesContext里面也包装了ServletContext、Response等)。而LifeCycle可以看做是一个过滤器链(类似于servlet规范里面的Filter Chain)。于是,整个JSF请求处理过程,实际上就是包装成为FaceContext的用户请求,通过类似于一个Filter Chain的LifeCycle的过程。
分享到:
相关推荐
2. **FacesServlet**:JSF的核心是FacesServlet,它是处理所有JSF请求的入口点。当用户与JSF页面交互时,请求会被转发到FacesServlet,该Servlet负责解析请求,执行相应的动作,更新模型,并呈现响应。 3. **...
9. **FacesServlet**: 这是JSF应用的核心Servlet,负责处理所有的JSF请求,并调用相应的生命周期阶段。 使用`jsf-api.jar`,开发者可以轻松地整合其他Java EE技术,如EJB(Enterprise JavaBeans)、JPA(Java ...
- `commons-digester-2.0.jar` 用于解析XML文档,常在配置或初始化过程中使用。 - `commons-logging-1.1.1.jar` 是一个通用的日志抽象层,允许选择不同的日志实现。 - `jstl.jar` 包含JSTL (JavaServer Pages ...
2. **生命周期**:解释JSF组件的生命周期,包括初始化、处理请求、应用转换和验证、更新模型值、以及渲染响应等阶段。 3. **视图和导航**:讨论JSF如何处理页面间的导航,包括使用`<h:commandLink>`和`<h:button>`...
4. **生命周期**:JSF有自己的一套请求处理生命周期,包括初始化、应用请求值、过程验证、更新模型值、调用应用逻辑和渲染响应等阶段。JSF 1.2优化了这个生命周期,提供了更多的控制点和错误处理机制。 5. **...
2. **生命周期**:JSF应用遵循一个特定的生命周期,包括初始化、恢复视图、应用请求值、处理验证、更新模型值、调用应用逻辑和渲染响应等阶段。 3. **EL(Expression Language)**:JSF使用EL来访问后台bean中的属性...
- **生命周期**:JSF 生命周期定义了从用户请求到响应的处理流程,包括初始化、应用请求值、处理验证、更新模型值、调用应用程序业务逻辑和渲染响应等阶段。开发者可以插入自定义的行为来影响这个过程。 3. **JSF ...
它们在Web应用程序启动时由FacesServlet初始化,且在整个应用程序生命周期中只实例化一次。这种模式减少了内存占用,提供了对象的全局访问,并确保如`NavigationHandler`和`ViewHandler`等关键组件的一致性。 2. **...
所有的JSF请求都会被转发到FacesServlet进行处理。 4. **生命周期**:JSF有自己的一套组件生命周期,包括初始化、应用请求值、处理验证、应用模型值、更新模型值、渲染响应等阶段。理解这个生命周期对于调试和优化...
- **Lifecycle**:JSF组件有其生命周期,包括初始化、处理请求、应用模型、更新视图等阶段。 **3. 安装与配置** 要开始使用JSF,你需要在项目中添加JSF库,并配置Web.xml文件以启用JSF支持。这通常涉及设置`...
在结合JSF和Spring时,通常会利用Spring的`FacesServlet`适配器,使得JSF的请求处理能够与Spring的IoC(Inversion of Control,控制反转)容器和AOP(Aspect-Oriented Programming,面向切面编程)功能集成。...
6. **Lifecycle**:JSF有自己的一套生命周期,包括初始化、恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑、渲染响应等阶段。 7. **Converter**和**Validator**:这些接口允许自定义数据转换和验证...
书中可能详细介绍了JSF的生命周期,包括初始化、渲染响应和回发请求等阶段。每个阶段都有特定的任务,例如在应用请求值阶段,JSF会将表单数据映射到对应的组件属性;在处理验证阶段,会检查用户输入是否符合预设规则...
- **生命周期阶段**:JSF组件经历了初始化、应用请求值、处理验证、更新模型值、调用应用动作和渲染响应等六个阶段,这些在源代码中都有明确的体现。 2. **MyEclipse 配置与源码关联** - **导入源码**:首先,你...
**FacesContext** 是JSF的核心上下文对象,它在整个JSF请求处理过程中持有重要的信息,如当前的请求、响应、视图状态等。开发人员可以通过它来访问请求参数、设置消息、获取当前用户会话等。 综上所述,JSF是一个...
在JSF配置文件(通常是`faces-config.xml`)中,可以定义Bean的属性、作用域和初始化方法。Bean的作用域决定了其生命周期,比如,`request`作用域的Bean只在一次HTTP请求内有效,而`session`作用域的Bean在整个会话...
4. **生命周期管理**:JSF具有明确的组件生命周期,包括初始化、应用请求值、处理验证、更新模型值和渲染响应等阶段,这使得处理用户输入和更新服务器端状态变得更加有序。 5. **转换和验证**:JSF提供了内置的验证...
Managed Beans是一种轻量级的Java对象,它们在JSF环境中被创建、初始化和管理,可以用来封装业务数据和行为。 2. **视图(View)**:视图层是用户看到和与之交互的部分。JSF提供了一系列UI组件,如输入字段、按钮、...
7. **FacesServlet**:JSF的核心Servlet,负责处理所有的JSF请求,根据配置的导航规则转发到对应的页面。 8. **EL(Expression Language)**:EL是一种轻量级的脚本语言,用于在JSF中获取和设置bean的属性值。它...