快速业务通道

设计REST风格的MVC框架 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

设计REST风格的MVC框架

时间:2011-06-01 IBM 廖雪峰

Java 开发者对 MVC 框架一定不陌生,从 Struts 到 WebWork,Java MVC 框 架层出不穷。我们已经习惯了处理 *.do 或 *.action 风格的 URL,为每一个 URL 编写一个控制器,并继承一个 Action 或者 Controller 接口。然而,流行 的 Web 趋势是使用更加简单,对用户和搜索引擎更加友好的 REST 风格的 URL 。例如,来自豆瓣的一本书的链接是 http://www.douban.com/subject/2129650/,而非 http://www.douban.com/subject.do?id=2129650。

有经验的 Java Web 开发人员会使用 URL 重写的方式来实现类似的 URL,例如,为前端 Apache 服 务器配置 mod_rewrite 模块,并依次为每个需要实现 URL 重写的地址编写负责 转换的正则表达式,或者,通过一个自定义的 RewriteFilter,使用 Java Web 服务器提供的 Filter 和请求转发(Forward)功能实现 URL 重写,不过,仍需 要为每个地址编写正则表达式。

既然 URL 重写如此繁琐,为何不直接设计一个原生支持 REST 风格的 MVC 框架呢?

要设计并实现这样一个 MVC 框架并不困难,下面,我们从零开 始,仔细研究如何实现 REST 风格的 URL 映射,并与常见的 IoC 容器如 Spring 框架集成。这个全新的 MVC 框架暂命名为 WebWind。

术语

MVC:Model- View-Controller,是一种常见的 UI 架构模式,通过分离 Model(模型)、View(视图)和 Controller(控制器),可以更容易实现易于 扩展的 UI。在 Web 应用程序中,Model 指后台返回的数据;View 指需要渲染 的页面,通常是 JSP 或者其他模板页面,渲染后的结果通常是 HTML; Controller 指 Web 开发人员编写的处理不同 URL 的控制器(在 Struts 中被 称之为 Action),而 MVC 框架本身还有一个前置控制器,用于接收所有的 URL 请求,并根据 URL 地址分发到 Web 开发人员编写的 Controller 中。

IoC:Invertion-of-Control,控制反转,是目前流行的管理所有组件生命周 期和复杂依赖关系的容器,例如 Spring 容器。

Template:模板,通过渲染,模板中的变量将被 Model 的实际数据所替换, 然后,生成的内容即是用户在浏览器中看到的 HTML。模板也能实现判断、循环 等简单逻辑。本质上,JSP 页面也是一种模板。此外,还有许多第三方模板引擎 ,如 Velocity,FreeMarker 等。

设计目标

和传统的 Struts 等 MVC 框架完全不同,为了支持 REST 风格的 URL,我们 并不把一个 URL 映射到一个 Controller 类(或者 Struts 的 Action),而是 直接把一个 URL 映射到一个方法,这样,Web 开发人员就可以将多个功能类似 的方法放到一个 Controller 中,并且,Controller 没有强制要求必须实现某 个接口。一个 Controller 通常拥有多个方法,每个方法负责处理一个 URL。例 如,一个管理 Blog 的 Controller 定义起来就像清单 1 所示。

清单 1. 管理 Blog 的 Controller 定义

public class Blog  {    @Mapping("/create/$1")    Public void create(int userId) { ... }    @Mapping("/display/$1/$2")    Public void display(int userId, int postId) { ... }    @Mapping("/edit/$1/$2")    Public void edit(int userId, int postId) { ... }    @Mapping("/delete/$1/$2")    Public String delete(int userId, int postId) { ... } }

@Mapping() 注解指示了这是一个处理 URL 映射的方法,URL 中的参数 $1、 $2 ……则将作为方法参数传入。对于一个“/blog/1234/5678”的 URL,对应的 方法将自动获得参数 userId=1234 和 postId=5678。同时,也无需任何与 URL 映射相关

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号