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的使用入门。