Spring MVC基础

适配器模式:

  • web应用和servlet:之间的协议:http;
  • servlet和Java web:之间的规范:servlet;
  • 使用一个适配器接口或者抽象类,进行适配连接;
    • 利用重载方法进行保护其他方法,避免被重载;

模板方法设计模式:

  • 核心算法骨架被定义并且final不可被修改【通常是抽象类中的核心算法】;
  • 具体的实现步骤,由子类实现【增强代码复用】;

Servelet规范【由Tomcat服务器启动的时候创建】:

  • ServletConfig:一个Servlet对象对应一个ServletConfig,是Servlet对象的配置信息;

    public String getInitParameter(String name);
    public Enumeration<String> getInitParameterNames();
    public ServletContext getSerContext();
    public String getServletName();
    //同时使用适配器模式,仅需要继承Generate类继承了Servlet接口;
    
  • httpServletRequest【接口,是规范中的一员】

    • httpServletRequest接口时继承自ServletRequest接口;

    • 由Web服务器,实现,创建对象【面向接口编程,关注其中有哪些方法】;

      • 由web服务器将遵循http协议的请求进行解析,然后将数据封装到request对象中,因此根据开发者只需要关注,request有哪些方法就可以了;
    • 面向请求对象和响应对象的编程【面向接口的编程】;

      • 请求和响应的对象声明周期极短;
    • 常用方法:

      • 底层通过Map<String, String[]>进行数据存储;
      • 有两种数据:
        • 用户提交的数据url中的数据;
        • 请求域中绑定的数据【作为一个缓存使用】;
      String getParameter(String name); //获取第一个元素
      Map<String, String[]> getParameterMap();
      Enumeration<String> getParameterNames();
      String[] getParameterValues(String name);
      
      RequestDispatcher getRequestDispatcher(String path);
      //请求转发器的获取,进行转发【不会再url上显示转发】;path以不加项目名的/开始;
      
  • ServletContext:对于一个webApp,只有一个ServletContext【共享】,相当于整个xml配置文件,应用级对象【应用域】;

    • 相当于一个缓存,使用键值对的底层机制;

      public String getPath(String path); //以web为根路径;
      public String getRealPath(String);//绝对路径;
      //缓存方法
      public void setAttributr(String name, Object value);
      public Object getAttribute(String name);
      public void removeAttribute(String name);
      
  • 目前接触的缓冲机制:

    • 内存中的字符串常量池:字面量字符串先去常量池中查找,如果有,直接用,否则新建,然后放入字符串常量池中;
    • 整数型常量池:【-128- 127】一共258个Integer类型的引用;
    • 连接池:数据库的连接池;
    • 线程池:多线程的使用;
    • redis:缓存数据库;
    • ServletContext:应用域;
    • http中的get具有缓存;
      • 任意一个get请求的都会被缓存起来;
      • 一个get请求路径,对应 一个资源;
      • 先从缓冲中查找,然后在从服务器中获取;
  • Tomcat服务器日志:

    • 服务器终端java运行程序的控制台信息【终端日志】;
    • ServletContext对象的log()方法记录的日志信息【log方法日志】;
    • 访问日志信息【访问日志】;
  • Http协议【共同规范:超文本传输协议】:

    • http的请求协议:
      • 请求行
        • 请求方式
        • uri
        • 协议版本号;
      • 请求头
      • 空白行【分割头和体】
      • 请求体
        • POST和GET方法有区别;
    • http的响应协议:
      • 状态行
        • 协议版本号;
        • 响应状态码;
        • 状态描述信息;
      • 响应头
      • 空白行【分割头和体】
      • 响应体
  • 资源的跳转:

    • 转发:
      • 本质上是一次请求,由服务器自动向相同项目的其他资源再次发出请求,两者是共同的请求对象和响应对象;
        • 可以将一个资源通过请求对象的Cache带到另一个对资源中;
        • 同时前端服务器,是不知道转发的操作【是一次请求】;
        • 整个过程中,请求方法相同;
    • 重定向:
      • 本质上是多次请求,由服务器告知前端资源路径【包括项目名】,然后前端自动再次发起请求;
      • 是前端发起的,每次请求对象和响应对象都不同【前端地址栏会发生变化】;
      • 当资源在其他项目时,必须重定向;
      • 前端通过地址栏进行重新请求,所以是get方法请求;
    • 两者之中,刷新地址栏,由会形成一次请求【转发容易发出过多的请求,比如数据插入等】;
    • 只有当请求作为Cache时,作为转发,否则使用重定向;

JSP:

  • 是一套javaEE的13个子规范之一,所有web前端都遵守这套规范;

  • 实际是一个翻译引擎,将jsp内容翻译为java语言,然后将编译为class,最后执行,其中java语言主要是继承了HttpServlet类;

  • 翻译的内容主要在Servlet的Service方法中;

  • 前端和后端的连接;

  • 因为html只能是静态的网页,无法做到动态变换;

  • 因此使用java做数据处理【通过请求方法】,转发,使用jsp做动态页面展示【通过Service方法】;

  • Session:

    • 会话在服务端存在一个java对象叫:session;

    • 一个会话包含多次请求和响应;

    • Http是一种无状态协议,Session是为了保留会话状态;

      • Context【应用域】:生命周期太长;
      • Request【请求域】:生命周期太短;
      • Session【会话域】:保留会话状态;
      • 在域中可以Cache数据;
    • Session是web项目的一个规范;

      • 类似于redis的有超时的键值【id - value】对;
      • 第一次请求时,服务器会创建对应的session对象,并将id发送给游览器【第二次不会】,且保存在内存中;
        • 当关掉游览器时,内存中的id会被清理;
      • 第二次请求时,会自动将id发送给服务端,服务器端进行查询对应的session;
      • cookie: JSESSIONID=""
        • 存在的主要原因【Cache】:
          • Session是存在于服务器端的会话【是实例化对象】;
          • cookie是存在于用户端的会话;
            • 存放于硬盘或者内存;
            • 任意cookie都是由键值对组成 + 关联路径;
            • 其中一个键值对是:Jsessionid;
          • 两者都是http的协议的一部分;
          • 游览器发送请求的时候,会自动携带该路径下【当前路径及其子路径】的cookie【自动】
          • cookie的过期时间设置为:0,表示删除游览器对应的cookie;
          • 默认关联路径:为当前路径的父路径,及其子路径;
      jakarta.servlet.http.HttpSession;
      
  • URL重写机制:url/session;jseesionid=;

    • cookie禁用了,采用URL重写,直接在URL连接中加入jseesion键值对;
  • Servlet域【范围从小到大】

    • 页面域;

    • 请求域;

    • 会话域;

    • 应用域;

      ${user}:从小到大的域中取数据,调用对应get和toString方法;

  • 过滤器的生命周期和Servlet相同,是Servlet规范的一员;

    • servlet对象在启动的时候,不会创建对象;
    • filter对象则会在启动的时候创建【拥有方法相同】;
    • 两者都是单例模式;
    • filter对象的优先级比servlet优先级【类比于AOP的环绕通知】;
    • 多个filter的先后顺序类似于栈的数据结构;
      • 当没有指定顺序时,使用类名字符串的字典顺序进行先后执行;
  • 责任链设置模式【在运行阶段动态的确定调用关系】:

    • 编译阶段就确定了调用关系【对象或者方法】;
      • 当改变顺序时,需要改源代码,违背了OCP原则;
    • filter是在运行阶段动态确定调用关系;
      • 怎么实现?调用顺序在xml配置文件中确定【filter偏向于配置文件,而不是注解】;
  • Listener监听器,是Servlet规范的一员;

    • 本质是Servlet留给开发人员的后门,在某个时刻执行某段代码;
      • 类似于静态代码块,【在类加载的时候,有执行代码的需要时机】
    • 监听类,由web服务器生成和创建【发成时机时候】。
      • 会跟随被监听的对象一同创建【init】和销毁【destroy】;
      • 通常使用用来判断条件,然后通过域传递数据;
posted @ 2025-07-23 22:01  烟雨断桥  阅读(8)  评论(0)    收藏  举报