<p>这里所说的"模拟" 是指 : 在java中,使用类似 XMLHttpRequest 的方式来实现"同步/异步的HttpRequest"功能.<br> <br> <br> 用 java 实现一个HTTPRequest 并不难. 通过 java.net 包内提供的东东 可以很容易的实现.<br> 而且我们还有 apache 的 HttpClient 一类的组件可供我们使用 .<br> 实现 异步的HTTPRequest 当然同样简单 , 再使用一个 Thread就ok了.<br> 但是 使用上面的 方法 , 实现的往往只是一个 "异步的HTTPRequest"的功能而已,<br> 使用方式上 还是 很 java的.<br> <br> 我在这里所要介绍的 则是使用很"ajax"的方式来实现"异步的HTTPRequest"的功能.<br> 这个 AjaxHttpRequest 类 模仿了 XMLHttpRequest 的实现,<br> 从属性 方法 使用方式上 都尽量的和 XMLHttpRequest 接近.<br> <br> 利用 AjaxHttpRequest 类 可以更自然的实现 ajax请求的服务端代理 等工作.<br> <br> =============================<br> <br> <span style="color:blue">当然 本文的技术研究的价值 也许远远大于 实用的价值. </span>:P .<br> <br> <br> 我先来举一个例子 , AjaxHttpRequest 类的代码&注释 在后面附上 附件中也会提供该java文件.<br> <br> 大家注意看代码注释 ,我要说的东西更多的都在注释里呢.<br> <br> 一个 用 java 来调用 <span style="color:red">google 翻译服务的例子</span> (利用了后面附上的 AjaxHttpRequest 类) :</p>
<pre class="blockcode"><code class="language-java">package com.fins.gt.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.logging.Level;
/**
* AjaxHttpRequest ,用java 模拟 浏览器的 XMLHttpRequest 对象.
* 目的是 用 操作浏览器中的XHR对象的 方式来处理java端的 http请求.
*
* @author fins
*
* 本类的实现借鉴了 cobra 组件的 org.lobobrowser.html.test.SimpleHttpRequest 类.
* 可以看作是对 SimpleHttpRequest 类的一个完善和补充.
*
* cobra 组件是一个 Java HTML Renderer & Parser,
* 官方网站 : http://lobobrowser.org/cobra.jsp
*/
public class AjaxHttpRequest {
// 对应 XMLHttpRequest 的5种状态.
public static final int STATE_UNINITIALIZED = 0;
public static final int STATE_LOADING = 1;
public static final int STATE_LOADED = 2;
public static final int STATE_INTERACTIVE = 3;
public static final int STATE_COMPLETE = 4;
// 默认的 userAgent
public static final String DEFAULT_USERAGENT = "Mozilla/4.0 (compatible; MSIE 6.0;) JavaAjax/1.0";
// 默认的 编码
public static final String DEFAULT_AJAX_CHARSET = "UTF-8";
public static final String DEFAULT_HTTP_CHARSET = "ISO-8859-1";
// 默认的 HTTP method
public static final String DEFAULT_REQUEST_METHOD = "POST";
private int readyState;
private int status;
private String statusText;
private String responseHeaders;
private byte[] responseBytes;
private Map responseHeadersMap;
private Map requestHeadersMap;
private ReadyStateChangeListener readyStateChangeListener;
private boolean async;
private boolean sent;
private URLConnection connection;
private String userAgent = DEFAULT_USERAGENT;
private String postCharset = DEFAULT_AJAX_CHARSET;
private Proxy proxy;
private URL requestURL;
protected String requestMethod;
protected String requestUserName;
protected String requestPassword;
/
/
/**
* 构造方法. 自动添加 XMLHttpRequest 的一些缺省头信息.
* 如果不需要这些头信息,可在创建 AjaxHttpRequest 实例后,
* 通过 setRequestHeader/removeRequestHeader/removeAllRequestHeaders 方法
* 进行修改或移除.
*/
public AjaxHttpRequest() {
requestHeadersMap = new LinkedHashMap();
setRequestHeader("X-Requested-With", "XMLHttpRequest");
setRequestHeader("Accept",
"text/javascript, text/html, application/xml, application/json, text/xml, */*");
}
/**
* 类似 XMLHttpRequest 中的 readyState 属性.
*/
public synchronized int getReadyState() {
return this.readyState;
}
/**
* 类似 XMLHttpRequest 中的 status 属性.
*/
public synchronized int getStatus() {
return this.status;
}
/**
* 类似 XMLHttpRequest 中的 statusText 属性.
*/
public synchronized String getStatusText() {
return this.statusText;
}
/**
* 类似 XMLHttpRequest 中的 setRequestHeader 方法.
*/
public void setRequestHeader(String key, String value) {
this.requestHeadersMap.put(key, value);
}
/**
* 类似 XMLHttpRequest 中的 open 方法.
*/
public void open(String method, String url, boolean async, String userName, String password)
throws IOException {
URL urlObj = createURL(null, url);
open(method, urlObj, async, userName, password);
}
/**
* 类似 XMLHttpRequest 中的 open 方法.
*/
public void open(final String method, final URL url, boolean async, |
|