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

BlogJava 首页 新随笔 联系 聚合 管理
  46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

   目前正在使用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自带的页面错误页面。


posted on 2009-10-28 18:06 VWPOLO 阅读(2387) 评论(12)  编辑  收藏 所属分类: Java 技术Web 开发

Feedback

# re: Wicket使用笔记之更改资源定位器 2009-11-18 10:00 erics
最近在学Wicket,刚从JSF和SSH那边转过来,但是一直没有配置正确。不知能不能请你把你做得这个Demo发我研究下呢(最好是完整的项目,包括包和配置文件等),万分感谢!  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-02 16:41 yanweijie
博主,你能不能讲讲wicket的resource,我如果有大量的图片,该如何引用,我的图片都放在web页这个目录里  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-02 22:14 VWPOLO
@yanweijie
这个可以直接引用啊,比如我的Web工程结构式
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>   回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-03 09:20 yanweijie
谢谢博主的热心回复。还想问你个问题,wicket怎么做那个在线支付,接口要求用form的action属性直接指向一个网关,我如果在wicket的form组件里用了onSubmit(),action属性就不起作用了,可是我两种都想要,既要用html的action提交数据,同时在onSubmit()里处理我自己的业务。   回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-03 09:26 yanweijie
@VWPOLO
resource原理是什么,是根据你前面写的locator还是wicket的PakageResource?可是pakageResource的构造方法都是带Class的?web页目录下哪有类,所以必须要有你的locator才能生效?  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器[未登录] 2010-04-03 13:46 VWPOLo
@yanweijie
我在OnSubmit中是使用脚本实现这样的功能的  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器[未登录] 2010-04-03 13:48 VWPOLo
@yanweijie
这里的resource和wicket没有什么关系,我这里的资源管理器主要用于加载html文件,因为wicket的java类默认从当前文件夹加载对应的html文件。注意这里的resource文件夹不能重命名为resources,会出现问题  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-03 15:59 yanweijie
@VWPOLo
那真是无奈了,我现在也不懂JavaScript,为啥就没有更简单的方式呢,可不可以像ExternalLink一样直接请求url,只不过后面跟了参数而已  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-04 11:03 yanweijie
博主,我在邮件列表中搜到一个方法,WebRequestCycle.get().setRequestTarget(new RedirectRequestTarget("URL...")); 试了下貌似可以。  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器[未登录] 2010-04-04 14:46 VWPOLO
@yanweijie
恭喜你,我也学到一招  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-05 11:14 yanweijie
这种方式还是不行,我只能构造get方式的url,post不知道该怎么做  回复  更多评论
  

# re: Wicket使用笔记之更改资源定位器 2010-04-06 15:37 yanweijie
博主能不能把你的实现方式发过来给小弟参考下,不胜感激。361273693@qq.com  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: