Open-Open

皇家撒拉哥萨
posts - 32, comments - 3, trackbacks - 0, articles - 1

[转贴]Tapestry 心得

Posted on 2006-03-26 00:29 开源爱好者 阅读(231) 评论(0)  编辑  收藏 所属分类: Tapestry
对于整个tapestry的设计和实现其实最核心的部分就是对于页面和配置页以及逻辑类的配合。在学习和使用tapestry的时候,我们可以完全不用理会jsp的概念,因为他们从设计思想上就完全不同。
  传统的jsp设计,或者说servlet设计是一种根据jsp和servlet不同的优点设计的mvc模式。对于jsp,显示更加便捷,更加灵活,所以更多地用于页面显示,而servlet则更多的突现了它对于后台的强大控制力,所以更多地被用于控制器,也就是controller。mvc的设计模式是,无论什么样的请求,都需要通过对于url的模糊匹配被定位到第一级或者顶级控制器,再通过控制器对于所传递的请求进行解析分析后,重定向到正确的处理类中,也就是说,我们对于整个应用需要些大于总页面个数的java类来完成所规定功能。这在一定程度上浪费了资源和开发时间。当然,在软件工程学中,本就提出了几种不同的解决方法,mvc模式可以使我们应用更加清晰化,更加可维护化。
  当然,抽象地说,tapestry在设计中完全没有了控制器的概念。当然这也是个人的观点。开发过程中,我只是设计,在用户使用我所写的页面的时候会出现多少种状况,然后设计相应的页面。这样就更加类似我们在c中的开发,瀑布式开发模式。还是做个例子比较好,对不对?
暂时不给大家.htm和.page文件了,不然大家会越来越晕的,只给大家讲解一下.java文件
public abstract void SubjectList extends GbsBasePage
{
     public abstract Subject getSubject();
     public abstract void setSubject();

     public abstract Subject getParentSubject();
     public abstract void setSubject();

     public IsubjectService getIsubjectService()
     {return (IsubjectService)getService("subjectService");}

     public List getSubjectList()
     {
           List list=new ArrayList(getSubject().getSubjects());
           return list;
     }
    
      public void addSubject(IRequestCycle cycle)
      {
           AddSubject addSubject=(AddSubject)cycle.getPage("add_subject");
          
           addSubject.setParentSubject(getSubject().getParentSubject());
           forward(cycle,"add_subject");
      }

      public void defineSubSubject(IRequestCycle cycle)
      {
          SubjectList subjectList=(SubjectList)cycle.getPage("subject_list");
          subjectList.setParentSubject(getSubject);
          forward(cycle,"subject_list");
      }
}
     朋友们可能会看得很迷糊,对吧?其实这就是tapestry的优点了。如果你希望把一些东西绑定在页面上的话,那么我根本就不需要在java类中处理他们,只需要将实体类在.page中声明一下,例如,
<property-specification name="subject" type="com.tapestry.Subject"/>
     然后在java类中抽象的声明他们,tapestry就会自动将你所需要绑定的属性绑定在实体上,处理的时候只需要调用就可以了。
   那么,这个IService又是怎么回事儿呢?其实我们在页面之间进行数据或者实体传递的时候,为了提高速度,或者提高效率,或者提高安全性,我们都可以通过传递id的方式进行,那么通过spring的service方法,我们就可以快速的找到这个实体,例如:
Subject subject=getSubjectService().Load(getSubject().getID());
     同时,我们这个页面所需要的控件也需要我们传递相应的参数来显示我们所需要的效果,这就是为什么要有getSubjectList()这个方法了。在我们使用foreach控件或者actionTable控件的时候,都需要我们传递一个list用来显示,那么这个list就来自这个方法。
    我们可以添加subject这个实体,那么tapestry就会自动调用addSubject()这个方法来使得页面进入添加页面。上一次曾经说过,tapestry中所有的页面都是一个java类,所以,相应的负值也就变得理所当然了。addSubject.setParentSubject(getSubject().getParentSubject());
     最后,我们要把所有的请求和相应一起发给正确的页面forward(cycle,"add_subject");
同时,我们还可以在自己和自己中不停的跳转。这时我们就可以无限的定义我们的树型结构了,因为我们只需要给自己传递不同的参数就可以了。

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


网站导航: