【JavaWeb】Servlet的学习与应用02--HTTP请求与响应和中文乱码问题

注:本文章基于尚硅谷JavaWeb相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取可以在评论区留言或者联系作者!



开篇

什么是HTTP协议:
所谓HTTP协议是指客户端和服务器之间通信时,发送的数据,需要遵守的协议,叫HTTP协议;
HTTP协议中的数据,又叫报文;

请求的HTTP协议格式

客户端给服务器发送数据叫请求;
服务器给客户端传回数据叫响应;

GET请求

(1)请求行

  • 请求的方式 GET
  • 请求的资源路径 [+?+请求参数]
  • 请求的协议版本号 HTTP/1.1

(2)请求头
Accept:告诉服务器,客户端可以接受的数据类型;
Accept-Language:告诉服务器客户端可以接受的语言类型:
zh_CN:中文中国
en_US:英文美国
User-Agent:就是浏览器的信息;
Accept-Encoding:告诉浏览器,客户端可以接受的语言类型;
Host:表示请求服务器的ip和端口号;
Connection:告诉服务器请求连接如何处理:
Keep-Alive:告诉服务器回传数据不要马上关闭,保持一小段时间的连接;
Closed:马上关闭


POST请求

(1)请求行

  • 请求的方式 POST
  • 请求的资源路径[+?+请求参数]
  • 请求的协议版本号: HTTP/1.1

(2)请求头

  • 具体和上面GET请求请求头一样
  • Referer:表示请求发起时,浏览器地址栏中的地址(记录发送给服务器的信息从哪来)
  • Content-Type:表示发送的数据的类型:
    * application/x-www-form-urlencoded
    表示提交的数据格式是key:value&key:value,然后对其进行url编码
    url编码是把非英文的内容转换为%xx%xx
    • multipart/form-data:
      表示已多段的形式提交数据给服务器(以流的 形式提交,用于上传)
  • Content-Lnegth:表示发送的数据的长度
  • Cache-Control:表示如何控制缓存,no-cache不缓存
  • 空行

(3)请求体(发送给服务器的数据)


响应HTTP的协议格式

(1)响应行

  • 响应的协议和版本号 HTTP/1.1
  • 响应的状态码
  • 响应状态描述符

(2)响应头

  • Server: 表示服务器的信息
  • Data:请求响应的时间(格林时间)
  • 其它属性和请求一致
  • 空行

(3)响应体(就是回传给客户端的数据)

  • 可以是json数据,也可以是网页源码

    常见的响应码:
    200:请求成功
    302:表示请求重定向;
    404:表示请求服务器已经收到了,但是你要的数据不存在(可能请求地址错误);
    500:表示服务器已经收到请求,但是服务器内部错误,

MIME类型说明:
MIME是HTTP协议中数据类型。
MIME是多功能Internet邮件扩充服务,MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应;


HttpServletRequest类

HttpServletRequest作用:
每次请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议解析好封装到Request对象 中,然后传递到service方法(doGet和doPost)中给我们使用,我们可以通过HttpServletRequest对象,获取到所有请求的信息

HttpServletRequest类常用的方法:

  1. getRequestURI():获取请求的资源路径
  2. getRequestURL():获取请求的统一资源定位符(绝对路径)
  3. getRemoteHost():获取客户端的ip地址
  4. getHeader():获取请求头;
  5. getParameter:获取请求的参数
  6. getParametervalues获取请求的参数(多个值的时候使用)
  7. getMethod():获取请求的参数
  8. setAttribute(key:value):设置域数据
  9. getAttribute(key):获取域数据
  10. 10.getRequestDispatcher():获取请求转发对象

在doPost请求中设置请求体的字符集为UTF-8,从而解决post请求中文乱码问题(一定要在获取请求参数之前设置字符集编码);

request.setCharacterEncoding("UTF-8");

请求转发
请求转发是指度武器收到请求后,从一个资源跳转到另一个资源的操作叫做转发;

请求转发的特点:

  1. 浏览器的地址栏没有变化
  2. 他们是一次的请求
  3. 他们共享session数据
  4. 可以转发到WEB-INF目录下(作为服务器访问);
request.getRequestDispatcher("/a/b/c.html")forward(request,response)

base标签设置页面相对路径工作时参照的地址,href属性就是 参数的地址值;
以下代码则表示所有设计到相对路径工作时,都以此路径出发;

<base href="http://localhost:8080/07_servlet/c.html">

web中 / 斜杠的不同意义:
/ 斜杠如果被浏览器解析,得到的地址是:http://ip:port
/ 斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径




HttpServletResponse类

HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序使用,HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有相响应的信息,我们如果需要设置返回给客户的信息,都可以使用HttpServletResponse对象来进行设置;

(1)两个输出流的说明:

  1. 字节流:getOutputStream()常用于下载(传递二进制数据)
  2. 字符流:getWriter()常用于回传字符串(常用)

两个流只能使用一个,否则就会报错;

如何回传字符串数据:

//设置服务器字符集为UTF-8(解决中文显示异常)
resp.setCharracterEncoding("UTF-8);
//通过响应头,设置浏览器也使用UTF-8的字符集(解决中文显示异常)
resp.setHeader("Content-Type","text/html;charset=UTF-8")
PrintWriter writer=resp.getWriter();
writer.write("返回写入数据!")

解决返回中文乱码方式2:

//同时设置服务器和客户端响应都使用UTF-8编码(此方法一定要在获取流之前使用)
resp.setContentType("text/html;charset=UTF-8"

请求重定向

设置响应状态码302,表示重定向;
设置响应头,说明新的响应地址在哪里;

//旧响应servlet
resp.setStatus(302)
resp.setHeader("Location",value:"http://localhost:8080/新的响应地址绝对地址")

请求重定向特点:

  1. 浏览器地址栏会发生变化;
  2. 两次请求
  3. 不会共享session中的数据
  4. 不能访问WEB-INF中的资源(作为客户端访问),但是可以访问工程以外的资源

实现请求重定向的简单方式:

resp.sendRedirect("访问地址")

总结:

在这一节中,我们首先学习了HTTP请求与响应的基本格式,然后分别学习了httpservletrequest和httpservletresponse两个类的一些功能,了解了请求与响应的一些操作,并响应的解决了响应和返回中的中文乱码问题,最后还分别学习了请求转发和重定向,并分析了其各自的特点;


如果感觉内容写的还不错的话,一键三连不迷路!!!!
后面将会更新更多学习内容,一起学习吧!!!!!!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47418550/article/details/124526178