對(duì)于整個(gè)tapestry的設(shè)計(jì)和實(shí)現(xiàn)其實(shí)最核心的部分就是對(duì)于頁(yè)面和配置頁(yè)以及邏輯類的配合。在學(xué)習(xí)和使用tapestry的時(shí)候,我們可以完全不用理會(huì)jsp的概念,因?yàn)樗麄儚脑O(shè)計(jì)思想上就完全不同。
??傳統(tǒng)的jsp設(shè)計(jì),或者說(shuō)servlet設(shè)計(jì)是一種根據(jù)jsp和servlet不同的優(yōu)點(diǎn)設(shè)計(jì)的mvc模式。對(duì)于jsp,顯示更加便捷,更加靈活,所以更多地用于頁(yè)面顯示,而servlet則更多的突現(xiàn)了它對(duì)于后臺(tái)的強(qiáng)大控制力,所以更多地被用于控制器,也就是controller。mvc的設(shè)計(jì)模式是,無(wú)論什么樣的請(qǐng)求,都需要通過(guò)對(duì)于url的模糊匹配被定位到第一級(jí)或者頂級(jí)控制器,再通過(guò)控制器對(duì)于所傳遞的請(qǐng)求進(jìn)行解析分析后,重定向到正確的處理類中,也就是說(shuō),我們對(duì)于整個(gè)應(yīng)用需要些大于總頁(yè)面?zhèn)€數(shù)的java類來(lái)完成所規(guī)定功能。這在一定程度上浪費(fèi)了資源和開發(fā)時(shí)間。當(dāng)然,在軟件工程學(xué)中,本就提出了幾種不同的解決方法,mvc模式可以使我們應(yīng)用更加清晰化,更加可維護(hù)化。
??當(dāng)然,抽象地說(shuō),tapestry在設(shè)計(jì)中完全沒(méi)有了控制器的概念。當(dāng)然這也是個(gè)人的觀點(diǎn)。開發(fā)過(guò)程中,我只是設(shè)計(jì),在用戶使用我所寫的頁(yè)面的時(shí)候會(huì)出現(xiàn)多少種狀況,然后設(shè)計(jì)相應(yīng)的頁(yè)面。這樣就更加類似我們?cè)赾中的開發(fā),瀑布式開發(fā)模式。還是做個(gè)例子比較好,對(duì)不對(duì)?
暫時(shí)不給大家.htm和.page文件了,不然大家會(huì)越來(lái)越暈的,只給大家講解一下.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");
??????}
}
???? 朋友們可能會(huì)看得很迷糊,對(duì)吧?其實(shí)這就是tapestry的優(yōu)點(diǎn)了。如果你希望把一些東西綁定在頁(yè)面上的話,那么我根本就不需要在java類中處理他們,只需要將實(shí)體類在.page中聲明一下,例如,
<property-specification name="subject" type="com.tapestry.Subject"/>
???? 然后在java類中抽象的聲明他們,tapestry就會(huì)自動(dòng)將你所需要綁定的屬性綁定在實(shí)體上,處理的時(shí)候只需要調(diào)用就可以了。
?? 那么,這個(gè)IService又是怎么回事兒呢?其實(shí)我們?cè)陧?yè)面之間進(jìn)行數(shù)據(jù)或者實(shí)體傳遞的時(shí)候,為了提高速度,或者提高效率,或者提高安全性,我們都可以通過(guò)傳遞id的方式進(jìn)行,那么通過(guò)spring的service方法,我們就可以快速的找到這個(gè)實(shí)體,例如:
Subject subject=getSubjectService().Load(getSubject().getID());
???? 同時(shí),我們這個(gè)頁(yè)面所需要的控件也需要我們傳遞相應(yīng)的參數(shù)來(lái)顯示我們所需要的效果,這就是為什么要有g(shù)etSubjectList()這個(gè)方法了。在我們使用foreach控件或者actionTable控件的時(shí)候,都需要我們傳遞一個(gè)list用來(lái)顯示,那么這個(gè)list就來(lái)自這個(gè)方法。
????我們可以添加subject這個(gè)實(shí)體,那么tapestry就會(huì)自動(dòng)調(diào)用addSubject()這個(gè)方法來(lái)使得頁(yè)面進(jìn)入添加頁(yè)面。上一次曾經(jīng)說(shuō)過(guò),tapestry中所有的頁(yè)面都是一個(gè)java類,所以,相應(yīng)的負(fù)值也就變得理所當(dāng)然了。addSubject.setParentSubject(getSubject().getParentSubject());
???? 最后,我們要把所有的請(qǐng)求和相應(yīng)一起發(fā)給正確的頁(yè)面forward(cycle,"add_subject");
同時(shí),我們還可以在自己和自己中不停的跳轉(zhuǎn)。這時(shí)我們就可以無(wú)限的定義我們的樹型結(jié)構(gòu)了,因?yàn)槲覀冎恍枰o自己傳遞不同的參數(shù)就可以了。
??傳統(tǒng)的jsp設(shè)計(jì),或者說(shuō)servlet設(shè)計(jì)是一種根據(jù)jsp和servlet不同的優(yōu)點(diǎn)設(shè)計(jì)的mvc模式。對(duì)于jsp,顯示更加便捷,更加靈活,所以更多地用于頁(yè)面顯示,而servlet則更多的突現(xiàn)了它對(duì)于后臺(tái)的強(qiáng)大控制力,所以更多地被用于控制器,也就是controller。mvc的設(shè)計(jì)模式是,無(wú)論什么樣的請(qǐng)求,都需要通過(guò)對(duì)于url的模糊匹配被定位到第一級(jí)或者頂級(jí)控制器,再通過(guò)控制器對(duì)于所傳遞的請(qǐng)求進(jìn)行解析分析后,重定向到正確的處理類中,也就是說(shuō),我們對(duì)于整個(gè)應(yīng)用需要些大于總頁(yè)面?zhèn)€數(shù)的java類來(lái)完成所規(guī)定功能。這在一定程度上浪費(fèi)了資源和開發(fā)時(shí)間。當(dāng)然,在軟件工程學(xué)中,本就提出了幾種不同的解決方法,mvc模式可以使我們應(yīng)用更加清晰化,更加可維護(hù)化。
??當(dāng)然,抽象地說(shuō),tapestry在設(shè)計(jì)中完全沒(méi)有了控制器的概念。當(dāng)然這也是個(gè)人的觀點(diǎn)。開發(fā)過(guò)程中,我只是設(shè)計(jì),在用戶使用我所寫的頁(yè)面的時(shí)候會(huì)出現(xiàn)多少種狀況,然后設(shè)計(jì)相應(yīng)的頁(yè)面。這樣就更加類似我們?cè)赾中的開發(fā),瀑布式開發(fā)模式。還是做個(gè)例子比較好,對(duì)不對(duì)?
暫時(shí)不給大家.htm和.page文件了,不然大家會(huì)越來(lái)越暈的,只給大家講解一下.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");
??????}
}
???? 朋友們可能會(huì)看得很迷糊,對(duì)吧?其實(shí)這就是tapestry的優(yōu)點(diǎn)了。如果你希望把一些東西綁定在頁(yè)面上的話,那么我根本就不需要在java類中處理他們,只需要將實(shí)體類在.page中聲明一下,例如,
<property-specification name="subject" type="com.tapestry.Subject"/>
???? 然后在java類中抽象的聲明他們,tapestry就會(huì)自動(dòng)將你所需要綁定的屬性綁定在實(shí)體上,處理的時(shí)候只需要調(diào)用就可以了。
?? 那么,這個(gè)IService又是怎么回事兒呢?其實(shí)我們?cè)陧?yè)面之間進(jìn)行數(shù)據(jù)或者實(shí)體傳遞的時(shí)候,為了提高速度,或者提高效率,或者提高安全性,我們都可以通過(guò)傳遞id的方式進(jìn)行,那么通過(guò)spring的service方法,我們就可以快速的找到這個(gè)實(shí)體,例如:
Subject subject=getSubjectService().Load(getSubject().getID());
???? 同時(shí),我們這個(gè)頁(yè)面所需要的控件也需要我們傳遞相應(yīng)的參數(shù)來(lái)顯示我們所需要的效果,這就是為什么要有g(shù)etSubjectList()這個(gè)方法了。在我們使用foreach控件或者actionTable控件的時(shí)候,都需要我們傳遞一個(gè)list用來(lái)顯示,那么這個(gè)list就來(lái)自這個(gè)方法。
????我們可以添加subject這個(gè)實(shí)體,那么tapestry就會(huì)自動(dòng)調(diào)用addSubject()這個(gè)方法來(lái)使得頁(yè)面進(jìn)入添加頁(yè)面。上一次曾經(jīng)說(shuō)過(guò),tapestry中所有的頁(yè)面都是一個(gè)java類,所以,相應(yīng)的負(fù)值也就變得理所當(dāng)然了。addSubject.setParentSubject(getSubject().getParentSubject());
???? 最后,我們要把所有的請(qǐng)求和相應(yīng)一起發(fā)給正確的頁(yè)面forward(cycle,"add_subject");
同時(shí),我們還可以在自己和自己中不停的跳轉(zhuǎn)。這時(shí)我們就可以無(wú)限的定義我們的樹型結(jié)構(gòu)了,因?yàn)槲覀冎恍枰o自己傳遞不同的參數(shù)就可以了。