写在前面:

  最近要做一个新的功能,点击按钮,可以根据数据生成对应的xml文件并保存。下面记录一下在做的过程的一些疑惑与问题(我就是太笨了,一些很简单的知识都不知道,不过通过这次跟蛋蛋的交流,解决了我的很多疑惑~~~啊哈哈哈。。。)

  

  思考(做的过程中的疑惑):

  1.如何将实体类转成xml格式的文件?

    经查阅资料,生成xml格式的文件有很多种方法,dom、jdom、dom4j等,这里我采用的是jdom,具体的生成xml格式的过程可以看后面的代码部分。

  2.点击按钮可以生成xml文件,这个是可以做到的,但是在浏览器页面上却没有弹出提示框让用户选择文件的保存路径,那么这个弹出框是从哪里来的呢?

    原来这个下载弹出框,是需要我们在程序中设置的,就是需要我们设置response的响应头信息,设置之后,浏览器就会知道要弹出下载框。

  3.这个功能跟文件下载功能有什么区别?

    没有区别,生成xml文件,并保存,就是一个文件下载的功能

  4.什么是文件下载?

    文件下载的本质就是内容的输出。内容从哪里来?那么既然说是内容的输出,那这内容从何而来?大概有两种方式,第一,读取其他文件的内容;第二,在程序中,创建出一个内容,例如,一个字符串。如何输出?都说是输出,那肯定就是用OutputStream输出流来输出了。具体输出到哪儿?这里的输出并不是直接输出到文件里,而是把内容写到response响应里面,然后交给浏览器去做将内容写入到文件里的操作。

  5.什么是服务器内存?服务器磁盘?

    服务器内存是内存,磁盘是磁盘,两者不可混淆,但是要明白一点,文件下载,首先是要将内容保存到服务器内存中,然后才是从内存中写入到磁盘中。

  6.使用ajax请求进行文件下载可以吗?

    不可以的,因为ajax是异步的js,而js是不支持往磁盘里写东西的,所以响应流中的内容无法被写入到磁盘中,也就无法实现下载。故这里采用

window.location.href 

来发送请求。但是使用ajax请求发送请求是可以接收到响应的内容的。  

  好啦,在弄清楚了这些疑惑后,下面就开始具体的代码实现过程喽~

  前台jsp:

<%--Created by IntelliJ IDEA.User: ElevenDate: 2018/1/3Time: 10:07To change this template use File | Settings | File Templates.
--%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%String scheme = request.getScheme();String serverName = request.getServerName();String contextPath = request.getContextPath();int port = request.getServerPort();//网站的访问跟路径String baseURL = scheme + "://" + serverName + ":" + port+ contextPath;request.setAttribute("baseURL", baseURL);
%><html>
<head><title>生成xml文件</title><script type="text/javascript">function createXML(){//发送请求到服务器//!!!!对于文件的下载 不能使用ajax请求 因为ajax请求无法实现文件的下载
            window.location.href = '${baseURL}/createXML';}</script>
</head>
<body>点击按钮生成xml文件:<button id="btnClick" onclick="createXML();">生成xml文件</button>
</body>
</html>

  后台action:

/*** Description:com.ims.action* Author: Eleven* Date: 2018/1/2 9:56*/
@Controller("FileAction")
public class FileAction extends BaseAction {/*** 文件下载的过程大致分为三大步:* 1.设置response响应头,告知浏览器是文件下载,并弹出那个文件保存的框框* 2.获取输出的内容,并将要输出的内容转为byte[]格式* 3.输出,将内容写到响应中*/public void createXML(){//准备数据Demo d = new Demo();d.setDemoId(11);d.setDemoName("凤姐");Demo d2 = new Demo();d2.setDemoId(22);d2.setDemoName("小花");Demo d3 = new Demo();d3.setDemoId(33);d3.setDemoName("狗子");List<Demo> list = new ArrayList<Demo>();list.add(d);list.add(d2);list.add(d3);//1.设置文件下载的response响应格式String fileName = "demo";  //文件名String fileType = "xml";    //文件类型HttpServletResponse response = ServletActionContext.getResponse();response.setHeader("Content-Disposition", "attachment;filename=" + fileName + "." + fileType);response.setContentType("multipart/form-data");//2.将数据转为xml格式的字符串Element root = new Element("Demo-list");Document document = new Document(root);for(Demo demo:list){Element element = new Element("Demo");element.addContent(new Element("demoId").setText(String.valueOf(demo.getDemoId())));element.addContent(new Element("demoName").setText(demo.getDemoName()));root.addContent(element);}Format format = Format.getPrettyFormat(); //使xml文件 缩进效果XMLOutputter xmlout = new XMLOutputter(format);String result = xmlout.outputString(document);System.out.println("转为xml格式的数据:"+result);try {//3.将内容转为byte[]格式byte[] data = result.getBytes("UTF-8");//4.将内容写入响应流
OutputStream out = response.getOutputStream();out.write(data);out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}

  对于将实体类对象生成xml格式的字符串,这里用到了jdom的工具包,故需要导入jdom-jar包。

  sturts.xml配置:

<action name="createXML" class="FileAction" method="createXML">
</action>

  

  好啦,完成了上面的步骤,xml文件的生成与下载就完成了,运行截图:

  附:

  1.为什么大多数程序都要像下面的代码这样边读边写?

outputStream = new FileOutputStream(file);
byte[] temp = new byte[1024];
int size = -1;
while ((size = inputStream.read(temp)) != -1) { // 每次读取1KB,直至读完outputStream.write(temp, 0, size);
}

    为了减少服务器的内存,所以我们经常看见上面这段程序,此程序就是在边读边写(从一个文件中读取内容,然后将内容写到一个文件中),每次读取1kb,每次写1kb。

转载于:https://www.cnblogs.com/eleven258/p/8183119.html

xml文件生成与下载相关推荐

  1. (C++)将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法

    将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法 思路:将数据库所有要导出的信息通过sql语句得到,存储到结构体中,然后将结构体的内容通过自定义的xml格式导出. 此方法使用的是T ...

  2. xml文件的书写及读取books.xml文件生成Book类

    books.xml文件的书写: <?xml version="1.0" encoding="UTF-8" ?> <!-- <?xml v ...

  3. C#如何实现XML文件生成和读取,XML文件的打开方式,解决方案!!!!!!

    以前对XML文件没什么了解,觉得很神奇,其实C#中的XML文件一般就是你们项目下的配置文件,由根节点和子节点组成. 接下来给大家说说XML文件最基础的读取和生成! 以下为C#程序XML文件生成的控制台 ...

  4. XML文件生成XSD文件的方法

    1.下载一个trang.jar 2.把jar包放在文件任意目录下.如:D:\trang 3.并把你的Response.xml文件放在该文件夹下.例: <?xml version="1. ...

  5. 根据xml文件生成javaBean

    最近有个跟天猫对接的事情,我们需要把天猫的对象转成JavaBean这样好处理 总共有三个步骤 1.利用trang.jar对xml进行xsd的转换 可运行命令:java -jar trang.jar t ...

  6. 根据xml 文件生成 xsd文件 以及相关测试方法

    1.下载trang.jar 下载地址:  http://www.java2s.com/Code/Jar/t/Downloadtrang20091111jar.htm 2.用法介绍 将trang.jar ...

  7. python读xml文件生成头文件_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

  8. 根据xml文件生成对应javabean类

    1.把trang.jar包和xml文件放在一起 2.在dos窗口下 输入 java -jar trang.jar xml的文件名字  要生成的xsd文件名字 例如: java -jar 1.xml  ...

  9. 如何引用XML文件生成C#类

    目录 XSD File Generate Class File Simply. 1 Why use XSD file to create C# classes?... 2 How to convert ...

最新文章

  1. R语言使用caret包构建岭回归模型(Ridge Regression )构建回归模型、通过method参数指定算法名称、通过trainControl函数控制训练过程
  2. 著名统计学家Donald B. Rubin:机器是否可以思考甚至具有意识?
  3. Online Shopping网上商城数据库设计
  4. java new关键字
  5. 从无主之地看FPS+ARPG游戏的发展方向
  6. java args_Java命令行界面(第2部分):args4j
  7. 嵌入式软件工程师笔试题
  8. ##MySql数据库的增删改查方法
  9. 两名黑客因发现特斯拉漏洞获Model 3一辆和3.5万美元奖金
  10. 第一次立会(2019.3.24)
  11. 分布式系统理论(二):一致性协议Paxos
  12. 使用pt-query-digest,找到不是很合适的sql
  13. 怎样测网络服务器延迟,网速测试延迟(网络延迟多少正常)
  14. 计算机网络管理(第二版)自学教程
  15. android手机不开机刷机,手机无法开机怎么刷机?安卓手机救砖教程
  16. C# 彻底删除文件或目录,不可恢复,文件清除工具
  17. 作为一名软件测试人员,有哪些网站是你应该多多关注的,哪些书籍是你必须要看的?
  18. matlab实验思考,MATLAB实验.doc
  19. 《画解数据结构》九张动图,画解队列
  20. ubuntu server 14.04 编译安装xen4.4.2配置vtpm(一)——xen4.4.2源码编译安装

热门文章

  1. 基于GD32矩阵按键程序实现
  2. 【C语言】文件(FILE)
  3. Qt Creator Colliding Mice碰撞老鼠例程解析【1.5W字数长文!详细!】
  4. 计算机显示屏无法显示,电脑显示器屏幕不显示了怎么办
  5. 深度学习(二)梯度推导
  6. 计算机视觉、机器视觉、数字图像处理、机器学习/深度学习+图像处理 四者的关系
  7. 华测服务器进不去系统,华测云服务器如何登陆
  8. A-Level经济真题(8)
  9. [深度学习]深度学习风格迁移例程Github - Neural style in TensorFlow实现
  10. H264-整数DCT变换和蝶形变换代码实现