目前正在使用Wicket + xhtml + JQuery + Spring + Hibernate在做一個(gè)電子商務(wù)網(wǎng)站,類似于京東的那樣,通過這些時(shí)間的使用,總結(jié)了一下Wicket 學(xué)習(xí)筆記。
Wicket 的頁面包含兩個(gè)基本的文件,分別.html 和.java 文件,.html文件負(fù)責(zé)界面的描述,.java文件負(fù)責(zé)實(shí)現(xiàn)邏輯了,比如提供數(shù)據(jù)。在默認(rèn)的情況下,.html和.java放在同一個(gè)包里面,wicket引擎的默認(rèn)搜索路徑是在java文件的所在的包下面搜索,我很不喜歡這種方式,因?yàn)槿绻募欢啵煸谝黄鸷懿缓枚ㄎ?而且如果你是使用Eclipse WTP來開發(fā)Web項(xiàng)目,你可能會(huì)將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文件放在同級(jí)目錄,就沒有這么方便了,可能需要在路徑前面添加N個(gè) ” ../ ” 這樣的符號(hào)來定位上級(jí)目錄
那到底怎么樣才能分類html和java文件呢?
那
你可以自己創(chuàng)建 ResourceStreamLocator 的子類來自定義搜索路徑。然后在你的WebApplication中這樣添加
getResourceSettings().setResourceStreamLocator(new EasyBuyResourceStreamLocator(getServletContext()));
在我的項(xiàng)目中我簡化了包結(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類,在資源定位器搜索的時(shí)候時(shí)判斷一下類型,這樣就不會(huì)將其他的WebPage的資源給攔截了,比如Wicket自帶的頁面錯(cuò)誤頁面。