JSF 探索 (1)
雖然JSF已經(jīng)出來好久了,而且好像感覺不是很潮流的框架了,然后當(dāng)我看見他的時候,我覺得他的思想很好,而且隨著手機(jī)等client多樣化的出現(xiàn),我相信人們
必將重新拾起JSF的思想。
JSF說白了是事件驅(qū)動,web以前的時代我估計大部分都是事件驅(qū)動的開發(fā)模式,而web的出現(xiàn),使人們更多關(guān)注瀏覽器上面的渲染,以及servlet和http的操作上。
web2.0的出現(xiàn),使人們感覺在瀏覽器上的操作更像以前c/s結(jié)構(gòu)的操作,而手機(jī)client的熱捧更能體現(xiàn)未來多種客戶端訪問server的模式即將到來,也許大家開始
在想如何做新的框架,其實這種想法已經(jīng)out了,JSF里面早就有這個思想了,你只需要去關(guān)注JSF不就ok了?
任何《* in action》的書總是讓programmer 興奮,同樣JSF in Action也是一本不錯的書,讓我們一起去看看它把。
1.JSF 關(guān)鍵詞
UI component :靜態(tài)對象,它保存在server端,其實本身UI Component是javabean對象,他具有javabean具備的屬性,methods和events。通常多個component被組織為一個頁面的視圖
Renderer:渲染器,renderer被用作渲染component,以及將用戶的輸入轉(zhuǎn)換為component的值。特別當(dāng)不同類型的client端,比如手機(jī),那么對應(yīng)的就有手機(jī)相應(yīng)格式的renderer。
Validator:負(fù)責(zé)驗證用戶輸入值的可靠性,單個UI component可以對應(yīng)一個或多個Validator.
Backing beans:后臺的javabean,做一些邏輯處理什么的,存儲component的值,實現(xiàn)事件監(jiān)聽器,他可以引用component。
Converter:顯示轉(zhuǎn)換器,比如時間格式的顯示,一個component可以對應(yīng)一個converter
Events and listeners:事件和監(jiān)聽器
Messages:顯示給用戶的信息
Navigation:一個頁面到另外一個頁面的向?qū)А?/p>
2.JSF請求的六個階段
Phase 1: Restore View
構(gòu)建視圖頁面供用戶輸入或查看
Phase 2: Apply Request Values
獲取請求值
Phase 3: Process Validations
可以對請求值進(jìn)行驗證
Phase 4: Update Model Values
更新back bean 的值
Phase 5: Invoke Application
調(diào)用應(yīng)用,執(zhí)行相應(yīng)的監(jiān)聽器
Phase 6: Render Response
將response根據(jù)要求進(jìn)行包裝后返回給用戶,這里的包裝是指知道的頁面技術(shù),比如html,比如手機(jī)展現(xiàn)技術(shù)
3.client and server component id
server component id可以在component 的id屬性中顯性填寫id,以便在服務(wù)端能唯一標(biāo)識該組件
client id 是繼承server component id,他最后體現(xiàn)的也是html 中的標(biāo)簽,而id也為對應(yīng)標(biāo)簽的id,與server component id不同的是,他有繼承關(guān)系,比如
<form id="myForm" method="post"
action="/jia-standard-components/client_ids.jsf"
enctype="application/x-www-form-urlencoded">
<p>
<input type="text" name="myForm:_id1" />
</p>
<p>
<input id="myForm:inputText" type="text" name="myForm:inputText" />
</p>
...
</form>
而對應(yīng)的服務(wù)端
<p>
<h:outputText id="outputText" value="What are you looking at?"/>
</p>
<h:form id="myForm">
<p>
<h:inputText/>
</p>
<p>
<h:inputText id="inputText"/>
</p>
...
</h:form>
4.JSF EL 表達(dá)語言: 他是基于JSTL的描述
此外Jsp中application,session,page 四個scoped變量,只有page jsf中不支持
除了上面三個scoped變量,jsf還有下面一些隱性的變量
applicationScope:從application中獲取對象,比如#{applicationScope.myVariable} myVariable對象存放在application中
cookie:從cookie中獲取數(shù)據(jù)
facesContext:這個jsp2.0中沒有,當(dāng)前請求的faceContext實例
header:http head頭信息,比如#{header['User-Agent']}
headerValues:多個head頭信息的載體 比如#{headerValues['Accept-Encoding'][3]}
initParam:初始化的一些參數(shù)比如servlet context initialization parameters 可以這樣使用#{initParam.adminEmail}
param:等同jsp中的request.getParameter() 用法#{param.address}
paramValues:等同jsp中的request.getParameterValues 用法#{param.address[2]}
requestScope等同于jsp中reqeust 用法#{requestScope.user-Preferences}
sessionScope等同于jsp中session 用法#{sessionScope['user']}
view 這個變量jsp2.0中沒有,它表示當(dāng)前視圖,它有三個屬性viewId,renderKitId, and locale 用法#{view.locale}
5.需要的jar包和文件
構(gòu)建jsf環(huán)境需要jsf-api.jar,jsf-impl.jar,jstl.jar,standard.jar 以及配置文件faces-config.xml
需要在web.xml 中配置faceservlet
<web-app>
...
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
...
</web-app>
web.xml 中jsf定義的上下文的參數(shù)有
javax.faces.CONFIG_FILES
javax.faces.DEFAULT_SUFFIX
javax.faces.LIFECYCLE_ID
javax.faces.STATE_SAVING_METHOD
RI-specific configuration parameters:
com.sun.faces.NUMBER_OF_VIEWS_IN_SESSION
com.sun.faces.validateXml
com.sun.faces.verifyObjects
比如
<web-app>
...
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/navigation.xml,/WEB-INF/RegistrationWizard.xml</
param-value>
</context-param>
...
<web-app>
除了web.xml jsf相關(guān)的參數(shù),本身jsf具有faces-config.xml 具體里面的配置屬性可以查看配置文件,可以找可視化工具進(jìn)行配置。