是否对传统的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