1.GET和POST方式有什么区别
①Get, 它用于获取信息,查询数据,但它不会修改服务器上的数据,从这点来讲,它是数据安全的。
②Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到Post了,当然它也是可以仅仅获取数据的。
区别:GET请求的数据是放在HTTP包头中的,也就是URL之后,通常是像下面这样定义格式的,(而Post是把提交的数据放在HTTP正文中的)。
login.action?name=hyddd&password=idontknow&verify=%E4%BD%E5%A5%BD
①,以 ? 来分隔URL和数据;
②,以& 来分隔参数;
③,如果数据是英文或数字,原样发送;
④,如果数据是中文或其它字符,则进行BASE64编码。
2)GET提交的数据比较少,最多1024B,因为GET数据是附在URL之后的,而URL则会受到不同环境的限制的,比如说IE对其限制为2K+35,而POST可以传送更多的数据(理论上是没有限制的,但一般也会受不同的环境,如浏览器、操作系统、服务器处理能力等限制,IIS4可支持80KB,IIS5可支持100KB)。
3)Post的安全性要比Get高,因为Get时,参数数据是明文传输的,而且使用GET的话,还可能造成Cross-site request forgery攻击。而POST数据则可以加密的,但GET的速度可能会快些。
2.HttpUrlConnection请求网络数据实例
使用GET方式访问HTTP
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* GET请求示例
*
* @author
*
*/
public class GetDemo {
public static void main(String[] args) {
try {
// 1. 得到访问地址的URL
URL url = new URL(
"http://localhost:8080/Servlet/do_login.do?username=test&password=123456");
// 2. 得到网络访问对象java.net.HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
/* 3. 设置请求参数(过期时间,输入、输出流、访问方式),以流的形式进行连接 */
// 设置是否向HttpURLConnection输出
connection.setDoOutput(false);
// 设置是否从httpUrlConnection读入
connection.setDoInput(true);
// 设置请求方式
connection.setRequestMethod("GET");
// 设置是否使用缓存
connection.setUseCaches(true);
// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
connection.setInstanceFollowRedirects(true);
// 设置超时时间
connection.setConnectTimeout(3000);
// 连接
connection.connect();
// 4. 得到响应状态码的返回值 responseCode
int code = connection.getResponseCode();
// 5. 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
String msg = "";
if (code == 200) { // 正常响应
// 从流中读取响应信息
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) { // 循环从流中读取
msg += line + "\n";
}
reader.close(); // 关闭流
}
// 6. 断开连接,释放资源
connection.disconnect();
// 显示响应结果
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用POST方式访问HTTP
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* POST请求示例
*
* @author
*
*/
public class PostDemo {
public static void main(String[] args) {
try {
// 1. 获取访问地址URL
URL url = new URL("http://localhost:8080/Servlet/do_login.do");
// 2. 创建HttpURLConnection对象
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
/* 3. 设置请求参数等 */
// 请求方式
connection.setRequestMethod("POST");
// 超时时间
connection.setConnectTimeout(3000);
// 设置是否输出
connection.setDoOutput(true);
// 设置是否读入
connection.setDoInput(true);
// 设置是否使用缓存
connection.setUseCaches(false);
// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
connection.setInstanceFollowRedirects(true);
// 设置使用标准编码格式编码参数的名-值对
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
// 连接
connection.connect();
/* 4. 处理输入输出 */
// 写入参数到请求中
String params = "username=test&password=123456";
OutputStream out = connection.getOutputStream();
out.write(params.getBytes());
out.flush();
out.close();
// 从连接中读取响应信息
String msg = "";
int code = connection.getResponseCode();
if (code == 200) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
msg += line + "\n";
}
reader.close();
}
// 5. 断开连接
connection.disconnect();
// 处理结果
System.out.println(msg);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.HttpUrlConnection加载网络图片实例
java代码
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200){
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
Message msg = new Message();
msg.what = CHANGE_UI;
msg.obj = bitmap;
handler.sendMessage(msg);
} else
Message msg = new Message();
msg.what = ERROR;
handler.sendMessage(msg);
4.String/StringBuffer/StringBuilder什么区别
1、在执行速度上:Stringbuilder->Stringbuffer->String
2、String是字符串常量
Stringbuffer是字符串变量
Stringbuilder是字符串变量
有可能我们会疑惑String怎么是字符串变量。看以下代码:
String str = adc;
str = str + “ef”;
System.out.println(str);
输出结果为:abcef;
在Java虚拟机中str为adc时是一个变量,当str被重新赋值为adcef时为另一个变量,被重新分配了一次内存,上次使用的内存会被gc在适当的时候回收掉。由于这种机制导致了如果有大量的String赋值操作时,会导致运行速度的缓慢,以及内存使用量的上升。
3、一个特殊的例子
String str = “this is only a” + “simple” + “test”;
StringBuffer stringBuffer = new StringBuffer("this is only a").append("simple").append("test");
你会很惊讶的发现,生成str对象速度简直太快了,而这个时候Stringbuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:
String str = ”this is only a“ + “simple” + “test”;
其实就是
String str = “this is only a simple test”;
所以不需要太多的是时间。但大家这里需要注意的是,如果你的字符串是来自另外的String对象的话。速度就没那么快了,譬如:
String str1 = “this is only a”;
String str2 = “simple”;
String str3 = “test”;
String str = str1 + str2 + str3;
这时候JVM会规规矩矩的按照原来的方式去做。
4、StringBuilder与StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲区去被多个线程使用时,JVM不能保证StringBuilder的线程是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况是在单线程下进行的,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
5、对于三者的总结:
1)如果操作少量的数据用String
2)单线程下操作大量的数据用StringBuilder
3)多线程下操作大量的数据用StringBuffer