Wicket使用笔记之更改资源定位器

Wicket使用笔记之更改资源定位器

   目前正在使用Wicket + xhtml + JQuery + Spring + Hibernate在做一个电子商务网站,类似于京东的那样,通过这些时间的使用,总结了一下Wicket 学习笔记。

   Wicket 的页面包含两个基本的文件,分别.html 和.java 文件,.html文件负责界面的描述,.java文件负责实现逻辑了,比如提供数据。在默认的情况下,.html和.java放在同一个包里面,wicket引擎的默认搜索路径是在java文件的所在的包下面搜索,我很不喜欢这种方式,因为如果文件一多,混在一起很不好定位,而且如果你是使用Eclipse WTP来开发Web项目,你可能会将html文件放在 WebContent 的pages文件夹下,将资源(比如图片,CSS,JS) 放在Web工程下面的 WebContent  文件夹下的resource文件夹下(注意,我使用的是Wicket 1.4,不能引用resources文件夹的文件,很奇怪,难道resources是关键字?),这样的话,在pages文件夹下面的html文件可以直接将resource 文件夹作为参考目录进行引用,比如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文件呢?


   你可以自己创建 ResourceStreamLocator 的子类来自定义搜索路径。然后在你的WebApplication中这样添加

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

  
  在我的项目中我简化了包结构,下面是我的包结构:

   我将页面java代码(继承自 org.apache.wicket.markup.ht ml.* 下 的类)放在page源文件夹下面,非页面java代码放在src源文件夹下面,conf源文件夹放Hibernate和Spring的配置文件。page源文件下面的包结构和WebContent下面的pages文件夹保持一致。

 
  我的
ResourceStreamLocator 子类是这样写的:

  /**
 * 资源定位器。
 * 
 * 
@author  刘尧兴 2009-10-16
 
*/
public   class  EasyBuyResourceStreamLocator  extends  ResourceStreamLocator {

    
/**        */
    
private  ServletContext servletContext;

    
/**
     * 构造函数。
     * 
@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自带的页面错误页面。


你可能感兴趣的:(Wicket使用笔记之更改资源定位器)