Request和Response
当Web容器收到客户端发送的http请求,会在Servlet初始化之后,service调用之前创建HttpServletRequest和HttpServletResponse对象。HttpServletRequest和HttpServletResponse对象分别封装了HTTP协议的请求(客户端实际请求信息)和响应信息(服务器默认响应信息)。
Request
请求行
GET请求:
请求行信息: GET http://localhost:8080/TomcatDemo/demo HTTP/1.1
POST请求:
请求行信息: POST http://localhost:8080/TomcatDemo/demo HTTP/1.1
HttpServletRequest对象通过方法获取对应的信息。
- getMethod():获取请求方式。
- getRequestURL():获取请求的URL。
- getRequestURI():获取请求的URI。
- getContextPath():获取当前应用的虚拟目录。
如:
out.println("请求方式 : "+request.getMethod()); out.println("请求URL : "+request.getRequestURL()); out.println("请求URI : "+request.getRequestURI()); out.println("ContextPath : "+request.getContextPath()); 结果显示: 请求方式 : GET 请求URL : http://localhost:8080/TomcatDemo/my 请求URI : /TomcatDemo/my ContextPath : /TomcatDemo
请求消息头(关于HTTP的知识)
请求消息头的内容比较多,可以通过getHeaderNames(),获取所有消息头信息,通过getHeader(String name),获取name对应的值。
如:
servlet代码: Enumeration<String> headers = request.getHeaderNames(); String name = ""; while (headers.hasMoreElements()){ name = headers.nextElement(); out.println(name+" : "+ request.getHeader(name)); } 显示结果: host : localhost:8080 connection : keep-alive upgrade-insecure-requests : 1 user-agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36 accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 accept-encoding : gzip, deflate, sdch, br accept-language : zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
请求正文
请求正文不在GET请求方式中使用,一般是POST请求通过请求正文来传递数据。
- 获取表单数据相关的方法
- getParameter(String name):根据表单的属性名获取对应点数据。
- getParameterNames():获取表单所有的属性名。
- getParameterMap():获取所有表单数据,以Map的形式封装
- getInputStream():获取以字节流的表单数据。
- 获取非表单数据相关的方法
- setAttribute():
- getAttribute():
- removeAttribute():
- 获取表单数据相关的方法
与转发相关的方法:
- getRequestDispatcher()
- RequestDispatcher类
- forward():转发的方法
- include():请求包含
HttpServletRequest对象还可以获取客户端的ip地址,以及本机ip地址。
如:
servlet代码: out.println("remote address: "+request.getRemoteAddr()); out.println("remote host:"+request.getRemoteHost()); out.println("remote port:"+request.getRemotePort()); out.println("local address: "+request.getLocalAddr()); out.println("local name:"+request.getLocalName()); out.println("local port: "+request.getLocalPort()); 显示结果: remote address: 192.168.2.103 remote host:192.168.2.103 remote port:57721 local address: 192.168.2.103 local name:DESKTOP-GCGM9LM local port: 8080
除此之外,还有一个编码等信息,这里就不一一介绍了。
下面是GET和POST的请求信息的截图,如下:
GET请求:
POST请求:
Response
响应行
- setStatue(int sc) 设置响应状态码
响应消息行: HTTP/1.1 200 OK
- setStatue(int sc) 设置响应状态码
响应头(关于HTTP的知识)
- sendRedirect():请求重定向
- setHander():设置响应头信息
//告诉响应头的编码方式。 response.setHeader("content-type", "text/html;charset=UTF-8"); //告知客户端不缓存 response.setHeader("pragma", "no-cache"); response.setHeader("cache-control", "no-cache"); response.setDateHeader("expires", 0); //文件下载 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename,"UTF-8")); //刷新 response.setHeader("refresh", "3");//每3秒刷新一次 //3秒后刷新image.html网页 response.setHeader("refresh", "3;url=/TomcatDemo/image.html"); //重定向 response.setStatus(HttpServletResponse.SC_FOUND);//状态码302 //设置重定向的地址 response.setHeader("location", "/TomcatDemo/image.html"); //重定向的另一种写法 response.sendRedirect("/TomcatDemo/image.html");
响应正文
- getWrite():字符流传输(文本,json,html等)
- getOutputStream():字节流传输(图片音视频等二进制文件)
- setContentType():告诉客户端使用什么编码方式。
- setCharacterEncoding():告诉服务端用什么编码方式。
如下图所示:响应的信息:
URLEncoder
URLEncoder是用于转换编码方式的工具类。
详情点击此处。
示例代码:
String strTest = "?=abc?中%1&2<3,4>";
strTest = URLEncoder.encode(strTest, "UTF-8");
System.out.println(strTest);
strTest = URLDecoder.decode(strTest,"UTF-8");
System.out.println(strTest);
执行结果:
%3F%3Dabc%3F%E4%B8%AD%251%262%3C3%2C4%3E
?=abc?中%1&2<3,4>