本文内容

  • servlet(6-7点)
  • HTTP
  • Request

一 Servlet

上一篇已经总结了1-5点(1. 概念

  1. 步骤
  2. 执行原理
  3. 生命周期
  4. Servlet3.0 注解配置)
  1. Servlet 体系结构

Servlet — 接口
|
GeneraticServlet — 接口
|
HttpServlet — 抽象类

  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    • 自己定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作
    • 定义类继承HttpServlet
    • 复写doGet/doPost 方法
  1. Servlet 相关配置
    1. url-pattern: Servlet的访问路劲
      1. 一个Servlet可以有多个访问路径: @WebServlet({“/d4”,”/dd4”,”/ddd4”})
      2. 路径定义规则
        1. /xxx : 路径匹配
        2. /xxx/xxx:多层路径,目录结果
        3. *.do:扩展名匹配

二 HTTP和Request:

概念:Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义客户端和服务的通信时,发送数据的格式
特点:..

访问百度,是一次请求还是多次? 多次,1个资源(图片)都是1个请求
历史版本:

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

请求消息数据格式

  1. 请求行

请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求方式有7种,常见有两种

  • GET
    • 请求参数在请求行中,在url后。#+ username=zhangshang
    • 请求的url长度有限制的
    • 不太安全
  • POST
    • 请求参数在请求体中
    • 请求url长度没有限制
    • 相对安全

方法

  1. 1. 获取请求方式 GET
  2. * String getMethod()
  3. 2. (*)获取虚拟目录:/day14
  4. * String getContextPath()
  5. 3. 获取Servlet路径: /demo1
  6. * String getServletPath()
  7. 4. 获取get方式请求参数:name=zhangsan
  8. * String getQueryString()
  9. 5. (*)获取请求URI:/day14/demo1
  10. * String getRequestURI(): /day14/demo1
  11. * StringBuffer getRequestURL() :http://localhost/day14/demo1
  12. * URL:统一资源定位符 http://localhost/day14/demo1 中华人民共和国
  13. * URI:统一资源标识符 : /day14/demo1 共和国
  14. 6. 获取协议及版本:HTTP/1.1
  15. * String getProtocol()
  16. 7. 获取客户机的IP地址:
  17. * String getRemoteAddr()
  1. 请求头:客户端浏览器告诉服务器一些信息

请求头名称:请求头值
常见请求头:

  • User-Agent:浏览器告诉服务器,我访问你 使用的浏览器版本信息(可解决兼容性问题)
  • Referer:http://localhost/login.html
    • 告诉服务器,我(当前请求)从哪里来?
    • 防盗链,统计工作

方法

  1. * (*)String getHeader(String name):通过请求头的名称获取请求头的值
  2. * Enumeration<String> getHeaderNames():获取所有的请求头名称
  1. 请求空行:分割POST请求的请求头和请求体的
  2. 请求体(正文):封装POST请求消息的请求参数的

方法

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

一个请求消息数据例子

  1. POST /login.html HTTP/1.1 #请求行
  2. Host: localhost #请求头,键值对形式,冒号做分隔
  3. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 #浏览器能接受服务器的响应格式
  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  6. Accept-Encoding: gzip, deflate
  7. Referer: http://localhost/login.html
  8. Connection: keep-alive
  9. Upgrade-Insecure-Requests: 1
  10. username=zhangsan #请求体,GET是没有请求体的
  1. 其它功能
    1. 获取参数通用方式(GET和POST都能使用) ```java
  2. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
  3. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game #一个参数名称有多个参数值,比如多选框
  4. Enumeration getParameterNames():获取所有请求的参数名称
  5. Map getParameterMap():获取所有参数的map集合 ``` b. 中文乱码问题

    • GET tomcat 8已经解决
    • POST方式会乱码:在获取参数前,设置request的编码方式和浏览器一致

      • request.setCharacterEncoding(“utf-8”);

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

      • request对象获取转发器对象RequestDispatcher,调用forward方法

        • RequestDispatcher getRequestDispatcher(String path)
        • forward(ServletRequest request, ServletResponse response)
      • 转发是一次浏览器请求,只能转发到当前服务器内部资源中

        d.共享数据:既然Servlet间能转发,就需要共享一些数据

      • 一是通过 域对象:个有作用范围的对象,可以在范围内共享数据

        • request 域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
        • 方法:
          • void setAttribute(String name,Object obj):存储数据
          • Object getAttitude(String name):通过键获取值
          • void removeAttribute(String name):通过键移除键值对
      • 二是获取ServletContext
        • serv;etContext getServletContext()