Mark Eagle是美國喬治亞州亞特蘭大市MATRIX Resources有限公司的一位資深軟件工程師,擁有Sun公司的SCP和SCWCD認(rèn)證。Mark本人非常喜歡使用開源軟件進(jìn)行軟件開發(fā),并且多次積極參與過Hibernate,SPRing及Proxool等聞名開源工程。
一、簡介
Stripes是一個開源的,基于Action的java web框架。傳統(tǒng)型Java web開發(fā)強(qiáng)調(diào)通過松耦合的設(shè)計達(dá)到靈活開發(fā)之目的,這導(dǎo)致了產(chǎn)生多種配置文件,額外對象以及其它零碎的資源。顯然,這些問題提升了眾多開發(fā)人員的學(xué)習(xí)曲線,從而降低了開發(fā)效率。基于這些原因,一些Java開發(fā)者求助于另外的非Java開發(fā)框架—例如Ruby on Rails或者Django。而象Stripes這樣的新型Java web開發(fā)框架,從支持流線式開發(fā)框架的成功中獲取了大量現(xiàn)成的經(jīng)驗。本文中,我們將通過一個具體的案例來探討Stripes是如何區(qū)別于其它基于Action的Java web框架(例如Struts),而同時又實現(xiàn)了例如Ruby on Rails框架所具備的簡單性。
下圖1展示了基于Stripes框架開發(fā)的典型應(yīng)用程序中事件及組件間的通常流程。
圖1:典型的Stripes流程如你所見,這也正是我們從一個典型的MVC框架下所想得到的東西。在Stripes及其它基于行為的框架之間的一個主要區(qū)別在于,它沒有提供外部配置文件。很快我們將會看到,在配置方面,Stripes借助于注解和約定(convention)等技術(shù)進(jìn)一步簡化了開發(fā)過程。
二、構(gòu)建你的第一個Stripes行為
下面,讓我們通過創(chuàng)建一個“Hello World”示例來理解Stripes框架是如何把諸多內(nèi)容結(jié)合到一起的。其中,HelloWorldAction類負(fù)責(zé)提示用戶輸入自己的姓名,然后把它們顯示于一個單獨的視圖中。首先,我們來編寫控制器Java類。
public class HelloWorldAction implements ActionBean {
@ValidateNestedProperties({
@Validate(field = "firstName", required = true,
on = {"hello"}),
@Validate(field = "age", required = true, minvalue = 13,
on = {"hello"})
})
private Person person;
private ActionBeanContext context;
@DefaultHandler
public Resolution index() {
return new ForwardResolution("Hello.jsp");
}
public Resolution hello() {
return new ForwardResolution("SayHello.jsp");
}
public void setPerson(String person) {this.person = person;}
public String getPerson() { return person;}
public void setContext(ActionBeanContext c) {this.context = c; }
public ActionBeanContext getContext() {return context; }
}
在此,這個控制器類十分類似于一個實現(xiàn)了一個稱為ActionBean的Stripes特定接口的POJO(普通Java對象)。注重,所有的Stripes行為都需要實現(xiàn)這個接口,以便答應(yīng)StripesDispatcher servlet把一個ActionBeanContext對象注入到當(dāng)前提供服務(wù)的行為中。該ActionBeanContext對象答應(yīng)你存取servlet API對象—例如請求,響應(yīng)和servlet上下文。大多數(shù)情況下,在一個Stripes應(yīng)用程序中沒有必要存取這些低級別的API對象。該ActionBeanContext類還答應(yīng)你取得關(guān)于當(dāng)前行為的狀態(tài)信息,而且還可以從當(dāng)前行為中添加參考消息和錯誤消息。注重,ActionBeanContext域及其存取器(accessor)可以存儲在一個基類中,因為所有的Stripes行為都會要求這樣的實現(xiàn)。
新聞熱點
疑難解答