获取参数

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
  2. req.getgetParameter("key"); // 可获取请求传过来的参数
  3. }

处理参数乱码问题

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
  2. req.setCharacterEncoding("UTF-8"); // 必须放在获取参数之前
  3. // tomcat10默认时UTF-8
  4. }

继承关系和Servlet的方法

  1. 继承关系:**HttpServlet**->**GenericServlet**->**Servlet**
  2. **Servlet**中核心方法:**inti() 初始化**``**service() 服务方法**``**destroy() 销毁**
  3. 服务方法:当有请求过来时,**service**放会自动响应(其实时tomca容器调用),在**HttpServlet**中会去分析请求方式,到底是**get****post**, **head**, 还是**delect**然后在决定调用的是哪个**do**开头的方法,那么在**HttpServlet**中这**do**方法默认是405的实现风格,我们要去重写这些方法
  4. 因此在新建**Servlet**时,我们才会去考虑请求方法,从而去决定重写哪个**do**方法

    1. // service方法
    2. // 每一个do方法都是405
    3. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. String method = req.getMethod();
    5. long lastModified;
    6. if (method.equals("GET")) {
    7. lastModified = this.getLastModified(req);
    8. if (lastModified == -1L) {
    9. this.doGet(req, resp);
    10. } else {
    11. long ifModifiedSince;
    12. try {
    13. ifModifiedSince = req.getDateHeader("If-Modified-Since");
    14. } catch (IllegalArgumentException var9) {
    15. ifModifiedSince = -1L;
    16. }
    17. if (ifModifiedSince < lastModified / 1000L * 1000L) {
    18. this.maybeSetLastModified(resp, lastModified);
    19. this.doGet(req, resp);
    20. } else {
    21. resp.setStatus(304);
    22. }
    23. }
    24. } else if (method.equals("HEAD")) {
    25. lastModified = this.getLastModified(req);
    26. this.maybeSetLastModified(resp, lastModified);
    27. this.doHead(req, resp);
    28. } else if (method.equals("POST")) {
    29. this.doPost(req, resp);
    30. } else if (method.equals("PUT")) {
    31. this.doPut(req, resp);
    32. } else if (method.equals("DELETE")) {
    33. this.doDelete(req, resp);
    34. } else if (method.equals("OPTIONS")) {
    35. this.doOptions(req, resp);
    36. } else if (method.equals("TRACE")) {
    37. this.doTrace(req, resp);
    38. } else {
    39. String errMsg = lStrings.getString("http.method_not_implemented");
    40. Object[] errArgs = new Object[]{method};
    41. errMsg = MessageFormat.format(errMsg, errArgs);
    42. resp.sendError(501, errMsg);
    43. }
    44. }

    Servlet生命周期

  5. 生命周期:从出生到死亡的过程叫做生命周期,对应servlet中的三个方法:**init()**,**service()**,**destroy()**


  1. 默认情况下:第一次接受请求时,这个**Servlet**会进行实例化(调用构造方法),初始化(**init()**),然后服务(**service()**)。第二次请求开始,每一个次都是服务(**service**),当容器关闭时,其中的所有**servlet**实例会被销毁,调用销毁方法(**destroy()**)。

  1. **Servlet**实例**Tomcat**只会创建一个,所有的请求都是这个实例去响应。默认情况下,第一次请求时,**tomcat**才会去实例化,初始化,

  1. **Servlet**初始化的时机
    1. 默认是第一次请求时:初始化
    2. 可以通过**<load-on-startup>1</load-on-startup>**来设置**servlet**启动的先后顺序,数字越小,启动越靠前,最小值0

  1. **Servlet**在容器中是单例的,线程不安全的

    Http协议

  2. Http 称为超文本传输协议

  3. Http是无状态的
  4. Http请求包含两个部分:请求和响应
    1. 请求
      1. 请求包含:1. 请求行 2. 请求头 3. 请求体
    2. 响应
      1. 响应包含:1. 响应行 2. 响应头 3. 响应体

会话

  1. 会话跟踪技术
    1. 客户端第一个发请求给服务器,服务器获取session获取不到,则创建新的,然后响应给客户端,
    2. 下一次客户端给服务器发请求,会把session带给服务器,服务器就知道你的信息 ```java request.getSession(); // 获取当前会话,没有则创建一个新的会话 request.getSession(true); // 获取当前会话,跟不带参数的效果相同 request.getSession(false); // 获取当前会话,没有则返回null,不会创建新的

HttpSession session = request.getSession(); session.getId(); // 获取sessionId session.isNew(); // 当前session是否是新的 session.getMaxInactiveInterval();// session的非激活间隔时长,默认1800秒,就是不操作的时间 session.setMaxInactiveInterval(); session.invalidate(); // session立即失效 session.getAttribute(); // 获取键值对 session.setAttribute(); // 设置键值对 ….

  1. 2. **Session保存作用域**
  2. 1. **可以往session中添加键值对,一个session可以在多个组件中访问,但得是同一个session会话**
  3. ![](https://cdn.nlark.com/yuque/0/2022/jpeg/1654103/1642857904816-fe03c560-ccdd-4c36-9474-ca9be4622e57.jpeg)
  4. ---
  5. <a name="t1A6n"></a>
  6. # 服务器内部转发和客户端重定向
  7. ```java
  8. req.getRequestDispatcher("Servlet07").forward(req,resp); // 服务器内部转发
  9. resp.sendRedirect("Servlet07"); // 客户端重定向

【Servlet】 - 图1
【Servlet】 - 图2

保存作用域

  1. request 一次请求的范围
  2. session 一次会话的范围
  3. application 一次应用程序范围


Filter过滤器

  1. Filter也是Servlet规范
  2. Filter开发步骤:新建Filter接口,然后实现其中的三个方法:init doFilter destroy,配置Filter,可以用注解,也可以使用xml文件
  3. Filter配置时,可servlet一样,也可以使用通配符
  4. 过滤器链
    1. 如果采用的时注解的方式进行配置,那么过滤器的拦截顺序时安装全类名的先后顺序排序的
    2. 如果采用的是xml的方式进行配置,那么按照配置的先后顺序*