servlet中的请求与响应

时间:2021-05-12 21:03:20

一、请求

1.Get和Post的区别:
①post有一个体,而get没有,也就是说,在get请求时,可以在请求行中看到有包含请求方法、web服务器资源路径、参数已经web浏览器所请求协议的版本,以及请求行之后的请求首部。但是post不同,如果post有携带参数,那么post请求内容中,请求行是没有参数的,在请求行、请求首部之后才携带请求体,请求体中的内容就是参数。
②get和post除了在参数大小的差异之外,还有安全性问题,post请求的内容是在请求体中的,而get请求参数是在浏览器的URL后面携带的,在浏览器的地址栏中可以看到参数的具体信息。
③get和post的区别还在于书签问题,get请求可以建立书签,而post不行。
④get只是一个简单的获取,也就说get是用于简单的从服务器获取数据,而不修改服务器的内容,而post则用于发送数据来进行处理,post是一个更新,能够通过post上的数据来修改服务器的某些东西。
⑤在http协议中,get是幂等请求,post不是,即get是能够执行多次请求而不会对服务器产生任何副作用,get请求不应该修改服务器上的任何东西,但是post会,因此我们一般在对表单的请求方法使用post时,要考虑表单的重复提交问题。

ServletRequest接口中常用方法:
getAttribute(String),getContentLength(),getInputStream(),
getLocalPort(),getRemotePort(),getServerPort(),
getParameter(String),getParameterValues(String),
getParameterNames()...

HttpServletRequest接口常用的方法:
getContextPath(),getCookies(),getHeader(String),
getIntHeader(String),getMethod(),getQueryString(),
getSession()...

二、响应

1.sendRedirect()中的相对URLs:
假定用户一开始输入的URL为:http://localhost:8080/myApp/cool/bar.do, 请求到达名为“bar.do”的servlet时,这个servlet会基于一个相对的URL来调用sendRedirect(),这个相对URL没有以斜线开头:sendRedirect(“foo/stuff.html”),容器会相对于原先的请求URL建立完整的URL,需要把它放到HTTP响应的“Location”首部中,即容器知道原先的请求URL是从myApp/cool路径开始的,所以如果没有加斜线,就会将这一部分加到”foo/stuff.html”的前面
http://localhost:8080/myApp/cool/foo/stuff.html
但是如果sendRedirect()的参数是以斜线开始的:sendRedirect(“/foo/stuff.html”),容器会相对于web应用本身建立完整的URL而不是相对于原先的URL,开始位置上的斜线意味着“相对于web容器这个根”
http://localhost:8080/foo/stuff.html

2.响应小结:
①使用setContentType方法告诉浏览器如何处理随响应到来的数据,常见的类型为:“text/html”,”application/pdf”,”image/jpeg”等。
②得到二进制流是通过getOutPutStream(),得到书写器是通过getWriter(),getWriter()可以完成字符I/O,向流写入HTML或其他内容。
③可以通过addHeader()或者setHeader()设置响应首部,二者的区别就是,如果这个首部已经存在,setHeader()会替代原来的值,而addHeader()会向现有的响应增加另一个值,如果响应原来没有这个首部,则两者的作用是一样的。
④请求分派与重定向是不同的。请求分配时在服务器端进行,而重定向是在客户端进行的,请求分派是把请求传递给服务器上的另一个组件(通常在一个web应用中),而重定向只是告诉浏览器去访问另一个URL。

ServletResponse接口常用方法:
setContentType(),getOutPutStream(),getWriter()...
HttpServletResponse接口常用方法:
addCookie(),addHeader(),encodeURL(),sendError(),setStatus(),
sendRedirect()...