设为首页收藏本站

IT技术擎 - 最棒的IT web技术交流社区

 找回密码
 注册为IT技术擎人

QQ登录

只需一步,快速开始

搜索
热搜: php h5 jquery
查看: 9|回复: 0

[其他] xml文件生成与下载

[复制链接]

9156

主题

9156

帖子

2万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
27982
发表于 2018-5-16 23:25:09 | 显示全部楼层 |阅读模式

写在前面:  最近要做一个新的功能,点击按钮,可以根据数据生成对应的xml文件并保存。下面记录一下在做的过程的一些疑惑与问题(我就是太笨了,一些很简单的知识都不知道,不过通过这次跟蛋蛋的交流,解决了我的很多疑惑~~~啊哈哈哈。。。)
  
  思考(做的过程中的疑惑):  1.如何将实体类转成xml格式的文件?    经查阅资料,生成xml格式的文件有很多种方法,dom、jdom、dom4j等,这里我采用的是jdom,具体的生成xml格式的过程可以看后面的代码部分。
  2.点击按钮可以生成xml文件,这个是可以做到的,但是在浏览器页面上却没有弹出提示框让用户选择文件的保存路径,那么这个弹出框是从哪里来的呢?    原来这个下载弹出框,是需要我们在程序中设置的,就是需要我们设置response的响应头信息,设置之后,浏览器就会知道要弹出下载框。
  3.这个功能跟文件下载功能有什么区别?    没有区别,生成xml文件,并保存,就是一个文件下载的功能
  4.什么是文件下载?    文件下载的本质就是内容的输出。内容从哪里来?那么既然说是内容的输出,那这内容从何而来?大概有两种方式,第一,读取其他文件的内容;第二,在程序中,创建出一个内容,例如,一个字符串。如何输出?都说是输出,那肯定就是用OutputStream输出流来输出了。具体输出到哪儿?这里的输出并不是直接输出到文件里,而是把内容写到response响应里面,然后交给浏览器去做将内容写入到文件里的操作。
  5.什么是服务器内存?服务器磁盘?    服务器内存是内存,磁盘是磁盘,两者不可混淆,但是要明白一点,文件下载,首先是要将内容保存到服务器内存中,然后才是从内存中写入到磁盘中。
  6.使用ajax请求进行文件下载可以吗?    不可以的,因为ajax是异步的js,而js是不支持往磁盘里写东西的,所以响应流中的内容无法被写入到磁盘中,也就无法实现下载。故这里采用
  1. window.location.href
复制代码
来发送请求。  
  好啦,在弄清楚了这些疑惑后,下面就开始具体的代码实现过程喽~
  前台jsp:
  1. <%-- Created by IntelliJ IDEA. User: Eleven Date: 2018/1/3 Time: 10:07 Tochange this template use File | Settings | File Templates.
  2. --% > <!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"% >
  3. <% Stringscheme =request.getScheme();StringserverName =request.getServerName();StringcontextPath =request.getContextPath();intport =request.getServerPort();
  4. //网站的访问跟路径 StringbaseURL =scheme +"://"+serverName +":"+port +contextPath; request.setAttribute("baseURL", baseURL);
  5. % >
  6. <
  7. html > <
  8. head > <
  9. title >生成xml文件 </title > <
  10. script type="text/javascript" >
  11. functioncreateXML(){//发送请求到服务器 //!!!!对于文件的下载 不能使用ajax请求 因为ajax请求无法实现文件的下载 window.location.href ='${baseURL}/createXML'; } </script > </head > <
  12. body >
  13. 点击按钮生成xml文件: <
  14. button id="btnClick"onclick="createXML();" >生成xml文件 </button > </body > </html >
复制代码
  后台action:
  1. /** * Description:com.ims.action * Author: Eleven * Date: 2018/1/2 9:56 */@Controller("FileAction")
  2. publicclassFileAction extendsBaseAction {
  3. /** * 文件下载的过程大致分为三大步: * 1.设置response响应头,告知浏览器是文件下载,并弹出那个文件保存的框框 * 2.获取输出的内容,并将要输出的内容转为byte[]格式 * 3.输出,将内容写到响应中 */ publicvoidcreateXML(){
  4. //准备数据 Demo d = newDemo(); d.setDemoId(11); d.setDemoName("凤姐"); Demo d2 = newDemo(); d2.setDemoId(22); d2.setDemoName("小花"); Demo d3 = newDemo(); d3.setDemoId(33); d3.setDemoName("狗子");
  5. List <Demo > list = newArrayList <Demo >(); list.add(d); list.add(d2); list.add(d3);
  6. //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 = newElement("Demo-list"); Document document = newDocument(root);for(Demo demo:list){
  7. Element element = newElement("Demo"); element.addContent(newElement("demoId").setText(String.valueOf(demo.getDemoId()))); element.addContent(newElement("demoName").setText(demo.getDemoName()));
  8. root.addContent(element); }
  9. Format format = Format.getPrettyFormat(); //使xml文件 缩进效果 XMLOutputter xmlout = newXMLOutputter(format); String result =xmlout.outputString(document); System.out.println("转为xml格式的数据:"+result);try{//3.将内容转为byte[]格式 byte[] data = result.getBytes("UTF-8");
  10. //4.将内容写入响应流 OutputStream out =response.getOutputStream(); out.write(data); out.flush(); out.close(); }catch(IOException e) { e.printStackTrace(); }
  11. }}
复制代码
  对于将实体类对象生成xml格式的字符串,这里用到了jdom的工具包,故需要导入jdom-jar包。
  sturts.xml配置:
  1. <
  2. action name="createXML"class="FileAction"method="createXML" > </action >
复制代码
  
  好啦,完成了上面的步骤,xml文件的生成与下载就完成了,运行截图:

  附:
  1.为什么大多数程序都要像下面的代码这样边读边写?
  1. outputStream = newFileOutputStream(file);
  2. byte[] temp = new byte[1024];
  3. int size = -1;
  4. while ((size = inputStream.read(temp)) != -1) { // 每次读取1KB,直至读完 outputStream.write(temp, 0, size);
  5. }
复制代码
    为了减少服务器的内存,所以我们经常看见上面这段程序,此程序就是在边读边写(从一个文件中读取内容,然后将内容写到一个文件中),每次读取1kb,每次写1kb。
该用户未在地球留下任何的痕迹

本版积分规则

QQ|小黑屋|帮助|IT技术擎 ( 沪ICP备15054863号  

GMT+8, 2018-5-25 20:39

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表