3.2 发送请求参数(二)


 代码清单3-8 向浏览器回显名、姓和生日

  package ajaxbook.chap3;
  import java.io.*;
  import java.net.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
  public class GetAndPostExample extends HttpServlet {
  protected void processRequest(HttpServletRequest request,
  HttpServletResponse response, String method)
  throws ServletException, IOException {
  //Set content type of the response to text/xml
  response.setContentType("text/xml");
  //Get the user's input
  String firstName = request.getParameter("firstName");
  String middleName = request.getParameter("middleName");
  String birthday = request.getParameter("birthday");
  //Create the response text
  String responseText = "Hello " + firstName + " " + middleName
  + ". Your birthday is " + birthday + "."
  + " [Method: " + method + "]";
  //Write the response back to the browser
  PrintWriter out = response.getWriter();
  out.println(responseText);
  //Close the writer
  out.close();
  }
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  //Process the request in method processRequest
  processRequest(request, response, "GET");
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  //Process the request in method processRequest
  processRequest(request, response, "POST");
  }
  }

下面先来分析服务器端代码。这个例子使用了Java servlet来处理请求,不过也可以使用任何其他服务器端技术,如PHP、CGI或.NET。Java servlet必须定义一个doGet方法和一个doPost方法,每个方法根据请求方法(GET或POST)来调用。在这个例子中,doGet和doPost都调用同样的方法processRequest来处理请求。

  processRequest方法先把响应的内容类型设置为text/xml,尽管在这个例子中并没有真正用到XML。通过使用getParameter方法从request对象获得3个输入字段。根据名、姓和生日,以及请求方法的类型,会建立一个简单的语句。这个语句将写至响应输出流,最后响应输出流关闭。

  浏览器端JavaScript与前面的例子同样是类似的,不过这里稍稍增加了几个技巧。这里有一个工具函数createQueryString负责将输入参数编码为查询串。createQueryString函数只是获取名、姓和生日的输入值,并将它们追加为名/值对,每个名/值对之间由与号(&)分隔。这个函数会返回查询串,以便GET和POST操作重用。

  点击Send Parameters Using GET(使用GET方法发送参数)按钮将调用doRequestUsingGET函数。这个函数与前面例子中的许多函数一样,先调用创建XMLHttpRequest对象实例的函数。接下来,对输入值编码,创建查询串。

  在这个例子中,请求端点是名为GetAndPostExample的servlet。在建立查询串时,要把createQueryString函数返回的查询串与请求端点连接,中间用问号分隔。

  JavaScript仍与前面看到的类似。XMLHttpRequest对象的onreadystatechange属性设置为要使用handleStateChange函数。open()方法指定这是一个GET请求,并指定了端点URL,在这里端点URL中包含有编码的参数。send()方法将请求发送给服务器,handleSta-

 teChange函数处理服务器响应。

  当请求成功完成时,handleStateChange函数将调用parseResults函数。parseResults函数获取div元素,其中包含服务器的响应,并把它

保存在局部变量responseDiv中。使用responseDiv的removeChild方法先将以前的服务器结果删除。最后,创建包含服务器响应的新文本节点,

并将这个文本节点追加到responseDiv。

  使用POST方法而不是GET方法基本上是一样的,只是请求参数发送给服务器的方式不同。应该记得,使用GET时,名/值对会追加到目标URL

。POST方法则把同样的查询串作为请求体的一部分发送。

  点击Send Parameters Using POST(使用POST方法发送参数)按钮将调用doRequest-

  UsingPOST函数。类似于doRequestUsingGET函数,它先创建XMLHttpRequest对象的一个实例,脚本再创建查询串,其中包含要发送给服务

器的参数。需要注意,查询串现在并不连接到目标URL。

  接下来调用XMLHttpRequest对象的open()方法,这一次指定请求方法是POST,另外指定了没有追加名/值对的“原”目标URL。

onreadystatechange属性设置为handleStateCh-

  ange函数,所以响应会以与GET方法中相同的方式得到处理。为了确保服务器知道请求体中有请求参数,需要调用setRequestHeader,将

Content-Type值设置为application/x- www-form-urlencoded。最后,调用send()方法,并把查询串作为参数传递给这个方法。

  点击两个按钮的结果是一样的。页面上会显示一个串,其中包括指定的名、姓和生日,另外还会显示所用请求方法的类型。

  为什么要把时间戳追加到目标URL?

  在某些情况下,有些浏览器会把多个XMLHttpRequest请求的结果缓存在同一个URL。如果对每个请求的响应不同,这就会带来不好的结果。

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

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3