`
vwpolo
  • 浏览: 191041 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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可以通过  这样使用 resource/styles/common/ 文件夹下面的 common.css 文件,图片也可以通过这样引用。如果你将html和java文件放在同级目录,就没有这么方便了,可能需要在路径前面添加N个 ../ 这样的符号来定位上级目录

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

 

 

 那到底怎么样才能分类html和java文件呢?

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

 我的 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自带的页面错误页面。

<!--EndFragment-->
getResourceSettings().setResourceStreamLocator(new EasyBuyResourceStreamLocator(getServletContext()));

 

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

 

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

分享到:
评论
3 楼 vwpolo 2009-11-19  
jnoee 写道
resources是wicket的关键字,它默认将组件关联的css、js文件解压在这个目录下,并通过这个路径引用。
资源位置改变但仍需建立与包名结构相同的目录层次结构,因此改变资源定位变得意义不大了。
最终我们还是采用它默认的方式,反而好维护一些。


我这里只是想简单一点按照我的喜好来设置目录层次的结构,当然,Wicket对这方面的扩展支持的非常好,可以按照自己的想法来定义,而我当初这样定义的话是想在html中以resources文件作为参考目录进行资源引用的。
2 楼 jnoee 2009-11-19  
resources是wicket的关键字,它默认将组件关联的css、js文件解压在这个目录下,并通过这个路径引用。
资源位置改变但仍需建立与包名结构相同的目录层次结构,因此改变资源定位变得意义不大了。
最终我们还是采用它默认的方式,反而好维护一些。
1 楼 malasun 2009-11-17  
很好,顶一个

相关推荐

    Wicket 8.X开发文档(中文翻译+英文原版)

    使用资源包聚合多个资源 16.8。将JavaScript放在页面正文中 16.9。标题贡献者定位 16.10。自定义资源 16.11。安装资源 16.12。Lambda支持 16.13。共享资源 16.14。自定义资源加载 16.15。CssHeaderItem和...

    wicket指南

    wicket开发指南,wicket 新型的web开发框架,现以能无逢支持jsr168/286

    wicket国际化例子

    wicket国际化例子 含有wicket:message StringResourceModel 等读取properties资源文件的代码示例

    wicket 开发指南 doc

    wicket 开发指南 比较全面的介绍wicket的使用

    Wicket开发指南.pdf

    Wicket开发指南 Wicket开发指南 Wicket开发指南

    wicket文档

    wicket学习文档

    apache-wicket

    Wicket has been around since 2004 and it has been an Apache project since 2007. During these years it has proved to be a solid and valuable solution for building enterprise web applications. Wicket ...

    wicket 基础知识培训

    wicket 基础知识培训,主要是讲解wicket入门知识,通过和struts比较来进行讲解。

    Wicket 入门

    Wicket 入门,以及Eclipse里建立project

    wicket_mvn库

    wicket编译所需的maven库,搬运

    wicket-menu-6.5.0.zip

    wicket-menu.zip,Wicket菜单

    wicket 6.x api.chm wicket帮助文档

    wicket 6.x api.chm wicket帮助文档

    wicket的tree的简单实例

    这是继wicket的简单实例之后,关于tree的简单用法,初学者可以下载下来学习如何生成树,以及树的使用

    wicket-examples

    wicket-examples 示例 wicket-examples 示例 wicket-examples 示例 wicket-examples 示例

    Wicket 开发指南

    Wicket 开发指南,wicket介绍,环境搭建,使用方法

    wicket开发详解

    开发详解想写一份这样的Wicket 文档,源于2005 年中,那是用Wicket1.0 完成了第一个项目以 后的想法,觉得如此好的一个Web 框架,应该让更多的开发人员了解和使用它。因此在 05 年9 月份的时候开始了这份文档的初稿...

    Wicket.pdf(Wicket开发指南)

    Wicket,有一个优秀的Web框架。和Struts和Webwork类似的Java WEB开发框架。优点在于对HTML和业务代码进行了有效的分离(流行的WEB框架大多如此)。基于规则的配置(有效减少了XML配置文件的使用,与Spring相比,...

    wicket1.4.7中的jar包

    从wicket官网中下载的wicket1.4.7中jar包,对于编写wicket相关的程序有所需要的朋友可以下载

    Wicket开发指南-简体版

    Wicket是一个基于Java的Web开发框架,与Struts,WebWork,Tapestry类似。其特点在于对Html和代码进行了有效的分离(有利于程序员和美工的合作),基于规则的配置(减少了XML等配置文件的使用),学习曲线较低(开发...

    wicket相关书籍

    wicket相关书籍 好东西啊

Global site tag (gtag.js) - Google Analytics