当前位置: 代码迷 >> JavaScript >> JavaScript中XMLHttpRequest对象初始使用
  详细解决方案

JavaScript中XMLHttpRequest对象初始使用

热度:257   发布时间:2013-03-21 10:08:17.0
JavaScript中XMLHttpRequest对象初步使用

源:http://cuisuqiang.iteye.com/blog/1461306

评:

XMLHttpRequest 对象
XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。
尽管名为 XMLHttpRequest,它并不限于和 XML 文档一起使用:它可以接收任何形式的文本文档。
XMLHttpRequest 对象是名为 AJAX 的 Web 应用程序架构的一项关键功能。

浏览器支持
XMLHttpRequest 得到了所有现代浏览器较好的支持。唯一的浏览器依赖性涉及 XMLHttpRequest 对象的创建。在 IE 5 和 IE 6 中,必须使用特定于 IE 的 ActiveXObject() 构造函数。正如在 XMLHttpRequest 对象 这一节所介绍的。

W3C 标准化
XMLHttpRequest 对象还没有标准化,但是 W3C 已经开始了标准化的工作,本手册介绍的内容都是基于标准化的工作草案。
当前的 XMLHttpRequest 实现已经相当一致。但是和标准有细微的不同。例如,一个实现可能返回 null,而标准要求是空字符串,或者实现可能把 readyState 设置为 3 而不保证所有的响应头部都可用。

?

我们建立一个Web工程,建立一个Servlet。用于接收请求,该请求接收参数,返回一个字符串:

Java代码 ?收藏代码
  1. package?com;??
  2. import?java.io.*;??
  3. import?javax.servlet.*;??
  4. import?javax.servlet.http.*;??
  5. @SuppressWarnings("serial")??
  6. public?class?ServiceAjax?extends?HttpServlet?{??
  7. ????public?ServiceAjax()?{??
  8. ????????super();??
  9. ????}??
  10. ????public?void?destroy()?{??
  11. ????????super.destroy();??
  12. ????}??
  13. ????public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)??
  14. ????????????throws?ServletException,?IOException?{????????
  15. ????????request.setCharacterEncoding("UTF-8");??
  16. ????????response.setCharacterEncoding("UTF-8");??
  17. ????????String?name?=?request.getParameter("name");??
  18. ????????String?age?=?request.getParameter("age");??
  19. ????????System.out.println(name?+?"你好,你今年"?+?age?+?"岁了!");????
  20. ????????PrintWriter?out?=?response.getWriter();??
  21. ????????out.write(name?+?"你好,你今年"?+?age?+?"岁了!");??
  22. ????????out.flush();??
  23. ????????out.close();??
  24. ????}??
  25. ????public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)??
  26. ????????????throws?ServletException,?IOException?{??
  27. ????????doGet(request,?response);??
  28. ????}??
  29. ????public?void?init()?throws?ServletException?{??
  30. ????}??
  31. }??

?

别忘了在web.xml中配置:

Java代码 ?收藏代码
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <web-app?version="2.5"???
  3. ????xmlns="http://java.sun.com/xml/ns/javaee"???
  4. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  5. ????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???
  6. ????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  7. ??<servlet>??
  8. ????<servlet-name>ServiceAjax</servlet-name>??
  9. ????<servlet-class>com.ServiceAjax</servlet-class>??
  10. ??</servlet>??
  11. ??<servlet-mapping>??
  12. ????<servlet-name>ServiceAjax</servlet-name>??
  13. ????<url-pattern>/ServiceAjax</url-pattern>??
  14. ??</servlet-mapping>??
  15. ??<welcome-file-list>??
  16. ????<welcome-file>index.jsp</welcome-file>??
  17. ??</welcome-file-list>??
  18. </web-app>??

?

在index.jsp中写请求内容:

Java代码 ?收藏代码
  1. <%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??
  2. <%??
  3. String?path?=?request.getContextPath();??
  4. String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";??
  5. %>??
  6. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??
  7. <html>??
  8. ??<head>??
  9. ????<base?href="<%=basePath%>">??????
  10. ????<title>XMLHttpRequest对象学习</title>??
  11. ????<script?type="text/javascript"?language="javascript">??
  12. ????function?loadXMLDoc(){??
  13. ????????var?xmlhttp;??
  14. ????????if?(window.XMLHttpRequest)?{??
  15. ????????????//?code?for?IE7+,?Firefox,?Chrome,?Opera,?Safari??
  16. ????????????xmlhttp=new?XMLHttpRequest();??
  17. ????????}else?{??
  18. ????????????//?code?for?IE6,?IE5??
  19. ????????????xmlhttp=new?ActiveXObject("Microsoft.XMLHTTP");??
  20. ????????}??
  21. ????????/**?
  22. ????????当您使用?async=false?时,请不要编写?onreadystatechange?函数,把代码放到?send()?语句后面即可?
  23. ????????每当?readyState?改变时,就会触发?onreadystatechange?事件,readyState?属性存有?XMLHttpRequest?的状态信息?
  24. ????????readyState:0:?请求未初始化,1:?服务器连接已建立,2:?请求已接收,3:?请求处理中,4:?请求已完成,且响应已就绪?
  25. ????????status:200:?"OK",404:?未找到页面?
  26. ????????*/??
  27. ????????xmlhttp.onreadystatechange=function()?{??
  28. ????????????if?(xmlhttp.readyState==4?&&?xmlhttp.status==200)?{??
  29. ????????????????alert(xmlhttp.responseText);??
  30. ????????????}??
  31. ????????}??
  32. ????????/**??
  33. ????????规定请求的类型、URL?以及是否异步处理请求?
  34. ????????GET?和?POST:法使用缓存文件(更新服务器上的文件或数据库),向服务器发送大量数据(POST?没有数据量限制),?
  35. ????????发送包含未知字符的用户输入时,POST?比?GET?更稳定也更可靠?
  36. ????????*/??
  37. ????????var?url?=?"<%=basePath?%>ServiceAjax";??
  38. ????????xmlhttp.open("POST",url,true);??
  39. ????????//?向请求添加?HTTP?头,向请求添加?HTTP?头,value:?规定头的值。get时可不设置,但是send(null)??
  40. ????????xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");??
  41. ????????//?增加time随机参数,防止读取缓存??
  42. ????????xmlhttp.send("name=Bill&age=22&type=1&time="?+??+?Math.random());??
  43. ????}??
  44. ????</script>??
  45. ??</head>????
  46. ??<body>??
  47. ????<div?id="myDiv"></div>??
  48. ????<input?type="button"?name="bxml"?value="Read"?onclick="loadXMLDoc()"?/>??
  49. ??</body>??
  50. </html>??

?

除了IE5,6外,其他浏览器的创建方式是一致的。

对于POST请求,要定义其头消息:

Java代码 ?收藏代码
  1. xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");??

?

另外一定要注意的是ajax是有缓存的,为了防止读取缓存,最好在请求上增加一个时间戳参数Math.random(),这样浏览器会以为每次都是新的请求。

?

为了防止乱码,在请求的头消息中和后台的处理中,都要增加编码设置。

执行后后台会打印收到的参数,前台会提示返回的值。

  相关解决方案