一、urlconnection连接Servlet
1:> URL请求的类别:
分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
MyTask.java文件:
public class MyTask extends AsyncTask { private BaseAdapter adapter;
private List<User> userList;
private MainActivity activity;
public MyTask(MainActivity activity){
this.activity = activity;
}
private String errorMessage = "";
private String messageInfo = "";
private static final String URL_STR = "http://android2017.duapp.com/test1.jsp";
private String lastId = "123&1=1"; //1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务)
//2.绝对不能碰UI
@Override
protected Object doInBackground(Object... params) {
try {
URL url = new URL(URL_STR);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();//创建了一个连接对象
//对连接进行配置
conn.setDoInput(true);//输入
conn.setDoOutput(true);//输出
conn.setRequestMethod("POST");
//防止读取脏数据
conn.setUseCaches(false); //获取一个输出流
OutputStream os = conn.getOutputStream();
//可以上传文本数据,通過DataOutputStream写入数据输出流中
DataOutputStream dos = new DataOutputStream(os);
dos.writeBytes("lastId="+URLEncoder.encode(lastId, "UTF-8"));
//dos.writeBytes("lastId="+lastId);
dos.flush();//刷新,将数据发到缓冲区。
dos.close();
// getResponseCode获取URL服务端响应的状态码
if ( conn.getResponseCode() == 200){
//输入流
InputStream is = conn.getInputStream();
//reader(注意UTF-8读),InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。
如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//缓冲区,防止读死
BufferedReader br = new BufferedReader(isr);
String ReadOneline = null; //多行数据时,减少不断创建String对象
StringBuffer sb = new StringBuffer();
while ( (ReadOneline=br.readLine())!=null ){
sb.append(ReadOneline); }
br.close();
isr.close();
is.close();
conn.disconnect();
return sb.toString();
}
else{
errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")";
return "errorserver";
} } catch (Exception e) {
errorMessage = e.getMessage();
return "errorclient";
}
} //准备
@Override
protected void onPreExecute() {
Toast.makeText(activity, "开始执行...", Toast.LENGTH_SHORT).show(); } //做完后执行
@Override
protected void onPostExecute(Object result) {
String r = result.toString();
TextView tv = (TextView)activity.findViewById(R.id.textView1);
if ("errorclient".equals(r)){
if (errorMessage.indexOf("No add")!=-1){
tv.setText("网络不通");
}
else{
tv.setText("访问网络时其它异常:"+errorMessage);
} }else if("errorserver".equals(r)){
tv.setText(errorMessage);
}else{
tv.setText(r);
}
} }
2:> URLConnection的对象:
URL url = new URL(URL_STR);
//URLConnection rulConnection = url.openConnection();//创建了一个连接对象,获取URLConnection对象。
// 此处的urlConnection对象实际上是根据URL的
// 请求协议(此处是http)生成的URLConnection类
// 的子类HttpURLConnection,故此处最好将其转化
// 为HttpURLConnection类型的对象,以便用到
HttpURLConnection conn = (HttpURLConnection)url
3:> HttpURLConnection对象参数问题
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
// http正文内,因此需要设为true, 默认情况下是false;
httpUrlConnection.setDoOutput(true); // 设置是否从httpUrlConnection读入,默认情况下是true;
conn.setDoInput(true);//输入
conn.setDoOutput(true);//输出 // Post 请求不能使用缓存,防止读取脏数据
conn.setUseCaches(false); // 设定请求的方法为"POST",默认是GET
conn.setRequestMethod("POST"); // 连接,url.openConnection()至此的配置必须要在connect之前完成,
// conn.connect(); //实现连接
4:> HttpURLConnection连接问题:
//url对象用openconnection()打开连接;获得URLConnection类对象,再用URLConnection类对象的connect()方法进行连接
//getOutputStream()会隐含的进行connect()方法实现连接。
OutputStream os =conn.getOutputStream();
5:> HttpURLConnection写数据与发送数据问题:
//获取一个输出流 OutputStream os = conn.getOutputStream();
//可以上传文本数据,通過DataOutputStream写入数据输出流中
DataOutputStream dos = new DataOutputStream(os);
dos.writeBytes("lastId="+URLEncoder.encode(lastId, "UTF-8"));
//dos.writeBytes("lastId="+lastId);
dos.flush();//刷新,将数据发到缓冲区。
dos.close();
// getResponseCode获取URL服务端响应的状态码
if ( conn.getResponseCode() == 200){
//输入流,获取服务端返回的
InputStream is = conn.getInputStream();
//reader(注意UTF-8读),InputStreamReader 将字节流转换为字符流。
是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//缓冲区,防止读死
BufferedReader br = new BufferedReader(isr);
String ReadOneline = null;
//多行数据时,减少不断创建String对象
StringBuffer sb = new StringBuffer();
while ( (ReadOneline=br.readLine())!=null ){
sb.append(ReadOneline); }
br.close();//关闭缓存区
isr.close();
is.close();//关闭输入流
conn.disconnect(); return sb.toString();
} else{
errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")";
return "errorserver";
} } catch (Exception e) {
errorMessage = e.getMessage(); return "errorclient";
}