快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
response = response;      actionContextThreadLocal.set(ctx);    }    static void removeActionContext() {      actionContextThreadLocal.remove();    } }

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

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

在 Dispatcher 的 handleExecution() 方法中,初始化 ActionContext,并 在 finally 中移除所有已绑定变量,代码见清单 27。

清单 27. 初始化 ActionContext

class Dispatcher {    ...    void handleExecution(Execution execution, HttpServletRequest  request,    HttpServletResponse response) throws ServletException,  IOException {      ActionContext.setActionContext(servletContext, request,  response);      try {        InterceptorChainImpl chains = new  InterceptorChainImpl(interceptors);        chains.doInterceptor(execution);        handleResult(request, response, chains.getResult ());      }      catch (Exception e) {        handleException(request, response, e);      }      finally {        ActionContext.removeActionContext();      }    } }

这样,在 @Mapping 方法内部,可以随时获得需要的 Request、Response、 Session 和 ServletContext 对象。

处理文件上传

Servlet API 本身并没有提供对文件上传的支持,要处理文件上传,我们需 要使用 Commons FileUpload 之类的第三方扩展包。考虑到 Commons FileUpload 是使用最广泛的文件上传包,我们希望能集成 Commons FileUpload ,但是,不要暴露 Commons FileUpload 的任何 API 给 MVC 的客户端,客户端 应该可以直接从一个普通的 HttpServletRequest 对象中获取上传文件。

要让 MVC 客户端直接使用 HttpServletRequest,我们可以用自定义的 MultipartHttpServletRequest 替换原始的 HttpServletRequest,这样,客户 端代码可以通过 instanceof 判断是否是一个 Multipart 格式的 Request,如 果是,就强制转型为 MultipartHttpServletRequest,然后,获取上传的文件流 。

核心思想是从 HttpServletRequestWrapper 派生 MultipartHttpServletRequest,这样,MultipartHttpServletRequest 具有 HttpServletRequest 接口。MultipartHttpServletRequest 的定义如清单 28 所示。

清单 28. 定义 MultipartHttpServletRequest

public class  MultipartHttpServletRequest extends HttpServletRequestWrapper {    final HttpServletRequest target;    final Map<String, List<FileItemStream>>  fileItems;    final Map<String, List<String>>  formItems;    public MultipartHttpServletRequest(HttpServletRequest  request, long maxFileSize)    throws IOException {      super(request);      this.target = request;      this.fileItems = new HashMap<String,  List<FileItemStream>>();      this.formItems = new HashMap<String,  List<String>>();      ServletFileUpload upload = new ServletFileUpload();      upload.setFileSizeMax(maxFileSize);      try {

...解析Multipart ...

}      catch (FileUploadException e) {        throw new IOException(e);      }    }    public InputStream getFileInputStream(String fieldName)  throws IOException {      List<FileIt

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