`

Webx系列之文件下载

 
阅读更多

在之前的文章中我们讲了下文件上传,今天我们来说一下文件的下载。总的来说,文件下载有下面三种方式来实现。下面我们来一一介绍一下。

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>
后台下载逻辑同上面的。
 


分享到:
评论

相关推荐

    webx

    3. **动态表单**:WebX 支持动态表单生成,允许开发者通过配置文件定义表单字段和验证规则,自动根据数据库结构生成表单,减少了重复代码。 4. **数据库操作**:WebX 提供了强大的数据库操作接口,支持SQL语句的...

    WEBX3.0框架指南(PDF版)

    - **基础框架**:WEBX3.0的基础构建于Spring框架之上,通过提供一系列扩展点来实现高度定制化的开发。 - **层次化**:框架被划分为多个层次,每个层次负责不同的功能模块,这种设计使得开发者可以按需选择使用哪些...

    webx总结

    Webx 提供了一系列开发工具,帮助开发者快速构建和调试应用。例如,内置的控制台工具可以用来监控应用运行状态,管理数据库连接,进行性能调优等。此外,Webx 还集成了常见的开发库,如Spring、Hibernate等,使得...

    webx3 PDF(阿里巴巴 前端web框架)

    - **修改资源文件的内容**:为了适应动态变化的场景,Webx还提供了对资源文件内容的修改功能。 - **直接使用ResourceLoadingService**:对于更高级的需求,可以直接使用ResourceLoadingService来进行定制化的资源...

    淘宝框架 Webx3资料

    - **发展历程**:Webx3框架自发布以来经历了多个版本的迭代与优化,逐渐成为阿里巴巴内部以及外部开发者青睐的技术栈之一。其最新版本(Webx3)不仅继承了前代的优点,还在功能性和易用性方面做了进一步的增强。 ##...

    Webx3 Guide Book pdf

    **Filter、RequestContexts和Pipeline**是Webx框架中的关键概念之一。 ##### **6.1 Filter** - **Filter的用途**:Filter用于拦截请求并执行特定的逻辑。 - **Filter工作原理**:在请求到达控制器之前,Filter可以...

    Groovy need not rails——介绍自己写的一个基于groovy的框架,Webx

    8. **依赖管理**:`.classpath`和`.project`文件是Eclipse项目配置文件,它们包含了项目的类路径和构建设置,可能也指示了Webx如何管理和依赖外部库。 9. **启动指南**:`start step by step.txt`和`roadmap.txt`...

    阿里巴巴Web及框架简介

    "Webx及框架简介"的PPT文件可能涵盖了框架的基本概念、安装配置、使用示例、最佳实践等内容,对于初学者来说,是理解阿里巴巴Web框架体系的良好起点。通过学习这些材料,开发者不仅可以了解Webx的运作原理,还能掌握...

    webex软件应用

    - **文档和文件交换**:轻松共享文档和文件。 - **应用程序演示与协作**:演示或共同操作任何应用程序。 - **桌面共享**:分享自己的桌面内容,甚至远程控制他人的桌面。 - **音频管理**:利用内置工具管理音频...

    dubbo-admin

    综上所述,dubbo-admin 是一个基于 Dubbo 的服务治理工具,它依赖于一系列开源库,如 Citrus WebX、FreeMarker 和 Grizzly,用于构建其管理界面和后端功能。通过源码分析和实践,开发者可以深入了解其工作原理,并...

    wex5 5.2.7帮助手册[全].rar

    此外,Wex5还提供了一系列可复用的组件,如表单控件、导航栏等,方便快速搭建界面。 五、Wex5开发环境与工具 为了提高开发效率,Wex5提供了一套集成开发环境(IDE),包含了代码编辑器、模拟器、调试工具等。开发者...

    Sahdei Report Buzurg Final Print out

    根据提供的文件内容,可以看出这是一份包含了特定代码和标记的文档。尽管文本中存在大量非标准字符和难以解析的信息,但仍然可以从结构上尝试提取出一些潜在的知识点。以下是对标题、描述、标签以及部分内容中可能...

    阿里巴巴中文站架构设计实践(何崚).pdf

    - **2005-2007年**:去EJB重构,使用Spring+iBatis+WebX框架,以及AntX等工具,底层架构涉及iSearch、消息队列+企业服务总线(MQ+ESB)、数据挖掘和CMS。 - **2008-2009年**:针对海量数据处理,引入Memcached集群、...

    KC_p5_FrontJS

    【压缩包子文件的文件名称列表】"KC_p5_FrontJS-main"可能包含一系列的文件和目录,这些通常包括课程的笔记、代码示例、练习项目、课件或者任何其他有助于学习JavaScript前端开发的材料。"main"通常代表项目的主目录...

Global site tag (gtag.js) - Google Analytics