JavaServer Pages(JSF) 在 Java 的 WEB 編程中已經被認為是下一個重大的事件
通過 JSF
你可以在網頁上使用 WEB 組件
來捕獲用戶行為產生的事件
不遠的將來
Java 工具將支持這個技術
開發 WEB 應用程序將與我們現在開發 SWING 程序類似
拖放控件
寫事件偵聽器
本文是一個 JSF 的簡要介紹
並且提供一個 JSF 的例子
用來展示 JSF 的事件驅動特性
要理解本文
您需要對 servlets
JSP
JavaBeans
與標簽庫有一定的理解
首先
一個 JSF 應用就是一個 servlet/JSP 應用
它有一個配置描述符
有 JSP 頁面
客戶定制標簽
靜態資源等等
不同的是
JSF 應用是事件驅動的
你通過寫一個事件偵聽類來決定應用程序的行為
以下建立一個 JSF 應用所需要的幾個步驟
建立 JSP 頁面
用 JSF 組件包裝 HTML 元素
寫一個 JavaBean 用來保持用戶輸入與組件數據的狀態
寫一個事件偵聽器來決定當某事件發生時應該有什麼反映
比如用戶點擊了一個按鈕或者提交了表單
JSF 支持兩個事件
ActionEvent 與 valueChangeEvent
ActionEvent 是針對用戶提交表單與點擊按鈕的
而 valueChangeEvent 是當一個 JSF 組件改變了時觸發
現在
讓我們來看一下 JSF 動作的細節
JSF 怎樣工作 JSP 頁面是 JSF 應用的用戶接口
每個頁面包括一些 JSF 組件用來描述 WEB 控件
如表單
輸入框
按鈕等等
組件可以嵌入另一個組件中
正如輸入框可以在表單中
每個 JSP 頁面就這樣表示為組件樹
JaveBeans 從用戶的請求中獲取數據並存儲
這是有意思的部分
每當用戶做任何事情
如點擊按鈕或者提交表單
都有事件產生
然後事件消息通過 HTTP 傳到服務器
在服務器端
是一個配置了叫做 Faces servlet 的特殊 servlet 的 WEB 容器
Faces servlet(javax
faces
webapp
FacesServlet)是所有 JSF 應用的引擎
每個 JSF 應用在 WEB 容器中都有獨立的 Faces servlet
另一個重要的對象是 ntext
FacesContext
它包括了所有關於當前用戶請求的必要信息
Faces servlet 的後台處理是相當復雜的
然而你沒有必要了解這些細節
只需要記住
Faces servlet 為 JSP 頁面創建了組件樹
對組件樹的控制又對應著事件
Faces servlet 知道怎麼去創建組件樹
因為它已經訪問了當前應用中所有的 JSP 頁面
Faces servlet 還會創建一個 Event 對象
並把它傳遞給所有注冊過的偵聽器
你可以通過與當前請求相對應的 FacesContext 得到這個頁面的組件樹
客戶端浏覽器上 WEB 控件產生的事件
被包含在一個 HTTP 請求中
放在一起還有如浏覽器類型
請求地址等其它信息
因此
所有需要 Faces servlet 處理的請求必須指向這個 servlet
那你怎樣通過調用 Faces servelt 來處理每個 HTTP 請求呢?很容易
只需要在配置描述符裡用一個 servlet
mapping 元素把一個特殊的 URL 式樣映射到 Faces servlet
通常
你會用到 /faces/* 樣式
如下所示
<!
Faces Servlet
>
<servlet>
<servlet
name>Faces Servlet</servlet
name>
<servlet
class>javax
faces
webapp
FacesServlet</servlet
class>
<load
on
startup>
</load
on
startup>
</servlet>
<!
Faces Servlet Mapping
>
<servlet
mapping>
<servlet
name>Faces Servlet</servlet
name>
<url
pattern>/faces/*</url
pattern>
</servlet
mapping>
請求地址必須包含有在 <url
pattern> 元素中描述的樣式
這個要求不容易達到
另外也需要注意的是 <servlet> 元素
它包含 Faces servlet
有一個 <load
on
startup> 元素
用來確是否應用程序第一次啟動時 servlet 是否加載
為了捕獲組件產生的事件
你需要為這個組件寫一個偵聽器
並把它注冊給這個組件
通過在表示組件的客戶端標簽中嵌入 <action_listener> 元素能做到這一點
例如
為了讓一個名叫 jsfApp
MyActionListener 的事件偵聽器
來捕獲一個名叫 submitButton 的命令按鈕產生的事件
在你的 JSP 頁面中寫如下的代碼即可
<h:command_button id=
submitButton
label=
Add
commandName=
submit
>
<f:action_listener type=
jsfApp
MyActionListener
/>
</h:command_button>
一個 action listener 必須實現 javax
faces
event
ActionListener 接口
而一個 value
changed listener 必須實現 java
faces
event
valueChangedLister 接口
下面讓我們來創建一個簡單的 JSF 應用
以展現 JSF 是怎麼樣事件驅動的
一個簡單的 JSF 應用 我們將創建一個簡單的應用
它可以實現對二個數字相加
為了運行這個應用
你需要准備 TOMCAT
與 JSF v
EA
(包含在 Java Web Services Developer Pack (JWSDP)
中)
這個應用程序包括
adder
jsp JSP 頁面
NumberBean 存放用戶數據的 JavaBean
MyActionListener 事件偵聽器
web
xml 配置描述文件
為了使這個應用能正常工作
還需要幾個 jar 文件
包括 JSF 標准實現與其它類庫
如果你安裝了 JWSDP
你就可以在 jsflib 目錄下找到所需要的這些文件
把這些
jar 文件拷貝到 WEB
INF/lib 目錄下
下面是整個的
jar 與
tld 文件列表
jsf
api
jar 包含有 Faces servlet 與其它相關 javax
faces 包下面的類
jfs
ri
jar 是 JSF 的參考實現
jstl_el
jar
standard
jar
此外
一個 JSF 的應用還需要如下的類庫
它們是 Apache Jakarta 項目的一部分
commons
beanutils
jar
commons
digester
jar
commons
logging
jar is
以下的幾小段討論這個 JSF 示例的每個部分
最後的一小段
編譯與運行
解釋 JSF 應用怎麼樣運行
創建目錄結構 首先為你的 JSF 應用創建一個目錄結構
在 TOMCAT 中
它在 webapps 目錄下
圖
描述了叫做 myJSFApp 的應用程序的目錄結構
寫配置描述符 與其它的 servlet/JSP 應用一樣
這個應用程序也需要一個配置描述文件
如
清單
表示
Listing
The deployment descriptor (the web
xml file)
<?xml version=
?>
<!DOCTYPE web
app PUBLIC
//Sun Microsystems
Inc
//DTD Web Application
//EN
app_
_
dtd
;;>
<web
app>
<!
Faces Servlet
>
<servlet>
<servlet
name>Faces Servlet</servlet
name>
<servlet
class>javax
faces
webapp
FacesServlet</servlet
class>
<load
on
startup>
</load
on
startup>
</servlet>
<!
Faces Servlet Mapping
>
<servlet
mapping>
<servlet
name>Faces Servlet</servlet
name>
<url
pattern>/faces/*</url
pattern>
</servlet
mapping>
</web
app>
在這個配置描述文件中有二個部分
<servlet> 元素注冊 Faces servlet
<servlet
mapping> 元素聲明任何包含有 /faces/ 式樣的請求地址
必須傳遞給 Faces servlet
創建 JSP 頁面 一個叫做 adder
jsp 的 JSP 頁面提供用戶接口
如
清單
所示
Listing
The adder
jsp page
<%@ taglib uri=
;; prefix=
h
%>
<%@ taglib uri=
;; prefix=
f
%>
<html>
<head>
<title>Add
numbers</title>
</head>
<body>
<jsp:useBean id=
NumberBean
class=
jsfApp
NumberBean
scope=
session
/>
<f:use_faces><br />
<h:form id=
addForm
formName=
addForm
><br />
First Number:<br />
<h:input_number id=
firstNumber
valueRef=
NumberBean
firstNumber
/><br />
Second Number:
<h:input_number id=
secondNumber
valueRef=
NumberBean
secondNumber
/><br />
Result:
<h:output_number id=
output
valueRef=
NumberBean
result
/><br>
<h:command_button id=
submitButton
label=
Add
commandName=
submit
>
<f:action_listener type=
jsfApp
MyActionListener
/>
</h:command_button>
</h:form>
</f:use_faces>
</body>
</html>
我們首先定義了倆個標簽
它用到 JSF 的兩個標簽庫
html 與 core
這倆個標簽庫的定義可以在 jsf
ri
jar 文件中找到
所以你不用為它擔心
它們的前綴分別是 h / f
<%@ taglib uri=
;; prefix=
h
%>
<%@ taglib uri=
;; prefix=
f
%>
<jsp:useBean> 這個動作元素定義 NumberBean JavaBean 為 session scope
<jsp:useBean id=
NumberBean
class=
jsfApp
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19478.html