1:什么是HTTP?

超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议。
HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作。

2:get 与post

get只有一个流,参数附加在url后,地址行显示要传送的信息,大小个数有严格限制且只能是字符串。
post的参数是通过另外的流传递的, 不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。

1、安全

GET调用在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来问题,例如用户名和密码等

POST就可以在一定程度上解决此类问题

2、服务器接收方式

服务器随机接受GET方法的数据,一旦断电等原因,服务器也不知道信息是否发送完毕

而POST方法,服务器先接受数据信息的长度,然后再接受数据

3、form运行方式

当form框里面的method为get时,执行doGet方法
当form框里面的method为post时,执行doPost方法

4、容量限制

GET方法后面的信息量字节大小不要超过1.3K,而Post则没有限制

最后说明的是:

你可以用service()来实现,它包含了doget和dopost ;service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!

service()是在javax.servlet.Servlet接口中定义的,   在   javax.servlet.GenericServlet  
    中实现了这个接口,   而   doGet/doPost   则是在   javax.servlet.http.HttpServlet   中实现的,   javax.servlet.http.HttpServlet   是   javax.servlet.GenericServlet   的子类.  
   
  所有可以这样理解,   其实所有的请求均首先由   service()   进行处理,   而在   javax.servlet.http.HttpServlet   的   service()   方法中,   主要做的事情就是判断请求类型是   Get   还是   Post,   然后调用对应的   doGet/doPost   执行.

3:HTTP编程

1>:使用get方式获取服务器端的一张图片,放在本地==》获取服务器的东西用get方式更好

package get;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; public class HttpUtil
{ /**
* 使用get方式获取服务器端的一张图片
* @throws IOException
*/
public static InputStream getInputStream(String path) throws IOException
{
URL url = new URL(path);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//设置请求方式
con.setRequestMethod("GET");//默认请求方式是get
//设置连接超时时间
con.setConnectTimeout(5000);
//设置可以从服务器端读取数据
con.setDoInput(true);//默认值就是true InputStream in = null;
//判断服务器端的响应码是否是200
if(con.getResponseCode()==200)
{
in = con.getInputStream();
}
return in;
} public static void makeImg(InputStream in) throws IOException
{
FileOutputStream fos = new FileOutputStream("file\\img.jpg");
byte[] b = new byte[1024];
int len = 0;
//读取服务器返回的图片数据
while ((len = in.read(b))!=-1)
{
fos.write(b,0,len); }
fos.close();
in.close(); }
}

面向对象代码

package get;

import java.io.IOException;

public class Test
{ public static void main(String[] args) throws IOException
{
String path ="http://localhost:9999/day16/img2.jpg";
HttpUtil.makeImg(HttpUtil.getInputStream(path));
} }

客户端

2:使用post方式提交用户名和密码,并获取服务器端的验证结果==》需要返回数据就用post,服务器端代码上篇博客中有

package post;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair; public class HttpUtil
{
public static String sendByPost(String path,Map<String,String> params,String encode) throws ClientProtocolException, IOException
{
//先把要提交的每对儿数据封装成NameValuePair类型的
List<NameValuePair> list = new ArrayList<NameValuePair>(); for(Map.Entry<String, String> en:params.entrySet())
{
list.add(new BasicNameValuePair(en.getKey(),en.getValue()));
}
//把要提交的数据组织成提交的格式
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode);
//创建提交方式对象
HttpPost post = new HttpPost(path);
post.setEntity(entity);
//创建执行提交的对象
HttpClient client = new DefaultHttpClient(); //执行提交
HttpResponse response = client.execute(post);
if(response.getStatusLine().getStatusCode()==200)
{
InputStream in = response.getEntity().getContent();
return getResult(in,encode);
}
return null;
} private static String getResult(InputStream in, String encode) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] arr = new byte[1024];
int len = 0;
while((len = in.read(arr))!=-1)
{
bos.write(arr,0,len);
}
return new String(bos.toByteArray(),encode);
}
}

面向对象代码

package post;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map; public class Test
{ /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
Map<String,String> params = new HashMap<String, String>();
params.put("username", "李鹏");
params.put("pwd","123456");
String path = "http://localhost:9999/day16/servlet/LoginServlet";
String encode= "utf-8";
System.out.println(HttpUtils.sendByPost(path, params, encode)); } }

客户端

3:使用apache中jar包提供的简洁方法提交用户名和密码,并获取服务器端的验证结果

package apache;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair; public class HttpUtil { public static String sendByPost(String path,HashMap<String,String> params,String encode) throws ClientProtocolException, IOException
{
//先把要提交的每对儿数据封装成NameValuePair类型的
List<NameValuePair> list = new ArrayList<NameValuePair>(); for(Map.Entry<String, String> en:params.entrySet())
{
list.add(new BasicNameValuePair(en.getKey(),en.getValue()));
}
//把要提交的数据组织成提交的格式
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode);
//创建提交方式对象
HttpPost post = new HttpPost(path);
post.setEntity(entity);
//创建执行提交的对象
HttpClient client = new DefaultHttpClient(); //执行提交
HttpResponse response = client.execute(post);
if(response.getStatusLine().getStatusCode()==200)
{
InputStream in = response.getEntity().getContent();
return getResult(in,encode);
}
return null;
} private static String getResult(InputStream in, String encode) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] arr = new byte[1024];
int len = 0;
while((len = in.read(arr))!=-1)
{
bos.write(arr,0,len);
}
return new String(bos.toByteArray(),encode);
} }

面向对象代码

package appache;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map; public class Test
{ /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
Map<String,String> params = new HashMap<String, String>();
params.put("username", "李鹏");
params.put("pwd","123456");
String path = "http://localhost:9999/day16/servlet/LoginServlet";
String encode= "utf-8";
System.out.println(HttpUtil.sendByPost(path, params, encode)); } }

客户端代码

4:使用apach上传文件

package com.qianfeng.upload;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map; import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.FormBodyPart;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject; /**
* 该类实现文件上传的功能
* @author qq
*
*/
public class FileUpload { public void fileUpload(final String path,
final File file,
final HashMap<String,String> params,
final String encode,
final CallBack callBack)
{
//在一个子线程中实现文件上传
new Thread(new Runnable(){
@Override
public void run() { HttpPost post = new HttpPost(path);
HttpClient client = new DefaultHttpClient();
HttpResponse response = null; //把上传的文件和上传的参数组织成表单提交的格式
MultipartEntity entity = new MultipartEntity();
//处理上传的文件
FileBody body = new FileBody(file);
FormBodyPart bodyPart = new FormBodyPart("form",body); entity.addPart(bodyPart); //处理上传的参数
for(Map.Entry<String, String> en:params.entrySet())
{
try {
entity.addPart(en.getKey(), new StringBody(en.getValue()));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
post.setEntity(entity);
try {
//执行提交
response = client.execute(post);
if(response.getStatusLine().getStatusCode()==200){
String result = EntityUtils.toString(response.getEntity());
JSONObject obj = new JSONObject(result);
callBack.getResult(obj);
}
} catch (Exception e) {
e.printStackTrace();
} }
}).start();
}
} //定义回调接口
interface CallBack
{
public void getResult(JSONObject obj);
}

FileUpload

package com.qianfeng.upload;

import java.io.File;
import java.util.HashMap; import org.json.JSONObject; public class Test { /**
* @param args
*/
public static void main(String[] args) { String path = "http://localhost:8080/FileUploadServer/servlet/UploadServlet"; HashMap<String,String> params = new HashMap<String,String>();
params.put("username", "admin");
params.put("password", "123"); File file = new File("file\\tou1.jpg"); FileUpload fileUpload = new FileUpload();
fileUpload.fileUpload(path, file, params, "utf-8", new CallBack(){ @Override
public void getResult(JSONObject obj) {
System.out.println(obj.toString());
}
}); } }

Test

java Http编程小结的更多相关文章

  1. java并发编程小结

    旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/82078467 线程简介: 线程是操作系统调度 ...

  2. Java网络编程小结 URLConnection协议处理器

    URL和URLConnection类 网络中的URL(Uniform Resource Locator)是统一资源定位符的简称.它表示Internet上某一资源的地址.通过URL我们可以访问Inter ...

  3. Java 异步编程 (5 种异步实现方式详解)

    ​ 同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...

  4. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  5. Java结对编程四则运算一周小结

    Java结对编程四则运算一周小结 需求分析 对于四则运算来说最主要的就是要计算出产生的式子(字符串的形式). 设计思路 总体可将这个项目分解为几个部分:产生式子,计算式子,判断对错并记录: 具体的思路 ...

  6. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  7. java并发编程实战学习(3)--基础构建模块

    转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put ...

  8. Java 网络编程----基本概念

    网络现在是一个非常普遍的概念. 以下是维基百科上的解释: 网络一词有多种意义,可解作: 网络流也简称为网络(network).一般用于管道系统.交通系统.通讯系统建模. 有时特指计算机网络. 或特指其 ...

  9. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

随机推荐

  1. js null 和 undefined

    undefined是一个特殊类型,null本质上是一个对象 typeof undefined//"undefined"typeof null//"object" ...

  2. SQL Server 2014 Backup Encryption

    转载自: Microsoft MVP Award Program Blog 来源:Microsoft MVP Award Program Blog 的博客:https://blogs.msdn.mic ...

  3. HAProxy

    1. HAProxy是支持虚拟主机的,可以工作在4. 7层(支持多网段):2. 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作:3. 支持url检测后端的服务器:4. ...

  4. iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(上)

    这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊. 控制台报的错误是:"不支持多次推入相同的视图控制器实例". 什么原因造成的 ...

  5. libgdx 裁剪多边形(clip polygon、masking polygon)

    直接放例子代码,代码中以任意四边形为例,如果需要做任意多边形,注意libgdx不能直接用ShapeRender填充多边形,需要先切割成三角形. public static void drawClip( ...

  6. Python模拟删除字符串两边的空白

    目标: 1.使用string模块的whitespace 2.删除左边.右边以及两边的空白 代码如下: [root@localhost python]# cat rmspace.py #!/usr/bi ...

  7. ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错

    今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...

  8. python Gunicorn

    1. 简介 Gunicorn(Green Unicorn)是给Unix用的WSGI HTTP 服务器,它与不同的web框架是非常兼容的.易安装.轻.速度快. 2. 示例代码1 def app(envi ...

  9. Linux(Ubuntu)环境下使用Fiddler

    自己的开发环境是Ubuntu, 对于很多优秀的软件但是又没有Linux版本这件事,还是有点遗憾的.比如最近遇到一个问题,在分析某个网站的请求路径和cookie时就遇到了问题.本来Chome浏览器自带的 ...

  10. word search puzzle

    package WordSearch; import java.util.ArrayList; import java.util.HashMap; import java.io.*; public c ...