`
xitong
  • 浏览: 6401953 次
文章分类
社区版块
存档分类
最新评论

深入分析webwork中的文件上传机制

 
阅读更多
点击上传按钮后,webwork的程序流如下:
step 1)进入ServletDispatcher.service
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {
........

request = wrapRequest(request);
.........
}

step2)进入ServletDispatcher.wrapRequest
protected HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException {
........................

if (MultiPartRequest.isMultiPart(request)) {
request = new MultiPartRequestWrapper(request, getSaveDir(), getMaxSize());
}

return request;
}

step3)进入MultiPartRequestWrapper的构造方法
public MultiPartRequestWrapper(HttpServletRequest request, String saveDir, int maxSize) throws IOException {
.....................
//step3.1)获取webwork.preperties配置的parser
String parser = "";

parser = Configuration.getString("webwork.multipart.parser");

// If it's not set, use Pell
if (parser.equals("")) {
log.warn("Property webwork.multipart.parser not set." +
" Using com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest");
parser = "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest";
}
// legacy support for old style property values
else if (parser.equals("pell")) {
parser = "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest";
} else if (parser.equals("cos")) {
parser = "com.opensymphony.webwork.dispatcher.multipart.CosMultiPartRequest";
} else if (parser.equals("jakarta")) {
parser = "com.opensymphony.webwork.dispatcher.multipart.JakartaMultiPartRequest";
}

//step3.2)获取后通过反射实例化parser
try {
Class baseClazz = com.opensymphony.webwork.dispatcher.multipart.MultiPartRequest.class;

Class clazz = Class.forName(parser);

// make sure it extends MultiPartRequest
if (!baseClazz.isAssignableFrom(clazz)) {
addError("Class '" + parser + "' does not extend MultiPartRequest");

return;
}

// get the constructor
Constructor ctor = clazz.getDeclaredConstructor(new Class[]{
Class.forName("javax.servlet.http.HttpServletRequest"),
java.lang.String.class, int.class
});

// build the parameter list
Object[] parms = new Object[]{
request, saveDir, new Integer(maxSize)
};

// instantiate it
multi = (MultiPartRequest) ctor.newInstance(parms);
.................................................
}

//step4 进入JakartaMultiPartRequest的构造方法(我在webwork配置的parser是Jakarta所以进入了这个方法,如果你配置不同的parser会进入不同的parser
public JakartaMultiPartRequest(HttpServletRequest servletRequest, String saveDir, int maxSize)
throws IOException {

//设置保存参数
DiskFileUpload upload = new DiskFileUpload();
// we must store all uploads on disk because the ww multipart API is missing streaming
// capabilities
upload.setSizeThreshold(0);
upload.setSizeMax(maxSize);
if (saveDir != null) {
upload.setRepositoryPath(saveDir);
}

// Parse the request
try {

//此方法生成文件,将请求中的每个参数都生成一个临时文件比如upload_00000017.tmp, upload_00000018.tmp等,就算是form提交的参数也如此
List items = upload.parseRequest(servletRequest);

......................
}
执行完第四步,然后推出ServletDispatcher.wrapRequest,进入serviceAction方法,开始action及其拦截器的栈调用

在此过程中会删除非上传文件的临时文件。

进入action和调用栈后,拦截器或action可通过如下代码访问上传的临时文件
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) req;
File doc = wrapper.getFiles("doc")[0];

从上面的分析可以看出:
1)如果你使用webwork来上传文件(在进入action栈之前不修改源码或者做一些扩展、覆盖之类的动作),在进入action栈的时候文件已经上 传,而且其文件名很难跟踪(upload_00000017.tmp,到底是00000017,0000018,或者0000022等等),毕竟有很多人 上传文件,所以临时文件名很难确定,所以如果你想知道上传的进度很难。
2)利用webwork上传文件是两次拷贝过程,webwork首先从request的输入流中将文件流输出到一个临时文件,然后你再将此临时文件拷贝到你需要指定的路径。这是好是坏?或者实现一个servlet一次搞定不依赖webwork框架,或者改变webwork框架?也许这依赖于具体的需求
分享到:
评论

相关推荐

    webwork深入浅出

    - **WebWork如何解决这些问题**:逐一分析WebWork针对每个挑战提供的解决方案。 #### 二、WebWork框架简介 WebWork框架是由OpenSymphony组织开发的一款致力于组件化和代码重用的J2EE Web框架。该框架的最新版本为...

    Webwork in Action

    通过分析压缩包中的文件,你可以深入研究Webwork的各个组件,如Action、Interceptor、Result等的实现。例如,你可以查看Action类如何处理请求,如何与视图进行交互,以及拦截器如何在执行流程中起到关键作用。同时,...

    Struts.2权威指南--基于WebWork核心的MVC开发.0001.pdf

    这些案例涵盖了用户认证、权限管理、表单处理、文件上传等多个方面,通过具体的代码示例和详细的步骤指导,展示了如何使用Struts.2和WebWork核心来解决实际开发中的常见问题。此外,书中还讨论了一些高级主题,如...

    Struts 2权威指南--基于WebWork核心的MVC开发

    - **文件上传/下载**:如何处理文件的上传和下载操作。 **4.2 Struts 2 Action** Action是Struts 2的核心组件,负责处理用户的请求,并执行相应的业务逻辑。这里将详细讨论如何实现Action类,以及如何利用Struts 2...

    dom4j、common-fileupload、hibernate、jdom、log4j、proxool、spring、struts、webwork等工具、框架源码

    它简化了在Web应用程序中接收和处理大文件上传的过程,支持分块上传和错误处理。 3. **Hibernate**: Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员用Java对象来操作数据库,减少了手动编写SQL语句...

    Struts2简介与入门

    开发者需要了解如何在Struts2环境中配置文件上传,以及如何处理上传文件相关的逻辑。 综合来看,Struts2是一个功能全面、设计先进的Web应用框架,通过结合MVC设计模式,使得Web开发流程更加规范和高效。对于希望...

    Struts2.1权威指南——基于WebWork核心的MVC开发.pdf

    - **第7章上传和下载文件**:讨论文件上传和下载功能的实现方法,包括如何处理大文件、分片上传等。 - **第8章Struts2的国际化**:介绍如何支持多语言环境,使应用程序能够在不同国家和地区使用。 - **第9章Struts2...

    xwork-1.0.5源码

    由于上传限制,我们只获得了XWork 1.0.5的源码,这对于理解WebWork乃至Struts2的运作机制非常有帮助。 **源码结构** 1. **README.html**: 这个文件通常包含了项目的简介、安装指南、使用说明等内容,是理解项目的...

    struts2学习文档以及一些相关项目的代码

    最后,"Struts2Demo.rar" 应该是一个Struts2的演示应用,包含了各种常见功能的实现,比如表单验证、文件上传下载、AJAX交互等,通过分析和修改这些代码,开发者可以加深对Struts2工作原理的理解。 总的来说,这个...

    Struts2入门v3.0.pdf

    - 对于希望深入了解Struts2内部机制的开发者来说,本书可能不够深入。 - **主要内容**: - **Struts2体系结构**:介绍Struts2的工作原理及其组件之间的交互过程。 - **配置文件详解**:讲解如何通过配置文件来...

    struts2权威指南pdf

    - **文件上传与下载**:对于文件上传与下载功能的支持,Struts2提供了简洁易用的API。 - **Ajax集成**:Struts2与Ajax技术的结合使得开发出的应用程序更加交互友好。 综上所述,Struts2不仅在技术上有所突破,更...

    struts2_zxx.ppt

    - 文件上传:Struts2提供了便捷的文件上传功能,需要配置Action类和相应的表单元素。 - DispatchAction和Interceptor:DispatchAction可以处理多个方法请求,Interceptor则用于在Action执行前后插入自定义逻辑。 - ...

    Struts 2权威指南配套源码---第21章

    6. **文件上传(File Upload)**:Struts 2提供了一套完整的文件上传解决方案,包括单个文件和多个文件的上传,以及处理文件大小限制和类型验证。 7. **异常处理(Exception Handling)**:Struts 2提供了异常处理机制...

    struts2的速成教程,充电的都来看了

    - **文件上传**:讲解如何使用Struts2实现文件上传功能,包括前端表单设计和后端逻辑处理。 - **文件下载**:介绍Struts2中文件下载的方法,包括设置响应头信息、读取文件等步骤。 #### 十一、视图浅析 - **视图...

    struts2教程

    4. **插件式架构**:Struts2采用了插件式的架构,支持多种插件扩展,如国际化插件、文件上传/下载插件等,大大增强了其灵活性和功能性。 5. **强大的拦截器机制**:拦截器是Struts2的核心组件之一,可以用来实现各种...

    struts2讲义

    - 文件上传通常涉及到文件的临时存储、大小限制等问题。 - Struts2提供了专门的文件上传拦截器来处理这些问题。 #### 第5章 Struts2标签库 - **5.1 Struts2标签使用原理解疑** - **知识点**: 介绍了Struts2标签...

    Strust2整理成册

    - **文件上传**:介绍如何使用Struts2提供的文件上传组件处理文件上传请求。 - **文件下载**:演示如何响应文件下载请求。 #### 十一、视图技术浅析 - **视图技术**:除了JSP之外,还可以使用Freemarker、Velocity...

    struts2系列教程

    - 内置拦截器机制,可以轻松处理诸如事务管理、文件上传等功能。 - 强大的表单验证功能。 - 支持国际化和本地化。 - 集成多种技术栈,如Spring、Hibernate等。 #### 二、Struts2入门 - **环境搭建**:包括开发...

    struts2+JFreeChart

    此外,Struts2提供了丰富的插件体系,如国际化、异常处理、文件上传下载等功能,极大地丰富了应用的开发能力。 接下来,我们来看看JFreeChart。JFreeChart库是基于Java的,它的目标是提供一个可扩展的、易用的图表...

    struts入门教程

    Struts2内置了文件上传和下载功能,通过简单的配置即可实现文件的上传和下载,极大地便利了文件处理相关的Web应用开发。 #### 十一、视图浅析 Struts2支持多种视图技术,包括JSP、FreeMarker、Velocity等,开发者...

Global site tag (gtag.js) - Google Analytics