origo

          origo

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

          2009年2月12日 #

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

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

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

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

          2008年12月26日 #

          今天在Websphare 6.1.0.2環境下開發Struts2應用程序,結果碰到傳說中的404錯誤,查看資料,解決之。留個tag,呵呵。

          問題描述:
          在websphere 6.1.0.2的版本上發布struts2的程序,跑畫面的時候總是會出現FileNotFoundException的404錯誤(找不到靜態資源,比如struts2里面集成的js文件),導致無法進行客戶端驗證以及實現ajax技術。 控制臺也總是會出現下面兩個警告: WARNING: Cannot set status. Response already committed.
          WARNING: Cannot set header. Response already committed.

          解決方法:
          1,這個是websphare的一個bug,代號 PK33090
          2,升級websphare 到6.1.0.9或以后版本,或者下載6.1.0.2的問題解決補丁。
          3,由于我在在開發環境下,所以我打算升級was server 的Runtime。
              1).安裝UpdateInstaller到runtime的目錄下。../base_v61/UpdateInstaller
              2).將webshare的fetch packer文件6.1.0-WS-WAS-WinX32-FP0000009.pak放在maintenance目錄下。
              3).啟動UpdateInstalle默認就會指向升級文件。
              4).安裝
          4,設置com.ibm.ws.webcontainer.invokefilterscompatibility 參數為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 閱讀(788) | 評論 (1)編輯 收藏

          2008年5月9日 #

          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 閱讀(1228) | 評論 (0)編輯 收藏

          2008年4月28日 #

          按照示例弄了下例子:

          <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>

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

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

          2008年4月2日 #

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

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

          2008年3月16日 #

          兩個類:比如 User 和 Order 是一對多關系
          ===============================
          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) | 評論 (0)編輯 收藏

          2008年3月13日 #

          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記錄頁數信息,@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| 編輯 收藏

          2008年3月4日 #

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

          2008年3月1日 #

          傳統采用Client/Server架構的軟件的缺陷:
                 傳統采用Client/Server架構(使用PB,Delphi,VB等工具開發)的應用系統都有無法避免的兩大缺陷:
                 第一,升級困難: 由于需要對每個客戶端分別部署,系統升級時需對每個客戶端做升級,如果有上百臺客戶端,升級簡直就是一場噩夢, 將耗費大量的人力。
                 第二,客戶端直接訪問數據庫: 這也是傳統Client/Server架構軟件致命的缺陷, 傳統CS系統的Server端其實就是數據庫, 由于沒有應用服務器的支持, 它們的數據庫訪問模式都是在客戶端直接連接數據庫。 如:刪除一條記錄需要在刪除按鈕的按鈕事件中拼好刪除記錄的SQL語句, 連接數據庫,執行刪除語句。如果數據庫在Internet上,訪問數據庫將會帶來巨大的開銷, 況且在當前網絡環境下任何一家企業都不可能將自己的業務數據庫直接暴露于Internet, 因此傳統C/S架構的系統僅限于在局域網使用, 無法滿足企業應用對于任何用戶任何地點都可以使用系統的需要。

          當前主流Brower/Server架構的軟件所面臨的問題 :
               B/S(瀏覽器/服務器模式)是隨著Internet技術的興起, 對C/S結構的一種改進。在這種結構下, 軟件應用的業務邏輯完全由Web服務器端處理,而將數據交互和展示放到瀏覽器上, 客戶端只需要通過瀏覽器即可進行業務處理, 由于C/S架構的軟件可以極大的方便系統的部署和提高系統的使用范圍。 使它成為當今主流應用軟件的體系結構。但是B/S模式最讓人詬病的即是其單一的用戶操作模式, 用戶體驗完全不能和C/S相提并論。隨著AJAX技術的出現,為B/S開發注入了一劑強心針, 它使瀏覽器可以為用戶提供更為自然的瀏覽體驗,然而AJAX對程序員提出了更高的要求: HTML,Javascript,CSS,DOM,一個都不能少。即使一個高素質的程序員在實現交互性比較高的復雜界面時, 往往需付出極其繁重的勞動,進而造成開發周期長、開發成本過高,且不能達到用戶的滿意度。 大量AJAX框架的出現似乎都聲稱可以解決這些問題,然而程序員發現這些“功能強大”的框架往往只能應用于一個很小層面, 不能完全解決一個業務系統的展現層所面臨的問題, 而且這些框架大都需要使用大量的Javascript代碼,給項目的維護提出了挑戰。
           
          輕量級企業應用框架,延續B/S,回歸C/S
          http://www.soyframework.com/
          目前以有人在弄這方面的東西,值得關注哈
          posted @ 2008-03-01 11:55 origo 閱讀(3321) | 評論 (12)編輯 收藏

          僅列出標題  下一頁
          主站蜘蛛池模板: 福海县| 榆社县| 宜宾县| 绥德县| 太仆寺旗| 富民县| 舟曲县| 银川市| 宜宾市| 大新县| 星子县| 龙游县| 枣强县| 合作市| 驻马店市| 宝山区| 肥乡县| 剑河县| 海宁市| 天水市| 当雄县| 辽阳市| 屏山县| 昂仁县| 肃南| 南投县| 旬阳县| 北辰区| 台南县| 安国市| 商都县| 徐州市| 彰化市| 永善县| 五华县| 呼伦贝尔市| 新田县| 深州市| 楚雄市| 五原县| 黎平县|