点击上传按钮后,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框架是由OpenSymphony组织开发的一款致力于组件化和代码重用的J2EE Web框架。该框架的最新版本为...
通过分析压缩包中的文件,你可以深入研究Webwork的各个组件,如Action、Interceptor、Result等的实现。例如,你可以查看Action类如何处理请求,如何与视图进行交互,以及拦截器如何在执行流程中起到关键作用。同时,...
这些案例涵盖了用户认证、权限管理、表单处理、文件上传等多个方面,通过具体的代码示例和详细的步骤指导,展示了如何使用Struts.2和WebWork核心来解决实际开发中的常见问题。此外,书中还讨论了一些高级主题,如...
- **文件上传/下载**:如何处理文件的上传和下载操作。 **4.2 Struts 2 Action** Action是Struts 2的核心组件,负责处理用户的请求,并执行相应的业务逻辑。这里将详细讨论如何实现Action类,以及如何利用Struts 2...
它简化了在Web应用程序中接收和处理大文件上传的过程,支持分块上传和错误处理。 3. **Hibernate**: Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员用Java对象来操作数据库,减少了手动编写SQL语句...
开发者需要了解如何在Struts2环境中配置文件上传,以及如何处理上传文件相关的逻辑。 综合来看,Struts2是一个功能全面、设计先进的Web应用框架,通过结合MVC设计模式,使得Web开发流程更加规范和高效。对于希望...
- **第7章上传和下载文件**:讨论文件上传和下载功能的实现方法,包括如何处理大文件、分片上传等。 - **第8章Struts2的国际化**:介绍如何支持多语言环境,使应用程序能够在不同国家和地区使用。 - **第9章Struts2...
由于上传限制,我们只获得了XWork 1.0.5的源码,这对于理解WebWork乃至Struts2的运作机制非常有帮助。 **源码结构** 1. **README.html**: 这个文件通常包含了项目的简介、安装指南、使用说明等内容,是理解项目的...
最后,"Struts2Demo.rar" 应该是一个Struts2的演示应用,包含了各种常见功能的实现,比如表单验证、文件上传下载、AJAX交互等,通过分析和修改这些代码,开发者可以加深对Struts2工作原理的理解。 总的来说,这个...
- 对于希望深入了解Struts2内部机制的开发者来说,本书可能不够深入。 - **主要内容**: - **Struts2体系结构**:介绍Struts2的工作原理及其组件之间的交互过程。 - **配置文件详解**:讲解如何通过配置文件来...
- **文件上传与下载**:对于文件上传与下载功能的支持,Struts2提供了简洁易用的API。 - **Ajax集成**:Struts2与Ajax技术的结合使得开发出的应用程序更加交互友好。 综上所述,Struts2不仅在技术上有所突破,更...
- 文件上传:Struts2提供了便捷的文件上传功能,需要配置Action类和相应的表单元素。 - DispatchAction和Interceptor:DispatchAction可以处理多个方法请求,Interceptor则用于在Action执行前后插入自定义逻辑。 - ...
6. **文件上传(File Upload)**:Struts 2提供了一套完整的文件上传解决方案,包括单个文件和多个文件的上传,以及处理文件大小限制和类型验证。 7. **异常处理(Exception Handling)**:Struts 2提供了异常处理机制...
- **文件上传**:讲解如何使用Struts2实现文件上传功能,包括前端表单设计和后端逻辑处理。 - **文件下载**:介绍Struts2中文件下载的方法,包括设置响应头信息、读取文件等步骤。 #### 十一、视图浅析 - **视图...
4. **插件式架构**:Struts2采用了插件式的架构,支持多种插件扩展,如国际化插件、文件上传/下载插件等,大大增强了其灵活性和功能性。 5. **强大的拦截器机制**:拦截器是Struts2的核心组件之一,可以用来实现各种...
- 文件上传通常涉及到文件的临时存储、大小限制等问题。 - Struts2提供了专门的文件上传拦截器来处理这些问题。 #### 第5章 Struts2标签库 - **5.1 Struts2标签使用原理解疑** - **知识点**: 介绍了Struts2标签...
- **文件上传**:介绍如何使用Struts2提供的文件上传组件处理文件上传请求。 - **文件下载**:演示如何响应文件下载请求。 #### 十一、视图技术浅析 - **视图技术**:除了JSP之外,还可以使用Freemarker、Velocity...
- 内置拦截器机制,可以轻松处理诸如事务管理、文件上传等功能。 - 强大的表单验证功能。 - 支持国际化和本地化。 - 集成多种技术栈,如Spring、Hibernate等。 #### 二、Struts2入门 - **环境搭建**:包括开发...
此外,Struts2提供了丰富的插件体系,如国际化、异常处理、文件上传下载等功能,极大地丰富了应用的开发能力。 接下来,我们来看看JFreeChart。JFreeChart库是基于Java的,它的目标是提供一个可扩展的、易用的图表...
Struts2内置了文件上传和下载功能,通过简单的配置即可实现文件的上传和下载,极大地便利了文件处理相关的Web应用开发。 #### 十一、视图浅析 Struts2支持多种视图技术,包括JSP、FreeMarker、Velocity等,开发者...