2012-03-29 19 views
0

我開發了一個商店系統。有一個產品頁面,其中列出了某些選擇菜單過濾的可用項目。還有一個項目詳細信息頁面可查看有關每種產品的一些內容。該頁面的內容將從xml屬性文件中加載。如果用戶點擊項目列表視圖中的鏈接,查看一些細節,則會設置項目特定的GET參數。通過參數值,我可以通過更改已加載的鍵名稱,從我的屬性中動態加載該特定項目的內容。wicket:根據請求將不同路徑映射到同一類,以在標記中生成不同的內容

迄今爲止好,但不是很好。對背景非常感興趣。讓我們來了解一些細節。

最重要的是,這是一些SEO動機的東西。到目前爲止,在有狀態頁面的url中,頁面實例ID也存在問題,這不僅因爲不穩定的URL,還因爲Wicket正在執行302重定向來操縱URL。也許我會刪除項目詳細信息頁面的有狀態組件以解決該問題。

所以現在有一些QR碼被銷售的產品,包含我的詳細信息頁面的鏈接。這些鏈接並非由我自己設計的,正如您可以想象的,它們看起來像很多不同的網址。可以說QR碼的url路徑是「/ shop/item1」,其中item1是產品名稱。我的頁面類是ItemDetailPage。 我寫了一個IRequestMapper,我正在安裝在我的WebApplication#init()中,它正在解析傳入的請求URL並檢查它是否需要由此IRequestMapper解決。如果是這樣,我使用PageProvider構建我的頁面並返回一個請求處理程序。

public IRequestHandler mapRequest(Request request) { 
       if(compatibilityScore>0) { 
        PageProvider provider = new PageProvider(ItemDetailPage.class, new ItemIDUrlParam(request.getUrl().getPath().split("/")[1])); 
        provider.setPageSource(Application.get().getMapperContext()); 
        return new RenderPageRequestHandler(provider); 
       } 
       return null; 
      } 

所以,你可以看到,我建立了一個參數,我的詳細信息頁面可以處理。但由此產生的URL不是很好。我想通過將可加入書籤的內容映射到原始網址來保留原始網址,而不用任何重定向。 我的第一個想法是實現一個URLCodingStrategy以路徑的形式重建URL的參數。我認爲HybridUrlCodingStrategy正在做類似的事情。 使用IRequestMapper解析URL路徑「/ shop/item1 /」後,它看起來像「/ shop/item?1?id = item1」,其中第一個參數偏離當然是wicket pageinstance Id,因爲我將重建詳細信息頁面爲無狀態:( 在應用HybridURLCodingStrategy之後,它可能看起來像「/ shop/item/1/id/item1」或「/ shop/item/id/item1」,沒有頁面實例ID。將刪除第二個路徑部分和參數名稱,並只使用參數值,以便url看起來像「/ shop/item1」,然後與請求中的網址相同。

你們有任何有關這個或任何聰明的想法的經驗? rewuirements是

  1. 具有用於每個產品一個固定URL的SE bot可以索引
  2. 沒有參數
  3. 無國籍和可收藏
  4. 無302重定向以任何方式。
  5. 請求項標識必須爲detailpage可

與德國 馬塞爾親切的問候

+2

您使用的Wicket版本是什麼?此外,無論是檢票1.5還是檢票1.5,您都需要編寫IRequestMapper,而是將您的ItemDetailPage安裝到「/ shop」。請參閱有關在1.5安裝在這裏的exe文章:http://wicketinaction.com/2011/07/wicket-1-5-mounting-pages/ – bert 2012-03-29 20:04:48

+0

我在1.5和我的頁面與wicketstuff註釋。我還安裝了其他一些映射器。我的情況是,我只需要將一個具有相關標記的類映射到不同的URL。如果我將我的詳細信息頁映射到/ shop,我應該如何解決我的詳細信息頁中的其餘路徑以識別必須加載的激活項目。如果有人打電話/ shop/item1,在/ shop下的掛載頁面會得到關於該信息的信息?我在這裏想念什麼? – 2012-03-29 21:35:54

+1

不知道我在這裏理解你是否正確。但'item1'只是一個Pageparam。您可以將商店頁面裝入商店,並告訴Wicket將/ shop/in後的任何內容作爲參數傳遞給該頁面。你是否也想擁有/ shop /下的產品清單?沒有任何參數?關於ML中的URL的頁面ID有一個有趣的討論,現在:http://www.mail-archive.com/[email protected]/msg69983.html Gruss aus Dresden,Bert – bert 2012-03-30 07:17:21

回答

6

正如伯特說,你的使用情況上應覆蓋正常的頁面安裝,也見MountedMapper wiki page,爲您的情況下,具體的例子:

mountPage("/shop/${id}", ShopDetailPage.class); 

鑑於「物品1」是該項目的ID(這是不是很清楚,我),你現在可以檢索它作爲第n Wicket中的主頁參數id。另一個例子經常出現在SEO鏈接,含有獨特的ID和(非唯一的,不斷變化的)標題:

mountPage("/shop/${id}/${title}", ShopDetailPage.class); 

關於頁面實例ID,也有一些方法來擺脫它,也許是最好的方法是按照您的說法使頁面成爲無狀態,另一個簡單的方法是將IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER配置爲呈現策略(請參閱API doc以瞭解結果)。

+0

啊現在我明白了,沒有注意到參數化的安裝路徑。你說得對,「item1」將是唯一的商品標識符。我嘗試了這一點,還有一些東西與頁面Id的靈感來自於@bert的鏈接。我將在當天晚些時候發佈我的整個解決方案和解決方案。 – 2012-03-30 10:14:38

+0

我也注意到,我在上面的鏈接中使用了AbsoluteURLRenderer。但它不會將主持人置於可收藏頁面的路徑之前!?你有什麼想法如何提高這一點? – 2012-03-30 10:22:18

+0

查看[Wiki](https://cwiki.apache.org/WICKET/getting-a-url-for-display.html) – Heri 2012-03-30 12:07:06

相關問題