部落客廣告聯播

2007年6月18日 星期一

筆記:JSF

JSF下載網址:https://javaserverfaces.dev.java.net/

1. 架構概觀:


  • FaceServlet (javax.faces.webapp.faceServlet)

  • FaceContext (FaceServlet生成,裏頭包含了ServletContext、ServletRequest、ServletResponse)

  • LifeCycle (封裝在FaceContext裏頭的JSF請求主要交由LifeCycle經由六階段處理)

2. LifeCycle六階段:


  1. Restore Component Tree

  2. Apply Request

  3. Validation

  4. update Model

  5. Invoke application

  6. render response

參考圖片from IBM


從上圖可看到中間四個紅色的階段,代表這四個階段可產生事件,以進行處理。

3. JSF配置檔faces-config.xml:
  • JavaBean

  • Navigation

4. JSF支援兩種EVENT:
  • ActionEvent

  • ValueChangeEvent

5. 使用JSF所需jar:
  1. jsf-api.jar

  2. jsf-impl.jar

  3. jstl.jar

  4. standard.jar

  5. commons-beanutils.jar

  6. commons-digester.jar

  7. commons-logging.jar
若是JSF1.2版,則只要前四項,後面的3項commons已經包在jsf-impl.jar的com.sun.org.apache.commons套件中了。

6. JSF的JSP頁面引入自訂標籤庫:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

7. 所有的JSF標籤都要包在 <f:view>之間

8. JSF的HTML標籤包含四大類
  1. UIForm

  2. UIInput

  3. UIOutput

  4. UICommand

9. JSF Core核心標籤與事件有關的標籤:
  1. <f:actionListener>

  2. <f:valueChangeListener>

  3. <f:phaseListener>

10. 上列type為class的完整名稱,該類別必須實做javax.faces.event.AcionListener。
同的如果違valueChangeListenre則必須實做javax.faces.event.ValueChangeListener。

11.四個核心validator標籤

  1. <f:validator>

  2. <f:validateLength>

  3. <f:validateDoubleRange>

  4. <f:validateLongRange>

12.JSF API 介面:
  • javax.faces:

    • FactoryFinder:用來找所有JSF API裡指定的Factory,不會直接使用該類別

    • FacesException: RuntimeException的子類別,常會在我們JSF程式裡面throw該類實例


  • javax.faces.aplication:

    • NavigationHandler:處理頁面導覽。

    • Application:類似jsp裡的application,每個web application中只有一個,提供存放一些支援JSF的物件(如NavigationHandler)


  • javax.faces.component: 包含JSF標準UI組件的介面和類別

    • UIComponent:所有UI組件皆實做UIComponent


  • javax.faces.context:

    • FaceContext: 封裝了ServletContext、ServletRequest、ServletResponse等物件。

    • FaceContextFactory: 負責FaceContext物件的生成。

    • ExternalContext: 可用來取得ServletContext、ServletRequest、ServletResponse等物件。


  • javax.faces.convert: 包含了一堆轉換器的介面及類別

    • Converter: 所有自訂的轉換器都要實做Converter

    • ConverterException: 轉換錯誤時 ,要拋出這個例外


  • javax.faces.el: 包含用於處理JSF Expression language的類別及介面

    • ValueBinding: 相當重要,常在我們的JSF程式中使用,用來在程式中存取某個字串代表的EL


  • javax.faces.event: 事件處理所需的介面及類別

    • ActionEvent

    • ValueChangeEvent

    • FacesListener: 介面,被ActionListener及ValueChangeListener實做

    • ActionListener

    • ValueChangeListener

    • PhaseId: 包含了數個常數代表LifeCycle的六個階段,FacesListener有一個getPhaseId( )方法傳回的PhaseId將會指明這個Listener要在哪階段被使用

    • AbortProcessingException: 用來中斷當前事件處理


  • javax.faces.lifecycle:

    • Lifecycle: 處理JSF請求。

    • LifecycleFactory: 用來生成LifeCycle


  • javax.faces.model: 包含了一些Data Model介面及類別


  • javax.faces.render:

    • Render:負責把UI組件轉換成客戶端特定型式(如html)

    • RenderKit:Render實例的集合

    • RenderKitFactory


  • javax.faces.validator:

    • Valicator:介面

    • LengthValidator

    • LongRangeValidator

    • RequiredValidator

    • DoubleRangeValidator

    • StringRangeValidator


  • javax.faces.webapp

    • FacesServlet

    • UIComponentTag


13.一般不直接接觸ServletContext、ServletRequest、ServletResponse而是使用FaceContext及ExternalContext物件。



14.JSF每個JSP頁面都以一組component tree來表示。


15.JSF內通常不用jsp:useBean來與JavaBean互動,而是將JavaBean定義在facesConfig.xml設定檔內,並透過JSF EL或是ValueBinding類別來存取。



16.FacesContext物件內主要包含:

  1. Tree

  2. ExternalContext

  3. Message Collection

  4. Event object collection

  5. ResponseStream

  6. ResponseWriter

17.取得FacesContext:

  FacesContext fcontext = FacesContext.getCurrentInstance( );


18.取得component tree:

  fcontext.getTree( );

設定component tree:

  fcontext.setTree(TreeO);


19.將訊息推入facesContext物件裡的Message Collection:

  fcontext.addMessage(UIComponentO,MessageO);

取出Message collection裡所有訊息:

  fcontext.getMessages( ) ; ->會傳回Iterator物件

  fcontext.getMessages(UIComponentO);


20.將事件推入Event collection:

  fcontext.addFacesEvent(FacesEventO);

取出所有Event:

  fcontext.getFacesEvents( ) ;



21.取得與設定Locale:

  fcontext.getLocale( );

  fcontext.setLocale(LocaleO);


22.取得ExternalContext:

  fcontext.getExternalContext();

23. 使用ExternalContext取得ServletContext、ServletRequest、ServletResponse、HttpSession
  • eContext.getContext( );
  • eContext.getRequest( );
  • eContext.getResponse( );
  • eContext.getSession(boolean create);

24. 使用ExternalContext取得ServletContext所有Attribute的Name-value Map:
  • eContext.getApplicationMap( );

25. 使用ExternalContext取得session所有Attribute的Name-value Map:
  • eContext.getSessionMap( );

26. 使用ExternalContext取得request所有Attribute的Name-value Map:
  • eContext.getRequestMap( );

27. 使用ExternalContext取得ServletContext起始參數(Init parameter defined in web.xml):
  • eContext.getInitParameter(String name);
  • eContext.getInitParameterMap( ); //所有參數map

28. 使用ExternalContext取得request參數:
  • eContext.getRequestParameterMap( );
  • eContext.getRequestParameterValuesMap( ); //map value為字串陣列
  • eContext.getRequestParameterNames( ); //傳回Iterator

29. 使用ExternalContext取得header參數:
  • eContext.getHeaderMap( );
  • eContext.getHeaderValuesMap( ); //map value為Enumeration
30. 使用ExternalContext取得cookie:
  • eContext.getRequestCookieMap( ); //map value 為Cookie
31. 使用ExternalContext取得瀏覽器送出的Locale:
  • eContext.getRequestLocale( ); // map value為Locale
32. 使用ExternalContext取得當前WebApp名稱、頁面名稱:
  • eContext.getRequestContextPath( ); //傳回 /appName
  • eContext.getRequestPathInfo( ); //傳回 xxx.jsp
33. 使用ExternalContext取得指定網站目錄下的目錄及檔案列表:
  • eContext.getResourcePaths("/pathDir1"); //傳回Set,列出網站跟目錄下的pathDir1目錄下的目錄名及檔名。
34. javax.faces.tree.Tree代表一個component tree。前面有提過可使用FacesContext物件的getTree( )取得。
Tree物件的四個方法:
  1. getTreeId( );
  2. getRoot( );
  3. getRenderKitId( );
  4. setRenderKitId( );

35. 取得Application物件實例:
ApplicationFactory factory = (ApplicationFactory) FactoryFinder.getFactory( FactoryFinder.APPLICATION_FACTORY);
Application app=factory.getApplication( );

36. 使用Application及ValueBinding存取JavaBean:
ValueBinding vb=app.getValueBinding("someBean");
ValueBinding vb2=app.getValueBinding("someBean.someAttribute");

37. ValueBinding物件四個方法:
  1. getType(fContext );
  2. getValue( fContext);
  3. setValue( fContext);
  4. isReadOnly( fContext );

....未完待續



沒有留言: