FAQ:
1. JSF跟Spring如何結合?
A: 通過(guò)在faces-config配置文件中加入
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
</application>
可以使JSF跟Spring結合。
2. 為何稱(chēng)JSF是基于event的?而Struts是基于請求驅動(dòng)或者Command驅動(dòng)。
A: JSF是以頁(yè)面組件為中心的,而頁(yè)面組件是面向事件的。JSF只有commandButton,commandLink這兩個(gè)UI組件是基于事件的,可以設定action屬性,而該屬性便是調用后臺managed-bean的對應方法。
不過(guò)ASP.NET是所有UI組件都是面向事件的。
而其他UI組件,可以通過(guò)設定value屬性,來(lái)調用后臺managed-bean的對應方法,獲取其返回值。例如:
<h:outputText value="#{testBean.creationTime}"/>
如果獲取的返回值是一個(gè)自定義類(lèi)型或者List,如何進(jìn)行取自定義類(lèi)型的屬性或者迭代?
可以通過(guò)類(lèi)似EL(稱(chēng)為JSF-EL)的方式來(lái)獲取嵌套屬性的值??梢酝ㄟ^(guò)#{purchases.cheapItems[2]}或者
#{purchases.valuableItems["low"]}獲取List的值。
3. JSF的訪(fǎng)問(wèn)路徑的機制?
A: JSF是以頁(yè)面組件為中心的,類(lèi)似ASP.NET。所以要訪(fǎng)問(wèn)JSF的應用,實(shí)際上是直接訪(fǎng)問(wèn)JSP頁(yè)面。不過(guò)對xx.jsp的訪(fǎng)問(wèn)路徑要修改成xx.faces。(類(lèi)似ASP.NET去訪(fǎng)問(wèn)xx.aspx)
4. JSF是否有interceptor等攔截器機制?如何在managed-bean中使用Servlet的API?
A: JSF可以在頁(yè)面增加actionListener,類(lèi)似interceptor的機制。
Servlet的API可以通過(guò)FacesContext,例如:
FacesContext fc = FacesContext.getCurrentInstance();
fc.getExternalContext().getResponse();
fc.getExternalContext().getRequest();
5. JSF可否結合其他JSP標簽?結合ajax是否方便?在頁(yè)面層結合Scriptlet是否方便,可否跟request的Attribute等結合使用?
A: JSF可以使用其他JSP標簽以及JSTL。JSF通過(guò)EL取值和通過(guò)JSF-EL取值是效果一樣的。例如
<LI>Employee's first name: ${employee.name.firstName}
跟<LI>Employee's first name: <h:outputText value="#{employee.name.firstName}"/> 作用一樣。
JSF后臺managed-bean的返回值實(shí)際上是放在request的Attrubite中,key為其屬性名。所以可以直接在JSP的Scriptlet中與request的Attribute等結合使用。
6. JSF的MVC框架與Struts框架的異同?
A: JSF的MVC框架跟ASP.NET類(lèi)似,是以頁(yè)面組件為中心的。 要先訪(fǎng)問(wèn)指定的jsp相關(guān)的faces然后再跳轉到Controller最后再到View。如下圖所示:
Struts的MVC框架是 Controller(action)->View(JSP)
JSF的MVC框架是 View(*.faces)->Controller(managed-bean)->View(JSP)
7.JSF能否實(shí)現類(lèi)似Struts的 action(or servlet)->view(JSP)?跟.faces相關(guān)的jsp能否隱藏起來(lái)?
A: 都不能。
8.JSF的<managed-bean>可以實(shí)現對actionBean的設值注入。
9.配置文件的分離,通過(guò)在web.xml中設置
<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>
10.JSF跟ASP.NET的一些區別。
ASP.NET頁(yè)面控件的name跟id 是跟自命名是一致的。例如:
<input name="TextBox1" type="text" value="ss" id="TextBox1" />
11.JSF如何傳遞頁(yè)面參數?
A: 通過(guò)<h:commandLink action="viewProduct" styleClass="highLightLink">
<h:outputText value="view"/>
<f:param name="productId" value="#{productBean.id}"/>
</h:commandLink>
這種方式是通過(guò)post來(lái)傳遞參數的。對于url參數只能在backingBean中,通過(guò)如下代碼獲取
FacesContext fc = FacesContext.getCurrentInstance();
String id = (String) fc.getExternalContext().getRequestParameterMap().get("id");
JSF的優(yōu)缺點(diǎn):
我認為JSF的優(yōu)缺點(diǎn)都是因為這個(gè)框架是以頁(yè)面組件為中心。
優(yōu)點(diǎn):可以利用一些功能強大的UI組件,這些UI組件是服務(wù)器端,并且基于事件的??梢苑奖愕囟x事件響應方法。
缺點(diǎn):太依賴(lài)于UI組件。目前尚沒(méi)有可以跟vs.net媲美的IDE來(lái)支持基于UI組件的開(kāi)發(fā)。所以開(kāi)發(fā)和配置起來(lái)還是有些麻煩,而且開(kāi)發(fā)自定義的UI組件更加復雜。
因為依賴(lài)于UI組件,所以頁(yè)面層的開(kāi)發(fā)不夠靈活。
因為依賴(lài)于UI組件,所以很多原始的html標簽不能用。這導致美工設計的靜態(tài)頁(yè)面,到程序員這邊還要經(jīng)過(guò)不小的調整,而不像其他web框架那樣結合方便。
JSF的標準標簽包括以下幾個(gè)類(lèi)別:
輸出(Outputs)
其名稱(chēng)以output作為開(kāi)頭,作用為輸出指定的訊息或綁定值。
輸入(Inputs)
其名稱(chēng)以input作為開(kāi)頭,其作用為提供使用者輸入字段。
命令(Commands)
其名稱(chēng)以command作為開(kāi)頭,其作用為提供命令或連結按鈕。
選擇(Selections)
其名稱(chēng)以select作為開(kāi)頭,其作用為提供使用者選項的選取。
其它
包括了form、message、messages、graphicImage等等未分類(lèi)的標簽。
JSF的頁(yè)面組件的屬性中,都沒(méi)有name這個(gè)屬性。 這些標準標簽都可以設定id、styleClass等屬性值。
如果自定義JSF的頁(yè)面組件,一般會(huì )用到以下的類(lèi):
javax.faces.component.UIComponent
自定義Component所要繼承的父類(lèi)別,但通常,您是繼承其子類(lèi)別,例如UIInput、UIOutput等等。
javax.faces.webapp.UIComponentTag
自定義JSF標簽所要繼承的父類(lèi)別,繼承它可以幫您省去許多JSF標簽處理的細節。
javax.faces.context.FacesContext
包括了JSF相關(guān)的請求信息,您可以透過(guò)它取得請求對象或請求參數,或者是Application對象。
javax.faces.application.Application
包括了一個(gè)應用程序所共享的信息
如果安裝了myeclipse,jsp頁(yè)面中只要包含有jsf的taglib(如下所示),則會(huì )自動(dòng)打開(kāi)JSF的Designer
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
JSF跟Struts2的整合
JSF可以跟Struts2進(jìn)行整合,具體參考《Struts 2權威指南》
后臺可以使用Struts2的Action類(lèi),這些類(lèi)因為可以有Spring來(lái)管理,更具有可測試性。
前臺頁(yè)面依舊使用JSF的頁(yè)面組件。
只要加入struts2和jsf的lib包以及struts2-jsf-plugin-2.**.jar
然后簡(jiǎn)單修改web.xml以及在struts.xml中加入相應的interceptors即可,而不需要faces-config.xml配置文件。
<package name="jsf" extends="jsf-default">
<interceptors>
<interceptor-stack name="jsfFullStack">
<interceptor-ref name="params" />
<interceptor-ref name="basicStack"/>
<interceptor-ref name="jsfStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="jsfFullStack"/>
</package>
聯(lián)系客服