xml文件生成与下载
写在前面:
最近要做一个新的功能,点击按钮,可以根据数据生成对应的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: Eleven
- Date: 2018/1/3
- Time: 10:07
- To 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。
xml文件生成与下载的更多相关文章
- XML文件生成C++代码(基于pugixml)
简述 在一个项目中需要用到XML的解析和生成,知乎上有人推荐rapidxml和pugixml等库.RapidXML一看库还比较大,就先研究一下pugixml了. 因为对解析XML的需求不大(都是一些很 ...
- XML文件生成C++代码(基于rapidxml)
简述 与XML文件生成C++代码(基于pugixml)中的功能一致,只是这里改用的rapidxml来实现.就不多说了,直接放代码. 代码 #include "rapidxml-1.13/ra ...
- 根据xml文件生成javaBean
原 根据xml文件生成javaBean 2017年08月15日 18:32:26 吃完喝完嚼益达 阅读数 1727 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出 ...
- WebAPI使用多个xml文件生成帮助文档
一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xm ...
- WebAPI使用多个xml文件生成帮助文档(转)
http://www.cnblogs.com/idoudou/p/xmldocumentation-for-web-api-include-documentation-from-beyond-the- ...
- 如何引用XML文件生成C#类
目录 XSD File Generate Class File Simply. 1 Why use XSD file to create C# classes?... 2 How to convert ...
- Android(java)学习笔记185:xml文件生成
1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...
- 根据XML文件生成XSD文件
在.net开发环境中查找XSD.exe文件,比如我的在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin目录下,将该路径添加到Path中,打开控制台,到 ...
- eclips运行generatorConfig.xml文件生成代码
描述: 如何通过eclips工具来运行 generatorConfig.xml 文件来自动生成代码并获取数据(类似于mybaits逆向生成)? mybatis-generator:generate 2 ...
随机推荐
- Mac 电脑鼠标和触摸板滚动方向不一致的问题【已解决】
当我们使用鼠标连接到 MacBook 时,会发现无论怎么设置,鼠标和触摸板的滚动方向都是相反的,导致不能同时使用鼠标和触摸板 解决方法: 我安装了下面的程序,它只允许您反转鼠标的滚动行为: Scrol ...
- springboot08 jdbc
一.JDBC&连接池 1. jdbc介绍 JDBC(Java DataBase Connectivity ,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数 ...
- [错误解决]pandas DataFrame中经常出现SettingWithCopyWarning
先从原dataframe取出一个子dataframe,然后再对其中的元素赋值,例如 s = d[d['col_1'] == 0] s.loc[:, 'col_2'] = 1 就会出现报错: Setti ...
- 201621123033 《Java程序设计》第3周学习总结
第三周作业 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1 ...
- 获取任意网站的图标,标题栏logo,网站logo
https://www.hao123.com/favicon.ico 网站换成你想要的 大多数都可以
- PHP命名空间与use
当在一个大型项目很多程序员书写模板时,最怕出现的问题就是命名,如果一个PHP脚本出现了同名的类或者方法,就会报错(fatal error),使用命名空间可以 解决这个问题 知识点: 命名空间names ...
- PHP文件信息获取函数
知识点: basename():获取文件名,传入第二个参数则只显示文件名,不显示后缀 dirname():获取文件路径 pathinfo():将文件信息存入一个数组,通过索引basename,dirn ...
- qemu中的网络设置
https://www.cnblogs.com/hukey/p/6436211.html 这个链接里教你怎么操作kvm的各种网络模式,实际操作成
- POJ 1149 PIGS | 最大流问题
参考了这个PDF 第一道网络流啊!感动 #include<cstdio> #include<algorithm> #include<cstring> #includ ...
- hust 1605 bfs
思路:直接用优先队列优化bfs. #include<map> #include<queue> #include<vector> #include<cmath& ...