在之前的文章中我们讲了下文件上传,今天我们来说一下文件的下载。总的来说,文件下载有下面三种方式来实现。下面我们来一一介绍一下。
Webx特有的方式
这种方式需要分两种情况来讲解。
情况一:
如果需要下载的页面没有处理类的。什么意思?比如说你发了一个请求,找到了你对应的页面,但是后台却没有响应的请求处理类来处理你的请求。对于这样的页面,你直接提交form表单就相当于是发了一次ajax请求,页面是不会进行刷新的。请看代码如下:
http://localhost:8080/MyWebxTest/down_load_file.htm
如果有这样的一个请求,但是后台没有这个请求的处理类,页面如下:
如果有这样的一个请求,但是后台没有这个请求的处理类,页面如下:
$page.setTitle("下载文件") <html> <head> <script type="text/javascript" src="static/js/jquery-2.1.4.min.js"></script> <script type="text/javascript"> function doDownLoad(fileName){ //$("input[name='fileName']").val(fileName); //$("#fileForm").submit(); //$("#fileForm").action="file_load.do"; $('#showValue').val('zhangsanlisi'); $("#fileForm").submit(); } </script> </head> <body> #*<form id="fileForm" method="post" action="file_load.do"> <input type="hidden" name="fileName" /> </form> *# <form id="fileForm" method="post" action=""> <input type="hidden" name="fileName" /> <input type="hidden" name="action" value="down_load_fileAction" /> </form> <input id="showValue" /> <table> <tr> <td>文件1</td> <td><input type="button" value="下载文件" onclick="doDownLoad('fileName1');" /></td> </tr> <tr> <td>文件2</td> <td><input type="button" value="下载文件" onclick="doDownLoad('fileName2');" /></td> </tr> </table> </body> </html>如果点击了下载文件,会触发一个onclick事件,这个事件会提交一个表单,发送请求,发送的请求为:
http://localhost:8080/MyWebxTest/down_load_file.htm这个时候你也许会有疑问,这个不就是访问这个页面的请求吗?没错,提交表单的时候发送的就是访问页面的请求,即是Referer。那么它是怎么找对应的处理类的呢?请注意这句话:<input type="hidden" name="action" value="down_load_fileAction" /> Webx就是根据这个隐藏的action,来找他相应的处理类的。请注意的是处理类的路径,此类一定要放在
<services:module-loader> <ml-factories:class-modules> <search-packages type="$1" packages="com.alibaba.webx.MyWebxTest.myWebX.module.*"/> </ml-factories:class-modules> </services:module-loader><search-packages/>这个标签的包的下一级包action里。如图所示:
后台代码如下:
package com.alibaba.webx.MyWebxTest.myWebX.module.action; import static com.alibaba.citrus.util.StringEscapeUtil.escapeURL; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import com.alibaba.citrus.turbine.Context; /** * * @author zkn 2016-06-28 * */ public class DownLoadFileAction { @Autowired private HttpServletResponse response; public void execute(Context context){ String fileName = "G:/qqq.txt"; BufferedReader br = null; BufferedWriter bw = null; try { String loadFileName = "\"" + escapeURL("zhangsan.txt") + "\"";; //重置输出流 response.reset(); //设置下载框 response.setHeader("Content-disposition", "attachment; filename=" + loadFileName); //设置文件类型 response.setContentType("text/plain;charset=UTF-8"); br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); bw = new BufferedWriter(new OutputStreamWriter(response.getOutputStream())) ; String lineStr = null; while((lineStr = br.readLine()) != null){ bw.write(lineStr); } bw.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(bw != null){ try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
情况二:
这种情况是下载页面有对应的处理类:
这种方式和上面那种方式唯一不同的地方在于,后台在处理完下载的逻辑之后,它会再次走一遍下载页面的处理类。什么意思呢?是这样的:还是上面的那个请求,
http://localhost:8080/MyWebxTest/down_load_file.htm对于这个请求,后台有一个处理类为DownLoadFile.java。页面还是上面的那个页面,如果这个时候你点了下载文件,它会在处理完DownLoadFileAction.java这个类之后,再次处理DownLoadFile.java这个类.同样的它也不会刷新页面,但是有可能会出现隐藏的问题。不建议使用这种方式。
window.open的方法
这种方法呢,只需要在js里写一个window.open就可以了。请求方式最好是.do。这种方式就不过多介绍了,唯一需要注意的是,下载逻辑的后台处理类要放在screen下面,如图:
部分代码如下:
function doDownLoad(fileName){ //$("input[name='fileName']").val(fileName); //$("#fileForm").submit(); //$("#fileForm").action="file_load.do"; $('#showValue').val('zhangsanlisi'); $("#fileForm").submit(); window.open('file_load.do'); }
传统的方式
什么是传统的方式呢?就是我们写一个form表单,在form的表单action里放入我们的请求。这种方式需要注意的是:form表单里不能有name=‘action’的input域。一定不能有。这种方式大家也都很熟悉了,也就没什么可说的了。代码如下:
$page.setTitle("下载文件") <html> <head> <script type="text/javascript" src="static/js/jquery-2.1.4.min.js"></script> <script type="text/javascript"> alert('zhangsanlisi'); function doDownLoad(fileName){ //$("input[name='fileName']").val(fileName); //$("#fileForm").submit(); //$("#fileForm").action="file_load.do"; $('#showValue').val('zhangsanlisi'); $("#fileForm").submit(); //window.open('file_load.do'); } </script> </head> <body> <form id="fileForm" method="post" action="file_load.do"> <input type="hidden" name="fileName" /> </form> #*<form id="fileForm" method="post" action=""> <input type="hidden" name="fileName" /> <input type="hidden" name="action" value="down_load_fileAction" /> </form> *# <input id="showValue" /> <table> <tr> <td>文件1</td> <td><input type="button" value="下载文件" onclick="doDownLoad('fileName1');" /></td> </tr> <tr> <td>文件2</td> <td><input type="button" value="下载文件" onclick="doDownLoad('fileName2');" /></td> </tr> </table> </body> </html>后台下载逻辑同上面的。
相关推荐
3. **动态表单**:WebX 支持动态表单生成,允许开发者通过配置文件定义表单字段和验证规则,自动根据数据库结构生成表单,减少了重复代码。 4. **数据库操作**:WebX 提供了强大的数据库操作接口,支持SQL语句的...
- **基础框架**:WEBX3.0的基础构建于Spring框架之上,通过提供一系列扩展点来实现高度定制化的开发。 - **层次化**:框架被划分为多个层次,每个层次负责不同的功能模块,这种设计使得开发者可以按需选择使用哪些...
Webx 提供了一系列开发工具,帮助开发者快速构建和调试应用。例如,内置的控制台工具可以用来监控应用运行状态,管理数据库连接,进行性能调优等。此外,Webx 还集成了常见的开发库,如Spring、Hibernate等,使得...
- **修改资源文件的内容**:为了适应动态变化的场景,Webx还提供了对资源文件内容的修改功能。 - **直接使用ResourceLoadingService**:对于更高级的需求,可以直接使用ResourceLoadingService来进行定制化的资源...
- **发展历程**:Webx3框架自发布以来经历了多个版本的迭代与优化,逐渐成为阿里巴巴内部以及外部开发者青睐的技术栈之一。其最新版本(Webx3)不仅继承了前代的优点,还在功能性和易用性方面做了进一步的增强。 ##...
**Filter、RequestContexts和Pipeline**是Webx框架中的关键概念之一。 ##### **6.1 Filter** - **Filter的用途**:Filter用于拦截请求并执行特定的逻辑。 - **Filter工作原理**:在请求到达控制器之前,Filter可以...
8. **依赖管理**:`.classpath`和`.project`文件是Eclipse项目配置文件,它们包含了项目的类路径和构建设置,可能也指示了Webx如何管理和依赖外部库。 9. **启动指南**:`start step by step.txt`和`roadmap.txt`...
"Webx及框架简介"的PPT文件可能涵盖了框架的基本概念、安装配置、使用示例、最佳实践等内容,对于初学者来说,是理解阿里巴巴Web框架体系的良好起点。通过学习这些材料,开发者不仅可以了解Webx的运作原理,还能掌握...
- **文档和文件交换**:轻松共享文档和文件。 - **应用程序演示与协作**:演示或共同操作任何应用程序。 - **桌面共享**:分享自己的桌面内容,甚至远程控制他人的桌面。 - **音频管理**:利用内置工具管理音频...
综上所述,dubbo-admin 是一个基于 Dubbo 的服务治理工具,它依赖于一系列开源库,如 Citrus WebX、FreeMarker 和 Grizzly,用于构建其管理界面和后端功能。通过源码分析和实践,开发者可以深入了解其工作原理,并...
此外,Wex5还提供了一系列可复用的组件,如表单控件、导航栏等,方便快速搭建界面。 五、Wex5开发环境与工具 为了提高开发效率,Wex5提供了一套集成开发环境(IDE),包含了代码编辑器、模拟器、调试工具等。开发者...
根据提供的文件内容,可以看出这是一份包含了特定代码和标记的文档。尽管文本中存在大量非标准字符和难以解析的信息,但仍然可以从结构上尝试提取出一些潜在的知识点。以下是对标题、描述、标签以及部分内容中可能...
- **2005-2007年**:去EJB重构,使用Spring+iBatis+WebX框架,以及AntX等工具,底层架构涉及iSearch、消息队列+企业服务总线(MQ+ESB)、数据挖掘和CMS。 - **2008-2009年**:针对海量数据处理,引入Memcached集群、...
【压缩包子文件的文件名称列表】"KC_p5_FrontJS-main"可能包含一系列的文件和目录,这些通常包括课程的笔记、代码示例、练习项目、课件或者任何其他有助于学习JavaScript前端开发的材料。"main"通常代表项目的主目录...