写在前面:

  最近要做一个新的功能,点击按钮,可以根据数据生成对应的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文件生成与下载的更多相关文章

  1. XML文件生成C++代码(基于pugixml)

    简述 在一个项目中需要用到XML的解析和生成,知乎上有人推荐rapidxml和pugixml等库.RapidXML一看库还比较大,就先研究一下pugixml了. 因为对解析XML的需求不大(都是一些很 ...

  2. XML文件生成C++代码(基于rapidxml)

    简述 与XML文件生成C++代码(基于pugixml)中的功能一致,只是这里改用的rapidxml来实现.就不多说了,直接放代码. 代码 #include "rapidxml-1.13/ra ...

  3. 根据xml文件生成javaBean

    原 根据xml文件生成javaBean 2017年08月15日 18:32:26 吃完喝完嚼益达 阅读数 1727 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出 ...

  4. WebAPI使用多个xml文件生成帮助文档

    一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xm ...

  5. WebAPI使用多个xml文件生成帮助文档(转)

    http://www.cnblogs.com/idoudou/p/xmldocumentation-for-web-api-include-documentation-from-beyond-the- ...

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

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

  7. Android(java)学习笔记185:xml文件生成

    1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...

  8. 根据XML文件生成XSD文件

    在.net开发环境中查找XSD.exe文件,比如我的在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin目录下,将该路径添加到Path中,打开控制台,到 ...

  9. eclips运行generatorConfig.xml文件生成代码

    描述: 如何通过eclips工具来运行 generatorConfig.xml 文件来自动生成代码并获取数据(类似于mybaits逆向生成)? mybatis-generator:generate 2 ...

随机推荐

  1. CodeForces-1061B Views Matter

    题目链接 https://vjudge.net/problem/CodeForces-1061B 题面 Description You came to the exhibition and one e ...

  2. php中变量的详细介绍

    变量的含义: 用于存储信息的容器,在程序运行期间,可以变化的量 变量的命名规则: 1.变量以$符开始 2.变量名只能以字母或下划线开始 3.变量名只能是字母,下划线,数字,不能有特殊字符:逗号,句号, ...

  3. JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用

    目录 描述 原因分析 处理办法 参考 描述 最近研究把项目的JDK升级从1.8升级到9.0.1,在eclipse上配置好JDK为9后,发现项目有错,查看发现sun.misc.BASE64Decoder ...

  4. vue前端开发那些事(1)

    如上图所示,用vue开发一个小型网站所涉及到的知识点.这只是前端部分已经这么多了.接下来我分解开来说. 1.Node 当我们开发vue项目的时候,首先要安装Node.js,那么我们即使当时不理解为什么 ...

  5. BZOJ5158 [Tjoi2014]Alice and Bob 【贪心 + 拓扑】

    题目链接 BZOJ5158 题解 题中所给的最长上升子序列其实就是一个限制条件 我们要构造出最大的以\(i\)开头的最长下降子序列,就需要编号大的点的权值尽量小 相同时当然就没有贡献,所以我们不妨令权 ...

  6. NOIP2017赛前模拟11月4日总结:

    第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...

  7. 《R语言实战》读书笔记--第三章 图形初阶(二)

    3.4添加文本.自定义坐标轴和图例 很多作图函数可以设置坐标轴和文本标注.比如标题.副标题.坐标轴标签.坐标轴范围等.需要注意的是并不是所有的绘图函数都有上述的参数,需要进行验证.可以将一些默认的参数 ...

  8. Codeforces Round #527 (Div. 3) ABCDEF题解

    Codeforces Round #527 (Div. 3) 题解 题目总链接:https://codeforces.com/contest/1092 A. Uniform String 题意: 输入 ...

  9. MyEclipse内安装与使用SVN

    安装教程 http://blog.csdn.net/u014756827/article/details/52288161 使用教程 http://www.cnblogs.com/keyi/p/594 ...

  10. GitHub上README写法暨markdown语法解读

    原文: GitHub上README写法暨markdown语法解读 自从开始玩GitHub以来,就 越来越 感觉它有爱.最近对它的 README.md 文件颇为感兴趣.便写下这贴,帮助更多的还不会编写R ...