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