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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM