现在有需求需要用java的URLConnection发送请求并传递参数,就在网上找了代码来研究。代码如下:
[color=green]import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
/**
@version 1.0, 2007-7-3
*/
public class HttpRequestProxy {
/**
/**
/**
private static Logger logger = Logger.getLogger(HttpRequestProxy.class);
/**
@return HTTP响应[xiang ying]的字符[zi fu]串[zi fu chuan]
*/
public static String doGet(String reqUrl, Map parameters,
String recvEncoding) {
HttpURLConnection url_con = null;
String responseContent = null;
try {
StringBuffer params = new StringBuffer();
for (Iterator iter = parameters.entrySet().iterator(); iter
.hasNext();) {
Entry element = (Entry) iter.next();
params.append(element.getKey().toString());
params.append("=");
params.append(URLEncoder.encode(element.getValue().toString(),
HttpRequestProxy.requestEncoding));
params.append("&");
}
if (params.length() > 0) {
params = params.deleteCharAt(params.length() - 1);
}
URL url = new URL(reqUrl);
url_con = (HttpURLConnection) url.openConnection();
url_con.setRequestMethod("GET");
System.setProperty("sun.net.client.defaultConnectTimeout", String
.valueOf(HttpRequestProxy.connectTimeOut));// (单位[dan
// wei]:毫秒)jdk1.4换成这个,连接[lian
// jie]超时[chao
// shi]
System.setProperty("sun.net.client.defaultReadTimeout", String
.valueOf(HttpRequestProxy.readTimeOut)); // (单位[dan
// wei]:毫秒)jdk1.4换成这个,读操作超时[chao
// shi]
// url_con.setConnectTimeout(5000);//(单位[dan wei]:毫秒)jdk
// 1.5换成这个,连接[lian jie]超时[chao shi]
// url_con.setReadTimeout(5000);//(单位[dan wei]:毫秒)jdk
// 1.5换成这个,读操作超时[chao shi]
url_con.setDoOutput(true);
byte[] b = params.toString().getBytes();
url_con.getOutputStream().write(b, 0, b.length);
url_con.getOutputStream().flush();
url_con.getOutputStream().close();
InputStream in = url_con.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(in,
recvEncoding));
String tempLine = rd.readLine();
StringBuffer temp = new StringBuffer();
String crlf = System.getProperty("line.separator");
while (tempLine != null) {
temp.append(tempLine);
temp.append(crlf);
tempLine = rd.readLine();
}
responseContent = temp.toString();
rd.close();
in.close();
} catch (IOException e) {
logger.error("网络[wang luo]故障[gu zhang]", e);
} finally {
if (url_con != null) {
url_con.disconnect();
}
}
return responseContent;
}
/**
@return HTTP响应[xiang ying]的字符[zi fu]串[zi fu chuan]
*/
public static String doGet(String reqUrl, String recvEncoding) {
HttpURLConnection url_con = null;
String responseContent = null;
try {
StringBuffer params = new StringBuffer();
String queryUrl = reqUrl;
int paramIndex = reqUrl.indexOf("?");
if (paramIndex > 0) {
queryUrl = reqUrl.substring(0, paramIndex);
String parameters = reqUrl.substring(paramIndex + 1, reqUrl
.length());
String[] paramArray = parameters.split("&");
for (int i = 0; i < paramArray.length; i++) {
String string = paramArray[i];
int index = string.indexOf("=");
if (index > 0) {
String parameter = string.substring(0, index);
String value = string.substring(index + 1, string
.length());
params.append(parameter);
params.append("=");
params.append(URLEncoder.encode(value,
HttpRequestProxy.requestEncoding));
params.append("&");
}
}
params = params.deleteCharAt(params.length() - 1);
}
URL url = new URL(queryUrl);
url_con = (HttpURLConnection) url.openConnection();
url_con.setRequestMethod("GET");
System.setProperty("sun.net.client.defaultConnectTimeout", String
.valueOf(HttpRequestProxy.connectTimeOut));// (单位[dan
// wei]:毫秒)jdk1.4换成这个,连接[lian
// jie]超时[chao
// shi]
System.setProperty("sun.net.client.defaultReadTimeout", String
.valueOf(HttpRequestProxy.readTimeOut)); // (单位[dan
// wei]:毫秒)jdk1.4换成这个,读操作超时[chao
// shi]
// url_con.setConnectTimeout(5000);//(单位[dan wei]:毫秒)jdk
// 1.5换成这个,连接[lian jie]超时[chao shi]
// url_con.setReadTimeout(5000);//(单位[dan wei]:毫秒)jdk
// 1.5换成这个,读操作超时[chao shi]
url_con.setDoOutput(true);
byte[] b = params.toString().getBytes();
url_con.getOutputStream().write(b, 0, b.length);
url_con.getOutputStream().flush();
url_con.getOutputStream().close();
InputStream in = url_con.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(in,
recvEncoding));
String tempLine = rd.readLine();
StringBuffer temp = new StringBuffer();
String crlf = System.getProperty("line.separator");
while (tempLine != null) {
temp.append(tempLine);
temp.append(crlf);
tempLine = rd.readLine();
}
responseContent = temp.toString();
rd.close();
in.close();
} catch (IOException e) {
logger.error("网络[wang luo]故障[gu zhang]", e);
} finally {
if (url_con != null) {
url_con.disconnect();
}
}
return responseContent;
}
/**
@return HTTP响应[xiang ying]的字符[zi fu]串[zi fu chuan]
*/
public static String doPost(String reqUrl, Map parameters,
String recvEncoding) {
HttpURLConnection url_con = null;
String responseContent = null;
try {
StringBuffer params = new StringBuffer();
for (Iterator iter = parameters.entrySet().iterator(); iter
.hasNext();) {
Entry element = (Entry) iter.next();
params.append(element.getKey().toString());
params.append("=");
params.append(URLEncoder.encode(element.getValue().toString(),
HttpRequestProxy.requestEncoding));
params.append("&");
}
if (params.length() > 0) {
params = params.deleteCharAt(params.length() - 1);
}
URL url = new URL(reqUrl);
url_con = (HttpURLConnection) url.openConnection();
url_con.setRequestMethod("POST");
System.setProperty("sun.net.client.defaultConnectTimeout", String
.valueOf(HttpRequestProxy.connectTimeOut));// (单位[dan
// wei]:毫秒)jdk1.4换成这个,连接[lian
// jie]超时[chao
// shi]
System.setProperty("sun.net.client.defaultReadTimeout", String
.valueOf(HttpRequestProxy.readTimeOut)); // (单位[dan
// wei]:毫秒)jdk1.4换成这个,读操作超时[chao
// shi]
// url_con.setConnectTimeout(5000);//(单位[dan wei]:毫秒)jdk
// 1.5换成这个,连接[lian jie]超时[chao shi]
// url_con.setReadTimeout(5000);//(单位[dan wei]:毫秒)jdk
// 1.5换成这个,读操作超时[chao shi]
url_con.setDoOutput(true);
byte[] b = params.toString().getBytes();
url_con.getOutputStream().write(b, 0, b.length);
url_con.getOutputStream().flush();
url_con.getOutputStream().close();
InputStream in = url_con.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(in,
recvEncoding));
String tempLine = rd.readLine();
StringBuffer tempStr = new StringBuffer();
String crlf = System.getProperty("line.separator");
while (tempLine != null) {
tempStr.append(tempLine);
tempStr.append(crlf);
tempLine = rd.readLine();
}
responseContent = tempStr.toString();
rd.close();
in.close();
} catch (IOException e) {
logger.error("网络[wang luo]故障[gu zhang]", e);
} finally {
if (url_con != null) {
url_con.disconnect();
}
}
return responseContent;
}
/**
/**
/**
/**
/**
/**
public static void main(String[] args) {
Map map = new HashMap();
map.put("actionType", "1");
map.put("issueId", "33");
String temp = HttpRequestProxy.doGet(
"http://localhost/TransData", map, "GBK");
System.out.println("返回的消息[xiao xi]是:" + temp);
}
}[/color]
最后mian方法中这段
String temp = HttpRequestProxy.doGet("http://localhost/TransData", map, "GBK");
里面的URL是我另外新建的一个web工程,名为TransData。在TransData工程中的index.jsp页面我这样写:
[color=green]<%
String p1 = request.getParameter("actionType");
String p2 = request.getParameter("issueId");
System.out.println("p1:"+p1);
System.out.println("p2:"+p2);
%>[/color]
但是发现我拿不到参数。
就把提交的URL改为提交到servlet:
String temp = HttpRequestProxy.doGet("http://localhost/TransData/a.do", map, "GBK");
在servlet的doPost方法中这样写:
[color=green] String p1 = req.getParameter("actionType");
String p2 = req.getParameter("issueId");
System.out.println(p1);
System.out.println(p2);[/color]
这样打印p1,p2发现可以拿到值。这是为什么呢,为什么在jsp中拿不到参数,在servlet中却可以拿到?
可能http://localhost/TransData到index页面中出现是forward跳转导致参数丢失吧