快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
Servlet,当一个 URL 没有匹配到任何 Servlet 时,就匹配 默认的 Servlet。一个 Web 应用程序如果没有映射默认的 Servlet,Web 服务 器会自动为 Web 应用程序添加一个默认的 Servlet。

REST 风格的 URL 一般不含后缀,我们只能将 DispatcherServlet 映射到“ /”,使之变为一个默认的 Servlet,这样,就可以对任意的 URL 进行处理。

由于无法像 Struts 等传统的 MVC 框架根据后缀直接将一个 URL 映射到一 个 Controller,我们必须依次匹配每个有能力处理 HTTP 请求的 @Mapping 方 法。完整的 HTTP 请求处理流程如图 1 所示。

图 1. 请求处理流程

当扫描到标记有 @Mapping 注解的方法时,需要首先检查 URL 与方法参数是 否匹配,UrlMatcher 用于将 @Mapping 中包含 $1、$2 ……的字符串变为正则 表达式,进行预编译,并检查参数个数是否符合方法参数,代码见清单 5。

清单 5. 定义 UrlMatcher

final class UrlMatcher {    final String url;    int[] orders;    Pattern pattern;    public UrlMatcher(String url) {      ...    } }

设计REST风格的MVC框架(4)

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

将 @Mapping 中包含 $1、$2 ……的字符串变为正则表达式的转换规则是, 依次将每个 $n 替换为 ([^\\/]*),其余部分作精确匹配。例如,“/blog/$1/ $2”变化后的正则表达式为:

^\\/blog\\/([^\\/]*)\\/([^\\/]*)$

请注意,Java 字符串需要两个连续的“\\”表示正则表达式中的转义字符“ \”。将“/”排除在变量匹配之外可以避免很多歧义。

调用一个实例方法则由 Action 类表示,它持有类实例、方法引用和方法参 数类型,代码见清单 6。

清单 6. 定义 Action

class Action {    public final Object instance;    public final Method method;    public final Class<?>[] arguments;    public Action(Object instance, Method method) {      this.instance = instance;      this.method = method;      this.arguments = method.getParameterTypes();    } }

负责请求转发的 Dispatcher 通过关联 UrlMatcher 与 Action,就可以匹配 到合适的 URL,并转发给相应的 Action,代码见清单 7。

清单 7. 定义 Dispatcher

class Dispatcher {    private UrlMatcher[] urlMatchers;    private Map<UrlMatcher, Action> urlMap = new  HashMap<UrlMatcher, Action>();    .... }

当 Dispatcher 接收到一个 URL 请求时,遍历所有的 UrlMatcher,找到第 一个匹配 URL 的 UrlMatcher,并从 URL 中提取方法参数,代码见清单 8。

清单 8. 匹配并从 URL 中提取参数

final class UrlMatcher  {    ...    /**     * 根据正则表达式匹配 URL,若匹配成功,返回从 URL 中提取的 参数,     * 若匹配失败,返回 null     */    public String[] getMatchedParameters(String url) {      Matcher m = pattern.matcher(url);      if (!m.matches())        return null;      if (orders.length==0)        return EMPTY_STRINGS;      String[] params = new String[orders.length];      for (int i=0; i<orders.length; i++) {        params[orders[i]] = m.group(i+1);      }      return params;    } }

设计REST风格的MVC框架(5)

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

根据 URL 找到匹配的 Action 后,就可以构造一个 Exe

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号