`
yifeng
  • 浏览: 51559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AJAX基础与实践(五)

    博客分类:
  • Ajax
阅读更多
 

发送请求参数

Ø 目前我们已经讲了

1、 使用Ajax技术向服务器发送请求

2、 也知道了可以采用多种方法解析服务器的响应。

Ø 只缺少一个内容,就是未将任何数据作为请求的一部分发送给服务器。

GET方法发送请求参数

Ø GET方法:作为名/值对放在请求URL 中传递。

      * 资源URL 的问号后面就是名/值对。

      * 名/值对用 name=value 的形式,

       *  用与号(&)分隔。

Ø 例如:

http://localhost:8080/projectName?name=yifeng&password=hello

POST 方法发送请求参数

Ø POST 方法:将参数串放在请求体中发送。

* 参数编码为名/值对,形式为name=value

* 用与号(&)分隔。

使用GETPOST的建议

Ø 获取数据时应当使用GET 方法。

    * 数据处理不改变数据模型的状态。

Ø 存储、更新数据,使用POST 方法。

    * 操作改变了数据模型的状态。

Ø 特点。

* GET 请求的参数编码到请求URL 中,可以为该URL 建立书签。(不过,如果是异步请求就没有什么用。)

* GET 请求发送的数据量通常是固定的,而POST 方法可以发送任意量的数据。

DEMO AJAX以名/值对发送请求参数

Ø 使用GET请求和POST请求,创建查询字符串技术是一样的。

Ø 唯一的区别是,GET发送请求时,查询字符串追加到请求URL中,

Ø POST方法时,在XHR对象的send()方法时发送查询串。

Ø DEMO

getAndPostExample.html文件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

        "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

    <title>Dynamically Editing Page Content</title>

    <script type="text/javascript" language="javascript">

        var xmlHttp;

        function createXMLHttpRequest() {

            if (window.ActiveXObject) {

                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

            } else if (window.XMLHttpRequest) {

                xmlHttp = new XMLHttpRequest();

            }

        }

        function createQueryString() {

            var firstName = document.getElementById("firstName").value;

            var middleName = document.getElementById("middleName").value;

            var birthday = document.getElementById("birthday").value;

            var queryString = "firstName=" + firstName + "&middleName=" + middleName + "&birthday=" + birthday;///值对

            return queryString;

        }

        function doRequestUsingGET() {

            createXMLHttpRequest();

            var queryString = "GetAndPostExample?";

            queryString = queryString + createQueryString() + "&timeStamp=" + new Date().getTime();

            xmlHttp.onreadystatechange = handleStateChange;

            xmlHttp.open("GET", queryString, true);

            xmlHttp.send(null);

        }

        function doRequestUsingPOST() {

            createXMLHttpRequest();

            var url = "GetAndPostExample?timeStamp=" + new Date().getTime();

            //相同方法生成名/值对

            var queryString = createQueryString();

            xmlHttp.open("POST", url, true);

            xmlHttp.onreadystatechange = handleStateChange;

            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            xmlHttp.send(queryString);

        }

        function handleStateChange() {

            if (xmlHttp.readyState == 4) {

                if (xmlHttp.status == 200) {

                    parseResults();

                }

            }

        }

        function parseResults() {

            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>Entery your first name, middle name, and birthday:</h1>

<table>

    <tbody>

        <tr>

            <td>First name:</td>

            <td><input type="text" id="firstName"/></td>

        </tr>

        <tr>

            <td>Middle name:</td>

            <td><input type="text" id="middleName"></td>

        </tr>

        <tr>

            <td>Birthday:</td>

            <td><input type="text" id="birthday"/></td>

        </tr>

    </tbody>

</table>

<form action="#">

    <input type="button" value="Send parameters using GET" onclick="doRequestUsingGET();"/>

    <br/><br/>

    <input type="button" value="Send parameters using POST" onclick="doRequestUsingPOST();"/>

</form>

<br/>

<h2>Server Response:</h2>

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

</body>

</html>

GetAndPostExample.java文件

package org.yifeng.webapp.servlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.ServletException;

import java.io.IOException;

import java.io.PrintWriter;

/**

 * Copyright:       晟软科技

 * WebSit:          http://www.shengruan.com

 * Author:          忆风

 * QQ:              583305005

 * MSN:             YiFengs@msn.com

 * Email:           zhdqCN@gmail.com

 * CreationTime:    2008-8-25 22:44:44

 * Description:

 */

public class GetAndPostExample extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/xml");

        String firstName = request.getParameter("firstName");

        String middleName = request.getParameter("middleName");

        String birthday = request.getParameter("birthday");

        StringBuilder responseText = new StringBuilder();

        responseText.append("Hello, ").append(firstName).append(" " + middleName)

                .append(". Your birthday is " + birthday + ".")

                .append("[Method: " + request.getMethod() + "]");

        PrintWriter out = response.getWriter();

        out.println(responseText);

        out.flush();

        out.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request, response);

    }

}

Web.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

                    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

           version="2.5">

    <servlet>

        <servlet-name>GetAndPostExample</servlet-name>

        <servlet-class>org.yifeng.webapp.servlet.GetAndPostExample</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>GetAndPostExample</servlet-name>

        <url-pattern>/GetAndPostExample</url-pattern>

    </servlet-mapping>

    <welcome-file-list>

        <welcome-file>getAndPostExample.html</welcome-file>

    </welcome-file-list>

</web-app>

如果以点击“Send parameters using GET”按钮,如下图:

如果以点击“Send parameters using POST”按钮,如下图:

也许你会疑问,为什么要在URL后面追加时间呢?

有时浏览器会把多个XMLHttpRequest 请求的结果缓存在同一个URL.

如果对每个请求的响应不同,这就会带来不好的结果.

把当前时间戳追加到 URL的最后,就能确保URL 的唯一性,从而避免浏览器缓存结果.

* IE有这种缓存问题,但是Firefox没有。你可以去试试,哈哈。

AJAX XML 发送请求数据

Ø 只是使用一个包含名/值对的简单查询串,这可能不够健壮,

Ø 不足以向服务器传递大量复杂的模型变化.

Ø 可以应用XML

Ø 如何向服务器发送XML ?

Ø 可以把XML 作为请求体的一部分发送到服务器,

Ø 这与POST 请求中将查询串作为请求体的一部分进行发送异曲同工.

Ø 服务器可以从请求体读到XM L,并加以处理。

Ø DEMO

Ø postingXML.html

DEMO AJAX XML 发送请求数据

Ø 撰写“postingXML.html”文件,如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

        "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

    <title>Sending and 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();

            }

        }

        /**

         * 生成XML

         */

        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) {

                if (xmlHttp.status == 200) {

                    parseResults();

                }

            }

        }

        function parseResults() {

            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 org.yifeng.webapp.servlet;

import org.w3c.dom.Document;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.ServletException;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import java.io.IOException;

import java.io.BufferedReader;

import java.io.ByteArrayInputStream;

/**

 * Copyright:       晟软科技

 * WebSit:         http://www.shengruan.com

 * Author:          忆风

 * QQ:              583305005

 * MSN:             YiFengs@msn.com

 * Email:           zhdqCN@gmail.com

 * CreationTime:    2008-8-25 23:30:41

 * Description:

 */

public class PostingXMLExample extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String xml = readXMLFromRequestBody(request);//获得XML字符串

        Document xmlDoc = null;

        try {

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

        } catch (SAXException e) {

            System.out.println("SAXException: " + e);

        } catch (ParserConfigurationException e) {

            System.out.println("ParserConfigurationException: " + e);

        }

        /**

         * JavaJavaScript均有W3C DOM的实现,比如getElementByTagNamegetNodeValue方法

         */

        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) {

        StringBuilder xml = new StringBuilder();

        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();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request, response);

    }

}

Ø 运行,显示如下:





作者:周大庆(zhoudaqing)
网址:http://www.blogjava.net/yifeng
>>>转载请注明出处!<<<

分享到:
评论

相关推荐

    ajax基础与实践教程(含php json实例)

    ajax基础与实践教程,含php json实例

    AJAX的综合应用,AJAX基础与实践

    AJAX基础与实践,简单实现一个在线聊天室

    Ajax基础与实践教程(含源码)

    本教程利用json构建Ajax应用,ppt格式。

    ajax框架与实践

    涵盖Web应用的发展,Ajax基础,Web通讯,XMLHttpRequest对象详解,同时详细讲解和推荐了Ajax开发工具箱,例如JSDoc,Firefox拓展,DOMInspector,JSLint等等,以及JsUnit测试等。同时为了提升前端技术,第八章详细...

    Ajax模式与最佳实践(英文清晰版)

    《Ajax模式与最佳实践》探索了将Ajax和REST组合为单一解决方案的动态Web应用。REST的一个主要的优点是,像Ajax一样,它能够与当今现存的技术配合使用。已经有数以百万计的客户端为支持Ajax应用做好了准备,同时,也...

    ajax入门基础(实践)

    Ajax不是一种技术,而是多种技术的组合: 使用XHTML和CSS来呈现数据 使用DOM实现动态显示和交互 使用XML和XSLT实现数据交换与操作 使用XMLHttpRequest实现异步数据的发送与接收 使用JavaScript将XHTML、DOM 、XML和...

    完全手册ASP.NET AJAX实用开发详解 源码

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    ajax实践相关资料

    ajax相关的技术,基础的应用,详细的代码

    JSP+Ajax网站开发典型实例源码(1~8、10章)

    本书主要内容包括JSP基础实例、JSP数据库实例、JavaBean技术、Servlet技术、Ajax基本技术、Ajax高级技术、Ajax数据库操作、Ajax时尚技术、Ajax常用框架和实现OA系统。本书实例来源于作者多年工作实践,基本囊括了...

    《JSP+Ajax网站开发典型实例》(上)

    本书主要内容包括JSP基础实例、JSP数据库实例、JavaBean技术、Servlet技术、Ajax基本技术、Ajax高级技术、Ajax数据库操作、Ajax时尚技术、Ajax常用框架和实现OA系统。本书实例来源于作者多年工作实践,基本囊括了...

    ajax入门教程,包含ppt

    ajax入门教程,包含pptajax基础与实践教程

    Ajax入门与提高(ppt)

    Ajax入门与提高(ppt)·····从基础的学习到实践!全面认识ajax

    完全手册:ASP.net Ajax电子教程

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    完全手册:ASP.net.Ajax

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    完全手册:ASP.NET AJAX实用开发详解 part3

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    Ajax高级程序设计.pdf

    “本书很好地兼顾了理论和实践,Web程序员均将从中获益匪浅。”  ——Jason Salas,微软MVP Ajax结合了THTML、CSS和JavaScript等技术。使Web开发人员能够创建更复杂、响应更及时的用户 界面。为用户带来更加丰富的...

    完全手册ASP、NET AJAX实用开发详解光盘

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    完全手册:ASP.net Ajax电子教程-part1

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    完全手册:ASP.net Ajax电子教程-part2

    本书共分为15章,从初识ASP.NET AJAX开始,首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、...

    jsp应用开发与实践配书源码

    内容包括Web应用开发概述、客户端应用技术基础、搭建JSP网站开发环境、Java语言基础、JSP基本语法、JSP的内置对象、JavaBean技术、Servlet技术、数据库应用开发、EL表达式、JSTL核心标签库、JSP操作XML、JSP与Ajax、...

Global site tag (gtag.js) - Google Analytics