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的惟一性,从而避免浏览器缓存结果。
本文作者:相关阅读:
SQL Server 2008案例之CareGroup 医疗组织
Rundll32.exe文件丢失的解决办法
JavaScript 点击页面上的按纽,弹出层,背景变灰
JavaScript 计算图片加载数量的代码
Windows Vista用最小镜像引导Linux系统
javascript类式继承新的尝试
XHTML 基础教程
Windows画图程序绘制像素小女孩头像
关于Linux系统终端提示符的设置方法
PHP编程常用技巧四则
DedeCms完美的FLASH幻灯代码
HTML5结构元素和HTML5页面的交互体验
Vista不能上网也不能Ping故障解决
详解Oracle数据库中DUAL表的使用