對于整個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");
同時,我們還可以在自己和自己中不停的跳轉。這時我們就可以無限的定義我們的樹型結構了,因為我們只需要給自己傳遞不同的參數就可以了。
??傳統的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");
同時,我們還可以在自己和自己中不停的跳轉。這時我們就可以無限的定義我們的樹型結構了,因為我們只需要給自己傳遞不同的參數就可以了。