zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    OTG线与普通USB线的区别
    打开CMDLINE中的 ” earlyprink “ 参数
    深化管理、提升IT的数据平台建设方案
    ROS(indigo)ROSPlan框架
    ROS(indigo)RRT路径规划
    Unity UGUI图文混排(六) -- 超链接
    ROSCon 2016视频和幻灯片发布 ROS机器人操作系统重要参考资料
    Ubuntu和ROS一起愉快玩耍
    IO流—字符流
    IO流——字节流
  • 原文地址:https://www.cnblogs.com/eleven258/p/8183119.html
Copyright © 2011-2022 走看看