AJAX基礎-第3章(6)

來源:互聯網
上載者:User
文章目錄
  • ByteArrayInputStream

請求參數作為XML發送: 

在CreateXml方法中,為什麼結束標記中斜線前面有個反斜線?

使用反斜線可以避免把串解析成標記,即使沒有反斜線大部分瀏覽器也能安區處理,但是根據標準,應該使用反斜線。

如果出現xmlHttp.status ==404,代表找不到配置的servlet,可能是mapping的路徑不對。

 <select id="petTypes" size="6" multiple="true">

multiple代表可以多選,書寫時可以不用付值。

(1)得到DOM解析器的工廠執行個體

DocumentBuilderFactory.newInstance()

(2)從DOM工廠獲得DOM解析器

DocumentBuilder dombuilder=domfac.newDocumentBuilder();

(3)把要解析的XML文檔轉化為輸入資料流,以便DOM解析器解析它

DocumentBuilderFactory.newInstance().newDocumentBuilder()
                    .parse(new ByteArrayInputStream(xml.getBytes()));

ByteArrayInputStream
public ByteArrayInputStream(byte[] buf)
建立一個 ByteArrayInputStream,使用 buf 作為其緩衝區數組
public byte[] getBytes()
使用平台預設的字元集將此 String 解碼為位元組序列,並將結果儲存到一個新的位元組數組中。

例:Postingxml.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Sending an XML Request</title>

<script type="text/javascript">

var xmlHttp;

function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}
   
function createXML() {
    var xml = "<pets>";
   
    var options = document.getElementById("petTypes").childNodes;
    var option = null;
    for(var i = 0; i < options.length; i++) {
        option = options[i];
        if(option.selected) {
            xml = xml + "<type>" + option.value + "<//type>";
        }
    }
   
    xml = xml + "<//pets>";
    return xml;
}

function sendPetTypes() {
    createXMLHttpRequest();
   
    var xml = createXML();
    var url = "PostingXMLExample?timeStamp=" + new Date().getTime();
   
    xmlHttp.open("POST", url, true);
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");   
    xmlHttp.send(xml);
}
   
function handleStateChange() {

    if(xmlHttp.readyState == 4) {
        alert(xmlHttp.status);
        if(xmlHttp.status == 200) {
            alert("");
            parseResults();
        }
    }
}

function parseResults() {
alert("");
    var responseDiv = document.getElementById("serverResponse");
    if(responseDiv.hasChildNodes()) {
        responseDiv.removeChild(responseDiv.childNodes[0]);
    }
   
    var responseText = document.createTextNode(xmlHttp.responseText);
    responseDiv.appendChild(responseText);
}

</script>
</head>

<body>
  <h1>Select the types of pets in your home:</h1>
 
  <form action="#">
    <select id="petTypes" size="6" multiple="true">
        <option value="cats">Cats</option>
        <option value="dogs">Dogs</option>
        <option value="fish">Fish</option>
        <option value="birds">Birds</option>
        <option value="hamsters">Hamsters</option>
        <option value="rabbits">Rabbits</option>
    </select>
   
    <br/><br/>
    <input type="button" value="Submit Pets" onclick="sendPetTypes();"/>
  </form>

  <h2>Server Response:</h2>

  <div id="serverResponse"></div>

</body>
</html>

postingxmlexample.java:

package ajaxbook.chap3;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class PostingXMLExample extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       
        String xml = readXMLFromRequestBody(request);
        Document xmlDoc = null;
        try {
            xmlDoc =
                    DocumentBuilderFactory.newInstance().newDocumentBuilder()
                    .parse(new ByteArrayInputStream(xml.getBytes()));
        }
        catch(ParserConfigurationException e) {
            System.out.println("ParserConfigurationException: " + e);
        }
        catch(SAXException e) {
            System.out.println("SAXException: " + e);
        }

        /* Note how the Java implementation of the W3C DOM has the same methods
         * as the JavaScript implementation, such as getElementsByTagName and
         * getNodeValue.
         */
        NodeList selectedPetTypes = xmlDoc.getElementsByTagName("type");
        String type = null;
        String responseText = "Selected Pets: ";
        for(int i = 0; i < selectedPetTypes.getLength(); i++) {
           type = selectedPetTypes.item(i).getFirstChild().getNodeValue();
           responseText = responseText + " " + type;
        }
       
        response.setContentType("text/xml");
        response.getWriter().print(responseText);
    }
   
    private String readXMLFromRequestBody(HttpServletRequest request){
        StringBuffer xml = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while((line = reader.readLine()) != null) {
                xml.append(line);
            }
        }
        catch(Exception e) {
            System.out.println("Error reading XML: " + e.toString());
        }
        return xml.toString();
    }
}
說明:

一、servlet
response實現了HttpServletResponse介面,request實現了HttpServletRequest介面。

1、輸出資料流有兩個:
位元組形式輸出:response.getOutputStream()
字元形式輸出:response.getWriter()

2、輸入資料流有兩個:
位元組形式輸入:request.getInputStream()
字元形式輸入:request.getReader()

二、JSP
JSP中的response對象已經實現了HttpServletResponse介面,request對象已經實現了HttpServletRequest介面。

1、輸出資料流
jsp中的out對象為response.getOutputStream()的傳回值,所以在jsp中不能再調用response.getOutputStream()方法,否則就會出現重複調用的錯誤,因為不能同時建立兩個同樣的位元組輸出資料流。
jsp中可以使用response.getWriter()方法建立字元輸出資料流來輸出字元資料到網頁上。

2、輸入資料流
jsp中好像沒有自動實現輸入資料流的對象,所以可以使用request.getInputStream(),request.getReader()方法建立輸入資料流。

3、讀寫伺服器上的檔案
file.Reader()和file.Writer()方法可以用來讀寫伺服器上任何位置的檔案。
application(ServletContext).getResourceAsStream()方法可以讀取servlet上下文中的檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.