Java面试题

1. GET 和 POST 区别
    GET
        1. 请求数据形式是通过 URL 参数明文传递
        2. 请求数据容量有限制 2KB 
        3. 请求数据速度快,安全性一般
        4. 常用于搜索,查询操作
    POST
        1. 请求数据是通过 Form Data 请求实体提交数据到目标资源
        2. 请求数据容量没有限制,可以用于文件上传操作
        3. 请求数据速度较 GET 稍慢,安全性略高
        4. 常用于 更新操作(添加,删除,修改)

2. CSS 的三种引入方式
    1. 外联
        外部 CSS 文件,可以是本机服务器资源,也可以是网络资源
        在 head 标签中使用 link 标签引入对应的 CSS 样式文件
        <link rel='stylesheet' href='css文件路径'>
    2. 内联
        在 head 标签中使用 style 标签定义 HTML 页面内部 CSS 样式
    3. 行内
        html 标签的 style 属性作为 CSS 样式

3. CSS 常用选择器
    id  选择器    #开头之后是 id 属性值,id 属性值在当前 HTML 页面中唯一
    class 选择器  .开头之后是 Class 属性值,常用!!!并且运行 HTML 标签多个 class 属性
    标签选择器     直接使用标签名约束限制
    并集   多个选择器之间使用 , 隔开
    层级   多个选择器之间使用空格隔开,要求选择器对应的 HTML 标签层级结构必须符合 CSS 选择约束
    属性   利用 HTML 标签的属性名称,也可以加入属性值约束 input[type='text'] input[type]
    伪类   常用 :link :active :hover :visited a 标签适配,对应 a 标签状态,同时
            部分可以用于其他 HTML 标签

4. form 表单 action 和 method 属性
    action 用于明确当前数据的提交目标资源路径,资源名称
    method 是明确当前提交数据的形式和方法 GET POST Rest风格~~~

5. JDBC PreparedStatement 操作 SQL 语句执行更新语句流程
    1. 准备数据库连接的必要资源内容 jdbcUrl username password
    2. 准备数据库连接必要的资源变量 Connection PreparedStatement
    3. 加载驱动
    4. 获取数据库连接对象
    5. 明确 SQL
    6. 预处理 SQL 语句得到 PreparedStatement 对象
    7. 给予 SQL 语句参数赋值操作
    8. 执行 SQL 语句,得到 SQL 语句执行对应数据表的影响行数
    9. 关闭资源
    
6. 接口带有自定义泛型,泛型对应具体数据类型有那些约束方式
    1. 自由模式
        实现类和接口声明同名泛型,在实例化对象过程中,约束泛型对应的具体数据类型
    2. 气管炎模式
        实现类遵从接口时,接口直接明确泛型对应的具体数据类型    

7. 数据库事务的特征
    原子性(Atomicity):事务是一个原子操作,要么全部执行成功,要么全部回滚到初始状态,不会出现部分执行的情
    况。
    一致性(Consistency):事务执行前后,数据库的数据都必须保持一致性状态,即数据库从一个一致性状态转移到另一
    个一致性状态。
    隔离性(Isolation):事务之间应该是相互隔离的,每个事务都应该感觉不到其他事务的存在。
    持久性(Durability):事务一旦提交,其结果就应该是永久性的,即使系统发生故障也不应该丢失。


8. 数据库事务操作相关 SQL 
    set autocommit = 0; 
    rollback; 回滚 SQL 语句范围是 set autocommit = 0;  或者 commit 之后的 SQL 
    commit; 提交 SQL 语句,提交的 SQL 语句范围是  set autocommit = 0;  或者 rollback 或者 commit
    set autocommit = 1;
 
9. static 修饰静态代码块特征
    1. 类文件加载阶段,static 修饰的静态代码块一定执行
    2. static 修饰静态代码块尤其只能使用类内静态成员变量和静态成员方法
    3. 不可以使用非静态成员
    4. static 修饰的静态代码块,常用于项目启动初始化操作,可以加载配置文件,加载驱动,加载相关资源

10. 接口声明自定义泛型,可以用于那些内容,怎么约束泛型对应的具体数据类型
    可以使用接口声明自定义泛型的有且只能是接口中的成员方法,和默认方法。
    

    interface A<T> {
        T test(T t);
    }
    泛型对应的具体数据类型有两种形式进行数据约束
        1. 类遵从接口时,接口对应的泛型位置直接明确泛型对应的具体数据类型
            class TypeA implements A<String> {
                @Override
                public String test(String t) {...}
            }
        2. 类遵从接口时,声明和接口一致的泛型占位符,需要通过实例化对象约束泛型对应的具体数据类型
            class TypeB<T> implements A<T> {
                @Override
                public T test(T t) {...}
            }
            
            TypeB<String> t1 = new TypeB<>();
            TypeB<Demo1> t2 = new TypeB<>();

11. 反射获取 Method 对象方法和执行 Method 方法
    Method getMethod(String methodName, Class... parameterTypes);
    Object invoke(Object obj, Object... parameterValues);

12. 反射获取 Class 对象的三种方式
    Class.forName(String packageAndClassName);
    类对象.getClass();
    类名.class;

13. 数据库事务操作相关 SQL 语句
    开启事务,关闭自动提交
        set autocommit = 0;
    回滚 SQL 操作,回滚到 set autocommit = 0; 或者上一个 commit 之间所有的 SQL 语句操作
        rollback;
    提交 SQL 语句,提交的内容是  set autocommit = 0; 或者上一个 rollback 之间的 SQL 语句
        commit;
    关闭事务,开启自动提交
        set autocommit = 1;
        

14. 数据库常用的数据约束有那些,对应的关键字
    非空 NN not null
    默认 default
    唯一 UNI unique
    主键 PRI primary Key
    自增长 AI auto_increment
    外键 FK Foreign key

15. StringBuffer 和 StringBuilder 的区别
    1. StringBuffer 和 StringBuilder 都是可变长字符串结构,底层数据存储使用 char 类型数组,默认容量为
    16
    2. StringBuffer 操作相关方法,都是非静态同步修饰方法,线程安全性较高,但是效率低
    3. StringBuilder 操作相关方法没有任何的限制,效率高,但是线程安全性较低。

16. PreparedStatement 操作 SQL 语句查询流程
    1. 准备数据库连接相关的数据 jdbcUrl username password
    2. 准备 JDBC 操作相关资源变量
    3. 加载驱动
    4. 通过 DriverManager 获取数据库连接对象
    5. 确定目标执行 SQL 语句
    6. 数据库连接对象预处理 SQL 语句,得到 PreparedStatement 对象
    7. 给予 PreparedStatement SQL 参数赋值操作
    8. 通过 PreparedStatement 执行目标 SQL 语句,得到 ResultSet 结果集
    9. 解析结果集操作
    10. 关闭资源
    
17. 泛型在类声明的使用要求和限制要求

    类声明泛型有且只推荐使用在类内非静态成员方法
    泛型对应的具体数据类型由实例化对象约束

18. DML DQL DDL DTL DCL 是什么
    DML 数据操作语句 例如 select insert delete update
    DQL 数据查询语句 特指 select
    DDL 数据定义语句 创建数据表,数据库
    DTL 数据事务语句 
    DCL 数据控制语句,用户角色,用户权限,用户范围

19. form 表单 action 和 method 属性概述
    action 提交数据目标资源路径,资源名称
    method 提交数据的方式,常见方式 GET POST
    
21. PreparedStatement 操作 SQL 语句完成查询操作的流程
    1. 准备必要的 JDBC 连接资源 jdbcUrl username password
    2. 准备 JDBC 操作相关资源变量 (Connection PreparedStatement ResultSet)
    3. 加载驱动
    4. 获取数据库连接对象
    5. 准备 SQL 语句
    6. 通过 Connection 预处理 SQL 语句得到 PreparedStatement
    7. 给予 PreparedStatement 对象 SQL 语句参数赋值操作
    8. 执行 SQL 语句,得到 ResultSet 查询结果集
    9. 解析 ResultSet 结果集元数据,结果集获取数据内容
    10. 关闭资源 Connection PreparedStatement ResultSet
    
22. PreparedStatement 和 Statement 区别

    1. PreparedStatement 是 Statement 子接口
    2. PreparedStatement 可以有效的防止 SQL 注入问题
    3. PreparedStatement 在批量操作完成数据添加,效率高于 Statement
    
23. SQL 分页查询语句

    limit (pageCount - 1) * itemCount, itemCount
    
24. 方法声明自定义泛型和泛型何时确定具体数据类型 举例说明

public static <T> T getType(T t) {
    return t;
}

main() {
    /*
    public static <T> T getType(T t) ==>
    public static <String> String getType(String t);
    */
    String s = getType("123");
}
        
25. input标签常用type属性和对应作用
    text 可视化文本【缺省属性】
    password 密文
    radio 单选,要求单选对应的 input 标签,name 属性必须一致
    checkbox 多选,要求 input 标签 name 属性必须一致,多选数据到后端是一个 String[]
    file 文件
    data 日期
    time 时间
    submit 提交按钮
    hidden 隐藏传递
    reset 重置
    tel   电话
    email 邮箱
    number 数值

26. List集合常用方法
    增
        add(E e);
        addAll(Collection<? extends E> c);
        add(int index, E e);
        addAll(int index, Collection<? extends E> c);
    删
        E remove(int index);
        remove(Object obj);
        removeAll(Collection<?> c);
        retainAll(Collection<?> c);
        removeIf(Predicate<? super E> filter)
        clear();
    改
        E set(int index, E e);
    查
        int size();
        boolean isEmpty();
        boolean contains(Object obj);
        boolean containsAll(Collection<?> c);
        Object[] toArray();
        int indexOf(Object obj);
        int lastIndexOf(Object obj);
        E get(int index);
        List<E> subList(int formIndex, int toIndex);
        
27. 函数式接口要求

    1. 使用 @FunctionalInterface 约束接口
    2. 要求接口中有且只有一个尚未完成的 abstract 修饰方法

28. 举例说明Java有参数有返回值lambda

interface Predicate<T> {
    boolean test(T t);
}

main() {
    ArrayList<String> list = new ArrayList<>();
    
    // 添加元素操作
    list.add(...);
    
    list.removeIf(s -> s.length() > 5);
    
    List<String> list1 = list.stream
        .filter(s -> s.length() > 5)
        .collect(Collectors.toList());
}

29. JS 获取 HTML 对象的方式和方法
    通过 HTML 标签 id 属性获取对应的 HTML 对象
        document.getElementById();
    通过 HTML 标签的 class 属性获取对应的 HTML 对象数组/集合
        document.getElementsByClassName();
    通过 HTML 标签名称获取对应的 HTML 对象数组/集合
        document.getElementsByTagName();

30. JS 设置 HTML 标签属性方法
    setAttribute(attributeName:string, value:string);
    div.setAttribute('class', 'darkModel');

31. JS 设置 HTML 标签对象CSS样式
    HTML标签对象.style.css样式 = 样式对应数据
    div.style.fontSize = '32px'; // 设置当前 div 标签 font-size 字体大小 32 px

32. JS 获取 input 用户输入的数据
    input HTML对象.value

33.Javascript常见的事件有那些 
    onclick
    onmousemove
    onmouseover
    onmouseleave
    onmouseout
    onkeyup
    onkeydown
    onchange
    onload
    
34.Javascript 引入事件的形式有那些

    1. HTML 标签利用 事件属性引入对应事件操作,需要提供事件对应的方法
    2. 利用 addEventListener(event:string, function:object);
        btn1.addEventListener('click', changeDiv)

35. List和set集合区别
    List
        有序  添加顺序和存储顺序一致
        可重复 元素内容可以重复出现
    Set    
        无序 添加顺序和数据存储顺序不一致
        不可重复 不允许出现相同元素

36. Servlet 处理 GET 和 POST 请求对应的方法
    doGet(HttpServletRequest req, HttpServletResponse resp) 
    doPost(HttpServletRequest req, HttpServletResponse resp) 
    
37. 用户请求对应的是哪一个对象,响应对应的是哪一个对象
    用户使用 HTTP 协议请求资源到 Tomcat ,Tomcat 处理之后的对象是
    HttpServletRequest 对象,同时绑定创建对应的请求的 HttpServletResponse 对象

38. Servlet 资源注册名称有那些形式,对应请求 URL
    精准匹配
        要求限制当前资源的名称
        /a /b /c
        url
            http://localhost:8080/a
            http://localhost:8080/b
            http://localhost:8080/c
    模糊匹配
        仅要求请求资源结尾为 .do 或者 .action 
        路径不限制,资源名称不限制
        *.do *.action
        url
            http://localhost:8080/aaa/bbb/cc.do
            http://localhost:8080/aaa/bbb/cc.action
    路径匹配
        /user/add /user/info /user/orderDetail
        url
            http://localhost:8080/user/orderDetail
            http://localhost:8080/user/info
            http://localhost:8080/user/add

39. web.xml 配置 Servlet 格式,完整的 XML 文件内容

<servlet>
    <!-- Servlet 程序对应的名称,在整个 web.xml 文件中唯一 -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- Servlet 程序对应的完整的包名.类型,提供给 Tomcat 服务器作为实例化 Servlet 对象操作使用 -->
    <servlet-class>com.qfedu.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <!-- 对应 Servlet 标签中的 servlet-name 匹配 -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- 注册当前 Servlet 在 Tomcat 服务器中资源名称 -->
    <url-pattern>/first</url-pattern>
</servlet-mapping>

40. 接口定义规范和要求
    interface 接口名 {
        成员变量 public static final
            定义时必须初始化
        成员方法 public abstract
            方法不能有方法体
    }

41. 转发和重定向区别
    转发
        1. 转发操作是服务器行为
        2. 转发操作用户有且只请求一次
        3. 转发操作后续的资源可以获取到用户的请求数据内容
        4. 转发操作有且只能方法服务器内部资源
        5. 转发操作可以在转发涉及到的资源中使用 Request 对象 Attribute 添加数据
        6. 用户请求 URL 不变
    
    重定向
        1. 重定向是浏览器行为或者客户端行为    
        2. 重定向操作用户请求多次
        3. 重定向操作下一次请求不会带有用户上一次的请求数据
        4. 重定向操作可以访问服务器内部资源,也可以访问服务器外部资源
        5. 重定向操作用户请求 URL 改变
    

    
    
42. Servlet url-pattern 资源名称规则

    1. 精准匹配
        /a 
        url 
            http://ip:port/a
    2. 模糊匹配
        *.do
        url
            http://ip:port/add.do
            http://ip:port/delete.do
            
    3. 路径匹配
        /user/orderDetail /student/score
        url
            http://ip:port/user/orderDetail
            http://ip:port/student/score
    资源名称不可以重复!!!
    
43. 字符串操作相关方法

    查
        int length();
        int indexOf(String str);
        int indexOf(int ch);
        int lastIndexOf(String str);
        int lastIndexOf(int ch);
        char charAt(int index);
    
    判断
        boolean endsWith(String str);
        boolean startsWith(String str);
        boolean contains(String str);
        boolean isEmpty();
        boolean equals(Object obj);
        boolean equalsIgnoreCase(String str);
    
    转换
        String(char[] arr);
        String(char[] arr, int offset, int length);
        static String valueOf(char[] arr);
        static String valueOf(char[] arr, int offset, int length);
        char[] toCharArray();
    
    其他
        String toUpperCase();
        String toLowerCase();
        String replace(char oldChar, char newChar);
        String[] split(String str);
        String substring(int begin);
        String substring(int begin, int end);
        String trim();
    
44. HttpServletRequest 中 parameter 和 Attribute 的区别
    parameter 是用户请求参数内容,用户提交参数都是键值对类型,有两种形式 String=>String String=>String[]
    
    attribute 是 Request 对象中的属性内容,可以认为是 Map 双边队列,内部数据为<String, Object>
    要求属性名必须是 String 类型,存储数据类型不限制,可以用于转发操作中间资源添加数据
    
45. 数据库常用数据约束

    NN not null
    Def default
    UNI unique
    PRI primary key
    AI auto_increment
    FK foreign key

46. Servlet 获取用户请求参数的相关方法
    有三个常用的方法,通过 HttpServletRequest 对象调用
        String getParameter(String name);
        String[] getParameterValues(String name);
        Map<String, String[]> getParameterMap();

47. 转发操作资源之间数据传递的方式和相关放方法
    void setAttribute(String name, Object value):在请求域中设置指定名称的属性值。
    
    Object getAttribute(String name):返回请求域中指定名称的属性值,如果不存在则返回 null。

     request.getRequestDispatcher("/index.html").forward(request, response);

48. Servlet 配置参数有哪些
    

    servlet初始化参数
    Tomcat开机自启参数
    url-pattern参数
    
49. JS获取 HTML 对象方法

    1.document.getElementByID();
    2.document.getElementsByClassName();
    3.document.getElementsByTagName();

50. Cookie 和 Session 的区别
    Cookie    
        1. 会话控制,浏览器技术
        2. cookie 数据有且只支持键值对形式数据,并且键值要求都是字符串形式,不建议支持中文,同时不允许使用空
        格
        3. Cookie 数据有容量限制,一般在 2KB ~ 4KB
        4. Cookie 可以根据有效路径,在浏览器发送请求到服务器资源,自动提交对应的 Cookie 数据
        5. Cookie 可以设置生命周期
            -1 表示临时 Cookie ,浏览器关闭失效
            0 表示销毁同名 Cookie
            正数 当前 Cookie 有效时间,单位为 秒
        
    Session
        1. 会话控制技术,服务器技术
        2. Session 使用 Attribute 属性存储数据内容,存储方式为键值对方式,键要求为字符串类型,值为 Object 
        类型,支持存储任意数据类型
        3. Session 数据容量没有上限,但是一般存储较为重要的数据,例如 用户名称,用户 id,用户权限,用户角色
        4. Session 可以设置有效时间,单位是秒
        5. Session 要求浏览器存储对应的 Cookie 数据,在默认情况下 Tomcat 服务器要求 
        Cookie-name:JSESSIONID, Cookie-value: 对应 Session 对象的 ID
    
51. 过滤器链的放行顺序和响应顺序
    如果按照注解方式配置 Filter 过滤器,过滤器会按照字典顺序控制过滤顺序
    例如:
        A B C 三个过滤
        过滤放行顺序是 A B C
        响应的反馈顺序 C B A

52. 过滤器路径限制规则,举例说明
    A @WebFilter("/user")
    B @WebFilter("/user/detail")
    C @WebFilter("/*")
    
    资源               过滤器
        /user          A C
        /user/detail   A B C
        /student       C
    
    资源注册名称.contains(过滤器限制路径) 
        true 当前过滤器限制
        false 当前过滤器不限制

53. Cookie 路径限制规则,举例说明
    A path("/user")
    B path("/user/detail")
    C path("/")
    
    资源          带有的 Cookie
    /user        A C
    /user/detail A B C
    /index       C
    
    资源注册名称.contains(Cookie有效路径)
        true Cookie 提交到当前资源
        false Cookie 不提交

54. jQuery Ajax 提交的封装方法和格式说明
    // POST 请求
    $.post(
        url, // 请求资源路径
        data, // 提交的数据内容,推荐是 JSON 格式
        function // 请求成功之后对应响应数据的处理
    );
    // GET 请求
    $.get(
        url,
        data,
        function
    );
    
    $.ajax({
        url: 请求资源路径,
        type: 请求数据方式 GET or POST,
        data: {}, 提交数据内容
        contentType: "提交数据类型 Application/json",
        success: function(ret) {    
            // 提交成功之后,有响应对应的成功方法
        },
        error: function () {
            // 提交失败,对应的错误方法
        },
        dataType: "JSON"
    })

55. MyBatis 动态 SQL 和对应的特征
    <sql id="唯一名称"> 声明一段 SQL 语句代码,方便后期的使用
        <include refid="唯一名称">
    <if test="进行条件判断">
        满足条件,SQL 语句拼接 if 标签内 SQL 语句段
    <where>
        1. 会自动补齐 where 关键字
        2. 会自动忽略 and | or 前缀
    <set>
        1. update 更新语句中会自动补齐 set 关键字
        2. 会自动忽略语句的尾缀 , 
    <trim>
        替换 where 和 set
        指定前缀,指定后缀,指定忽略前缀(and | or), 指定后缀忽略(,)

56. MyBatis 参数绑定方式有那些
    1. 序号绑定
        #{arg0} #{arg1}
    2. @Param("指定参数名称")
        #{指定参数名称}
    3. JavaBean 和 Map 数据根据成员变量名称或者 Map 中的 key 值
        绑定对应采纳数
        #{username}

57. ArrayList 集合特征
    1. 底层结构为 Object 类型数组
    2. ArrayList 增删慢,查询快
        增删慢,【核心 移动问题,扩容问题,缩容问题】
        查询快, 数组+下标方式可以直接获取对应元素在内存中的地址,CPU 寻址可以直接获取
    3. 扩容【流程】

58. LinkedList 集合特征
    1. 底层数据存储结果为双向链表
    2. 增删快,查询慢
        在 LinkedList 中一般会围绕头尾结点进行数据增删改操作,
        适用于 数据库连接池,线程池,消息队列
    3. LinkedList 容量在 int 范围以内

59. 静态同步方法和非静态同步方法,锁对象情况和限制范围
    静态同步方法,锁对象是当前类对应的 Class 对象
        静态同步方法任意方法被线程执行,所有静态同步方法都无法执行
    非静态同步方法 调用当前方法的实例化对象
        非静态同步方法尤其限制当前对象调用其他相关的非静态同步方法,不影响其他线程
    
60. Servlet 生命周期和相关方法
    1. 当前 Servlet 程序的构造方法
    2. init(ServletConfig) 初始化
    3. service(ServletRequest, ServletResponse) 服务核心方法
    4. destroy 销毁
61. MyBatis 常用的注解有那些
    @Mapper
    @Select
    @Update
    @Insert
    @Delete
    @Results(
        id="resultsID",
        value = {
            @Result(property="", column="")
        }
    )
    @ResultMap("resultsID") 可以引入 注解配置的映射关系也可以引入 XML 文件的映射关系
    
62. 自定义类型 resultMap 标签映射关系重点属性和内容

<resultMap id="resultMapId" type="对应类型的完整包名.类名">
    <id property="" column=""/>
    <result property="" column=""/>
</resultMap>

63. 一对一 resultMap 和 一对多 resultMap

<resultMap id="resultMapId" type="对应类型的完整包名.类名">
    <id property="" column=""/>
    <result property="" column=""/>
    
    <association property="" javaType="">
        <id property="" column=""/>
        <result property="" column=""/>
    </association>
</resultMap>

<resultMap id="resultMapId" type="对应类型的完整包名.类名">
    <id property="" column=""/>
    <result property="" column=""/>
    
    <collection property="" ofType="">
        <id property="" column=""/>
        <result property="" column=""/>
    </association>
</resultMap>

64. Spring bean 注册 XML 格式
    <bean id="Spring配置文件中唯一的名称" class="对应类型的完整包名.类名">
65. Spring DI 依赖注入的 XML 配置形式

<bean id="student" class="com.qfedu.entity.Student">
    <!-- 基本类型 -->
    <property name="id" value="1"/>
    <property name="name" value="张三"/>
    <property name="age" value="1"/>
    <property name="birth" value="2000/01/01"/>
    
    <!-- 容器注入 Array List Set Map Property -->
    <property name="hobbies">
        <arrray>
            <value>篮球</value>
            <value>台球</value>
            <value>乒乓球</value>
        </arrray>
    </property>
    
    <property name="nicknames">
        <set>
            <value>法外狂徒</value>
            <value>张某某</value>
            <value>张某</value>
        </set>
    </property>
    
    <property name="phones">
        <list>
            <value>133333333333</value>
            <value>111111111111</value>
            <value>122223333233</value>
        </list>
    </property>
    
    <property name="address">
        <map>
            <entry key="省" value="河南省"/>
            <entry key="市" value="郑州市"/>
        </map>
    </property>
    
    <property name="level">
        <props>
            <prop key="今日说法上线次数">2</value>
        </props>
    </property>
</bean>

66. 简述工厂模式流程
    1. 配置文件
    2. 读取配置文件配置
    3. 根据配置文件指定的包名.类名获取 Class 对象
    4. 获取指定类型的实例化对象
    getBean(String beanName)

67. Spring IOC 概述
    IOC 控制反转,由原本用户管理/实例化/创建的对象,交给 Spring 管理。
    Spring 工厂 ==> 工厂模式
    
68. Spring DI 概述

    DI 依赖注入,在实例化对象之后,Spring 可以自动将数据注入到对象中,可以采用 Setter ,构造方法和自动注入方式注入数据
    <bean id="student" class="com.xxx.entity.Student">
    <property name="id" value="1"/>
    <property name="username" value="张三"/>
    <property name="age" value="16"/>
</bean>

69. Spring AOP 概述和流程
    AOP 面向切面编程。需要明确增强规则,切入点和组装关系。
    增强形式:
        前置增强
        后置增强
        环绕增强
        异常抛出增强
    切入点:
        <aop:pointcut id="pc_01" expression="execution(切入点规则)"/>
    组装
        <aop:advisor pointcut-ref="pc_01" advice-ref="增强类对应的bean标签名称"/>

70. Spring 事务操作流程
    1. 导入 Spring-tx
    2. 注册 Spring-tx 
        id=tx
        class=DataSourceTransactionManager
    3. <tx:advice>
            <attributes>
                <tx:method name="">
            </attributes>
       </tx:advice>
    4. aop 组装 tx 事务和指定方法
    
71. 脏读,幻读,不可重复读分别是什么

    脏读   A事务 读取 B事务 尚未提交的数据内容,B 事务提交之后,A事务数据内容和真实数据内容不同。
    幻读   A事务在整个周期中有两次查询,B 事务在A事务两次查询之间修改了数据内容,导致 A 读取到的数据内容两次不一致
    不可重复读
        A事务在整个周期中有多次查询,B事务在 A 事务查询之间修改的数据内容,导致 A 事务多次查询数据结果内容不同
    
72. MyBatis resultMap 标签配置举例说明

<resultMap id="resultMapId" type="对应 Java 类型">
    <id property="成员变量名称" column="数据表字段名称"/>
    <result property="成员变量名称" column="数据表字段名称"/>
</resultMap>

73. 举例说明有参数有返回值 Lambda

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

List<Integer> list = {...};

/*
*/
list.sort((n1, n2) -> n1 - n2);

74. Spring Bean 生存周期
    单例模式
        适合于 工厂,Service,Dao
        Spring 工厂构建 --> 单例对象构造方法 --> 注入(Setter 构造方法注入)
        --> init-method --> 对象对应的相关功能执行 --> Spring 工厂销毁(destory-method)
    多例模式
        实体类
        Spring 工厂构建 --> 多例对象由工厂在使用时创建 --> 注入(Setter 构造方法注入)
        --> init-method  --> 对象对应的相关功能执行 --> JVM GC 机制销毁对应对象
        
75. 单例模式两种代码实现方式

// 饿汉模式,Spring 管理 Bean 默认方式。
public class SingleTonObject {
    private static final SingleTonObject single = new SingleTonObject();
    
    private SingleTonObject() {}
    
    public static SingleTonObject getInstance() {
        return single;
    }
}

// 懒汉模式
public class SingleTonObject {
    private static SingleTonObject single = null;
    
    private SingleTonObject() {}
    
    public static synchronized SingleTonObject getInstance() {
          if (null == single) {
            single = new SingleTonObject();
        }
        
        return single();
    }
}

76. Spring 常用注解
    Bean 注册
        @Controller  控制层
        @Service     服务层
        @Repository  Dao层/数据持久化层
        @Component   注册对应的到 Spring 中
        @Scope       控制单例还是多例模式,默认单例 多例 prototype
    DI 注入
        @Autowired  根据数据类型注入对应的对象
        @Resource   根据名称注入目标数据
        @Qualifier() 需要和 Autowired 连用,指定名称
        @Value 注入基本数据类型和 String
    事务
         @Transactional
    AOP
        @Aspect
        @Before
        
    
77. IOC 和 DI 概述

    IOC 控制反转,将 Java 对象注册给 Spring 工厂,Spring 工厂会根据所需自行实例化对象操作、
    DI 依赖注入,当 Bean 对象实例化之后,Spring 工厂可以利用 Setter 注入,构造方法注入方式给予成员变量赋值
    属性数据内容

78. AOP 配置流程(XML or Annotation)
    1. 声明增强类
        <bean id="xxxAdvice" class=""/>
        @Aspect
    2. 指定增强规则/定制切入点
        <aop:config>
            <aop:pointcut id="pc_01" expression="execution(XXX)">
        </aop:config>
        
        AOP 实现类中使用一个方法作为切入点名称
        @Pointcut("execution(XXX)")
        public void pointcut() {}
    
    3. 组装切入点和增强
        <aop:config>
            <aop:pointcut id="pc_01" expression="execution(XXX)">
            <aop:advisor advice-ref="XXXAdvice" pointcut-ref="pc_01"/>
        </aop:config>
        
        @Before("pointcut()")
        public void before(JoinPoint joinPoint) {}

79. MyBatis @Results 注解有那些属性
    @Results(
        id="resultsId",
        value = {
            @Result(property="", column=""),
            @Result(property="", column=""),
            @Result(property="", column="")
        }
    )

80. @RestController @ResponseBody @RequestBody 分别是什么
    @RestController 告知 Spring MVC 当前类为 Controller 同时要求方法返回值类型全部自动转换为 JSON 格式    @ResponseBody 约束方法,Spring MVC 会将方法的返回值转换为 JSON 格式
    @RequestBody Controller 收到前端提交的 JSON 格式,Spring MVC 会自动转换数据到参数目标类型

81. Spring 常用注解
    bean 注册
        @Controller
        @Service
        @Repository
        @Component
        @Scope
        
    DI 注入
        @Resource
        @AutoWired
        @Value
        @Qualifier
    
    事务
        @Transactional
    AOP
        @Aspect
        @Before
        @After
        @AfterReturning
        @Around
        @PointCut

82. Spring MVC 注入资源名称使用的注解
    @RestController
    @RequestMapping("/test")
    public class TestController {
        @RequestMapping("/test1")
        public User test1() {
        
        }
    }

83. MyBtais 常用注解
    @Mapper
    @Select
    @Delete
    @Update
    @Insert
    @Results
        @Result

84. ajax 模版

$.ajax({
    url: "请求目标地址路径",
    data: 提交数据内容,
    method: 提交方式方法 GET POST DELETE PUT OPTION,
    contentType: "application/json;charset=utf-8",
    dataType:"json",
    succuss: function (ret) {
    
    },
    error: function () {
        
    }
})

85.Request Session 和 Application 域对象对应的数据影响范围 Request 是针对于用户的一次请求行为,只在转发过程中涉及到的所有资源,都可以使用 Request 中存储的数据内容 Parameter 和 Attribute Session 是针对于当前用户的访问所有资源内容,在不同的页面,资源直接跳转,可以从 Session 获取目标数据内容

Application 是针对于整个 JavaWEB Application 项目的配置信息,和用户无关

86. Spring MVC 收参方式
    1. 根据参数名称收参,针对于基本数据类型和 String
        请求方式 GET POST,要求提交的数据形式非 JSON 格式
        GET 请求 URL 参数传递,通过 POST 请求实体传递
        http://localhost:8080/test/test1?id=1&name=张三
    
    2. 实体类
        Spring 自动分析用户提交的数据内容,转换为  JavaBean 对象,提交的数据形式非 JSON 格式
    3. 数组
        针对于多选情况,会根据提交的参数明显,将数据转换为目标类型数组,提交数据形式非 JSON 格式
    4. Map 双边队列
        要求补充注解 @RequestParam,数据提交形式非 JSON 格式
    5. 路径参数
        /test/{id}/{username}
        test(@PathVariable("id") int id, @PathVariable("username") String username)
        对应后续的 RESTful 开发风格
    
    提交数据形式为 JSON 格式
        @RequestBody 让 Spring 解析对应的 JSON 格式数据内容

87. 拦截器和 Filter 的区别
    Filter 
        1. JavaWEB 组件
        2. Filter 默认过滤所有的资源,需要通过条件修改,放行相关的静态资源
        3. 过滤器作用顺序
            请求 ABC 响应 CBA
    Interceptor 
        1. Spring MVC 框架中的组件,如果没有 Spring MVC 无法使用拦截器
        2. Interceptor 自动放行静态资源 HTML CSS JS IMG JSP
        3. Interceptor 作用顺序
            请求 ABC 响应 CBA 销毁 CBA
            
88. Spring MVC 转发和重定向操作要求

    利用 Spring MVC 自身转发和重定向操作形式
    转发:
        forword:服务器内部资源
            可以利用 Request 和 Session 进行数据的传递
    重定向:
        redirect:可以是服务器内部资源,也可以是外部资源
            在服务器内部资源中,有且只可以通过 Session 进行数据的传递 
        
89. Spring 事务流程
    1. pom 文件导入 Spring-tx 支持
    2. Spring bean 注册 事务管理器 DataSourceTransactionalManager
    3. 通过
        <tx:advice>
            <tx:attributes>
                <tx:method name="query*" 隔离机制,传播限制,超时时间,回滚异常,是否只读/>
            </tx:attributes>
        </tx:advice>
    4. 使用 AOP 组装事务和方法直接的关系
    
90. Spring AOP 流程

    1. 完成增强类
    2. Spring bean 注册增强类
    3. aop config 定义 pointcut 切入点
    4. aop config 组装 advisor 增强和切入点的关系

  1. 1. 反射获取 Class 对象的方式
        Class 静态方法
            Class.forName(String packageAndClassName);
        Object 类内方法,可以提供给 Java 中所有类型使用
            Class getClass();
        类 或者 接口的属性
            类名/接口名.class
    
    2. 反射获取构造方法和执行构造方法实例化对象方法
        Constructor getConstructor(Class... parameterTypes);
            通过 Class 对象调用,根据构造方法参数数据类型,参数顺序,参数个数获取对应 Constructor 构造方法方法
        通过 Constructor 构造方法对象实例化目标对象操作
            Object newInstance(Object... parameterValues);
    
    3. 反射获取成员变量和成员方法的形式和执行方法
        Field getDeclaredField(String fieldName);
            void set(Object obj, Object value);
            Object get(Object obj);
        Method getMethod(String methodName, Class... parameterTypes);
            Object invoke(Object obj, Object... parameterValues);
    
    4. MyBatis 注解方式完成 Dao 层代码的常用注解
        @Mapper 注解对应的 Dao 层结构,告知当前 接口代码整合 接口和 Mapper 文件
        @Select 查询
        @Update 更新
        @Delete 删除
        @Insert 插入
        @Results  结果集自定义映射关系
            @Results(
                id = "结果集自定义映射 ID 名称,在整个 Java 文件中唯一",
                value = {
                    // property 实体类成员变量名称
                    // column 数据库字段名称
                    @Result(property="", column="")
                }
            )
        @ResultMap 选择当前结果集自定义映射关系
     
    5. MyBatis XML文件中的 ResultMap 标签的用法  
  2. <resultMap id="resultMap 在整个 XML 文件中的唯一表示" type="对应当前 Java 数据类型">
        <id property="" column=""></id>
        <result property="" column=""/>
    </resultMap>

项目琐碎知识点

1. 会话控制
1.1 概述
    HTTP 协议正常情况下是一个【无连接状态】,浏览器请求一次服务器数据,服务器响应之后,可以认为浏览器和服务器之间数据已经断开,无论是服务器新的更新还是有新的资源,在浏览器没有请求的情况下,资源无法刷新。
    为了保留一些请求的核心数据资源,相关业务逻辑使用的资源,需要使用【会话控制技术】 Cookie Session,可以解决用户自动登录,登录校验,登录时间限制...
1.2 Cookie
1.2.1 Cookie 概述
    Cookie 是浏览器技术,存储【键值对信息数据】,支持的数据类型有且只有【字符串 String类型】。Cookie 数据是服务器资源给予浏览器保存会话相关内容的一种方式,同时当前浏览器请求目标资源时,会根据请求资源的路径和资源名称,自动带有对应的 Cookie 提交到服务器。
    【注意】
        1. Cookie 不建议使用中文。
        2. Cookie 不支持空格
1.2.2 Cookie 相关方法和功能描述

在 Servlet 中操作

Constructor 构造方法
    Cookie(String name, String value);
        构造方法用于实例化 Cookie 对象,限制当前 Cookie 键值对信息数据,要求是字符串类型
​
Method 成员方法
    void setValue(String value);
        设置当前 Cookie 对象对应的数据存储内容
    void setPath();
        设置当前 Cookie 数据有效路径,对应当前 Cookie 数据请求服务器那些资源时会自动提交。
    void setMaxAge();
        设置 Cookie 有效时间
            负数 临时 Cookie
            正数 Cookie 有效时间,单位是 秒
            0 销毁浏览同名 Cookie
1.2.3 基本案例
1.2.3 Cookie 时间配置
package com.qfedu.a_cookie;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
/**
 * Cookie 有效时间演示
 *
 * @author Anonymous 2023/6/19 10:40
 */
@WebServlet("/cookie2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("time", "66666666");
​
        /*
         public void setMaxAge(int expiry)
            0 表示销毁【同名】Cookie  cookie.setMaxAge(0); 同时建议销毁 Cookie 数据在实例化 Cookie 对象时,不提供 value 数据
            正数是当前 Cookie 有效时间,单位秒 cookie.setMaxAge(60 * 60 * 24);
            负数表示以当前 Cookie 是一个临时 Cookie,浏览器关闭直接失效cookie.setMaxAge(-1);
         */
        cookie.setMaxAge(60 * 60 * 24);
​
        resp.addCookie(cookie);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
1.2.4 Cookie 有效路径
package com.qfedu.a_cookie;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
/**
 * @author Anonymous 2023/6/19 11:02
 */
@WebServlet("/cookie3")
public class CookieDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​
        Cookie cookie = new Cookie("path", "123456");
​
        /*
        public void setPath(String uri);
            URL 是用户请求的完整路径
            URI 是用户请求的资源名称
         */
        cookie.setPath("/user/info");
        cookie.setMaxAge(60 * 60);
​
        resp.addCookie(cookie);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
​

1.2.5 获取 Cookie 数据操作

用户通过浏览器提交到服务器 Cookie 数据在 HTTP 请求头中,对应 Servlet 里面的 HttpServletRequest 对象,需要通过 HttpServletRequest 获取 Cookie 数据,并且 Cookie 数据是多个 ==> 数组

Cookie[] getCookies();
package com.qfedu.a_cookie;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
​
/**
 * 获取浏览器访问当前资源提交的 Cookie 数据
 *
 * @author Anonymous 2023/6/19 11:19
 */
@WebServlet("/cookie4")
public class CookieDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        /*
        String getName();
            获取 Cookie 的名称 cookie-name
        String getValue();
            获取 Cookie 存储的数据 cookie-value
         */
        Arrays.stream(cookies)
                .filter(c -> !c.getName().contains("Idea")) 
                // Predicate<T> boolean test(T t);
                .forEach(c -> System.out.println(c.getName() + ":" + c.getValue())); 
                // Consumer<T> void accept(T t);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
1.2.6 Cookie 案例获取用户上一次访问时间
流程
    设置 Cookie-name: lastTime ,存储时间
​
用户第一次访问:
    没有对应的 lastTime Cookie,提示欢迎用户访问,同时给予用户 lastTime Cookie 数据
​
用户非第一个访问
    【条件】用户访问当前资源,自动带有 Cookie-name ==> lastTime 的 Cookie
    根据 Cookie 数据给予用户页面提示,同时需要刷新用户的 lastTime Cookie 数据
package com.qfedu.a_cookie;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
​
/**
 * @author Anonymous 2023/6/19 11:38
 */
@WebServlet("/lastTime")
public class LastTimeCookieDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 首先获取用户访问当前资源带有的 Cookie 数据
        Cookie[] cookies = req.getCookies();
​
        // 需要从 Cookie 数组中找到对应的 lastTime Cookie
        Cookie lastTime = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("lastTime".equals(cookie.getName())) {
                    lastTime = cookie;
                }
            }
        }
​
        String msg = null;
        // 判断 lastTime 是否为 null
        if (null == lastTime) {
            // 用户第一次来
            msg = "欢迎来到【凯哥方法会所】";
        } else {
            // 用户之前来过
            // 获取用户上一次访问时间
            String lastTimeValue = lastTime.getValue();
            msg = "欢迎您来到【凯哥方法会所】,<br> 您上一次的访问时间为" + lastTimeValue;
        }
​
        // 根据当前时间得到时间描述字符串
        long l = System.currentTimeMillis();
        String timeValue = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date(l));
​
        // 创建 Cookie-name:lastTime value:本次访问时间字符串
        Cookie cookie = new Cookie("lastTime", timeValue);
        cookie.setMaxAge(15 * 24 * 60 * 60);
​
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().append("<h1>" + msg + "</h1>");
​
        // 发生 Cookie 数据到浏览器
        resp.addCookie(cookie);
​
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值