文章目錄
請求參數作為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上下文中的檔案。