Java学习笔记Day28:HTTP协议

HTTP:

1.概念:Hyper Text Transfer Protocol 超文本传输协议

  • 传输协议:定义了,客户端和服务端通信时发送数据的格式

  • 特点:
    1)基于TCP/IP的高级协议
    2)默认端口号:80
    3)基于请求/响应模型的:一次请求对应一次响应
    4)无状态的:每次请求之间互相独立,不能交互数据

  • 历史版本:

         1.0:每一次请求响应都会建立新的连接
         1.1:复用连接
    

2.请求消息数据格式:
1)请求行
请求方式 请求url 请求协议/版本
GET/login.html HTTP/1.1

  • HTTP协议有7种请求方式,常用2种

     GET:	
     请求参数在请求行中,在url后	
     请求的url长度有限制的
     不太安全
     
     POST:
     请求参数在请求体中
     请求的url长度有限制的
     相对安全
    

2)请求头

常见请求头:

  • User:Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息

    可以在服务器端获取该头的信息,解决浏览器的兼容问题

  • Referer:http://localhost/login.html
    告诉服务器,我从哪里来
    作用

     防盗链
     统计工作
    

3)请求空行
用于分割POST请求的请求头和请求体
4)请求体
封装POST请求消息的请求参数的

3.响应消息数据格式

Request
1.浏览器和服务器交互过程
1)tomcat服务器会根据请求url中的资源路径,创建对应的ServletDemo1对象
2)tomcat服务器,会创建request和response对象,request对象中封装请求消息数据
3)tomcat将request和reponse两个对象传递给service方法,并且调用service方法
4)程序员可以通过request对象获取请求消息数据,通过response对象设置响应数据
5)服务器在给浏览器作出响应之前,会从response对象中拿程序员设置的响应消息数据

2.request对象和response对象的原理
1)request和response对象是由服务器创建的,我们来使用他们
2)request对象是来获取请求消息,response对象是来设置响应消息

3.request对象继承体系结构

ServletRequest  --接口
HttpServletRequest --接口
org.apache.Catalina.connector.RequestFacada类

4.request功能:
1)获取请求消息数据

  • 获取请求行数据
    GET /day14/demo1?name=zhangsan HTTP/1.1

     方法:
     获取请求方式:String getMethod()
     获取虚拟目录:String getContextPath()
     获取Servlet路径:String getServletPath()
     获取get方式请求参数:String getQueryString()
     获取请求URI:String getRequestURI()
     StringBuffer getRequestURL()
     获取协议及版本:String getProtocol()
     获取客户机的IP地址:String getRemoteAddr()
    

URL:统一资源定位符
URI:统一资源标识符

  • 获取请求头数据

     方法:
     String getHeader(String name):通过请求头的名称获取请求头的值
     Enumeration<String> getHeaderNames:获取所有的请求头名称
    
  • 获取请求体数据
    请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的参数
    步骤:

    1.获取流对象
    BufferedReader getReader():获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
    2.再从流对象中拿数据
    

2)其他功能

  • 获取请求参数通用方式
    String getParameter(String name)根据参数名称获取参数值
    String[] getParameterValues(String name)根据参数名称获取参数值得数组
    Enumeration getParameterNames():获取所有请求的参数名称
    Map<String,String[]>getParameterMap()获取所有参数的map集合

中文乱码问题:
get方式:tomcat 8已经将get方式乱码问题解决了
post方式:解决:在获取参数前,设置request的编码:request.setCharacterEncoding(“utf-8”);

  • 请求转发:一种在服务器内部的资源跳转方式

     1.步骤
     通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
     使用RequestDispatcher对象来进行转发:forword(ServletRequest request,ServletResponse response)
    
     2.特点:
     浏览器地址栏路径不发生变化
     只能转发到当前服务器内部资源中
     转发是一次请求
    
  • 共享数据

    域对象:一个有作用范围的对象,可以在范围内共享数据
    request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    方法:

    void setAttribute(String name,Object obj):存储数据
    Object getAttribute(String name):通过键获取值
    void removeAttribute(String name):通过键移除键值对
    
  • 获取ServletContext
    ServletContext getServletContext()

Response

响应消息:服务器端发送给客户端的数据
1.响应行

1)组成:协议/版本 响应状态码 状态码描述

2)响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态

  • 状态码都是3位数字

  • 分类

    1xx:服务器接收客户端消息,但没有接收完全,等待一段时间后,发送1xx多状态码
    2xx:成功。代表200
    3xx:重定向。302(重定向),304(访问缓存)
    4xx:客户端错误 404(请求路径没有对应的资源) 405(请求方式没有对应的doxxx方法)
    5xx:服务器端错误 500(服务器内部出现异常)

2.响应头

1)格式:头名称:值
2)常见的响应头

  • Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式

  • Content-disposition:服务器告诉客户端以什么格式打开响应体数据

    值:

     in-line:默认值,在当前页面内打开
     attachment;filename=xxx:以附件形式打开响应体。文件下载
    

3.响应空行
4.响应体:

Response对象

1.功能:设置响应消息
1)设置响应行

  • 格式:HTTP/1.1 200 OK
  • 设置状态码:setStatus(int sc)

2)设置响应头:setHeader(String name,String value)
3)设置响应体:
使用步骤:

1.获取输出流
字符输出流:PrintWriter getWriter()	
字节输出流:ServletOutputStream getOutputStream()

2.使用输出流,将数据输出到客户端浏览器

2.案例:
1)完成重定向

  • 重定向:资源跳转的方式

  • 代码实现

    设置状态码:response.setStatus(302)
    设置响应头:response.setHeader("location","/day15/responseDemo2")
    简单重定向:response.sendRedirect("/day15/responseDemo2")
    
  • 重定向的特点

     1.重定向地址栏发生变化
     2.可以访问其他站点资源
     3.重定向是两次请求,不能共享数据
    
  • 转发的特点

    1.转发地址栏路径不变
    2.转发只能访问当前服务器下的资源
    3.转发是一次请求,可以使用request对象共享数据
    
  • 面试题:forward和redirect区别

  • 路径写法:

    路径的分类

    1.相对路径:通过相对路径不可以确定唯一资源
        以 .开头
        找到当前资源和目标资源之间的相对位置关系
     	./: 当前目录
     	../:后退一级目录
    2.绝对路径:通过绝对路径可以确定唯一资源
        以/开头的路径
        规则:判断定义路径是给谁用的?判断请求从哪发出
            1)给客户端使用:需要加虚拟目录(项目的访问路径)
               建议动态获取虚拟目录:request.getContextPath()
           2) 给浏览器使用:不需要虚拟目录
    

2)服务器输出字符数据到浏览器

  • 步骤
    获取字符输出流
    输出数据
PrintWriter pw=response.getWriter();
pw.write("");
  • 乱码问题:

    1.获取流的编码为ISO-8850-1
    2.设置该流的默认编码
    3.告诉浏览器响应体使用的编码
    
response.setContentType("text/html;charset=utf-8");

3)服务器输出字节数据到浏览器

response.setContentType("text/html;charset=utf-8");//浏览器默认JBK
ServletOutputStream sos=response.getOutputStream();
sos.write("你好".getBytes("utf-8"));

4)验证码

  • 本质:图片
  • 目的:防止恶意表单注册
  • 步骤:
    创建一对象,在内存中图片(验证码图片对象)
    美化图片
    将图片输出到页面展示
int width=100;
int height=50;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

Graphics g=image.getGraphics();
g.setColor(Color.GREEN);

ServletContext对象

1.概念:代表整个web应用,可以和程序的容器(服务器)来通信
2.获取:
1)通过request对象获取:request.getServletContext();
2)通过HttpServlet获取:this.getServletContext();;
3.功能:
1)获取MIME类型

  • MIME类型:在互联网通信过程中定义一种文件数据类型

     格式:大类型/小类型  text/html   image/jpeg
    
  • 获取:String getMineType(String file)

2)域对象:共享数据

  • ServletContext对象范围:所有用户所有请求的数据

3)获取文件的真实路径

  • 方法:String getRealPath("")

猜你喜欢

转载自blog.csdn.net/qq_42174669/article/details/105486226