ITEEDU

一个 JSF 程式

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 定义它,例如:

•      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 类 别:

•      User.java

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 中定义页面流程,例如:

•      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 网页:

•      index.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 页面,其设计如下:

•      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的介绍。