2006-12-29

tapestry 使用 Block和RenderBlock组件

关键字: tapestry

    tapestry的优点是 组件化开发 以及 页面模板 的可以用所见即所得的编辑器设计。


    这使得以前的经验不适用了

    比如  struts 的 titles 标签和webwork 的sitemesh 标签使得mvc框架可以支持 Decorator模式 ,让界面有一致的布局

    而  tapestry 以page为中心的概念很难使用上面2个标签库。


  
    解决方法:使用   Block和RenderBlock组件 让一个母page运行时显示指定的子组件

   
    就好像word打开一个文档,菜单都一样,文档内容不同

 


1    把所有的子内容写成组件, 定义各个子Block组件,一个Block包含一个子组件
子组的类件继承自BaseComponent类,可以使用html模板

  
    
 

 

2    母page的模板设计成3个区域 标题域  菜单域 和 内容域(层和table皆可)


3    母page 的 类  需要 一个属性(String类型) 来保存 需要显示的子 Block的jwcid
 @Persist
    @InitialValue("literal:blck1a") 
 public abstract String getCounter();
    public abstract void setCounter(String counter);


4   菜单域的各个链接 修改  母page 的 类 的属性,用来指明需要画的block

  show blck1

////
   
    public void doClick(String increment)
    {

       
        setCounter(increment);
       
     
       
    } 

 

 

5    内容域中的RenderBlock组件 其block参数邦定到 母page 的 类  的 属性上

 Page content goes here


/////////////////////
 public Block getSelectedBlock() {

  String id4cmp = getCounter();

  IComponent mycmp = null;

  mycmp = getNestedComponent(id4cmp);

  //mycmp =getContainer().getComponent("blck1a");

  return (Block) mycmp;

 }

 

这样可以在一个page上的一个位置显示不同的组件来实现 Decorator模式的效果

   

评论
zzsczz 2007-01-02   回复
还有就是在每个子页面使用@Border。。
使用Border把公共的架子抽取出来
每个page把内容写在
<span jwcid="@Border">

</span>
之间。

见tapestry的Workbench例子。这就不用写component了
发表评论

该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子

zzsczz
搜索本博客
博客分类
最近加入圈子
存档
最新评论