是否對傳統的Java MVC架構如Struts,WebWork感到失望?大量的XML設定檔,*.do的映射方式導致不得不編寫很多FormBean來傳遞頁面參數?強迫實現的Action介面導致一個類只能處理一個請求,十分不便。
流行的Web網站早已實現了REST風格的URL,例如豆瓣的URL,顯示一本書不是subject.do?id=xxx,而是很自然的http://www.douban.com/subject/2129650/之類。
也許你會說,通過Apache的RewriteMod或者自己寫一個UrlRewriteFilter也能實現這個目標,不過,為什麼不能從MVC架構設計本身就實現這種模式呢?
Express-Wind架構的設計目標就是提供一種非常自然的URL映射,並且不限定處理URL的方法介面。
你可以通過一個簡單的@Mapping告訴架構一個方法需要處理的URL:
public class MyPage {
@Mapping("/hello")
public String hello() {
return "<h1>Hello, world</h1>";
}
@Mapping("/hello/$1")
public String hello(String name) {
return "<h1>Hello, " + name + "</h1>";
}
}
URL中的參數通過$1,$2……指定,並且會自動傳入到方法參數中。
你會得到以下顯示效果,根據URL的不同而不同:
方法的傳回值可以是String,例如一小段HTML,可以是void,表示你已經自己處理了HttpServletResponse對象,作為DEMO,用來示範時,以上代碼工作地很好,不過,作為實際應用,我們需要一個模板系統來渲染頁面,此時,應當返回一個TemplateRenderer對象:
@Mapping("/")
public Renderer index() {
Map<String, Object> model = new HashMap<String, Object>();
return new TemplateRenderer("/index.jsp", model);
}
你不需要知道頁面是如何渲染的,只需傳入模板檔案路徑和一個Map作為Model即可。無需任何配置,Express-Wind預設使用JSP作為模板,當然,還可以配置Velocity作為模板。
如何與IoC框架組成?
現在,幾乎沒有項目不使用IoC架構的,Express-Wind支援並且只支援與IoC框架組成使用,也就是說,不使用IoC架構就無法使用Express-Wind。你需要做的是兩件事:
1. 把包含@Mapping的class放到IoC架構裡(Spring的XML設定檔或Guice的Module)
2. 告訴Express-Wind你使用的是Spring還是Guice還是其他IoC容器,然後Express-Wind自動掃描IoC容器中所有的Bean,取出那些標記有@Mapping的bean的方法,因此,整個URL是0配置。如果一個URL映射沒有起作用,多半是因為你忘記了把這個Bean放到IoC容器裡了。
如果你想瞭解關於Express-Wind的更多資訊,請參考:
http://code.google.com/p/express-me/wiki/ExpressWind