好好生活,努力工作,天天向上!

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

             目前正在使用Wicket + xhtml + JQuery + Spring + Hibernate在做一個電子商務(wù)網(wǎng)站,類似于京東的那樣,通過這些時間的使用,總結(jié)了一下Wicket 學(xué)習(xí)筆記。

             Wicket 的頁面包含兩個基本的文件,分別.html 和.java 文件,.html文件負(fù)責(zé)界面的描述,.java文件負(fù)責(zé)實現(xiàn)邏輯了,比如提供數(shù)據(jù)。在默認(rèn)的情況下,.html和.java放在同一個包里面,wicket引擎的默認(rèn)搜索路徑是在java文件的所在的包下面搜索,我很不喜歡這種方式,因為如果文件一多,混在一起很不好定位,而且如果你是使用Eclipse WTP來開發(fā)Web項目,你可能會將html文件放在 WebContent 的pages文件夾下,將資源(比如圖片,CSS,JS) 放在Web工程下面的 WebContent  文件夾下的resource文件夾下(注意,我使用的是Wicket 1.4,不能引用resources文件夾的文件,很奇怪,難道resources是關(guān)鍵字?),這樣的話,在pages文件夾下面的html文件可以直接將resource 文件夾作為參考目錄進(jìn)行引用,比如pages下面的IndexPage.html可以通過

          <link href="resource/styles/common/common.css" rel="stylesheet" type="text/css"> 

             這樣使用 resource/styles/common/ 文件夾下面的 common.css 文件,圖片也可以通過這樣引用。如果你將html和java文件放在同級目錄,就沒有這么方便了,可能需要在路徑前面添加N個 ../ 這樣的符號來定位上級目錄


             那到底怎么樣才能分類html和java文件呢?


             你可以自己創(chuàng)建 ResourceStreamLocator 的子類來自定義搜索路徑。然后在你的WebApplication中這樣添加

          getResourceSettings().setResourceStreamLocator(new EasyBuyResourceStreamLocator(getServletContext()));

            
            在我的項目中我簡化了包結(jié)構(gòu),下面是我的包結(jié)構(gòu):

             我將頁面java代碼(繼承自 org.apache.wicket.markup.ht ml.*  的類)放在page源文件夾下面,非頁面java代碼放在src源文件夾下面,conf源文件夾放Hibernate和Spring的配置文件。page源文件下面的包結(jié)構(gòu)和WebContent下面的pages文件夾保持一致。

           
            我的
          ResourceStreamLocator 子類是這樣寫的:

           /**
           * 資源定位器。
           * 
           * 
          @author 劉堯興 2009-10-16
           
          */
          public class EasyBuyResourceStreamLocator extends ResourceStreamLocator {

              
          /**      */
              
          private ServletContext servletContext;

              
          /**
               * 構(gòu)造函數(shù)。
               * 
          @param servletContext
               
          */
              
          public EasyBuyResourceStreamLocator(ServletContext servletContext) {
                  
          this.servletContext = servletContext;
              }

              @Override
              
          public IResourceStream locate(Class<?> clazz, String path) {
                  
          if(matchClass(clazz, ParentPage.class)) {
                      URL resourceUrl 
          = getPageHtmlResourceUrl(clazz, path);
                      
          if (resourceUrl != null) {
                          
          return new UrlResourceStream(resourceUrl);
                      }
                  }
                  
          if(matchClass(clazz, ParentPanel.class)) {
                      URL resourceUrl 
          = getPanelHtmlResourceUrl(clazz, path);
                      
          if(resourceUrl != null)
                          
          return new UrlResourceStream(resourceUrl); 
                  }
                  
                  
          // resource not found; fall back on class loading
                  return super.locate(clazz, path);
              }
              
              
          /**
               * 匹配文件類型  。
               * 
          @author 劉堯興
               * 
          @param source
               * 
          @param target
               * 
          @return boolean
               
          */
              
          public boolean matchClass(Class source,Class target) {
                  
          if(source == target)
                      
          return true;
                  
          if(source.getSuperclass() == target) 
                      
          return true;
                  
          if(source.getSuperclass().getSuperclass() == target) 
                      
          return true;
                  
          if(source.getSuperclass().getSuperclass().getSuperclass() == target)
                      
          return true;
                  
                  
          return false;
              }

              
          /**
               * 貨物HTML頁面資源URL  。
               * 
          @author 劉堯興
               * 
          @param clazz
               * 
          @param path
               * 
          @return URL
               
          */
              
          private URL getPageHtmlResourceUrl(Class<?> clazz, String path) {
                  
          try {
                      
          return servletContext.getResource("/"+path);
                  } 
          catch (MalformedURLException e) {
                      e.printStackTrace();
                  }
                  
          return null;
              }
              
              
          /**
               * 獲得HTML面板的資源URL  。
               * 
          @author 劉堯興
               * 
          @param clazz
               * 
          @param path
               * 
          @return URL
               
          */
              
          private URL getPanelHtmlResourceUrl(Class<?> clazz, String path) {
                  
          try {
                      
          return servletContext.getResource("/"+path);
                  } 
          catch (MalformedURLException e) {
                      e.printStackTrace();
                  }
                  
          return null;
              }
          }

            我的WebPage頁面都繼承自我自定義的ParentPage類,在資源定位器搜索的時候時判斷一下類型,這樣就不會將其他的WebPage的資源給攔截了,比如Wicket自帶的頁面錯誤頁面。


          posted on 2009-10-28 18:06 VWPOLO 閱讀(2405) 評論(12)  編輯  收藏 所屬分類: Java 技術(shù)Web 開發(fā)

          Feedback

          # re: Wicket使用筆記之更改資源定位器 2009-11-18 10:00 erics
          最近在學(xué)Wicket,剛從JSF和SSH那邊轉(zhuǎn)過來,但是一直沒有配置正確。不知能不能請你把你做得這個Demo發(fā)我研究下呢(最好是完整的項目,包括包和配置文件等),萬分感謝!  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-02 16:41 yanweijie
          博主,你能不能講講wicket的resource,我如果有大量的圖片,該如何引用,我的圖片都放在web頁這個目錄里  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-02 22:14 VWPOLO
          @yanweijie
          這個可以直接引用啊,比如我的Web工程結(jié)構(gòu)式
          WebContent/resource/products/book/aaa.jpg
          WebContent/resource/products/book/bb.jpg

          使用的話是這樣,在HTML中
          <A href="http://static.easybuy.com/book/topic/2036_14350.shtml" target=_blank><IMG src="resource/products/book/aaa.jpg" border=0></A>   回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-03 09:20 yanweijie
          謝謝博主的熱心回復(fù)。還想問你個問題,wicket怎么做那個在線支付,接口要求用form的action屬性直接指向一個網(wǎng)關(guān),我如果在wicket的form組件里用了onSubmit(),action屬性就不起作用了,可是我兩種都想要,既要用html的action提交數(shù)據(jù),同時在onSubmit()里處理我自己的業(yè)務(wù)。   回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-03 09:26 yanweijie
          @VWPOLO
          resource原理是什么,是根據(jù)你前面寫的locator還是wicket的PakageResource?可是pakageResource的構(gòu)造方法都是帶Class的?web頁目錄下哪有類,所以必須要有你的locator才能生效?  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器[未登錄] 2010-04-03 13:46 VWPOLo
          @yanweijie
          我在OnSubmit中是使用腳本實現(xiàn)這樣的功能的  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器[未登錄] 2010-04-03 13:48 VWPOLo
          @yanweijie
          這里的resource和wicket沒有什么關(guān)系,我這里的資源管理器主要用于加載html文件,因為wicket的java類默認(rèn)從當(dāng)前文件夾加載對應(yīng)的html文件。注意這里的resource文件夾不能重命名為resources,會出現(xiàn)問題  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-03 15:59 yanweijie
          @VWPOLo
          那真是無奈了,我現(xiàn)在也不懂JavaScript,為啥就沒有更簡單的方式呢,可不可以像ExternalLink一樣直接請求url,只不過后面跟了參數(shù)而已  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-04 11:03 yanweijie
          博主,我在郵件列表中搜到一個方法,WebRequestCycle.get().setRequestTarget(new RedirectRequestTarget("URL...")); 試了下貌似可以。  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器[未登錄] 2010-04-04 14:46 VWPOLO
          @yanweijie
          恭喜你,我也學(xué)到一招  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-05 11:14 yanweijie
          這種方式還是不行,我只能構(gòu)造get方式的url,post不知道該怎么做  回復(fù)  更多評論
            

          # re: Wicket使用筆記之更改資源定位器 2010-04-06 15:37 yanweijie
          博主能不能把你的實現(xiàn)方式發(fā)過來給小弟參考下,不勝感激。361273693@qq.com  回復(fù)  更多評論
            

          主站蜘蛛池模板: 平果县| 霞浦县| 上犹县| 呼图壁县| 嘉黎县| 当雄县| 青岛市| 布拖县| 基隆市| 聂拉木县| 和顺县| 安溪县| 益阳市| 乐陵市| 团风县| 西乌珠穆沁旗| 陇西县| 荆州市| 昌吉市| 清丰县| 两当县| 翼城县| 仁怀市| 东宁县| 石棉县| 江华| 枣强县| 濮阳市| 惠东县| 琼结县| 昔阳县| 瑞安市| 兴宁市| 南丰县| 蚌埠市| 五大连池市| 昭通市| 慈利县| 新沂市| 上栗县| 邢台县|