JSF 的实作参考档案可以至 http://java.sun.com/j2ee/javaserverfaces/download.html 进行下载。 JSF 是一个技术标准,各个厂商可以根据标准的规范来进行自己的实作版本,Sun 网站上提供的 是 Sun 公司的实作参考版本。
对于要实作的第一个 JSF 程式,将使用到您下载回来的 jsf‐impl.jar 与 jsf‐api.jar,另外 JSF 需要使 用到 JSTL 的 API ,因 而您 需要 JSTL 的 jstl.jar 与 standard.jar ,除此 之外,您还 需要 commons‐digester.jar、commons‐ collections.jar、commons‐beanutils.jar 等档案,总计您所需要的.jar 如下所示:
• jsf‐impl.jar
• jsf‐api.jar
• jstl.jar
• standard.jar
• commons‐digester.jar
• commons‐collections.jar
• commons‐beanutils.jar
JSF 基本上也是采用 Web MVC 架构,使用 JSF 时担任前端控制器(Front controller)的是 javax.faces.webapp.FacesServlet 类别,您要在 web.xml 定义它,例如:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee → http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd " version="2.4"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class> javax.faces.webapp.FacesServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> </web-app>
在上面的定义中,将所有的".faces"的请求交由 FaceServlet 来处理,FaceServlet 会唤起相对于请 求网址的.jsp 网页,例如请 求是/index.faces 的话,则实际上会唤起/index.jsp 网页,完成以上的 配置,您就可以开始使用 JSF 了,先来撰写一个简单的 Bean 类 别:
package onlyfun.caterpillar; public class User { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
这个 User 类别只是个简单的 JavaBean,用以储存使用者的请求参数值。JSF 与 Struts 虽然都是 Web MVC 架构的实现,但两者所偏重的并不相同,Struts 着重的是控制物件的设计;JSF 则着重 于页面流程的设计,也就是定义在何种条件成立下,上一个页 面与下一个页面之间是如何连结, 您可以在 faces‐config.xml 中定义页面流程,例如:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN""http://java.sun.com/dtd/web-facesconfig_1_0.dtd"> <faces-config> <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class> onlyfun.caterpillar.User </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
在<navigation‐rule>标签中定义了页面流程,当页面流程上一个页面是来自<from‐view‐id>标签中 指 定的页面,并且请求中包括了<navigation‐case>标签中的<from‐outcome>标签指定的"login" 值 时,则会将请求导向至<to‐view‐id>标签中所指定的页面。
在上面的定义中也可以看到,JSF 也协助 Bean 物件的管理,只是功能上比 Spring 容器少了许多; 在<managed‐bean>标签中 可以管理 Bean 物件,可设定 Bean 物件的存活范围为"session",也就 是使用者开启浏览器与 Web 程式互动的会话阶段期间,Bean 都可以存在 作用。
接下来要告诉网页设计人员的资讯是,他们可以使用的 Bean 名称,也就是<managed‐bean‐name> 标签中设定的"user"名称,以及上面所定义的页面流程,在使用页面元件时需要设定这些值,例 如网页设计人员会撰写以下的 JSP 网页:
<%@page contentType="text/html"%> <%@page?pageEncoding="UTF-8"%> <%@taglib?uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib?uri="http://java.sun.com/jsf/html" prefix="h" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>第一个 JSF 程式</title> </head> <body> <f:view> <h:form> <h3>请输入您的名称</h3> 名称: <h:inputText value="#{user.name}"/><p> <h:commandButton value="送出" action="login"/> </h:form> </f:view> </body> </html>
在上面的网页中使用了 JSF 的"core"与"html"标签库,"core"是有关于 UI 元件的处理,而"html"则 是有关于 HTML 的进阶标签。
当您要开始使用 JSF 元件时,这些元件一定要在<f:view>与</f:view>标签之间;"html"标签库中几 乎都是与 HTML 标签相关的进阶标签,<h:form>会产生一个表单,使用<h:inputText>来显示 faces‐ config.xml 定义档中"user"这个 Bean 物件的"name"属性,而<h:commandButton>会产生一个提交 按钮, 在 "action" 属性 中之 指定 将根据 faces‐config.xml 中定义的 "login" 页面流程中前往 welcome.jsp 页面,其设计如下:
<%@page contentType="text/html"%> <%@page?pageEncoding="UTF-8"%> <%@?taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@?taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>第一个 JSF 程式</title> </head> <body> <f:view> <h:outputText value="#{user.name}"/> 您好! <h3>欢迎使用 JavaServer Faces!</h3> </f:view> </body> </html>
<h:outputText>标签可以取得"user"这个Bean物件的"name"属性,这个属性将包括先前index.jsp中 所送出的请求参数值,而在这个网页中则将之显示出来。
有兴趣的话,您可以在 JSF 学习笔记 找到更多有关于JSF的介绍。