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

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

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

    origo

    origo

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      15 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks

    2008年3月4日 #

    原文地址:http://code.javaeye.com/blog/247023

    在Faces API中有兩個(gè)類是要經(jīng)常使用的. 一個(gè)是FacesContext 一個(gè)是ExternalContext.首先講解如何使用FacesContext .
    對(duì)每個(gè)JSF請(qǐng)求,F(xiàn)acesServlet對(duì)象都會(huì)為其獲取一個(gè)javax.faces. context.
    FacesContext類的實(shí)例。FacesServlet對(duì)象將下列3個(gè)取自Web容器的對(duì)象傳給javax.faces.context.FacesContextFactory對(duì)象的getFacesContext方法,以此來做到這一點(diǎn):
    ●       javax.servlet.ServletContext
    ●       javax.servlet.ServletRequest
    ●       javax.servlet.ServletResponse
    這意味著FacesContext的實(shí)例里包含了所有處理JSF請(qǐng)求所需的每個(gè)請(qǐng)求的狀態(tài)信息。圖3-1展示了FacesContext實(shí)例里封裝的其他一些對(duì)象。
    3.2.1 獲取當(dāng)前實(shí)例
    一個(gè)經(jīng)常用到的方法是靜態(tài)的getCurrentInstance方法,它返回當(dāng)前的FacesContext實(shí)例。此方法的簽名如下:
    public static FacesContext getCurrentInstance()
    下面的代碼是一個(gè)用此方法獲取FacesContext當(dāng)前實(shí)例的例子:
    FacesContext facesContext = FacesContext.getCurrentInstance();
    3.2.2 獲取和修改組件樹
    FacesContext實(shí)例里最重要的內(nèi)容是請(qǐng)求頁面的組件樹。組件樹是由javax.faces.tree.Tree類來表示的(本章后面的“使用Tree類”一節(jié)會(huì)討論)。FacesContext實(shí)例的tree屬性就是Tree對(duì)象。
    要獲取或修改Tree對(duì)象,可使用tree屬性的讀取方法和賦值方法:
    public abstract Tree getTree()
    public abstract void setTree(Tree tree)
    3.2.3 添加和獲取消息
    在 請(qǐng)求處理生命周期里,可能會(huì)遇到錯(cuò)誤。比如,當(dāng)驗(yàn)證器執(zhí)行輸入驗(yàn)證時(shí),因?yàn)橛脩糨斎肓瞬徽_的值,驗(yàn)證可能失敗;當(dāng)組件試圖把輸入值轉(zhuǎn)換為綁定到組件的模 型對(duì)象所需的類型時(shí),也可能會(huì)失敗。所有消息都必須存放到FacesContext實(shí)例里以備后面進(jìn)行處理。比如,您可能希望在頁面里顯示錯(cuò)誤消息,從而 為用戶更正錯(cuò)誤提供幫助。
    錯(cuò)誤消息是由javax.faces.application.Message接口(第11章再詳細(xì)討論)來表示的,您可以通過使用FacesContext類的addMessage方法向FacesContext實(shí)例里添加Message對(duì)象。這個(gè)方法的簽名如下:
    public abstract void addMessage(UIComponent component, Message message)
    如果component不為空,新加入的message就關(guān)聯(lián)到component上。否則,它就不與任何特定組件的實(shí)例相關(guān)。
    舉例來說,驗(yàn)證器在驗(yàn)證組件值失敗時(shí)可調(diào)用FacesContext的addMessage方法,傳入值無效的組件及一個(gè)包含特定錯(cuò)誤消息的Message對(duì)象。
    所有添加到FacesContext實(shí)例的Message對(duì)象都被加入到一個(gè)集合里。可通過調(diào)用getMessages方法的兩個(gè)重載方法之一來獲取加入的Message對(duì)象:
    public abstract Iterator getMessages()
    public abstract Iterator getMessages(UIComponent component)
    第一種形式的調(diào)用在一個(gè)Iterator里返回所有Message對(duì)象,而第二種形式的調(diào)用則僅返回與給定UIComponent相關(guān)聯(lián)的Message對(duì)象。
    3.2.4 添加和獲取請(qǐng)求處理事件
    UIComponent 可以生成FacesEvent對(duì)象。比如,當(dāng)單擊一個(gè)UICommand組件時(shí),它會(huì)生成一個(gè)ActionEvent對(duì)象(ActionEvent類是 FacesEvent類的子類)。這個(gè)FacesEvent對(duì)象需要在FacesContext實(shí)例里保存起來,以備請(qǐng)求處理生命周期里的下一步處理事件 時(shí)所用。
    可通過使用FacesContext類的addFacesEvent方法向FacesContext實(shí)例添加FacesEvent對(duì)象。此方法的簽名如下:
    public abstract void addFacesEvent(FacesEvent event)
    要提取先前添加的FacesEvent對(duì)象,可調(diào)用getFacesEvents方法,其簽名如下:
    public abstract Iterator getFacesEvents()
    此方法返回FacesEvent時(shí)的順序與其在隊(duì)列中的順序一致。
    3.2.5 向Response對(duì)象里寫入信息
    為 了向Response對(duì)象里寫入信息,F(xiàn)acesContext類提供了兩個(gè)屬性,一個(gè)是 javax.faces.Context.ResponseStream類型,另一個(gè)是 javax.faces.context.ResponseWriter類型。ResponseStream類型的對(duì)象用于輸出二進(jìn)制數(shù)據(jù),而 ResponseWriter類型的對(duì)象則用于輸出字符。這些屬性的讀取方法和賦值方法如下:
    public abstract ResponseStream getResponseStream()
    public abstract void setResponseStream(ResponseStream responseStream)
    public abstract ResponseWriter getResponseWriter()
    public abstract void setResponseWriter(ResponseWriter responseWriter)
    3.2.6 獲取和設(shè)置地區(qū)
    第11章將會(huì)討論到,JSF支持國際化和本地化。這意味著您可以根據(jù)用戶的地區(qū)決定發(fā)送什么樣的回應(yīng)信息。locale屬性里存放了當(dāng)前處理中所用的Locale對(duì)象。
    初始狀況下,locale屬性的值和網(wǎng)絡(luò)瀏覽器里指定的地區(qū)是一樣的,但可以修改這個(gè)值,從而發(fā)送輸出所使用的地區(qū)將獨(dú)立于瀏覽器所使用的地區(qū)。此屬性的讀取方法和賦值方法如下:
    public abstract Locale getLocale()
    public abstract void setLocale(Locale locale)
    3.2.7 操作請(qǐng)求處理生命周期
    FacesContext類還提供了兩個(gè)方法與請(qǐng)求處理生命周期進(jìn)行交互:
    ●       在當(dāng)前階段的處理完成后,調(diào)用renderResponse方法通知JSF實(shí)現(xiàn)把控制權(quán)轉(zhuǎn)到呈現(xiàn)響應(yīng)階段。也就是說,處于當(dāng)前階段和呈現(xiàn)響應(yīng)階段之間的所有其他階段都不再執(zhí)行。
    ●       調(diào)用responseComplete方法,告訴JSF實(shí)現(xiàn)此次請(qǐng)求的HTTP響應(yīng)已經(jīng)完成(比如在使用了HTTP重定向的情況下)。因此,當(dāng)前階段完成后,必須中止請(qǐng)求處理生命周期的處理。
    這些方法的簽名如下:
    public abstract void renderResponse()
    public abstract void responseComplete()
    3.2.8 獲取其他請(qǐng)求狀態(tài)信息
    其他每個(gè)請(qǐng)求的狀態(tài)信息封裝在ExternalContext對(duì)象里,可以使用getExternalContext方法獲取該對(duì)象:
    public abstract ExternalContext getExternalContext()
    現(xiàn)在講解ExternalContext。
    使 用ExternalContext類提供的方法可以獲取ServletContext、ServletRequest和ServletResponse對(duì) 象,構(gòu)造FacesContext實(shí)例時(shí)需要這些對(duì)象。除此之外,ExternalContext實(shí)例提供了包裝器方法,可以使用這些方法獲得原來需要從 ServletContext、ServletRequest及ServletResponse對(duì)象上調(diào)用一些方法獲得的信息。
    3.3.1 獲取ServletContext、ServletRequest和ServletResponse對(duì)象
    可使用下列方法獲取servlet信息:
    ●       getContext 此方法可獲取Web應(yīng)用中與當(dāng)前請(qǐng)求相關(guān)聯(lián)的ServletContext對(duì)象。其簽名如下:
    public abstract Object getContext()
    ●      getRequest 此方法可獲取代表當(dāng)前正在處理的請(qǐng)求的ServletRequest對(duì)象。其簽名如下:
    public abstract Object getRequest()
    ●       getResponse 此方法可獲取代表當(dāng)前正在呈現(xiàn)的響應(yīng)的ServletResponse對(duì)象。其簽名如下:
    public abstract Object getResponse()
    這些方法都是返回一個(gè)java.lang.Object對(duì)象,不是servlet特有的類型,這樣就可以使JSF實(shí)現(xiàn)獨(dú)立于其運(yùn)行的環(huán)境。比如,JSF既可用于Web容器,也可以用于其他容器,如portlet等。
    3.3.2 獲取ServletContext特性
    getApplicationMap方法返回一個(gè)包含ServletContext對(duì)象里全部特性名/值對(duì)的Map對(duì)象。下面是此方法的簽名:
    public abstract java.util.Map getApplication()
    作為一個(gè)例子,下面的代碼可獲取一個(gè)名叫databaseUtility的特性:
    Object contextAttribute = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map contextMap = externalContext.getApplicationMap();
    if (contextMap!=null)
    contextAttribute = contextMap.get("databaseUtility");
    3.3.3 獲取Session對(duì)象及其特性
    通 過ExternalContext對(duì)象可訪問與當(dāng)前請(qǐng)求相關(guān)聯(lián)的Session對(duì)象。getSession方法可取回當(dāng)前用戶的 javax.servlet.http.HttpSession對(duì)象,如果當(dāng)前用戶沒有相應(yīng)的Session對(duì)象,此方法的行為由傳入的參數(shù)決定:如果為 該方法傳入了一個(gè)true值,它會(huì)創(chuàng)建一個(gè)Session對(duì)象;否則,它會(huì)返回null。下面是getSession方法的簽名:
    public abstract Object getSession(boolean create)
    此方法其實(shí)是javax.servlet.http.HttpServletRequest接口中g(shù)etSession方法的包裝器。
    getSessionMap方法返回一個(gè)包含與當(dāng)前請(qǐng)求相關(guān)聯(lián)的Session對(duì)象里所有特性名/值對(duì)的Map對(duì)象。下面是它的方法簽名:
    public abstract java.util.getSessionMap()
    要 獲取Session對(duì)象里的特性,可調(diào)用Map類的get方法,傳入要獲取的特性名即可。文檔中沒有指明在當(dāng)前請(qǐng)求沒有相應(yīng)Session對(duì)象的情況下, 此方法是返回null還是一個(gè)空的Map對(duì)象。所以在調(diào)用Map的get方法之前,需要先檢查Map是否為null。下面的代碼是獲取Session特性 的例子:
    Object sessionAttribute = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map sessionMap = externalContext.getSessionMap();
    if (sessionMap!=null)
    sessionAttribute = sessionMap.get(key);
    最后一行的key是一個(gè)包含特性名的字符串。
    3.3.4 獲取ServletContext對(duì)象的初始參數(shù)
    getInitParameter方法是ServletContext對(duì)象的getInitParameter方法的包裝器,用這個(gè)方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始參數(shù)值。此方法的簽名如下:
    public abstract String getInitParameter(String parameterName)
    舉例來說,如果在部署描述符聲明了如下context-init元素:
    <context-param>
    <param-name>contactPerson</param-name>
    <param-value>Scott Jobim</param-value>
    </context-param>
    下面代碼中的字符串變量initParam的值會(huì)是Scott Jobim。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    String initParam = externalContext.getInitParameter("contactPerson");
    getInitParameterMap方法返回一個(gè)包含ServletContext對(duì)象中全部初始參數(shù)的Map對(duì)象。其簽名如下:
    public abstract java.util.Map getInitParameterMap()
    為了獲取一個(gè)初始參數(shù)的值,使用Map對(duì)象的get方法,同時(shí)傳遞初始參數(shù)的名稱。比如,下面的代碼把初始參數(shù)databaseName的值輸出到控制臺(tái)。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map paramMap = externalContext.getInitParameterMap();
    if (paramMap!=null) {
    System.out.println(paramMap.get("databaseName"));
    }
    3.3.5 獲取Request對(duì)象的特性
    getRequestMap方法返回一個(gè)包含當(dāng)前Request對(duì)象中全部特性名/值對(duì)的Map對(duì)象。其方法簽名如下:
    public abstract java.util.Map getRequestMap()
    作為一個(gè)例子,下面的代碼可用來提取Request對(duì)象里的特性:
    Object requestAttribute = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map requestMap = externalContext.getRequestMap();
    if (requestMap!=null)
    requestAttribute = requestMap.get(key);
    最后一行里的Key是一個(gè)包含要提取的屬性名的字符串。
    3.3.6 訪問Request對(duì)象里的參數(shù)名和值
    getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用來訪問Request對(duì)象里的參數(shù)名和值。
    getRequestParameterMap返回一個(gè)包含Request對(duì)象里全部參數(shù)名/值對(duì)的Map對(duì)象。其簽名如下:
    public abstract java.util.Map getRequestParameterMap()
    作為一個(gè)例子,下面的代碼可用來提取名為id的請(qǐng)求參數(shù)的值:
    String id = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map requestParameterMap = externalContext.getRequestParameterMap();
    if (requestParameterMap!=null)
    id = (String) requestParameterMap.get("id");
    getRequestParameterNames 方法返回一個(gè)包含全部請(qǐng)求參數(shù)名的Iterator。此方法其實(shí)是ServletRequest.getParameterNames方法的包裝器。不同 的是,ExternalContext類的getRequestParameterNames返回一個(gè)Iterator,而不是 java.util.Enumeration。此方法的簽名如下:
    public abstract java.util.Iterator getRequestParameterNames()
    作為一個(gè)例子,下面的代碼把所有的請(qǐng)求參數(shù)名/值對(duì)輸出到控制臺(tái)。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map requestParameterMap = externalContext.getRequestParameterMap();
    Iterator parameterNames = externalContext.getRequestParameterNames();
    while (parameterNames.hasNext()) {
    String parameterName = (String) parameterNames.next();
    String parameterValue =
    (String) requestParameterMap.get(parameterName);
    System.out.println(parameterName + " : " + parameterValue);
    }
    getRequestParameterValuesMap 方法返回一個(gè)包含Request對(duì)象里全部參數(shù)名/值對(duì)的Map對(duì)象。此方法與getRequestParameterMap方法很相似,但 getRequestParameterValuesMap可返回全部相同參數(shù)名的值。在此方法返回的Map對(duì)象上調(diào)用get(key)方法,這一點(diǎn)等同 于獲取當(dāng)前請(qǐng)求的ServletRequest并在其上調(diào)用getParameterValues(key)。也就是說,Map對(duì)象返回的是一個(gè)字符串?dāng)?shù) 組。GetRequestParameterValuesMap方法的簽名如下:
    public abstract java.util.Map getRequestParameterValuesMap()
    下面例子中的代碼把請(qǐng)求參數(shù)id的全部值輸出到控制臺(tái)。
    String[] id = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map requestParameterValuesMap = externalContext.getRequestParameterValuesMap();
    if (requestParameterValuesMap!=null) {
    id = (String[]) requestParameterValuesMap.get("id");
    // print all values of id
    for (int i=0; i<id.length; i++) {
    System.out.println(id[i]);
    }
    }
    3.3.7 獲取請(qǐng)求頭的名和值
    getRequestHeaderMap方法返回一個(gè)包含當(dāng)前請(qǐng)求中全部頭名/值對(duì)的Map對(duì)象。其方法簽名如下:
    public abstract java.util.Map getRequestHeaderMap()
    舉個(gè)例子來說,下面的代碼提取host頭的值:
    String host = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map headerMap = externalContext.getRequestHeaderMap();
    if (headerMap!=null) {
    host = (String) headerMap.get("host");
    System.out.println(host);
    }
    注意:
    報(bào)頭的名稱是不區(qū)分大小寫的。比如,對(duì)getRequestHeaderMap返回的Map對(duì)象分別用host、Host和Host作為參數(shù)來調(diào)用get方法,其結(jié)果是一樣的。
    getRequestHeaderValuesMap方法與getRequestHeaderMap方法相似。但在getRequestHeader
    ValuesMap方法返回的Map對(duì)象上調(diào)用get方法會(huì)得到一個(gè)字符串的數(shù)組。getRequestHeaderValuesMap方法的簽名如下:
    public abstract java.util.Map getRequestHeaderValuesMap()
    在getRequestHeaderValuesMap方法返回的Map對(duì)象上調(diào)用get方法會(huì)返回一個(gè)java.util.Enumeration值。
    下面的代碼使用getRequestHeaderValuesMap方法來獲取一個(gè)包含全部頭名/值對(duì)的Map對(duì)象,然后在此Map對(duì)象上調(diào)用get方法以獲取全部Accept-Encoding頭的值,并將結(jié)果輸出到控制臺(tái)。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map headerValuesMap = externalContext.getRequestHeaderValuesMap();
    if (headerValuesMap!=null) {
    Enumeration headers =
    (Enumeration) headerValuesMap.get("Accept-Encoding");
    while (headers.hasMoreElements()) {
    String value = (String) headers.nextElement();
    System.out.println(value);
    }
    }
    3.3.8 獲取Cookie
    getRequestCookies方法是HttpServletRequest.getCookies方法的包裝器,它返回一個(gè)javax.servlet.http.Cookie對(duì)象的數(shù)組,數(shù)組中是當(dāng)前Request對(duì)象里的全部Cookie。此方法的簽名如下:
    public abstract Cookie[] getRequestCookies()
    例如,下面的代碼取得當(dāng)前請(qǐng)求中的全部Cookie對(duì)象,然后在結(jié)果數(shù)組上循環(huán),輸出全部Cookie的名和值。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Cookie[] cookies = externalContext.getRequestCookies();
    for (int i=0; i<cookies.length; i++) {
    Cookie cookie = cookies[i];
    String cookieName = cookie.getName();
    String cookieValue = cookie.getValue();
    System.out.println(cookieName + " : " + cookieValue);
    }
    getRequestCookieMap 方法返回一個(gè)包含當(dāng)前請(qǐng)求中全部Cookie的、以Cookie的名稱作為鍵的Map對(duì)象。在此Map對(duì)象上調(diào)用get方法會(huì)返回一個(gè) javax.servlet.http.Cookie對(duì)象。GetRequestCookieMap方法的簽名如下:
    public abstract java.util.Map getRequestCookieMap()
    例如,下面的代碼取得名為password的Cookie對(duì)象并將其值輸出到控制臺(tái)。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map cookieMap = externalContext.getRequestCookieMap();
    if (cookieMap!=null) {
    Cookie cookie = (Cookie) cookieMap.get("password");
    if (cookie!=null)
    System.out.println("Value:" + cookie.getValue());
    }
    注意:
    Cookie名稱區(qū)分大小寫。
    3.3.9 獲取場(chǎng)所
    getRequestLocale方法是ServletRequest.getLocale方法的包裝器,它返回Request對(duì)象中的Locale對(duì)象。此方法的簽名如下:
    public abstract java.util.Locale getRequestLocale()
    例如,下面的代碼取回用戶的場(chǎng)所并輸出該場(chǎng)所的顯示語言和顯示國家。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Locale locale = externalContext.getRequestLocale();
    System.out.println("Language:" + locale.getDisplayLanguage());
    System.out.println("Country:" + locale.getDisplayCountry());
    3.3.10 獲取上下文路徑
    getRequestContextPath是HttpServletRequest.getContextPath方法的包裝器,它返回請(qǐng)求URI中指明請(qǐng)求上下文的上下文路徑部分。其方法簽名如下:
    public abstract String getRequestContextPath()
    下面的代碼段把請(qǐng)求URI的上下文路徑輸出到控制臺(tái):
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    System.out.println("Context path:" +
    externalContext.getRequestContextPath());
    對(duì)于URL http://localhost:8080/JSFCh03/faces/test.jsp來說,getRequestContextPath方法的返回值為/JSFCh03。
    getRequestPathInfo 方法是HttpServletRequest.getPathInfo方法的包裝器,它返回當(dāng)客戶端進(jìn)行請(qǐng)求時(shí)與客戶端發(fā)送的URL相關(guān)聯(lián)的額外路徑信 息。這部分信息跟在servlet路徑信息的后面,但在查詢字符串之前。getRequestPathInfo方法的簽名如下:
    public abstract String getRequestPathInfo()
    例如,下面代碼輸出請(qǐng)求URL的路徑信息。
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    System.out.println("Path info:" +
    externalContext.getRequestPathInfo());
    對(duì)于URL http://localhost:8080/JSFCh03/faces/test.jsp而言,getRequestPathInfo方法的返回值為test.jsp。
    3.3.11 獲取資源路徑
    getResourcePaths 方法是ServletContext類的getResourcePaths方法的包裝器,它返回一個(gè)Set對(duì)象,其中包含Web應(yīng)用中最長(zhǎng)子路徑與傳入的 路徑參數(shù)相匹配的資源路徑。表示子目錄的路徑以“/”結(jié)束。返回的路徑是相對(duì)于Web應(yīng)用根路徑的相對(duì)路徑,并以“/”開始。此方法的簽名如下:
    public abstract java.util.Set getResourcePaths(String path)
    比如,考慮如下代碼:
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Set resourcePaths = externalContext.getResourcePaths("/");
    Iterator iterator = resourcePaths.iterator();
    while (iterator.hasNext()) {
    String path = (String) iterator.next();
    System.out.println(path);
    }
    System.out.println("----------------------------");
    resourcePaths = externalContext.getResourcePaths("/WEB-INF");
    iterator = resourcePaths.iterator();
    while (iterator.hasNext()) {
    String path = (String) iterator.next();
    System.out.println(path);
    }
    這段代碼兩次調(diào)用了getResourcePaths方法,第一次傳入“/”,第二次傳入“/WEB-INF”。如果在一個(gè)目錄結(jié)構(gòu)如圖3-2所示的Web應(yīng)用里運(yùn)行以上代碼,則返回的第一個(gè)Set里包含如下路徑:
    /order.jsp
    /index.jsp
    /Styles.css
    /images/
    /details.jsp
    /WEB-INF/
    /checkOut.jsp
    /browse.jsp
    /shoppingCart.jsp
    /search.jsp
    /menu.jsp
    第二個(gè)Set里包含如下路徑:
    /WEB-INF/faces-config.xml
    /WEB-INF/web.xml
    /WEB-INF/classes/
    /WEB-INF/lib/

    圖3-2 測(cè)試getResourcesPath的目錄結(jié)構(gòu)
    getResourceAsStream方法是ServletContext.getResourceAsStream的包裝器,它返回指定路徑中作為java.io.InputStream對(duì)象的資源。其方法簽名如下:
    public abstract java.io.InputStream getResourceAsStream(String path)
    3.3.12 編碼URL
    encodeURL方法是HttpServletResponse.encodeURL方法的包裝器,它編碼給定的URL,其方法是加入會(huì)話的ID信息;或者,如果不需要這個(gè)步驟,則直接將給定的URL原封不動(dòng)地返回。其方法簽名如下:
    public abstract String encodeURL(String url)
    在portlet中使用JSF時(shí),encodeActionURL和encodeResourceURL方法很有用。encodeActionURL迫使URL作為參數(shù)傳遞,造成動(dòng)作在入口/portlet中起作用。這個(gè)方法的簽名如下:
    public abstract String encodeResourceURL(String sb)
    encodeResourceURL方法迫使URL作為參數(shù)傳遞,引用資源以在入口/portlet中起作用。該方法造成URL需要根據(jù)包括的特定入口進(jìn)行重定向。實(shí)際上,它簡(jiǎn)單地返回一個(gè)絕對(duì)URL。下面是encodeResourceURL方法的簽名:
    public abstract String encodeResourceURL(String sb)
    3.3.13 分派請(qǐng)求
    dispatchMessage方法可根據(jù)當(dāng)前上下文分派請(qǐng)求。對(duì)servlet而言,它通過調(diào)用forward實(shí)現(xiàn)這一點(diǎn);而對(duì)portlet而言,則是通過調(diào)用include方法實(shí)現(xiàn)這一點(diǎn)。此方法的簽名如下:
    public abstract void dispatchMessage(String requestURL)
    throws java.io.IOException, FacesException

    posted @ 2009-02-12 12:17 origo 閱讀(548) | 評(píng)論 (0)編輯 收藏

    今天在Websphare 6.1.0.2環(huán)境下開發(fā)Struts2應(yīng)用程序,結(jié)果碰到傳說中的404錯(cuò)誤,查看資料,解決之。留個(gè)tag,呵呵。

    問題描述:
    在websphere 6.1.0.2的版本上發(fā)布struts2的程序,跑畫面的時(shí)候總是會(huì)出現(xiàn)FileNotFoundException的404錯(cuò)誤(找不到靜態(tài)資源,比如struts2里面集成的js文件),導(dǎo)致無法進(jìn)行客戶端驗(yàn)證以及實(shí)現(xiàn)ajax技術(shù)。 控制臺(tái)也總是會(huì)出現(xiàn)下面兩個(gè)警告: WARNING: Cannot set status. Response already committed.
    WARNING: Cannot set header. Response already committed.

    解決方法:
    1,這個(gè)是websphare的一個(gè)bug,代號(hào) PK33090
    2,升級(jí)websphare 到6.1.0.9或以后版本,或者下載6.1.0.2的問題解決補(bǔ)丁。
    3,由于我在在開發(fā)環(huán)境下,所以我打算升級(jí)was server 的Runtime。
        1).安裝UpdateInstaller到runtime的目錄下。../base_v61/UpdateInstaller
        2).將webshare的fetch packer文件6.1.0-WS-WAS-WinX32-FP0000009.pak放在maintenance目錄下。
        3).啟動(dòng)UpdateInstalle默認(rèn)就會(huì)指向升級(jí)文件。
        4).安裝
    4,設(shè)置com.ibm.ws.webcontainer.invokefilterscompatibility 參數(shù)為true.


    參考:
    http://www-01.ibm.com/support/docview.wss?uid=swg24014758
    http://www-01.ibm.com/support/docview.wss?rss=180&uid=swg21284395
    http://www-01.ibm.com/support/docview.wss?rs=2044&context=SSCM72&dc=DB560&dc=DB520&uid=swg21199423&loc=en_US&cs=UTF-8&lang=en&rss=ct2044rational



    posted @ 2008-12-26 19:50 origo 閱讀(789) | 評(píng)論 (1)編輯 收藏

    1.      
    <s:div id="loginDiv" theme="ajax">
                <div style="width: 300px;border-style: solid">
                  <s:form action="freemarker.do" >
                    <tr>
                      <td colspan="2">
                        Login
                      </td>
                    </tr>
                    <tr>
                      <td colspan="2">
                        <s:actionerror />
                        <s:fielderror />
                      </td>
                    </tr> 
                      <s:textfield name="username" label="Login name"/>
                      <s:password name="password" label="Password"/>
                      <s:submit theme="ajax" targets="loginDiv" notifyTopics="/freemarker.do"/>   
                  </s:form>
                </div>
       </s:div>

    2.
     <img id="indicator1" src="${pageContext.request.contextPath}/images/indicator.gif"
    alt="Loading Info" style="display:none"/>

    <s:url id="ajaxTest1" value="/freemarker.do" />
            <s:div theme="ajax" id="users1" href="%{ajaxTest1}"
                loadingText="Loading  information..."
                errorText="Unable to contact  server" indicator="indicator1">
                delay="2000"
                updateFreq="60000"
                    Placeholder...
    </s:div>


    https://issues.apache.org/struts/secure/ReleaseNote.jspa?projectId=10030&styleName=Html&version=21743

    http://struts.apache.org/2.x/docs/ajax-tags.html
    http://www.theserverside.com/tt/articles/article.tss?l=AjaxCRUDStruts2
    http://dojotoolkit.org/book/dojo-book-0-4/part-5-connecting-pieces/event-system/topics

    http://struts.apache.org/2.x/docs/ajax-and-javascript-recipes.html

    posted @ 2008-05-09 13:14 origo 閱讀(1229) | 評(píng)論 (0)編輯 收藏

    按照示例弄了下例子:

    <s:url id="ajaxTest" value="/jsonPlugin.do" />
    <s:a theme="ajax" href="%{ajaxTest}" indicator="indicator" targets="userHolder"
    notifyTopics="retrieveUser">go to json ajax sample</s:a>
    <script type="text/javascript">
    dojo.addOnLoad(function() {
    dojo.event.topic.subscribe('retrieveUser', this, function(data, type, e){
    alert(type);
    alert(data);
    if(type == 'load') {
    showUser(data);
    } else if(type == 'error') {
    alert('Can not retrieve the user');
    }
    });
    });

    function showUser(strUser) {
    alert('strUser');
    var oUser = eval('(' + strUser + ')');
    var userHolder = document.getElementById('userHolder');
    var sUser = ('<b><i>Comments: </i></b><hr/>');
    for(i = 0; i < oUser.users.length; i++) {
    sUser += ('<p><b>#' + (i + 1) + ' </b>' + oUser.users[i].cardNo + '</p>');
    }
    userHolder.innerHTML = sUser;
    }
    </script>
    <div id="userHolder">go to json ajax sample data will be here</div>

    結(jié)果alert(type); 時(shí)是before 而不是load,錯(cuò)誤信息:XMLHttpTransport error callback failed: TypeError: node has no properties

    求明示。。。
    posted @ 2008-04-28 15:06 origo 閱讀(897) | 評(píng)論 (0)編輯 收藏

    基于Spring,hibernate,swing,充分展示java的組件化,重用性等特征,在應(yīng)變客戶隨需應(yīng)變的形式中一定可以游刃有余!這就是SOY。

    http://soyframework.com
    posted @ 2008-04-02 11:13 origo 閱讀(193) | 評(píng)論 (0)編輯 收藏

    兩個(gè)類:比如 User 和 Order 是一對(duì)多關(guān)系
    ===============================
    class User < ActiveRecord::Base
      has_many :orders
    end

    class Order < ActiveRecord::Base
       belongs_to :user, :foreign_key => "user_id"
    end

    posted @ 2008-03-16 16:41 origo 閱讀(244) | 評(píng)論 (0)編輯 收藏

    1.定義css
        #product-list .list-line-even {
      background:   #e0f8f8;
    }

    #product-list .list-line-odd {
      background:   #f8b0f8;
    }

    2.在頁面上引用

       <tr valign="top" class="<%= cycle('list-line-odd', 'list-line-even') %>">

    3.查看效果

    posted @ 2008-03-13 14:38 origo| 編輯 收藏

    1.controller
        定義action,指定需要翻頁,示例代碼:
           def list
              @product_pages, @products = paginate :products, :per_page => 10
           end
         @product_pages記錄頁數(shù)信息,@products每頁的集合,每頁10條記錄
    2.view
        <table>
           <tr>
             <% for column in Product.content_columns %>
            <th><%= column.human_name %></th>
             <% end %>
           </tr>
     
           <% for product in @products %>
            <tr>
          <% for column in Product.content_columns %>
        <td><%=h product.send(column.name) %></td>
      <% end %>
      </tr>
    <% end %>
    </table>

    <%= link_to 'Previous page',
           { :page => @product_pages.current.previous } if @product_pages.current.previous %>
    <%= link_to 'Next page',
           { :page => @product_pages.current.next } if @product_pages.current.next %>

    posted @ 2008-03-13 14:30 origo| 編輯 收藏

    1.下載ruby版本例如 ruby186-26.exe,點(diǎn)擊安裝到合適目錄
    2.安裝完成后在command窗口執(zhí)行 ruby -v 可查看ruby版本
    3.在command窗口執(zhí)行g(shù)em install rails --include-dependencies 安裝rails (保證網(wǎng)絡(luò)通暢)
    4.安裝MySql作為測(cè)試數(shù)據(jù)庫
    5.如果要更新rails通過執(zhí)行命令 gem update rails 即可
    6.generate Table 采用命令 ruby script/generate scaffold model名 Admin(這里table名為復(fù)數(shù),對(duì)應(yīng)的model名為table名對(duì)應(yīng)的單數(shù)首字母大寫)
    7.WEBrick啟動(dòng)服務(wù),默認(rèn)端口號(hào)3000
        ruby script/server
    posted @ 2008-03-04 15:48 origo| 編輯 收藏

    主站蜘蛛池模板: 免费爱爱的视频太爽了| 国产亚洲精品福利在线无卡一| 亚洲大码熟女在线观看| 亚洲国产成人久久笫一页| av永久免费网站在线观看| 亚洲美女中文字幕| 国产男女性潮高清免费网站| 中文字字幕在线高清免费电影| 久久久婷婷五月亚洲97号色| 成人免费午间影院在线观看| 国产va免费精品| 亚洲一区二区三区亚瑟| 亚洲第一页综合图片自拍| 性无码免费一区二区三区在线| 亚洲国产成人久久精品大牛影视| 国产亚洲综合网曝门系列| 女人18毛片a级毛片免费| a毛片免费全部在线播放**| 亚洲中文字幕无码爆乳| 久久亚洲国产伦理| 免费人成视频在线观看视频 | 国产亚洲漂亮白嫩美女在线 | 亚洲乱色伦图片区小说| 亚洲区小说区激情区图片区| 欧美三级在线电影免费| 成全动漫视频在线观看免费高清版下载 | 无码精品人妻一区二区三区免费| 亚洲综合久久成人69| 亚洲精品国产福利一二区| 欧美三级在线电影免费| 日韩电影免费在线观看| 免费人妻精品一区二区三区| 亚洲电影免费观看| 国产l精品国产亚洲区在线观看| 最好免费观看韩国+日本 | 中国精品一级毛片免费播放| 无码亚洲成a人在线观看| 久久久久亚洲精品无码蜜桃| 亚洲无码视频在线| 免费a级毛片无码av| 成年在线观看网站免费|