【JavaWeb】按照学习顺序记录重点与细节2. Servlet

1. 编码设置

  • get请求
    • tomcat8之前:需要使用代码进行转换
    String fname = request.getParameter("fname");
    //1.将字符串打散成字节数组
    byte[] bytes = fname.getBytes("ISO-8859-1");
    //2.将字节数组按照设定的编码重新组装成字符串
    fname = new String(bytes,"UTF-8");
    
    • tomcat8之后:不需要设置编码
  • post请求
    在获取请求参数之前设置编码
    request.setCharacterEncoding("UTF-8");
    

2. Servlet类继承关系

javax.servlet.Servlet接口 → javax.servlet.GenericServlet抽象类 → javax.servlet.http.HttpServlet抽象子类

3. Servlet常用接口

Servlet主要可以override重写三个方法,这三个方法也对应着Servlet的生命周期:实例化(调用构造方法)、初始化(调用init())、然后服务(调用service())、当容器销毁的时候调用destroy()

  • 初始化:void init(config)
  • 服务:void service(request,response)
    在javax.servlet.GenericServlet中仍是抽象方法,在javax.servlet.http.HttpServlet中实现,完成对于方法是什么的判断并执行
    javax.servlet.http.HttpServlet中的service源码如下:
    String method = req.getMethod(); 获取请求的方式(get/post)
     if (method.equals("GET")) {
          this.doGet(req,resp);
      } else if (method.equals("HEAD")) {
          this.doHead(req, resp);
      } else if (method.equals("POST")) {
          this.doPost(req, resp);
      } else if (method.equals("PUT")) {
      }
    
    重写doPost或者doGet方法(如果没有重写就会执行javax.servlet.http.HttpServlet中的doPost或者doGet报405错误)
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    
    注意:service方法与doPost/doGet的关系为:先执行service,由其中的String method = req.getMethod();来判断具体执行什么方法
  • 销毁:void destory()

4. Servlet的特点

  • 由于Servlet的实例只创造一个(在第一次发出请求的时候)即单例,因此Servlet是线程不安全的。Servlet最好不要定义成员变量
  • 在web.xml中通过<load-on-startup>来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0

5. Http协议

  • HTTP 是无状态的,服务器无法判断两次请求是同一个客户端发过来的,还是不同的客户端发过来的,可以通过会话跟踪技术来解决无状态的问题。会话跟踪技术:sessionID

    常用的API有:

     request.getSession() //获取当前的会话,没有则创建一个新的会话
     request.getSession(true) //效果和不带参数相同
     request.getSession(false) //获取当前会话,没有则返回null,不会创建新的
    
     session.getId() //获取sessionID
     session.isNew() //判断当前session是否是新的
     session.getMaxInactiveInterval() //session的非激活间隔时长,默认1800秒
     session.setMaxInactiveInterval()
     session.invalidate() //强制性让会话立即失效
     	
    //session保存作用域
    //session保存作用域是和具体的某一个session对应的
    //常用的API:
    void session.setAttribute(k,v)
    Object session.getAttribute(k)
    void removeAttribute(k)
    
  • Http包含两个部分:请求和响应

    • 请求:
      • 请求行: 1. 请求的方式 ; 2.请求的URL ; 3.请求的协议(一般都是HTTP1.1)
      • 请求消息头:浏览器型号、版本、能接收的内容的类型、发的内容的类型、内容的长度等
      • 请求体,三种情况:
        get方式,没有请求体,但是有一个queryString
        post方式,有请求体,form data
        json格式,有请求体,request payload
    • 响应:
      • 响应行:1.协议 2.响应状态码(200) 3.响应状态(ok)
      • 响应头:服务器的信息;服务器发送给浏览器的信息(内容的媒体类型、编码、内容长度等)
      • 响应体:响应的实际内容(比如请求add.html页面时,响应的内容就是<form…)

6. 服务器内部转发以及客户端重定向

  • 服务器内部转发 : request.getRequestDispatcher("...").forward(request,response);

    • 一次请求响应的过程,对于客户端而言,内部经过了多少次转发,客户端是不知道的
    • 地址栏没有变化
      在这里插入图片描述
  • 客户端重定向: response.sendRedirect("....");

    • 两次请求响应的过程。客户端知道请求URL有变化
    • 地址栏有变化
      在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值