经典Java EE企业应用实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 下载和安装JSF

目前,JSF有两个比较成熟的实现:一个是Sun的JSF参考实现,简称JSF RI;还有一个就是Apache组织的实现——MyFaces。通常认为,JSF RI比较权威,是官方的参考实现;MyFaces在完全实现了JSF RI的基本功能之外,还提供了许多额外的组件库,这一点是MyFaces的吸引力。但从用法角度来看,JSF RI和MyFaces并无太大的区别。

下面以JSF RI作为JSF的实现来介绍JSF的下载和安装,下载和安装JSF按如下步骤进行即可。

1 登录https://javaserverfaces.dev.java.net/站点,下载JSF 1.2版,该版本的JSF才是Java EE 5所包含的JSF规范。

至笔者成书之时,JSF 1.2的最新稳定版本是JSF 1.2_14,这也是本书所使用的JSF版本。

2 下载完成后得到一个mojarra-1.2_14-binary.zip压缩文件,将该文件解压出来,得到如下文件结构:

javadoc:该路径下保存了JSF项目的API文档。通常我们没必要单独参考此处的API文档,因为此处的API文档只是Java EE 5 API文档的子集。

lib:该路径下包含了两个重要的JAR包,即jsf-api.jar和jsf-impl.jar,其中前者代表JSF规范的API,而后者则是Sun为JSF提供的JSF RI实现。

samples:该路径下保存了JSF RI的示例程序。

tlddocs:该路径下保存了JSF RI标签库的说明文档。

LICENSE等相关文档。

3 使用过其他Java开源项目的读者可能很清楚,安装项目的关键就是将JAR复制到应用类加载路径里,以Web应用为例,就应该复制到Web应用的WEB-INF/lib路径下。但此处是否需要将jsf-api.jar和jsf-impl.jar复制到Web应用的WEB-INF/lib路径下则存在一些分歧:

如果使用普通Web服务器如Tomcat、Jetty等,因为它们并未提供JSF支持,那就需要将这两个JAR包复制到Web应用的WEB-INF/lib路径下。

如果使用本身已经提供JSF支持的应用服务器,例如JBoss,那就无须将这两个JAR包复制到Web应用的WEB-INF/lib路径下(复制了甚至可能导致JAR包冲突的异常)。

如果使用本身没有提供JSF支持的应用服务器,例如WebLogic,则还需要将这两个JAR包复制到Web应用的WEB-INF/lib路径下。

注意

因为JBoss服务器和WebLogic服务器对JSF的支持存在一些差异,因此本书光盘提供Web应用源代码时,可能会分别提供两个版本;有些项目则提供了满足一个应用服务器的版本,这一点请读者务必注意。

4 由于JSF还需要依赖于JSTL(JSP标准标签库),因此读者还需要登录http://jakarta.apache.org/taglibs/index.html下载JSTL项目,并将该项目里包含的jstl.jar复制到Web应用的WEB-INF/lib目录下。

5 与其他MVC框架类似,为了在Web应用中使用MVC框架,我们还需要修改Web应用的配置描述文件:web.xml,通过该文件来加载JSF框架。将web.xml文件改为如下形式即可:

      <?xml version="1.0" encoding="GBK"?>
      <!-- 配置Web应用配置文件的根元素,并指定配置文件的Schema信息 -->
      <web-app xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
          <!-- 指定JSF的配置文件所在的位置 -->
          <context-param>
              <param-name>javax.faces.CONFIG_FILES</param-name>
              <!-- 多个配置文件之间以“,”隔开 -->
              <param-value>/WEB-INF/faces-config-beans.xml
                  ,/WEB-INF/faces-config-nav.xml</param-value>
          </context-param>
          <!-- 配置JSF程序状态的保存位置 -->
          <context-param>
              <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
              <!-- 将程序状态保存在客户端 -->
              <param-value>client</param-value>
          </context-param>
          <!-- 配置JSF的核心控制器:FacesServlet  -->
          <servlet>
              <servlet-name>FacesServlet</servlet-name>
              <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
              <load-on-startup>1</load-on-startup>
          </servlet>
          <!-- 配置JSF核心FacesServlet的映射 -->
          <servlet-mapping>
              <servlet-name>FacesServlet</servlet-name>
              <url-pattern>*.jsf</url-pattern>
          </servlet-mapping>
      </web-app>

上面粗体字代码指定所有以*.jsf结尾的请求都将交给FacesServlet处理,而FacesServlet就是JSF的核心控制器,它负责拦截所有的用户请求,并将其分发对应的托管Bean——当然,这些过程对开发者完全透明。

提示

本书没有包含如何创建Web应用、如何编写web.xml配置描述文件、如何编写JSP、Servlet等知识,如果读者对Java Web编程,比如对web.xml文件、JSP、Servlet等知识尚不熟悉,建议先阅读疯狂Java体系的《轻量级Java EE企业应用实战》一书。

6 为了可以在命令行窗口正常编译JSF程序,建议将jsf-api.jar添加到CLASSPATH环境变量中。但由于我们前面已经安装过Java EE SDK,并在CLASSPATH环境变量中添加了javaee.jar,而jsf-api.jar只是javaee.jar的子集,因此无须将jsf-api.jar添加到CLASSPATH环境变量中。

7 在Web应用中安装JSF标签库。

对于使用支持Servlet 2.4以上规范的Web容器,我们无须修改web.xml文件;如果希望在JSP页面中使用JSF标签库,则可以直接在JSP页面中使用如下两行来导入JSF标签库。

      <!-- 导入JSF标签库-->
      <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
      <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

从上面代码可以看出,此处是导入JSF标签库的代码,这意味着JSF必须为上面两个标签库提供TLD(标签库定义)文档,用WinRAR打开JSF的lib路径下的jsf-impl.jar文件,进入META-INF路径下,看到如图2.4所示的结构。

图2.4 jsf-impl.jar文件的内部结构

从如图2.4所示的结构中可以看出,JSF RI的标签库定义文件放在jsf-impl.jar的META-INF路径下,对于使用Servlet 2.4以上规范的Web应用,会自动读取每个JAR文件的META-INF路径下的所有*.tld(标签库定义)文件。

查看如图2.4所示的html_basic.tld文件内容,看到如下所示的代码片段:

      <taglib xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
          version="2.1">
          <tlib-version>1.2</tlib-version>
          <short-name>h</short-name>
          <uri>http://java.sun.com/jsf/html</uri>
          ...
      </taglib>

正如在上面代码中所看到的,html_basic.tld文件配置的标签库的URI是http://java.sun.com/jsf/html,对于使用Servlet 2.4以上规范的Web应用,它们会自动读取JAR文件里的TLD文件,并识别到其中的URI信息。

注意

如果开发者使用JSF 1.2,则必须使用Java 1.5或更高版本,并需要Web服务器支持JSP 2.1和Servlet 2.5等规范。因此当我们决定使用JSF 1.2后,我们必须选用支持它的服务器,比如Tomcat 6.0、JBoss 5.0及以上版本。如果在Servlet 2.4以上规范的Web应用中使用JSF标签库,只需将包含标签库定义文件的JAR文件复制到Web应用的WEB-INF/lib路径下即可。因为Web应用会自动读取WEB-INF/lib路径下的JAR文件,并识别到其中包含的标签库信息。

经过上面的步骤,我们已经为Web应用增加了JSF支持,接下来介绍JSF的使用入门。