servlet相关配置

  1. URLPattern:servlet访问路径

    一个servlet可以定义多个访问路径

    1
    @WebServlet({"/d4","/dd4","/ddd4"})

    路径规则:

    • /xxx:路径匹配
    • /xxx/xx:多层路径,目录结构
    • *.do:拓展名匹配

HTTP

  1. 概念

    Hyper Text Transfer Protocol超文本传输协议。何谓协议?即定义了两个设备之间传输信息的格式。

  2. 特点

    • 默认端口号是80
    • 基于请求/响应模型的:一次请求对应一次响应
    • 无状态的,每次请求之间相互独立,不能交互数据

3.版本

  • 1.0:每一次请求相应都会建立新的连接
  • 1.1:复用连接
  1. 请求消息数据格式

    • 请求行

      1
      GET /login.html	HTTP/1.1

      HTTP协议中有7种请求方法,常用的有2种

      GET

      1. 请求参数在请求行中,在url后?连接
      2. 请求的url长度有限制
      3. 不太完全

      POST

      1. 请求参数在请求体中
      2. 请求的url长度没有限制
      3. 相对安全
    • 请求头

      1. User-agent

        浏览器告诉服务器,我的浏览器的版本信息

      2. Referer

        高速浏览器我从哪里来

        可以防止盗链、进行统计工作

    • 请求空行

      空行,用于分隔post请求头和请求体。

    • 请求体(正文)

      post请求方式请求数据存放的地方

    • 举例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      POST /login.html	HTTP/1.1
      Host: localhost
      User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      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
      Accept-Encoding: gzip, deflate
      Referer: http://localhost/login.html
      Connection: keep-alive
      Upgrade-Insecure-Requests: 1

      username=zhangsan
  2. 响应消息数据格式(略)

Request

Resquest功能

主要用户获取请求消息数据

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

    • getMethod 获取请求方法GET
    • getContextPath获取虚拟路径/day14
    • getServletPath获取servlet路径/demo1
    • getQueryString获取Get请求参数name=zhangsan
    • getRequestURI获取请求URI/day14/demo1
    • getProtocol获取协议及版本HTTP/1.1
    • getRemoteAddr获取客户机IP地址
  2. 获取请求头数据

    • getHeader(String name)
    • getHeaderNames():获取所有的请求头名称
  3. 获取请求体数据

    getReader获取流对象后获取

其他功能

  1. 获取请求参数通用方法

    1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
    2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
    3. Enumeration getParameterNames():获取所有请求的参数名称
    4. Map<String,String[]> getParameterMap():获取所有参数的map集合

中文乱码问题

1
request.setCharacterEncoding("utf-8");

请求转发

1
request.getRequestDispatcher.forward(ServletRequest request,ServletResponse response) 
  • 特点

    1. 转发只是一次请求
    2. 只能转发到当前服务器内部资源中
    3. 浏览器地址栏不发生变化
  • 共享数据

    1. 域对象:在一定的作用范围内共享数据

    2. request域:在一次请求中的数据共享范围

      1
      2
      3
      setAttribute() 存储数据
      getAttribute()获取数据
      removeAttribute移除数据

ServletContext

(在Response下详细学习)

1
ServletContext getServletContext()

案例-登录

链接:案例-登录

Response

HTTP协议响应

  1. 请求消息:客户端发送给服务器的数据

    • 请求行
    • 请求头
    • 请求空行
    • 请求体
  2. 响应消息:服务端发送给客户端的消息

    • 响应行

      1. 组成

        协议/版本 响应状态码 状态码描述

      2. 响应状态码

        1xx:服务端接受客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码

        2xx:成功,200

        3xx:重定向。302重定向。304访问缓存

        4xx:客户端错误

        ​ 404请求路径没有对应的资源

        ​ 405请求方式没有对应的doxxx方法

        5xx:服务端错误500服务端内部异常

    • 响应头

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

      2. Content-disposition:服务端高数客户端以什么格式打开相应数据

        –inline默认

        –attachment;filename=xxx 以附件方式打开

        1
        response.setHeader("content-disposition","attachment;filname=111");
    • 响应空行

    • 响应体:传输的数据

    • 响应内容实例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      HTTP/1.1 200 OK
      Content-Type: text/html;charset=UTF-8
      Content-Length: 101
      Date: Wed, 06 Jun 2018 07:08:42 GMT

      <html>
      <head>
      <title>$Title$</title>
      </head>
      <body>
      hello , response
      </body>
      </html>

Response对象

  1. 设置响应消息

    • 设置响应行

      格式:HTTP/1.1 200 OK

      设置状态码:setStatus

    • 设置响应头

      setHeader(String name, String value)

    • 设置响应体

      1.获取输出流getWriter或者getOutputStream

      2.使用输出流

  2. 重定向

    1
    2
    3
    4
    5
    //response.setStatus(302);//1. 设置状态码为302
    // response.setHeader("location","/day/servletDemo3"); //2.设置响应头location

    //上面的写法的简介
    response.sendRedirect("/day/servletDemo3");

重定向和转发区别

  1. 重定向特点
    • 地址栏发生变化
    • 重定向可以访问其他站点
    • 重定向是两次请求,不能用request域类共享数据
  2. 转发特点
    • 转发地址路径不变
    • 是一次请求
    • 转发只能访问当前服务器的资源

访问路径

  1. 相对路径

    比如./index.html

    ./当前目录

    ../后退一级目录

  2. 绝对路径

    比如 http://localhost/day14/demo

    或者 /day14/demo

  3. 路径使用

    • 客户端使用

      需要添加虚拟目录,虚拟目录动态获取

      1
      request.getContextPath()
    • 服务器使用

      不需要添加虚拟目录,一般转发时用

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

  1. 步骤

    获取字符输出流 -> 输出数据

  2. 乱码问题

    设置响应头

    1
    response.setContentType("text/html;charset=utf-8");
  3. 案例-验证码

    链接:验证码案例

ServletContext对象

概念

代表整个web应用,可以和程序的容器(服务器)通信

获取

  1. request获取

    1
    request.getServletContext();
  2. HttpServlet获取

    1
    this.getServletContext();

功能

  1. 获取MIME类型

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

    格式:大类型/小类型

    text/html image/jpeg

    获取方式

    1
    getMimeType(String file)
  2. 域对象:共享数据

    • setAttribute
    • getAttribute
    • removeAttribute

    ServletContext对象的范围:所有用户请求的数据,个人理解是所有的servlet之间共享数据

  3. 获取文件的真实(服务器)路径

    1
    2
    3
    4
    5
    6
    String b = context.getRealPath("/b.txt");//web目录下资源访问
    System.out.println(b);
    String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
    System.out.println(c);
    String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
    System.out.println(a);

案例-文件下载

  1. 文件下载需求

    • 页面显示超链接
    • 点击超链接后弹出下载提示框
    • 完成图片文件下载
  2. 链接 文件下载-案例