<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    周游世界

    喂馬, 劈柴, 周游世界

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      28 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks
    JSF詳解(從jsf的運行原理開始介紹了jsf)

    1. ? 結構:
    a) ? ? 結構圖:

    ? ?
    b) ? ? 說明:JSF以MVC模式為基礎,與Struts不同,JSF的目標是希望以一個與Swing相類似的方式來開發網頁,因此,從JSF的結構圖當中,他的核心概念不是頁面,而是控件樹,也就是說,當用戶提交一個請求時,JSF會先將頁面上的組件先轉換為與Swing當中類似的,由容器和控件組成的控件樹,然后數據和事件被設置到對應的控件上,然后以一種與Swing類似的方式,來處理后續的請求。控件樹是整個JSF的核心,所有其他的一切一切都是圍繞著這棵控件樹展開的。
    2. ? 生命周期:
    a) ? ? 周期圖:

    ?
    ? b) ? ? 說明:
    ? b) ? ? 說明:
    ? b) ? ? 說明:
    ? ? ? ? ? ? ? i. ? ? ? ? Restore View:JSF的處理核心是控件樹,他會先將頁面上所聲明的控件轉換為一棵控件樹,后續的操作將在這顆控件樹上進行。為了提高性能,系統會為之前生成的控件樹提供緩存。Restore View的工作就是在緩存當中查找是否存在之前已經生成好的控件樹,如果沒有,則根據頁面的內容,重新生成。
    ? ? ? ? ? ? ii. ? ? ? ? Apply Request Values:把請求當中的數據設置到控件樹當中對應的控件當中去。
    ? ? ? ? ? iii. ? ? ? ? Process Validations:如果某一控件有配置Validator,則這些Validator將對剛設置的數據的正確性和合法性進行驗證。
    ? ? ? ? ? ? iv. ? ? ? ? Update Model Values:控件樹上的控件更新其底層所對應的模型。
    ? ? ? ? ? ? ? v. ? ? ? ? Invoke Application:對產生的事件進行分發。
    ? ? ? ? ? ? vi. ? ? ? ? Render Response:構建作為響應的控件樹。
    3. ? UI:
    a) ? ? 結構圖:



    b) ? ? 控件:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:JSF通過標簽庫,提供了一些主要控件的實現。包括標簽,文本框,單選框,列表等。由于JSF使用一種類似于UI的方式來組織組件,所以,除了基本的組件以外,還提供了一些用于布局的容器,例如面板等。在這里有一個要注意的地方就是,一般情況下,頁面的內容應該放到JSF提供的view標簽里面。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="1">
    <h:outputLabel>
    <h:outputText value="User ID"/>
    </h:outputLabel>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    c) ? ? 事件處理:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:與Struts不同,由于JSF使用以控件樹為中心的方式來處理請求,所以,她提供了一種額外的類似Swing的,事件處理的方式來處理用戶的輸入事件。JSF提供了兩種事件類型,ActionEvent,用于處理命令和ValueChangeEvent,用于處理數據更改。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    模型代碼:
    package nick;
    public class UserActionListener implements ActionListener {
    ? public void processAction(ActionEvent arg0)
    throws AbortProcessingException {
    ? ? FacesContext context = FacesContext.getCurrentInstance();
    ? ? ValueBinding binding = Util.getValueBinding("#{user}");
    ? ? User user = (User) binding.getValue(context);
    ? ? String id = user.getId();
    ? }
    }
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312" import="java.util.*"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="2">
    <h:outputLabel for="id">
    <h:outputText value="User ID"/>
    </h:outputLabel>
    <h:commandButton id="regist" value="注冊">
    <f:actionListener type="nick.UserActionListener"/>
    </h:commandButton>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:通過嵌套actionListener標簽,我們可以為一個控件注冊監視器。

    4. ? 數據綁定:
    a) ? ? 說明:數據綁定要解決的問題就是如何把模型中的值,綁定到頁面的控件上。在JSF當中這可以通過JSF所提供的配置文件來完成。
    b) ? ? 代碼:
    配置文件:
    <faces-config>
    <managed-bean>
    <managed-bean-name> user </managed-bean-name>
    <managed-bean-class> nick.User </managed-bean-class>
    <managed-bean-scope> session </managed-bean-scope>
    </managed-bean>
    </faces-config>
    模型代碼:
    package nick;
    public class User {
    ? private String id = "Nick";
    public void setId(String id) {
    ? ? this.id = id;
    ? }
    ? public String getId() {
    ? ? return this.id;
    ? }
    }
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    ? <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="2">
    <h:outputLabel for="id">
    <h:outputText value="User ID"/>
    </h:outputLabel>
    <h:inputText id="id" value="#{user.id}"/>
    ? ? ? ? ? </h:panelGrid>
    ? ? ? ? </h:form>
    ? ? </f:view>
    ? </body> ?
    </html>
    注:通過配置文件,我們把nick.User類綁定到名稱user上,然后頁面的代碼就可以直接使用#{user.xxx}來引用User這個類中的各個字段。
    5. ? 頁面流:
    a) ? ? 頁面到控制器:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:JSF通過使用方法綁定的方式來定義從頁面到控制器的跳轉,和數據綁定相同,為了能夠正確找到被綁定方法所在的類,我們需要首先在配置文件當中聲明managed-bean,然后通過設置控件的action屬性,定義頁面到控制器的跳轉邏輯。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    配置文件:
    <faces-config>
    <managed-bean>
    <managed-bean-name> user </managed-bean-name>
    <managed-bean-class> nick.User </managed-bean-class>
    <managed-bean-scope> session </managed-bean-scope>
    </managed-bean>
    </faces-config>



    模型代碼:
    package nick;
    public class User {
    ? public String regist() {
    ? ? return "regist";
    ? }
    ? public String login() {
    ? ? return "login";
    ? }
    }
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="2">
    <h:commandButton id="regist"
    action="#{user.regist}" value="注冊"/>
    <h:commandButton id="login"
    action="#{user.login}" value="登陸"/>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:上述的頁面代碼,把注冊按鈕的動作綁定到User類的regist()方法,把登陸按鈕的動作綁定到User類的login()方法。因此,當這兩個按鈕被點擊時,對應的方法將被調用,用于實現頁面流的方法,必須聲明為public,而且她不接受參數,且返回值必須為String。
    b) ? ? 控制器到頁面:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:JSF通過名稱綁定的方式,來定義從控制器到頁面的跳轉。為了實現從控制器到頁面的跳轉,我們需要在配置文件當中定義一些<navigation-rule>,這些rule主要定義了怎么根據上述action標簽所綁定的方法的返回值來查找下一頁面。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    配置文件:
    <faces-config>
    <managed-bean>
    <managed-bean-name> user </managed-bean-name>
    <managed-bean-class> nick.User </managed-bean-class>
    <managed-bean-scope> session </managed-bean-scope>
    </managed-bean>



    <navigation-rule>
    <from-view-id>/index.jsp</from-view-id>
    <navigation-case>
    <from-outcome>regist</from-outcome>
    <to-view-id>/regist.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
    <from-outcome>login</from-outcome>
    <to-view-id>/login.jsp</to-view-id>
    </navigation-case>
    </navigation-rule>
    </faces-config>
    模型代碼:
    package nick;
    public class User {
    ? public String regist() {
    ? ? return "regist";
    ? }
    ? public String login() {
    ? ? return "login";
    ? }
    }
    注:上述的配置文件定義了一個<navigation-rule>,該rule指明了如果“/index.jsp”頁面通過她內部的某個控件的action屬性發生了跳轉,那么當該跳轉方法的返回值為字符串“regist”時,則頁面將跳轉到對應的“/regist.jsp”中,同理,如果返回值為“login”,則頁面將跳轉到“/login.jsp”。
    6. ? 數據傳輸:
    a) ? ? 頁面到控制器:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:在JSF的頁面代碼當中,通過數據綁定,我們把控件的value值,與某個后臺的數據bean關聯起來。而在前述的生命周期部分,我們看到,當一個JSF請求到達時,他需要經歷Restore View,Apply Request Value等步驟,而Apply Request Value部分的工作,就是把請求當中的值綁定到這個后臺的bean之中,因此,我們不需要考慮頁面中的Form值如何傳入到后臺的bean當中。
    進一步,如果錄入控件的value屬性,和命令控件的action屬性都是綁定在同一個bean上的話,那么在頁面跳轉時,我們可以直接訪問到bean的屬性值。但是為了不污染模型,和實現控制與模型的分離,一般情況下,我們需要把輸入控件的value值綁定到數據bean,而把命令控件的action值綁定到控制bean,由于兩個bean不是同一個,所以,控制bean需要一種方法來獲取數據bean中的屬性值。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    配置文件:
    <faces-config>
    <managed-bean>
    <managed-bean-name> user </managed-bean-name>
    <managed-bean-class> nick.User </managed-bean-class>
    <managed-bean-scope> session </managed-bean-scope>
    </managed-bean>
    <managed-bean>
    <managed-bean-name> action </managed-bean-name>
    <managed-bean-class> nick.Action </managed-bean-class>
    <managed-bean-scope> session </managed-bean-scope>
    </managed-bean>
    </faces-config>
    模型代碼:
    ? ? ? ? package nick;
    public class User {
    private String id = "Nick";
    public void setId(String id) {
    this.id = id;
    }
    public String getId() {
    return this.id;
    }
    }
    package nick;
    public class Action {
    ? public String regist() {
    ? ? ValueBinding binding = Util.getValueBinding("#{user}");
    ? ? User user = (User)
    binding.getValue(FacesContext.getCurrentInstance());
    ? ? ? ? ? ? …
    ? ? return "regist";
    ? }
    }
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="2">
    <h:outputLabel for="id">
    <h:outputText value="User ID"/>
    </h:outputLabel>
    <h:inputText id="id" value="#{user.id}"/>
    <h:commandButton id="regist"
    action="#{action.regist}" value="注冊"/>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>



    注:頁面代碼當中把輸入控件的value綁定到了user的id上,把命令控件的action值綁
    定到action的regist上。當用戶點擊登陸按鈕時,action的regist()方法將會被調用,
    而在該方法內部,為了獲取之前頁面中的信息,我們可以使用ValueBinding類。該類使用
    的數據綁定表達式與頁面中的類似。
    b) ? ? 控制器到頁面:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:通過之前的敘述,我們可以發現,當我們需要把數據從控制器傳到頁面時,我們同樣可以使用數據綁定的方式,因為,當我們通過數據綁定表達式,獲取到某個頁面當中所使用的模型實例時,便可以在該實例上直接調用對應的set()方法,來設定所希望的值。
    7. ? 插件功能:
    a) ? ? Converter(轉換):
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:當模型中的某個字段需要在頁面上顯示時,她需要先被轉換為字符串類型;而用戶在頁面輸入的字符串值,在傳到模型中時也需要根據模型對應字段的類型,進行一個轉換。另外,由于國際化的要去,模型中的值在不同的地區會有不同的表示方式。為了解決以上這些問題,JSF提供了Converter的實現,她主要做的事情就是根據所在的地區,對頁面數據和模型數據進行雙向的轉換。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    模型代碼:
    package nick;
    public class User {
    ? private Date date = new Date();
    ? public Date getDate() {
    ? ? return date;
    ? }
    ? public void setDate(Date date) {
    ? ? this.date = date;
    ? }
    }
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="3">
    <h:outputLabel for="date">
    <h:outputText value="date"/>
    </h:outputLabel>
    <h:inputText id="date" value="#{user.date}">
    <f:convertDateTime pattern="M/d/yyyy"/>
    </h:inputText>
    <h:message for="date"/>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:通過嵌套的convertXXX標簽,我們可以為控件配置用于轉換的轉換器。我們可以使用兩種方式來注冊轉換器,一是通過控件的convert屬性,另外一種就是通過嵌套的convertXXX標簽。如果在轉換的時候發生錯誤,那么JSF將跳過轉換以后的步驟,而直接跳到Render Response步驟,生成響應,并在FacesContext里添加一個出錯的Message,該Message的內容可以通過message標簽進行顯示。
    b) ? ? Validate(驗證):
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:在數據被交付后臺處理以前,我們可以通過驗證器,來驗證輸入的數據是否合法,這包括數值的大小,或者是字符串的長度等。使用驗證器的好處就是我們可以把驗證的代碼從控制代碼中單獨出來,以便管理和重用。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="3">
    <h:outputLabel for="id">
    <h:outputText value="User ID"/>
    </h:outputLabel>
    <h:inputText id="id" value="#{user.id}">
    <f:validateLength minimum="3" maximum="6"/>
    </h:inputText>
    <h:message for="id"/>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:通過嵌套的validateXXX標簽我們可以為一個控件注冊一個驗證器,與轉換器不同,我們可以為一個控件注冊多個驗證器,以進行復雜的驗證。注冊驗證器的方法也有兩個,一是通過控件的validator屬性,另外一種就是通過嵌套的validateXXX標簽。與轉換器類似,當驗證失敗時,失敗的原因也會以Message的形式被放到FacesContext內,在頁面內通過message標簽可以對錯誤信息進行顯示。
    8. ? 國際化支持
    a) ? ? 說明:為了提供對國際化的支持,JSF使用了與Struts類似的通過資源文件的形式,從外部獲取需要顯示的內容。
    b) ? ? 代碼:
    配置文件:
    <faces-config>
    <application>
    <message-bundle>nick.Messages</message-bundle>
    <locale-config>
    <default-locale>cn</default-locale>
    <supported-locale>en</supported-locale>
    </locale-config>
    ? </application>
    </faces-config>
    頁面代碼:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <f:loadBundle basename="nick.Messages" var="message"/>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="3">
    <h:outputLabel for="id">
    <h:outputText value="#{message.id}"/>
    </h:outputLabel>
    <h:inputText id="id" value="#{user.id}"/>
    ? ? ? ? ? ? ? ? </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:如果我們需要考慮國際化的問題時,那么我們需要為同一個資源提供多個地區的資源文件實現。通過在配置文件中聲明message-bundle,我們可以注冊資源文件的多個版本,以上面為例,她注冊了兩個資源文件nick.Messages_cn.properties和nickcen.Messages_en.properties分別對應于中國和英國地區,當頁面當中通過loadBundle標簽讀取資源時,她就會根據所在的區域,去查找對應的文件。當然,所有資源文件都應該使用java所提供的native2ascii工具,進行一下預處理。
    9. ? JSF定制:
    a) ? ? 說明:該部分主要展示如何對JSF提供的轉換器,驗證器和控件進行定制,以擴展JSF的功能。
    b) ? ? 配置文件定制:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:JSF提供了比Struts更多的定制特性,包括用于實例化前端控制FacesServelt的faces-context-factory,用于實例化控件繪畫RenderKit的render-kit-factory,進行聲明周期管理的lifecyle-factory等。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    配置文件:
    <faces-config>
    ? <factory>
    ? ? <application-factory>…</application-factory>
    ? ? <faces-context-factory>…</faces-context-factory>
    ? ? <lifecycle-factory>…</lifecycle-factory>
    ? ? <render-kit-factory>…</render-kit-factory>
    ? </factory>
    </faces-config>
    c) ? ? 轉換器定制:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:通過擴展JSF提供的Converter接口,我們可以定義自己的轉換器。而為了能在頁面上使用自定義的轉換器,我們需要在配置文件中,對轉換器進行注冊。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    配置文件:
    <faces-config>
    <converter>
    <converter-id>nameConverter</converter-id>
    <converter-class>nick.NameConverter</converter-class>
    </converter>
    </faces-config>
    模型文件:
    package nick;
    public class NameConverter implements Converter {
    public Object getAsObject(FacesContext ar0, UIComponent ar1, String ar2) {
    ? ? return ar2.toLowerCase();
    }
    public String getAsString(FacesContext ar0, UIComponent ar1, Object ar2) {
    ? ? retrun ((String) arg2).toUpperCase();
    }
    }
    頁面文件:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <f:loadBundle basename="nick.Messages" var="message"/>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="3">
    <h:outputLabel for="id">
    <h:outputText value="#{message.id}"/>
    </h:outputLabel>
    <h:inputText id="id"
    value="#{user.id}" immediate="true">
    <f:converter converterId="nameConverter"/>
    </h:inputText>
    <h:message for="id"/>
    <h:commandButton
    action="#{action.regist}" value="Regist"/>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:當頁面數據轉換為后臺數據時,Converter的getAsObject()方法會被調用。而當需要把后臺數據顯示到頁面中時,getAsString()方法會被調用。這里,我們注意到,我們的Converter是不能帶任何配置屬性的,為了讓我們的Converter能夠在頁面中增加屬性,我們需要進一步的定義自己的標簽。除了可以根據converter-id來注冊轉換器以外,我們還可以使用converter-for-class標簽來為某一特定的Java類型注冊轉換器。如果在轉換過程中發生錯誤的話,那么我們可以通過拋出ConverterException來停止后續的工作。
    d) ? ? 驗證器定制:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:通過擴展Validator接口,我們可以定義自己的驗證器。而為了能在頁面上使用自定義的驗證器,我們需要在配置文件中,對驗證器進行注冊。
    ? ? ? ? ? ? ii. ? ? ? ? 代碼:
    配置文件:
    <faces-config>
    <validator>
    <validator-id>nameValidator</validator-id>
    <validator-class>nick.NameValidator</validator-class>
    </validator>
    </faces-config>
    模型文件:
    package nick;
    public class NameValidator implements Validator {
    ? public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
    ? ? ? ? throws ValidatorException {
    ? ? String name = (String) arg2;
    ? ? if (!name.startsWith("nick")) {
    ? ? ? ? throw new ValidatorException(new FacesMessage(
    ? ? ? ? ? ? "name must start with nick"));
    ? ? }
    ? }
    }



    頁面文件:
    <%@page contentType="text/html;charset=gb2312"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/core " prefix="f"%>
    <%@ taglib uri="
    http://java.sun.com/jsf/html " prefix="h"%>
    <html>
    <head><title>Test</title></head>
    <f:loadBundle basename="nick.Messages" var="message"/>
    <body>
    <f:view>
    <h:form>
    <h:panelGrid columns="3">
    <h:outputLabel for="id">
    <h:outputText value="#{message.id}"/>
    </h:outputLabel>
    <h:inputText id="id" value="#{user.id}"> ? ? ? ? ? ? <f:validator validatorId="nameValidator"/>
    </h:inputText>
    <h:message for="id"/>
    <h:commandButton
    action="#{action.regist}" value="Regist"/>
    </h:panelGrid>
    </h:form>
    </f:view>
    </body>
    </html>
    注:定制驗證器的操作與定制轉換器的操作大致相同,如果我們希望通過頁面的方式為驗證器提供屬性的話,那么我們也需要定義額外的標簽。
    e) ? ? 控件定制:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:JSF允許用戶基于JSF的框架,進行控件的定制,控件定制需要完成以下幾部分的工作,1.需要一個控件實現類,為了能讓控件在頁面上使用,我們的控件還需要在配置文件中,通過component標簽進行注冊;2.用于控件渲染的Render類;3.用于在頁面上使用控件的標簽。
    f) ? ? 控件樹定制:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:除了可以通過頁面標簽來聲明控件以外,我們可以通過程序的方式來定制控件樹,通過調用FacesContext上的getViewRoot()方法,我們可以獲得控件樹的根引用,通過該引用,我們可以動態的對控件進行增刪,或者動態的為某一控件增刪事件監聽器,和驗證器等。
    g) ? ? Web常量:
    ? ? ? ? ? ? ? i. ? ? ? ? 說明:JSF提供了一組操作application,context,session,cookies,page等常量的方法。通過調用FacesContext上的getExternalContext()方法,我們可以獲得一個對ExternalContext的引用,通過該引用我們可以獲取所有我們希望使用的session,cookies等常量的引用,除此以外,我們還能獲取request當中的頭信息和請求信息等。
    posted on 2006-09-30 13:23 周游世界 閱讀(5453) 評論(4)  編輯  收藏 所屬分類: JSF

    評論

    # re: [ZZ] JSF詳解(從jsf的運行原理開始介紹了jsf) 2007-09-18 16:40
    有深度,相當不錯  回復  更多評論
      

    # re: [ZZ] JSF詳解(從jsf的運行原理開始介紹了jsf) 2008-11-16 20:21 學習
    學習...  回復  更多評論
      

    # re: [ZZ] JSF詳解(從jsf的運行原理開始介紹了jsf)[未登錄] 2010-07-26 09:45 訪客
    學習。。  回復  更多評論
      

    # re: [ZZ] JSF詳解(從jsf的運行原理開始介紹了jsf) 2010-09-10 16:18 fangbo
    寫的很好,可以出書了,以前沒弄過JSF,最近學seam框架需要快速入門,找到了樓主的文章,感覺自己一下子通了好多,十分感謝!  回復  更多評論
      

    主站蜘蛛池模板: 成年人网站在线免费观看| 免费一级毛suv好看的国产网站| 丁香花在线视频观看免费| 亚洲国产一区视频| 黄页网站在线免费观看| 亚洲成av人片不卡无码久久| 免费一级毛片在线播放放视频 | 亚洲精品一卡2卡3卡四卡乱码| 无码人妻一区二区三区免费手机 | 亚洲日本VA午夜在线影院| 一个人免费观看视频www| 亚洲最大天堂无码精品区| 在线免费观看一级片| 亚洲欧美日韩中文无线码| 国产一区二区三区在线免费观看 | 婷婷国产偷v国产偷v亚洲| 国产大片91精品免费观看男同| 精品在线免费视频| 中文字幕亚洲一区二区三区| 久久香蕉国产线看免费| 亚洲va成无码人在线观看| 日韩免费视频网站| 久久久免费观成人影院| 亚洲邪恶天堂影院在线观看| 野花高清在线电影观看免费视频 | 国精产品一区一区三区免费视频| 情人伊人久久综合亚洲| 免费在线视频你懂的| 亚洲av无码成人精品区一本二本 | 亚洲精品亚洲人成在线观看下载| 中国一级毛片免费看视频| 亚洲高清无在码在线电影不卡| 免费视频淫片aa毛片| 2022国内精品免费福利视频| 久久精品国产亚洲AV麻豆网站| 成年女人男人免费视频播放| 久青草国产免费观看| 亚洲永久中文字幕在线| 国产一级一片免费播放| 高清一区二区三区免费视频| 亚洲久热无码av中文字幕|