快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
n {      if(index==interceptors.length)        result = execution.execute();      else {        // must update index first, otherwise will cause  stack overflow:         index++;        interceptors[index-1].intercept(execution, this);      }    } }

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

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

成员变量 index 表示当前链上的第 N 个拦截器,当最后一个拦截器被调用 后,InterceptorChain 才真正调用 Execution 对象的 execute() 方法,并保 存其返回结果,整个请求处理过程结束,进入渲染阶段。清单 21 演示了如何调 用拦截器链的代码。

清单 21. 调用拦截器链

class Dispatcher {    ...    private Interceptor[] interceptors;    void handleExecution(Execution execution, HttpServletRequest  request,      HttpServletResponse response) throws ServletException,  IOException {      InterceptorChainImpl chains = new InterceptorChainImpl (interceptors);      chains.doInterceptor(execution);      handleResult(request, response, chains.getResult());    } }

当 Controller 方法被调用完毕后,handleResult() 方法用于处理执行结果 。

渲染

由于我们没有强制 HTTP 处理方法的返回类型,因此,handleResult() 方法 针对不同的返回值将做不同的处理。代码如清单 22 所示。

清单 22. 处理返回值

class Dispatcher {    ...    void handleResult(HttpServletRequest request,  HttpServletResponse response,        Object result) throws Exception {      if (result==null)        return;      if (result instanceof Renderer) {        Renderer r = (Renderer) result;        r.render(this.servletContext, request, response);        return;      }      if (result instanceof String) {        String s = (String) result;        if (s.startsWith("redirect:")) {          response.sendRedirect(s.substring(9));          return;        }        new TextRenderer(s).render(servletContext, request,  response);        return;      }      throw new ServletException("Cannot handle result with  type ''"          + result.getClass().getName() + "''.");    } }

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

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

如果返回 null,则认为 HTTP 请求已处理完成,不做任何处理;如果返回 Renderer,则调用 Renderer 对象的 render() 方法渲染视图;如果返回 String,则根据前缀是否有“redirect:”判断是重定向还是作为 HTML 返回给 浏览器。这样,客户端可以不必访问 HttpServletResponse 对象就可以非常方 便地实现重定向。代码如清单 23 所示。

清单 23. 重定向

@Mapping("/register") String register() {    ...    if (success)      return "redirect:/reg/success";    return "redirect:/reg/failed"; }

扩展 Renderer 还可以处理更多的格式,例如,向浏览器返回 JavaScript 代码等。

扩展

使用 Filter 转发

对于请求转发,除了使用 DispatcherServlet 外,还可以使用 Filter 来拦 截所有请求,并直接在 Filter 内实现请求转发和处

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