Servlet中doGet和doPost的区别
Servlet方法只定义了一个服务方法——service,HttpServlet类实现了该方法,并且要求调用doGet或者doPost方法其中的一个。doGet处理get请求,doPost处理post请求。在项目中新建一个Servlet类时,默认继承HttpServlet类,系统会自动生成构造方法、doGet和doPost方法。如下图:
当客户端发出请求时,调用service方法并传递一个请求和响应对象。Servlet首先判断该请求是post还是get操作,然后再调用doPost和doGet方法中的一个,doPost和doGet方法都接收请求(HttpServletRequest)和响应(HttpServletResponse)。
get和post方法的区别:get方法只有一个参数流,参数附在URL后,大小个数有严格限制且只能是字符串。post方法的参数是通过另外的流传递的,不通过URL,所以传递的参数可以很大,也可以传递二进制数据,比如文件的上传。
在Servlet开发中,以doPost方法和doGet方法分别处理get和post方法,另外还有一个doService()方法,它是一个调度方法,当一个请求发生时,首先执行doService()方法,不管是get还是post。
service()是在javax.servlet.Servlet接口中定义的,在javax.servlet.GenericServlet中实现了这个接口,二doPost和doGet则是在javax.servlet.http.HttpServlet中实现的,javax.servlet.http.HttpServlet是javax.servlet.GenericServlet的子类。所以可以这样理解其实所有的请求均首先由service()进行处理,而在javax.servlet.http.HttpServlet的service()方法中,主要做的事情就是判断请求类型是get还是post,然后调用对应的doGet和doPost方法。
doGet处理get请求 doPost处理post请求 doPut处理put请求 doDelete处理delete请求 doHead处理head请求 doOptions处理options请求 doTrace处理trace请求
通常情况下,一般的开发只需要关心doGet和doPost方法,其他方法需要非常熟悉HTTP编程,因此这些方法被认为是高级方法,而通常情况下,我们实现的servlet都是从HttpServlet扩展而来的。在servlet中doPost方法里面其实有调用doGet方法,所以在创建servlet时可以不要doPost方法,但是在大型项目涉及密码的传送时doPost方法更安全一些,通常情况下二者之间没什么区别。
总结以下5个方面来区别post和get:
1>客户端(一般指浏览器)生成的方式
get:form表单中method的属性为get时;或者直接在URL地址栏中需要传递参数时,在URL后面拼接"?name=张三&age=18"这样的查询参数字符串。
post:form表单中method的属性为post。
2>客户端数据传送方式
get:表单数据存放在URL地址后面,所有get方式提交时HTTP中没有消息体。
post:表单数据存放在HTTP协议的消息体中以实体的方式传送到服务器。
3>服务器获取数据方式
get:服务器采用Servlet中的doGet来获取变量的值。
post:服务器采用Servlet中的doPost来获取变量的值。
4>传输的数据量
get:安全性差,因为是直接将数据显示在地址栏中,浏览器有缓冲,可以记录用户信息,所以安全性低。
post:安全性高,因为post方式提交数据时采用的是HTTP post机制,是将表单中的字段与值放置在HTTP HEAD内一起传送到ACTION所指的URL中,用户看不见,所以安全性高。