一、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";
}