Servlet体系结构

Servlet

Servlet体系结构

  1. Servlet – 接口
  2. GenericServlet – 抽象类
    • 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  3. HttpServlet – 抽象类 : 对Http协议的一种封装,简化操作
    • 定义类继承HttpServlet
    • 复写doGet/doPost方法

Servlet相关配置

  1. urlpartten : Servlet访问路径
    • 一个Servlet可以定义多个访问路径 : @WebServlet({"/demo1","/demo3","/demo4"})
    • 路径定义规则 : 1. /XXX, 2. /XXX/XXX, 3. *.do

HTTP

  1. 概念 : Hyper Text Transfer Protocol 超文本传输协议
    • 传输协议 : 定义了, 客户端和服务端通信时, 发送数据的格式
    • 特点 :
      1. 基于TCP/IP的高级协议
      2. http默认端口80
      3. 基于请求/响应模型 : 一次请求对应一次响应
      4. 无状态的 : 每次请求之间相互独立,不能交互数据
  2. 请求消息数据格式
    • 请求行
      1. 请求方式 请求url 请求协议/版本
        GET : 请求参数在请求行中,在url后;请求url长度有限制;不太安全
        POST : 请求参数在请求体中;请求url长度没有限制;相对安全
      2. GET /Day3_S/login.html HTTP/1.1
    • 请求头 : 请求头名称 : 请求头值
      1. User-Agent : 浏览器告诉服务器,我访问你使用的浏览器版本信息,用于解决浏览器的兼容性问题
      2. Referer : 告诉服务器,当前的请求从哪里来
        作用: 1.防盗链 2. 统计工作
    • 请求空行 : 空行(用于分割请求头和请求体)
    • 请求体 : 封装POST请求消息的请求参数
  3. 响应消息数据格式
    • 响应行
      1. 组成 : 协议/版本 响应状态码 状态码描述 例如:HTTP/1.1 200 OK
      2. 响应状态码 : 服务器告诉客户端浏览器本次请求和响应的一个状态
        1. 1xx : 服务器接收客户端消息,但没有接收完成,等待客户端继续发送。
        2. 2xx : 成功。 代表:200
        3. 3xx : 重定向。 代表:302(重定向),304(访问缓存)
        4. 4xx : 客户端错误。代表 :
          • 404:请求路径没有对应的资源
          • 405:请求方式没有对应的doxxx方法
        5. 5xx : 服务器端错误。代表 : 500(服务器内部出现异常)
    • 响应头 :
      1. 格式 : 头名称 : 值
      2. 常见的响应头 :
        1. Content-Type : 服务器告诉客户端本次响应体数据格式以及编码格式 例如:Content-Type : text/html;charset=UTF-8
        2. Content-disposition : 服务器告诉客户端以什么格式打开响应体数据
          • in-line : 默认值,在当前页面内打开
          • attachment;filename=xxx : 以附件的形式打开响应体。文件下载
    • 响应空行
    • 响应体 : 传输的数据

Request :

  • request对象和response对象的原理
    1. request和response对象是由服务器创建的。我们来使用它们
    2. request对象是来获取请求消息,response对象是来设置响应消息
  • request : 继承体系结构
    1. ServletRequest – 接口
    2. HttpServletRequest – 接口(继承上面的接口)
    3. org.apache.catalina.connector.RequestFacade 类(tomcat) (实现HttpServletRequest接口)
  • request功能 : 获取请求信息
    1. 获取请求消息数据
      • 获取请求行数据
        GET /day3/demo1?name=zhangsan HTTP/1.1
        方法:
        1. 获取请求方式:String getMethod() : GET
        2. (*)获取虚拟目录 : String getContexPath() : /day3
        3. 获取Servlet路径 : String getServletPath() : /demo1
        4. 获取get方式请求参数 : String getQueryString() : name=zhangsan
        5. (*)获取请求URI : String getRequestURI() : /day3/demo1
          StringBuffer getRequestURL() : http://localhost/day3/demo1
        6. 获取协议及版本 : HTTP/1.1 : String getProtocol()
        7. 获取客户机的IP地址 : String getRemoteAddr()
      • 获取请求头数据
        1. String getHeader(String name) : 通过请求头的名称获取请求头的值
        2. Enumeration< String > getHeaderNames() : 获取所有的请求头名称
      • 获取请求体数据 : 只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
        1. 获取流对象
          • BufferedReader getReader() : 获取字符输入流,只能操作字符数据
          • ServletInputStream getInputStream() : 获取字节输入流,可以操作所有类型数据
        2. 再从流对象中拿数据
    2. 其它功能:
      • 获取请求参数通用方法
        1. String getParameter(String name) : 根据参数名称获取参数值 username=zhansan&password=123
        2. String[] getParameterValues(String name) : 根据参数名称获取参数值的数组 hobby=xx&hobby=yy
        3. Enumeration< String > getParameterNames() : 获取所有请求的参数名称
        4. Map< String,String[] > getParameterMap() : 获取所有参数的map集合
        • 中文乱码:
          1. get方式 : tomcat 8 已经将get方式乱码问题解决了
          2. post方式 : 会乱码在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”)
      • 请求转发 : 一种在服务器内部的资源跳转方式
        1. 步骤:
          • 通过request对象获取请求转发器对象 : RequestDispatcher getRequestDispatcher(String path)
          • 使用RequestDispatcher对象来进行转发 : forward(ServletRequest request, ServletResponse response)
        2. 特点:
          • 浏览器地址路径不发生变化
          • 只能转发到当前服务器的内部资源
          • 转发是一次请求
        • 共享数据 :
          1. 域对象 : 一个有作用范围的对象,可以在范围内共享数据
          2. request域 : 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
          3. 方法:
            • setAttribute(String name,Object obj) : 存储数据
            • getAttribude(String name) : 通过键获取值
            • removeAttribute(String name) : 通过键移除键值对
          4. 获取ServletContext : ServletContext getServletContext();

BeanUtils工具类,简化数据封装

  1. JavaBean : 标准的Java类
    • 要求:
      1. 类必须被public修饰
      2. 必须提供空参的构造器
      3. 成员变量必须使用private修饰
      4. 提供公共setter和getter方法
    • 功能: 封装数据
  2. 概念:
    • 成员变量:
      1. 属性 : setter和getter方法截取后的产物
      2. 例如 : getUsername() --> Username–>username
  3. 方法:
    • setProperty()
    • getProperty()
    • populate(Object obj, Map map) : 将Map集合的键值对信息,封装到对应的JavaBean对象中

Response

  • 功能 : 设置响应消息
    1. 设置响应行
      • 格式 : HTTP/1.1 200 ok
      • 设置状态码 : setStatus(int sc)
    2. 设置响应头 : setHeader(String name, String value)
    3. 设置响应体:
      • 获取输出流
        1. 字符输出流 : PrintWriter getWriter()
        2. 字节输出流 : ServletOutputStream getOutputStream()
      • 使用输出流 : 将数据输出到客户端浏览器
  • 案例 :
  1. 完成重定向
    • 重定向 : 资源跳转的方式
    • 重定向的特点 :
      1. 地址栏发生变化
      2. 重定向可以访问其他站点
      3. 重定向是两次请求,不能通过request对象来共享数据
    • 转发的特点 :
      1. 转发地址栏路径不变
      2. 转发只能访问当前服务器的资源
      3. 转发是一次请求,可以使用request对象来共享数据
    • forward 和redirect 区别
    • 路径写法:
      1. 相对路径 : 相对路径不可以确定唯一资源 如: ./index.html
        • 以 ./ 开头路径
        • 规则 : 找到当前资源和目标资源之间的相对位置关系
        • ./ : 当前目录
        • …/ : 后退一级目录
      2. 绝对路径 : 可以确定唯一资源 如:http://localhost:8080/Day3_S/response1
        • 以 / 开头的路径
        • 规则 : 判断定义的路径是给谁用的?判断请求从哪发出
          1. 给客户端浏览器使用 : 需要加虚拟目录(重定向)
            • 建议虚拟目录动态获取 : req.getContextPath();
          2. 给服务器使用 : 不需要加虚拟目录(转发)
//1.设置状态码为302
        resp.setStatus(302);
        //2.设置响应头location
        resp.setHeader("location","/Day3_S/response2");

        //简单的重定向方法
        resp.sendRedirect("/Day3_S/response2");
  1. 服务器输出字符数据到浏览器
    1. 步骤 :
      • 获取字符输出流
      • 输出数据
      • 注意:乱码问题
@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //告诉浏览器,响应体的编码格式  utf-8
        resp.setContentType("text/html;charset=utf-8");

        //1.获取字符输出流
        PrintWriter writer = resp.getWriter();
        //2.输出数据
        writer.write("<h1>hello response</h1>");
		
		ServletOutputStream outputStream = resp.getOutputStream();

        outputStream.write("hello".getBytes());
    }
  1. 服务器输出字节数据到浏览器
  2. 验证码
    • 本质 : 图片
    • 目的 : 防止恶意注册

SevletContext对象

  1. 概念: 代表整个Web应用,可以和程序的容器(服务器)来通信
  2. 获取 :
    • 通过request对象获取 : request.getServletContext();
    • 通过HttpServlet获取 : this.getServletContext();
  3. 功能 :
    • 获取mime类型
      1. mime类型 : 在互联网通信过程定义的一种文件数据类型
        • 格式 : 大类型/小类型 text/html imag/jpeg
      2. 获取 : String getMimeType(String file)
    • 域对象 : 共享数据
      1. setAttribute(String name,Object obj) : 存储数据
      2. getAttribude(String name) : 通过键获取值
      3. removeAttribute(String name) : 通过键移除键值对
      4. ServletContext对象范围 : 所有用户所有请求的数据
    • 获取文件的真实路径
      1. context.getRealPath(String path)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值