jqueryajax不能返回XML的问题

如果返回的是个XML字符流而不是XML文件还是要将其转换为XML对象才可正常解析。

如下:

var xmlObject = new ActiveXObject(“Msxml.DOMDocument”);

xmlObject.async = false; 

xmlObject.loadXML(message);

$(xmlObject).find(“op”).each(function(){

  var ss = $(this).text();

  var aa = ss.split(“|”);

  var key = aa[0];

  var name = aa[1];

});

记得将datatype:xml修改成datatype:html

利用DOM来处理XML文档(zz)

XML文件1
< xml version=”1.0″ standalone=”yes”  >
<Tree>
<TreeNode>
<NodeId>0</NodeId>
<Title>代號 </Title>
<NodeXmlSrc>Content.xml</NodeXmlSrc>
</TreeNode>
<TreeNode>
<NodeId>0</NodeId>
<Title>品牌</Title>
<NodeXmlSrc>BrandList.xml</NodeXmlSrc>
</TreeNode>
<TreeNode>
<NodeId>0</NodeId>
<Title>型體</Title>
<NodeXmlSrc>SpecContent.xml</NodeXmlSrc>
</TreeNode>
<TreeNode>
<NodeId>0</NodeId>
<Title>客戶</Title>
<NodeXmlSrc>BuyerList.xml</NodeXmlSrc>
</TreeNode>
<TreeNode>
<NodeId>0</NodeId>
<Title>規格</Title>
<NodeXmlSrc>SpecList.xml</NodeXmlSrc>
</TreeNode>
<TreeNode>
<NodeId>0</NodeId>
<Title>中國</Title>
<NodeXmlSrc>aa.xml</NodeXmlSrc>
</TreeNode>
</Tree>

XML文件2
< xml version=”1.0″ standalone=”yes”  >
<Tree>
<TreeNode NodeId=”0″ Title=”客戶” NodeXmlSrc=”BuyerList.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”品牌” NodeXmlSrc=”Sample.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”型體” NodeXmlSrc=”msdnlib587_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”規格” NodeXmlSrc=”msdnlib3_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”代號” NodeXmlSrc=”msdnlib3_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”產地” NodeXmlSrc=”msdnlib587_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”中國” NodeXmlSrc=”123456.xml”></TreeNode>
</Tree>

我說的是它們的結構,為什麼不一樣,但是出到一個TABLE里面卻是一樣的啊,
文件2變成文件1的形式

两个文件的结构明显不同么,还用说有什么不同吗?
主要的问题是如何转换。
可以用DOM解析第二个文件,然后再构造出第一个文件。

try:
/*** a.htm ***/
<SCRIPT LANGUAGE=”javaScript”>
function transXML()
{
var oXML, oXSL ;
var sXML ;

oXML= new ActiveXObject(“MSXML2.DOMDocument.3.0”) ;
oXSL= new ActiveXObject(“MSXML2.DOMDocument.3.0”) ;
oXML.async = false ;
oXML.load(“a.xml”) ;
oXSL.async = false ;
oXSL.load(“a.xsl”) ;

alert(oXML.xml);//转换前

sXML= oXML.transformNode(oXSL)

alert(sXML);//转换后
}

function window.onload()
{
transXML();
}
</SCRIPT>

/*** a.xml ***/
< xml version=”1.0″ encoding=”utf-8″  >
<Tree>
<TreeNode NodeId=”0″ Title=”客戶” NodeXmlSrc=”BuyerList.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”品牌” NodeXmlSrc=”Sample.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”型體” NodeXmlSrc=”msdnlib587_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”規格” NodeXmlSrc=”msdnlib3_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”代號” NodeXmlSrc=”msdnlib3_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”產地” NodeXmlSrc=”msdnlib587_.xml”></TreeNode>
<TreeNode NodeId=”0″ Title=”中國” NodeXmlSrc=”123456.xml”></TreeNode>
</Tree>

/*** a.xsl ***/
< xml version=”1.0″ encoding=”utf-8″  >
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform“>
<xsl:output method=”xml” encoding=”utf-8″ indent=”yes”/>

<xsl:template match=”/”>
<Tree>
<xsl:apply-templates select=”Tree/TreeNode” />
</Tree>
</xsl:template>

<xsl:template match=”TreeNode”>
<xsl:element name=”{name()}”>
<xsl:for-each select=”@*”>
<xsl:element name=”{name()}”>
<xsl:value-of select=”.” />
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

在/Tree/TreeNode下,
“XML文件1″以element来描述当前TreeNode的各特性
“XML文件2″以attribute来描述当前TreeNode的各特性
这导致结构差异

element和attribute在DOM中都可定义为XmlNode但NodeType不同,其内容处理方式也有不同

DWR中提供XML的传递方法

ajax利用xml验证信息

<script type=”text/javascript”>


var XMLHttpReq = false;
         //创建一个XMLHttpRequest对象 
        function createXMLHttpReq(){
       
            if(window.XMLHttpRequest){
           
                XMLHttpReq = new XMLHttpRequest();
            }
            else if(window.ActiveXObject){
           
            try{
           
                XMLHttpReq = new ActiveXObject(“Msxml2.XMLHTTP”);
            }catch(e){
               
                try{
               
                    XMLHttpReq = new ActiveXObject(“Microsoft.XMLHTTP”);
                }
                catch(e){  }
               
               
                  }
            }
        }
       
         //身份验证  
        function check(){
       
            var username = document.all(“name”).value;
            var password = document.all(“pwd”).value;
            var yanzhengimg = document.all(“yanzhengimg”).value;
           
            if(username==””){
               
                alert(“用户名不能为空!”);
                return false;
            }
            else if(username.length<6){
           
                alert(“长度不足六位!”);
                return false;
           
            }
           
            else if(password==””){
           
                alert(“密码不能为空!”);
                return false;
            }
           
            else if(password.length<6){
                alert(“长度不足六位!”);
                return false;
           
            }else if(yanzhengimg.length!=4){
           
                alert(“验证码长度不正确!”);
                return false;
            }
           
            else{
                send(“<%=basePath%>”+”/LoginServlet username=”+username+”&password=”+password+”&yanzhengimg=”+yanzhengimg);
               
                   
                    }
           
        }
       
        //发送请求函数 
        function send(url){
       
            createXMLHttpReq();
           
            XMLHttpReq.open(“GET”,url,”true”);
           
            XMLHttpReq.onreadystatechange=proce;
           
            XMLHttpReq.send(null);
           
           
           
        }
       
    //获取返回的值   
        function proce(){
            if(XMLHttpReq.readyState==4){
                if(XMLHttpReq.status==200){
               
                    var res = XMLHttpReq.responseXML.getElementsByTagName(“content”)[0].firstChild.data; 
                    if(res==”loginsuccess”){
                   
                        window.location.href=”<%=path%>/houtai/index.jsp”;
                       
                    }
                   
                    if(res==”passworderror”){
                       
                       
                        window.alert(“用户密码错误!”);
                       
                       
                       
                    }
               
                    if(res==”usernamenull”){
                   
                        window.alert(“用户名不存在!”);
                       
                    }
                    if(res==”yanzengerror”){
                   
                        window.alert(“验证码错误!”);
                       
                    }
                   
                }else   
               
                alert(“所请求的页面有异常!”);
               
            }
           
        }
       
       
       
    </script>


servlet中的代码如下try {
            user = dao.getData(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        out.print(“<pront>”);
        if (user.getUsername() == null) {

            out.print(“<content>” + nouser + “</content>”);

        } else if(user.getUsername() != null){
            if (!user.getPassword().equals(password)) {

                out.print(“<content>” + errpassword + “</content>”);
            }
       
            else if(!yanzheng.equals(yanzhengma)){
               
                out.print(“<content>” + erryanzheng + “</content>”);
            }
            else{
               
               
                String id = session.getId();
                System.out.println(“sessionID”+id);
                String sql3=”insert into session(sessionid) values(‘”+id+”‘)”;
                System.out.println(sql3);
                CommDao dao2 = DaoFactory.getCommdaoImp();
                dao2.add(sql3);
                out.print(“<content>” + loginsuccess + “</content>”);
            }
       
        }

        out.print(“</pront>”);
        out.flush();
        out.close();

DWR入門與應用(三)

來寫個AJAX版的聊天室吧!先看看直接使用AJAX要如何做到,首先需要一個簡單的聊天室Servlet…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package onlyfun.caterpillar;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ChatRoomServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
private static LinkedList<Message> messages = new LinkedList<Message>();

public ChatRoomServlet() {
super();
}

private List<Message> addMessage(String text) {
if (text != null && text.trim().length() > 0) {
messages.addFirst(new Message(text));
while (messages.size() > 10) {
messages.removeLast();
}
}

return messages;
}

private List<Message> getMessages() {
return messages;
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Message> list = null;

if("send".equals(request.getParameter("task"))) {
list = addMessage(request.getParameter("msg"));
}
else if("query".equals(request.getParameter("task"))){
list = getMessages();
}

PrintWriter out = response.getWriter();
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");

out.println("<response>");
for(int i = 0; i < list.size(); i++) {
String msg = list.get(i).getText();
out.println("<message>" + msg + "</message>");
}
out.println("</response>");
}
}

Message物件如下…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package onlyfun.caterpillar;

public class Message {
private long id = System.currentTimeMillis();
private String text;

public Message(String newtext) {
text = newtext;
if (text.length() > 256) {
text = text.substring(0, 256);
}
text = text.replace('<', '[');
text = text.replace('&', '_');
}

public long getId() {
return id;
}

public String getText() {
return text;
}
}

Servlet接受訊息新增與查詢,判斷的方式是檢查請求參數task是send或query。

Servlet會以XML傳回目前List當中的訊息,客戶端可以查詢或插入新訊息時,取得目前List中的訊息,接著在web.xml中設定一下…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
< xml version="1.0" encoding="UTF-8" >
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<description>
</description>
<display-name>
ChatRoomServlet</display-name>
<servlet-name>ChatRoomServlet</servlet-name>
<servlet-class>
onlyfun.caterpillar.ChatRoomServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ChatRoomServlet</servlet-name>
<url-pattern>/ChatRoomServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

在網頁中,使用者可以在輸入訊息後按下按鈕送出資訊,並在XML回應取得時,將訊息以一列一列的表格方式顯示出來,另外還設定了週期性的輪詢,即使不輸入新訊息,也可以週期性的取得新的聊天訊息…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Chat Room</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 sendMessage() {
var msg = document.getElementById("text").value;

if(msg == "") {
refreshMessage();
return;
}

var param = "task=send&msg=" + msg;
ajaxRequest(param);
document.getElementById("text").value = "";
}

function queryMessage() {
var param = "task=query";
ajaxRequest(param);
}

function ajaxRequest(param) {
var url = "ChatRoomServlet timestamp" + new Date().getTime();
createXMLHttpRequest();
xmlHttp.onreadystatechange = refreshMessage;
xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded;");
xmlHttp.send(param);
}

function refreshMessage() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status == 200) {
var messages = xmlHttp.responseXML.getElementsByTagName("message");

var table_body = document.getElementById("dynamicUpdateArea");
var length = table_body.childNodes.length;
for (var i = 0; i < length; i++) {
table_body.removeChild(table_body.childNodes[0]);
}

var length = messages.length;
for(var i = length - 1; i >= 0 ; i--) {
var message = messages[i].firstChild.data;
var row = createRow(message);

table_body.appendChild(row);
}
setTimeout("queryMessage()", 2000);
}
}
}

function createRow(message) {
var row = document.createElement("tr");
var cell = document.createElement("td");
var cell_data = document.createTextNode(message);
cell.appendChild(cell_data);
row.appendChild(cell);
return row;
}

</script>

</head>
<body>

<p>
Your Message:
<input id="text"/>
<input type="button" value="Send"
onclick="sendMessage()"/>
</p>

<p>Messages:</p>
<table align="left">
<tbody id="dynamicUpdateArea"></tbody>
</table>

</body>
</html>

簡單抓個畫面…

直接用AJAX,後端用JSP/Servlet,您要對請求參數做些判斷,看看是新增訊息或查詢,並要自行輸出XML,有的沒的…

改成DWR的話,就很簡單了,寫個簡單的Java物件…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package onlyfun.caterpillar;

import java.util.LinkedList;
import java.util.List;

public class Chat {
private static LinkedList<Message> messages = new LinkedList<Message>();

public List addMessage(String text) {
if (text != null && text.trim().length() > 0) {
messages.addFirst(new Message(text));
while (messages.size() > 10) {
messages.removeLast();
}
}

return messages;
}

public List getMessages() {
return messages;
}
}

接著…在dwr.xml中開放一下…

1
2
3
4
5
6
7
8
9
10
11
12
13
< xml version="1.0" encoding="UTF-8" >
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
<allow>

<create creator="new" javascript="Chat">
<param name="class" value="onlyfun.caterpillar.Chat"/>
</create>

<convert converter="bean" match="onlyfun.caterpillar.Message"/>
</allow>
</dwr>

使用者取得訊息時,是直接傳回List物件,而List中裝的是Message物件,Message物件是自訂物件,conterver設定為 bean,表示DWR會自動將Message的getter名稱轉換為傳回客戶端的JavaScript物件中的屬性,例如Message中有 getText(),則在客戶端可以用message.text這樣的方式來存取。

接著是簡單的客戶端網頁…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Insert title here</title>

<script src="dwr/interface/Chat.js" type="text/javascript"></script>
<script src="dwr/engine.js" type="text/javascript"></script>
<script src="dwr/util.js" type="text/javascript"></script>

<script type="text/javascript">
function sendMessage() {
var text = DWRUtil.getValue("text");
DWRUtil.setValue("text", "");
Chat.addMessage(text, gotMessages);
}

function gotMessages(messages) {
var chatlog = "";
for (var data in messages) {
chatlog = "<div>" + messages[data].text +
"</div>" + chatlog;
}
DWRUtil.setValue("chatlog", chatlog);
setTimeout("queryMessage()", 2000);
}

function queryMessage() {
Chat.getMessages(gotMessages);
}
</script>

</head>
<body>

<p>
Your Message:
<input id="text"/>
<input type="button" value="Send"
onclick="sendMessage()"/>
</p>

<p>Messages:</p>
<div id="chatlog"></div>

</body>
</html>

當List物件傳回時,它成為gotMessages(messages)中的messages物件,而messages物件中包括 Message物件轉換後對應的JavaScript物件,由於我們已經設定了Converter,所以可以用messages[data].text來 取得傳回的訊息…

簡單抓個畫面…

DWR.XML配置文件要注意的问题

DWR 配置文件定义了由 DWR 创建和被 Javascript 远程使用的类。

上面使用的 new creator 使用了所有的 JavaBeans 必须含有的公有(public)无参(no-args)的构造函数。值得一提的是, DWR 还有一些限制:

  • 避免使用 JavaScript 保留字;以保留字命名的方法将自动被排除。大多数 JavaScript 的保留字同时也是 Java 的保留字,因此无论如何你也不能使用一个名为 “try()” 的方法。但是最常用的一个词 “delete()”,在 JavaScript 中有特殊的含义而在 Java 中没有。
  • 重载方法(Overloaded methods)将会在调用的时候陷入未知的状况,因此应该避免重载方法。
  • web.xml配置404和500错误的自定义页面

    web.xml

     <error-page>
      <error-code>404</error-code>
      <location>/building.jsp</location>
     </error-page>

     <error-page>
      <error-code>500</error-code>
      <location>/error.jsp</location>
     </error-page>

     

    JSP页面的关键在于

    1 isErrorPage=”true”

    2 response.setStatus(HttpServletResponse.SC_OK);

    building.jsp

    <%@ page language=”java” contentType=”text/html; charset=GBK” isErrorPage=”true” pageEncoding=”GBK”%>
    <%response.setStatus(HttpServletResponse.SC_OK);

          %>
    <%
    /**
    * 本页面是在客户查找的页面无法找到的情况下调用的
    */
    response.setStatus(HttpServletResponse.SC_OK);
     %>
    <body>
    正在制作… <a href=”javascript:history.go(-1)”>返回</a>
    <br/>
    也可能页面连接更改了,请按 F5 键刷新整个页面看看,特别是菜单!

    </body>

     

    error.jsp

    <%@ page language=”java” contentType=”text/html; charset=GBK” isErrorPage=”true” pageEncoding=”GBK”%>
    <%@ page import=”java.io.*,java.util.*”%>
    <%response.setStatus(HttpServletResponse.SC_OK);

          %>
    <body>
    程序发生了错误,有可能该页面正在调试或者是设计上的缺陷.<br/>
    你可以选择<br/> <a href=<%=request.getContextPath()+”/forum/new.jsp” %>>反馈</a>
    提醒我… 或者<br/><a href=”javascript:history.go(-1)”>返回上一页</a>
    <hr width=80%>
    <h2><font color=#DB1260>JSP Error Page</font></h2>

    <p>An exception was thrown: <b> <%=exception.getClass()%>:<%=exception.getMessage()%></b></p>
    <%
    System.out.println(“Header….”);
    Enumeration<String> e = request.getHeaderNames();
    String key;
    while(e.hasMoreElements()){
      key = e.nextElement();
      System.out.println(key+”=”+request.getHeader(key));
    }
    System.out.println(“Attribute….”);
    e = request.getAttributeNames();
    while(e.hasMoreElements()){
      key = e.nextElement();
      System.out.println(key+”=”+request.getAttribute(key));
    }

    System.out.println(“Parameter….”);
    e = request.getParameterNames();
    while(e.hasMoreElements()){
      key = e.nextElement();
      System.out.println(key+”=”+request.getParameter(key));
    }
    %>
    111<%=request.getAttribute(“javax.servlet.forward.request_uri”) %><br>
    <%=request.getAttribute(“javax.servlet.forward.servlet_path”) %>

    <p>With the following stack trace:</p>
    <pre>
    <%exception.printStackTrace();
          ByteArrayOutputStream ostr = new ByteArrayOutputStream();
          exception.printStackTrace(new PrintStream(ostr));
          out.print(ostr);
        %>
    </pre>
    <hr width=80%>
    </body>

     

    数据发送,接受学习笔记(URLLoader类,URLRequestl类,URLVariables类)



    第一部分:准备发送数据

    1:考虑连接的外部url地址了。

       as2中把url地址,变量,通通写到LoadVars类里面。变量少没什么,要是变量多起来,那就有点麻烦,遇上要动态修改变量那更加麻烦了。as3 索性把把这一部分又分为两块,统一到URLRequest对象里面。单纯的url地址用URLRequest.url表示,变量用 URLRequest.data表示。修改起来方便许多。

       注意url地址也可以在使用URLRequest构造函数的时候写进去。

    2:数据传送方法,post还是get。

       as3狠了心了,要把它分的彻彻底底。把传送方法也弄到URLRequest对象里面去。用URLRequest对象的method属性表示。

    同时也有两种定义改属性的方法,

    CODE:

    引用

    request.method = URLRequestMethod.POST;//帮助文件中多用这种定义方式

       request.method = “post”;

    以上两句是等效的。你可以试试trace(URLRequestMethod.POST)。输入是 post。

       由于as3的默认method是get,建议都显示定义为post。

    第二部分:发送数据

    1:整合 send和load,就用一个load()。

    as2中,有单独的load()和send(),还有sendAnaLoad()。个人觉得前两个函数没用,既然是和外部数据通讯,每一个与外部的连接中,都需要检查flash的状态和外部数据的状态,才能保证双方的通信正常。那么 load()和send()就丢掉,用一个就行了。ADOBE把剩下的sendAndLoad()统一改成load(),不仅逻辑结构上更加合理,就连书写都简单了一半。

    相关语法:

    CODE:

    引用

    URLLoader () 构造函数

    public 函数 URLLoader(request:URLRequest = null)

    注意括号中是个URLRequest对象。已经把url地址,变量,方法都包括进去了。URLLoader对象现在执行的就是连接数据,接受数据两个事情,其他的都交给URLRequest对象管理。因为URLLoader对象还有很多事情要做,比如侦听连接数据和接受数据的情况,是否已经完成操作,或者已经完成到什么程度。在这里就大有文章了,各种各样的loading都需要URLLoader对象的bytesLoaded属性和bytesTotal 属性实现。所以说,as3的分工还是很有道理的。

      

    下面给出准备数据,连接外部数据的典型代码.接受数据处理数据将在下一步讨论

    CODE:

    引用

    var request:URLRequest = new URLRequest(“http://10.7.87.222/test.asp”);

    //request.contentType = “text/xml”;//这句代码可以自己单独尝试一下。笔者初学,也没详细去研究这个。只知道传递接收xml数据的时候有用。呵呵

    request.data = “bianliang=100”;

    request.method = “POST”;

    var loader:URLLoader = new URLLoader();

    loader.load(request);

    附asp代码,需要在iis5以上服务器上测试.保存文件为 UTF-8编码,文件名为test.asp.位于站点根目录下.

    CODE:

    引用

    <%@LANGUAGE=”JAVASCRIPT” CODEPAGE=”936″%>

    <%

    var bianliang=Request(“bianliang”)

    Response.Write(“&biangliang=”+bianliang)

    Response.Write(“&chenggong=chenggong”)

    %>

    第三部分:接受数据

    我想提示的有两点是:

    1 数据需要加载完成以后,才能被flash使用.

       所以一定要判断是否加载完成

       但是所用的语句与as2已经完全不同了.

       as2使用onLoad事件

       as3代码如下

    CODE:

    引用

    loader.addEventListener(Event.COMPLETE,completeHandler);

       function completeHandler(event:Event):void {

               trace(loader.data);

       }

    目前大家只要认识到数据的加载情况必须用事件侦听就行了.

       其实as3中的交互事件,都已经采用上面代码所有的事件侦听模式.

    2 需要区分 URLRequest类的data属性与URLLoader类的data属性

       前者是表示传递变量的一个集合,后者是接受到的数据的一个集合.

       别搞混就行了.

    ====================================

       如果这一部分要深入下去,涉及的东西就比较多了.

       包括xml的处理,和字符串的处理.

       各位可以先把上面说的东西先弄熟悉了.

       然后再学习怎么处理数据,以便flash使用.

       再此就不再过多叙述了,因为已经跑题了.

    差不多讲完了 

    NO ,我想还有个东西需要单独提出来说说

    第四部分:如何组织发送的变量 

    as2中的loadvars类,它是用n个属性保存变量

    as3使用URLRequest类的data属性保存变量.

    使用一个属性保存变量 

    更绝的是,该data属性是一个object值.靠!

    理论上说,我们已经可以把as3中的任意东西传送给外部脚本.

    现实一点来说,

    将data属性定义为一个string类型,

    就已经能实现我们的简单需求了

    比如传递多个变量

    URLRequest.data=”变量1=1&变量2=2&变量3=3″,

    只要会一定的字符串操作,就能很好的组织自己想发送的数据了.

    站巨人肩上,我们再想一下

    如果有n个变量,(n的值可以让人操作n个字符串的时候发狂.呵呵)

    如果是loadvars类,那没办法,还是老老实实的一个一个写吧

    as3中,怎么弄 怎么弄 怎么弄 怎么弄 怎么弄  怎么弄 

    既然data属性是个object值.

    又需要保存很多数据.

    那么有个词已经呼之欲出了

    数组!

    说到这里我就卡住了,

    我再考虑,数组这部分究竟就该详细的说一下 ,还是略去.

    考虑2分钟……………..

    既然能学到今天的as3想必已经是as2老手了,数组操作不讲也罢了

    如果是新手刚入门,估计您应该先去as2版块找找数组的资料

    呵呵 小弟这里就偷偷懒 见谅了

    最后提示一个:

    如果你还是喜欢as2的书写方式。

    as3还是可以满足你的。

    参考 URLVariables类。

    代码如下:

    CODE:

    引用

    var variables:URLVariables = new URLVariables();

                variables.exampleSessionId = new Date().getTime();

                variables.exampleUserLabel = “guest”;

                request.data = variables;

    前面3句代码似曾相识吧

    完全和as2的loadvars类一样,

    只不过最后还是需要把 URLVariables对象赋值给URLRequest对象的data属性。

    [转]AJAX基础教程

    AJAX基础教程

      这篇文章将带您浏览整个AJAX的基本概貌,并展示两个简单的例子让您轻松上路.

      什么是 AJAX 
      AJAX (异步 JavaScript 和 XML) 是个新产生的术语,专为描述JavaScript的两项强大性能.这两项性能在多年来一直被网络开发者所忽略,直到最近Gmail, Google suggest和google Maps的横空出世才使人们开始意识到其重要性.

      这两项被忽视的性能是:
      无需重新装载整个页面便能向服务器发送请求.
      对XML文档的解析和处理.

    步骤 1 – “请!” — 如何发送一个HTTP请求

      为了用JavaScript向服务器发送一个HTTP请求, 需要一个具备这种功能的类实例. 这样的类首先由Internet Explorer以ActiveX对象引入, 被称为XMLHTTP. 后来Mozilla, Safari 和其他浏览器纷纷仿效, 提供了XMLHttpRequest类,它支持微软的ActiveX对象所提供的方法和属性.

      因此, 为了创建一个跨浏览器的这样的类实例(对象), 可以应用如下代码:

    if (window.XMLHttpRequest) { // Mozilla, Safari, …
    http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
    http_request = new ActiveXObject(“Microsoft.XMLHTTP”);
    }

      (上例对代码做了一定简化,这是为了解释如何创建XMLHTTP类实例. 实际的代码实例可参阅本篇步骤3.)

      如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作. 为了解决这个问题, 如果服务器响应的header不是text/xml,可以调用其它方法修改该header.

    http_request = new XMLHttpRequest();
    http_request.overrideMimeType(‘text/xml’);

      接下来要决定当收到服务器的响应后,需要做什么.这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应.可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示:

    http_request.onreadystatechange = nameOfTheFunction;

      注意:在函数名后没有括号,也无需传递参数.另外还有一种方法,可以在扉页(fly)中定义函数及其对响应要采取的行为,如下所示:

    http_request.onreadystatechange = function(){
    // do the thing
    };

      在定义了如何处理响应后,就要发送请求了.可以调用HTTP请求类的open()和send()方法, 如下所示:

    http_request.open(‘GET’, ‘http://www.example.org/some.file’, true);
    http_request.send(null);

      open()的第一个参数是HTTP请求方式 – GET, POST, HEAD 或任何服务器所支持的您想调用的方式. 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求.有关HTTP请求方法的详细信息可参考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs
      第二个参数是请求页面的URL.由于自身安全特性的限制,该页面不能为第三方域名的页面.同时一定要保证在所有的页面中都使用准确的域名,否则调用open()会得到”permission denied”的错误提示.一个常见的错误是访问站点时使用domain.tld,而当请求页面时,却使用www.domain.tld.
      第三个参数设置请求是否为异步模式.如果是TRUE, JavaScript函数将继续执行,而不等待服务器响应.这就是”AJAX”中的”A”.
      如果第一个参数是”POST”,send()方法的参数可以是任何想送给服务器的数据. 这时数据要以字符串的形式送给服务器,如下所示:

    name=value&anothername=othervalue&so=on

    步骤 2 – “收到!” — 处理服务器的响应

      当发送请求时,要提供指定处理响应的JavaScript函数名.

    http_request.onreadystatechange = nameOfTheFunction;

      我们来看看这个函数的功能是什么.首先函数会检查请求的状态.如果状态值是4,就意味着一个完整的服务器响应已经收到了,您将可以处理该响应.

    if (http_request.readyState == 4) {
    // everything is good, the response is received
    } else {
    // still not ready
    }

      readyState的取值如下:
      0 (未初始化)
      1 (正在装载)
      2 (装载完毕)
      3 (交互中)
      4 (完成)

      接着,函数会检查HTTP服务器响应的状态值. 完整的状态取值可参见 W3C site. 我们着重看值为200 OK的响应.

    if (http_request.status == 200) {
    // perfect!
    } else {
    // there was a problem with the request,
    // for example the response may be a 404 (Not Found)
    // or 500 (Internal Server Error) response codes
    }

      在检查完请求的状态值和响应的HTTP状态值后, 您就可以处理从服务器得到的数据了.有两种方式可以得到这些数据:

    http_request.responseText – 以文本字符串的方式返回服务器的响应
    http_request.responseXML – 以XMLDocument对象方式返回响应.处理XMLDocument对象可以用JavaScript DOM函数

    步骤 3 – “万事俱备!” – 简单实例

      我们现在将整个过程完整地做一次,发送一个简单的HTTP请求. 我们用JavaScript请求一个HTML文件, test.html, 文件的文本内容为”I’m a test.”.然后我们”alert()”test.html文件的内容.

    <script type=”text/javascript” language=”javascript”>
    var http_request = false;
    function makeRequest(url) {

    http_request = false;

    if (window.XMLHttpRequest) { // Mozilla, Safari,…
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
    http_request.overrideMimeType(‘text/xml’);
    }
    } else if (window.ActiveXObject) { // IE
    try {
    http_request = new ActiveXObject(“Msxml2.XMLHTTP”);
    } catch (e) {
    try {
    http_request = new ActiveXObject(“Microsoft.XMLHTTP”);
    } catch (e) {}
    }
    }

    if (!http_request) {
    alert(‘Giving up 🙁 Cannot create an XMLHTTP instance’);
    return false;
    }
    http_request.onreadystatechange = alertContents;
    http_request.open(‘GET’, url, true);
    http_request.send(null);

    }

    function alertContents() {

    if (http_request.readyState == 4) {
    if (http_request.status == 200) {
    alert(http_request.responseText);
    } else {
    alert(‘There was a problem with the request.’);
    }
    }

    }
    </script>
    <span
    style=”cursor: pointer; text-decoration: underline”
    onclick=”makeRequest(‘test.html’)”>
    Make a request
    </span>

      本例中:
      用户点击浏览器上的”请求”链接;
      接着函数makeRequest()将被调用.其参数 – HTML文件test.html在同一目录下;
      这样就发起了一个请求.onreadystatechange的执行结果会被传送给alertContents();
      alertContents()将检查服务器的响应是否成功地收到,如果是,就会”alert()”test.html文件的内容.

    步骤 4 – “X-文档” — 处理XML响应

      在前面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的reponseText属性.该属性包含了test.html文件的内容.现在我们来试试responseXML属性.

      首先,我们新建一个有效的XML文件,后面我们将使用这个文件.该文件(test.xml)源代码如下所示:

    < xml version=”1.0″  >
    <root>
    I’m a test.
    </root>

      在该脚本中,我们只需修改请求部分:


    onclick=”makeRequest(‘test.xml’)”>

      接着,在alertContents()中,我们将alert()的代码alert(http_request.responseText);换成:

      var xmldoc = http_request.responseXML;
      var root_node = xmldoc.getElementsByTagName(‘root’).item(0);
      alert(root_node.firstChild.data);

      这里,我们使用了responseXML提供的XMLDocument对象并用DOM方法获取存于XML文件中的内容.

    from: http://tod.collegesoft.com.cn/Forums/ShowPost.aspx PostID=383

    javascript动态操作表单

    function initAjax(){
    	var ajax = false;
    	try{
    		ajax = new ActiveXObject("Msxml2.XMLHTTP");
    	}catch(e){
    		try{
    			ajax = new ActiveXObject("Microsoft.XMLHTTP");
    		}catch(E){
    			ajax = false;
    		}
    	}
    	if(!ajax && typeof XMLHttpRequest != 'undefined'){
    		ajax = new XMLHttpRequest();
    	}
    	return ajax;
    }
    
    function requireHandler(filename,mark,id){
    	//filename=_CCTVCLI_JiaGou_CCTVCLI-C/cctvclient.xml
    	var version = "";
    	//var url = 'http://127.0.0.1/ajax/dispatchRequire filename=_CCTVCLI_JiaGou_CCTVCLI-C/cctvclient.xml&mark=all&version=U2000V1R2C01&id=1';
    	var url = "http://127.0.0.1/ajax/dispatchRequire";
    	if(mark=="version"){
    		if(document.getElementById("rdoAll").checked){
    			return ;
    		}
    		version = document.getElementById("selVersion").value;
    	}
    	url = url+" filename="+filename+"&mark="+mark+"&version="+version+"&id="+id;
    	var ajax = initAjax();
    	ajax.open("GET",url,"true");
    	ajax.onreadystatechange = function(){
    		if(ajax.readyState==4 && ajax.status==200){
    			requireResponseHandler(decodeURIComponent(ajax.responseText),filename);
    		}
    	}
    	ajax.send(null);
    }
    
    function requireResponseHandler(data,filename){
    	var json = eval("("+data+")");
    	if(json.data=='empty'){
    		//清除表单
    		deleteRequireRows();
    		var elements = document.getElementsByTagName("input");
    		for(var v in elements){
    			var elementid = elements[v].id;
    			if(typeof(elementid)=='undefined'){
    				continue;
    			}else{
    				if(elementid.substring(0,elementid.indexOf("_"))=="dReqire"){
    					elements[v].value="";
    				}
    			}
    		}
    	}else{
    		if(typeof(json.ListTable)!='undefined'){
    			deleteRequireRows();
    			var tab = document.getElementById("requireTable");
    			var tableArray = json.ListTable;
    			for(var v=tableArray.length-1;v>=0;v--){
    				var line = tableArray[v];
    				var row = tab.insertRow(1);
    				var DRequireTypeCell = row.insertCell();
    				DRequireTypeCell.innerHTML = line.DRequireType;
    				var DRequireObjIDCell = row.insertCell();
    				DRequireObjIDCell.innerHTML = line.DRequireObjID;
    				var DRequireDescCell = row.insertCell();
    				DRequireDescCell.innerHTML = line.DRequireDesc;
    				var DRequireFieldDescCell = row.insertCell();
    				DRequireFieldDescCell.innerHTML = line.DRequireFieldDesc;
    				var DrNameCell = row.insertCell();
    				DrNameCell.innerHTML = line.DrName;
    				var CreateAuthorCell = row.insertCell();
    				CreateAuthorCell.innerHTML = line.CreateAuthor;
    				row.onclick = new Function("requireHandler('"+filename+"','line','"+line.ID+"')");
    			}
    		}
    		document.getElementById("dReqire_ModuleName").value=json.ModuleName;
    		document.getElementById("dReqire_CreateAuthor").value=json.CreateAuthor;
    		document.getElementById("dReqire_ModifyAuthor").value=json.ModifyAuthor;
    		document.getElementById("dReqire_Version").value=json.Version;
    		document.getElementById("dReqire_ModifyTime").value=json.ModifyTime;
    		document.getElementById("dReqire_OrName").value=json.OrName;
    		document.getElementById("dReqire_DrName").value=json.DrName;
    		document.getElementById("dReqire_MrName").value=json.MrName;
    		document.getElementById("dReqire_MrId").value=json.MrId;
    		document.getElementById("dReqire_MrDesc").value=json.MrDesc;
    		document.getElementById("dReqire_MrFieldDesc").value=json.MrFieldDesc;
    	}
    }
    
    function deleteRequireRows(){
    	var tab = document.getElementById("requireTable");
    	var lines = tab.rows;
    	var length = lines.length;
    	for(var i=1;i<length;i++){
    		tab.deleteRow(1);
    	}
    }