diff --git a/README.md b/README.md index 5f4c2c79..0bea7fad 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,54 @@ ppt //存放上课使用的ppt文件,已转换成对应的pdf,避免不同 55 js介绍及内置功能函数、数据类型、变量 2019/12/7 15:00-17:00 56 js的变量及运算符 2019/12/7 20:00-22:00 57 js的流程控制语句 2019/12/8 15:00-17:00 -......持续更新 +58 js的函数基本使用 2019/12/14 15:00-17:00 +59 js的数组和字符串的基本使用 2019/12/14 20:00-22:00 +60 dom操作、常用方法、事件绑定 2019/12/15 15:00-17:00 +61 echarts和js对象、函数上下文 2019/12/28 15:00-17:00 +62 js构造函数、js原型链、继承及实战案例 2019/12/28 20:00-22:00 +63 jquery简介、选择器、常用方法 2019/12/29 15:00-17:00 +64 jquery的节点关系及函数操作 2020/1/4 15:00-17:00 +65 jquery轮播图及函数库介绍 2020/1/4 20:00-22:00 +66 Http协议、php的基本介绍 2020/1/5 15:00-17:00 +67 ajax基本原理及使用 2020/1/11 15:00-17:00 +68 ajax的接受数据的方式及三级联通案例 2020/1/11 20:00-22:00 +69 vue框架的介绍及使用 2020/1/12 15:00-17:00 +70 vue框架的调色板、属性值监听、百度预搜索、函数 2020/1/18 15:00-17:00 +71 vue框架的生命周期、axios、拉取服务器数据,组件使用 2020/1/18 20:00-22:00 +72 vue框架的高阶使用 2020/1/19 15:00-17:00 +73 Spring框架的介绍及使用 2020/2/8 15:00-17:00 +74 SpringIOC容器的配置使用1 2020/2/8 20:00-22:00 +75 SpringIOC容器的配置使用2 2020/2/9 15:00-17:00 +76 SpringIOC容器的注解使用 2020/2/15 15:00-17:00 +77 SpringAOP的引入及配置使用 2020/2/15 20:00-22:00 +78 SpringAOP的详细讲解 2020/2/15 15:00-17:00 +79 SpringAOP的声明式事务控制 2020/2/22 15:00-17:00 +80 SpringAOP声明式事务及源码讲解 2020/03/07 15:00-17:00 +81 Spring源码讲解 2020/03/07 20:00-22:00 +82 Spring源码讲解 2020/03/08 15:00-17:00 +83 动态代理 2020/03/08 20:00-22:00 +84 springmvc简单介绍及使用 2020/03/14 15:00-17:00 +85 Springmvc的使用1 2020/03/14 20:00-22:00 +86 Springmvc的使用2 2020/03/15 15:00-17:00 +87 Springmvc的使用3 2020/03/15 20:00-22:00 +88 Springmvc的使用4 2020/03/21 15:00-17:00 +89 Springmvc的使用5 2020/03/21 20:00-22:00 +90 Springmvc的源码讲解1 2020/03/22 15:00-17:00 +91 Springmvc的源码讲解2 2020/03/22 20:00-22:00 +92 mybatis的介绍和基本使用1 2020/03/28 15:00-17:00 +93 mybatis基本使用2 2020/03/28 20:00-22:00 +94 mybatis基本使用3 2020/03/29 15:00-17:00 +95 mybatis基本使用4 2020/03/29 20:00-22:00 +96 mybatis基本使用5 2020/04/04 15:00-17:00 +97 mybatis基本使用6 2020/04/04 20:00-22:00 +98 Mybatis源码讲解1 2020/04/05 15:00-17:00 +99 何家云项目实战 2020/04/11 15:00-17:00 +100 何家云项目实战2 2020/04/18 15:00-17:00 +101 何家云项目实战3 2020/04/18 20:00-22:00 +102 何家云项目实战4 2020/04/19 15:00-17:00 +103 何家云项目实战5 2020/04/25 15:00-17:00 +104 何家云项目实战6 2020/04/25 20:00-22:00 +105 后端课简历辅导 2020/05/10 15:00-17:00 +106 后端课面试指导 2020/05/10 20:00-22:00 ``` diff --git a/database/image/spi.jpg b/database/image/spi.jpg new file mode 100644 index 00000000..aa098275 Binary files /dev/null and b/database/image/spi.jpg differ diff --git "a/database/note/Java SPI\346\234\272\345\210\266\350\257\246\350\247\243.md" "b/database/note/Java SPI\346\234\272\345\210\266\350\257\246\350\247\243.md" index 1bc7becf..5ad5e3e3 100644 --- "a/database/note/Java SPI\346\234\272\345\210\266\350\257\246\350\247\243.md" +++ "b/database/note/Java SPI\346\234\272\345\210\266\350\257\246\350\247\243.md" @@ -6,7 +6,7 @@ SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。我们经常遇到的就是java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,mysql和postgresql都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。 ``` -![](C:\Users\63198\Desktop\SPI.jpg) +![](../image/spi.jpg) ​ 如上图所示,接口对应的抽象SPI接口;实现方实现SPI接口;调用方依赖SPI接口。 diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/01Mybatis\347\232\204\344\273\213\347\273\215\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250.md" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/01Mybatis\347\232\204\344\273\213\347\273\215\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250.md" new file mode 100644 index 00000000..8b8fdbe9 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/01Mybatis\347\232\204\344\273\213\347\273\215\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250.md" @@ -0,0 +1,634 @@ +# 01Mybatis的介绍和基本使用 + +### 0、数据库操作框架的历程 + +##### (1) JDBC + +​ JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序 + +- 优点:运行期:快捷、高效 +- 缺点:编辑期:代码量大、繁琐异常处理、不支持数据库跨平台 + +![img](images\jdbc.jpg) + +##### (2) DBUtils + +​ DBUtils是Java编程中的数据库操作实用工具,小巧简单实用。 + +​ DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。 + +​ DBUtils三个核心功能介绍 + +​ 1、QueryRunner中提供对sql语句操作的API + +​ 2、ResultSetHandler接口,用于定义select操作后,怎样封装结果集 + +​ 3、DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法 + +##### (3)Hibernate + +​ Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。 + +​ Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。 + +​ Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。 + +![image](images\hibernate.jpg) + +​ **Hibernate 优势** + +- Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。 + +- 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。 + +- 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。 + +- 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。 + +- Hibernate 不需要应用程序服务器来操作。 + +- 操控你数据库中对象复杂的关联。 + +- 最小化与访问数据库的智能提取策略。 + +- 提供简单的数据询问。 + + **Hibernate劣势** + +- hibernate的完全封装导致无法使用数据的一些功能。 + +- Hibernate的缓存问题。 + +- Hibernate对于代码的耦合度太高。 + +- Hibernate寻找bug困难。 + +- Hibernate批量数据操作需要大量的内存空间而且执行过程中需要的对象太多 + + ##### (4) JDBCTemplate + +​ JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法.如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便利的模板方法。 + +​ 优点:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务 +​ 缺点:必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存 + +### 1、什么是Mybatis? + +​ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 + +​ **优点:** + +​ 1、与JDBC相比,减少了50%的代码量 + +​ 2、 最简单的持久化框架,简单易学 + +​ 3、SQL代码从程序代码中彻底分离出来,可以重用 + +​ 4、提供XML标签,支持编写动态SQL + +​ 5、提供映射标签,支持对象与数据库的ORM字段关系映射 + +​ **缺点:** + +​ 1、SQL语句编写工作量大,熟练度要高 + +​ 2、数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异 + +### 2、第一个Mybatis项目 + +​ 1、创建普通的maven项目 + +​ 2、导入相关的依赖 + +​ pom.xml + +```xml + + + 4.0.0 + + com.mashibing + mybatis_helloworld + 1.0-SNAPSHOT + + + + org.mybatis + mybatis + 3.5.4 + + + + mysql + mysql-connector-java + 8.0.16 + + + + log4j + log4j + 1.2.17 + + + + + +``` + +​ 3、创建对应的数据表,数据表我们使用之前的demo数据库,脚本文件在群里,大家自行去下载安装 + +​ 4、创建与表对应的实体类对象 + +emp.java + +```java +package com.mashibing.bean; + +import java.util.Date; + +public class Emp { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double common; + private Integer deptno; + + public Emp() { + } + + public Emp(Integer empno, String ename, String job, Integer mgr, Date hiredate, Double sal, Double common, Integer deptno) { + this.empno = empno; + this.ename = ename; + this.job = job; + this.mgr = mgr; + this.hiredate = hiredate; + this.sal = sal; + this.common = common; + this.deptno = deptno; + } + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getCommon() { + return common; + } + + public void setCommon(Double common) { + this.common = common; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", common=" + common + + ", deptno=" + deptno + + '}'; + } +} +``` + +​ 5、创建对应的dao类 + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; + +public interface EmpDao { + + public Emp findEmpByEmpno(Integer empno); + +} +``` + +​ 6、编写配置文件 + +log4j.properties + +mybatis-config.xml + +```xml + + + + + + + + + + + + + + + + + + + + +``` + +EmpDao.xml + +```xml + + + + + + + +``` + +​ 7、编写测试类 + +MyTest.java + +```java +package com.mashibing.test; + +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class MyTest { + + @Test + public void test01() { + // 根据全局配置文件创建出SqlSessionFactory + // SqlSessionFactory:负责创建SqlSession对象的工厂 + // SqlSession:表示跟数据库建议的一次会话 + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + // 获取数据库的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + Emp empByEmpno = null; + try { + // 获取要调用的接口类 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + // 调用方法开始执行 + empByEmpno = mapper.findEmpByEmpno(7369); + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + System.out.println(empByEmpno); + } +} +``` + +### 3、增删改查的基本操作 + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; + +public interface EmpDao { + + public Emp findEmpByEmpno(Integer empno); + + public int updateEmp(Emp emp); + + public int deleteEmp(Integer empno); + + public int insertEmp(Emp emp); + +} +``` + +EmpDao.xml + +```xml + + + + + + + + + insert into emp(empno,ename) values(#{empno},#{ename}) + + + update emp set ename=#{ename} where empno = #{empno} + + + delete from emp where empno = #{empno} + + +``` + +MyTest.java + +```java +package com.mashibing.test; + +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class MyTest { + SqlSessionFactory sqlSessionFactory = null; + @Before + public void init(){ + // 根据全局配置文件创建出SqlSessionFactory + // SqlSessionFactory:负责创建SqlSession对象的工厂 + // SqlSession:表示跟数据库建议的一次会话 + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); + } catch (IOException e) { + e.printStackTrace(); + } + } + @Test + public void test01() { + + // 获取数据库的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + Emp empByEmpno = null; + try { + // 获取要调用的接口类 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + // 调用方法开始执行 + empByEmpno = mapper.findEmpByEmpno(7369); + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + System.out.println(empByEmpno); + } + + @Test + public void test02(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + int zhangsan = mapper.insertEmp(new Emp(1111, "zhangsan")); + System.out.println(zhangsan); + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test03(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + int zhangsan = mapper.updateEmp(new Emp(1111, "lisi")); + System.out.println(zhangsan); + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test04(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + int zhangsan = mapper.deleteEmp(1111); + System.out.println(zhangsan); + sqlSession.commit(); + sqlSession.close(); + } +} +``` + +### 4、配置文件详解 + +​ 在mybatis的项目中,我们发现了有一个mybatis-config.xml的配置文件,这个配置文件是mybatis的全局配置文件,用来进行相关的全局配置,在任何操作下都生效的配置。下面我们要针对其中的属性做详细的解释,方便大家在后续使用的时候更加熟练。 + +mybatis-config.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +EmpDaoAnnotation.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +public interface EmpDaoAnnotation { + + @Select("select * from emp where empno = #{empno}") + public Emp findEmpByEmpno(Integer empno); + + @Update("update emp set ename=#{ename} where empno = #{empno}") + public int updateEmp(Emp emp); + + @Delete("delete from emp where empno = #{empno}") + public int deleteEmp(Integer empno); + + @Insert("insert into emp(empno,ename) values(#{empno},#{ename})") + public int insertEmp(Emp emp); + +} +``` + diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/images/hibernate.jpg" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/images/hibernate.jpg" new file mode 100644 index 00000000..26674b00 Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/images/hibernate.jpg" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/images/jdbc.jpg" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/images/jdbc.jpg" new file mode 100644 index 00000000..ec5b3447 Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/images/jdbc.jpg" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/compiler.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/compiler.xml" new file mode 100644 index 00000000..79fa06b2 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/encodings.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/misc.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/workspace.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/workspace.xml" new file mode 100644 index 00000000..e0a636a1 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/.idea/workspace.xml" @@ -0,0 +1,781 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * from emp where empno = #{empno} + + + insert into emp(empno,ename) values(#{empno},#{ename}) + + + update emp set sal=#{sal} where empno = #{empno} + + + delete from emp where empno = #{empno} + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/UserDao.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/UserDao.xml" new file mode 100644 index 00000000..7f05253e --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/UserDao.xml" @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/db.properties" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/log4j.properties" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..9e9d684a --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/mybatis-config.xml" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest.java" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest.java" new file mode 100644 index 00000000..c2eb3446 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest.java" @@ -0,0 +1,98 @@ +import com.mashibing.bean.Emp; +import com.mashibing.bean.User; +import com.mashibing.dao.EmpDao; +import com.mashibing.dao.UserDao; +import com.mashibing.dao.UserDaoAnnotation; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class MyTest { + + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init(){ + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + + @Test + public void test01() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + //执行具体的sql语句 + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test02(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(3333); + emp.setEname("zhangsan"); + Integer save = mapper.save(emp); + System.out.println(save); + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test03(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(3333); + emp.setEname("zhangsan"); + emp.setSal(500.0); + Integer update = mapper.update(emp); + System.out.println(update); + sqlSession.commit(); + sqlSession.close(); + } + @Test + public void test04(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Integer delete = mapper.delete(3333); + System.out.println(delete); + sqlSession.commit(); + sqlSession.close(); + } + + + @Test + public void test05() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + UserDao mapper = sqlSession.getMapper(UserDao.class); + //执行具体的sql语句 + User user = mapper.selectUserById(1); + System.out.println(user); + //关闭会话 + sqlSession.close(); + + } +} diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/EmpDao.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/EmpDao.xml" new file mode 100644 index 00000000..9c319e47 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/EmpDao.xml" @@ -0,0 +1,18 @@ + + + + + + insert into emp(empno,ename) values(#{empno},#{ename}) + + + update emp set sal=#{sal} where empno = #{empno} + + + delete from emp where empno = #{empno} + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Emp.class" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Emp.class" new file mode 100644 index 00000000..a57b3fd2 Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Emp.class" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/User.class" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/User.class" new file mode 100644 index 00000000..4fcaaf79 Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/User.class" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..135127f2 Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.class" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.class" new file mode 100644 index 00000000..051f954e Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.class" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.xml" new file mode 100644 index 00000000..7f05253e --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.xml" @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDaoAnnotation.class" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDaoAnnotation.class" new file mode 100644 index 00000000..3dd630cd Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDaoAnnotation.class" differ diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/db.properties" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/log4j.properties" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/mybatis-config.xml" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..9e9d684a --- /dev/null +++ "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/classes/mybatis-config.xml" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest.class" "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest.class" new file mode 100644 index 00000000..e24e5a98 Binary files /dev/null and "b/javaframework/mybatis/01mybatis\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/02Mybatis SQL\346\230\240\345\260\204\346\226\207\344\273\266\350\257\246\350\247\243.md" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/02Mybatis SQL\346\230\240\345\260\204\346\226\207\344\273\266\350\257\246\350\247\243.md" new file mode 100644 index 00000000..a5032e2f --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/02Mybatis SQL\346\230\240\345\260\204\346\226\207\344\273\266\350\257\246\350\247\243.md" @@ -0,0 +1,1439 @@ +# 02Mybatis SQL映射文件详解 + +​ 在之前我们学习了mybatis的全局配置文件,下面我们开始学习mybatis的映射文件,在映射文件中,可以编写以下的顶级元素标签: + +``` +cache – 该命名空间的缓存配置。 +cache-ref – 引用其它命名空间的缓存配置。 +resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。 +parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。 +sql – 可被其它语句引用的可重用语句块。 +insert – 映射插入语句。 +update – 映射更新语句。 +delete – 映射删除语句。 +select – 映射查询语句。 +``` + +​ 在每个顶级元素标签中可以添加很多个属性,下面我们开始详细了解下具体的配置。 + +### 1、insert、update、delete元素 + +| 属性 | 描述 | +| :----------------- | :----------------------------------------------------------- | +| `id` | 在命名空间中唯一的标识符,可以被用来引用这条语句。 | +| `parameterType` | 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。 | +| `parameterMap` | 用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。 | +| `flushCache` | 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。 | +| `timeout` | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。 | +| `statementType` | 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 | +| `useGeneratedKeys` | (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。 | +| `keyProperty` | (仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(`unset`)。如果生成列不止一个,可以用逗号分隔多个属性名称。 | +| `keyColumn` | (仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。 | +| `databaseId` | 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。 | + +```xml + + + insert into user(user_name) values(#{userName}) + + + + + select max(id)+1 from user + + insert into user(id,user_name) values(#{id},#{userName}) + +``` + +### 2、select元素 + +##### 1、select的参数传递 + +```xml + + + + +``` + +##### 2、参数的取值方式 + +​ 在xml文件中编写sql语句的时候有两种取值的方式,分别是#{}和${},下面来看一下他们之间的区别: + +```xml + + +``` + +##### 3、处理集合返回结果 + +EmpDao.xml + +```xml + + + + + + + +``` + +UserDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EmpDao { + + public Emp findEmpByEmpno(Integer empno); + + public int updateEmp(Emp emp); + + public int deleteEmp(Integer empno); + + public int insertEmp(Emp emp); + + Emp selectEmpByNoAndName(@Param("empno") Integer empno, @Param("ename") String ename,@Param("t") String tablename); + Emp selectEmpByNoAndName2(Map map); + + List selectAllEmp(); + + Map selectEmpByEmpReturnMap(Integer empno); + + @MapKey("empno") + Map getAllEmpReturnMap(); +} +``` + +##### 4、自定义结果集---resultMap + +Dog.java + +```java +package com.mashibing.bean; + +public class Dog { + private Integer id; + private String name; + private Integer age; + private String gender; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return "Dog{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } +} + +``` + +dog.sql + +```sql +/* +Navicat MySQL Data Transfer + +Source Server : node01 +Source Server Version : 50729 +Source Host : 192.168.85.111:3306 +Source Database : demo + +Target Server Type : MYSQL +Target Server Version : 50729 +File Encoding : 65001 + +Date: 2020-03-24 23:54:22 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `dog` +-- ---------------------------- +DROP TABLE IF EXISTS `dog`; +CREATE TABLE `dog` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `dname` varchar(255) DEFAULT NULL, + `dage` int(11) DEFAULT NULL, + `dgender` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of dog +-- ---------------------------- +INSERT INTO dog VALUES ('1', '大黄', '1', '雄'); +INSERT INTO dog VALUES ('2', '二黄', '2', '雌'); +INSERT INTO dog VALUES ('3', '三黄', '3', '雄'); +``` + +DogDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Dog; + +public interface DogDao { + + public Dog selectDogById(Integer id); +} +``` + +DogDao.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + +``` + +##### 5、联合查询 + +emp.java + +```java +package com.mashibing.bean; + +import java.util.Date; + +public class Emp { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double common; + private Dept dept; + + public Emp() { + } + + public Emp(Integer empno, String ename) { + this.empno = empno; + this.ename = ename; + } + + public Emp(Integer empno, String ename, String job, Integer mgr, Date hiredate, Double sal, Double common, Dept dept) { + this.empno = empno; + this.ename = ename; + this.job = job; + this.mgr = mgr; + this.hiredate = hiredate; + this.sal = sal; + this.common = common; + this.dept = dept; + } + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getCommon() { + return common; + } + + public void setCommon(Double common) { + this.common = common; + } + + public Dept getDept() { + return dept; + } + + public void setDept(Dept dept) { + this.dept = dept; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", common=" + common + + ", dept=" + dept + + '}'; + } +} + +``` + +Dept.java + +```java +package com.mashibing.bean; + +public class Dept { + private Integer deptno; + private String dname; + private String loc; + + public Dept() { + } + + public Dept(Integer deptno, String dname, String loc) { + this.deptno = deptno; + this.dname = dname; + this.loc = loc; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + public String getDname() { + return dname; + } + + public void setDname(String dname) { + this.dname = dname; + } + + public String getLoc() { + return loc; + } + + public void setLoc(String loc) { + this.loc = loc; + } + + @Override + public String toString() { + return "Dept{" + + "deptno=" + deptno + + ", dname='" + dname + '\'' + + ", loc='" + loc + '\'' + + '}'; + } +} + +``` + +EmpDao.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +Test + +```java + @Test + public void test08() { + + // 获取数据库的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + try { + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpAndDept(7369); + System.out.println(emp); + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + } +``` + +##### 6、获取集合元素 + +Dept.java + +```java +package com.mashibing.bean; + +import java.util.List; + +public class Dept { + private Integer deptno; + private String dname; + private String loc; + + private List emps; + + public Dept() { + } + + public Dept(Integer deptno, String dname, String loc) { + this.deptno = deptno; + this.dname = dname; + this.loc = loc; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + public String getDname() { + return dname; + } + + public void setDname(String dname) { + this.dname = dname; + } + + public String getLoc() { + return loc; + } + + public void setLoc(String loc) { + this.loc = loc; + } + + public List getEmps() { + return emps; + } + + public void setEmps(List emps) { + this.emps = emps; + } + + @Override + public String toString() { + return "Dept{" + + "deptno=" + deptno + + ", dname='" + dname + '\'' + + ", loc='" + loc + '\'' + + ", emps=" + emps + + '}'; + } +} + +``` + +DeptDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Dept; +import com.mashibing.bean.Emp; + +import java.util.List; + +public interface DeptDao { + + public Dept getDeptAndEmps(Integer deptno); +} + +``` + +DeptDao.xml + +```xml + + + + + + + + + + + + + + + + + + + + + +``` + +Test + +```java + @Test + public void test09() { + + // 获取数据库的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + try { + DeptDao mapper = sqlSession.getMapper(DeptDao.class); + Dept deptAndEmps = mapper.getDeptAndEmps(10); + System.out.println(deptAndEmps); + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + } +``` + +##### 7、分步查询 + +​ 在上述逻辑的查询中,是由我们自己来完成sql语句的关联查询的,那么,我们能让mybatis帮我们实现自动的关联查询吗? + +**关联查询的分步** + +DeptDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Dept; +import com.mashibing.bean.Emp; + +import java.util.List; + +public interface DeptDao { + + public Dept getDeptAndEmps(Integer deptno); + + public Dept getDeptAndEmpsBySimple(Integer deptno); +} + +``` + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EmpDao { + + Emp selectEmpAndDept(Integer empno); + Emp selectEmpAndDeptBySimple(Integer empno); +} + +``` + +DeptDao.xml + +```xml + + + + + +``` + +EmpDao.xml + +```xml + + + + + + + + + + + + + + + + + +``` + +Test + +```java +@Test + public void test08() { + + // 获取数据库的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + try { + EmpDao mapper = sqlSession.getMapper(EmpDao.class); +// Emp emp = mapper.selectEmpAndDept(7369); + Emp emp = mapper.selectEmpAndDeptBySimple(7369); + System.out.println(emp); + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + } +``` + +**集合的分步查询** + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EmpDao { + Emp selectEmpAndDeptBySimple(Integer empno); + Emp selectEmpByStep(Integer empno); +} + +``` + +DeptDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Dept; +import com.mashibing.bean.Emp; + +import java.util.List; + +public interface DeptDao { + + public Dept getDeptAndEmps(Integer deptno); + + public Dept getDeptAndEmpsBySimple(Integer deptno); + + public Dept getDeptAndEmpsByStep(Integer deptno); +} + +``` + +EmpDao.xml + +```xml + + + + + + +``` + +DeptDao.xml + +```xml + + + + + + + + + + + + + + +``` + +Test + +```java + @Test + public void test09() { + + // 获取数据库的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + try { + DeptDao mapper = sqlSession.getMapper(DeptDao.class); +// Dept deptAndEmps = mapper.getDeptAndEmps(10); + Dept deptAndEmpsByStep = mapper.getDeptAndEmpsByStep(10); + System.out.println(deptAndEmpsByStep); + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + } +``` + +##### 8、延迟查询 + +​ 当我们在进行表关联的时候,有可能在查询结果的时候不需要关联对象的属性值,那么此时可以通过延迟加载来实现功能。在全局配置文件中添加如下属性 + +mybatis-config.xml + +```xml + + + + +``` + +如果设置了全局加载,但是希望在某一个sql语句查询的时候不适用延时策略,可以添加如下属性: + +```xml + + +``` + +### 3、动态sql + +​ 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。 + +​ 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。 + +​ 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。 + +- if +- choose (when, otherwise) +- trim (where, set) +- foreach + +##### 1、if + +EmpDao.xml + +```xml + +``` + +EmpDao.java + +```java +public List getEmpByCondition(Emp emp); +``` + +Test.java + +```java + @Test + public void test10() { + + SqlSession sqlSession = sqlSessionFactory.openSession(); + try { + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(6500); + emp.setEname("%E%"); + emp.setSal(500.0); + List empByCondition = mapper.getEmpByCondition(emp); + for (Emp emp1 : empByCondition) { + System.out.println(emp1); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + } +``` + +​ 看起来测试是比较正常的,但是大家需要注意的是如果我们传入的参数值有缺失会怎么呢?这个时候拼接的sql语句就会变得有问题,例如不传参数或者丢失最后一个参数,那么语句中就会多一个where或者and的关键字,因此在mybatis中也给出了具体的解决方案: + +​ *where* 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,*where* 元素也会将它们去除。 + +```xml + +``` + +​ 现在看起来没有什么问题了,但是我们的条件添加到了拼接sql语句的前后,那么我们该如何处理呢? + +```xml + + +``` + +##### 2、foreach + +​ 动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。 + +```xml + + +``` + +##### 3、choose + +​ 有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。 + +```xml + +``` + +##### 4、set + +​ 用于动态更新语句的类似解决方案叫做 *set*。*set* 元素可以用于动态包含需要更新的列,忽略其它不更新的列。 + +```xml + + update emp + + + empno=#{empno}, + + + ename = #{ename}, + + + sal = #{sal} + + + + empno = #{empno} + + +``` + +### 4、缓存 + +​ MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。 + +​ 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行: + +``` + +``` + +当添加上该标签之后,会有如下效果: + +- 映射语句文件中的所有 select 语句的结果将会被缓存。 +- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。 +- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。 +- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。 +- 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。 +- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。 + +在进行配置的时候还会分为一级缓存和二级缓存: + +一级缓存:线程级别的缓存,是本地缓存,sqlSession级别的缓存 + +二级缓存:全局范围的缓存,不止局限于当前会话 + +##### 1、一级缓存的使用 + +​ 一级缓存是sqlsession级别的缓存,默认是存在的。在下面的案例中,大家发现我发送了两个相同的请求,但是sql语句仅仅执行了一次,那么就意味着第一次查询的时候已经将结果进行了缓存。 + +```java + @Test + public void test01() { + + SqlSession sqlSession = sqlSessionFactory.openSession(); + try { + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + List list = mapper.selectAllEmp(); + for (Emp emp : list) { + System.out.println(emp); + } + System.out.println("--------------------------------"); + List list2 = mapper.selectAllEmp(); + for (Emp emp : list2) { + System.out.println(emp); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + sqlSession.close(); + } + } + +``` + +​ 在大部分的情况下一级缓存是可以的,但是有几种特殊的情况会造成一级缓存失效: + +1、一级缓存是sqlSession级别的缓存,如果在应用程序中只有开启了多个sqlsession,那么会造成缓存失效 + +```java +@Test + public void test02(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + List list = mapper.selectAllEmp(); + for (Emp emp : list) { + System.out.println(emp); + } + System.out.println("================================"); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + List list2 = mapper2.selectAllEmp(); + for (Emp emp : list2) { + System.out.println(emp); + } + sqlSession.close(); + sqlSession2.close(); + } +``` + +2、在编写查询的sql语句的时候,一定要注意传递的参数,如果参数不一致,那么也不会缓存结果 + +3、如果在发送过程中发生了数据的修改,那么结果就不会缓存 + +```java + @Test + public void test03(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp empByEmpno = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno); + System.out.println("================================"); + empByEmpno.setEname("zhangsan"); + int i = mapper.updateEmp(empByEmpno); + System.out.println(i); + System.out.println("================================"); + Emp empByEmpno1 = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno1); + sqlSession.close(); + } +``` + +4、在两次查询期间,手动去清空缓存,也会让缓存失效 + +```java +@Test + public void test03(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp empByEmpno = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno); + System.out.println("================================"); + System.out.println("手动清空缓存"); + sqlSession.clearCache(); + System.out.println("================================"); + Emp empByEmpno1 = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno1); + sqlSession.close(); + } +``` + +##### 2、二级缓存 + +​ 二级缓存是全局作用域缓存,默认是不开启的,需要手动进行配置。 + +​ Mybatis提供二级缓存的接口以及实现,缓存实现的时候要求实体类实现Serializable接口,二级缓存在sqlSession关闭或提交之后才会生效。 + +###### 1、缓存的使用 + +​ 步骤: + +​ 1、全局配置文件中添加如下配置: + +```xml + +``` + +​ 2、需要在使用二级缓存的映射文件出使用标签标注 + +​ 3、实体类必须要实现Serializable接口 + +```java +@Test + public void test04(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + Emp empByEmpno = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno); + sqlSession.close(); + + Emp empByEmpno1 = mapper2.findEmpByEmpno(1111); + System.out.println(empByEmpno1); + sqlSession2.close(); + } +``` + +###### 2、缓存的属性 + +​ eviction:表示缓存回收策略,默认是LRU + +​ LRU:最近最少使用的,移除最长时间不被使用的对象 + +​ FIFO:先进先出,按照对象进入缓存的顺序来移除 + +​ SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象 + +​ WEAK:弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象 + +​ flushInternal:刷新间隔,单位毫秒 + +​ 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新 + +​ size:引用数目,正整数 + +​ 代表缓存最多可以存储多少个对象,太大容易导致内存溢出 + +​ readonly:只读,true/false + +​ true:只读缓存,会给所有调用这返回缓存对象的相同实例,因此这些对象不能被修改。 + +​ false:读写缓存,会返回缓存对象的拷贝(序列化实现),这种方式比较安全,默认值 + +```java + //可以看到会去二级缓存中查找数据,而且二级缓存跟一级缓存中不会同时存在数据,因为二级缓存中的数据是在sqlsession 关闭之后才生效的 + @Test + public void test05(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp empByEmpno = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno); + sqlSession.close(); + + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + Emp empByEmpno2 = mapper2.findEmpByEmpno(1111); + System.out.println(empByEmpno2); + Emp empByEmpno3 = mapper2.findEmpByEmpno(1111); + System.out.println(empByEmpno3); + sqlSession2.close(); + } + + // 缓存查询的顺序是先查询二级缓存再查询一级缓存 + @Test + public void test05(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp empByEmpno = mapper.findEmpByEmpno(1111); + System.out.println(empByEmpno); + sqlSession.close(); + + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + Emp empByEmpno2 = mapper2.findEmpByEmpno(1111); + System.out.println(empByEmpno2); + Emp empByEmpno3 = mapper2.findEmpByEmpno(1111); + System.out.println(empByEmpno3); + + Emp empByEmpno4 = mapper2.findEmpByEmpno(7369); + System.out.println(empByEmpno4); + Emp empByEmpno5 = mapper2.findEmpByEmpno(7369); + System.out.println(empByEmpno5); + sqlSession2.close(); + } +``` + +3、二级缓存的作用范围: + +​ 如果设置了全局的二级缓存配置,那么在使用的时候需要注意,在每一个单独的select语句中,可以设置将查询缓存关闭,以完成特殊的设置 + +​ 1、在setting中设置,是配置二级缓存开启,一级缓存默认一直开启 + +```xml + +``` + +​ 2、select标签的useCache属性: + +​ 在每一个select的查询中可以设置当前查询是否要使用二级缓存,只对二级缓存有效 + +​ 3、sql标签的flushCache属性 + +​ 增删改操作默认值为true,sql执行之后会清空一级缓存和二级缓存,而查询操作默认是false + +​ 4、sqlSession.clearCache() + +​ 只是用来清楚一级缓存 + +##### 3、整合第三方缓存 + +​ 在某些情况下我们也可以自定义实现缓存,或为其他第三方缓存方案创建适配器,来完全覆盖缓存行为。 + +​ 1、导入对应的maven依赖 + +```xml + + + org.ehcache + ehcache + 3.8.1 + + + + org.mybatis.caches + mybatis-ehcache + 1.2.0 + + + + org.slf4j + slf4j-api + 2.0.0-alpha1 + + + + org.slf4j + slf4j-log4j12 + 2.0.0-alpha1 + test + +``` + +​ 2、导入ehcache配置文件 + +```xml + + + + + + + + + + +``` + +​ 3、在mapper文件中添加自定义缓存 + +```xml + +``` + diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/images/hibernate.jpg" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/images/hibernate.jpg" new file mode 100644 index 00000000..26674b00 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/images/hibernate.jpg" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/images/jdbc.jpg" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/images/jdbc.jpg" new file mode 100644 index 00000000..ec5b3447 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/images/jdbc.jpg" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/compiler.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/compiler.xml" new file mode 100644 index 00000000..79fa06b2 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/encodings.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/misc.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/workspace.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/workspace.xml" new file mode 100644 index 00000000..42a7ed16 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/.idea/workspace.xml" @@ -0,0 +1,797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * from dog where id = #{id} + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..dec42640 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + insert into emp(empno,ename) values(#{empno},#{ename}) + + + update emp set sal=#{sal} where empno = #{empno} + + + delete from emp where empno = #{empno} + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/UserDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/UserDao.xml" new file mode 100644 index 00000000..fd35ffb1 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/com/mashibing/dao/UserDao.xml" @@ -0,0 +1,13 @@ + + + + + + + insert into user(user_name) values(#{userName}) + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/db.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/log4j.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..9e9d684a --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/main/resources/mybatis-config.xml" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest.java" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest.java" new file mode 100644 index 00000000..3447ae3f --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest.java" @@ -0,0 +1,161 @@ +import com.mashibing.bean.Emp; +import com.mashibing.bean.User; +import com.mashibing.dao.EmpDao; +import com.mashibing.dao.UserDao; +import com.mashibing.dao.UserDaoAnnotation; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MyTest { + + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init(){ + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + + @Test + public void test01() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + //执行具体的sql语句 + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test02(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(3333); + emp.setEname("zhangsan"); + Integer save = mapper.save(emp); + System.out.println(save); + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test03(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(3333); + emp.setEname("zhangsan"); + emp.setSal(500.0); + Integer update = mapper.update(emp); + System.out.println(update); + sqlSession.commit(); + sqlSession.close(); + } + @Test + public void test04(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Integer delete = mapper.delete(3333); + System.out.println(delete); + sqlSession.commit(); + sqlSession.close(); + } + + + @Test + public void test05() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + UserDao mapper = sqlSession.getMapper(UserDao.class); + //执行具体的sql语句 + User user = mapper.selectUserById(1); + System.out.println(user); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test06(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + UserDao mapper = sqlSession.getMapper(UserDao.class); + User user = new User(); + user.setUserName("lisi"); + Integer save = mapper.saveUser(user); + System.out.println(save); + System.out.println(user); + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test07(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + List list = mapper.selectAll(); + for (Emp emp : list) { + System.out.println(emp); + } + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test08(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Map map = new HashMap<>(); + map.put("empno",7369); + map.put("sal",500.0); + List list = mapper.selectEmpByEmpnoAndSal3(map); + for (Emp emp : list) { + System.out.println(emp); + } + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test09(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Map objectObjectMap = mapper.selectEmpByEmpnoReturnMap(7369); + System.out.println(objectObjectMap); + sqlSession.commit(); + sqlSession.close(); + } + + @Test + public void test10(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Map stringEmpMap = mapper.selectAll2(); + System.out.println(stringEmpMap); + sqlSession.commit(); + sqlSession.close(); + } +} diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest2.java" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest2.java" new file mode 100644 index 00000000..ea2d186b --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/src/test/java/MyTest2.java" @@ -0,0 +1,52 @@ +import com.mashibing.bean.Dog; +import com.mashibing.bean.Emp; +import com.mashibing.bean.User; +import com.mashibing.dao.DogDao; +import com.mashibing.dao.EmpDao; +import com.mashibing.dao.UserDao; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MyTest2 { + + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init(){ + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + + @Test + public void test01() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + DogDao mapper = sqlSession.getMapper(DogDao.class); + //执行具体的sql语句 + Dog dog = mapper.selectDogById(1); + System.out.println(dog); + //关闭会话 + sqlSession.close(); + + } + + +} diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Dog.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Dog.class" new file mode 100644 index 00000000..448e047a Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Dog.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Emp.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Emp.class" new file mode 100644 index 00000000..a57b3fd2 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/Emp.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/User.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/User.class" new file mode 100644 index 00000000..4fcaaf79 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/bean/User.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/DogDao.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/DogDao.class" new file mode 100644 index 00000000..5f5697f5 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/DogDao.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/DogDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/DogDao.xml" new file mode 100644 index 00000000..14fd688e --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/DogDao.xml" @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..c4d11d9c Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..dec42640 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + insert into emp(empno,ename) values(#{empno},#{ename}) + + + update emp set sal=#{sal} where empno = #{empno} + + + delete from emp where empno = #{empno} + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.class" new file mode 100644 index 00000000..d4e5daec Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.xml" new file mode 100644 index 00000000..fd35ffb1 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDao.xml" @@ -0,0 +1,13 @@ + + + + + + + insert into user(user_name) values(#{userName}) + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDaoAnnotation.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDaoAnnotation.class" new file mode 100644 index 00000000..3dd630cd Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/com/mashibing/dao/UserDaoAnnotation.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/db.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/log4j.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/mybatis-config.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..9e9d684a --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/classes/mybatis-config.xml" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest.class" new file mode 100644 index 00000000..a4cc2ccc Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest2.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest2.class" new file mode 100644 index 00000000..6ad84169 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_helloworld/target/test-classes/MyTest2.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/compiler.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/compiler.xml" new file mode 100644 index 00000000..6f030025 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/encodings.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/misc.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/uiDesigner.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/workspace.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/workspace.xml" new file mode 100644 index 00000000..a78fcaa8 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/.idea/workspace.xml" @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * from dept left join emp on dept.deptno = emp.deptno where dept.deptno = #{deptno} + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..f4c60dc6 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/db.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/log4j.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..9e9d684a --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/test/java/MyTest.java" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/test/java/MyTest.java" new file mode 100644 index 00000000..02e44d19 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/src/test/java/MyTest.java" @@ -0,0 +1,58 @@ +import com.mashibing.bean.Dept; +import com.mashibing.bean.Emp; +import com.mashibing.dao.DeptDao; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class MyTest { + + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init(){ + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + + @Test + public void test01() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + @Test + public void test02() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + DeptDao mapper = sqlSession.getMapper(DeptDao.class); + Dept dept = mapper.selectDeptByDeptno(10); + System.out.println(dept); + //关闭会话 + sqlSession.close(); + + } + +} diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" new file mode 100644 index 00000000..04f8a347 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" new file mode 100644 index 00000000..a49f4e21 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" new file mode 100644 index 00000000..7e09a334 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..55887a71 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..5ba9d42d Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..f4c60dc6 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/db.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/log4j.properties" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/mybatis-config.xml" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..9e9d684a --- /dev/null +++ "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/classes/mybatis-config.xml" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/test-classes/MyTest.class" "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/test-classes/MyTest.class" new file mode 100644 index 00000000..92335c75 Binary files /dev/null and "b/javaframework/mybatis/02mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\250/mybatis_sqlmapping/target/test-classes/MyTest.class" differ diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/compiler.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/compiler.xml" new file mode 100644 index 00000000..6f030025 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/encodings.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/misc.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/uiDesigner.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/workspace.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/workspace.xml" new file mode 100644 index 00000000..e7d124ec --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/.idea/workspace.xml" @@ -0,0 +1,765 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1585402886095 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/mybatis_sqlmapping.iml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/mybatis_sqlmapping.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/mybatis_sqlmapping.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/pom.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/pom.xml" new file mode 100644 index 00000000..881d9580 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/pom.xml" @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.mashibing + mybatis_helloworld + 1.0-SNAPSHOT + + + + + + org.mybatis + mybatis + 3.5.4 + + + + mysql + mysql-connector-java + 8.0.19 + + + + junit + junit + 4.13 + test + + + + log4j + log4j + 1.2.17 + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Dept.java" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Dept.java" new file mode 100644 index 00000000..a71650e3 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Dept.java" @@ -0,0 +1,55 @@ +package com.mashibing.bean; + +import java.io.Serializable; +import java.util.List; + +public class Dept implements Serializable { + private Integer deptno; + private String dname; + private String loc; + + private List emps; + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + public String getDname() { + return dname; + } + + public void setDname(String dname) { + this.dname = dname; + } + + public String getLoc() { + return loc; + } + + public void setLoc(String loc) { + this.loc = loc; + } + + + public List getEmps() { + return emps; + } + + public void setEmps(List emps) { + this.emps = emps; + } + + @Override + public String toString() { + return "Dept{" + + "deptno=" + deptno + + ", dname='" + dname + '\'' + + ", loc='" + loc + '\'' + + ", emps=" + emps + + '}'; + } +} diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Emp.java" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Emp.java" new file mode 100644 index 00000000..7471502d --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Emp.java" @@ -0,0 +1,94 @@ +package com.mashibing.bean; + +import java.io.Serializable; +import java.util.Date; + +public class Emp implements Serializable { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Dept dept; + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Dept getDept() { + return dept; + } + + public void setDept(Dept dept) { + this.dept = dept; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", dept=" + dept + + '}'; + } +} diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/dao/DeptDao.java" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/dao/DeptDao.java" new file mode 100644 index 00000000..527f4276 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/dao/DeptDao.java" @@ -0,0 +1,12 @@ +package com.mashibing.dao; + +import com.mashibing.bean.Dept; + +public interface DeptDao { + + public Dept selectDeptByDeptno(Integer deptno); + + public Dept selectDeptByStep(Integer deptno); + + public Dept selectDeptByStemp2(Integer deptno); +} diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/dao/EmpDao.java" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/dao/EmpDao.java" new file mode 100644 index 00000000..b0a3bc5b --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/java/com/mashibing/dao/EmpDao.java" @@ -0,0 +1,21 @@ +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface EmpDao { + + public Emp selectEmpByEmpno(Integer empno); + + public Emp selectEmpByStep(Integer empno); + + public Emp selectEmpByStep2(Integer deptno); + + public Emp selectEmpByCondition(Emp emp); + + public List selectEmpByDeptnos(@Param("deptnos") List deptnos); + + public Integer update(Emp emp); +} diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..02bc54c1 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..47be3a91 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update emp set ename=#{ename} where empno = #{empno} + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/db.properties" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/log4j.properties" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..9d693bb9 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/test/java/MyTest.java" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/test/java/MyTest.java" new file mode 100644 index 00000000..706fcf03 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/src/test/java/MyTest.java" @@ -0,0 +1,187 @@ +import com.mashibing.bean.Dept; +import com.mashibing.bean.Emp; +import com.mashibing.dao.DeptDao; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; + +public class MyTest { + + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init() { + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + + @Test + public void test01() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test02() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + DeptDao mapper = sqlSession.getMapper(DeptDao.class); + Dept dept = mapper.selectDeptByDeptno(10); + System.out.println(dept); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test03() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByStep(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test04() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + DeptDao mapper = sqlSession.getMapper(DeptDao.class); + Dept dept = mapper.selectDeptByStemp2(10); + System.out.println(dept.getDname()); + System.out.println(dept.getEmps()); + //关闭会话 + sqlSession.close(); + + } + + + @Test + public void test05() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(7369); + emp.setEname("SMITH"); + emp.setSal(1000.0); + Emp emp2 = mapper.selectEmpByCondition(emp); + System.out.println(emp2); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test06() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + List list = mapper.selectEmpByDeptnos(Arrays.asList(10, 20)); + for (Emp emp : list) { + System.out.println(emp); + } + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test07() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + Emp emp2 = mapper2.selectEmpByEmpno(7369); + System.out.println(emp2); + sqlSession.close(); + sqlSession2.close(); + + } + + @Test + public void test08() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + EmpDao mapper2 = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + System.out.println("=================="); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + emp.setEname("Teacher"); +// Integer update = mapper2.update(emp); +// System.out.println(update); +// sqlSession.clearCache(); + System.out.println("=================="); + emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + sqlSession.close(); + + } + + @Test + public void test09(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + sqlSession.close(); + System.out.println("===================="); + Emp emp1 = mapper2.selectEmpByEmpno(7369); + System.out.println(emp1); + sqlSession2.close(); + + } +} diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" new file mode 100644 index 00000000..9dbe0dba Binary files /dev/null and "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" differ diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" new file mode 100644 index 00000000..4232c2ce Binary files /dev/null and "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" differ diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" new file mode 100644 index 00000000..2eff1994 Binary files /dev/null and "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" differ diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..02bc54c1 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..085c1789 Binary files /dev/null and "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..47be3a91 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update emp set ename=#{ename} where empno = #{empno} + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/db.properties" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/log4j.properties" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/mybatis-config.xml" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..9d693bb9 --- /dev/null +++ "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/classes/mybatis-config.xml" @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/test-classes/MyTest.class" "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/test-classes/MyTest.class" new file mode 100644 index 00000000..2aa8a483 Binary files /dev/null and "b/javaframework/mybatis/03mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/mybatis_sqlmapping/target/test-classes/MyTest.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/03mybatis\346\241\206\346\236\266\346\225\264\345\220\210\345\217\212\351\200\206\345\220\221\345\267\245\345\216\202.md" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/03mybatis\346\241\206\346\236\266\346\225\264\345\220\210\345\217\212\351\200\206\345\220\221\345\267\245\345\216\202.md" new file mode 100644 index 00000000..95cc0b4d --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/03mybatis\346\241\206\346\236\266\346\225\264\345\220\210\345\217\212\351\200\206\345\220\221\345\267\245\345\216\202.md" @@ -0,0 +1,774 @@ +# 03mybatis框架整合及逆向工厂 + +### 1、三大框架整合 + +​ 在老期的项目中,一般都是使用ssm项目做开发的,虽然现在的主流开发是springboot来做开发,但是ssm的基本整合还是需要掌握的。 + +##### 1、导入pom文件 + +1、导入spring的pom依赖 + +```xml + + + 4.0.0 + + com.mashibing + ssm + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.48 + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + javax.servlet + servlet-api + 2.5 + provided + + + + javax.servlet + jsp-api + 2.0 + provided + + + + com.fasterxml.jackson.core + jackson-core + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-databind + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.10.3 + + + + commons-io + commons-io + 2.6 + + + + commons-fileupload + commons-fileupload + 1.4 + + + + javax.servlet + jstl + 1.2 + + + org.mybatis + mybatis + 3.5.4 + + + + mysql + mysql-connector-java + 8.0.16 + + + + log4j + log4j + 1.2.17 + + + + org.mybatis + mybatis-spring + 2.0.4 + + + + +``` + +##### 2、编写各个框架的配置文件 + +web.xml + +```xml + + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + classpath:spring.xml + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + springmvc + / + + + + CharacterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + utf-8 + + + forceEncoding + true + + + + CharacterEncodingFilter + /* + + + + HiddenHttpMethodFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + HiddenHttpMethodFilter + /* + + +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + +``` + +spring.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +mybatis-config.xml + +```xml + + + + + + + + + + +``` + +db.properties + +```properties +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +jdbc.driverName=com.mysql.jdbc.Driver +``` + +拷贝映射文件,还是位于com.mashibing.dao目录 + +```xml + + + + + + + + + + + insert into emp(empno,ename) values(#{empno},#{ename}) + + + update emp set ename=#{ename} where empno = #{empno} + + + + + delete from emp where empno = #{empno} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update emp + + + empno=#{empno}, + + + ename = #{ename}, + + @ + sal = #{sal} + + + + empno = #{empno} + + + + +``` + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +添加dao的接口 + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface EmpDao { + + public Emp findEmpByEmpno(Integer empno); + + public int updateEmp(Emp emp); + + public int deleteEmp(Integer empno); + + public int insertEmp(Emp emp); + + Emp selectEmpByNoAndName(@Param("empno") Integer empno, @Param("ename") String ename, @Param("t") String tablename); + Emp selectEmpByNoAndName2(Map map); + + List selectAllEmp(); + + Map selectEmpByEmpReturnMap(Integer empno); + + @MapKey("empno") + Map getAllEmpReturnMap(); + + Emp selectEmpAndDept(Integer empno); + Emp selectEmpAndDeptBySimple(Integer empno); + List selectEmpByStep(Integer deptno); + + public List getEmpByCondition(Emp emp); + public List getEmpByConditionChoose(Emp emp); + public List getEmpByDeptnos(@Param("deptnos") List deptnos); + + public int updateEmpByEmpno(Emp emp); + +} + +``` + +##### 3、创建测试类 + +TestController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class TestController { + + @Autowired + EmpDao empDao; + + @RequestMapping("/test") + public String test(){ + System.out.println("test"); + Emp empByEmpno = empDao.findEmpByEmpno(7369); + System.out.println(empByEmpno); + return "success"; + } +} +``` + +### 2、mybatis逆向工程 + +引入pom依赖 + +```xml + + + org.mybatis.generator + mybatis-generator-core + 1.4.0 + +``` + +编写配置文件: + +```xml + + + + + + + + + + + + + + + + + +
+ + +``` + +编写测试类 + +```java +package com.mashibing; + +import org.mybatis.generator.api.MyBatisGenerator; +import org.mybatis.generator.config.Configuration; +import org.mybatis.generator.config.xml.ConfigurationParser; +import org.mybatis.generator.exception.InvalidConfigurationException; +import org.mybatis.generator.exception.XMLParserException; +import org.mybatis.generator.internal.DefaultShellCallback; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class Test { + public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException { + List warnings = new ArrayList(); + boolean overwrite = true; + File configFile = new File("mbg.xml"); + ConfigurationParser cp = new ConfigurationParser(warnings); + Configuration config = cp.parseConfiguration(configFile); + DefaultShellCallback callback = new DefaultShellCallback(overwrite); + MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); + myBatisGenerator.generate(null); + + } +} +``` + +### 3、分页插件 PageHelper(自学,项目中会使用) + diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/compiler.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/compiler.xml" new file mode 100644 index 00000000..283dd750 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/encodings.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/misc.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/workspace.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/workspace.xml" new file mode 100644 index 00000000..244f940b --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/.idea/workspace.xml" @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/mybatis_generator.iml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/mybatis_generator.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/mybatis_generator.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/pom.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/pom.xml" new file mode 100644 index 00000000..2dbabdf7 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/pom.xml" @@ -0,0 +1,63 @@ + + + 4.0.0 + + com.mashibing + mybatis_generator + 1.0-SNAPSHOT + + + + org.mybatis + mybatis + 3.5.4 + + + + mysql + mysql-connector-java + 8.0.19 + + + + junit + junit + 4.13 + test + + + + log4j + log4j + 1.2.17 + + + org.mybatis.caches + mybatis-ehcache + 1.2.0 + + + + org.slf4j + slf4j-api + 2.0.0-alpha1 + + + + org.slf4j + slf4j-log4j12 + 2.0.0-alpha1 + test + + + + org.mybatis.generator + mybatis-generator-core + 1.4.0 + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/MyTest.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/MyTest.java" new file mode 100644 index 00000000..86a95db2 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/MyTest.java" @@ -0,0 +1,24 @@ +package com.mashibing; + +import org.mybatis.generator.api.MyBatisGenerator; +import org.mybatis.generator.config.Configuration; +import org.mybatis.generator.config.xml.ConfigurationParser; +import org.mybatis.generator.exception.XMLParserException; +import org.mybatis.generator.internal.DefaultShellCallback; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class MyTest { + public static void main(String[] args) throws Exception { + List warnings = new ArrayList(); + boolean overwrite = true; + File configFile = new File("mbg.xml"); + ConfigurationParser cp = new ConfigurationParser(warnings); + Configuration config = cp.parseConfiguration(configFile); + DefaultShellCallback callback = new DefaultShellCallback(overwrite); + MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); + myBatisGenerator.generate(null); + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/bean/Dept.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/bean/Dept.java" new file mode 100644 index 00000000..0ae7a27a --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/bean/Dept.java" @@ -0,0 +1,44 @@ +package com.mashibing.bean; + +import javax.annotation.Generated; + +public class Dept { + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.DEPTNO") + private Integer deptno; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.DNAME") + private String dname; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.LOC") + private String loc; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.DEPTNO") + public Integer getDeptno() { + return deptno; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.DEPTNO") + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.DNAME") + public String getDname() { + return dname; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.DNAME") + public void setDname(String dname) { + this.dname = dname; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.937+08:00", comments="Source field: dept.LOC") + public String getLoc() { + return loc; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.938+08:00", comments="Source field: dept.LOC") + public void setLoc(String loc) { + this.loc = loc; + } +} \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/bean/Emp.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/bean/Emp.java" new file mode 100644 index 00000000..f1091f56 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/bean/Emp.java" @@ -0,0 +1,110 @@ +package com.mashibing.bean; + +import java.util.Date; +import javax.annotation.Generated; + +public class Emp { + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.86+08:00", comments="Source field: emp.EMPNO") + private Integer empno; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.ENAME") + private String ename; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.JOB") + private String job; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.MGR") + private Integer mgr; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.HIREDATE") + private Date hiredate; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.SAL") + private Double sal; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.COMM") + private Double comm; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.DEPTNO") + private Integer deptno; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.867+08:00", comments="Source field: emp.EMPNO") + public Integer getEmpno() { + return empno; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.EMPNO") + public void setEmpno(Integer empno) { + this.empno = empno; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.ENAME") + public String getEname() { + return ename; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.ENAME") + public void setEname(String ename) { + this.ename = ename; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.JOB") + public String getJob() { + return job; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.JOB") + public void setJob(String job) { + this.job = job; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.MGR") + public Integer getMgr() { + return mgr; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.868+08:00", comments="Source field: emp.MGR") + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.HIREDATE") + public Date getHiredate() { + return hiredate; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.HIREDATE") + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.SAL") + public Double getSal() { + return sal; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.SAL") + public void setSal(Double sal) { + this.sal = sal; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.COMM") + public Double getComm() { + return comm; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.869+08:00", comments="Source field: emp.COMM") + public void setComm(Double comm) { + this.comm = comm; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.87+08:00", comments="Source field: emp.DEPTNO") + public Integer getDeptno() { + return deptno; + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.87+08:00", comments="Source field: emp.DEPTNO") + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } +} \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/DeptDynamicSqlSupport.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/DeptDynamicSqlSupport.java" new file mode 100644 index 00000000..94a663cd --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/DeptDynamicSqlSupport.java" @@ -0,0 +1,33 @@ +package com.mashibing.dao; + +import java.sql.JDBCType; +import javax.annotation.Generated; +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + +public final class DeptDynamicSqlSupport { + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.938+08:00", comments="Source Table: dept") + public static final Dept dept = new Dept(); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.938+08:00", comments="Source field: dept.DEPTNO") + public static final SqlColumn deptno = dept.deptno; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.938+08:00", comments="Source field: dept.DNAME") + public static final SqlColumn dname = dept.dname; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.938+08:00", comments="Source field: dept.LOC") + public static final SqlColumn loc = dept.loc; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.938+08:00", comments="Source Table: dept") + public static final class Dept extends SqlTable { + public final SqlColumn deptno = column("DEPTNO", JDBCType.INTEGER); + + public final SqlColumn dname = column("DNAME", JDBCType.VARCHAR); + + public final SqlColumn loc = column("LOC", JDBCType.VARCHAR); + + public Dept() { + super("dept"); + } + } +} \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/DeptMapper.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/DeptMapper.java" new file mode 100644 index 00000000..179e764c --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/DeptMapper.java" @@ -0,0 +1,176 @@ +package com.mashibing.dao; + +import static com.mashibing.dao.DeptDynamicSqlSupport.*; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import com.mashibing.bean.Dept; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import javax.annotation.Generated; +import org.apache.ibatis.annotations.DeleteProvider; +import org.apache.ibatis.annotations.InsertProvider; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.UpdateProvider; +import org.apache.ibatis.type.JdbcType; +import org.mybatis.dynamic.sql.BasicColumn; +import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter; +import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; +import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider; +import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; +import org.mybatis.dynamic.sql.select.CountDSLCompleter; +import org.mybatis.dynamic.sql.select.SelectDSLCompleter; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.update.UpdateDSL; +import org.mybatis.dynamic.sql.update.UpdateDSLCompleter; +import org.mybatis.dynamic.sql.update.UpdateModel; +import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; +import org.mybatis.dynamic.sql.util.SqlProviderAdapter; +import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils; + +@Mapper +public interface DeptMapper { + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + BasicColumn[] selectList = BasicColumn.columnList(deptno, dname, loc); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @SelectProvider(type=SqlProviderAdapter.class, method="select") + long count(SelectStatementProvider selectStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @DeleteProvider(type=SqlProviderAdapter.class, method="delete") + int delete(DeleteStatementProvider deleteStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @InsertProvider(type=SqlProviderAdapter.class, method="insert") + int insert(InsertStatementProvider insertStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @InsertProvider(type=SqlProviderAdapter.class, method="insertMultiple") + int insertMultiple(MultiRowInsertStatementProvider multipleInsertStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @SelectProvider(type=SqlProviderAdapter.class, method="select") + @ResultMap("DeptResult") + Optional selectOne(SelectStatementProvider selectStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @SelectProvider(type=SqlProviderAdapter.class, method="select") + @Results(id="DeptResult", value = { + @Result(column="DEPTNO", property="deptno", jdbcType=JdbcType.INTEGER, id=true), + @Result(column="DNAME", property="dname", jdbcType=JdbcType.VARCHAR), + @Result(column="LOC", property="loc", jdbcType=JdbcType.VARCHAR) + }) + List selectMany(SelectStatementProvider selectStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + @UpdateProvider(type=SqlProviderAdapter.class, method="update") + int update(UpdateStatementProvider updateStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + default long count(CountDSLCompleter completer) { + return MyBatis3Utils.countFrom(this::count, dept, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.939+08:00", comments="Source Table: dept") + default int delete(DeleteDSLCompleter completer) { + return MyBatis3Utils.deleteFrom(this::delete, dept, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default int deleteByPrimaryKey(Integer deptno_) { + return delete(c -> + c.where(deptno, isEqualTo(deptno_)) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default int insert(Dept record) { + return MyBatis3Utils.insert(this::insert, record, dept, c -> + c.map(deptno).toProperty("deptno") + .map(dname).toProperty("dname") + .map(loc).toProperty("loc") + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default int insertMultiple(Collection records) { + return MyBatis3Utils.insertMultiple(this::insertMultiple, records, dept, c -> + c.map(deptno).toProperty("deptno") + .map(dname).toProperty("dname") + .map(loc).toProperty("loc") + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default int insertSelective(Dept record) { + return MyBatis3Utils.insert(this::insert, record, dept, c -> + c.map(deptno).toPropertyWhenPresent("deptno", record::getDeptno) + .map(dname).toPropertyWhenPresent("dname", record::getDname) + .map(loc).toPropertyWhenPresent("loc", record::getLoc) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default Optional selectOne(SelectDSLCompleter completer) { + return MyBatis3Utils.selectOne(this::selectOne, selectList, dept, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default List select(SelectDSLCompleter completer) { + return MyBatis3Utils.selectList(this::selectMany, selectList, dept, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.94+08:00", comments="Source Table: dept") + default List selectDistinct(SelectDSLCompleter completer) { + return MyBatis3Utils.selectDistinct(this::selectMany, selectList, dept, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.941+08:00", comments="Source Table: dept") + default Optional selectByPrimaryKey(Integer deptno_) { + return selectOne(c -> + c.where(deptno, isEqualTo(deptno_)) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.941+08:00", comments="Source Table: dept") + default int update(UpdateDSLCompleter completer) { + return MyBatis3Utils.update(this::update, dept, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.941+08:00", comments="Source Table: dept") + static UpdateDSL updateAllColumns(Dept record, UpdateDSL dsl) { + return dsl.set(deptno).equalTo(record::getDeptno) + .set(dname).equalTo(record::getDname) + .set(loc).equalTo(record::getLoc); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.941+08:00", comments="Source Table: dept") + static UpdateDSL updateSelectiveColumns(Dept record, UpdateDSL dsl) { + return dsl.set(deptno).equalToWhenPresent(record::getDeptno) + .set(dname).equalToWhenPresent(record::getDname) + .set(loc).equalToWhenPresent(record::getLoc); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.941+08:00", comments="Source Table: dept") + default int updateByPrimaryKey(Dept record) { + return update(c -> + c.set(dname).equalTo(record::getDname) + .set(loc).equalTo(record::getLoc) + .where(deptno, isEqualTo(record::getDeptno)) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.942+08:00", comments="Source Table: dept") + default int updateByPrimaryKeySelective(Dept record) { + return update(c -> + c.set(dname).equalToWhenPresent(record::getDname) + .set(loc).equalToWhenPresent(record::getLoc) + .where(deptno, isEqualTo(record::getDeptno)) + ); + } +} \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/EmpDynamicSqlSupport.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/EmpDynamicSqlSupport.java" new file mode 100644 index 00000000..970c453d --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/EmpDynamicSqlSupport.java" @@ -0,0 +1,59 @@ +package com.mashibing.dao; + +import java.sql.JDBCType; +import java.util.Date; +import javax.annotation.Generated; +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + +public final class EmpDynamicSqlSupport { + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.876+08:00", comments="Source Table: emp") + public static final Emp emp = new Emp(); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.892+08:00", comments="Source field: emp.EMPNO") + public static final SqlColumn empno = emp.empno; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.893+08:00", comments="Source field: emp.ENAME") + public static final SqlColumn ename = emp.ename; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.893+08:00", comments="Source field: emp.JOB") + public static final SqlColumn job = emp.job; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.894+08:00", comments="Source field: emp.MGR") + public static final SqlColumn mgr = emp.mgr; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.894+08:00", comments="Source field: emp.HIREDATE") + public static final SqlColumn hiredate = emp.hiredate; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.894+08:00", comments="Source field: emp.SAL") + public static final SqlColumn sal = emp.sal; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.895+08:00", comments="Source field: emp.COMM") + public static final SqlColumn comm = emp.comm; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.895+08:00", comments="Source field: emp.DEPTNO") + public static final SqlColumn deptno = emp.deptno; + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.891+08:00", comments="Source Table: emp") + public static final class Emp extends SqlTable { + public final SqlColumn empno = column("EMPNO", JDBCType.INTEGER); + + public final SqlColumn ename = column("ENAME", JDBCType.VARCHAR); + + public final SqlColumn job = column("JOB", JDBCType.VARCHAR); + + public final SqlColumn mgr = column("MGR", JDBCType.INTEGER); + + public final SqlColumn hiredate = column("HIREDATE", JDBCType.DATE); + + public final SqlColumn sal = column("SAL", JDBCType.DOUBLE); + + public final SqlColumn comm = column("COMM", JDBCType.DOUBLE); + + public final SqlColumn deptno = column("DEPTNO", JDBCType.INTEGER); + + public Emp() { + super("emp"); + } + } +} \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/EmpMapper.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/EmpMapper.java" new file mode 100644 index 00000000..4f5ddce9 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/java/com/mashibing/dao/EmpMapper.java" @@ -0,0 +1,216 @@ +package com.mashibing.dao; + +import static com.mashibing.dao.EmpDynamicSqlSupport.*; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import com.mashibing.bean.Emp; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import javax.annotation.Generated; +import org.apache.ibatis.annotations.DeleteProvider; +import org.apache.ibatis.annotations.InsertProvider; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.UpdateProvider; +import org.apache.ibatis.type.JdbcType; +import org.mybatis.dynamic.sql.BasicColumn; +import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter; +import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider; +import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider; +import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider; +import org.mybatis.dynamic.sql.select.CountDSLCompleter; +import org.mybatis.dynamic.sql.select.SelectDSLCompleter; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.update.UpdateDSL; +import org.mybatis.dynamic.sql.update.UpdateDSLCompleter; +import org.mybatis.dynamic.sql.update.UpdateModel; +import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; +import org.mybatis.dynamic.sql.util.SqlProviderAdapter; +import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils; + +@Mapper +public interface EmpMapper { + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.92+08:00", comments="Source Table: emp") + BasicColumn[] selectList = BasicColumn.columnList(empno, ename, job, mgr, hiredate, sal, comm, deptno); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.896+08:00", comments="Source Table: emp") + @SelectProvider(type=SqlProviderAdapter.class, method="select") + long count(SelectStatementProvider selectStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.9+08:00", comments="Source Table: emp") + @DeleteProvider(type=SqlProviderAdapter.class, method="delete") + int delete(DeleteStatementProvider deleteStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.901+08:00", comments="Source Table: emp") + @InsertProvider(type=SqlProviderAdapter.class, method="insert") + int insert(InsertStatementProvider insertStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.903+08:00", comments="Source Table: emp") + @InsertProvider(type=SqlProviderAdapter.class, method="insertMultiple") + int insertMultiple(MultiRowInsertStatementProvider multipleInsertStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.904+08:00", comments="Source Table: emp") + @SelectProvider(type=SqlProviderAdapter.class, method="select") + @ResultMap("EmpResult") + Optional selectOne(SelectStatementProvider selectStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.905+08:00", comments="Source Table: emp") + @SelectProvider(type=SqlProviderAdapter.class, method="select") + @Results(id="EmpResult", value = { + @Result(column="EMPNO", property="empno", jdbcType=JdbcType.INTEGER, id=true), + @Result(column="ENAME", property="ename", jdbcType=JdbcType.VARCHAR), + @Result(column="JOB", property="job", jdbcType=JdbcType.VARCHAR), + @Result(column="MGR", property="mgr", jdbcType=JdbcType.INTEGER), + @Result(column="HIREDATE", property="hiredate", jdbcType=JdbcType.DATE), + @Result(column="SAL", property="sal", jdbcType=JdbcType.DOUBLE), + @Result(column="COMM", property="comm", jdbcType=JdbcType.DOUBLE), + @Result(column="DEPTNO", property="deptno", jdbcType=JdbcType.INTEGER) + }) + List selectMany(SelectStatementProvider selectStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.908+08:00", comments="Source Table: emp") + @UpdateProvider(type=SqlProviderAdapter.class, method="update") + int update(UpdateStatementProvider updateStatement); + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.909+08:00", comments="Source Table: emp") + default long count(CountDSLCompleter completer) { + return MyBatis3Utils.countFrom(this::count, emp, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.91+08:00", comments="Source Table: emp") + default int delete(DeleteDSLCompleter completer) { + return MyBatis3Utils.deleteFrom(this::delete, emp, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.911+08:00", comments="Source Table: emp") + default int deleteByPrimaryKey(Integer empno_) { + return delete(c -> + c.where(empno, isEqualTo(empno_)) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.912+08:00", comments="Source Table: emp") + default int insert(Emp record) { + return MyBatis3Utils.insert(this::insert, record, emp, c -> + c.map(empno).toProperty("empno") + .map(ename).toProperty("ename") + .map(job).toProperty("job") + .map(mgr).toProperty("mgr") + .map(hiredate).toProperty("hiredate") + .map(sal).toProperty("sal") + .map(comm).toProperty("comm") + .map(deptno).toProperty("deptno") + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.916+08:00", comments="Source Table: emp") + default int insertMultiple(Collection records) { + return MyBatis3Utils.insertMultiple(this::insertMultiple, records, emp, c -> + c.map(empno).toProperty("empno") + .map(ename).toProperty("ename") + .map(job).toProperty("job") + .map(mgr).toProperty("mgr") + .map(hiredate).toProperty("hiredate") + .map(sal).toProperty("sal") + .map(comm).toProperty("comm") + .map(deptno).toProperty("deptno") + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.917+08:00", comments="Source Table: emp") + default int insertSelective(Emp record) { + return MyBatis3Utils.insert(this::insert, record, emp, c -> + c.map(empno).toPropertyWhenPresent("empno", record::getEmpno) + .map(ename).toPropertyWhenPresent("ename", record::getEname) + .map(job).toPropertyWhenPresent("job", record::getJob) + .map(mgr).toPropertyWhenPresent("mgr", record::getMgr) + .map(hiredate).toPropertyWhenPresent("hiredate", record::getHiredate) + .map(sal).toPropertyWhenPresent("sal", record::getSal) + .map(comm).toPropertyWhenPresent("comm", record::getComm) + .map(deptno).toPropertyWhenPresent("deptno", record::getDeptno) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.922+08:00", comments="Source Table: emp") + default Optional selectOne(SelectDSLCompleter completer) { + return MyBatis3Utils.selectOne(this::selectOne, selectList, emp, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.923+08:00", comments="Source Table: emp") + default List select(SelectDSLCompleter completer) { + return MyBatis3Utils.selectList(this::selectMany, selectList, emp, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.924+08:00", comments="Source Table: emp") + default List selectDistinct(SelectDSLCompleter completer) { + return MyBatis3Utils.selectDistinct(this::selectMany, selectList, emp, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.925+08:00", comments="Source Table: emp") + default Optional selectByPrimaryKey(Integer empno_) { + return selectOne(c -> + c.where(empno, isEqualTo(empno_)) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.926+08:00", comments="Source Table: emp") + default int update(UpdateDSLCompleter completer) { + return MyBatis3Utils.update(this::update, emp, completer); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.927+08:00", comments="Source Table: emp") + static UpdateDSL updateAllColumns(Emp record, UpdateDSL dsl) { + return dsl.set(empno).equalTo(record::getEmpno) + .set(ename).equalTo(record::getEname) + .set(job).equalTo(record::getJob) + .set(mgr).equalTo(record::getMgr) + .set(hiredate).equalTo(record::getHiredate) + .set(sal).equalTo(record::getSal) + .set(comm).equalTo(record::getComm) + .set(deptno).equalTo(record::getDeptno); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.928+08:00", comments="Source Table: emp") + static UpdateDSL updateSelectiveColumns(Emp record, UpdateDSL dsl) { + return dsl.set(empno).equalToWhenPresent(record::getEmpno) + .set(ename).equalToWhenPresent(record::getEname) + .set(job).equalToWhenPresent(record::getJob) + .set(mgr).equalToWhenPresent(record::getMgr) + .set(hiredate).equalToWhenPresent(record::getHiredate) + .set(sal).equalToWhenPresent(record::getSal) + .set(comm).equalToWhenPresent(record::getComm) + .set(deptno).equalToWhenPresent(record::getDeptno); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.931+08:00", comments="Source Table: emp") + default int updateByPrimaryKey(Emp record) { + return update(c -> + c.set(ename).equalTo(record::getEname) + .set(job).equalTo(record::getJob) + .set(mgr).equalTo(record::getMgr) + .set(hiredate).equalTo(record::getHiredate) + .set(sal).equalTo(record::getSal) + .set(comm).equalTo(record::getComm) + .set(deptno).equalTo(record::getDeptno) + .where(empno, isEqualTo(record::getEmpno)) + ); + } + + @Generated(value="org.mybatis.generator.api.MyBatisGenerator", date="2020-03-29T21:11:27.932+08:00", comments="Source Table: emp") + default int updateByPrimaryKeySelective(Emp record) { + return update(c -> + c.set(ename).equalToWhenPresent(record::getEname) + .set(job).equalToWhenPresent(record::getJob) + .set(mgr).equalToWhenPresent(record::getMgr) + .set(hiredate).equalToWhenPresent(record::getHiredate) + .set(sal).equalToWhenPresent(record::getSal) + .set(comm).equalToWhenPresent(record::getComm) + .set(deptno).equalToWhenPresent(record::getDeptno) + .where(empno, isEqualTo(record::getEmpno)) + ); + } +} \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/log4j.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..e2b93dcd --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/main/resources/mybatis-config.xml" @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/test/java/MyTest.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/test/java/MyTest.java" new file mode 100644 index 00000000..a1c04345 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/src/test/java/MyTest.java" @@ -0,0 +1,39 @@ +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class MyTest { + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init() { + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + +// @Test +// public void test01() throws IOException { +// +// //获取与数据库相关的会话 +// SqlSession sqlSession = sqlSessionFactory.openSession(); +// //获取对应的映射接口对象 +// EmpMapper mapper = sqlSession.getMapper(EmpMapper.class); +// Emp emp = mapper.selectByPrimaryKey(7369); +// System.out.println(emp); +// //关闭会话 +// sqlSession.close(); +// +// } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/META-INF/mybatis_generator.kotlin_module" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/META-INF/mybatis_generator.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/META-INF/mybatis_generator.kotlin_module" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/com/mashibing/MyTest.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/com/mashibing/MyTest.class" new file mode 100644 index 00000000..374d3073 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/com/mashibing/MyTest.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/log4j.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..e2b93dcd --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/classes/mybatis-config.xml" @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/test-classes/MyTest.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/test-classes/MyTest.class" new file mode 100644 index 00000000..e2f0b366 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_generator/target/test-classes/MyTest.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/compiler.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/compiler.xml" new file mode 100644 index 00000000..6f030025 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/encodings.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/misc.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/uiDesigner.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/workspace.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/workspace.xml" new file mode 100644 index 00000000..33cb9f90 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/.idea/workspace.xml" @@ -0,0 +1,721 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1585402886095 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/mybatis_sqlmapping.iml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/mybatis_sqlmapping.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/mybatis_sqlmapping.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/pom.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/pom.xml" new file mode 100644 index 00000000..23d52650 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/pom.xml" @@ -0,0 +1,67 @@ + + + 4.0.0 + + com.mashibing + mybatis_helloworld + 1.0-SNAPSHOT + + + + + + org.mybatis + mybatis + 3.5.4 + + + + mysql + mysql-connector-java + 8.0.19 + + + + junit + junit + 4.13 + test + + + + log4j + log4j + 1.2.17 + + + org.mybatis.caches + mybatis-ehcache + 1.2.0 + + + + org.slf4j + slf4j-api + 2.0.0-alpha1 + + + + org.slf4j + slf4j-log4j12 + 2.0.0-alpha1 + test + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Dept.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Dept.java" new file mode 100644 index 00000000..a71650e3 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Dept.java" @@ -0,0 +1,55 @@ +package com.mashibing.bean; + +import java.io.Serializable; +import java.util.List; + +public class Dept implements Serializable { + private Integer deptno; + private String dname; + private String loc; + + private List emps; + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + public String getDname() { + return dname; + } + + public void setDname(String dname) { + this.dname = dname; + } + + public String getLoc() { + return loc; + } + + public void setLoc(String loc) { + this.loc = loc; + } + + + public List getEmps() { + return emps; + } + + public void setEmps(List emps) { + this.emps = emps; + } + + @Override + public String toString() { + return "Dept{" + + "deptno=" + deptno + + ", dname='" + dname + '\'' + + ", loc='" + loc + '\'' + + ", emps=" + emps + + '}'; + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Emp.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Emp.java" new file mode 100644 index 00000000..7471502d --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/bean/Emp.java" @@ -0,0 +1,94 @@ +package com.mashibing.bean; + +import java.io.Serializable; +import java.util.Date; + +public class Emp implements Serializable { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Dept dept; + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Dept getDept() { + return dept; + } + + public void setDept(Dept dept) { + this.dept = dept; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", dept=" + dept + + '}'; + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/dao/DeptDao.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/dao/DeptDao.java" new file mode 100644 index 00000000..527f4276 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/dao/DeptDao.java" @@ -0,0 +1,12 @@ +package com.mashibing.dao; + +import com.mashibing.bean.Dept; + +public interface DeptDao { + + public Dept selectDeptByDeptno(Integer deptno); + + public Dept selectDeptByStep(Integer deptno); + + public Dept selectDeptByStemp2(Integer deptno); +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/dao/EmpDao.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/dao/EmpDao.java" new file mode 100644 index 00000000..b0a3bc5b --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/java/com/mashibing/dao/EmpDao.java" @@ -0,0 +1,21 @@ +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface EmpDao { + + public Emp selectEmpByEmpno(Integer empno); + + public Emp selectEmpByStep(Integer empno); + + public Emp selectEmpByStep2(Integer deptno); + + public Emp selectEmpByCondition(Emp emp); + + public List selectEmpByDeptnos(@Param("deptnos") List deptnos); + + public Integer update(Emp emp); +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..02bc54c1 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..eef1e941 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update emp set ename=#{ename} where empno = #{empno} + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/ehcache.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/ehcache.xml" new file mode 100644 index 00000000..2bd9c902 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/ehcache.xml" @@ -0,0 +1,17 @@ + + + + + + + + diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/log4j.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..9d693bb9 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/main/resources/mybatis-config.xml" @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/test/java/MyTest.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/test/java/MyTest.java" new file mode 100644 index 00000000..47036761 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/src/test/java/MyTest.java" @@ -0,0 +1,204 @@ +import com.mashibing.bean.Dept; +import com.mashibing.bean.Emp; +import com.mashibing.dao.DeptDao; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; + +public class MyTest { + + SqlSessionFactory sqlSessionFactory = null; + + @Before + public void init() { + String resource = "mybatis-config.xml"; + InputStream inputStream = null; + try { + inputStream = Resources.getResourceAsStream(resource); + } catch (IOException e) { + e.printStackTrace(); + } + sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + } + + @Test + public void test01() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test02() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + DeptDao mapper = sqlSession.getMapper(DeptDao.class); + Dept dept = mapper.selectDeptByDeptno(10); + System.out.println(dept); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test03() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByStep(7369); + System.out.println(emp); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test04() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + DeptDao mapper = sqlSession.getMapper(DeptDao.class); + Dept dept = mapper.selectDeptByStemp2(10); + System.out.println(dept.getDname()); + System.out.println(dept.getEmps()); + //关闭会话 + sqlSession.close(); + + } + + + @Test + public void test05() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(7369); + emp.setEname("SMITH"); + emp.setSal(1000.0); + Emp emp2 = mapper.selectEmpByCondition(emp); + System.out.println(emp2); + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test06() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + List list = mapper.selectEmpByDeptnos(Arrays.asList(10, 20)); + for (Emp emp : list) { + System.out.println(emp); + } + //关闭会话 + sqlSession.close(); + + } + + @Test + public void test07() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + Emp emp2 = mapper2.selectEmpByEmpno(7369); + System.out.println(emp2); + sqlSession.close(); + sqlSession2.close(); + + } + + @Test + public void test08() throws IOException { + + //获取与数据库相关的会话 + SqlSession sqlSession = sqlSessionFactory.openSession(); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + //获取对应的映射接口对象 + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + System.out.println("=================="); + emp.setEname("Teacher"); + Integer update = mapper2.update(emp); + System.out.println(update); +// sqlSession.clearCache(); + System.out.println("=================="); + emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + sqlSession.close(); + + } + + @Test + public void test09(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class); + + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + sqlSession.close(); + System.out.println("===================="); + Emp emp1 = mapper2.selectEmpByEmpno(7369); + System.out.println(emp1); + sqlSession2.close(); + } + + @Test + public void test10(){ + SqlSession sqlSession = sqlSessionFactory.openSession(); + EmpDao mapper = sqlSession.getMapper(EmpDao.class); + Emp emp = mapper.selectEmpByEmpno(7369); + System.out.println(emp); + sqlSession.close(); + + SqlSession sqlSession2 = sqlSessionFactory.openSession(); + EmpDao mapper2= sqlSession2.getMapper(EmpDao.class); + Emp emp2 = mapper2.selectEmpByEmpno(7369); + System.out.println(emp2); + Emp emp3 = mapper2.selectEmpByEmpno(7369); + System.out.println(emp3); + + Emp emp4 = mapper2.selectEmpByEmpno(7499); + System.out.println(emp4); + Emp emp5 = mapper2.selectEmpByEmpno(7499); + System.out.println(emp5); + sqlSession2.close(); + + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" new file mode 100644 index 00000000..9dbe0dba Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/bean/Dept.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" new file mode 100644 index 00000000..4232c2ce Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/bean/Emp.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" new file mode 100644 index 00000000..2eff1994 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..02bc54c1 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..085c1789 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..eef1e941 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update emp set ename=#{ename} where empno = #{empno} + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/ehcache.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/ehcache.xml" new file mode 100644 index 00000000..2bd9c902 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/ehcache.xml" @@ -0,0 +1,17 @@ + + + + + + + + diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/log4j.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/log4j.properties" new file mode 100644 index 00000000..91cb0733 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/log4j.properties" @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E +log4j.rootLogger=ERROR, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..9d693bb9 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/classes/mybatis-config.xml" @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/test-classes/MyTest.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/test-classes/MyTest.class" new file mode 100644 index 00000000..93e6bef5 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/mybatis_sqlmapping/target/test-classes/MyTest.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/artifacts/ssm_war_exploded.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/artifacts/ssm_war_exploded.xml" new file mode 100644 index 00000000..4e5621b0 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/artifacts/ssm_war_exploded.xml" @@ -0,0 +1,49 @@ + + + $PROJECT_DIR$/out/artifacts/ssm_war_exploded + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/compiler.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/compiler.xml" new file mode 100644 index 00000000..2f385c85 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/encodings.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/misc.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/uiDesigner.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/workspace.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/workspace.xml" new file mode 100644 index 00000000..18d25b77 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/.idea/workspace.xml" @@ -0,0 +1,825 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * from emp where empno = #{empno} + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/mybatis-config.xml" new file mode 100644 index 00000000..85558add --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/mybatis-config.xml" @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/spring.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/spring.xml" new file mode 100644 index 00000000..2ace59d4 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/spring.xml" @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/springmvc.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/springmvc.xml" new file mode 100644 index 00000000..341b615d --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/classes/springmvc.xml" @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/aopalliance-1.0.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/aopalliance-1.0.jar" new file mode 100644 index 00000000..578b1a0c Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/aopalliance-1.0.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/asm-7.1.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/asm-7.1.jar" new file mode 100644 index 00000000..355eb08d Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/asm-7.1.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/aspectjweaver-1.9.5.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/aspectjweaver-1.9.5.jar" new file mode 100644 index 00000000..e3ec2c31 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/aspectjweaver-1.9.5.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/cglib-3.3.0.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/cglib-3.3.0.jar" new file mode 100644 index 00000000..ed830f40 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/cglib-3.3.0.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/commons-fileupload-1.4.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/commons-fileupload-1.4.jar" new file mode 100644 index 00000000..e25a6bc9 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/commons-fileupload-1.4.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/commons-io-2.6.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/commons-io-2.6.jar" new file mode 100644 index 00000000..00556b11 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/commons-io-2.6.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/druid-1.1.21.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/druid-1.1.21.jar" new file mode 100644 index 00000000..605b7f9c Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/druid-1.1.21.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/ehcache-2.10.6.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/ehcache-2.10.6.jar" new file mode 100644 index 00000000..95e2dbab Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/ehcache-2.10.6.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/hamcrest-core-1.3.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/hamcrest-core-1.3.jar" new file mode 100644 index 00000000..9d5fe16e Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/hamcrest-core-1.3.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-annotations-2.10.3.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-annotations-2.10.3.jar" new file mode 100644 index 00000000..e915f5ba Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-annotations-2.10.3.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-core-2.10.3.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-core-2.10.3.jar" new file mode 100644 index 00000000..a4059c37 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-core-2.10.3.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-databind-2.10.3.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-databind-2.10.3.jar" new file mode 100644 index 00000000..a5d6cf66 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jackson-databind-2.10.3.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jstl-1.2.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jstl-1.2.jar" new file mode 100644 index 00000000..0fd275e9 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/jstl-1.2.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/junit-4.13.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/junit-4.13.jar" new file mode 100644 index 00000000..acc3c432 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/junit-4.13.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/log4j-1.2.17.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/log4j-1.2.17.jar" new file mode 100644 index 00000000..1d425cf7 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/log4j-1.2.17.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-3.5.4.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-3.5.4.jar" new file mode 100644 index 00000000..175015a2 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-3.5.4.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-ehcache-1.2.0.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-ehcache-1.2.0.jar" new file mode 100644 index 00000000..b3013332 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-ehcache-1.2.0.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-spring-2.0.4.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-spring-2.0.4.jar" new file mode 100644 index 00000000..14207a4e Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mybatis-spring-2.0.4.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mysql-connector-java-8.0.19.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mysql-connector-java-8.0.19.jar" new file mode 100644 index 00000000..77505177 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/mysql-connector-java-8.0.19.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/protobuf-java-3.6.1.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/protobuf-java-3.6.1.jar" new file mode 100644 index 00000000..8a187891 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/protobuf-java-3.6.1.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/slf4j-api-2.0.0-alpha1.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/slf4j-api-2.0.0-alpha1.jar" new file mode 100644 index 00000000..c38dbb58 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/slf4j-api-2.0.0-alpha1.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/slf4j-log4j12-2.0.0-alpha1.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/slf4j-log4j12-2.0.0-alpha1.jar" new file mode 100644 index 00000000..9af97f4f Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/slf4j-log4j12-2.0.0-alpha1.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..b4c9ae0a Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-aspects-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-aspects-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..bc57dbc9 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-aspects-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..839ca434 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..72ead317 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..00f47493 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..abc4420d Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..fa988fa4 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-jdbc-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-jdbc-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..83dcd509 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-jdbc-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-orm-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-orm-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..c1e5c9ff Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-orm-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-tx-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-tx-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..47d64ddd Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-tx-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..afa0f577 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..af4bbb08 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/page/success.jsp" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/page/success.jsp" new file mode 100644 index 00000000..c6d0f5ea --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/page/success.jsp" @@ -0,0 +1,18 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/29 + Time: 21:49 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +ssm 6666 +
+${emp} + + diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/web.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/web.xml" new file mode 100644 index 00000000..a5c23549 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/WEB-INF/web.xml" @@ -0,0 +1,54 @@ + + + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + classpath:spring.xml + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + springmvc + / + + + + CharacterEncoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + utf-8 + + + forceEncoding + true + + + + CharacterEncoding + /* + + + + rest + org.springframework.web.filter.HiddenHttpMethodFilter + + + rest + /* + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/index.jsp" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/index.jsp" new file mode 100644 index 00000000..9d3b7356 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/out/artifacts/ssm_war_exploded/index.jsp" @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/29 + Time: 21:22 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + $END$ + + diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/pom.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/pom.xml" new file mode 100644 index 00000000..92e11317 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/pom.xml" @@ -0,0 +1,180 @@ + + + 4.0.0 + + com.mashibing + ssm + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.48 + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + javax.servlet + servlet-api + 2.5 + provided + + + + + javax.servlet + jsp-api + 2.0 + provided + + + + com.fasterxml.jackson.core + jackson-core + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-databind + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.10.3 + + + + commons-io + commons-io + 2.6 + + + + commons-fileupload + commons-fileupload + 1.4 + + + + javax.servlet + jstl + 1.2 + + + + org.mybatis + mybatis + 3.5.4 + + + + mysql + mysql-connector-java + 8.0.19 + + + + junit + junit + 4.13 + test + + + + log4j + log4j + 1.2.17 + + + org.mybatis.caches + mybatis-ehcache + 1.2.0 + + + + org.slf4j + slf4j-api + 2.0.0-alpha1 + + + + org.slf4j + slf4j-log4j12 + 2.0.0-alpha1 + test + + + + org.mybatis + mybatis-spring + 2.0.4 + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/bean/Dept.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/bean/Dept.java" new file mode 100644 index 00000000..a71650e3 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/bean/Dept.java" @@ -0,0 +1,55 @@ +package com.mashibing.bean; + +import java.io.Serializable; +import java.util.List; + +public class Dept implements Serializable { + private Integer deptno; + private String dname; + private String loc; + + private List emps; + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + public String getDname() { + return dname; + } + + public void setDname(String dname) { + this.dname = dname; + } + + public String getLoc() { + return loc; + } + + public void setLoc(String loc) { + this.loc = loc; + } + + + public List getEmps() { + return emps; + } + + public void setEmps(List emps) { + this.emps = emps; + } + + @Override + public String toString() { + return "Dept{" + + "deptno=" + deptno + + ", dname='" + dname + '\'' + + ", loc='" + loc + '\'' + + ", emps=" + emps + + '}'; + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/bean/Emp.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/bean/Emp.java" new file mode 100644 index 00000000..5ba8a2bb --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/bean/Emp.java" @@ -0,0 +1,96 @@ +package com.mashibing.bean; + +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +import java.io.Serializable; +import java.util.Date; + +public class Emp implements Serializable { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", deptno=" + deptno + + '}'; + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/controller/SSMController.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/controller/SSMController.java" new file mode 100644 index 00000000..f8bb22bf --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/controller/SSMController.java" @@ -0,0 +1,24 @@ +package com.mashibing.controller; + +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class SSMController { + + @Autowired + EmpDao empDao; + + @RequestMapping("/test") + public String test(Model model){ + System.out.println("test"); + Emp emp = empDao.selectEmpByEmpno(7369); + System.out.println(emp); + model.addAttribute("emp",emp.getEname()); + return "success"; + } +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/dao/DeptDao.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/dao/DeptDao.java" new file mode 100644 index 00000000..527f4276 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/dao/DeptDao.java" @@ -0,0 +1,12 @@ +package com.mashibing.dao; + +import com.mashibing.bean.Dept; + +public interface DeptDao { + + public Dept selectDeptByDeptno(Integer deptno); + + public Dept selectDeptByStep(Integer deptno); + + public Dept selectDeptByStemp2(Integer deptno); +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/dao/EmpDao.java" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/dao/EmpDao.java" new file mode 100644 index 00000000..2e9d6a28 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/java/com/mashibing/dao/EmpDao.java" @@ -0,0 +1,10 @@ +package com.mashibing.dao; + +import com.mashibing.bean.Emp; + + +public interface EmpDao { + + public Emp selectEmpByEmpno(Integer empno); + +} diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..6e419228 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..cf10c0c2 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/mybatis-config.xml" new file mode 100644 index 00000000..e2b93dcd --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/mybatis-config.xml" @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/spring.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/spring.xml" new file mode 100644 index 00000000..2ace59d4 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/spring.xml" @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/springmvc.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/springmvc.xml" new file mode 100644 index 00000000..341b615d --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/src/main/resources/springmvc.xml" @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/ssm.iml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/ssm.iml" new file mode 100644 index 00000000..cf17af26 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/ssm.iml" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/bean/Dept.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/bean/Dept.class" new file mode 100644 index 00000000..9dbe0dba Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/bean/Dept.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/bean/Emp.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/bean/Emp.class" new file mode 100644 index 00000000..07c3245c Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/bean/Emp.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/controller/SSMController.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/controller/SSMController.class" new file mode 100644 index 00000000..8a0c127d Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/controller/SSMController.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/DeptDao.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/DeptDao.class" new file mode 100644 index 00000000..2eff1994 Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/DeptDao.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/DeptDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/DeptDao.xml" new file mode 100644 index 00000000..6e419228 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/DeptDao.xml" @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..5ba9d42d Binary files /dev/null and "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/EmpDao.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/EmpDao.xml" new file mode 100644 index 00000000..cf10c0c2 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/com/mashibing/dao/EmpDao.xml" @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/db.properties" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/db.properties" new file mode 100644 index 00000000..0342ceca --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/db.properties" @@ -0,0 +1,4 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +username=root +password=123456 \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/mybatis-config.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/mybatis-config.xml" new file mode 100644 index 00000000..e2b93dcd --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/mybatis-config.xml" @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/spring.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/spring.xml" new file mode 100644 index 00000000..2ace59d4 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/spring.xml" @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/springmvc.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/springmvc.xml" new file mode 100644 index 00000000..341b615d --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/target/classes/springmvc.xml" @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/WEB-INF/page/success.jsp" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/WEB-INF/page/success.jsp" new file mode 100644 index 00000000..c6d0f5ea --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/WEB-INF/page/success.jsp" @@ -0,0 +1,18 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/29 + Time: 21:49 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +ssm 6666 +
+${emp} + + diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/WEB-INF/web.xml" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/WEB-INF/web.xml" new file mode 100644 index 00000000..a5c23549 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/WEB-INF/web.xml" @@ -0,0 +1,54 @@ + + + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + classpath:spring.xml + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + springmvc + / + + + + CharacterEncoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + utf-8 + + + forceEncoding + true + + + + CharacterEncoding + /* + + + + rest + org.springframework.web.filter.HiddenHttpMethodFilter + + + rest + /* + + \ No newline at end of file diff --git "a/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/index.jsp" "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/index.jsp" new file mode 100644 index 00000000..9d3b7356 --- /dev/null +++ "b/javaframework/mybatis/04mybatis\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/ssm/web/index.jsp" @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/29 + Time: 21:22 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + $END$ + + diff --git "a/javaframework/mybatis/05mybatis-plus/04mybatis-plus\347\232\204\344\275\277\347\224\250.md" "b/javaframework/mybatis/05mybatis-plus/04mybatis-plus\347\232\204\344\275\277\347\224\250.md" new file mode 100644 index 00000000..8997fa14 --- /dev/null +++ "b/javaframework/mybatis/05mybatis-plus/04mybatis-plus\347\232\204\344\275\277\347\224\250.md" @@ -0,0 +1,1056 @@ +# 04mybatis-plus的使用 + +​ MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 + +​ 特性: + +- **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 +- **损耗小**:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 +- **强大的 CRUD 操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 +- **支持 Lambda 形式调用**:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 +- **支持主键自动生成**:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题 +- **支持 ActiveRecord 模式**:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作 +- **支持自定义全局通用操作**:支持全局通用方法注入( Write once, use anywhere ) +- **内置代码生成器**:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用 +- **内置分页插件**:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询 +- **分页插件支持多种数据库**:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 +- **内置性能分析插件**:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询 +- **内置全局拦截插件**:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作 + +### 1、mybatis-plus环境搭建 + +Emp.java + +```java +package com.mashibing.bean; + +import java.util.Date; + +public class Emp { + + private Integer empno; + private String eName; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; + + public Emp() { + } + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String geteName() { + return eName; + } + + public void seteName(String eName) { + this.eName = eName; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + eName + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", deptno=" + deptno + + '}'; + } +} + +``` + +数据库表sql语句 + +```sql +CREATE TABLE `tbl_emp` ( + `EMPNO` int(4) NOT NULL AUTO_INCREMENT, + `E_NAME` varchar(10) DEFAULT NULL, + `JOB` varchar(9) DEFAULT NULL, + `MGR` int(4) DEFAULT NULL, + `HIREDATE` date DEFAULT NULL, + `SAL` double(7,2) DEFAULT NULL, + `COMM` double(7,2) DEFAULT NULL, + `DEPTNO` int(4) DEFAULT NULL, + PRIMARY KEY (`EMPNO`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +``` + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + mybatis_plus + 1.0-SNAPSHOT + + + + com.baomidou + mybatis-plus + 3.3.1 + + + + junit + junit + 4.13 + test + + + + log4j + log4j + 1.2.17 + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 8.0.19 + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-orm + 5.2.3.RELEASE + + + + + +``` + +mybatis-config.xml + +```xml + + + + + + + +``` + +log4j.properties + +```properties +# 全局日志配置 +log4j.rootLogger=INFO, stdout +# MyBatis 日志配置 +log4j.logger.com.mashibing=truce +# 控制台输出 +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n +``` + +db.properties + +```properties +driverClassname=com.mysql.cj.jdbc.Driver +username=root +password=123456 +url=jdbc:mysql://192.168.85.111:3306/demo?serverTimezone=UTC +``` + +spring.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + +``` + +MyTest.java + +```java +package com.mashibing; + + +import com.alibaba.druid.pool.DruidDataSource; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.sql.SQLException; + +public class MyTest { + + ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); + + @Test + public void test01() throws SQLException { + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource.getConnection()); + } +} + +``` + +​ 在集成mybatis-plus的时候非常简单,只需要替换mybatis自己的sqlSessionFactoryBean对象即可 + +```xml + + + + + +``` + +### 2、简单的CRUD操作 + +​ 如果我们下面要实现CRUD的基本操作,那么我们该如何实现呢? + +​ 在Mybatis中,我们需要编写对应的Dao接口,并在接口中定义相关的方法,然后提供与该接口相同名称的Dao.xml文件,在文件中填写对应的sql语句,才能完成对应的操作 + +​ 在Mybatis-plus中,我们只需要定义接口,然后继承BaseMapper类即可,此前做的所有操作都是由Mybatis-plus来帮我们完成,不需要创建sql映射文件 + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mashibing.bean.Emp; + +/** + * 在mybatis操作的时候,我们需要自己定义接口中实现的方法,并添加与之对应的EmpDao.xml文件,编写对应的sql语句 + * 在mybatis-plus操作的时候,我们只需要继承BaseMapper接口即可,其中的泛型T表示我们要实际操作的实体类对象 + */ +public interface EmpDao extends BaseMapper { +} + +``` + +#### 1、插入操作 + +MyTest.java + +```java +package com.mashibing; + + +import com.alibaba.druid.pool.DruidDataSource; +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.sql.SQLException; +import java.util.Date; + +public class MyTest { + + ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); + + private EmpDao empDao = context.getBean("empDao",EmpDao.class); + +@Test + public void testInsert(){ + Emp emp = new Emp(); + emp.seteName("zhangsan"); + emp.setJob("Teacher"); + emp.setMgr(100); + emp.setSal(1000.0); + emp.setComm(500.0); + emp.setHiredate(new Date()); + emp.setDeptno(10); + int insert = empDao.insert(emp); + System.out.println(insert); + } +} + +``` + +​ 当运行上述代码的时候,大家发现报错了,原因在于你写的实体类的名称跟表的名称不匹配,因此在实现的是需要添加@TableName注解,指定具体的表的名称 + +```java +@TableName("emp") +public class Emp {//省略内容} +``` + +上述代码运行通过之后,大家会发现结果能够正常的进行插入,但是在控制台会打印一个警告信息,说没有@TableId的注解,原因就在于定义实体类的时候并没有声明其中的主键是哪个列,以及使用什么样的主键生成策略,因此,可以在类的属性上添加如下注解,来消除此警告 + +```java +public class Emp { + + @TableId(value = "empno",type = IdType.AUTO) + private Integer empno; + private String eName; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; + //set、get、tostring方法省略 +} + +``` + +​ 但是大家会发现,我们在写属性的时候,实体类属性名称跟表的属性名称并没有一一对应上,那么为什么会完成对应的操作呢? + +​ 其实原因就在于mybatis-plus的全局配置 + +*** + +在进行数据插入的是,如果我们输入的时候用的是全字段,那么sql语句中就会执行如下sql语句: + + INSERT INTO tbl_emp ( e_name, job, mgr, hiredate, sal, comm, deptno ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) + +但是如果我们在插入的时候,将对象中的某些属性值设置为空,那么会是什么效果呢? + +```java + @Test + public void testInsert(){ + Emp emp = new Emp(); + emp.seteName("zhangsan"); + emp.setJob("Teacher"); + emp.setMgr(100); +// emp.setSal(1000.0); +// emp.setComm(500.0); +// emp.setHiredate(new Date()); +// emp.setDeptno(10); + int insert = empDao.insert(emp); + System.out.println(insert); + System.out.println(emp.getEmpno()); + } +``` + + INSERT INTO tbl_emp ( e_name, job, mgr ) VALUES ( ?, ?, ? ) + +大家其实可以看到我们在插入的时候,mybatis-plus会根据我会输入的对象的字段的个数来动态的调整我们的sql语句插入的字段,这是大家需要注意的mybatis-plus比较灵活的地方。 + +#### 2、更新操作 + +```java + @Test + public void testUpdate(){ + Emp emp = new Emp(); + emp.setEmpno(1); + emp.seteName("lisi"); + emp.setJob("student"); + emp.setMgr(100); + emp.setSal(1000.0); + emp.setComm(500.0); + emp.setHiredate(new Date()); + emp.setDeptno(10); + int update = empDao.updateById(emp); + System.out.println(update); + } +``` + +#### 3、删除操作 + +```java + @Test + public void testDelete(){ + // 1、根据id删除数据 +// int i = empDao.deleteById(1); +// System.out.println(i); + + // 2、根据一组id删除数据 +// int i = empDao.deleteBatchIds(Arrays.asList(2, 3, 4)); +// System.out.println(i); + + // 3、根据条件删除数据 +// QueryWrapper queryWrapper = new QueryWrapper(); +// queryWrapper.in("empno",Arrays.asList(5,6,7)); +// int delete = empDao.delete(queryWrapper); +// System.out.println(delete); + + // 4、条件封装map删除数据 + Map map = new HashMap<>(); + map.put("empno",9); + int i = empDao.deleteByMap(map); + System.out.println(i); + } +``` + +#### 4、查询操作 + +```java + @Test + public void testselect(){ + + // 1、根据id查询对象 +// Emp emp = empDao.selectById(1); +// System.out.println(emp); + + // 2、根据实体包装类查询单个对象,返回的结果集有且仅能有一个对象 +// QueryWrapper emp = new QueryWrapper(); +// emp.eq("empno",2).eq("e_name","zhangsan"); +// Emp emp1 = empDao.selectOne(emp); +// System.out.println(emp1); + + // 3、通过多个id值进行查询 +// List list = empDao.selectBatchIds(Arrays.asList(1, 2, 3)); +// for (Emp emp : list) { +// System.out.println(emp); +// } + + // 4、通过map封装进行条件查询 +// Map map = new HashMap(); +// map.put("e_name","zhangsan"); +// map.put("sal",1000.0); +// List list = empDao.selectByMap(map); +// for (Emp emp : list) { +// System.out.println(emp); +// } + + // 5、分页查询,需要添加分页插件 + /** + * + * + * + * + * + */ + + // Page empPage = empDao.selectPage(new Page<>(2, 5), null); + // List records = empPage.getRecords(); + // System.out.println(records); + + // 6、根据条件返回查询结果总数 +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("e_name","zhangsan"); +// Integer integer = empDao.selectCount(queryWrapper); +// System.out.println(integer); + + // 7、根据条件查询所有结果返回list集合 +// List list = empDao.selectList(null); +// for (Emp emp : list) { +// System.out.println(emp); +// } + + // 8、根据条件查询结果封装成map的list结构 +// List> maps = empDao.selectMaps(null); +// System.out.println(maps); + } +``` + + + +### 3、Mybatis-plus的相关配置 + +​ 在mybatis中我们可以在mybatis-config配置文件中可以添加标签,设置全局的默认策略,在MP中也具备相同的功能,只不过配置方式有所不同,我们可以在spring.xml文件中添加配置。 + +https://mp.baomidou.com/config/ + +在此链接中包含了非常多的配置项,用户可以按照自己的需求添加需要的配置,配置方式如下: + +spring.xml + +```xml + + + + ...... + + + + ...... + + + + + ...... + + + + ...... + +``` + +​ 通过这个配置文件的配置,大家可以进行回想上述问题的出现,mybatis-plus是如何解决这个问题的呢? + +​ 在mybatis-plus中会引入写默认的配置,这个选项的默认配置为true,因此可以完成对应的实现。 + +我们可以通过如下配置来禁用驼峰标识的操作,如下所示: + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**1、当添加上述配置之后,大家发现运行过程中报错,** + +​ Property 'configuration' and 'configLocation' can not specified with together + +​ 表示这两个标签无法同时使用,因此我们可以选择将configLocation给禁用掉,就是不使用mybatis的配置,此时就能够正常使用了,但是放置属性的时候又报错了,原因就在于我们把驼峰标识给禁用了,重新开启即可。除此之外,我们还可以在属性的上面添加@TableField属性 + +```java + @TableField(value = "e_name") + private String eName; +``` + +**2、此时发现日志功能又无法使用了,只需要添加如下配置即可** + +```xml + + + + +``` + +**3、我们在刚刚插入数据的时候发现每个类可能都需要写主键生成策略,这是比较麻烦的,因此可以选择将主键配置策略设置到全局配置中。** + +```xml + + + + +``` + +**4、如果你的表的名字都具备相同的前缀,那么可以设置默认的前缀配置策略,此时的话可以将实体类上的@TableName标签省略不写** + +```xml + + + + + +``` + +**5、在mybatis-plus中如果需要获取插入的数据的主键的值,那么直接获取即可,原因就在于配置文件中指定了默认的属性为true** + +### 4、条件构造器Wrapper(看官网即可) + +### 5、代码生成器 + +​ AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。 + +​ 其实在学习mybatis的时候我们就使用过逆向工程,根据我们的数据表来生成的对应的实体类,DAO接口和Mapper映射文件,而MyBatis-plus提供了更加完善的功能,下面来针对两种方式做一个基本的对比 + +​ 1、MyBatis-plus是根据java代码开生成代码的,而Mybatis是根据XML文件的配置来生成的 + +​ 2、MyBatis-plus能够生成实体类、Mapper接口、Mapper映射文件,Service层,Controller层,而Mybatis只能生成实体类,Mapper接口,Mapper映射文件 + +#### 1、操作步骤: + +##### 1、添加依赖 + +添加代码生成器依赖 + +```xml + + com.baomidou + mybatis-plus-generator + 3.3.1.tmp + +``` + +添加 模板引擎 依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。 + +```xml + + org.apache.velocity + velocity-engine-core + 2.2 + + + org.freemarker + freemarker + 2.3.30 + + + com.ibeetl + beetl + 3.1.1.RELEASE + +``` + +##### 2、编写生成类 + +```java +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.PackageConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import org.junit.Test; + +public class MyTest { + + + @Test + public void testGenerator(){ + //此处默认有两个对应的实现类,大家不要导错包 + GlobalConfig globalConfig = new GlobalConfig(); + //设置全局的配置 + globalConfig.setActiveRecord(true)//是否支持AR模式 + .setAuthor("lian")//设置作者 + .setOutputDir("e:\\self_project\\mybatisplus_generatorcode\\src\\main\\java")//设置生成路径 + .setFileOverride(true)//设置文件覆盖 + .setIdType(IdType.AUTO) //设置主键生成策略 + .setServiceName("%sService")//设置生成的serivce接口的名字 + .setBaseResultMap(true) //设置基本的结果集映射 + .setBaseColumnList(true);//设置基本的列集合 + + //设置数据源的配置 + DataSourceConfig dataSourceConfig = new DataSourceConfig(); + dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver") + .setUrl("jdbc:mysql://192.168.85.111:3306/mp?serverTimezone=UTC") + .setUsername("root").setPassword("123456"); + + // 进行策略配置 + StrategyConfig strategyConfig = new StrategyConfig(); + strategyConfig.setCapitalMode(true)//设置全局大写命名 + .setNaming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略 + .setTablePrefix("tbl_")//设置表名前缀 + .setInclude("tbl_emp");//生成的表 + + // 进行包名的策略配置 + PackageConfig packageConfig = new PackageConfig(); + packageConfig.setParent("com.mashibing") + .setMapper("mapper") + .setService("service") + .setController("controller") + .setEntity("bean") + .setXml("mapper"); + + //整合配置 + AutoGenerator autoGenerator = new AutoGenerator(); + autoGenerator.setGlobalConfig(globalConfig).setDataSource(dataSourceConfig).setStrategy(strategyConfig) + .setPackageInfo(packageConfig); + + autoGenerator.execute(); + } +} +``` + +​ 注意,当通过上述代码实现之后,大家发现可以在Controller层可以直接实现调用,这些调用的实现最核心的功能就在于ServiceImpl类,这个类中自动完成mapper的注入,同时提供了一系列CRUD的方法。 + +### 6、插件扩展 + +MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: + +- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) +- ParameterHandler (getParameterObject, setParameters) +- ResultSetHandler (handleResultSets, handleOutputParameters) +- StatementHandler (prepare, parameterize, batch, update, query) + +#### 1、分页插件 + +在spring.xml文件中添加如下配置引入插件 + +```xml + + + + + +``` + +编写测试类 + +```java + @Test + public void TestPage(){ + Page page = new Page(2,2); + Page page1 = empDao.selectPage(page, null); + List records = page1.getRecords(); + for (Object record : records) { + System.out.println(record); + } + System.out.println("=============="); + System.out.println("获取总条数:"+page.getTotal()); + System.out.println("当前页码:"+page.getCurrent()); + System.out.println("总页码:"+page.getPages()); + System.out.println("每页显示的条数:"+page.getSize()); + System.out.println("是否有上一页:"+page.hasPrevious()); + System.out.println("是否有下一页:"+page.hasNext()); + } +``` + +#### 2、乐观锁插件 + +当要更新一条记录的时候,希望这条记录没有被别人更新 + +乐观锁实现方式: + +取出记录时,获取当前version +更新时,带上这个version +执行更新时, set version = newVersion where version = oldVersion +如果version不对,就更新失败 + +添加配置: + +```xml + +``` + +修改实体类添加version字段并在表中添加version字段 + +编写测试类 + +```java + @Test + public void testOptimisticLocker(){ + Emp emp = new Emp(); + emp.setEmpno(22); + emp.seteName("zhang"); + emp.setSal(10000.0); + emp.setComm(1000.0); + emp.setVersion(2); + empDao.updateById(emp); + } +``` + +#### 3、SQL执行分析插件,避免出现全表更新和删除 + +```xml + + + + + + + +``` + +``` +@Test +public void testSqlExplain(){ + int delete = empDao.delete(null); + System.out.println(delete); +} +``` + +#### 4、非法sql检查插件 + +```xml + + +``` + +```java +@Test +public void testSqlIllegal(){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.or(); + List list = empDao.selectList(queryWrapper); + for (Emp emp : list) { + System.out.println(emp); + } +} +``` + +### 7、SQL注入器 + +​ 全局配置 `sqlInjector` 用于注入 `ISqlInjector` 接口的子类,实现自定义方法注入。也就是说我们可以将配置在xml中的文件使用注入的方式注入到全局中,就不需要再编写sql语句 + +自定义注入器 + +```java +package com.mashibing.injector; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class MyInjector extends AbstractSqlInjector{ + + @Override + public List getMethodList(Class mapperClass) { + return Stream.of(new DeleteAll()).collect(Collectors.toList()); + } +} + +``` + +添加配置: + +```xml + + + + + +``` + +```java +package com.mashibing.injector; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +public class DeleteAll extends AbstractMethod { + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + String sql; + MySqlMethod mySqlMethod = MySqlMethod.DELETE_ALL; + if (tableInfo.isLogicDelete()) { + sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), tableInfo, + sqlWhereEntityWrapper(true,tableInfo)); + } else { + mySqlMethod = MySqlMethod.DELETE_ALL; + sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), + sqlWhereEntityWrapper(true,tableInfo)); + } + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + return addUpdateMappedStatement(mapperClass, modelClass, mySqlMethod.getMethod(), sqlSource); + } +} +``` + +```java +package com.mashibing.injector; + + + /** + * 自定义全局删除方法 + */ + + public enum MySqlMethod { + + + /** + * 删除全部 + */ + DELETE_ALL("deleteAll", "根据 entity 条件删除记录", ""); + + + private final String method; + private final String desc; + private final String sql; + + MySqlMethod(String method, String desc, String sql) { + this.method = method; + this.desc = desc; + this.sql = sql; + } + + public String getMethod() { + return method; + } + + public String getDesc() { + return desc; + } + + public String getSql() { + return sql; + } + +} +``` + +```java +package com.mashibing.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mashibing.bean.Emp; + +/** + * 在mybatis操作的时候,我们需要自己定义接口中实现的方法,并添加与之对应的EmpDao.xml文件,编写对应的sql语句 + * 在mybatis-plus操作的时候,我们只需要继承BaseMapper接口即可,其中的泛型T表示我们要实际操作的实体类对象 + */ +public interface EmpDao extends BaseMapper { + Integer deleteAll(); +} +``` + +### 8、公共字段填充 + +- 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler + +- 注解填充字段 `@TableField(.. fill = FieldFill.INSERT)` 生成器策略部分也可以配置! + + metaobject:元对象,是mybatis提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值的一个对象,还会用于包装对象,支持Object,Map,Collection等对象进行包装。本质上metaobject是给对象的属性设置值,最终还是要通过Reflect获取到属性的对应方法的invoker,最终执行。 + +编写自定义的公共字段填充 + +```java +package com.mashibing.fill; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; +import java.util.stream.Stream; + +public class MyMetaObjectHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "eName", String.class, "lian"); // 起始版本 3.3.0(推荐使用) +// this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8-SNAPSHOT`) + } + + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "eName", String.class,"lian"); // 起始版本 3.3.0(推荐使用) +// this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8-SNAPSHOT`) + } +} +``` + +添加到对应的配置中: + +```java + + + + + +``` + +测试: + +```java + @Test + public void testMeta(){ + int insert = empDao.insert(new Emp()); + System.out.println(insert); + } +``` + diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/compiler.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/compiler.xml new file mode 100644 index 00000000..3139e183 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/encodings.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/encodings.xml new file mode 100644 index 00000000..4987ecab --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/misc.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/misc.xml new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/workspace.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/workspace.xml new file mode 100644 index 00000000..06668f62 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/.idea/workspace.xml @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * from tbl_emp + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/db.properties b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/db.properties new file mode 100644 index 00000000..45d17b67 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/db.properties @@ -0,0 +1,4 @@ +driverClassName=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/mp?serverTimeZone=UTC +username=root +password=123456 \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/log4j.properties b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/log4j.properties new file mode 100644 index 00000000..d33beed0 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/log4j.properties @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E%n +log4j.rootLogger=DEBUG, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/mybatis-config.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/mybatis-config.xml new file mode 100644 index 00000000..aba753a2 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/mybatis-config.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/spring.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/spring.xml new file mode 100644 index 00000000..1b5db2d8 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/main/resources/spring.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/test/java/MyTest.java b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/test/java/MyTest.java new file mode 100644 index 00000000..52175985 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/src/test/java/MyTest.java @@ -0,0 +1,127 @@ +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.sql.SQLException; +import java.util.*; + +public class MyTest { + + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); + @Test + public void test01() throws SQLException { + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource.getConnection()); + } + + /* + * 在mybatis-plus中,插入数据的sql语句会伴随你插入的对象的属性值进行更改,比较灵活 + * */ + @Test + public void test02(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + Emp emp = new Emp(); + emp.seteName("zhangsan"); + emp.setJob("Teacher"); + emp.setMgr(100); + emp.setSal(1000.0); + emp.setComm(500.0); + emp.setHiredate(new Date()); + emp.setDeptno(10); + int insert = empDao.insert(emp); + System.out.println(); + System.out.println(insert); + } + + @Test + public void test03(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(6); + emp.seteName("lisi"); + emp.setJob("Teacher"); + emp.setMgr(100); + int insert = empDao.updateById(emp); + System.out.println(); + System.out.println(insert); + } + + /*delete操作在使用的时候要使用queryWrapper*/ + @Test + public void test04(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + //根据id删除数据 +// int i = empDao.deleteById(6); +// System.out.println(i); + //根据id集合批量删除 +// int i = empDao.deleteBatchIds(Arrays.asList(1, 2, 3)); + + //根据map类型的数据进行删除,但是要注意,key为列的名称。value是具体的值 +// Map map = new HashMap(); +// map.put("empno",4); +// int i = empDao.deleteByMap(map); +// QueryWrapper wrapper = new QueryWrapper(); +// wrapper.eq("empno",7); +// int delete = empDao.delete(wrapper); +// System.out.println(delete); + } + + @Test + public void test05(){ + EmpDao empdao = context.getBean(EmpDao.class); + /*查询单条语句,需要添加对应的查询条件,封装在QueryWrapper中 + * + * 注意使用selectOne的时候有且仅能返回一条语句,如果是多条结果的话,会报错 + * */ +// QueryWrapper wrapper = new QueryWrapper(); +// wrapper.eq("empno","8"); +// wrapper.eq("e_name","zhangsan"); +// Emp emp = empdao.selectOne(wrapper); +// System.out.println(emp); + + //查询某一个结果集的数据 +// List list = empdao.selectList(null); +// System.out.println(list); + + //根据id的集合返回数据 +// List list = empdao.selectBatchIds(Arrays.asList(8, 9)); +// System.out.println(list); + + //根据id进行查询 +// Emp emp = empdao.selectById(8); + + //查询结果集合封装成一个list里面的对象是map + //@MapKey 对应的结果是 Map + +// List> maps = empdao.selectMaps(null); +// System.out.println(); +// System.out.println(maps); + + //返回满足查询条件的所有行总数 +// Integer integer = empdao.selectCount(null); +// System.out.println(integer); + + //在使用分页的时候,必须要添加一个插件 + /** + * + * + * + * + */ +// Page empPage = empdao.selectPage(new Page(2, 2),null); +// System.out.println("-------------------"); +// System.out.println(empPage.getRecords()); + + +// empdao.selectMapsPage() + List emp = empdao.selectEmpByCondition(); + System.out.println(emp); + } +} diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/bean/Emp.class b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/bean/Emp.class new file mode 100644 index 00000000..68f7bae1 Binary files /dev/null and b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/bean/Emp.class differ diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.class b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.class new file mode 100644 index 00000000..98fab430 Binary files /dev/null and b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.class differ diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.xml new file mode 100644 index 00000000..8d2d772c --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/db.properties b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/db.properties new file mode 100644 index 00000000..45d17b67 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/db.properties @@ -0,0 +1,4 @@ +driverClassName=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/mp?serverTimeZone=UTC +username=root +password=123456 \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/log4j.properties b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/log4j.properties new file mode 100644 index 00000000..d33beed0 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/log4j.properties @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E%n +log4j.rootLogger=DEBUG, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/mybatis-config.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/mybatis-config.xml new file mode 100644 index 00000000..aba753a2 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/mybatis-config.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/spring.xml b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/spring.xml new file mode 100644 index 00000000..1b5db2d8 --- /dev/null +++ b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/classes/spring.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/test-classes/MyTest.class b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/test-classes/MyTest.class new file mode 100644 index 00000000..8d89deb8 Binary files /dev/null and b/javaframework/mybatis/05mybatis-plus/mybatis_plus_helloworld/target/test-classes/MyTest.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/compiler.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/compiler.xml new file mode 100644 index 00000000..93987a76 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/encodings.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/encodings.xml new file mode 100644 index 00000000..4987ecab --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/misc.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/misc.xml new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/workspace.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/workspace.xml new file mode 100644 index 00000000..2ad678ee --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_generator/.idea/workspace.xml @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1585984182946 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + mybatis_plus_helloworld + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/mybatis_plus_helloworld.iml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/mybatis_plus_helloworld.iml new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/mybatis_plus_helloworld.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/pom.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/pom.xml new file mode 100644 index 00000000..2cbebb44 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.mashibing + mybatis_plus_helloworld + 1.0-SNAPSHOT + + + + com.baomidou + mybatis-plus + 3.3.1 + + + junit + junit + 4.13 + test + + + + log4j + log4j + 1.2.17 + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 8.0.19 + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-orm + 5.2.3.RELEASE + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/bean/Emp.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/bean/Emp.java new file mode 100644 index 00000000..d87b71fa --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/bean/Emp.java @@ -0,0 +1,114 @@ +package com.mashibing.bean; + +import com.baomidou.mybatisplus.annotation.*; +import org.omg.CORBA.IDLType; + +import java.util.Date; + +//@TableName("tbl_emp") +public class Emp { + + /** + * 在 mybatis-plus2.x版本的时候,如果设置了表自增,那么id必须制定为auto类型,否则插入不成功,3.x不存在此问题 + */ + @TableId(value = "empno",type = IdType.AUTO) + private Integer empno; + @TableField(fill = FieldFill.INSERT) + private String eName; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; +// @Version + private Integer version; + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String geteName() { + return eName; + } + + public void seteName(String eName) { + this.eName = eName; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", eName='" + eName + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", deptno=" + deptno + + ", version=" + version + + '}'; + } +} diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/dao/EmpDao.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/dao/EmpDao.java new file mode 100644 index 00000000..6515d282 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/dao/EmpDao.java @@ -0,0 +1,15 @@ +package com.mashibing.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mashibing.bean.Emp; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface EmpDao extends BaseMapper { + + public List selectEmpByCondition(); + + Integer deleteAll(); +} diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/fill/MyMetaObjectHandler.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/fill/MyMetaObjectHandler.java new file mode 100644 index 00000000..7123478e --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/fill/MyMetaObjectHandler.java @@ -0,0 +1,20 @@ +package com.mashibing.fill; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; + +public class MyMetaObjectHandler implements MetaObjectHandler { + @Override + public void insertFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "eName", String.class, "lian"); + + } + + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "eName", String.class, "lian"); + + } +} diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/DeleteAll.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/DeleteAll.java new file mode 100644 index 00000000..6247d81a --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/DeleteAll.java @@ -0,0 +1,24 @@ +package com.mashibing.inject; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +public class DeleteAll extends AbstractMethod { + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + String sql; + MySqlMethod mySqlMethod = MySqlMethod.DELETE_ALL; + if (tableInfo.isLogicDelete()) { + sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), tableInfo, + sqlWhereEntityWrapper(true,tableInfo)); + } else { + mySqlMethod = MySqlMethod.DELETE_ALL; + sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), + sqlWhereEntityWrapper(true,tableInfo)); + } + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + return addUpdateMappedStatement(mapperClass, modelClass, mySqlMethod.getMethod(), sqlSource); + } +} \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/MyInjector.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/MyInjector.java new file mode 100644 index 00000000..04907bfc --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/MyInjector.java @@ -0,0 +1,16 @@ +package com.mashibing.inject; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class MyInjector extends AbstractSqlInjector{ + + @Override + public List getMethodList(Class mapperClass) { + return Stream.of(new DeleteAll()).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/MySqlMethod.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/MySqlMethod.java new file mode 100644 index 00000000..d323e6a0 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/java/com/mashibing/inject/MySqlMethod.java @@ -0,0 +1,39 @@ +package com.mashibing.inject; + + + /** + * 自定义全局删除方法 + */ + + public enum MySqlMethod { + + + /** + * 删除全部 + */ + DELETE_ALL("deleteAll", "根据 entity 条件删除记录", ""); + + + private final String method; + private final String desc; + private final String sql; + + MySqlMethod(String method, String desc, String sql) { + this.method = method; + this.desc = desc; + this.sql = sql; + } + + public String getMethod() { + return method; + } + + public String getDesc() { + return desc; + } + + public String getSql() { + return sql; + } + +} \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/com/mashibing/dao/EmpDao.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/com/mashibing/dao/EmpDao.xml new file mode 100644 index 00000000..20892f21 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/com/mashibing/dao/EmpDao.xml @@ -0,0 +1,12 @@ + + + + + + delete from tbl_emp + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/db.properties b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/db.properties new file mode 100644 index 00000000..45d17b67 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/db.properties @@ -0,0 +1,4 @@ +driverClassName=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/mp?serverTimeZone=UTC +username=root +password=123456 \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/log4j.properties b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/log4j.properties new file mode 100644 index 00000000..d33beed0 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/log4j.properties @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E%n +log4j.rootLogger=DEBUG, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/mybatis-config.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/mybatis-config.xml new file mode 100644 index 00000000..aba753a2 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/mybatis-config.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/spring.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/spring.xml new file mode 100644 index 00000000..fa547e69 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/main/resources/spring.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/test/java/MyTest.java b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/test/java/MyTest.java new file mode 100644 index 00000000..f9937f5d --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/src/test/java/MyTest.java @@ -0,0 +1,173 @@ +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.sql.SQLException; +import java.util.*; + +public class MyTest { + + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); + @Test + public void test01() throws SQLException { + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource.getConnection()); + } + + /* + * 在mybatis-plus中,插入数据的sql语句会伴随你插入的对象的属性值进行更改,比较灵活 + * */ + @Test + public void test02(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + Emp emp = new Emp(); + emp.seteName("zhangsan"); + emp.setJob("Teacher"); + emp.setMgr(100); + emp.setSal(1000.0); + emp.setComm(500.0); + emp.setHiredate(new Date()); + emp.setDeptno(10); + int insert = empDao.insert(emp); + System.out.println(); + System.out.println(insert); + System.out.println(emp.getEmpno()); + } + + @Test + public void test03(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + Emp emp = new Emp(); + emp.setEmpno(6); + emp.seteName("lisi"); + emp.setJob("Teacher"); + emp.setMgr(100); + int insert = empDao.updateById(emp); + System.out.println(); + System.out.println(insert); + } + + /*delete操作在使用的时候要使用queryWrapper*/ + @Test + public void test04(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + //根据id删除数据 +// int i = empDao.deleteById(6); +// System.out.println(i); + //根据id集合批量删除 +// int i = empDao.deleteBatchIds(Arrays.asList(1, 2, 3)); + + //根据map类型的数据进行删除,但是要注意,key为列的名称。value是具体的值 +// Map map = new HashMap(); +// map.put("empno",4); +// int i = empDao.deleteByMap(map); +// QueryWrapper wrapper = new QueryWrapper(); +// wrapper.eq("empno",7); +// int delete = empDao.delete(wrapper); +// System.out.println(delete); + } + + @Test + public void test05(){ + EmpDao empdao = context.getBean(EmpDao.class); + /*查询单条语句,需要添加对应的查询条件,封装在QueryWrapper中 + * + * 注意使用selectOne的时候有且仅能返回一条语句,如果是多条结果的话,会报错 + * */ +// QueryWrapper wrapper = new QueryWrapper(); +// wrapper.eq("empno","8"); +// wrapper.eq("e_name","zhangsan"); +// Emp emp = empdao.selectOne(wrapper); +// System.out.println(emp); + + //查询某一个结果集的数据 +// List list = empdao.selectList(null); +// System.out.println(list); + + //根据id的集合返回数据 +// List list = empdao.selectBatchIds(Arrays.asList(8, 9)); +// System.out.println(list); + + //根据id进行查询 +// Emp emp = empdao.selectById(8); + + //查询结果集合封装成一个list里面的对象是map + //@MapKey 对应的结果是 Map + +// List> maps = empdao.selectMaps(null); +// System.out.println(); +// System.out.println(maps); + + //返回满足查询条件的所有行总数 +// Integer integer = empdao.selectCount(null); +// System.out.println(integer); + + //在使用分页的时候,必须要添加一个插件 + /** + * + * + * + * + */ +// Page empPage = empdao.selectPage(new Page(2, 2),null); +// System.out.println("-------------------"); +// System.out.println(empPage.getRecords()); + + +// empdao.selectMapsPage() + List emp = empdao.selectEmpByCondition(); + System.out.println(emp); + } + + + @Test + public void test06(){ + Emp emp = new Emp(); + emp.setEmpno(18); + emp.seteName("haha"); + emp.setSal(10000.0); + emp.setVersion(1); + EmpDao empDao = context.getBean(EmpDao.class); + empDao.updateById(emp); + } + + @Test + public void test07(){ + EmpDao empDao = context.getBean(EmpDao.class); + Emp emp = new Emp(); + emp.setSal(3333.3); + int update = empDao.update(emp, null); + System.out.println(update); + } + + @Test + public void test08(){ + EmpDao empDao = context.getBean(EmpDao.class); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.or(); + List list = empDao.selectList(queryWrapper); + System.out.println(list); + + } + + @Test + public void test09(){ + EmpDao empDao = context.getBean(EmpDao.class); + Integer integer = empDao.deleteAll(); + System.out.println(integer); + } + + @Test + public void test10(){ + EmpDao empDao = context.getBean(EmpDao.class); + empDao.insert(new Emp()); + } +} diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/bean/Emp.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/bean/Emp.class new file mode 100644 index 00000000..c4b4c674 Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/bean/Emp.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.class new file mode 100644 index 00000000..45b1fa95 Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.xml new file mode 100644 index 00000000..20892f21 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/dao/EmpDao.xml @@ -0,0 +1,12 @@ + + + + + + delete from tbl_emp + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/fill/MyMetaObjectHandler.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/fill/MyMetaObjectHandler.class new file mode 100644 index 00000000..65e3b628 Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/fill/MyMetaObjectHandler.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/DeleteAll.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/DeleteAll.class new file mode 100644 index 00000000..7ad0e2bc Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/DeleteAll.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/MyInjector.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/MyInjector.class new file mode 100644 index 00000000..47007fc2 Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/MyInjector.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/MySqlMethod.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/MySqlMethod.class new file mode 100644 index 00000000..825870d9 Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/com/mashibing/inject/MySqlMethod.class differ diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/db.properties b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/db.properties new file mode 100644 index 00000000..45d17b67 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/db.properties @@ -0,0 +1,4 @@ +driverClassName=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://192.168.85.111:3306/mp?serverTimeZone=UTC +username=root +password=123456 \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/log4j.properties b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/log4j.properties new file mode 100644 index 00000000..d33beed0 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/log4j.properties @@ -0,0 +1,8 @@ +# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E%n +log4j.rootLogger=DEBUG, stdout +# MyBatis \u65E5\u5FD7\u914D\u7F6E +log4j.logger.com.mashibing=TRACE +# \u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/mybatis-config.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/mybatis-config.xml new file mode 100644 index 00000000..aba753a2 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/mybatis-config.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/spring.xml b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/spring.xml new file mode 100644 index 00000000..fa547e69 --- /dev/null +++ b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/classes/spring.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/test-classes/MyTest.class b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/test-classes/MyTest.class new file mode 100644 index 00000000..ad4e72dc Binary files /dev/null and b/javaframework/mybatis/06mybatis-plus2/mybatis_plus_helloworld/target/test-classes/MyTest.class differ diff --git "a/javaframework/mybatis/07mybatis\346\272\220\347\240\201\345\210\206\346\236\220/mybatis\346\265\201\347\250\213\345\233\276.jpg" "b/javaframework/mybatis/07mybatis\346\272\220\347\240\201\345\210\206\346\236\220/mybatis\346\265\201\347\250\213\345\233\276.jpg" new file mode 100644 index 00000000..edcc7b40 Binary files /dev/null and "b/javaframework/mybatis/07mybatis\346\272\220\347\240\201\345\210\206\346\236\220/mybatis\346\265\201\347\250\213\345\233\276.jpg" differ diff --git "a/javaframework/mybatis/07mybatis\346\272\220\347\240\201\345\210\206\346\236\220/mybatis\346\265\201\347\250\213\345\233\276.pos" "b/javaframework/mybatis/07mybatis\346\272\220\347\240\201\345\210\206\346\236\220/mybatis\346\265\201\347\250\213\345\233\276.pos" new file mode 100644 index 00000000..072f2c4f --- /dev/null +++ "b/javaframework/mybatis/07mybatis\346\272\220\347\240\201\345\210\206\346\236\220/mybatis\346\265\201\347\250\213\345\233\276.pos" @@ -0,0 +1 @@ +{"diagram":{"image":{"height":1887,"pngdata":"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oqOjjeJeAxyuWPb+smXLNGPGDKWnp+vZZ5/V22+/rXHjxl3WmKNGjdLZs2e1bNkySdKLL76Yo09WjW/TdL60O+64Qx4eHpLOb3z5ySef5DrPnXfemeexLFm1yGNiYtSkSRNJ0tmzZ7VmzRoNGjTIqe+aNWucNvxcvny5Ro8efdHx4RqmaRqGYTST1Mxms70VERGx2W63LzIMY1F0dPTfxb0+AAAAAACA/CAwDpQQgwYNUkBAgKSMzOzXXnvtssY7fvy4fvnlF82bN09BQRmJWf369dNTTz3l6JOenu7IQg8MDFSXLl0cx0zT1Ndffy1J+vTTT53Gbt68uW644QbH+2rVqqlPnz6O94cPH3acm12/fv00adIkzZkzRxaLRbNmzVKrVq1UsWJFp35fffWVhg0bpieeeEJSRvma4ODgQt0HXB7TNG80DONGSWOtVuvfhmEsstlsizZv3hyjK/iHIgAAAAAAgMtBYBwoIbIHhytWrKikpCRHpnZhxMXFSZKqV6/uaCtfvrxTnzNnzui2226TJE2fPl2Sci2lkn0jzixZmeYFcccdd2j58uWaMmWKmjZtqpUrV2rBggU5+g0fPlwhISGO9z179szR57777nO8rlKlSoHXgkKpb5rmCIvFMsJqte6WtMgwjEVRUVEbRJAcAAAAcAk23wQA1yAwDpQQZ86ccWRv7927VyEhIbJYLI5yJufOnXMcP3PmzCXHywqCx8fHO15nBcuz+Pn5qVu3bpccyzRNGYZrKvqMHTtWXbp00eeff67333/fkSWfXfaguKQc2ecRERFasWKFU43xmJiYv1yywFLONM38puaHSRpqmuZQq9Uq0zSnGIax8EquDQAAAAAAIL8IjANFLC4uLkdgNz/ee+89vfjiizp69KjmzJmj+++/X5J03XXXydvbWytWrFDPnj2VkpKiefPmXXK8atWqKSwsTFOnTtWYMWN0+vRpzZ07N8daL9xIMzc//PCD9uzZo/79+0uS/P39NWPGjDz7t2/fPtf2/fv364MPPpDNZlPNmjU1efJkPfHEE2revPkl13Appmk2uOxBUGiGYTwsid1QAQAAgMvE5psA4BoExgEXi4iIcLxu0aKF43VUVJRSU1PVv39/derUSY899liBxm3UqJEeeOABpaam6t5771W/fv0kSZ6enho3bpwmTJighQsXKjg4WG3atNH6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w4aSzgeGbbZf87zOnTun//znP3I4HOrSpYtq1aqVp6+UlJQ8bSkpKdq+fbtq1KghSXrllVe0du1aSeeD3tOmTdPHH39c4NxmzZqlrKwsTZgwQZI0adIk9ejRQ7fddpumTJmivn37Fnl+DRs2VPfu3bVp0yYNHjw433abzaamTZtqyJAhmjBhgm666Sb3NmOMjhw5UuQYAACgYATGAQCVlmvhTUqqAABQucXExGj48OEaMmSI3nrrLaWkpCgzM/OK+mzbtq2mT5+uTz75RLfeeqtq166t1atXS5Juv/12bdy40b1vjx493L/bbDZ99dVX7sc5OTnq3LlznrawsLACx12+fLlOnTqle++9N9+2xYsXq1GjRnryyScVHh6uTz/9VH369NH27du1c+dOvf3225Kk3r17u48ZNmyYWrZsqT//+c/5+nM6ndq0aZPmzZuXb9u3336rO++8U02aNJGfn58GDhyo+Pj4PPvcfvvt7t9zPx8oe507dw7Izs6ebLPZPm3RosU3n376aU5FzwkAcHkIjAMAAACoVFxfjKLqeP/999W1a1dFRERIknx9fUul3xtuuEE33HCD+/H69eu1cOFCJSUl6cEHH5Qk/eMf/yhx//fee6+MMe5A+GOPPaa1a9fqq6++kpeXV55977rrLnl4nP8I7evrq2nTpikgIEDLly/XPffcoyeffFLS+aC7K/s8t2+//db9e6dOnfTFF1/ommuuKXBuBw4c0P79+3X33XdLkpYsWeLetuvCcAAAIABJREFU5gr2EwyvOMYYT0l/djqdfz548GC83W5fJWlFZmbml3v37nVU9PwAAEUjMA4AqLTIFAcAoPLLycnR5s2bNXPmzFLr85///Kdmzpwpf39/LVu2zN1+11136a677tLtt99eYEDc6XTmySB3uVTb6tWrtXPnTr3wwgtavXq1Jk6cqIceekg5OTl68cUXNXHiRHe5FYfDkSdY3r59e0lSs2bNLtl3QbKysuR0Oov88sDhcGjGjBk6ceKEhg0bVuz+USGCJD0q6VEvL6/EsLCwz51O54o6der8a/PmzRkVPTkAwKURGAcAAABQqfDFaNUSExNjMjMzdfLkSd177706deqUQkNDNXHiRNWvX79Efd55552688478wWcXVniuTPGp0+fnmcfm82m//znP+7Hruzq3G25S6l89tlnSk5O1qRJk/T4448rKChIH3zwgXx8fGRZv74VXYHxRYsW6ZNPPlHNmjW1evVqzZgxI8/4jRs3zlOGJTAwUB9++KH7savETEH11xcvXqwWLVqoXbt2mjNnjsaMGaP77ruv0OxyVCp1jTGDLcsanJycnGK329dZlrUiIyNjw969e1MqenIAgF8RGAcAAAAAlFhqaqokaefOnVq8eLGysrI0btw4TZo0SX/9619Ldayiyqbk5OTI09Oz2P0dPnxYhw8flr+/v1q2bKnFixdr0KBBWrNmjd5//3099NBD+uijj1SzZk13YHzAgAHq37+/brvtNknns87vv/9+5eTkLzFdo0aNPEFx6fyioo0aNdLnn3+eb/8uXbrkySRv06aNVqxYoaSkpDz1xF0ubrPb7ROLffK4Ik6ns1bRe6mWpD8aY/7o5eWlsLCwdGPMcMuy1kRGRiaV9RwBAIUjMA4AqLRYfBMAgMrPx8dHkvTYY4/J399fkhQREaGnn35aTqdTNpvtisdwOp3ukib9+vVz/163bt08C1dmZmbK4XAUK4jsdDo1adIkDR48WO+8844GDRqkzMxMjR8/Xk899ZQaN26sbt266aOPPtLw4cNljJHNZpPNZssXfD927Ji+++67fGN26tQpX9vOnTvVunXrfO1ZWVlyOByqXbt2nvb58+frwQcfdNcTP3nypPr376/Zs2erc+fOefYNCwt7OV/HKBPGXP5SCMYYH0mLjTEpYWFh40rSBwCg9BAYBwAAAACUWJMmTeTr66uUlBQFBgZKkizLkpeX1xUFxZ1Op5xOpxYsWCAfHx93wDgzM9O9uGWvXr3yHJOcnKw2bdro448/drddaqHKsLAw2Ww2XX/99erZs6feeecdSecX99yyZYsSExO1YMECpaam6syZM+rZs2e+xThLatWqVerfv3++9qSkJHl6eubJGD958qQWL16sIUOGuNtef/11PfDAA+rcubO2b98uT09PhYaGujZPKpVJokiWZdUyxvzlMg9LkzTcsqy1kZGRSXa7vXRvqQAAXBYC4wCASotMcQAAKj8PDw/dc889euuttzR58mRlZWVp/vz5eYLWJ0+eVHBw8GX1Gx0drXPnzuk///mP+vbtqxYtWkiS4uPj3fXFLxYbG6tGjRoVe4ynn346z+Pu3burRYsWCgoKkr+/v2rVqqVvvvlGmZmZ7sx46Xx298V6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io6OVmZmZrmXW3vuuecUHBysunXratCgQdq0aVOhfXTv3l0hISFlXm6tf//+WrRokfr376/9+/dLkrvc2ujRoxUQEKDAwEA98sgjJeqrqPPPXVbN19f3kuXWcrfn5iq39sILL6h169by8PBwl1v77LPP8uzrKrfm7++v8PBw7d+/3/3Fhavc2v+zd+fhUZXnw8e/CSCorMomoCJYShVUQFzagkVxqaKionUvalWEothixUILboiCP6yKLahoXRCFigvF7UVBQKwaUCmLiCgguCH7Tsh5/yAnPRlmJhMyIRny/VzXuS5yznOe5zmTEPGee+57yJAhvPvuu3Tu3Jljjz2WjRs38tBDD8V95j59+vDCCy/Qv39/qlevTm5uLk8//TQvvPACL7zwAo899hh9+vQp5ndFkqSyVXE71KRJ+C7vxJxRe3TdLu2uA2DWrFnF/h62adPm0NmzZy8peqSk8mLVqlXBH/7wBzZs2MAJJ5zAlVdeydy5c9m2bRudO3culNn16aefcsghh7Dffvtx4oknFmpQmUi7du2YMmUKX331VcFHkLOysqhZsyatWrXi4osv5uc//3nsnhgyZAgzZ85k+/btNGvWjJtuuqkgqyj6Medw/aFDhzJhwgTq16/PxRdfzNChQwuuv/vuuwwbNgzYmTXdqVMnhg8fzsyZM/nss892+Rj13XffzcSJE6levTpvvfUW3333HQMHDuSzzz5jw4YNHHjggXTo0IHf//731KpVC4DFixczaNAgFi5cSPPmzbnwwgu58847d1lj/fr1Rc6V7Pm//vprbrzxRpYvX07jxo25+eab6dChQ8LzsR+T3rJlCw8//DBvvvkma9asoUmTJlx66aV069at0Gub6GPlmzZtomfPnrRu3ZrbbrsNgP/3//4fRx99NHXq1GH79u1Uq1aNuXPncv311zNjxgxGjBhBgwYNOPbYY5k8eXLBpxKuuuoqunbtyptvvkmfPn34xS9+wYUXXhj+jPjvCGkvFf4b99VRqZXTSJezr9vZ6DHyb9zs3emnszv/Rs5UQf47rOF/85955hmWLFlC//79+eyzzwqVWwubTodlMsL/Brdv354PP/ywYM7o17H/Roj+tyf02GOPMX36dJ588knmz5/P5ZdfHnev77//PlWqVIn7b4TYcmtvvPFGwn8DRO+PvR5v7ljr1q2jX79+fP/9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+EY/ERERGToGxomI6omHbxIRERERERERtWwGXwaDpVQeD0upEBERNX/MDCUiIqLmiIdvEpE+MWMcGNNYA3/wwf49ADBv+ZTGmqJGyz74FACwfPnIRtsbERERERERERERUUvFbN9GJAiCCACH4iKadN4RihAAQHx8PJ9fokbAzEsiIiIiIiIiopaNGeNEREREREQGhm/0ExERkaFjYJyIqJ54+CYRERERERERUcvGwDgRERHRU46ZoUT0KL7RT0TNAQ/fJCJ9MtL3AoiIiIiIiIiIiIiImhIzxomI6omZl0TU0jAzlIiIiJqj+Ph4G32vgYgMFwPjREREREREBoZv9BMREZGhY2CciKiemHlJRERERERERNSyMTBORERE9JRjZigRPYpv9BNRc8DDN4lIn3j4JhEREREREREREREZFGaMExHVEzMviailYWYoERERNUc8fJOI9ImBcSIiIiIiIgPDN/qJiIjI0DEwTkRUT8y8JCIiIiIiIiJq2RgYJyIiInrKMTOUiB7FN/qJqDng4ZtEpE88fJOIiIiIiIiIiIiIDAozxomI6omZl0TU0jAzlIiIiJojHr5JRPrEwDgRGTIjhUIxURTFtwD0AiCtz80SieRHQRB06ZoJ4LJEIvkyLi5uG4Dy+i+ViIiI6MnhG/1ERERk6FhKhYgMlZEgCAdEUdwCoD/qGRSvJymA/qIobhEEYT/42ktEREREREREpFfMGCcig/QgU3xE+y7uCJo3Da7dOsHcyrJR5rpXWIQbSdfx1bJNSPvzf35yuXxCQkLC1kaZjIioBswMJaJHscQSETUHPHyTiPSJWYtEZJAelE9B0Lxp6Cr3aLSgOACYW1miq9wDYz+YCgCQSCRvNdpkRERERERERERUJ2aME5Gh6gUArt06NdmEVebyaLJJiYjAzFAiIiJqnnj4JhHpEwPjRGSopAAaNVP8URbWVhpzExEREekLSywRERGRoWMpFSIiIiIiIiIiIiIyKMwYJyIiInrKMTOUiB7FEktE1Bzw8E0i0idmjBMRERERERERERGRQWHGOBEREdFTjpmhRERE1Bzx8E0i0icGxomIiIiIiAwMSywRERGRoWMpFSIiIiIiIiIiIiIyKMwYJyIiInrKMTOUiB7FEktE1Bzw8E0i0idmjBMRERERERERERGRQWHGOBEREdFTjpmhRERE1Bzx8E0i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24ezszNCQ0OxceNGvP7660hISAAArddrYmNjg6lTpyI6Ohru7u748MMPAQAZGRkAADc3N3Vfa2vrWtepbay6Hq/H2cetW7cgiiJkMs0qJm5ubsjOztZ4Ph0cHDTWKoqiRhC88rkRRRGiKD6seVO3nyQSyZxWrVp1jo+PF+Lj4/9Vj3uJiIiI6BHG+l4AEREREbUMZWVlro9x+41HLxgbGze4xnhl8PT27dvqryuDrABgb28PADh8+DDatm3boDlMTU0xatQo7Nv3/+zdeZRcZZ0//nc1JECAHCALKCCrqCOg3Y1oRkEj6LAvIXECgxCGGRQZic5PnGEQkFVAXEFENhG+B1RAtoCCwybmZIh2NxBABRWCLEIMJJEEsnTd3x/SbbqzdSXprqqu1+ucPqe77q37PFXpujTv53Pv5+bMnj07Rx111DL7PPfcc7n66qtzww03ZPvtt8+0adOWuX/0a6+9lmHDhiVJZs6cmdGjR/d43Sva3tfX0BW0JsnIkSOTJLNnz87GG2+cTTfdNEny7LPPrrCiuy+vY999983ee++db3/72/niF7+Yn//85yt9fEWGDx+eY445Jscff3zK5XL3YsZf/vKXHv+mfdH7WH15v1b3dXRV4M+cOTM777xzj/dt8803r+j3+C9/+UuGDx+eIUOGrGrXcpIHi6K4qbOz8+ZHH330uT4PAgDAKqkYBwCgTx599NHnVvfrj3/8Y372s59l4cKF+fOf/5wrrriiR4PIpUPtvth6662zww475KKLLsq8efPy/PPP55prrunevvnmm6elpSUXXnhhXnrppXR2dubJJ5/M9OnTu/cZPnx4kuThhx/OvHnzljvOhAkT0t7enldeeaXHfLt0VQK/+OKLmTdvXq6//vpl9rn44oszf/78zJw5M1dddVUOPPDAPm3vy2vobdSoURk9enSeeOKJ7mPsueeeOeecc/Lkk0+ms7Mzv/vd7/L888/3+XW8+OKLefjhh1MqlbL11ltn0aJFKYpihY8v7amnnsrll1+eZ599Np2dnZk9e3Zuvvnm7L777mlqaspWW221zL/jtddeu9zXtqpjrer9WpPXMXLkyOy1114555xz8tRTT6WzszOPPfZYLr300uUumKzME088sbJFiiVJ7k7yqSVLlrylvb39Ix0dHRcJxQEA1j4V4wAA9LsNNtgg11xzTU4//fQMGzYse++9d/7zP/8zSbJo0aIcd9xxOeSQQ3LMMcf0+Zjnn39+Tj/99Hz84x/P29/+9owbNy6PP/541l133e7t5513XsaPH5/Fixdn++23z+TJk7ufv80222TcuHGZPHlyNtpoo+VWO3cFom9729uWW+G77bbbZuLEiTnppJMyevToTJw4MVOnTu2xz6677ppDDjkkCxcuzL777tvjXuir2r6q17A8H//4x/O///u/2W+//ZL8rWnkt771rXzmM5/J/Pnzs+222+acc87p8+vo7OzMmWeemeeffz5bbrllzj777JRKpRU+/sorr2TffffNT3/60wwfPjxtbW257rrr8tprr2XEiBHZY4898l//9V/dY5933nn58pe/nI9//OPZYYcdMmHChO7mlEvry7FW9n5V+jp6O/PMM3PxxRfnhBNOyJw5c7LVVltl0qRJGT9+/Er/PZZWFEXuvffeHHvssUs/vCjJXaVS6aahQ4fePm3atFf6fEAAAFbbsn/xsda0tLQUSTKl7bIBHfeA1uOSJO3t7f59YQW6Pp+XtU0Z0HGPaz0gic8nsHq6z12XtQ3ouMcd15pkzc5dRe8S3F5mzZqV448/Ph/60Ifyuc99brXGuP322/Pd7343d95552o9f22bMWNGJk2alAcffLD7VimVbF9ds2fPzmGHHZYrr7wyO+yww1o7bl/dddddueOOO/Ltb397tZ7f9b5MmzYtQ4cOXcuzq6677747l156aX70ox9lyJAh2XXXXTcbOnRoua2tbe7qHK/rnNB22cD+PdN6nL9ngL/rPhcNcPbRWoXso+u1Ov/B4OBWKgAAVN2oUaNy6aWXZsyYMX1+zr333tvdXPKxxx7LZZddloMPPrgfZ1kfRowYkVNOOSVnnXVWj6aPA2X69Ond1er83auvvppLLrkk55xzTvfVBzNmzHh1dUNxAADWjFupAABQE0aOHNndPLIvZs6cmQsuuCCvvvpqRo4cmQMOOCD/9m//1o8zrB8f+9jHlntP9IFw6qmnVmXcWrfpppvmlltuqfY0AAB4k2AcAIB+V1reTZvXsjvvvDOf+cxn+nuYim244YZrtL1RrbfeetWeAtScVd2WioH57w0Ag4NbqQAAAABVMX/+/GpPAYAGJRgHAACABvd///d/y/w8Z86cFe6/YMGClMvl7p8XLVqUroL2vt426IUXXsi+++6b559/frnby+VyLrvssrz88svL3TZu3Lg+jcPKNTc3v7W1tXVItecBMNAE4wAAAFCHjjvuuLS2tmbBggVrfKyzzz67+/sFCxbk3HPPzTrrrLPC/S+66KKce+653T+fccYZuffee5MkZ511Vp/GfOtb35qxY8fmnnvuWe72pqamvO1tb8vRRx+dqVOn9thWFEVmzpzZp3FYuVKp9JmiKF5saWm5crfddttvxx13dC8roCG4xzgAAADUmbvuuivPPPNMvxz7xhtvzMsvv5yDDz54mW3XXnttttxyy3z2s5/NxIkTc8MNN+TAAw/M9OnT88gjj+Qb3/hGkuSAAw7ofs6xxx6bHXbYYbl9IMrlcu65555cdtlly2z75S9/mX322Sdbb711NtxwwxxxxBGZNWtWj32WbjT885//fLVfMxmR5F/L5fK/Dh8+fF5LS8vtSW4qlUp3tbW1rfnKC0ANEowDAABAHXn99dfzrW99K5MmTcrXvva1NTrWwQcfnKIouoPwT33qU5kyZUoeeOCBZZrg7rfffll33b/FCMOGDcu5556bESNG5MYbb8xBBx2Uz372s0mS1tbWTJkyZZmxfvnLX3Z//773vS933XVXNttssxXO7amnnsqTTz6Z/fffP0ly3XXXdW/r7OzM7rvvLgzvH8OT/EuSfymKYkFra+ud5XL5pmHDht0xderUv1Z7cgBri1upAAAAQB254oor8r73vS+77LLLGh/r1ltvzVlnnZXRo0fn1ltvzfTp0/PJT34ynZ2dOfXUU9PZ2dm976JFi3qE5TvvvHPe8pa3ZJtttslhhx3W5zEXL16ccrmcYcOGrXS/RYsW5cILL8yVV15Z+QtjbRlWFMX4Uql0/euvvz6rpaXlttbW1qN32WWXTas9MYA1pWIcAACAirW0tBTVnkMjevbZZ3PLLbfkxz/+cV544YW1csyf/OQnmTdvXs4444yccMIJGTVqVC6//PJssMEGKZVK3ft1BePXXHNNrr/++gwdOjS33nprLrzwwh7H22qrrXrchmXkyJE9wu2FCxcmSfbee+/lzufaa6/Ndtttl3e/+9259NJLc9JJJ+XQQw9daXV5F7+X/Wq9JAcWRXHgkCFD0tLScneSm6o9KYDVJRgHAACAOnHhhRfmmGOOyYgRI9ZKMP7000/n6aefzvDhw7PDDjvk2muvzZFHHpnbb789l1xyST75yU/m+9//foYOHdodjB9++OEZP3589tprryR/qzofN25cj+ryLuuss84yFd8vv/xyttxyy9x2223L7D9mzJgeleTveMc7ctNNN2Xu3Lk97ifeZXmPMWCKN78A6pJgHAAAgIq1t7eXVr0Xa9MDDzxQvPDCC5k4ceJaOV65XM4ZZ5yRo446Kt/85jdz5JFHZuHChTn55JNz4oknZquttsqee+6Z73//+znuuONSFEWamprS1NSUIUOG9DjWn/70p/zqV79aZoz3ve99yzz2yCOPZKeddlrm8cWLF2fRokXZeOONezx+xRVX5BOf+ET3/cRfeumljB8/Pt/97nez++6799i3tHSJO33S0tJydpJT+rDrwiR3FUVx05IlS26fMWPGq28+f9nOqQB1QDAOAAAAdeC2227Ln//85+5K7XK5nCTZd999c95552XMmDEVHa+pqSnvec97svfee+eb3/xmkuTOO+/M1KlTM2fOnFx11VWZP39+Zs+enb333nuZZpyr65Zbbsn48eOXeXzu3LkZMmRIj4rxl156Kddee22OPvro7sfOP//8TJgwIbvvvnumT5+eIUOGpLm5ea3MjWXMT3Jnkps22GCDOzXfBAYTwTgAAADUga997Ws9fp4xY0YmTZqUn/70p91h8ksvvZTNN9+8z8f8/Oc/3+PnsWPHZrvttsuoUaMyfPjwbLTRRnnwwQezcOHCbLDBBt37LV68eJljHXDAAasc77bbbsusWbPyT//0T8tsmzVrVjbZZJMej9133309bq9yyy23ZN68eTnhhBOSJOutt15OPfXU/PCHP1xlM0/6bG6S20ul0k1Dhw69a9q0aa9Xe0IA/UEwDgAAAIPAokWLctxxx+WQQw7JMcccs1rH2GSTTfLe9743SfLKK69k8eLF2XPPPXPnnXd2B+6vvPJKvvjFL6a5uTnf+c53uu9DvvPOOy9zvMcee6z7+4ceeigXXHBBvvrVr3bfs3zWrFkZMWJE1llnndxxxx3ZZpttejz/rrvu6q4u//nPf55rrrkm3/3udzN37tzMmzcvRVFk/fXXzze+8Y2cckpf7gbCCswulUq3lMvlmxYtWnTP448/vqjaEwLob4JxAAAAqEO77LJL2traun8eOnRorrjiihx//PGZO3duPve5z63R8f/zP/8zM2bMSKlUyogRI3LqqacmSe6+++58+MMfzr/8y7/kBz/4QSZNmpQFCxZ034N8nXXWSWdnZxYtWpTFixdniy22yMknn5zPf/7zOfnkk7tv+fLGG2/k0EMP7W7aOXLkyFxwwQXd4z///PN54oknsueeeyZJzj333Lz++us56qijstlmm2XTTTfNpptumt122y033XTTcqvQWbWiKC5pamo6o62tbdnLAAAGMcE4AAAADBKjRo3KpZdemj/84Q9rfKyrr746nZ2dKYoi667797vTdZ4AACAASURBVPhg/Pjx3T8fc8wxParTFy9enCVLliRJSqVSSqVSd1j+gx/8IG9/+9u79x0+fHimT5+ehQsXZsmSJRk2bFiW7p25wQYb5LTTTutuxnn77bdnww03zPL6a+64444ZOXLkGr/mRtTR0fFCtecAUA2CcQAAABhERo4cWXFIPGXKlOU+vs466yzz2NIheW9DhgzJkCFDlrtt6VB8aeutt95yG3tuttlm2X///bt/3mijjVY47rhx41a4DQCWRzAOAAAAdaC0vFJpAGC1NFV7AgAAAAAAMJAE4wAAAAAANBTBOAAAAAAADUUwDgAAAABAQ9F8EwAAAICG8O53v3uj9dZbb79SqbRuW1vbddWeD1A9gnEAAAAABq33vve9m5RKpQObmpoOK4ri4CQpiuJ7SQTj0MAE4wAAAAAMKs3NzaOampoOLorisCR7JRlSFEW1pwXUEME4AAAAAHWvubn5raVS6dAkhyX5cFEUeusBKyQYBwAAAKAuNTc3b5Pkv0ql0rFJhvb1eUVR7NzS0vIf/TczoNYJxgEAAACoS6VS6ZnVfN4Hk3xwNZ5aXp3xgNojGAcAAACgLpVKpX9KclpRFBWF3KVS6fGiKO5fjSHbVuM5QA0SjAMAAABQl9ra2u5OcveECRPWefrpp/col8uHJRmX5K0re15RFL9sb293KxVoYIJxAAAAAOraDTfc0Jnk/je/Jjc3N7+/qalpfFEUhyXZpppzA2qTYBwAAACAwaTc0dExLcm0JF9obm5uTXJYqVQan2TH6k4NqBWCcQAAAAAGq6Kjo+PXSX6d5H9aWlp2KYrisKampr9We2JAdQnGAQAAAGgERXt7+6NJHq32RIDqa6r2BAAAAAAAYCCpGAcAAIDVUBRFUe05UD2lUqlU7TkAsPoE4wAANDTBVmMTbAEANCa3UgEAAGDANDc3b1PtOQAACMYBABgwAjFoTC0tLTs2Nzf/V3Nz80OlUumZas+nUc2YMSOtra055phjVrjPEUcckdbW1ixatGgAZ9Y3XfNvbW3Nbrvtlr333jtnnnlm/vrXv1Z7agDUIbdSYcC4TLmxuUyZSjhfNDbni8GnpaVlx6IoDksyrlQq7Z7Ev/EamDFjRiZNmpRdd9013//+95e7zxFHHJHf/e53mTZtWoYOHTrAM1y5rvknSalUyiabbJI999wzn//857PxxhtXd3KsVc3Nzf/Q1NQ0/s3P/65O73/37LPPZvLkyfnRj35Ulc/oU089ld/85jd517ve1ePxtra2/OlPfxrw+VTqwQcfzPrrr5+ZM2fmjDPOyOmnn56vf/3r1Z4WAHVGxTgAAGtdc3PzP7S2tp7W0tLySJKnSqXSeW+G4oPGs88+m0MPPbRqVZVdwVZv9RRsTZ8+PZdffnn++Mc/5vTTT6/2lFhzpdbW1paWlpZzWlpaflMqlR4viuKMJLtWe2K1Zu7cuXn22WerNn5ra2t++MMfLvP49ddfn+bm5irMqHJNTU3Zbrvt8qlPfSq//OUvUy6Xqz0lAOqMYJweXN4Mtc/nFKhRDReICbbWnGBrUGhqaWn5QHNz84Wtra1/KIqiLcn/JHlntSc2ELpu7XHbbbflox/9aC688MIkyaJFi3LBBRdk7Nix+dCHPpT/+Z//yWuvvdb9vK6rJsaMGZPW1tYex1qwYMEyx1+0aNFyx+p67KGHHsoRRxyRD3zgA/nEJz6x3EWzpU2YMCF33313Xn311e7HXnjhhUydOjUHHXRQj32nT5+eI444Iu9///tz4IEHZtq0aT3mNnXq1IwfPz5jxozJiSeemDlz5vRp+6repxW9t70tXLgwG2ywQZqamlb4nMWLF+eSSy7JAQcckPe///3Zb7/9cvnll3efc2644YaMHTs28+bNS5I8/PDD2WOPPfLEE0/kAx/4QKZOndo93htvvJE999yz+30AoH4JxnG/vxVw/z1qic9pbXO+oIENikBMsCXYYvW0trZ+u6Wl5dkk00ql0v9XFMV2lR6jpaVlUktLS9Hc3Hx1PT/20EMP5fbbb8+nP/3pJMnZZ5+d3/72t/nhD3+YKVOm5NVXX83Xvva17td99dV/e+q0adPS1tZW0XvWe6wk+clPfpJvf/vbufvuu7PFFlvkrLPOWukxWlpasu222+bmm2/ufuxHP/pRPvzhD2fzzTfvse/8+fPzpS99KQ8++GA+8pGP5Ctf+UqP7bfddlsuu+yy3HrrrfnLX/6Sr371q33evqr3aUWvN0nK5XKeeOKJXHLJJfnnf/7nlT7nnHPOyf3335+vf/3rmTp1as4777zcfPPN+d73vpckGT9+fLbbbrtcccUVKZfLueCCC3LCCSfkH/7hHzJ27Njceeed3ce+5557sskmm+QDH/hAauX3r9qPBaBOCcYbVD1d3uwy5TXjMuX6VU+f01rhfLFmnC/oiwkTJqzT3Ny855oEYi0tLUVLS8s3l/r5c9V8rOtnwVbDBltV/f1bG7+71VIul4tSqVT1edSCo446KhtuuGE22mijvPrqq7nzzjvz3//939l8882zySab5Mgjj8w999yz1sfq8h//8R8ZOXJkhg8fnokTJ+bJJ59c5RUYhx9+eG688cZ0dnbm9ddfz6233prDDz98mf3Gjh2b7bffPn/4wx+y0UYb5fnnn8+SJUu6tx9//PHZbLPNMnr06EyaNCm/+MUvejx/Rdv7+j4t7/Xuscceef/7358vfelLOfTQQ3P88cev8Dlz5szJlClTcsopp2SnnXbKuuuum1133TWf/vSn85Of/CTJ3/odfOlLX8rNN9+ciy++OBtuuGH3OWn8+PG5//77uxc8b7/99owbNy7umQ9Q/zTfbByl1tbW5q7GV0neWS+97WrlMuUzzjijx+NdlykvXX1Uq5a+THny5Mkpl8tparIuVoPq9nNaK5wv1pzzBX1RKpWKcrlcNDU1DapeuV1BSvL3wOa6667rDpmPPPLInHzyyWtl0Wjpsbp0BVtJMnHixJx44omr/AwefvjhufTSS3P00Udn0aJFufXWW/Otb31rmf3Gjh2bN954Y5XBVvK3SvjeofyKtvf1fVre691jjz3S1NSUrbfeOhMmTMjEiRNX+B51BVtXXnlldtpppyTpDrYuuuiiHH/88d3B1tFHH5111113mWDrxBNPzIIFCzJs2DDB1lrS0dExOcnnW1tb31cUxfhSqXRYpVXj7e3tVye5uo4fOzpJttpqq+7tf/7zn1MUxXJD5sWLF2fIkCHLPF6JpcfqMmLEiO7vN9544xRFkSVLlqy0sec+++yTiy66KPfdd19effXVbL311nnPe96TGTNm9Njvoosuym233ZZdd9016623XpL0CN1Hjx7d/f2oUaOyYMGCPm1f1fu0stf74IMPZtiwYSt8bUs/58UXX0xRFNl+++177PO2t70tr7zySvd5dvvtt89ee+2VH/zgB7n88su7zw+tra15y1veknvvvTetra155JFHuhcX29vbe5xEauR3csAfq4WFOoDV4f90B7eaurzZZcouU2a5aupzWiucL5wvqF033HBDZ3t7+4MdHR2T29ratimVSh9IcmGpVHq6r8dob28vtbe3f26pn79Zzce6fl5RsNV1q6ETTzwx8+fP7xHYrK5Kgq2V2WeffbJ48eLcd999mTJlSnew1dtFF12UAw88MFdccUVmzpyZZO0HWyt7n1YUbP3qV7/KT37ykxx++OHLhNSVBltJegRbXWF50jPYevHFF/PII4/k4IMPTlL937+18btbZeW2traH2tvbT2pra9uhqampJck5SX5b7YkNpKV/f7sWke644460tbX1+FpZKN4VYr/xxhvdjy39d87yxloTQ4cOzbhx43LzzTfnpptuWm5A/dxzz+Xqq6/O9773vXzta1/LgQceuMw+S89x5syZGT16dI8FvRVt7+v7tDqvd+nnjBo1qnvs3q9t8803757rc889lwceeCB77bVXrrrqqh77jh8/PnfccUemTJmSj370o9l0000rnhMAtUcwPsiUy39fqF3Dy5u7/5BtbW1959p8zGXKDXuZcr/+XlX6WKpsLdyG4H+XOtbeb77OQfeY80VDny+q/vtXi4+l9gyqQEyw9TeCLdZA8etf/7qjvb39S+3t7e8qiuLdpVLptCSPVHtiA2nzzTdPS0tLLrzwwrz00kvp7OzMk08+menTp3fvM3z48CR/WzTuWkDedtttM2zYsEyZMiXJ3xapr7322n6d64QJE9Le3p5XXnklH/vYx5bZ3rU49+KLL2bevHm5/vrrl9nn4osvzvz58zNz5sxcddVVy5xjVrS9L+/T2jBy5MjstddeOeecc/LUU0+ls7Mzjz32WC699NIcddRRSf7298+pp56aT3ziEzn99NPz5JNP5pZbbuk+xv7775/HHnsst956aw477LC1Oj8AqkcwPojV6v3+3H/P/ff4+20IavVzWiucL5wvqCuDKhATbAm2WHMdHR1PtLW1ndXe3v7eUqm0Y5L/Kopi7f5y1Kjzzz8/TU1NGT9+fD74wQ/my1/+cpa+9dQ222yTcePGZfLkyd2/j+utt17OOeec3HjjjTnooIPymc98Jv/4j//Yr/Ps+myNHz9+uYt+2267bSZOnJiTTjopRx111HLns+uuu+aQQw7JJz/5yYwZMyb//u//3uftq3qf1pYzzzwzra2tOeGEEzJmzJicdtppmTRpUvctnL7//e9n9uzZOfbYY7Phhhtm8uTJ+frXv56XXnopyd+u4hk7dmw22GCDtLS0rPX5AVAd7jE+yDQ1/T1QaGtr22Z17vfX+7LMtra23yZZG48VifvvdWn0+++txd+r1Xqs2pWX7e3tDyZ5MKt5X8729va9u77v6Oj43/R6nYPgMecL54tuNfI7WROPVfvcVYmOjo4nkjyR5KzW1tYdiqI4rCiKw+qpifD555+f8847L+PHj8/ixYuz/fbbZ/Lkyd3blw62Ntpoo/z85z/vDrYuvPDC3HjjjRk1alTGjh2bhx56qN/m2RVsve1tb1tlsDV69OhMnDhxmZ4HXcHVwoULs++++64w2Fre9lW9T2vLmWeemYsvvjgnnHBC5syZk6222iqTJk3K+PHjk/QMtoYOHZrJkyfn/PPPz5gxY7L55pt3B1u/+c1vBFtV0NbW9ockFyS5oLm5eZtqz2dt2WWXXZZ7ldpmm22WCy64YKXPPeWUU3LKKaf0eGzPPffMnnvu2eOxI488coVj9fWxlW07++yzV7rPSSedlJNOOqn75979APbbb7/uz+HyrGz7yt6nSl/byravv/76+cIXvpAvfOELy33esccem2OPPbb75/333z/7779/j32efPJJi2oAg4xgfHArt7W1PZTkoSRf3G233d5bLpcPS3JYqnj/4hVdprzFFlv0+RhLX6bcFeIM1GXKs2fP7q5MWlrXZco33HBDtt9++0ybNi133XVXj31ee+217vmu6DLl5W3v6/u0Ni9T3nnnnXu8tpVdprz0/1x2Xab84osvuky5b2ryc1ornC+cLxgcaj0QE2wJthhYHR0dM1e9F9SGuXPn5q677srs2bOX6RkDQH1zK5XGUZOXN7tM2WXK9FCTn9Na4XzhfMHgIBCjGubOnZsf//jHgi2gYvvss0+uv/76fP3rX1/plXUA1B8V4w2qli5vdply37a7TLnx1NLntFY4X/Rtu/MFQE/77LNPtthiC8EWa11Jc4xsuOGGa7S9Xiy9uA/A4NDw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Ml1fCoyLiIiIiIiIiIiIFBIXcKkKDwEOQIkx8G6mYHrxTbDJFIydCTOtbbs39DHVM602vwSXAIOl8lYGxh38oH0jeKYWPF4TanhD9W7wSgzEGMH4L/yb29gmwxRToN8ZXAFqQo1jcMwIxptwsy7UzWmc5oFxUzA97YsdG8B+PWwwgvEgHMzcRnaB8XiIz+mVAAmmermVrZiWwkZEREREREREREREzJivnDZ//QQ/AcyAGaZjO+FXwC4PzZcypU8xvabA1OwKWxkYL34Tbub0xMICWJDbwA7DYSMYD8ABgEEwKAqiTMHy7NK9mI/TPDD+JXyZ3XgmwITMbWQXGM/r0xk5vSpAxdzeBxEREREREREREZEHjjs4Zg6onoNz9eBJgIeg6iW49Af8kUM6nGz5gO9+2B8N0UthGTkE1q1NpRIKodkFg3+CHTnlXQfwAM8rcMUIxtlpG8VOh2lGMMZAjD90yqm+pcB4OXBfDxvMc9LHQuwS+MrSnPObSkVEREREREREJDcWH9UXEZGMaoB3CbA3QPE4uHESTmKWp7sBPP0X/B0NV+7kOH6H3wHmwOyVsCq7cnWhrgd4GMDGkLZZayLEH4OTJ+EfK7sz1IFa0RBzPHUzUZsZMG0ezD8Np3Kq+F/4L8ABOALczNyuO5S6nBrwjiObwLcLuEyBKQBvwptWjllERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERO4z2nzTjNG42uIGcA+KU6dO/OLtPaZpYY9DRERERERERERE5E6yKewBSNERGXm9ycmTH/5c2OMQERERERERERERuZO0YtzMg75iPCQkBIAyZUpr5biIiIiIiIiIyH2mTp06ew0GQ73CHocUSV+HhIR0L+xB3E1aMS5ZaOW4iIiIiIiIiMj9R0FxycErhT2Au614YQ9AiiZTcFwrx0VEREREijat/pMcPHCr/8zp3pAcPND3BkBw0ObCHoIUEeGREbQZ1QvgXCEP5a7TinHJllaOi4iIiIgUfQr8SQ4euNV/5nRvSA4e6HtDRFJpxbjkSCvHRURERETuDUGbggt7CFJEREaEM+q1NvAArv6zZFOQ7g1JFREZzmujdG+ISCoFxiVXCo6LtfSo4j0tGXg5JCRkXWEP5F6h6/2+dzkxMfGR0NDQyMIeyP1G947k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y+0xrQ7HYDBgwoQJ+PTTTxEREYEDBw5g/fr12LZtG6RSKYT6Bchb2dChQ90LCwsDWvoUguNaaOffS3oX/F6yf9ab4fojIiIiIiKitsdSKkRE1CJ+fn5Yv349UlNTXT0Vl/H19cXcuXOxePFivP3221i7di2WLVvWbvXFDx8+XAXgpijNQ0R18bF2IiIiItfhvRgBDIwTEdEN0Gg0jkUoO6uRI0di5MiRAICdO3e6eDZERERERERE1BQMjBMRUQNtXQKEiKiz44JPRK2P2X9EzvHaIGqI92IEcPFNIiIiIiIiIiIiIupkmDFORERERERENz1m/xE5x2uDiMg5BsaJiIiIiNoZH2snIiIich3eixHAUipERERERERERERE1MkwY5yIiIiIqJ3xsXai1sfsPyLneG0QNcR7MQKYMU5EREREREREREREnQwzxomIiIiIiOimx+w/Iud4bRAROcfAOBERERFRO+Nj7URERESuw3sxAlhKhYiIiIiIiIiIiIg6GWaMExERERG1Mz7WTtT6mP1H5ByvDaKGeC9GADPGiYiIiIiIiIiIiKiTYcY4ERERERER3fSY/UfkHK8NIiLnGBgnIiIiImpnfKydiIiIyHV4L0YAS6kQERERERERERERUSfDjHEiIiIionbGx9qJWh+z/4ic47VB1BDvxQhgYJyIiIiIqKUker1+miiKfwDQB4CmjcYpAJAsCMLmuLi4zwDY2mgcIiIiIqJOg4FxIiIiIqLmk+h0um9EUXyoHcbSABgiiuIQnU43Nj4+/hEwOE7UALP/iJzjtUFE5BwD40REREREzVSTKf5QcGR3PP7GTIT06gEPlbJNxqowmpBx/hK+WL4OV1IuP6zVap9OSEj4tE0GIyIiIuoEWGKIAC6+SURERETUbDXlU/D4GzPRUxvTZkFxAPBQKdFTG4PJrz8HABAE4Q9tNhgRERERUSfBjHEiIiIioubrAwAhvXq024C1xoppt0GJbiLM/iNyjtcGUUMsMUQAM8aJiIiIiFpCA6BNM8XrU3iq6oxNREREREQtx4xxIiIiIiIiuukx+4/IOV4bRETOMTBOREREREREREREnQZLDBHAUipERERERERERERE1MkwY5yIiIiIiIhueq7K/lOpVP0CAwPf9fT0HCiKYuXly5efLSkp+foGuw0ICQlZcNtttz0klUr9rVZrbklJ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22+/XUFBQe7348aN04MPPqjCwkIFBgbqww8/1NixY2UYho4fPy5JioqKqrJWVFSUsrOzVVpaKklzdRGpT8W+aZq9JX2Wl5e3+8JHBADNE4lxAAAAAAAkORyOJtPX+dSpU+YLL7ygp59+WsOHD5ck/eEPf9D8+fO1bt26es157NgxSVJsbKz7WHBwcK3HHz16VKZpasKECWecKykpcb9u3759lXN2u13R0dH6/PPPZbfb9c0332jBggWS5O6X/tNkc8X78vNP1TrIRlBeMT6yjsOSDMN4OCQkZEteXl7JuS8HAJwLiXEAAAAAAJqYI0eO6PTp07Lb7e5jgwcP1ptvvimXyyWLpe5tq0NCQiRJJ06ccCfEKyq2JcnX11fSjz3AAwMDJcndP1ySIiIiJEkfffSR2rRpU+M61VVUjxs3Th999JEyMjJ07bXXKjw8XJLUsmVLSdLJkyfd8VXEGBoaKh8fHzkcjifrfLMNyGaz/UbSuRLjBw3DeL+srOz95OTkryW5Ko1v0PgaitnUdn1FgzDOZxMEoI7YwAEAAAAAgCYmNjZWoaGhWr58ufLy8pSZmak333xTNpvNnRSvqACvrfbt26tz585asmSJ8vLylJ6erlWrVrnPd+zYUYGBgdqwYYMk6fTp01XOt27dWjabTQsXLtSxY8dUVlamffv2afv27edc+xe/+IW+++47rVu3TgkJCe7jUVFRatWqlXbvrtphZPfu3erRo0ed7s/TDMPYZ5rmAkl9HA5Hp8TExIeTk5O/UqWkOADgwiExDgAAAABAExMQEKDFixfr22+/1XXXXadbb71VAQEB7hYkTqdTU6ZM0RtvvFGneZ999lllZmZqxIgRevTRR3XTTTe5z/n5+Wn+/Plas2aNbrzxRt1///0aNGhQlfHPPfecLBaLxo0bp6uuukpPPvmkalNIHBISomHDhikgIOCMiukRI0bo008/db83TVOff/65RowYUad785BvJT1psViuTExMvDwpKelxh8ORKInqagBoYLRSAQAAAACgCbryyiu1cuXKas/5+vpq+fLluu+++5Sbm6uHHnqoVnPGxcVVmfPbb7+tcn7IkCEaMmRIlWOTJk1yv46IiNDzzz9fY7yJiYk1rr1v374q1eIVbr/9diUkJCglJUWdO3fWpk2b5OXlpZEj69rGu9EclDSrrKxszTfffLPP08E0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PT1dknTNNddIklJSUnTixAkVFhZq6NChVZLsAADUhFYqAAAAAADUkc1mu8w0zQRJYw3D6Cfpom3XsX37di1fvlxLly6VYRgaNmyYfHx85O3tLX9/fwUHBys8PFwREREKDQ1V+/btNXDgQAUHB59z7vz8fG3evFkhISGSpAEDBqhbt241Xn/8+HH9/e9/d7//9ttvlZubqxEjRkiSTp06pTVr1sjf379KslyS1q1bpy1btmjTpk1atmyZJMk0Tc2fP1/Tpk1TaWmpYmNj5evrW+fPCADQ/JAYBwAAAACgFqxWa3eLxTKuPCEef6m0rp48ebLGjx+vd999V+PHj1dJSYm++OKLGq+vqLjetGnTOZPMdrv9jGNeXl61jm3p0qWaPn26EhMTlZ6erv3796u0tFRLlixRly5dJEnLly/Xrl27JEljx47V5s2blZGRIUnavXu3OnXqJLvdrkWLFik+Pr7WawMAmjcS4wAAAAAAVM+w2+3WispwSZdfintZ+vr6as6cObWqAD9f4eHhev3112s8P3LkSPfrL774Qt7e3howYIAmTZoku92u7du3a+HChZo7d66WL18uh8Oh9evXa8WKFZKkcePGSZKmTZumwsJCzZkzR5L01VdfaePGjfL19dWoUaNUUFCgkpISPfzwww13swCASxqJcQAAAAAA/sdis9n6maY5zmKxjDVNs5OnA7oQrFarpB9bjxQXF1dJUFeoaHMSFhZW5bjdblerVq2qXJeYmFjtOtnZ2brjjjtqFdP69eu1Z88ejRo1Sp06ddLw4cM1cuRIde/eXd99950mT56s/Px8LV68WBEREZKktWvX6uDBg5o/f76OHDmi66+/XpMmTdIHH3ygnJwc/eMf/1BUVJReffVV5efn6+abb65VLACA5ofEOAAAAAAAkux2+2LTNMdKamcYhupSHW61WqcmJSW9LEk2m+1lSfeapnmfp4+99tprWrlypZxOp7Zu3ar8/HyFh4dr+fLlCg8PV2BgoCQpKSlJ8+bNU1RUlEpKSqrcm8ViqdIXvG/fvmfc/6RJkyRJISEhKisrq/FzKi0t1aRJkzRixAg999xzKioq0sSJEzVjxgzFxsZKkg4ePKi9e/fK5XKptLRUycnJio6OlmEYWrZsmZKTkzV37lzddttt6tKli6ZOnapevXqpT58+SklJUVRUlFJSUjRo0CBdbN+PC3Gsxg8XAFAnJMYBAAAAAJDkcrlMi8ViXortUmpy99136+6779bAgQMlSenp6YqMjNSOHTu0atUqzZ49W927d9eCBQv04IMPqr5901evXq0xY8Zo06ZN7mNjxozRunXrzjpu/vz5SkhIUGxsrL7++mutXr1a6enpmjx5sm644Qbt27dPf/rTn7Ro0SKNHj1aNptN06ZN06JFizRnzhwNGzZMffr0UUhIiN59911t2bJFffv21c6dO/XAAw/U615w8WlSD2UTZ1wqmy8Auoh3zW6KbDabKUkbEl9p1HVH2adIkhwOB99vQP97FhNfadxn0T6FZxEXF/ez0Mh/Ltn5cwlNQMXz80rihkZdd4p9lCSeHzRd7mfrw+rbdDSUKaN/3ECy/Nmy2O32vqZpjjMMI6G2rVQu1ueyIqE4cOBAbd26VatXr9bBgwc1a9Ys7d27V7NmzZJhGOrTp49mzJgh6cfNNyuu9/X1Vd++fbVjxw73nJXf2+12bd68WSEhIRozZkyVNiyHDh3SJ598oqFDh6pjx47y9vZWUVGRUlNTtWPHDm3atElPPPGERo8erfT0dA0bNkxt2rSR3W7Xc889p0GDBmnw4MEKDAxUenq68vLyNGvWLLlcLh0+fFgdOnRwr/X666/L6XRqwoQJuueee7Rx40atXLlSUtNL1FU8Jx++0rjPyegpVZ6TRkVivHrHjh1TeHi4e5PcvLw8lZaWulsP1UVxcbH8/f3POyZPPW//+3d+4/7dzD6Fv5tdyiyeDgAAAAAAgIuIKzExcZvD4XgkMTGxs8VisUmaL+k/ng7sfDmdTq1Zs0ajRo1yv7dYLAoICNB3332nw4cPVzvO5XJp5MiR7i+Xy1XjGn/5y1/cX6GhofLx8dGNN96o2267TX/5y180dOhQd9/v0NBQ3X777bJarbr//vt10003afDgwfL29tagQYP08ccf6/rrr9dTTz2ldu3a6YorrtCKFStUWlqqtWvXau3atZo/f768vb0VGhqqVq1aafDgwXrhhRc0efLkC/8B4nxdconDnTt3KjMz84zjLpdL+fn5Onz4sJKTk/XRRx/pwIEDjR7fnDlz9Pnnn7vfr1y5UqtWrar22mPHjik9PV2SdM0110iSUlJSdOLECRUWFmro0KFyOp3Vjv33v/99gSMHLg60UgEAAAAAoHrmzp07kyQlSZpttVq7WyyWBNM0EyT18nBstVaR7NqxY4e6desmb29vPfroo/rvf/+rRx55RH379tV7772nO++8U7///e/dG3VWuOOOO/Tggw+63y9evLjGtSpvvJmXlydJuvPOO3X//fcrJCREmzZt0htvvCFJ6t+/v/r37y+n06k9e/bo+++/V1BQkLKysjRs2DCNGDFCWVlZ2rdvn3vO/Px89ezZU3PnztVNN92kv/zlL5o7d64sFos7WVn5nuFxlt69ew/w8vJKME1zrMPhqPdmti6XS7t27dJnn32m6dOny9vbu07n62P79u1avny5li5dKsMwNGzYMPn4+Mjb21v+/v4KDg5WeHi4IiIiFBoaqvbt22vgwIEKDg4+59z5+fnu/20hSQMGDFC3bt1qvL5ic9wK3377rXJzczVixAhJ0qlTp7RmzRr5+/tXSZZL0rp167RlyxZt2rRJy5Ytk/TjRrzz58/XtGnTVFpaqtjYWHfl+U/NmjVL//znPzV27Fi5XC5ZLGfW2ebk5JyxLnCxIzEOAAAAAEAtJCUl7Za0W9I8u93e2TTNBNM0EwzD6Ofp2GqSnZ2t3/72t2rfvr2+/vpr/e53v9P333+v4cOHa/jw4e4E16233qrLL7/cvQFmZZWT4tW9r2zevHnKzMxURkaGXnzxRc2dO1dTp07VkCFD9OCDD+qxxx5zt1tZuXKlPv30U2VkZKh79+765S9/qdzcXL311lvau3evbDabhgwZoquvvto9f9u2bfX000/rj3/8oxYtWiR/f3/t3btXPXv21Lx585STk6NFixZp9uzZysvL09ixYy/Ex4g6uOWWW7xSU1OvdrlcCZLGSmp7ITqhXH/99TIMQydOnKi2f/y5ztfH5MmTNX78eL377rsaP368SkpK9MUXX9R4fcUPZDZt2lRjkrmC3W4/45iXl1etY1u6dKmmT5+uxMREpaena//+/SotLdWSJUvUpUsXSdLy5cu1a9cuSdLYsWO1efNmZWRkSJJ2796tTp06yW63a9GiRYqPj6/VuitWrKjSMqnCtddeW+vYgYsFiXEAAAAAAOooMTExRdLzkp63Wq0dznW9p/z973+X3W7XlClTtGzZMt19990qLi6WxWLRSy+95K60Li0tVWlpqdq0aaMVK1ZIkn7xi1/Uep3HH39cERERevXVV9WuXTu1a9dOvr6+uvbaa/XCCy8oKytLL730klauXKnPPvtMkydPpvXAaAAAIABJREFUVo8ePdSvXz917dq1SgXqkCFDdOrUKW3ZskWffvqpnn32WS1YsEB9+vTRCy+8oMTERF1zzTVat26dsrOz9eWXX+r+++9XQECAlixZosDAQC1cuFAzZsyotrIVF57dbveRNMw0zYSUlJSbJUVd6DUWL16skpIS3XnnnfU6Xx++vr6aM2dOrSrAz1d4eLhef/31Gs+PHDnS/fqLL76Qt7e3BgwYoEmTJslut2v79u1auHCh5s6dq+XLl8vhcGj9+vXu53ncuHGSpGnTpqmwsFBz5syRJH311VfauHGjfH19NWrUKBUUFKikpEQPP/ywVq1apZycHBUUFOjaa69VWFiY7r777jol8IGLGYlxAAAAAADOQ1JS0kFPx1CTcePGuStXH3jggSqVtGVlZSorK5Npmu4vLy8vWSwWjRo1SnPmzDlnO4q5c+fKx8dHv//97884t3fvXnXs2FE///nPdd1118lisejqq6/W3r17FRAQUG11eoWQkBDdcMMNuuGGG3Tq1Cn5+/vLx8dHP/vZzzRz5kz3JoERERHq3LmzevbsKavVqop9/wYMGKD33ntP4eHhdf7MUDuXXXaZX2ho6HWSEkzTHCOpQT/syy+/XN9++229z9dXRWsh0zRVXFxcJUFdoaLNyU8rqe12u1q1alXlusTE6jdNzc7OrtKK6GzWr1+vPXv2aNSoUerUqZOGDx+ukSNHqnv37vruu+80efJk5efna/Hixe6NONeuXauDBw9q/vz5OnLkiK6//npNmjRJH3zwgXJycvSPf/xDUVFRevXVV5Wfn6+bb77ZvR/ANddco88//1xjx47Va6+95r7PBQsWaObMmZKkJ554olaxAxcTEuMAAAAAADRRZ2vn4OXlVWPl51NPPVWr+c923e9+9ztJUocOVQvqz9ZHuToVPZilH6vJq2Oz2c441rp16zqtg9qx2Wxjy1sITazrWLvd/oRpmtdKetrhcHxel2ON7bXXXtPKlSvldDq1detW5efnKzw8XMuXL1d4eLgCAwMlSUlJSZo3b56ioqJUUlJSZQ6LxVKlL3jfvn3PWGfSpEmSfvx1XlZWVmM8paWlmjRpkkaMGKHnnntORUVFmjhxombMmOH+IdPBgwe1d+9e9/8CSU5OVnR0tAzD0LJly5ScnKy5c+fq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AFAXjWHzTSAIDkhKLi75Wgk33hqUgMUlX/sO9wclIK44EuMAAABA02ey2WwJvspwSTc3pz0rIyMjlZWVVacK8F8qJiZGq1evvuDzd911l/94+/btCg8PV+/evTV27FjZbDbt3btXixYtkt1uV25urgoLC7V161atXbtWkjRy5EhJ0pQpU3T69GllZWVJkv72t7/prbfeUmRkpNLS0nTq1ClVV1fr8ccfr78XCwBAM2EymdYbhpE8f+MKzbh/km7q0EWtWrSsl1iuM6dUXPK1FvzpJUmSYRiB+6eh0SMxDgAAADRNZqvV2sswjJFmsznDMIwuDT2g+pSQkCDpbOuRqqqqWglqH1+bk6uvrl0QabPZdN1119W6zuFwBIxTXl6uBx98sE5j2rp1qw4ePKi0tDR16dJFqampuuuuu9S9e3d9/vnnmjhxolwul5YuXerfiHPz5s06cuSI5syZo2+++UZDhw7V2LFj9cYbb+jEiRN655131KZNG61atUoul0u/+93v6jQWALiQ5rD5JnApDodjtdVqTf+y9HDaw4tmBjP0X5xO54U/UUejRmIcAAAAaGJsNttSwzAyJMWZTCZdbnW41Wp9SdL/MwzjEafT+VJjPvfKK68oLy9Pbrdbu3btksvlUkxMjHJzcxUTE6OoqLN9RJ1Op7Kzs9WmTRtVV1fXer1ms7lWX/CePXue956MHTtWkhQdHa2ampoLvncej0djx47VkCFDtGDBAp05c0ZjxozRjBkz1LFjR0nSkSNHVFRUJK/XK4/Ho48//li/+c1vZDKZtHLlSn388cey2+0aN26cbrzxRk2aNEk9evRQYmKiDh06pDZt2ujQoUPq27dvk/13+7nnLvjGAwBwcd7CwsL0hISEh0wm0zhJt0q6tp5ifS9pv2EY651O5xpJzWeZXoghMQ4AAAA0MV6v1zCbzUZzapdyIRMmTNCECRPUp08fSVJpaamuueYaFRQUaP369Zo9e7a6d++uefPmadq0afq5/dQ3bNig9PR05efn+8+lp6dry5YtF/2+OXPmaMSIEerYsaN2796tDRs2qLS0VBMnTtSwYcNUXFysF198UTk5ObrnnntktVo1ZcoU5eTkKCsrSykpKUpMTFR0dLReffVV7dy5Uz179tS+ffs0derUn/VaAAAIUV6n0/mKpFcudSG99yGxlCaorFarIUlvOl4O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","width":1478,"y":-30,"x":-34},"elements":{"page":{"lineJumps":false,"gridSize":15,"showGrid":true,"orientation":"portrait","height":2260,"backgroundColor":"transparent","width":1404,"padding":20},"elements":{"1712bb52a94fc8":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb52a94fc8","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"激活","category":"uml_sequence","name":"sequenceActivation","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x":"0","x1":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,255,204","type":"solid"},"locked":false,"group":"","props":{"w":30,"angle":0,"h":104.44444444444446,"y":854.000006781684,"zindex":37,"x":1132.3125808693871}},"1712fd3f07489f":{"to":{"id":"1712bd84450cc2","angle":3.1415926535897927,"y":1707,"x":709},"id":"1712fd3f07489f","linkerType":"broken","text":"返回最终数","lineStyle":{"lineStyle":"dot"},"name":"linker","from":{"id":"1712bd8a8207c6","y":1707,"angle":0,"x":895},"dataAttributes":[],"locked":false,"points":[{"y":1707,"x":802},{"y":1707,"x":802}],"group":"","props":{"zindex":75}},"1712bb6e9620d8":{"id":"1712bb6e9620d8","to":{"y":940.6666734483507,"x":616.2222120496962},"text":"return MapperProxy","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":940.6666734483507,"x":728.9999898274739},{"y":940.6666734483507,"x":728.9999898274739}],"locked":false,"dataAttributes":[],"from":{"id":"1712bb4a0991a1","angle":0,"y":940.6666734483507,"x":841.7777676052517},"group":"","props":{"zindex":41}},"1712bd83a8a4af":{"id":"1712bd83a8a4af","to":{"id":"1712bd84450cc2","y":1488.6666531032986,"angle":0,"x":679.5555453830295},"text":"4、对应的CRUD方法","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1495.3333197699653,"x":590.1111009385851},{"y":1488.6666531032986,"x":590.1111009385851}],"locked":false,"dataAttributes":[],"from":{"id":"1712bd74a300fb","angle":3.141592653589793,"y":1495.3333197699653,"x":500.6666564941406},"group":"","props":{"zindex":59}},"1712bb040c8741":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb040c8741","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"230,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":148.00000054495672,"h":516.4857254028323,"angle":0,"x":38.079352000403006,"zindex":0}},"1712bd74a300fb":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bd74a300fb","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"255,255,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":1370.8688538722988,"h":380,"angle":0,"x":471.73896803006494,"zindex":56}},"1712bb4a0991a1":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb4a0991a1","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"255,204,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":835.1111178927952,"h":142.22222222222217,"angle":0,"x":841.2347493013517,"zindex":35}},"1712b9b93c817d":{"id":"1712b9b93c817d","to":{"id":"1712b9bb236492","y":272.7428594316756,"angle":0,"x":371.7428479875836},"text":"1、build配置文件","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":267.5712636268855,"x":221.18547093840345},{"y":272.7428594316756,"x":221.18547093840345}],"locked":false,"dataAttributes":[],"from":{"y":267.5712636268855,"x":70.62809388922302},"group":"","props":{"zindex":3}},"1712bd7d5d519c":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"3、查找crud方法"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bd7d5d525a","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bd7d5d5eda","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bd7d5d504a","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bd7d5d59f6","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bd7d5d5bd8","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bd7d5d519c","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":160,"y":1370.5185049551503,"h":40,"angle":0,"x":508.776005067102,"zindex":58}},"1712bb1967487":{"textBlock":[{"position":{"w":"w-20","h":"30","y":"0","x":"10"},"text":"Configuration"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb1967487","anchors":[],"title":"生命线","category":"uml_sequence","name":"sequenceLifeLine","path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":136.44934251872365,"angle":0,"h":486.6666666666665,"y":741.7777845594619,"zindex":27,"x":526.3885422429039}},"1712fd2e72b75":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712fd2e72b75","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"255,204,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":1606,"h":100,"angle":0,"x":1294.1111009385845,"zindex":72}},"1712bbf15b84fd":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"DefaultSqlSession"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bbf15b84fd","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":133.88888888888914,"y":1305.6673669024533,"h":478.34938862939134,"angle":0,"x":628.9999898274737,"zindex":49}},"1712fd1ba34154":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712fd1ba34154","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"激活","category":"uml_sequence","name":"sequenceActivation","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x":"0","x1":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"229,204,255","type":"solid"},"locked":false,"group":"","props":{"w":30,"angle":0,"h":101,"y":1596.0003387017562,"zindex":68,"x":1096.1832166369377}},"1712bbec199fd2":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"MapperProxy"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bbec199fd2","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":110.5555555555556,"y":1305.9142804827002,"h":478.39367482018906,"angle":0,"x":234.55554538302948,"zindex":47}},"1712fd16cf7efd":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"7、doQuery()"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712fd16ddeade","category":"default","name":"序号","value":"","type":"number"},{"id":"1712fd16dde2f5","category":"default","name":"名称","value":"","type":"string"},{"id":"1712fd16dde83c","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712fd16dde55c","category":"default","name":"连接","value":"","type":"link"},{"id":"1712fd16dde93e","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712fd16cf7efd","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":111.81678336306231,"angle":0,"h":26.355896267496746,"y":1534.6441037325033,"zindex":66,"x":948.1832166369377}},"1712fd2944d2e9":{"id":"1712fd2944d2e9","to":{"id":"1712fd1ba34154","y":1629.33,"angle":3.141592653589793,"x":1126},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1605.09,"x":1156},{"y":1629.33,"x":1156}],"locked":false,"dataAttributes":[],"from":{"id":"1712fd1ba34154","angle":3.141592653589793,"y":1605.09,"x":1126},"group":"","props":{"zindex":69}},"1712bbf14e5c91":{"textBlock":[{"position":{"w":"w-20","h":"30","y":"0","x":"10"},"text":"MapperMethod"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bbf14e5c91","anchors":[],"title":"生命线","category":"uml_sequence","name":"sequenceLifeLine","path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,255,204","type":"solid"},"locked":false,"group":"","props":{"w":119.23633043938435,"angle":0,"h":473.9492303757456,"y":1305.6473454492314,"zindex":48,"x":422.5414371658675}},"1712fd3599e6cf":{"to":{"id":"1712fd1ba34154","angle":3.490658503988659,"y":1692.2427982762053,"x":1125.3015368960705},"id":"1712fd3599e6cf","linkerType":"broken","text":"11、返回最终数据","lineStyle":{"lineStyle":"dot"},"name":"linker","from":{"id":"1712fd2e72b75","y":1692,"angle":0,"x":1295},"dataAttributes":[],"locked":false,"points":[{"y":1692,"x":1210.1507684480353},{"y":1692.2427982762053,"x":1210.1507684480353}],"group":"","props":{"zindex":73}},"1712bb52230dc3":{"to":{"id":"1712bb52a94fc8","angle":0,"y":906.2222290039062,"x":1132.3125808693871},"id":"1712bb52230dc3","linkerType":"broken","text":"4、构造方法","lineStyle":{},"name":"linker","from":{"id":"1712bb4a0991a1","y":906.2222290039062,"angle":3.141592653589793,"x":871.2347493013517},"dataAttributes":[],"locked":false,"points":[{"y":906.2222290039062,"x":1001.7736650853694},{"y":906.2222290039062,"x":1001.7736650853694}],"group":"","props":{"zindex":36}},"1712bd8a8207c6":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bd8a8207c6","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"激活","category":"uml_sequence","name":"sequenceActivation","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x":"0","x1":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,229,255","type":"solid"},"locked":false,"group":"","props":{"w":30,"angle":0,"h":282.2222222222222,"y":1465.3333197699653,"zindex":62,"x":894.1832166369377}},"1712bb672276f7":{"id":"1712bb672276f7","to":{"id":"1712bb4a0991a1","y":939.5555623372395,"angle":3.1415926535897936,"x":870.6666564941406},"text":"return MapperProxy","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":939.5555623372395,"x":1001.7777676052517},{"y":939.5555623372395,"x":1001.7777676052517}],"locked":false,"dataAttributes":[],"from":{"id":"1712bb52a94fc8","angle":0,"y":939.5555623372395,"x":1132.8888787163628},"group":"","props":{"zindex":40}},"1712bcaa3bc591":{"textBlock":[{"position":{"w":"w-20","h":"30","y":"0","x":"10"},"text":"ResultSetHandler"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bcaa3bc591","anchors":[],"title":"生命线","category":"uml_sequence","name":"sequenceLifeLine","path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,204,230","type":"solid"},"locked":false,"group":"","props":{"w":133.88888888888914,"angle":0,"h":478.34938862939134,"y":1301.2471871955856,"zindex":52,"x":1240.1396932224998}},"1712bd7c5d5523":{"to":{"id":"1712bd74a300fb","angle":3.141592653589794,"y":1459.7777642144097,"x":500.6666564941406},"id":"1712bd7c5d5523","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1712bd74a300fb","y":1399.7777642144097,"angle":3.141592653589793,"x":500.6666564941406},"dataAttributes":[],"locked":false,"points":[{"y":1399.7777642144097,"x":530.6666564941406},{"y":1459.7777642144097,"x":530.6666564941406}],"group":"","props":{"zindex":57}},"1712bb24ba0387":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb24ba0387","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":800.6666734483507,"h":205.55555555555554,"angle":0,"x":277.59153536006585,"zindex":31}},"1712bceb4002b5":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bceb4002b5","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":1353.111097547743,"h":401.1111789279514,"angle":0,"x":276.50911449331693,"zindex":54}},"1712ba8916b9ef":{"id":"1712ba8916b9ef","to":{"y":427.34285409109935,"x":735.7428479875836},"text":"4、openSession","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":424.48202093593585,"x":402.8494053646328},{"y":427.34285409109935,"x":402.8494053646328}],"locked":false,"dataAttributes":[],"from":{"y":424.48202093593585,"x":69.95596274168206},"group":"","props":{"zindex":13}},"1712fd2a665495":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"9、execute()"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712fd2a74923c","category":"default","name":"序号","value":"","type":"number"},{"id":"1712fd2a7497be","category":"default","name":"名称","value":"","type":"string"},{"id":"1712fd2a749ebc","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712fd2a7493f8","category":"default","name":"连接","value":"","type":"link"},{"id":"1712fd2a7497fc","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712fd2a665495","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":111.81678336306231,"y":1565.6441037325033,"h":26.355896267496746,"angle":0,"x":1140.1832166369377,"zindex":70}},"1712baa1770a98":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712baa1770a98","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":423.14287240164623,"h":100,"angle":0,"x":1082.2428479875844,"zindex":19}},"1712ba9492a62b":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"5、openSessionFromDataSource"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712ba9492a0ed","category":"default","name":"序号","value":"","type":"number"},{"id":"1712ba9492a613","category":"default","name":"名称","value":"","type":"string"},{"id":"1712ba9492a8a1","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712ba9492ab6f","category":"default","name":"连接","value":"","type":"link"},{"id":"1712ba9492a6a4","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712ba9492a62b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":263,"y":389.3428540910994,"h":33.800018310546875,"angle":0,"x":765.7428479875836,"zindex":16}},"1712bb776020c9":{"id":"1712bb776020c9","to":{"id":"1712bb09b306b5","y":944.000006781684,"angle":3.141592653589793,"x":73.99998982747395},"text":"return MapperProxy","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":944.000006781684,"x":176.22221204969617},{"y":944.000006781684,"x":176.22221204969617}],"locked":false,"dataAttributes":[],"from":{"id":"1712bb24ba0387","angle":0,"y":944.000006781684,"x":278.4444342719184},"group":"","props":{"zindex":43}},"1712b9bb236492":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712b9bb236492","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"204,229,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":218.74286324637274,"h":141.99999618530273,"angle":0,"x":371.7428479875836,"zindex":4}},"1712bb24056da8":{"to":{"id":"1712bb24ba0387","angle":0,"y":850.6666734483507,"x":278.4444342719184},"id":"1712bb24056da8","linkerType":"broken","text":"1、getMapper(class)","lineStyle":{},"name":"linker","from":{"id":"1712bb09b306b5","y":850.6666734483507,"angle":3.141592653589793,"x":73.99998982747395},"dataAttributes":[],"locked":false,"points":[{"y":850.6666734483507,"x":176.22221204969617},{"y":850.6666734483507,"x":176.22221204969617}],"group":"","props":{"zindex":30}},"1712bd7417b223":{"id":"1712bd7417b223","to":{"id":"1712bd74a300fb","y":1419.7777642144097,"angle":0,"x":471.7777676052517},"text":"2、execute()","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1420.8888753255208,"x":388.99998982747394},{"y":1419.7777642144097,"x":388.99998982747394}],"locked":false,"dataAttributes":[],"from":{"id":"1712bceb4002b5","angle":3.141592653589793,"y":1420.8888753255208,"x":306.22221204969617},"group":"","props":{"zindex":55}},"1712fd2dc1ba8f":{"id":"1712fd2dc1ba8f","to":{"id":"1712fd2e72b75","y":1656,"angle":0,"x":1294.1111009385845},"text":"10、handleResultSets","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1656.6,"x":1210.0555504692923},{"y":1656,"x":1210.0555504692923}],"locked":false,"dataAttributes":[],"from":{"id":"1712fd1ba34154","angle":3.141592653589793,"y":1656.6,"x":1126},"group":"","props":{"zindex":71}},"1712bb0c14e1e":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"DefaultSqlSession"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb0c14e1e","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":136.44934251872365,"y":744.0000067816841,"h":486.6666666666665,"angle":0,"x":224.21731397541697,"zindex":25}},"1712bb5760cdde":{"to":{"id":"1712bb52a94fc8","angle":3.141592653589793,"y":924.7901302384741,"x":1161.7777676052517},"id":"1712bb5760cdde","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1712bb52a94fc8","y":877.2098833248939,"angle":3.141592653589793,"x":1161.7777676052517},"dataAttributes":[],"locked":false,"points":[{"y":877.2098833248939,"x":1191.7777676052517},{"y":924.7901302384741,"x":1191.7777676052517}],"group":"","props":{"zindex":38}},"1712ba70bb4988":{"id":"1712ba70bb4988","to":{"id":"1712b9bb236492","y":336.7428594316756,"angle":3.1415926535897927,"x":401.7428479875836},"text":"返回DefaultSqlSessionFactory对象","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":339.7428594316756,"x":568.7428479875836},{"y":336.7428594316756,"x":568.7428479875836}],"locked":false,"dataAttributes":[],"from":{"id":"1712ba69e81c22","angle":0,"y":339.7428594316756,"x":735.7428479875836},"group":"","props":{"zindex":11}},"1712bcea919f92":{"id":"1712bcea919f92","to":{"id":"1712bceb4002b5","y":1403.1111653645833,"angle":0,"x":277.3333231608073},"text":"1、invoke()","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1403.111097547743,"x":176.77776760525177},{"y":1403.1111653645833,"x":176.77776760525177}],"locked":false,"dataAttributes":[],"from":{"id":"1712bbe9c02dbb","angle":3.141592653589793,"y":1403.111097547743,"x":76.22221204969618},"group":"","props":{"zindex":53}},"1712ba8df35751":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712ba8df35751","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"229,204,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":391.3428540910994,"h":159,"angle":0,"x":735.7428479875836,"zindex":14}},"1712ba920e2ee1":{"id":"1712ba920e2ee1","to":{"id":"1712ba8df35751","y":451.3428540910995,"angle":3.141592653589793,"x":765.7428479875836},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":430.3428540910994,"x":795.7428479875836},{"y":451.3428540910995,"x":795.7428479875836}],"locked":false,"dataAttributes":[],"from":{"id":"1712ba8df35751","angle":3.1415926535897927,"y":430.3428540910994,"x":765.7428479875836},"group":"","props":{"zindex":15}},"1712bb49614fc":{"id":"1712bb49614fc","to":{"id":"1712bb4a0991a1","y":889.5555623372395,"angle":0,"x":841.7777676052517},"text":"3、getMapper(class,SqlSession)","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":890.6666734483507,"x":725.111100938585},{"y":889.5555623372395,"x":725.111100938585}],"locked":false,"dataAttributes":[],"from":{"id":"1712bb2b0c83c8","angle":3.141592653589793,"y":890.6666734483507,"x":608.4444342719183},"group":"","props":{"zindex":34}},"1712fd3b6b1bd8":{"to":{"id":"1712bd8a8207c6","angle":3.1415926535897927,"y":1684,"x":924},"id":"1712fd3b6b1bd8","linkerType":"broken","text":"返回最终数","lineStyle":{"lineStyle":"dot"},"name":"linker","from":{"id":"1712fd1ba34154","y":1684,"angle":0,"x":1097},"dataAttributes":[],"locked":false,"points":[{"y":1684,"x":1010.5},{"y":1684,"x":1010.5}],"group":"","props":{"zindex":74}},"1712baad672d89":{"id":"1712baad672d89","to":{"id":"1712ba8df35751","y":507.3428540910994,"angle":3.141592653589794,"x":765.7428479875836},"text":"返回DefaultSqlSession对象","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":507.3428540910994,"x":924.2428479875836},{"y":507.3428540910994,"x":924.2428479875836}],"locked":false,"dataAttributes":[],"from":{"id":"1712baa1770a98","angle":0,"y":507.3428540910994,"x":1082.7428479875844},"group":"","props":{"zindex":20}},"1712ba64005576":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"DefaultSqlSessionFactory"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712ba64005576","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"229,204,255","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":186,"y":161.74286324637276,"h":452.99999618530273,"angle":0,"x":657.7428479875836,"zindex":8}},"1712bc15e1a6aa":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"SimpleExecutor"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bc15e1a6aa","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"204,229,255","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":133.88888888888914,"y":1303.4697481195637,"h":478.34938862939134,"angle":0,"x":843.776005067102,"zindex":50}},"1712bb1979fc59":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"MapperRegistry"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb1979fc59","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"255,204,230","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":136.44934251872365,"y":739.5555623372398,"h":486.6666666666665,"angle":0,"x":788.1345739889354,"zindex":28}},"1712ba69e81c22":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712ba69e81c22","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"229,204,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":263.7428594316756,"h":100,"angle":0,"x":735.7428479875836,"zindex":10}},"1712bbe5f339d9":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"Executor执行流程"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"color":"255,0,0","size":30},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bbe604f216","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bbe604f3d7","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bbe604f336","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bbe604ff75","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bbe604f07c","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bbe5f339d9","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{"color":"255,102,102","type":"solid"},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":446,"y":1249.9142804827002,"h":56,"angle":0,"x":62.93331981840582,"zindex":44}},"1712bb7520a70a":{"id":"1712bb7520a70a","to":{"id":"1712bb24ba0387","y":944.000006781684,"angle":3.141592653589793,"x":307.3333231608073},"text":"return MapperProxy","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":944.000006781684,"x":443.999989827474},{"y":944.000006781684,"x":443.999989827474}],"locked":false,"dataAttributes":[],"from":{"id":"1712bb2b0c83c8","angle":0,"y":944.000006781684,"x":580.6666564941406},"group":"","props":{"zindex":42}},"1712bd84450cc2":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bd84450cc2","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"uml_sequence","title":"激活","name":"sequenceActivation","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"4","x":"0"},{"action":"quadraticCurve","y1":"0","y":"0","x1":"0","x":"4"},{"action":"line","y":"0","x":"w-4"},{"action":"quadraticCurve","y1":"0","y":"4","x1":"w","x":"w"},{"action":"line","y":"h-4","x":"w"},{"action":"quadraticCurve","y1":"h","y":"h","x1":"w","x":"w-4"},{"action":"line","y":"h","x":"4"},{"action":"quadraticCurve","y1":"h","y":"h-4","x1":"0","x":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":30,"y":1445.3333197699653,"h":302.2222222222222,"angle":0,"x":679.3703601978444,"zindex":60}},"1712fd15db4ae5":{"to":{"id":"1712bd8a8207c6","angle":3.141592653589793,"y":1606.4444308810764,"x":924.1832166369377},"id":"1712fd15db4ae5","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1712bd8a8207c6","y":1558,"angle":3.141592653589793,"x":924},"dataAttributes":[],"locked":false,"points":[{"y":1558,"x":954},{"y":1606.4444308810764,"x":954.1832166369377}],"group":"","props":{"zindex":65}},"1712b9cf9096b4":{"id":"1712b9cf9096b4","to":{"id":"1712b9bb236492","y":289.7428613390242,"angle":3.141592653589793,"x":401.7428479875836},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":244.30285714285728,"x":431.7428479875836},{"y":289.7428613390242,"x":431.7428479875836}],"locked":false,"dataAttributes":[],"from":{"id":"1712b9bb236492","angle":3.141592653589793,"y":244.30285714285728,"x":401.7428479875836},"group":"","props":{"zindex":6}},"1712bb2a6a3e08":{"id":"1712bb2a6a3e08","to":{"id":"1712bb2b0c83c8","y":868.4444512261284,"angle":0,"x":580.6666564941406},"text":"2、getMapper(class)","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":868.4444512261284,"x":443.999989827474},{"y":868.4444512261284,"x":443.999989827474}],"locked":false,"dataAttributes":[],"from":{"id":"1712bb24ba0387","angle":3.141592653589793,"y":868.4444512261284,"x":307.3333231608073},"group":"","props":{"zindex":32}},"1712b9a3ccb5ab":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"SqlSessionFactoryBuilder"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712b9a3ccb5ab","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"204,229,255","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":180,"y":158.74286324637276,"h":495,"angle":0,"x":293.7428479875836,"zindex":1}},"1712ba9b234f71":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"DefaultSqlSession"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712ba9b234f71","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"255,204,204","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":137,"y":156.34285409109933,"h":463.8000144958496,"angle":0,"x":1028.7428479875844,"zindex":17}},"1712b9d3e968ec":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"2.build配置文件"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712b9d3e96ab","category":"default","name":"序号","value":"","type":"number"},{"id":"1712b9d3e96af7","category":"default","name":"名称","value":"","type":"string"},{"id":"1712b9d3e960eb","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712b9d3e9663","category":"default","name":"连接","value":"","type":"link"},{"id":"1712b9d3e96708","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712b9d3e968ec","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{"color":"204,229,255","type":"solid"},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":160,"y":215.74285943167547,"h":40,"angle":0,"x":407.7428479875836,"zindex":7}},"1712bb1fdf23ff":{"textBlock":[{"position":{"w":"w-20","h":"30","y":"0","x":"10"},"text":"MapperProxyFactory"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb1fdf23ff","anchors":[],"title":"生命线","category":"uml_sequence","name":"sequenceLifeLine","path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,255,204","type":"solid"},"locked":false,"group":"","props":{"w":158.08763806076058,"angle":0,"h":491.11111111111063,"y":737.3333401150178,"zindex":29,"x":1068.1345739889355}},"1712bb2b0c83c8":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb2b0c83c8","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"激活","category":"uml_sequence","name":"sequenceActivation","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x":"0","x1":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":30,"angle":0,"h":204.44444444444446,"y":818.4444512261284,"zindex":33,"x":580.666656494141}},"1712bb1229cbea":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"开始执行"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bb1229c993","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bb1229c8fc","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bb1229cc25","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bb1229c2b","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bb1229cfd9","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bb1229cbea","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":80,"angle":0,"h":43.33333333333337,"y":740.1728462878575,"zindex":26,"x":20.909647940654924}},"1712bd969e4a2a":{"to":{"id":"1712bd8a8207c6","angle":3.141592653589794,"y":1539.7777642144097,"x":923.9999898274739},"id":"1712bd969e4a2a","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1712bd8a8207c6","y":1484.2222086588542,"angle":3.1415926535897927,"x":923.9999898274739},"dataAttributes":[],"locked":false,"points":[{"y":1484.2222086588542,"x":953.9999898274739},{"y":1539.7777642144097,"x":953.9999898274739}],"group":"","props":{"zindex":63}},"1712fd418ceede":{"to":{"id":"1712bbe9c02dbb","angle":3.141592653589793,"y":1717,"x":77},"id":"1712fd418ceede","linkerType":"broken","text":"返回最终数","lineStyle":{"lineStyle":"dot"},"name":"linker","from":{"id":"1712bd84450cc2","y":1714,"angle":0,"x":680},"dataAttributes":[],"locked":false,"points":[{"y":1714,"x":378.5},{"y":1717,"x":378.5}],"group":"","props":{"zindex":76}},"1712bb59db8772":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"newInstance"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bb59db8dd6","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bb59db878f","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bb59db80c8","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bb59db8999","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bb59db8eef","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bb59db8772","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":105.55555555555543,"y":856.0987722137826,"h":41.111111111111086,"angle":0,"x":1199.555545383029,"zindex":39}},"1712bc9f614e55":{"textBlock":[{"position":{"w":"w-20","y":"0","h":"30","x":"10"},"text":"PrepareStatement"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":false,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bc9f614e55","anchors":[],"category":"uml_sequence","title":"生命线","name":"sequenceLifeLine","fillStyle":{"color":"229,204,255","type":"solid"},"path":[{"lineStyle":{"lineStyle":"dot","lineWidth":2},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"30","x":"w*(1/2)"},{"action":"line","y":"h","x":"w*(1/2)"}]},{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"30","x":"w"},{"action":"line","y":"30","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":133.88888888888914,"y":1303.4474356732865,"h":478.34938862939134,"angle":0,"x":1042.3287583652036,"zindex":51}},"1712bd8a09377b":{"id":"1712bd8a09377b","to":{"id":"1712bd8a8207c6","y":1494.2222086588542,"angle":0,"x":895.1111009385851},"text":"5、query()","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1491.9999864366318,"x":801.7777676052517},{"y":1494.2222086588542,"x":801.7777676052517}],"locked":false,"dataAttributes":[],"from":{"id":"1712bd84450cc2","y":1491.9999864366318,"angle":3.1415926535897927,"x":708.4444342719183},"group":"","props":{"zindex":61}},"1712fd0f3eb46":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"6、QueryFromDatabase()"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712fd0f3ec2f4","category":"default","name":"序号","value":"","type":"number"},{"id":"1712fd0f3ec7db","category":"default","name":"名称","value":"","type":"string"},{"id":"1712fd0f3ecf1b","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712fd0f3ec17c","category":"default","name":"连接","value":"","type":"link"},{"id":"1712fd0f3ec905","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712fd0f3eb46","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":160,"y":1438,"h":40,"angle":0,"x":936.1832166369377,"zindex":64}},"1712bbe9c02dbb":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bbe9c02dbb","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"激活","category":"uml_sequence","name":"sequenceActivation","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x":"0","x1":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"230,255,204","type":"solid"},"locked":false,"group":"","props":{"w":30,"angle":0,"h":486.66666666666663,"y":1301.7777845594615,"zindex":45,"x":49.48523436681367}},"1712baa0fc1574":{"id":"1712baa0fc1574","to":{"id":"1712baa1770a98","y":474.34285409109964,"angle":0,"x":1082.2428479875844},"text":"6、调用构造方法","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":470.8428540910996,"x":923.9928479875836},{"y":474.34285409109964,"x":923.9928479875836}],"locked":false,"dataAttributes":[],"from":{"id":"1712ba8df35751","angle":3.141592653589793,"y":470.8428540910996,"x":765.7428479875836},"group":"","props":{"zindex":18}},"1712b9c9055e71":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"开始执行"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712b9c90558e1","category":"default","name":"序号","value":"","type":"number"},{"id":"1712b9c9055b97","category":"default","name":"名称","value":"","type":"string"},{"id":"1712b9c9055e7","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712b9c9055dd1","category":"default","name":"连接","value":"","type":"link"},{"id":"1712b9c9055b9a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712b9c9055e71","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":107,"angle":0,"h":41,"y":183.7428594316755,"zindex":5,"x":5.344646130172542}},"1712bac7ae21e7":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"加载配置文件到开启会话的流程"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"color":"255,0,0","size":30},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bac7ae2da4","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bac7ae2248","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bac7ae2b77","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bac7ae2219","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bac7ae205a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bac7ae21e7","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{"color":"255,102,102","type":"solid"},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":446,"y":43.34285409109937,"h":56,"angle":0,"x":60.74284798758369,"zindex":22}},"1712bbe9c02f56":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"开始执行"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bbe9d685b7","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bbe9d68559","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bbe9d6878b","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bbe9d68a93","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bbe9d687e2","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bbe9c02f56","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":80,"angle":0,"h":43.33333333333337,"y":1297.9506240656349,"zindex":46,"x":24.479399015427614}},"1712bafc8271f2":{"textBlock":[{"position":{"w":"w","h":"h","y":0,"x":0},"text":"MapperProxy的构建流程"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"color":"255,0,0","size":30},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1712bafc907fe9","category":"default","name":"序号","value":"","type":"number"},{"id":"1712bafc9072c6","category":"default","name":"名称","value":"","type":"string"},{"id":"1712bafc90786d","category":"default","name":"所有者","value":"","type":"string"},{"id":"1712bafc907829","category":"default","name":"连接","value":"","type":"link"},{"id":"1712bafc90778e","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1712bafc8271f2","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"文本","category":"basic","name":"text","path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,102,102","type":"solid"},"locked":false,"group":"","props":{"w":446,"angle":0,"h":56,"y":669.9142804827005,"zindex":23,"x":52.17141941615509}},"1712ba68eec308":{"id":"1712ba68eec308","to":{"id":"1712ba69e81c22","y":313.7428594316756,"angle":0,"x":735.7428479875836},"text":"3、构造方法","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":311.04285534994966,"x":568.7428479875836},{"y":313.7428594316756,"x":568.7428479875836}],"locked":false,"dataAttributes":[],"from":{"id":"1712b9bb236492","angle":3.141592653589793,"y":311.04285534994966,"x":401.7428479875836},"group":"","props":{"zindex":9}},"1712bab2784625":{"id":"1712bab2784625","to":{"y":502.64059939103146,"x":70.62809388922302},"text":"返回DefaultSqlSession对象","linkerType":"broken","name":"linker","lineStyle":{"lineStyle":"dot"},"points":[{"y":506.3428540910994,"x":403.1854709384033},{"y":502.64059939103146,"x":403.1854709384033}],"locked":false,"dataAttributes":[],"from":{"id":"1712ba8df35751","angle":0,"y":506.3428540910994,"x":735.7428479875836},"group":"","props":{"zindex":21}},"1712bb09b306b5":{"textBlock":[],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["t","b"],"dataAttributes":[],"shapeStyle":{"alpha":1},"id":"1712bb09b306b5","anchors":[{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"激活","category":"uml_sequence","name":"sequenceActivation","path":[{"actions":[{"action":"move","y":"4","x":"0"},{"y1":"0","action":"quadraticCurve","y":"0","x":"4","x1":"0"},{"action":"line","y":"0","x":"w-4"},{"y1":"0","action":"quadraticCurve","y":"4","x":"w","x1":"w"},{"action":"line","y":"h-4","x":"w"},{"y1":"h","action":"quadraticCurve","y":"h","x":"w-4","x1":"w"},{"action":"line","y":"h","x":"4"},{"y1":"h","action":"quadraticCurve","y":"h-4","x":"0","x1":"0"},{"action":"line","y":"4","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"230,255,204","type":"solid"},"locked":false,"group":"","props":{"w":30,"angle":0,"h":486.66666666666663,"y":744.000006781684,"zindex":24,"x":45.8571297781808}},"1712fd1afb6b4b":{"id":"1712fd1afb6b4b","to":{"id":"1712fd1ba34154","y":1646.5,"angle":0,"x":1096.1832166369377},"text":"8、query()","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1646,"x":1010.0916083184688},{"y":1646.5,"x":1010.0916083184688}],"locked":false,"dataAttributes":[],"from":{"id":"1712bd8a8207c6","angle":3.1415926535897927,"y":1646,"x":924},"group":"","props":{"zindex":67}},"1712ba84744966":{"id":"1712ba84744966","to":{"y":335.4406024427892,"x":70.62809388922302},"text":"返回DefaultSqlSessionFactory对象","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":337.3428540910994,"x":221.18547093840345},{"y":335.4406024427892,"x":221.18547093840345}],"locked":false,"dataAttributes":[],"from":{"id":"1712b9bb236492","angle":0,"y":337.3428540910994,"x":371.7428479875836},"group":"","props":{"zindex":12}}}}},"meta":{"id":"5e81f218e4b0069b2bbd4131","member":"mashibing","exportTime":"2020-04-05 17:14:40","diagramInfo":{"category":"uml","title":"mybatis流程图","created":"2020-03-30 21:20:24","creator":"mashibing","modified":"2020-03-31 17:03:47"},"type":"ProcessOn Schema File","version":"1.0"}} \ No newline at end of file diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/misc.xml" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/misc.xml" new file mode 100644 index 00000000..05483570 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/misc.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/modules.xml" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/modules.xml" new file mode 100644 index 00000000..d5d8e7ed --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/modules.xml" @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/workspace.xml" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/workspace.xml" new file mode 100644 index 00000000..673a04d9 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/spring_study/.idea/workspace.xml" @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1581148044307 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/UserDao.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/UserDao.class" new file mode 100644 index 00000000..8640ff71 Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/UserDao.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoImpl.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoImpl.class" new file mode 100644 index 00000000..69d2436a Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoImpl.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoMysqlImpl.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoMysqlImpl.class" new file mode 100644 index 00000000..ef28b6e1 Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoMysqlImpl.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoOracleImpl.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoOracleImpl.class" new file mode 100644 index 00000000..bfda6c31 Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/dao/impl/UserDaoOracleImpl.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/service/UserService.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/service/UserService.class" new file mode 100644 index 00000000..cdc8a708 Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/service/UserService.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/service/impl/UserServiceImpl.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/service/impl/UserServiceImpl.class" new file mode 100644 index 00000000..4a8cf3bb Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/service/impl/UserServiceImpl.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/test/MyTest.class" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/test/MyTest.class" new file mode 100644 index 00000000..f021a4c1 Binary files /dev/null and "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/out/production/why_ioc/com/mashibing/test/MyTest.class" differ diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/UserDao.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/UserDao.java" new file mode 100644 index 00000000..f7224366 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/UserDao.java" @@ -0,0 +1,6 @@ +package com.mashibing.dao; + +public interface UserDao { + + public void getUser(); +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoImpl.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoImpl.java" new file mode 100644 index 00000000..05cb5b0b --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoImpl.java" @@ -0,0 +1,10 @@ +package com.mashibing.dao.impl; + +import com.mashibing.dao.UserDao; + +public class UserDaoImpl implements UserDao { + @Override + public void getUser() { + System.out.println("获取用户"); + } +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoMysqlImpl.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoMysqlImpl.java" new file mode 100644 index 00000000..5999a194 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoMysqlImpl.java" @@ -0,0 +1,10 @@ +package com.mashibing.dao.impl; + +import com.mashibing.dao.UserDao; + +public class UserDaoMysqlImpl implements UserDao { + @Override + public void getUser() { + System.out.println("从mysql获取数据"); + } +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoOracleImpl.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoOracleImpl.java" new file mode 100644 index 00000000..f419be9e --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/dao/impl/UserDaoOracleImpl.java" @@ -0,0 +1,10 @@ +package com.mashibing.dao.impl; + +import com.mashibing.dao.UserDao; + +public class UserDaoOracleImpl implements UserDao { + @Override + public void getUser() { + System.out.println("从oracle中获取数据"); + } +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/service/UserService.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/service/UserService.java" new file mode 100644 index 00000000..323e913a --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/service/UserService.java" @@ -0,0 +1,5 @@ +package com.mashibing.service; + +public interface UserService { + public void getUser(); +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/service/impl/UserServiceImpl.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/service/impl/UserServiceImpl.java" new file mode 100644 index 00000000..a9739253 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/service/impl/UserServiceImpl.java" @@ -0,0 +1,22 @@ +package com.mashibing.service.impl; + +import com.mashibing.dao.UserDao; +import com.mashibing.dao.impl.UserDaoImpl; +import com.mashibing.dao.impl.UserDaoMysqlImpl; +import com.mashibing.service.UserService; + +public class UserServiceImpl implements UserService { + +// private UserDao userDao = new UserDaoImpl(); +// private UserDao userDao = new UserDaoMysqlImpl(); + private UserDao userDao; + + public void setUserDao(UserDao userDao){ + this.userDao = userDao; + } + + @Override + public void getUser() { + userDao.getUser(); + } +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/test/MyTest.java" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/test/MyTest.java" new file mode 100644 index 00000000..138afa34 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/src/com/mashibing/test/MyTest.java" @@ -0,0 +1,20 @@ +package com.mashibing.test; + +import com.mashibing.dao.impl.UserDaoMysqlImpl; +import com.mashibing.dao.impl.UserDaoOracleImpl; +import com.mashibing.service.UserService; +import com.mashibing.service.impl.UserServiceImpl; + +public class MyTest { + public static void main(String[] args) { + UserServiceImpl userService = new UserServiceImpl(); + + UserDaoMysqlImpl userDaoMysql = new UserDaoMysqlImpl(); + userService.setUserDao(userDaoMysql); + userService.getUser(); + System.out.println("--------------"); + UserDaoOracleImpl userDaoOracle = new UserDaoOracleImpl(); + userService.setUserDao(userDaoOracle); + userService.getUser(); + } +} diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/why_ioc.iml" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/why_ioc.iml" new file mode 100644 index 00000000..c90834f2 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/code/why_ioc/why_ioc.iml" @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/01spring\345\210\235\350\257\206.md" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/01spring\345\210\235\350\257\206.md" new file mode 100644 index 00000000..3a2f35e3 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/01spring\345\210\235\350\257\206.md" @@ -0,0 +1,371 @@ +# spring初识 + +### 1、框架 + +​ 框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。JAVA框架可以分为三层:表示层,业务层和物理层。框架又叫做开发中的半成品,它不能提供整个WEB应用程序的所有东西,但是有了框架,我们就可以集中精力进行业务逻辑的开发而不用去关心它的技术实现以及一些辅助的业务逻辑。大家熟知的Structs和Spring就是表示层和业务层框架的强力代表。(说的太官方了) + +​ 人话: + +​ 框架就是某些个人或者组织定义了一系列的类或者接口,提前定义好了一些实现,用户可以在这些类和接口的基础之上,使用这些类来迅速的形成某个领域或者某个行业的解决方案,简化开发的过程,提高开发的效率。就好比:你要盖一座房子,先把柱子,房梁等先建设好,然后只需要向房子中填充就可以了,可以按照自己的需求进行设计,其实我们做的项目、系统都是类似的方式,如果所有的代码全部都需要自己实现,那么这个工程就太庞大了,所以可以先创建出一些基础的模板框架,开发人员只需要按照自己的需求向架子中填充内容,完成自己独特需求即可,这就是框架存在的意义。其实我们之前定义的简单的工具类这些东西也是类似的原理,只不过比较单一简单而已,因此,在现在的很多项目系统开发的过程中都是利用框架进行开发。 + +### 2、spring(春天) + +**架构设计** + +​ 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 + +![image](E:\lian\spring\image\dubbo-architecture-roadmap.jpg) + +​ 单一应用架构 + +​ 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 + +​ 垂直应用架构 + +​ 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。 + +​ 分布式服务架构 + +​ 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。 + +​ 流动计算架构 + +​ 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。 + +**Java主流框架演变之路** + +​ 1、JSP+Servlet+JavaBean + +​ 2、MVC三层架构 + +![mvc](E:\lian\spring\image\mvc.png) + +​ 3、使用EJB进行应用的开发,但是EJB是重量级框架(在使用的时候,过多的接口和依赖,侵入性强),在使用上比较麻烦 + +​ 4、Struts1/Struts2+Hibernate+Spring + +​ 5、SpringMVC+Mybatis+Spring + +​ 6、SpringBoot开发,约定大于配置 + +**Spring官网** + +官网地址:https://spring.io/projects/spring-framework#overview + +压缩包下载地址:https://repo.spring.io/release/org/springframework/spring/ + +源码地址:https://github.com/spring-projects/spring-framework + +```tex +Spring makes it easy to create Java enterprise applications. It provides everything you need to embrace the Java language in an enterprise environment, with support for Groovy and Kotlin as alternative languages on the JVM, and with the flexibility to create many kinds of architectures depending on an application’s needs. As of Spring Framework 5.1, Spring requires JDK 8+ (Java SE 8+) and provides out-of-the-box support for JDK 11 LTS. Java SE 8 update 60 is suggested as the minimum patch release for Java 8, but it is generally recommended to use a recent patch release. + +Spring supports a wide range of application scenarios. In a large enterprise, applications often exist for a long time and have to run on a JDK and application server whose upgrade cycle is beyond developer control. Others may run as a single jar with the server embedded, possibly in a cloud environment. Yet others may be standalone applications (such as batch or integration workloads) that do not need a server. + +Spring is open source. It has a large and active community that provides continuous feedback based on a diverse range of real-world use cases. This has helped Spring to successfully evolve over a very long time. + +Spring 使创建 Java 企业应用程序变得更加容易。它提供了在企业环境中接受 Java 语言所需的一切,,并支持 Groovy 和 Kotlin 作为 JVM 上的替代语言,并可根据应用程序的需要灵活地创建多种体系结构。 从 Spring Framework 5.0 开始,Spring 需要 JDK 8(Java SE 8+),并且已经为 JDK 9 提供了现成的支持。 + +Spring支持各种应用场景, 在大型企业中, 应用程序通常需要运行很长时间,而且必须运行在 jdk 和应用服务器上,这种场景开发人员无法控制其升级周期。 其他可能作为一个单独的jar嵌入到服务器去运行,也有可能在云环境中。还有一些可能是不需要服务器的独立应用程序(如批处理或集成的工作任务)。 + +Spring 是开源的。它拥有一个庞大而且活跃的社区,提供不同范围的,真实用户的持续反馈。这也帮助Spring不断地改进,不断发展。 +``` + +**核心解释** + +​ spring是一个开源框架。 + +​ spring是为了简化企业开发而生的,使得开发变得更加优雅和简洁。 + +​ spring是一个**IOC**和**AOP**的容器框架。 + +​ IOC:控制反转 + +​ AOP:面向切面编程 + +​ 容器:包含并管理应用对象的生命周期,就好比用桶装水一样,spring就是桶,而对象就是水 + +**使用spring的优点** + +​ 1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发 + +​ 2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL + +​ 3、低侵入式设计,代码的污染极低 + +​ 4、独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺 + +​ 5、Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦 + +​ 6、Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式处理,从而提供了更好的复用 + +​ 7、Spring的ORM和DAO提供了与第三方持久层框架的的良好整合,并简化了底层的数据库访问 + +​ 8、Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部 + +**如何简化开发** + +​ 基于POJO的轻量级和最小侵入性编程 + +​ 通过依赖注入和面向接口实现松耦合 + +​ 基于切面和惯例进行声明式编程 + +​ 通过切面和模板减少样板式代码 + +**spring的模块划分图** + +![overview](E:\lian\spring\image\spring-overview.png) + +``` +模块解释: +Test:Spring的单元测试模块 +Core Container:核心容器模块 +AOP+Aspects:面向切面编程模块 +Instrumentation:提供了class instrumentation支持和类加载器的实现来在特定的应用服务器上使用,几乎不用 +Messaging:包括一系列的用来映射消息到方法的注解,几乎不用 +Data Access/Integration:数据的获取/整合模块,包括了JDBC,ORM,OXM,JMS和事务模块 +Web:提供面向web整合特性 +``` + +### 3、IOC(Inversion of Control):控制反转 + +**为什么要引入IOC** + +创建一个普通的java项目,完成下述功能 + +UserDao.java + +```java +package com.mashibing.dao; + +public interface UserDao { + public void getUser(); +} +``` + +UserDaoImpl.java + +```java +package com.mashibing.dao.impl; + +import com.mashibing.dao.UserDao; + +public class UserDaoImpl implements UserDao { + @Override + public void getUser() { + System.out.println("获取用户数据"); + } +} +``` + +UserService.java + +```java +package com.mashibing.service; + +public interface UserService { + public void getUser(); +} + +``` + +UserServiceImpl.java + +```java +package com.mashibing.service.impl; + +import com.mashibing.dao.UserDao; +import com.mashibing.dao.impl.UserDaoImpl; +import com.mashibing.dao.impl.UserDaoMysqlImpl; +import com.mashibing.service.UserService; + +public class UserServiceImpl implements UserService { + + private UserDao userDao = new UserDaoImpl(); + + @Override + public void getUser() { + userDao.getUser(); + } +} + +``` + +SpringDemoTest.java + +```java +package com.mashibing.test; + +import com.mashibing.service.UserService; +import com.mashibing.service.impl.UserServiceImpl; + +public class SpringDemoTest { + public static void main(String[] args) { + UserService service = new UserServiceImpl(); + service.getUser(); + } +} + +``` + +在之前的代码编写过程中,我们都是这么完成我们的功能的,但是如果增加一个UserDao的实现类呢? + +UserDaoMysqlImpl.java + +```java +package com.mashibing.dao.impl; + +import com.mashibing.dao.UserDao; + +public class UserDaoMysqlImpl implements UserDao { + @Override + public void getUser() { + System.out.println("mysql"); + } +} +``` + +如果我们想要使用mysql的话,那么就必须要修改UserServiceImpl.java的代码: + +```java +package com.mashibing.service.impl; + +import com.mashibing.dao.UserDao; +import com.mashibing.dao.impl.UserDaoImpl; +import com.mashibing.dao.impl.UserDaoMysqlImpl; +import com.mashibing.service.UserService; + +public class UserServiceImpl implements UserService { + + private UserDao userDao = new UserDaoImpl(); + + @Override + public void getUser() { + userDao.getUser(); + } +} + +``` + +但是如果我们再增加一个oracle的类呢? + +UserDaoOracleImpl.java + +```java +package com.mashibing.dao.impl; + +import com.mashibing.dao.UserDao; + +public class UserDaoOracleImpl implements UserDao { + @Override + public void getUser() { + System.out.println("oracle"); + } +} +``` + +此时UserService还是要继续修改,很显然这样的方式已经不适用于我们的需求了,那么怎么解决呢,可以使用如下的方式 + +UserServiceImpl.java + +```java +package com.mashibing.service.impl; + +import com.mashibing.dao.UserDao; +import com.mashibing.dao.impl.UserDaoImpl; +import com.mashibing.service.UserService; + +public class UserServiceImpl implements UserService { + private UserDao userDao; + + public void setUserDao(UserDao userDao){ + this.userDao = userDao; + } + @Override + public void getUser() { + userDao.getUser(); + } +} + +``` + +测试类SpringDemoTest.java + +```java +package com.mashibing.test; + +import com.mashibing.dao.impl.UserDaoMysqlImpl; +import com.mashibing.dao.impl.UserDaoOracleImpl; +import com.mashibing.service.UserService; +import com.mashibing.service.impl.UserServiceImpl; + +public class SpringDemoTest { + public static void main(String[] args) { + UserServiceImpl userService = new UserServiceImpl(); + userService.setUserDao(new UserDaoMysqlImpl()); + userService.getUser(); + + userService.setUserDao(new UserDaoOracleImpl()); + userService.getUser(); + } +} +``` + +其实从刚刚的代码中,大家应该能体会解耦的重要性了,下面我们就开始学习Spring的IOC。 + +**IOC初始** + +​ 想要搞明白IOC,那么需要搞清楚如下几个问题: + +``` +1、谁控制谁 +2、控制什么 +3、什么是反转 +4、哪些方面被反转 +``` + +**基本概念** + +``` + IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean. This process is fundamentally the inverse (hence the name, Inversion of Control) of the bean itself controlling the instantiation or location of its dependencies by using direct construction of classes or a mechanism such as the Service Locator pattern. + IOC与大家熟知的依赖注入同理,. 这是一个通过依赖注入对象的过程 也就是说,它们所使用的对象,是通过构造函数参数,工厂方法的参数或这是从工厂方法的构造函数或返回值的对象实例设置的属性,然后容器在创建bean时注入这些需要的依赖。 这个过程相对普通创建对象的过程是反向的(因此称之为IoC),bean本身通过直接构造类来控制依赖关系的实例化或位置,或提供诸如服务定位器模式之类的机制。 +``` + +如果这个过程比较难理解的话,那么可以想象自己找女朋友和婚介公司找女朋友的过程。如果这个过程能够想明白的话,那么我们现在回答上面的问题: + +``` +1、谁控制谁:在之前的编码过程中,都是需要什么对象自己去创建什么对象,有程序员自己来控制对象,而有了IOC容器之后,就会变成由IOC容器来控制对象, +2、控制什么:在实现过程中所需要的对象及需要依赖的对象 +3、什么是反转:在没有IOC容器之前我们都是在对象中主动去创建依赖的对象,这是正转的,而有了IOC之后,依赖的对象直接由IOC容器创建后注入到对象中,由主动创建变成了被动接受,这是反转 +4、哪些方面被反转:依赖的对象 +``` + +**DI与IOC** + +``` +很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够严谨一点,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也可以这样说,IOC是设计思想,而DI是具体的实现方式 +``` + +### 4、总结 + +​ 在此处总结中,希望大家能够能够明白两件事: + +​ **1、解耦** + +​ 在面向对象设计的软件系统中,底层的实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 + +![](E:\lian\spring\image\耦合对象.jpg) + +​ 需要注意的是,在这样的组合关系中,一旦某一个对象出现了问题,那么其他对象肯定回有所影响,这就是耦合性太高的缘故,但是对象的耦合关系是无法避免的,也是必要的。随着应用程序越来越庞大,对象的耦合关系可能越来越复杂,经常需要多重依赖关系,因此,无论是架构师还是程序员,在面临这样的场景的时候,都需要减少这些对象的耦合性。 + +![](E:\lian\spring\image\2011052709390013.jpg) + +​ 耦合的关系不仅仅是对象与对象之间,也会出现在软件系统的各个模块之间,是我们需要重点解决的问题。而为了解决对象之间的耦合度过高的问题,我们就可以通过IOC来实现对象之间的解耦,spring框架就是IOC理论最最广泛的应用。 + +![](E:\lian\spring\image\ioc.jpg) + +​ 从上图中可以看到,当引入了第三方的容器之后,几个对象之间就没有了耦合关系,全部对象都交由容器来控制,这个容器就相当于粘合剂,将系统的对象粘合在一起发挥作用。 + +​ **2、生态** + +​ 任何一个语言或者任何一个框架想要立于不败之地,那么很重要的就是它的生态。 \ No newline at end of file diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/02spring IOC\345\237\272\346\234\254\344\275\277\347\224\250.md" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/02spring IOC\345\237\272\346\234\254\344\275\277\347\224\250.md" new file mode 100644 index 00000000..51138235 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/02spring IOC\345\237\272\346\234\254\344\275\277\347\224\250.md" @@ -0,0 +1,1207 @@ +# 02spring IOC基本使用 + +​ 通过前面的介绍我们已经知道了Spring中非常重要的一个特性就是IOC,下面我们将要来看一下如何使用IOC容器,帮助大家更好的体会spring的优势。 + +### 1、spring_helloworld + +##### **(1)使用手动加载jar包的方式实现,分为三个步骤,现在几乎不用** + +- **导包:导入这五个包即可** + + commons-logging-1.2.jar + spring-beans-5.2.3.RELEASE.jar + spring-context-5.2.3.RELEASE.jar + spring-core-5.2.3.RELEASE.jar + spring-expression-5.2.3.RELEASE.jar + +- **写配置** + + Person.java + + ```java + package com.mashibing.bean; + + public class Person { + private int id; + private String name; + private int age; + private String gender; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } + } + + ``` + + ioc.xml + + ```xml + + + + + + + + + + + + + + ``` + +- **测试** + +SpringDemoTest.java + +```java +package com.mashibing.test; + +import com.mashibing.bean.Person; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class SpringDemoTest { + public static void main(String[] args) { + //ApplicationContext:表示ioc容器 + //ClassPathXmlApplicationContext:表示从当前classpath路径中获取xml文件的配置 + //根据spring的配置文件来获取ioc容器对象 + ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); + Person person = (Person) context.getBean("person"); + System.out.println(person); + } +} +``` + +##### **(2)使用maven的方式来构建项目** + +- **创建maven项目** + + 定义项目的groupId、artifactId + +- **添加对应的pom依赖** + + pom.xml + + ```xml + + + 4.0.0 + + com.mashibing + spring_demo + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + ``` + +- **编写代码** + + Person.java + + ```java + package com.mashibing.bean; + public class Person { + private int id; + private String name; + private int age; + private String gender; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } + } + ``` + +- **测试** + + MyTest.java + +```java +import com.mashibing.bean.Person; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); + Person person = (Person) context.getBean("person"); + System.out.println(person); + } +} +``` + +**总结:** + +​ 以上两种方式创建spring的项目都是可以的,但是在现在的企业开发环境中使用更多的还是maven这样的方式,无须自己处理jar之间的依赖关系,也无须提前下载jar包,只需要配置相关的pom即可,因此推荐大家使用maven的方式,具体的maven操作大家可以看maven的详细操作文档。 + +​ **搭建spring项目需要注意的点:** + +​ 1、一定要将配置文件添加到类路径中,使用idea创建项目的时候要放在resource目录下 + +​ 2、导包的时候别忘了commons-logging-1.2.jar包 + +​ **细节点:** + +​ 1、ApplicationContext就是IOC容器的接口,可以通过此对象获取容器中创建的对象 + +​ 2、对象在Spring容器创建完成的时候就已经创建完成,不是需要用的时候才创建 + +​ 3、对象在IOC容器中存储的时候都是单例的,如果需要多例需要修改属性 + +​ 4、创建对象给属性赋值的时候是通过setter方法实现的 + +​ 5、对象的属性是由setter/getter方法决定的,而不是定义的成员属性 + +### 2、spring对象的获取及属性赋值方式 + +##### **1、通过bean的id获取IOC容器中的对象(上面已经用过)** + +##### **2、通过bean的类型获取对象** + +​ MyTest.java + +```java +import com.mashibing.bean.Person; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); + Person bean = context.getBean(Person.class); + System.out.println(bean); + } +} +``` + +注意:通过bean的类型在查找对象的时候,在配置文件中不能存在两个类型一致的bean对象,如果有的话,可以通过如下方法 + +MyTest.java + +```java +import com.mashibing.bean.Person; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); + Person person = context.getBean("person", Person.class); + System.out.println(person); + } +} +``` + +##### **3、通过构造器给bean对象赋值** + +ioc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + 将person的age类型设置为Integer类型 + public Person(int id, String name, Integer age) { + this.id = id; + this.name = name; + this.age = age; + System.out.println("Age"); + } + + public Person(int id, String name, String gender) { + this.id = id; + this.name = name; + this.gender = gender; + System.out.println("gender"); + } + + + + + + + + + + + +``` + +##### **4、通过命名空间为bean赋值,简化配置文件中属性声明的写法** + +​ 1、导入命名空间 + +```xml + + + +``` + +​ 2、添加配置 + +```xml + +``` + +##### **5、为复杂类型进行赋值操作** + +​ 在之前的测试代码中,我们都是给最基本的属性进行赋值操作,在正常的企业级开发中还会遇到给各种复杂类型赋值,如集合、数组、其他对象等。 + +​ Person.java + +```java +package com.mashibing.bean; + +import java.util.*; + +public class Person { + private int id; + private String name="dahuang"; + private int age; + private String gender; + private Address address; + private String[] hobbies; + private List books; + private Set sets; + private Map maps; + private Properties properties; + + public Person(int id, String name, int age, String gender) { + this.id = id; + this.name = name; + this.age = age; + this.gender = gender; + System.out.println("有参构造器"); + } + + public Person(int id, String name, int age) { + this.id = id; + this.name = name; + this.age = age; + System.out.println("Age"); + } + + public Person(int id, String name, String gender) { + this.id = id; + this.name = name; + this.gender = gender; + System.out.println("gender"); + } + + public Person() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } + + public Map getMaps() { + return maps; + } + + public void setMaps(Map maps) { + this.maps = maps; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + + public String[] getHobbies() { + return hobbies; + } + + public void setHobbies(String[] hobbies) { + this.hobbies = hobbies; + } + + public Set getSets() { + return sets; + } + + public void setSets(Set sets) { + this.sets = sets; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", address=" + address + + ", hobbies=" + Arrays.toString(hobbies) + + ", books=" + books + + ", sets=" + sets + + ", maps=" + maps + + ", properties=" + properties + + '}'; + } +} + + +``` + +Book.java + +```java +package com.mashibing.bean; + +public class Book { + private String name; + private String author; + private double price; + + public Book() { + } + + public Book(String name, String author, double price) { + this.name = name; + this.author = author; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + @Override + public String toString() { + return "Book{" + + "name='" + name + '\'' + + ", author='" + author + '\'' + + ", price=" + price + + '}'; + } +} + +``` + +Address.java + +```java +package com.mashibing.bean; + +public class Address { + private String province; + private String city; + private String town; + + public Address() { + } + + public Address(String province, String city, String town) { + this.province = province; + this.city = city; + this.town = town; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTown() { + return town; + } + + public void setTown(String town) { + this.town = town; + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", town='" + town + '\'' + + '}'; + } +} +``` + +ioc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + aaa + 222 + + + + + + book + movie + game + + + + + + 111 + 222 + 222 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +##### 6、继承关系bean的配置 + +ioc.xml + +```xml + + + + + + + + + + +``` + +如果想实现Java文件的抽象类,不需要将当前bean实例化的话,可以使用abstract属性 + +```xml + + + + + + + + + + +``` + +##### 7、bean对象创建的依赖关系 + +​ bean对象在创建的时候是按照bean在配置文件的顺序决定的,也可以使用depend-on标签来决定顺序 + +ioc.xml + +```xml + + + +``` + +##### 8、bean的作用域控制,是否是单例 + +ioc.xml + +```xml + + +``` + +##### 9、利用工厂模式创建bean对象 + +​ 在之前的案例中,所有bean对象的创建都是通过反射得到对应的bean实例,其实在spring中还包含另外一种创建bean实例的方式,就是通过工厂模式进行对象的创建 + +​ 在利用工厂模式创建bean实例的时候有两种方式,分别是静态工厂和实例工厂。 + +​ 静态工厂:工厂本身不需要创建对象,但是可以通过静态方法调用,对象=工厂类.静态工厂方法名(); + +​ 实例工厂:工厂本身需要创建对象,工厂类 工厂对象=new 工厂类;工厂对象.get对象名(); + +PersonStaticFactory.java + +```java +package com.mashibing.factory; + +import com.mashibing.bean.Person; + +public class PersonStaticFactory { + + public static Person getPerson(String name){ + Person person = new Person(); + person.setId(1); + person.setName(name); + return person; + } +} +``` + +ioc.xml + +```xml + + + + + +``` + +PersonInstanceFactory.java + +```java +package com.mashibing.factory; + +import com.mashibing.bean.Person; + +public class PersonInstanceFactory { + public Person getPerson(String name){ + Person person = new Person(); + person.setId(1); + person.setName(name); + return person; + } +} + +``` + +ioc.xml + +```xml + + + + + + + +``` + +##### 10、继承FactoryBean来创建对象 + +​ FactoryBean是Spring规定的一个接口,当前接口的实现类,Spring都会将其作为一个工厂,但是在ioc容器启动的时候不会创建实例,只有在使用的时候才会创建对象 + +MyFactoryBean.java + +```java +package com.mashibing.factory; + +import com.mashibing.bean.Person; +import org.springframework.beans.factory.FactoryBean; + +/** + * 实现了FactoryBean接口的类是Spring中可以识别的工厂类,spring会自动调用工厂方法创建实例 + */ +public class MyFactoryBean implements FactoryBean { + + /** + * 工厂方法,返回需要创建的对象 + * @return + * @throws Exception + */ + @Override + public Person getObject() throws Exception { + Person person = new Person(); + person.setName("maliu"); + return person; + } + + /** + * 返回创建对象的类型,spring会自动调用该方法返回对象的类型 + * @return + */ + @Override + public Class getObjectType() { + return Person.class; + } + + /** + * 创建的对象是否是单例对象 + * @return + */ + @Override + public boolean isSingleton() { + return false; + } +} +``` + +ioc.xml + +```xml + +``` + +##### 11、bean对象的初始化和销毁方法 + +​ 在创建对象的时候,我们可以根据需要调用初始化和销毁的方法 + +Address.java + +```java +package com.mashibing.bean; + +public class Address { + private String province; + private String city; + private String town; + + public Address() { + System.out.println("address被创建了"); + } + + public Address(String province, String city, String town) { + this.province = province; + this.city = city; + this.town = town; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTown() { + return town; + } + + public void setTown(String town) { + this.town = town; + } + + public void init(){ + System.out.println("对象被初始化"); + } + + public void destory(){ + System.out.println("对象被销毁"); + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", town='" + town + '\'' + + '}'; + } +} +``` + +ioc.xml + +```xml + + +``` + +MyTest.java + +```java +import com.mashibing.bean.Address; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc2.xml"); + Address address = context.getBean("address", Address.class); + System.out.println(address); + //applicationContext没有close方法,需要使用具体的子类 + ((ClassPathXmlApplicationContext)context).close(); + + } +} +``` + +##### 12、配置bean对象初始化方法的前后处理方法 + +​ spring中包含一个BeanPostProcessor的接口,可以在bean的初始化方法的前后调用该方法,如果配置了初始化方法的前置和后置处理器,无论是否包含初始化方法,都会进行调用 + +MyBeanPostProcessor.java + +```java +package com.mashibing.bean; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +public class MyBeanPostProcessor implements BeanPostProcessor { + /** + * 在初始化方法调用之前执行 + * @param bean 初始化的bean对象 + * @param beanName xml配置文件中的bean的id属性 + * @return + * @throws BeansException + */ + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + System.out.println("postProcessBeforeInitialization:"+beanName+"调用初始化前置方法"); + return bean; + } + + /** + * 在初始化方法调用之后执行 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + System.out.println("postProcessAfterInitialization:"+beanName+"调用初始化后缀方法"); + return bean; + } +} +``` + +ioc.xml + +```xml + +``` + +### 3、spring创建第三方bean对象 + +​ 在Spring中,很多对象都是单实例的,在日常的开发中,我们经常需要使用某些外部的单实例对象,例如数据库连接池,下面我们来讲解下如何在spring中创建第三方bean实例。 + +​ 1、导入数据库连接池的pom文件 + +```xml + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.47 + +``` + +​ 2、编写配置文件 + +ioc.xml + +```xml + + + + + + + + + + +``` + +​ 3、编写测试文件 + +MyTest.java + +```java +import com.alibaba.druid.pool.DruidDataSource; +import com.mashibing.bean.Address; +import com.mashibing.bean.Person; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc3.xml"); + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource); + System.out.println(dataSource.getConnection()); + } +} +``` + +### 4、spring引用外部配置文件 + +在resource中添加dbconfig.properties + +```properties +username=root +password=123456 +url=jdbc:mysql://localhost:3306/demo +driverClassName=com.mysql.jdbc.Driver +``` + +编写配置文件 + +```xml + + + + + + + + + + + +``` + +### 5、spring基于xml文件的自动装配 + +​ 当一个对象中需要引用另外一个对象的时候,在之前的配置中我们都是通过property标签来进行手动配置的,其实在spring中还提供了一个非常强大的功能就是自动装配,可以按照我们指定的规则进行配置,配置的方式有以下几种: + +​ default/no:不自动装配 + +​ byName:按照名字进行装配,以属性名作为id去容器中查找组件,进行赋值,如果找不到则装配null + +​ byType:按照类型进行装配,以属性的类型作为查找依据去容器中找到这个组件,如果有多个类型相同的bean对象,那么会报异常,如果找不到则装配null + +​ constructor:按照构造器进行装配,先按照有参构造器参数的类型进行装配,没有就直接装配null;如果按照类型找到了多个,那么就使用参数名作为id继续匹配,找到就装配,找不到就装配null + +ioc.xml + +```xml + + + + + + + + + + + + +``` + +### 6、SpEL的使用 + +​ SpEL:Spring Expression Language,spring的表达式语言,支持运行时查询操作对象 + +​ 使用#{...}作为语法规则,所有的大括号中的字符都认为是SpEL. + +ioc.xml + +```xml + + + + + + + + + + + + +``` + diff --git "a/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/maven\347\232\204\344\273\213\347\273\215\344\270\216\344\275\277\347\224\250.md" "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/maven\347\232\204\344\273\213\347\273\215\344\270\216\344\275\277\347\224\250.md" new file mode 100644 index 00000000..f329eca6 --- /dev/null +++ "b/javaframework/spring/01spring\346\241\206\346\236\266\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/note/maven\347\232\204\344\273\213\347\273\215\344\270\216\344\275\277\347\224\250.md" @@ -0,0 +1,74 @@ +# maven的介绍与使用 + +### 1、maven的简单介绍 + +​ Maven是Apache下的项目管理工具,它由纯Java语言开发,可以帮助我们更方便的管理和构建Java项目。 + +​ maven的优点 + +​ 1、 jar包管理: + +​ a) 从Maven中央仓库获取标准的规范的jar包以及相关依赖的jar包,避免自己下载到错误的jar包; + +​ b) 本地仓库统一管理jar包,使jar包与项目分离,减轻项目体积。 + +​ 2、 maven是跨平台的可以在window、linux上使用。 + +​ 3、 清晰的项目结构; + +​ 4、 多工程开发,将模块拆分成若干工程,利于团队协作开发。 + +​ 5、 一键构建项目:使用命令可以对项目进行一键构建。 + +### 2、maven的安装 + +​ maven官网:https://maven.apache.org/ + +​ maven仓库:https://mvnrepository.com/ + +​ 安装步骤: + +``` +1、安装jdk +2、从官网中下载对应的版本 +3、解压安装,然后配置环境变量,需要配置MAVEN_HOME,并且将bin目录添加到path路径下 +4、在命令行中输入mvn -v,看到版本信息表示安装成功 +``` + +### 3、maven的基本常识 + +**maven如何获取jar包** + +​ maven通过坐标的方式来获取 jar包,坐标组成为:公司/组织(groupId)+项目名(artifactId)+版本(version)组成,可以从互联网,本地等多种仓库源获取jar包 + +**maven仓库的分类** + +​ 本地仓库:本地仓库就是开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库,本地仓库路径配置在maven对应的conf/settings.xml配置文件。 + +​ 私有仓库:私有仓库可以理解为自己公司的仓库,也叫Nexus私服 + +​ 中央仓库:中央仓库即maven默认下载的仓库地址,是maven维护的 + +**maven的常用仓库** + +​ 由于网络访问的原因,在国内如果需要下载国外jar包的时候会受限,因此一般在使用过程中需要修改maven的配置文件,将下载jar包的仓库地址修改为国内的源,常用的是阿里云的mvn仓库,修改配置如下: + +```xml + +alimaven +aliyun maven +http://maven.aliyun.com/nexus/content/groups/public/ +central + +``` + +### 4、maven常用命令 + +- clean:清理编译后的目录 +- compile:编译,只编译main目录,不编译test中的代码 +- test-compile:编译test目录下的代码 +- test:运行test中的代码 +- package:打包,将项目打包成jar包或者war包 +- install:发布项目到本地仓库,用在打jar包上,打成的jar包可以被其他项目使用 +- deploy:打包后将其安装到pom文件中配置的远程仓库 +- site:生成站点目录 \ No newline at end of file diff --git "a/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/compiler.xml" "b/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/compiler.xml" new file mode 100644 index 00000000..ac4f8e29 --- /dev/null +++ "b/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/compiler.xml" @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/misc.xml" "b/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/workspace.xml" "b/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/workspace.xml" new file mode 100644 index 00000000..7275f5d6 --- /dev/null +++ "b/javaframework/spring/02springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2501/spring_study2/.idea/workspace.xml" @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1581163448511 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JAVA + org.springframework.context.ApplicationContext + + java.lang.FunctionalInterface + org.springframework.beans.factory.HierarchicalBeanFactory + org.springframework.core.io.ResourceLoader + org.springframework.core.env.EnvironmentCapable + org.springframework.beans.factory.BeanFactory + org.springframework.context.ApplicationEventPublisher + org.springframework.core.io.support.ResourcePatternResolver + org.springframework.beans.factory.ListableBeanFactory + org.springframework.context.MessageSource + + + + + + + All + private + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + spring_study2 + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/pom.xml" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/pom.xml" new file mode 100644 index 00000000..2ebc5cfa --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/pom.xml" @@ -0,0 +1,34 @@ + + + 4.0.0 + + com.mashibing + spring_study + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.48 + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/spring_study2.iml" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/spring_study2.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/spring_study2.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/Address.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/Address.java" new file mode 100644 index 00000000..a3afb4f8 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/Address.java" @@ -0,0 +1,44 @@ +package com.mashibing.bean; + +public class Address { + private String province; + private String city; + private String town; + + public Address() { + System.out.println("address被创建"); + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTown() { + return town; + } + + public void setTown(String town) { + this.town = town; + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", town='" + town + '\'' + + '}'; + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/MyBeanPostProcessor.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/MyBeanPostProcessor.java" new file mode 100644 index 00000000..a4d21dcf --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/MyBeanPostProcessor.java" @@ -0,0 +1,30 @@ +package com.mashibing.bean; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +public class MyBeanPostProcessor implements BeanPostProcessor { + /** + * 在每一个对象的初始化方法前面执行 + * @param bean 表示创建的具体对象 + * @param beanName 表示bean的id属性 + * @return + * @throws BeansException + */ + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + System.out.println("postProcessBeforeInitialization:"+beanName); + return bean; + } + + /** + * 在每一个对象的初始化方法后面执行 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + System.out.println("postProcessAfterInitialization:"+beanName); + return bean; + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/Person.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/Person.java" new file mode 100644 index 00000000..20bae48e --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/bean/Person.java" @@ -0,0 +1,157 @@ +package com.mashibing.bean; + +import java.util.*; + +public class Person { + private int id; + private String name; + private Integer age; + private String gender; + private String[] hobbies; + private Address address; + + private List
lists; + private Set sets; + private Map maps; +// private Properties properties; + + public Person() { + System.out.println("person被创建"); + } + + public Person(Address address) { + this.address = address; + } + + public Person(int id, String name, Address address) { + this.id = id; + this.name = name; + this.address = address; + } + + public Person(int id, String name, Integer age, String gender) { + this.id = id; + this.name = name; + this.age = age; + this.gender = gender; + } + + + public Person(int id, String name, Integer age) { + this.id = id; + this.name = name; + this.age = age; + System.out.println("age......"); + } + public Person(int id, String name, String gender) { + this.id = id; + this.name = name; + this.gender = gender; + System.out.println("gender....."); + } + + public void init(){ + //编写N行逻辑代码完成初始化功能 + System.out.println("person对象初始化完成"); + } + + public void destory(){ + System.out.println("person对象被销毁"); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String[] getHobbies() { + return hobbies; + } + + public void setHobbies(String[] hobbies) { + this.hobbies = hobbies; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address aaddress) { + this.address = aaddress; + } + + public List
getLists() { + return lists; + } + + public void setLists(List
lists) { + this.lists = lists; + } + + public Set getSets() { + return sets; + } + + public void setSets(Set sets) { + this.sets = sets; + } + + public Map getMaps() { + return maps; + } + + public void setMaps(Map maps) { + this.maps = maps; + } + +// public Properties getProperties() { +// return properties; +// } +// +// public void setProperties(Properties properties) { +// this.properties = properties; +// } + + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", hobbies=" + Arrays.toString(hobbies) + + ", address=" + address + + ", lists=" + lists + + ", sets=" + sets + + ", maps=" + maps + + '}'; + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/MyFactoryBean.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/MyFactoryBean.java" new file mode 100644 index 00000000..39cccc04 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/MyFactoryBean.java" @@ -0,0 +1,31 @@ +package com.mashibing.factory; + +import com.mashibing.bean.Person; +import org.springframework.beans.factory.FactoryBean; + +/** + * 此方式是spring创建bean方式的一种补充,用户可以按照需求创建对象, + * 创建的对象交由spring IOC容器来进行管理,无论是否是单例,都是在 + * 用到的时候才会创建该对象,不用该对象不会创建 + */ +public class MyFactoryBean implements FactoryBean { + /* + * 返回获取的bean + * */ + public Person getObject() throws Exception { + Person person = new Person(); + person.setId(3); + person.setName("王五"); + return person; + } + + //获取返回bean的类型 + public Class getObjectType() { + return Person.class; + } + + //判断当前bean是否是单例的 + public boolean isSingleton() { + return true; + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/PersonInstanceFactory.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/PersonInstanceFactory.java" new file mode 100644 index 00000000..054fa19c --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/PersonInstanceFactory.java" @@ -0,0 +1,17 @@ +package com.mashibing.factory; + +import com.mashibing.bean.Person; + +/** + * 实例工厂 + */ +public class PersonInstanceFactory { + + public Person getInstance(String name){ + Person person = new Person(); + person.setId(2); + person.setName(name); + person.setAge(22); + return person; + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/PersonStaticFactory.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/PersonStaticFactory.java" new file mode 100644 index 00000000..f890bb07 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/java/com/mashibing/factory/PersonStaticFactory.java" @@ -0,0 +1,17 @@ +package com.mashibing.factory; + +import com.mashibing.bean.Person; + +/** + * 静态工厂类 + */ +public class PersonStaticFactory { + + public static Person getInstance(String name){ + Person person = new Person(); + person.setId(1); + person.setName(name); + person.setAge(11); + return person; + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/resources/db.properties" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/resources/db.properties" new file mode 100644 index 00000000..26316991 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root123 +jdbc.password=123456 +url=jdbc:mysql://localhost:3306/demo +driverClassName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/resources/ioc.xml" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/resources/ioc.xml" new file mode 100644 index 00000000..3dbcba65 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/main/resources/ioc.xml" @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/test/java/MyTest.java" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/test/java/MyTest.java" new file mode 100644 index 00000000..1205c46b --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/src/test/java/MyTest.java" @@ -0,0 +1,71 @@ +import com.alibaba.druid.pool.DruidDataSource; +import com.mashibing.bean.Address; +import com.mashibing.bean.Person; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); + /*根据bean标签的id来获取对象*/ +// Person person = context.getBean("person", Person.class); +// Person person2 = context.getBean("person",Person.class); +// System.out.println(person == person2); + + /*根据bean的类型来获取对象 + * 注意:当通过类型进行获取的时候,如果存在两个相同类型对象,将无法完成获取工作 + * */ +// Person bean = context.getBean(Person.class); +// System.out.println(bean); + + /** + * 当需要从容器中获取对象的时候,最好要保留无参构造方法,因为底层的实现是反射 + * + * Class clazz = Person.class; + * Object obj = clazz.newInstance();默认调用无参的构造方法,此方法已经被弃用 + * Object obj = class.getDeclaredConstructor().newInstance() + * + */ + +// Person person2 = context.getBean("person", Person.class); +// System.out.println(person2); +// +// Person person5 = context.getBean("person5", Person.class); +// System.out.println(person5); + +// Person person6 = context.getBean("person6", Person.class); +// System.out.println(person6); +// Address address2 = context.getBean("address2", Address.class); +// System.out.println(address2); + +// Person son = context.getBean("son", Person.class); +// System.out.println(son); +// Person parent = context.getBean("parent", Person.class); +// System.out.println(parent); + +// Person person2 = context.getBean("person2", Person.class); +// Person person3 = context.getBean("person2",Person.class); +// System.out.println(person2 == person3); + +// Person person = context.getBean("person", Person.class); +// System.out.println(person); +// Person person2 = context.getBean("person2", Person.class); +// System.out.println(person2); + +// Person myFactoryBean = context.getBean("myFactoryBean", Person.class); +// System.out.println(myFactoryBean); + +// Person person = context.getBean("person", Person.class); +// System.out.println(person); +// ((ClassPathXmlApplicationContext)context).close(); + +// DruidDataSource dataSource = context.getBean("dataSource2", DruidDataSource.class); +// System.out.println(dataSource); +// System.out.println(dataSource.getConnection()); + + Person person = context.getBean("person2", Person.class); + System.out.println(person); + } +} diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/Address.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/Address.class" new file mode 100644 index 00000000..4b37d3f6 Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/Address.class" differ diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/MyBeanPostProcessor.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/MyBeanPostProcessor.class" new file mode 100644 index 00000000..28888b59 Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/MyBeanPostProcessor.class" differ diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/Person.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/Person.class" new file mode 100644 index 00000000..a5e7b8f9 Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/bean/Person.class" differ diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/MyFactoryBean.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/MyFactoryBean.class" new file mode 100644 index 00000000..276a5adf Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/MyFactoryBean.class" differ diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/PersonInstanceFactory.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/PersonInstanceFactory.class" new file mode 100644 index 00000000..e170a6b2 Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/PersonInstanceFactory.class" differ diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/PersonStaticFactory.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/PersonStaticFactory.class" new file mode 100644 index 00000000..f969801c Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/com/mashibing/factory/PersonStaticFactory.class" differ diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/db.properties" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/db.properties" new file mode 100644 index 00000000..26316991 --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root123 +jdbc.password=123456 +url=jdbc:mysql://localhost:3306/demo +driverClassName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/ioc.xml" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/ioc.xml" new file mode 100644 index 00000000..1d347d2e --- /dev/null +++ "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/classes/ioc.xml" @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/test-classes/MyTest.class" "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/test-classes/MyTest.class" new file mode 100644 index 00000000..402f6ee6 Binary files /dev/null and "b/javaframework/spring/03springIOC\345\256\271\345\231\250\347\232\204\351\205\215\347\275\256\344\275\277\347\224\2502/spring_study2/target/test-classes/MyTest.class" differ diff --git "a/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/compiler.xml" "b/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/compiler.xml" new file mode 100644 index 00000000..5dcc9026 --- /dev/null +++ "b/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/compiler.xml" @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/misc.xml" "b/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/workspace.xml" "b/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/workspace.xml" new file mode 100644 index 00000000..269e66b6 --- /dev/null +++ "b/javaframework/spring/04SpringIOC\347\232\204\346\263\250\350\247\243\344\275\277\347\224\250/code/spring_annotation_study/.idea/workspace.xml" @@ -0,0 +1,787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1581768338458 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + spring_aop_study + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/pom.xml" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/pom.xml" new file mode 100644 index 00000000..d9b23714 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/pom.xml" @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.mashibing + spring_aop_study + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + \ No newline at end of file diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/spring_aop_study.iml" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/spring_aop_study.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/spring_aop_study.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/myinter/MyInterface.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/myinter/MyInterface.java" new file mode 100644 index 00000000..f39d68d2 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/myinter/MyInterface.java" @@ -0,0 +1,6 @@ +package com.mashibing.myinter; + +public interface MyInterface { + + public void show(Integer i); +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/myinter/MySubClass.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/myinter/MySubClass.java" new file mode 100644 index 00000000..9a327f40 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/myinter/MySubClass.java" @@ -0,0 +1,7 @@ +package com.mashibing.myinter; + +public class MySubClass implements MyInterface { + public void show(Integer i) { + System.out.println("show......."); + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/proxy/CalculatorProxy.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/proxy/CalculatorProxy.java" new file mode 100644 index 00000000..7bb85f95 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/proxy/CalculatorProxy.java" @@ -0,0 +1,52 @@ +package com.mashibing.proxy; + +import com.mashibing.service.Calculator; +import com.mashibing.util.LogUtil; +import sun.rmi.runtime.Log; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; + +/** + * 必须要有接口,如果没有接口,不能使用,这种方式是用jdk提供的reflect包下的类 + * 但是在生产环境中我不能保证每个类都有实现的接口,所有有第二种方式cglib + * + * cglib在实现的时候有没有接口都无所谓 + * + * 在spring中使用了两种动态代理的方式,一种是jdk提供的(刚刚完成的)另外一种就是cglib + */ +public class CalculatorProxy { + + public static Calculator getProxy( final Calculator calculator){ + + //获取被代理对象的类加载器 + ClassLoader loader = calculator.getClass().getClassLoader(); + //被代理对象的所有接口 + Class[] interfaces = calculator.getClass().getInterfaces(); + //用来执行被代理类需要执行的方法 + InvocationHandler handler = new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object result = null; + try{ +// System.out.println(method.getName()+"方法开始执行,参数列表是:"+ Arrays.asList(args)); +// LogUtil.start(method,args); + //开始调用被代理类的方法 + result = method.invoke(calculator,args); +// System.out.println(method.getName()+"方法执行完成,结果是:"+result); +// LogUtil.stop(method,result); + }catch (Exception e){ +// System.out.println(method.getName()+"方法抛出异常:"+e.getMessage()); +// LogUtil.logException(method,e); + }finally { +// System.out.println(method.getName()+"方法执行结束。。。。。over"); +// LogUtil.logFinally(method); + } + return result; + } + }; + Object o = Proxy.newProxyInstance(loader, interfaces, handler); + return (Calculator) o; + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/proxy/DynamicProxy.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/proxy/DynamicProxy.java" new file mode 100644 index 00000000..9c4ad1a5 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/proxy/DynamicProxy.java" @@ -0,0 +1,10 @@ +package com.mashibing.proxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class DynamicProxy implements InvocationHandler { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return null; + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/Calculator.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/Calculator.java" new file mode 100644 index 00000000..2242eed4 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/Calculator.java" @@ -0,0 +1,12 @@ +package com.mashibing.service; + +import org.springframework.stereotype.Service; + + +public interface Calculator { + + public Integer add(Integer i,Integer j) throws NoSuchMethodException; + public Integer sub(Integer i,Integer j) throws NoSuchMethodException; + public Integer mul(Integer i,Integer j) throws NoSuchMethodException; + public Integer div(Integer i,Integer j) throws NoSuchMethodException; +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/MyCalculator.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/MyCalculator.java" new file mode 100644 index 00000000..de953f01 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/MyCalculator.java" @@ -0,0 +1,38 @@ +package com.mashibing.service; + +import org.springframework.stereotype.Service; + +@Service +public class MyCalculator implements Calculator { + public Integer add(Integer i, Integer j) throws NoSuchMethodException { +// Method add = MyCalculator.class.getMethod("add", Integer.class, Integer.class); +// LogUtil.start(add,i,j); + Integer result = i+j; +// LogUtil.stop(add,result); + return result; + } + + public Integer sub(Integer i, Integer j) throws NoSuchMethodException { +// Method sub = MyCalculator.class.getMethod("sub", Integer.class, Integer.class); +// LogUtil.start(sub,i,j); + Integer result = i-j; +// LogUtil.stop(sub,result); + return result; + } + + public Integer mul(Integer i, Integer j) throws NoSuchMethodException { +// Method mul = MyCalculator.class.getMethod("mul", Integer.class, Integer.class); +// LogUtil.start(mul,i,j); + Integer result = i*j; +// LogUtil.stop(mul,result); + return result; + } + + public Integer div(Integer i, Integer j) throws NoSuchMethodException { +// Method div = MyCalculator.class.getMethod("div", Integer.class, Integer.class); +// LogUtil.start(div,i,j); + Integer result = i/j; +// LogUtil.stop(div,result); + return result; + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/SecondCalculator.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/SecondCalculator.java" new file mode 100644 index 00000000..b0d3e7c8 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/service/SecondCalculator.java" @@ -0,0 +1,19 @@ +package com.mashibing.service; + +public class SecondCalculator implements Calculator { + public Integer add(Integer i, Integer j) throws NoSuchMethodException { + return null; + } + + public Integer sub(Integer i, Integer j) throws NoSuchMethodException { + return null; + } + + public Integer mul(Integer i, Integer j) throws NoSuchMethodException { + return null; + } + + public Integer div(Integer i, Integer j) throws NoSuchMethodException { + return null; + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/util/LogUtil.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/util/LogUtil.java" new file mode 100644 index 00000000..d1bd6366 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/java/com/mashibing/util/LogUtil.java" @@ -0,0 +1,44 @@ +package com.mashibing.util; + +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Arrays; + +@Aspect +@Component +public class LogUtil { + /** + * 通知注解有以下几种类型: + * + * @Before:前置通知,在方法执行之前完成 + * @After:后置通知,在方法执行完成之后执行 + * @AfterReturing:返回通知:在返回结果之后运行 + * @AfterThrowing:异常通知:出现异常的时候使用 + * @Around:环绕通知 + * + * 在方法的参数列表中不要随便添加参数值,会有异常信息 + */ + + @Before("execution( public Integer com.mashibing.service.MyCalculator.add(Integer,Integer))") + public static void start(){ + System.out.println("方法开始执行:参数是"); + } + + @AfterReturning("execution( public Integer com.mashibing.service.MyCalculator.add(Integer,Integer))") + public static void stop(){ + System.out.println("方法执行结束,结果是:"); + } + + @AfterThrowing("execution( public Integer com.mashibing.service.MyCalculator.add(Integer,Integer))") + public static void logException(){ + System.out.println("方法抛出异常:"); + } + + @After("execution( public Integer com.mashibing.service.MyCalculator.add(Integer,Integer))") + public static void logFinally(){ + System.out.println("方法执行结束。。。。。over"); + + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/resources/applicationContext.xml" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/resources/applicationContext.xml" new file mode 100644 index 00000000..029eea1a --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/main/resources/applicationContext.xml" @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/test/java/MyTest.java" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/test/java/MyTest.java" new file mode 100644 index 00000000..bc7497fa --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/src/test/java/MyTest.java" @@ -0,0 +1,35 @@ +import com.mashibing.myinter.MyInterface; +import com.mashibing.myinter.MySubClass; +import com.mashibing.proxy.CalculatorProxy; +import com.mashibing.service.Calculator; +import com.mashibing.service.MyCalculator; +import com.mashibing.service.SecondCalculator; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + + @Test + public void test01() throws NoSuchMethodException { + +// MyCalculator myCalculator = new MyCalculator(); +// System.out.println(myCalculator.add(1, 2)); +// System.out.println(myCalculator.div(1, 1)); + + Calculator calculator = (Calculator) CalculatorProxy.getProxy(new MyCalculator()); + System.out.println(calculator.add(1, 1)); + calculator.sub(1,1); + calculator.mul(1,1); + calculator.div(1,0); + System.out.println(calculator.getClass()); +// System.out.println("------------------"); +// MyInterface proxy = (MyInterface) CalculatorProxy.getProxy(new MySubClass()); +// proxy.show(100); + } + @Test + public void test02() throws NoSuchMethodException { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + Calculator calculator = context.getBean( Calculator.class); + calculator.add(1,1); + } +} diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/applicationContext.xml" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/applicationContext.xml" new file mode 100644 index 00000000..029eea1a --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/applicationContext.xml" @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/myinter/MyInterface.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/myinter/MyInterface.class" new file mode 100644 index 00000000..0dd65883 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/myinter/MyInterface.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/myinter/MySubClass.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/myinter/MySubClass.class" new file mode 100644 index 00000000..856113b8 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/myinter/MySubClass.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy$1.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy$1.class" new file mode 100644 index 00000000..4bad49bc Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy$1.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy.class" new file mode 100644 index 00000000..6c1761d4 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/DynamicProxy.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/DynamicProxy.class" new file mode 100644 index 00000000..876d036d Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/proxy/DynamicProxy.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/Calculator.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/Calculator.class" new file mode 100644 index 00000000..59fe5455 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/Calculator.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/MyCalculator.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/MyCalculator.class" new file mode 100644 index 00000000..598a34b2 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/MyCalculator.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/SecondCalculator.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/SecondCalculator.class" new file mode 100644 index 00000000..1459abc9 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/service/SecondCalculator.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/util/LogUtil.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/util/LogUtil.class" new file mode 100644 index 00000000..d552fdc2 Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/classes/com/mashibing/util/LogUtil.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/test-classes/MyTest.class" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/test-classes/MyTest.class" new file mode 100644 index 00000000..ba0a6cad Binary files /dev/null and "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/code/spring_aop_study/target/test-classes/MyTest.class" differ diff --git "a/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/note/04Spring AOP\344\273\213\347\273\215\344\270\216\344\275\277\347\224\250.md" "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/note/04Spring AOP\344\273\213\347\273\215\344\270\216\344\275\277\347\224\250.md" new file mode 100644 index 00000000..e5298686 --- /dev/null +++ "b/javaframework/spring/05SpringAOP\347\232\204\345\274\225\345\205\245\345\217\212\351\205\215\347\275\256\344\275\277\347\224\250/note/04Spring AOP\344\273\213\347\273\215\344\270\216\344\275\277\347\224\250.md" @@ -0,0 +1,1160 @@ +# 04Spring AOP介绍与使用 + +AOP:Aspect Oriented Programming 面向切面编程 + +OOP:Object Oriented Programming 面向对象编程 + +​ 面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,虽然IOC容器没有依赖AOP,但是AOP提供了非常强大的功能,用来对IOC做补充。通俗点说的话就是在程序运行期间,将**某段代码动态切入**到**指定方法**的**指定位置**进行运行的这种编程方式。 + +### 1、AOP的概念 + +##### 为什么要引入AOP? + +Calculator.java + +```java +package com.mashibing.inter; + +public interface Calculator { + + public int add(int i,int j); + + public int sub(int i,int j); + + public int mult(int i,int j); + + public int div(int i,int j); +} +``` + +MyCalculator.java + +```java +package com.mashibing.inter; + +public class MyCalculator implements Calculator { + public int add(int i, int j) { + int result = i + j; + return result; + } + + public int sub(int i, int j) { + int result = i - j; + return result; + } + + public int mult(int i, int j) { + int result = i * j; + return result; + } + + public int div(int i, int j) { + int result = i / j; + return result; + } +} +``` + +MyTest.java + +```java +public class MyTest { + public static void main(String[] args) throws SQLException { + MyCalculator myCalculator = new MyCalculator(); + System.out.println(myCalculator.add(1, 2)); + } +} +``` + +​ 此代码非常简单,就是基础的javase的代码实现,此时如果需要添加日志功能应该怎么做呢,只能在每个方法中添加日志输出,同时如果需要修改的话会变得非常麻烦。 + +MyCalculator.java + +```java +package com.mashibing.inter; + +public class MyCalculator implements Calculator { + public int add(int i, int j) { + System.out.println("add 方法开始执行,参数为:"+i+","+j); + int result = i + j; + System.out.println("add 方法开始完成结果为:"+result); + return result; + } + + public int sub(int i, int j) { + System.out.println("sub 方法开始执行,参数为:"+i+","+j); + int result = i - j; + System.out.println("add 方法开始完成结果为:"+result); + return result; + } + + public int mult(int i, int j) { + System.out.println("mult 方法开始执行,参数为:"+i+","+j); + int result = i * j; + System.out.println("add 方法开始完成结果为:"+result); + return result; + } + + public int div(int i, int j) { + System.out.println("div 方法开始执行,参数为:"+i+","+j); + int result = i / j; + System.out.println("add 方法开始完成结果为:"+result); + return result; + } +} +``` + +​ 可以考虑将日志的处理抽象出来,变成工具类来进行实现: + +LogUtil.java + +```java +package com.mashibing.util; + +import java.util.Arrays; + +public class LogUtil { + + public static void start(Object ... objects){ + System.out.println("XXX方法开始执行,使用的参数是:"+ Arrays.asList(objects)); + } + + public static void stop(Object ... objects){ + System.out.println("XXX方法执行结束,结果是:"+ Arrays.asList(objects)); + } +} +``` + +MyCalculator.java + +```java +package com.mashibing.inter; + +import com.mashibing.util.LogUtil; + +public class MyCalculator implements Calculator { + public int add(int i, int j) { + LogUtil.start(i,j); + int result = i + j; + LogUtil.stop(result); + return result; + } + + public int sub(int i, int j) { + LogUtil.start(i,j); + int result = i - j; + LogUtil.stop(result); + return result; + } + + public int mult(int i, int j) { + LogUtil.start(i,j); + int result = i * j; + LogUtil.stop(result); + return result; + } + + public int div(int i, int j) { + LogUtil.start(i,j); + int result = i / j; + LogUtil.stop(result); + return result; + } +} +``` + +​ 按照上述方式抽象之后,代码确实简单很多,但是大家应该已经发现在输出的信息中并不包含具体的方法名称,我们更多的是想要在程序运行过程中动态的获取方法的名称及参数、结果等相关信息,此时可以通过使用**动态代理**的方式来进行实现。 + +CalculatorProxy.java + +```java +package com.mashibing.proxy; + +import com.mashibing.inter.Calculator; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; + +/** + * 帮助Calculator生成代理对象的类 + */ +public class CalculatorProxy { + + /** + * + * 为传入的参数对象创建一个动态代理对象 + * @param calculator 被代理对象 + * @return + */ + public static Calculator getProxy(final Calculator calculator){ + + + //被代理对象的类加载器 + ClassLoader loader = calculator.getClass().getClassLoader(); + //被代理对象的接口 + Class[] interfaces = calculator.getClass().getInterfaces(); + //方法执行器,执行被代理对象的目标方法 + InvocationHandler h = new InvocationHandler() { + /** + * 执行目标方法 + * @param proxy 代理对象,给jdk使用,任何时候都不要操作此对象 + * @param method 当前将要执行的目标对象的方法 + * @param args 这个方法调用时外界传入的参数值 + * @return + * @throws Throwable + */ + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + //利用反射执行目标方法,目标方法执行后的返回值 +// System.out.println("这是动态代理执行的方法"); + Object result = null; + try { + System.out.println(method.getName()+"方法开始执行,参数是:"+ Arrays.asList(args)); + result = method.invoke(calculator, args); + System.out.println(method.getName()+"方法执行完成,结果是:"+ result); + } catch (Exception e) { + System.out.println(method.getName()+"方法出现异常:"+ e.getMessage()); + } finally { + System.out.println(method.getName()+"方法执行结束了......"); + } + //将结果返回回去 + return result; + } + }; + Object proxy = Proxy.newProxyInstance(loader, interfaces, h); + return (Calculator) proxy; + } +} +``` + +​ 我们可以看到这种方式更加灵活,而且不需要在业务方法中添加额外的代码,这才是常用的方式。如果想追求完美的同学,还可以使用上述的日志工具类来完善。 + +LogUtil.java + +```java +package com.mashibing.util; + +import java.lang.reflect.Method; +import java.util.Arrays; + +public class LogUtil { + + public static void start(Method method, Object ... objects){ +// System.out.println("XXX方法开始执行,使用的参数是:"+ Arrays.asList(objects)); + System.out.println(method.getName()+"方法开始执行,参数是:"+ Arrays.asList(objects)); + } + + public static void stop(Method method,Object ... objects){ +// System.out.println("XXX方法执行结束,结果是:"+ Arrays.asList(objects)); + System.out.println(method.getName()+"方法开始执行,参数是:"+ Arrays.asList(objects)); + + } + + public static void logException(Method method,Exception e){ + System.out.println(method.getName()+"方法出现异常:"+ e.getMessage()); + } + + public static void end(Method method){ + System.out.println(method.getName()+"方法执行结束了......"); + } +} +``` + +CalculatorProxy.java + +```java +package com.mashibing.proxy; + +import com.mashibing.inter.Calculator; +import com.mashibing.util.LogUtil; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; + +/** + * 帮助Calculator生成代理对象的类 + */ +public class CalculatorProxy { + + /** + * + * 为传入的参数对象创建一个动态代理对象 + * @param calculator 被代理对象 + * @return + */ + public static Calculator getProxy(final Calculator calculator){ + + + //被代理对象的类加载器 + ClassLoader loader = calculator.getClass().getClassLoader(); + //被代理对象的接口 + Class[] interfaces = calculator.getClass().getInterfaces(); + //方法执行器,执行被代理对象的目标方法 + InvocationHandler h = new InvocationHandler() { + /** + * 执行目标方法 + * @param proxy 代理对象,给jdk使用,任何时候都不要操作此对象 + * @param method 当前将要执行的目标对象的方法 + * @param args 这个方法调用时外界传入的参数值 + * @return + * @throws Throwable + */ + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + //利用反射执行目标方法,目标方法执行后的返回值 +// System.out.println("这是动态代理执行的方法"); + Object result = null; + try { + LogUtil.start(method,args); + result = method.invoke(calculator, args); + LogUtil.stop(method,args); + } catch (Exception e) { + LogUtil.logException(method,e); + } finally { + LogUtil.end(method); + } + //将结果返回回去 + return result; + } + }; + Object proxy = Proxy.newProxyInstance(loader, interfaces, h); + return (Calculator) proxy; + } +} +``` + +​ 很多同学看到上述代码之后可能感觉已经非常完美了,但是要说明的是,这种动态代理的实现方式调用的是jdk的基本实现,如果需要代理的目标对象没有实现任何接口,那么是无法为他创建代理对象的,这也是致命的缺陷。而在Spring中我们可以不编写上述如此复杂的代码,只需要利用AOP,就能够轻轻松松实现上述功能,当然,Spring AOP的底层实现也依赖的是动态代理。 + +##### AOP的核心概念及术语 + +- 切面(Aspect): 指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中,切面可以使用通用类基于模式的方式(schema-based approach)或者在普通类中以`@Aspect`注解(@AspectJ 注解方式)来实现。 +- 连接点(Join point): 在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总是代表一个方法的执行。 +- 通知(Advice): 在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”, “before” and “after”等等。通知的类型将在后面的章节进行讨论。 许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。 +- 切点(Pointcut): 匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用AspectJ切点语义。 +- 引入(Introduction): 声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。例如,可以使用引入来使bean实现 `IsModified`接口, 以便简化缓存机制(在AspectJ社区,引入也被称为内部类型声明(inter))。 +- 目标对象(Target object): 被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。 +- AOP代理(AOP proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。 +- 织入(Weaving): 把切面连接到其它的应用程序类型或者对象上,并创建一个被被通知的对象的过程。这个过程可以在编译时(例如使用AspectJ编译器)、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样,是在运行时完成织入的。 + +##### AOP的通知类型 + +- 前置通知(Before advice): 在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。 +- 后置返回通知(After returning advice):在连接点正常完成后执行的通知(例如,当方法没有抛出任何异常并正常返回时)。 +- 后置异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。 +- 后置通知(总会执行)(After (finally) advice): 当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。 +- 环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型,。环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。 + +##### AOP的应用场景 + +- 日志管理 +- 权限认证 +- 安全检查 +- 事务控制 + +### 2、Spring AOP的简单配置 + +​ 在上述代码中我们是通过动态代理的方式实现日志功能的,但是比较麻烦,现在我们将要使用spring aop的功能实现此需求,其实通俗点说的话,就是把LogUtil的工具类换成另外一种实现方式。 + +##### 1、添加pom依赖 + +```xml + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + +``` + +##### 2、编写配置 + +- 将目标类和切面类加入到IOC容器中,在对应的类上添加组件注解 + + - 给LogUtil添加@Component注解 + + - 给MyCalculator添加@Service注解 + + - 添加自动扫描的配置 + + ```xml + + + ``` + +- 设置程序中的切面类 + + - 在LogUtil.java中添加@Aspect注解 + +- 设置切面类中的方法是什么时候在哪里执行 + + ```java + package com.mashibing.util; + + import org.aspectj.lang.annotation.*; + import org.springframework.stereotype.Component; + + import java.lang.reflect.Method; + import java.util.Arrays; + + @Component + @Aspect + public class LogUtil { + + /* + 设置下面方法在什么时候运行 + @Before:在目标方法之前运行:前置通知 + @After:在目标方法之后运行:后置通知 + @AfterReturning:在目标方法正常返回之后:返回通知 + @AfterThrowing:在目标方法抛出异常后开始运行:异常通知 + @Around:环绕:环绕通知 + + 当编写完注解之后还需要设置在哪些方法上执行,使用表达式 + execution(访问修饰符 返回值类型 方法全称) + */ + @Before("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void start(){ + // System.out.println("XXX方法开始执行,使用的参数是:"+ Arrays.asList(objects)); + // System.out.println(method.getName()+"方法开始执行,参数是:"+ Arrays.asList(objects)); + System.out.println("方法开始执行,参数是:"); + } + + @AfterReturning("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void stop(){ + // System.out.println("XXX方法执行结束,结果是:"+ Arrays.asList(objects)); + // System.out.println(method.getName()+"方法执行结束,结果是:"+ Arrays.asList(objects)); + System.out.println("方法执行完成,结果是:"); + + } + + @AfterThrowing("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void logException(){ + // System.out.println(method.getName()+"方法出现异常:"+ e.getMessage()); + System.out.println("方法出现异常:"); + } + + @After("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void end(){ + // System.out.println(method.getName()+"方法执行结束了......"); + System.out.println("方法执行结束了......"); + } + } + ``` + +- 开启基于注解的aop的功能 + + ```xml + + + + + + ``` + + +##### 3、测试 + + MyTest.java + + ```java + import com.mashibing.inter.Calculator; + import org.springframework.context.ApplicationContext; + import org.springframework.context.support.ClassPathXmlApplicationContext; + public class MyTest { + public static void main(String[] args){ + ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml"); + Calculator bean = context.getBean(Calculator.class); + bean.add(1,1); + } +} + ``` + +​ spring AOP的动态代理方式是jdk自带的方式,容器中保存的组件是代理对象com.sun.proxy.$Proxy对象 + + ##### 4、通过cglib来创建代理对象 + +MyCalculator.java + +```java +package com.mashibing.inter; + +import org.springframework.stereotype.Service; + +@Service +public class MyCalculator { + public int add(int i, int j) { + int result = i + j; + return result; + } + + public int sub(int i, int j) { + int result = i - j; + return result; + } + + public int mult(int i, int j) { + int result = i * j; + return result; + } + + public int div(int i, int j) { + int result = i / j; + return result; + } +} +``` + +MyTest.java + +```java +public class MyTest { + public static void main(String[] args){ + ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml"); + MyCalculator bean = context.getBean(MyCalculator.class); + bean.add(1,1); + System.out.println(bean); + System.out.println(bean.getClass()); + } +} +``` + +​ 可以通过cglib的方式来创建代理对象,此时不需要实现任何接口,代理对象是 + +class com.mashibing.inter.MyCalculator$$EnhancerBySpringCGLIB$$1f93b605类型 + +​ **综上所述:在spring容器中,如果有接口,那么会使用jdk自带的动态代理,如果没有接口,那么会使用cglib的动态代理。动态代理的实现原理,后续会详细讲。** + +##### 注意: + +###### 1、切入点表达式 + +​ 在使用表达式的时候,除了之前的写法之外,还可以使用通配符的方式: + +​ *: + +​ 1、匹配一个或者多个字符 + +​ execution( public int com.mashibing.inter.My\*alculator.*(int,int)) + +​ 2、匹配任意一个参数, + +​ execution( public int com.mashibing.inter.MyCalculator.\*(int,\*)) + +​ 3、只能匹配一层路径,如果项目路径下有多层目录,那么*只能匹配一层路径 + +​ 4、权限位置不能使用*,如果想表示全部权限,那么不写即可 + +​ execution( * com.mashibing.inter.MyCalculator.\*(int,\*)) + +​ ..: + +​ 1、匹配多个参数,任意类型参数 + +​ execution( * com.mashibing.inter.MyCalculator.\*(..)) + +​ 2、匹配任意多层路径 + +​ execution( * com.mashibing..MyCalculator.\*(..)) + +​ 在写表达式的时候,可以有N多种写法,但是有一种最偷懒和最精确的方式: + +​ 最偷懒的方式:execution(* \*(..)) 或者 execution(* \*.\*(..)) + +​ 最精确的方式:execution( public int com.mashibing.inter.MyCalculator.add(int,int)) + +​ 除此之外,在表达式中还支持 &&、||、!的方式 + +​ &&:两个表达式同时 + +​ execution( public int com.mashibing.inter.MyCalculator.*(..)) && execution(\* \*.\*(int,int) ) + +​ ||:任意满足一个表达式即可 + +​ execution( public int com.mashibing.inter.MyCalculator.*(..)) && execution(\* \*.\*(int,int) ) + +​ !:只要不是这个位置都可以进行切入 + +​ &&:两个表达式同时 + +​ execution( public int com.mashibing.inter.MyCalculator.*(..)) + +###### 2、通知方法的执行顺序 + +​ 在之前的代码中大家一直对通知的执行顺序有疑问,其实执行的结果并没有错,大家需要注意: + +​ 1、正常执行:@Before--->@After--->@AfterReturning + +​ 2、异常执行:@Before--->@After--->@AfterThrowing + +###### 3、获取方法的详细信息 + +​ 在上面的案例中,我们并没有获取Method的详细信息,例如方法名、参数列表等信息,想要获取的话其实非常简单,只需要添加JoinPoint参数即可。 + +LogUtil.java + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +public class LogUtil { + + @Before("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void start(JoinPoint joinPoint){ + Object[] args = joinPoint.getArgs(); + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法开始执行,参数是:"+ Arrays.asList(args)); + } + + @AfterReturning("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void stop(JoinPoint joinPoint){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法执行完成,结果是:"); + + } + + @AfterThrowing("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void logException(JoinPoint joinPoint){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法出现异常:"); + } + + @After("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public static void end(JoinPoint joinPoint){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法执行结束了......"); + } +} +``` + +​ 刚刚只是获取了方法的信息,但是如果需要获取结果,还需要添加另外一个方法参数,并且告诉spring使用哪个参数来进行结果接收 + +LogUtil.java + +```java + @AfterReturning(value = "execution( public int com.mashibing.inter.MyCalculator.*(int,int))",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法执行完成,结果是:"+result); + + } +``` + +​ 也可以通过相同的方式来获取异常的信息 + +LogUtil.java + +```java + @AfterThrowing(value = "execution( public int com.mashibing.inter.MyCalculator.*(int,int))",throwing = "exception") + public static void logException(JoinPoint joinPoint,Exception exception){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法出现异常:"+exception); + } +``` + +###### 4、spring对通过方法的要求 + +​ spring对于通知方法的要求并不是很高,你可以任意改变方法的返回值和方法的访问修饰符,但是唯一不能修改的就是方法的参数,会出现参数绑定的错误,原因在于通知方法是spring利用反射调用的,每次方法调用得确定这个方法的参数的值。 + +LogUtil.java + +```java + @After("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + private int end(JoinPoint joinPoint,String aa){ +// System.out.println(method.getName()+"方法执行结束了......"); + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法执行结束了......"); + return 0; + } +``` + +###### 5、表达式的抽取 + +如果在实际使用过程中,多个方法的表达式是一致的话,那么可以考虑将切入点表达式抽取出来: + +​ a、随便生命一个没有实现的返回void的空方法 + +​ b、给方法上标注@Potintcut注解 + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +public class LogUtil { + + @Pointcut("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public void myPoint(){} + + @Before("myPoint()") + public static void start(JoinPoint joinPoint){ + Object[] args = joinPoint.getArgs(); + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法开始执行,参数是:"+ Arrays.asList(args)); + } + + @AfterReturning(value = "myPoint()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法执行完成,结果是:"+result); + + } + + @AfterThrowing(value = "myPoint()",throwing = "exception") + public static void logException(JoinPoint joinPoint,Exception exception){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法出现异常:"+exception.getMessage()); + } + + @After("myPoint()") + private int end(JoinPoint joinPoint){ + String name = joinPoint.getSignature().getName(); + System.out.println(name+"方法执行结束了......"); + return 0; + } +} +``` + +###### 6、环绕通知的使用 + +LogUtil.java + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +public class LogUtil { + @Pointcut("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public void myPoint(){} + + /** + * 环绕通知是spring中功能最强大的通知 + * @param proceedingJoinPoint + * @return + */ + @Around("myPoint()") + public Object myAround(ProceedingJoinPoint proceedingJoinPoint){ + Object[] args = proceedingJoinPoint.getArgs(); + String name = proceedingJoinPoint.getSignature().getName(); + Object proceed = null; + try { + System.out.println("环绕前置通知:"+name+"方法开始,参数是"+Arrays.asList(args)); + //利用反射调用目标方法,就是method.invoke() + proceed = proceedingJoinPoint.proceed(args); + System.out.println("环绕返回通知:"+name+"方法返回,返回值是"+proceed); + } catch (Throwable e) { + System.out.println("环绕异常通知"+name+"方法出现异常,异常信息是:"+e); + }finally { + System.out.println("环绕后置通知"+name+"方法结束"); + } + return proceed; + } +} +``` + +​ 总结:环绕通知的执行顺序是优于普通通知的,具体的执行顺序如下: + +环绕前置-->普通前置-->目标方法执行-->环绕正常结束/出现异常-->环绕后置-->普通后置-->普通返回或者异常。 + +但是需要注意的是,如果出现了异常,那么环绕通知会处理或者捕获异常,普通异常通知是接收不到的,因此最好的方式是在环绕异常通知中向外抛出异常。 + +###### 7、多切面运行的顺序 + +​ 如果有多个切面要进行执行,那么顺序是什么样的呢? + +LogUtil.java + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +public class LogUtil { + @Pointcut("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public void myPoint(){} + @Before("myPoint()") + public static void start(JoinPoint joinPoint){ +// System.out.println("XXX方法开始执行,使用的参数是:"+ Arrays.asList(objects)); +// System.out.println(method.getName()+"方法开始执行,参数是:"+ Arrays.asList(objects)); + Object[] args = joinPoint.getArgs(); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法开始执行,参数是:"+ Arrays.asList(args)); + } + + @AfterReturning(value = "myPoint()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ +// System.out.println("XXX方法执行结束,结果是:"+ Arrays.asList(objects)); +// System.out.println(method.getName()+"方法执行结束,结果是:"+ Arrays.asList(objects)); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法执行完成,结果是:"+result); + + } + + @AfterThrowing(value = "myPoint()",throwing = "exception") + public static void logException(JoinPoint joinPoint,Exception exception){ +// System.out.println(method.getName()+"方法出现异常:"+ e.getMessage()); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法出现异常:"+exception.getMessage()); + } + + @After("myPoint()") + private int end(JoinPoint joinPoint){ +// System.out.println(method.getName()+"方法执行结束了......"); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法执行结束了......"); + return 0; + } + + /** + * 环绕通知是spring中功能最强大的通知 + * @param proceedingJoinPoint + * @return + */ + //@Around("myPoint()") + public Object myAround(ProceedingJoinPoint proceedingJoinPoint){ + Object[] args = proceedingJoinPoint.getArgs(); + String name = proceedingJoinPoint.getSignature().getName(); + Object proceed = null; + try { + System.out.println("环绕前置通知:"+name+"方法开始,参数是"+Arrays.asList(args)); + //利用反射调用目标方法,就是method.invoke() + proceed = proceedingJoinPoint.proceed(args); + System.out.println("环绕返回通知:"+name+"方法返回,返回值是"+proceed); + } catch (Throwable e) { + System.out.println("环绕异常通知"+name+"方法出现异常,异常信息是:"+e); + }finally { + System.out.println("环绕后置通知"+name+"方法结束"); + } + return proceed; + } +} +``` + +SecurityAspect.java + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +public class SecurityAspect { + + @Before("com.mashibing.util.LogUtil.myPoint()") + public static void start(JoinPoint joinPoint){ + Object[] args = joinPoint.getArgs(); + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法开始执行,参数是:"+ Arrays.asList(args)); + } + + @AfterReturning(value = "com.mashibing.util.LogUtil.myPoint()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法执行完成,结果是:"+result); + + } + + @AfterThrowing(value = "com.mashibing.util.LogUtil.myPoint()",throwing = "exception") + public static void logException(JoinPoint joinPoint,Exception exception){ + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法出现异常:"+exception.getMessage()); + } + + @After("com.mashibing.util.LogUtil.myPoint()") + private int end(JoinPoint joinPoint){ + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法执行结束了......"); + return 0; + } + + /** + * 环绕通知是spring中功能最强大的通知 + * @param proceedingJoinPoint + * @return + */ + //@Around("myPoint()") + public Object myAround(ProceedingJoinPoint proceedingJoinPoint){ + Object[] args = proceedingJoinPoint.getArgs(); + String name = proceedingJoinPoint.getSignature().getName(); + Object proceed = null; + try { + System.out.println("环绕前置通知:"+name+"方法开始,参数是"+Arrays.asList(args)); + //利用反射调用目标方法,就是method.invoke() + proceed = proceedingJoinPoint.proceed(args); + System.out.println("环绕返回通知:"+name+"方法返回,返回值是"+proceed); + } catch (Throwable e) { + System.out.println("环绕异常通知"+name+"方法出现异常,异常信息是:"+e); + }finally { + System.out.println("环绕后置通知"+name+"方法结束"); + } + return proceed; + } +} +``` + +​ 在spring中,默认是按照切面名称的字典顺序进行执行的,但是如果想自己改变具体的执行顺序的话,可以使用@Order注解来解决,数值越小,优先级越高。 + +LogUtil.java + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +@Order(2) +public class LogUtil { + @Pointcut("execution( public int com.mashibing.inter.MyCalculator.*(int,int))") + public void myPoint(){} + @Before("myPoint()") + public static void start(JoinPoint joinPoint){ +// System.out.println("XXX方法开始执行,使用的参数是:"+ Arrays.asList(objects)); +// System.out.println(method.getName()+"方法开始执行,参数是:"+ Arrays.asList(objects)); + Object[] args = joinPoint.getArgs(); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法开始执行,参数是:"+ Arrays.asList(args)); + } + + @AfterReturning(value = "myPoint()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ +// System.out.println("XXX方法执行结束,结果是:"+ Arrays.asList(objects)); +// System.out.println(method.getName()+"方法执行结束,结果是:"+ Arrays.asList(objects)); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法执行完成,结果是:"+result); + + } + + @AfterThrowing(value = "myPoint()",throwing = "exception") + public static void logException(JoinPoint joinPoint,Exception exception){ +// System.out.println(method.getName()+"方法出现异常:"+ e.getMessage()); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法出现异常:"+exception.getMessage()); + } + + @After("myPoint()") + private int end(JoinPoint joinPoint){ +// System.out.println(method.getName()+"方法执行结束了......"); + String name = joinPoint.getSignature().getName(); + System.out.println("Log:"+name+"方法执行结束了......"); + return 0; + } + + /** + * 环绕通知是spring中功能最强大的通知 + * @param proceedingJoinPoint + * @return + */ + //@Around("myPoint()") + public Object myAround(ProceedingJoinPoint proceedingJoinPoint){ + Object[] args = proceedingJoinPoint.getArgs(); + String name = proceedingJoinPoint.getSignature().getName(); + Object proceed = null; + try { + System.out.println("环绕前置通知:"+name+"方法开始,参数是"+Arrays.asList(args)); + //利用反射调用目标方法,就是method.invoke() + proceed = proceedingJoinPoint.proceed(args); + System.out.println("环绕返回通知:"+name+"方法返回,返回值是"+proceed); + } catch (Throwable e) { + System.out.println("环绕异常通知"+name+"方法出现异常,异常信息是:"+e); + }finally { + System.out.println("环绕后置通知"+name+"方法结束"); + } + return proceed; + } +} +``` + +SecurityAspect.java + +```java +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +@Component +@Aspect +@Order(1) +public class SecurityAspect { + + @Before("com.mashibing.util.LogUtil.myPoint()") + public static void start(JoinPoint joinPoint){ + Object[] args = joinPoint.getArgs(); + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法开始执行,参数是:"+ Arrays.asList(args)); + } + + @AfterReturning(value = "com.mashibing.util.LogUtil.myPoint()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法执行完成,结果是:"+result); + + } + + @AfterThrowing(value = "com.mashibing.util.LogUtil.myPoint()",throwing = "exception") + public static void logException(JoinPoint joinPoint,Exception exception){ + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法出现异常:"+exception.getMessage()); + } + + @After("com.mashibing.util.LogUtil.myPoint()") + private int end(JoinPoint joinPoint){ + String name = joinPoint.getSignature().getName(); + System.out.println("Security:"+name+"方法执行结束了......"); + return 0; + } + + /** + * 环绕通知是spring中功能最强大的通知 + * @param proceedingJoinPoint + * @return + */ + //@Around("myPoint()") + public Object myAround(ProceedingJoinPoint proceedingJoinPoint){ + Object[] args = proceedingJoinPoint.getArgs(); + String name = proceedingJoinPoint.getSignature().getName(); + Object proceed = null; + try { + System.out.println("环绕前置通知:"+name+"方法开始,参数是"+Arrays.asList(args)); + //利用反射调用目标方法,就是method.invoke() + proceed = proceedingJoinPoint.proceed(args); + System.out.println("环绕返回通知:"+name+"方法返回,返回值是"+proceed); + } catch (Throwable e) { + System.out.println("环绕异常通知"+name+"方法出现异常,异常信息是:"+e); + }finally { + System.out.println("环绕后置通知"+name+"方法结束"); + } + return proceed; + } +} +``` + +​ 如果需要添加环绕通知呢,具体的执行顺序又会是什么顺序呢? + +​ 因为环绕通知在进行添加的时候,是在切面层引入的,所以在哪个切面添加环绕通知,那么就会在哪个切面执行。 + +### 3、基于配置的AOP配置 + +​ 之前我们讲解了基于注解的AOP配置方式,下面我们开始讲一下基于xml的配置方式,虽然在现在的企业级开发中使用注解的方式比较多,但是你不能不会,因此需要简单的进行配置,注解配置快速简单,配置的方式共呢个完善。 + +1、将所有的注解都进行删除 + +2、添加配置文件 + +aop.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + diff --git "a/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/compiler.xml" "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/compiler.xml" new file mode 100644 index 00000000..958a9165 --- /dev/null +++ "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/compiler.xml" @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/misc.xml" "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/uiDesigner.xml" "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/workspace.xml" "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/workspace.xml" new file mode 100644 index 00000000..8c789d55 --- /dev/null +++ "b/javaframework/spring/06SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\243/code/spring_aop_study/.idea/workspace.xml" @@ -0,0 +1,784 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + int + + + Integer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1581768338458 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + spring_aop_study + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/pom.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/pom.xml" new file mode 100644 index 00000000..d9b23714 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/pom.xml" @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.mashibing + spring_aop_study + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/spring_aop_study.iml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/spring_aop_study.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/spring_aop_study.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/myinter/MyInterface.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/myinter/MyInterface.java" new file mode 100644 index 00000000..f39d68d2 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/myinter/MyInterface.java" @@ -0,0 +1,6 @@ +package com.mashibing.myinter; + +public interface MyInterface { + + public void show(Integer i); +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/myinter/MySubClass.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/myinter/MySubClass.java" new file mode 100644 index 00000000..9a327f40 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/myinter/MySubClass.java" @@ -0,0 +1,7 @@ +package com.mashibing.myinter; + +public class MySubClass implements MyInterface { + public void show(Integer i) { + System.out.println("show......."); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/proxy/CalculatorProxy.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/proxy/CalculatorProxy.java" new file mode 100644 index 00000000..909733f9 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/proxy/CalculatorProxy.java" @@ -0,0 +1,55 @@ +package com.mashibing.proxy; + +import com.mashibing.service.Calculator; +import com.mashibing.util.LogUtil; +import org.springframework.transaction.annotation.Transactional; +import sun.rmi.runtime.Log; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; + +/** + * 必须要有接口,如果没有接口,不能使用,这种方式是用jdk提供的reflect包下的类 + * 但是在生产环境中我不能保证每个类都有实现的接口,所有有第二种方式cglib + * + * cglib在实现的时候有没有接口都无所谓 + * + * 在spring中使用了两种动态代理的方式,一种是jdk提供的(刚刚完成的)另外一种就是cglib + */ +public class CalculatorProxy { + + public static Calculator getProxy( final Calculator calculator){ + + //获取被代理对象的类加载器 + ClassLoader loader = calculator.getClass().getClassLoader(); + //被代理对象的所有接口 + Class[] interfaces = calculator.getClass().getInterfaces(); + //用来执行被代理类需要执行的方法 + InvocationHandler handler = new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object result = null; + try{ +// System.out.println(method.getName()+"方法开始执行,参数列表是:"+ Arrays.asList(args)); +// LogUtil.start(method,args); + //开始调用被代理类的方法 + //start + result = method.invoke(calculator,args); + //end +// System.out.println(method.getName()+"方法执行完成,结果是:"+result); +// LogUtil.stop(method,result); + }catch (Exception e){ +// System.out.println(method.getName()+"方法抛出异常:"+e.getMessage()); +// LogUtil.logException(method,e); + }finally { +// System.out.println(method.getName()+"方法执行结束。。。。。over"); +// LogUtil.logFinally(method); + } + return result; + } + }; + Object o = Proxy.newProxyInstance(loader, interfaces, handler); + return (Calculator) o; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/proxy/DynamicProxy.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/proxy/DynamicProxy.java" new file mode 100644 index 00000000..9c4ad1a5 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/proxy/DynamicProxy.java" @@ -0,0 +1,10 @@ +package com.mashibing.proxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class DynamicProxy implements InvocationHandler { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return null; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/Calculator.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/Calculator.java" new file mode 100644 index 00000000..6773c211 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/Calculator.java" @@ -0,0 +1,11 @@ +package com.mashibing.service; + + + +public interface Calculator { + + public Integer add(Integer i,Integer j) throws NoSuchMethodException; + public Integer sub(Integer i,Integer j) throws NoSuchMethodException; + public Integer mul(Integer i,Integer j) throws NoSuchMethodException; + public Integer div(Integer i,Integer j) throws NoSuchMethodException; +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/MyCalculator.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/MyCalculator.java" new file mode 100644 index 00000000..bfb5e328 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/MyCalculator.java" @@ -0,0 +1,43 @@ +package com.mashibing.service; + +import org.springframework.stereotype.Service; + +//@Service +public class MyCalculator /*implements Calculator */{ + public Integer add(Integer i, Integer j) throws NoSuchMethodException { +// Method add = MyCalculator.class.getMethod("add", Integer.class, Integer.class); +// LogUtil.start(add,i,j); + Integer result = i+j; +// LogUtil.stop(add,result); + return result; + } + + public Integer sub(Integer i, Integer j) throws NoSuchMethodException { +// Method sub = MyCalculator.class.getMethod("sub", Integer.class, Integer.class); +// LogUtil.start(sub,i,j); + Integer result = i-j; +// LogUtil.stop(sub,result); + return result; + } + + public Integer mul(Integer i, Integer j) throws NoSuchMethodException { +// Method mul = MyCalculator.class.getMethod("mul", Integer.class, Integer.class); +// LogUtil.start(mul,i,j); + Integer result = i*j; +// LogUtil.stop(mul,result); + return result; + } + + public Integer div(Integer i, Integer j) throws NoSuchMethodException { +// Method div = MyCalculator.class.getMethod("div", Integer.class, Integer.class); +// LogUtil.start(div,i,j); + Integer result = i/j; +// LogUtil.stop(div,result); + return result; + } + + public Integer show(Integer i){ + System.out.println("show ....."); + return i; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/SecondCalculator.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/SecondCalculator.java" new file mode 100644 index 00000000..b0d3e7c8 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/SecondCalculator.java" @@ -0,0 +1,19 @@ +package com.mashibing.service; + +public class SecondCalculator implements Calculator { + public Integer add(Integer i, Integer j) throws NoSuchMethodException { + return null; + } + + public Integer sub(Integer i, Integer j) throws NoSuchMethodException { + return null; + } + + public Integer mul(Integer i, Integer j) throws NoSuchMethodException { + return null; + } + + public Integer div(Integer i, Integer j) throws NoSuchMethodException { + return null; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/impl/MyCalculator2.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/impl/MyCalculator2.java" new file mode 100644 index 00000000..6c15d018 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/service/impl/MyCalculator2.java" @@ -0,0 +1,44 @@ +package com.mashibing.service.impl; + +import org.springframework.stereotype.Service; + +@Service +public class MyCalculator2 /*implements Calculator */{ + + public Integer add(Integer i, Integer j) throws NoSuchMethodException { +// Method add = MyCalculator.class.getMethod("add", Integer.class, Integer.class); +// LogUtil.start(add,i,j); + Integer result = i+j; +// LogUtil.stop(add,result); + return result; + } + + public Integer sub(Integer i, Integer j) throws NoSuchMethodException { +// Method sub = MyCalculator.class.getMethod("sub", Integer.class, Integer.class); +// LogUtil.start(sub,i,j); + Integer result = i-j; +// LogUtil.stop(sub,result); + return result; + } + + public Integer mul(Integer i, Integer j) throws NoSuchMethodException { +// Method mul = MyCalculator.class.getMethod("mul", Integer.class, Integer.class); +// LogUtil.start(mul,i,j); + Integer result = i*j; +// LogUtil.stop(mul,result); + return result; + } + + public Integer div(Integer i, Integer j) throws NoSuchMethodException { +// Method div = MyCalculator.class.getMethod("div", Integer.class, Integer.class); +// LogUtil.start(div,i,j); + Integer result = i/j; +// LogUtil.stop(div,result); + return result; + } + + public Integer show(Integer i,Double j){ + System.out.println("show ....."); + return i; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/util/LogUtil.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/util/LogUtil.java" new file mode 100644 index 00000000..0e396bf5 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/util/LogUtil.java" @@ -0,0 +1,155 @@ +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.*; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Arrays; + +//@Aspect +//@Component +//@Order(200) +public class LogUtil { + /** + * 通知注解有以下几种类型: + * + * @Before:前置通知,在方法执行之前完成 + * @After:后置通知,在方法执行完成之后执行 + * @AfterReturing:返回通知:在返回结果之后运行 + * @AfterThrowing:异常通知:出现异常的时候使用 + * @Around:环绕通知 + * + * 在方法的参数列表中不要随便添加参数值,会有异常信息 + * + * 切入点表达式: + * 最精确的匹配方式: + * public Integer com.mashibing.service.MyCalculator.add(Integer,Integer) + * 在实际的生产环境中,更多的时候使用通配符的方式 + * *: + * 1、可以用来匹配一个或者多个字符 + * execution( public Integer com.mashibing.service.MyCalculator.*(Integer,Integer) + * 2、匹配任意类型的参数,只能匹配一个 + * execution( public Integer com.mashibing.service.M*Calculator.*(Integer,*)) + * 3、*在进行匹配的时候只能匹配一层路径,不能匹配多层 + * 4、*不能够匹配访问修饰符,如果不确定访问修饰符是什么,可以直接省略不写 + * execution( Integer com.mashibing.service.MyCalculator.*(Integer,*)) + * 5、返回值可以使用*来代替 + * ..: + * 1、可以匹配多个参数,任意类型 + * execution(* com.mashibing.service.MyCalculator.*(..)) + * 2、可以匹配多层路径 + * execution(* com.mashibing..MyCalculator*.*(..)) + * 最偷懒的方式: + * execution(* *(..)) + * execution(* com..*(..)) + * 如果表达式是以*开头,那么可以代替所有 + * + * 在使用表达式的时候还支持逻辑运算 + * &&:多个条件必须同时满足 + * execution(public Integer com.mashibing.service.MyCalculator.*(..)) && execution(* *(..)) + * ||:多个条件只要满足其中一个即可 + * execution(public Integer com.mashibing.service.MyCalculator.*(..)) || execution(* *(..)) + * !:取反,除了这种情况的其他都满足 + * !execution(public Integer com.mashibing.service.MyCalculator.add(Integer,Integer)) + * + * 使用通配符的时候不是越简洁越好,更多的是要选择符合要求或者符合规则的匹配方式, + * 此时就要求在定义标识符的时候必须要遵循项目规范 + * + * 通知的正常执行顺序: + * 如果正常执行:@Before--》@After----》@AfterReturning + * 如果异常结束:@Before--》@After----》@AfterThrowing + * + * + * 如果想要在方法中获取对应的参数或者方法名称等信息的时候,必须要使用JoinPoint对象,并且此参数必须是第一个 + * getSignature() + * getArgs() + * 如果方法中有返回值,那么必须要在注解中添加 Returing="result" ,这个result必须要和参数列表中的参数名称保持一致 + * 如果需要添加异常信息,那么在注解中要添加Throwing="e" 这个e的名称必须跟参数列表中的名称保持一致 + * 如果想要添加其他参数,必须要添加args(参数列表),ArgNames(参数列表) + * @Before(value = "execution(public Integer com.mashibing.service.MyCalculator.*(Integer,Integer)) && args(joinPoint,k)",argNames = "joinPoint,k") + * + * + * 通知方法在定义的时候有没有什么特殊的要求? + * 通知方法在定义的时候对于访问修饰符、返回值类型都没有明确的要求, + * 但是要注意,参数不能随便添加 + * + * 如果有多个匹配的表达式相同,能否做抽象? + * 定义一个没有返回值的空方法,给该方法添加@PointCut注解,后续在使用的时候可以直接调用方法名称 + * 此处的方法只是起一个声明的作用,能够供内部的其他通知方法进行调用 + * + * + * 环绕通知: + * 环绕通知在执行的时候是优先于普通通知的 + * 如果是正常结束,那么执行顺序是: + * 环绕前置通知--》@Before--》环绕后置通知--》环绕返回通知--》@After--》@AfterReturning + * 如果是异常结束,那么执行顺序是: + * 环绕前置通知--》@Before--》环绕异常通知--》环绕返回通知--》@After--》@AfterReturing + * 如果出现异常的时候,在环绕通知中解决了,那么普通通知是接受不到的,如果想让普通通知接收到需要进行抛出 throw throwable + * 执行顺序改为: + * 环绕前置通知--》@Before--》环绕异常通知--》环绕返回通知--》@After--》@AfterThrowing + * + * 当应用程序中包含多个切面类的时候,具体的执行顺序是什么样? + * 按照切面类的名称的首字母进行排序操作,按照字典序 + * 如果需要认为的规定顺序,可以在切面类上添加@Order注解同时可以添加具体的值 + * 值越小,越优先 + */ + + @Pointcut("execution(public Integer com.mashibing.service.MyCalculator.*(Integer,Integer))") + public void myPointCut(){} + + @Pointcut("execution(* *(..))") + public void myPointCut1(){} + + @Before(value = "myPointCut()") + private int start(JoinPoint joinPoint){ + //获取方法签名 + Signature signature = joinPoint.getSignature(); + //获取参数信息 + Object[] args = joinPoint.getArgs(); + System.out.println("log---"+signature.getName()+"方法开始执行:参数是"+Arrays.asList(args)); + return 100; + } + + @AfterReturning(value = "myPointCut()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ + Signature signature = joinPoint.getSignature(); + System.out.println("log---"+signature.getName()+"方法执行结束,结果是:"+result); + } + + @AfterThrowing(value = "myPointCut()",throwing = "e") + public static void logException(JoinPoint joinPoint,Exception e){ + Signature signature = joinPoint.getSignature(); + System.out.println("log---"+signature.getName()+"方法抛出异常:"+e.getMessage()); + } + + @After("myPointCut()") + public static void logFinally(JoinPoint joinPoint){ + Signature signature = joinPoint.getSignature(); + System.out.println("log---"+signature.getName()+"方法执行结束。。。。。over"); + + } + + @Around("myPointCut()") + public Object around(ProceedingJoinPoint pjp) throws Throwable { + Signature signature = pjp.getSignature(); + Object[] args = pjp.getArgs(); + Object result = null; + try { + System.out.println("log---环绕通知start:"+signature.getName()+"方法开始执行,参数为:"+Arrays.asList(args)); + //通过反射的方式调用目标的方法,相当于执行method.invoke(),可以自己修改结果值 + result = pjp.proceed(args); +// result=100; + System.out.println("log---环绕通知stop"+signature.getName()+"方法执行结束"); + } catch (Throwable throwable) { + System.out.println("log---环绕异常通知:"+signature.getName()+"出现异常"); + throw throwable; + }finally { + System.out.println("log---环绕返回通知:"+signature.getName()+"方法返回结果是:"+result); + } + return result; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/util/SecurityUtil.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/util/SecurityUtil.java" new file mode 100644 index 00000000..4f0d4e7b --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/java/com/mashibing/util/SecurityUtil.java" @@ -0,0 +1,68 @@ +package com.mashibing.util; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.*; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +//@Aspect +//@Component +//@Order(100) +public class SecurityUtil { + + @Pointcut("execution(public Integer com.mashibing.service.MyCalculator.*(Integer,Integer))") + public void myPointCut(){} + + + + @Before(value = "myPointCut()") + private int start(JoinPoint joinPoint){ + Signature signature = joinPoint.getSignature(); + Object[] args = joinPoint.getArgs(); + System.out.println("Security---"+signature.getName()+"方法开始执行:参数是"+Arrays.asList(args)); + return 100; + } + + @AfterReturning(value = "myPointCut()",returning = "result") + public static void stop(JoinPoint joinPoint,Object result){ + Signature signature = joinPoint.getSignature(); + System.out.println("Security---"+signature.getName()+"方法执行结束,结果是:"+result); + } + + @AfterThrowing(value = "myPointCut()",throwing = "e") + public static void logException(JoinPoint joinPoint,Exception e){ + Signature signature = joinPoint.getSignature(); + System.out.println("Security---"+signature.getName()+"方法抛出异常:"+e.getMessage()); + } + + @After("myPointCut()") + public static void logFinally(JoinPoint joinPoint){ + Signature signature = joinPoint.getSignature(); + System.out.println("Security---"+signature.getName()+"方法执行结束。。。。。over"); + + } + + @Around("myPointCut()") + public Object around(ProceedingJoinPoint pjp) throws Throwable { + Signature signature = pjp.getSignature(); + Object[] args = pjp.getArgs(); + Object result = null; + try { + System.out.println("Security---环绕通知start:"+signature.getName()+"方法开始执行,参数为:"+ Arrays.asList(args)); + //通过反射的方式调用目标的方法,相当于执行method.invoke(),可以自己修改结果值 + result = pjp.proceed(args); +// result=100; + System.out.println("Security---环绕通知stop"+signature.getName()+"方法执行结束"); + } catch (Throwable throwable) { + System.out.println("Security---环绕异常通知:"+signature.getName()+"出现异常"); + throw throwable; + }finally { + System.out.println("Security---环绕返回通知:"+signature.getName()+"方法返回结果是:"+result); + } + return result; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/resources/aop.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/resources/aop.xml" new file mode 100644 index 00000000..51483751 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/resources/aop.xml" @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/resources/applicationContext.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/resources/applicationContext.xml" new file mode 100644 index 00000000..029eea1a --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/main/resources/applicationContext.xml" @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/test/java/MyTest.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/test/java/MyTest.java" new file mode 100644 index 00000000..5ed3ce30 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/src/test/java/MyTest.java" @@ -0,0 +1,45 @@ +import com.mashibing.myinter.MyInterface; +import com.mashibing.myinter.MySubClass; +import com.mashibing.proxy.CalculatorProxy; +import com.mashibing.service.Calculator; +import com.mashibing.service.MyCalculator; +import com.mashibing.service.SecondCalculator; +import com.mashibing.service.impl.MyCalculator2; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("aop.xml"); + + @Test + public void test01() throws NoSuchMethodException { + +// MyCalculator myCalculator = new MyCalculator(); +// System.out.println(myCalculator.add(1, 2)); +// System.out.println(myCalculator.div(1, 1)); + +// Calculator calculator = (Calculator) CalculatorProxy.getProxy(new MyCalculator()); +// System.out.println(calculator.add(1, 1)); +// calculator.sub(1,1); +// calculator.mul(1,1); +// calculator.div(1,0); +// System.out.println(calculator.getClass()); +// System.out.println("------------------"); +// MyInterface proxy = (MyInterface) CalculatorProxy.getProxy(new MySubClass()); +// proxy.show(100); + } + + @Test + public void test02() throws NoSuchMethodException { + MyCalculator calculator = context.getBean(MyCalculator.class); + calculator.div(1, 1); + System.out.println(calculator.getClass()); + + } + + @Test + public void test03() throws NoSuchMethodException { + MyCalculator2 myCalculator2 = context.getBean("myCalculator2", MyCalculator2.class); + myCalculator2.add(1,1); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/META-INF/spring_aop_study.kotlin_module" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/META-INF/spring_aop_study.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/META-INF/spring_aop_study.kotlin_module" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/aop.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/aop.xml" new file mode 100644 index 00000000..51483751 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/aop.xml" @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/applicationContext.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/applicationContext.xml" new file mode 100644 index 00000000..029eea1a --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/applicationContext.xml" @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/myinter/MyInterface.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/myinter/MyInterface.class" new file mode 100644 index 00000000..0dd65883 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/myinter/MyInterface.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/myinter/MySubClass.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/myinter/MySubClass.class" new file mode 100644 index 00000000..856113b8 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/myinter/MySubClass.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy$1.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy$1.class" new file mode 100644 index 00000000..012ff693 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy$1.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy.class" new file mode 100644 index 00000000..294fce3f Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/CalculatorProxy.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/DynamicProxy.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/DynamicProxy.class" new file mode 100644 index 00000000..876d036d Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/proxy/DynamicProxy.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/Calculator.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/Calculator.class" new file mode 100644 index 00000000..59fe5455 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/Calculator.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/MyCalculator.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/MyCalculator.class" new file mode 100644 index 00000000..469efd04 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/MyCalculator.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/SecondCalculator.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/SecondCalculator.class" new file mode 100644 index 00000000..1459abc9 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/SecondCalculator.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/impl/MyCalculator2.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/impl/MyCalculator2.class" new file mode 100644 index 00000000..d60170a4 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/service/impl/MyCalculator2.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/util/LogUtil.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/util/LogUtil.class" new file mode 100644 index 00000000..3b3ef104 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/util/LogUtil.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/util/SecurityUtil.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/util/SecurityUtil.class" new file mode 100644 index 00000000..7430d4c6 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/classes/com/mashibing/util/SecurityUtil.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/test-classes/MyTest.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/test-classes/MyTest.class" new file mode 100644 index 00000000..a5fec139 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_study/target/test-classes/MyTest.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/compiler.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/compiler.xml" new file mode 100644 index 00000000..a8afeb7a --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/misc.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/workspace.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/workspace.xml" new file mode 100644 index 00000000..3dfb6055 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/.idea/workspace.xml" @@ -0,0 +1,732 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rollback + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1582356252096 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + spring_aop_tx + + + + + + + + 1.8 + + + + + + + + Maven: aopalliance:aopalliance:1.0 + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/pom.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/pom.xml" new file mode 100644 index 00000000..6f303969 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/pom.xml" @@ -0,0 +1,63 @@ + + + 4.0.0 + + com.mashibing + spring_aop_tx + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.48 + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/spring_aop_tx.iml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/spring_aop_tx.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/spring_aop_tx.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" new file mode 100644 index 00000000..4dffadb9 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" @@ -0,0 +1,41 @@ +package com.mashibing.dao; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class BookDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 减去某个用户的余额 + * @param userName + * @param price + */ + public void updateBalance(String userName,int price){ + String sql = "update account set balance=balance-? where username=?"; + jdbcTemplate.update(sql,price,userName); + } + + /** + * 按照图书的id来获取图书的价格 + * @param id + * @return + */ + public int getPrice(int id){ + String sql = "select price from book where id=?"; + return jdbcTemplate.queryForObject(sql,Integer.class,id); + } + + /** + * 减库存,减去某本书的库存 + * @param id + */ + public void updateStock(int id){ + String sql = "update book_stock set stock=stock-1 where id=?"; + jdbcTemplate.update(sql,id); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" new file mode 100644 index 00000000..8d8d8aac --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" @@ -0,0 +1,19 @@ +package com.mashibing.dao; + +import com.mashibing.entity.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class EmpDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public void save(Emp emp){ + String sql = "insert into emp(empno,ename) values(?,?)"; + int update = jdbcTemplate.update(sql, emp.getEmpno(), emp.getEname()); + System.out.println(update); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" new file mode 100644 index 00000000..41df701e --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" @@ -0,0 +1,101 @@ +package com.mashibing.entity; + +import java.sql.Date; + +public class Emp { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; + + public Emp() { + } + + public Emp(Integer empno, String ename) { + this.empno = empno; + this.ename = ename; + } + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", deptno=" + deptno + + '}'; + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" new file mode 100644 index 00000000..52e3b777 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" @@ -0,0 +1,41 @@ +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import com.mashibing.entity.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + private BookDao bookDao; + + /* + * propagation:传播特性:表示不同的事务之间执行的关系 + * isolation:隔离级别:4种隔离级别,会引发不同的数据错乱问题 + * timeout:超时时间, + * readonly:只读事务:如果配置了只读事务,那么在事务运行期间,不允许对数据进行修改,否则抛出异常 + * + * 设置哪些异常不会回滚数据 + * noRollBackfor: noRollbackFor = {ArithmeticException.class} + * noRollbackForClassName: + * + * 设置哪些异常回滚 + * rollBackfor: + * rollbackForClassName + * */ + @Transactional(isolation = Isolation.SERIALIZABLE) + public void buyBook() throws FileNotFoundException { + bookDao.getPrice(1); + bookDao.updateBalance("zhangsan", 100); + bookDao.updateStock(1); +// int i = 1/0; + new FileInputStream("aaa.txt"); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/resources/applicationContext.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/resources/applicationContext.xml" new file mode 100644 index 00000000..9d1a5c9d --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/resources/applicationContext.xml" @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/resources/db.properties" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/resources/db.properties" new file mode 100644 index 00000000..6a5136c5 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://localhost:3306/tx +jdbc.driverName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/test/java/MyTest.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/test/java/MyTest.java" new file mode 100644 index 00000000..58c76173 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/test/java/MyTest.java" @@ -0,0 +1,85 @@ +import com.alibaba.druid.pool.DruidDataSource; +import com.mashibing.dao.EmpDao; +import com.mashibing.entity.Emp; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class MyTest { + + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + @Test + public void test01() throws SQLException { + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource.getConnection()); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + System.out.println(jdbcTemplate); + } + + @Test + public void test02(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + int zhangsan = jdbcTemplate.update(sql, 1111, "zhangsan"); + System.out.println(zhangsan); + } + + @Test + public void test03(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + List list = new ArrayList(); + list.add(new Object[]{2222,"lisi"}); + list.add(new Object[]{3333,"wangwu"}); + list.add(new Object[]{4444,"maliu"}); + int[] result = jdbcTemplate.batchUpdate(sql,list); + for (int i : result) { + System.out.println(i); + } + } + + @Test + public void test04(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "delete from emp where empno = ?"; + int zhangsan = jdbcTemplate.update(sql, 1111); + System.out.println(zhangsan); + } + + @Test + public void test05(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "update emp set ename=? where empno=?"; + int zhangsan = jdbcTemplate.update(sql, "mashibing",2222); + System.out.println(zhangsan); + } + + @Test + public void test06(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where empno=?"; + Emp result = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Emp.class),7369); + System.out.println(result); + } + + @Test + public void test07(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where sal >?"; + List result = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Emp.class),1500); + for (Emp emp : result) { + System.out.println(emp); + } + } + + @Test + public void test08(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + empDao.save(new Emp(1111,"zhangsan")); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/test/java/MyTest2.java" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/test/java/MyTest2.java" new file mode 100644 index 00000000..5cc5db54 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/src/test/java/MyTest2.java" @@ -0,0 +1,15 @@ +import com.mashibing.service.BookService; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.FileNotFoundException; + +public class MyTest2 { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + + @Test + public void test01() throws FileNotFoundException { + BookService bean = context.getBean(BookService.class); + bean.buyBook(); + } +} diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/applicationContext.xml" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/applicationContext.xml" new file mode 100644 index 00000000..9d1a5c9d --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/applicationContext.xml" @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" new file mode 100644 index 00000000..f376e8f1 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..54e52506 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" new file mode 100644 index 00000000..b3fcbd13 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" new file mode 100644 index 00000000..573d270f Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/db.properties" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/db.properties" new file mode 100644 index 00000000..6a5136c5 --- /dev/null +++ "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/classes/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://localhost:3306/tx +jdbc.driverName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/test-classes/MyTest.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/test-classes/MyTest.class" new file mode 100644 index 00000000..79b48829 Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/test-classes/MyTest.class" differ diff --git "a/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/test-classes/MyTest2.class" "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/test-classes/MyTest2.class" new file mode 100644 index 00000000..5423dd1c Binary files /dev/null and "b/javaframework/spring/07SpringAOP\347\232\204\350\257\246\347\273\206\350\256\262\350\247\2432/spring_aop_tx/target/test-classes/MyTest2.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/05Spring AOP\347\232\204\351\253\230\347\272\247\345\272\224\347\224\250.md" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/05Spring AOP\347\232\204\351\253\230\347\272\247\345\272\224\347\224\250.md" new file mode 100644 index 00000000..82070cfc --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/05Spring AOP\347\232\204\351\253\230\347\272\247\345\272\224\347\224\250.md" @@ -0,0 +1,1377 @@ +# 05Spring AOP的应用配置 + +### 1、Spring JdbcTemplate + +​ 在spring中为了更加方便的操作JDBC,在JDBC的基础之上定义了一个抽象层,此设计的目的是为不同类型的JDBC操作提供模板方法,每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务,通过这种方式,可以尽可能保留灵活性,将数据库存取的工作量讲到最低。 + +##### 1、配置并测试数据源 + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + spring_demo + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.47 + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + + +``` + +dbconfig.properties + +```properties +jdbc.username=root123 +password=123456 +url=jdbc:mysql://localhost:3306/demo +driverClassName=com.mysql.jdbc.Driver +``` + +applicationContext.xml + +```xml + + + + + + + + + + +``` + +MyTest.java + +```java +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource); + System.out.println(dataSource.getConnection()); + } +} +``` + +##### 2、给spring容器添加JdbcTemplate + +​ spring容器提供了一个JdbcTemplate类,用来方便操作数据库。 + +1、添加pom依赖 + +pom.xml + +```xml + + + org.springframework + spring-orm + 5.2.3.RELEASE + +``` + +jdbcTemplate.xml + +```xml + + + + + + + + + + + + + +``` + +MyTest.java + +```java +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + System.out.println(jdbcTemplate); + } +} +``` + +##### 3、插入数据 + +MyTest.java + +```java +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + int result = jdbcTemplate.update(sql, 1111, "zhangsan"); + System.out.println(result); + } +} +``` + +##### 4、批量插入数据 + +MyTest.java + +```java +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + List list = new ArrayList(); + list.add(new Object[]{1,"zhangsan1"}); + list.add(new Object[]{2,"zhangsan2"}); + list.add(new Object[]{3,"zhangsan3"}); + int[] result = jdbcTemplate.batchUpdate(sql, list); + for (int i : result) { + System.out.println(i); + } + } +} +``` + +##### 5、查询某个值,并以对象的方式返回 + +MyTest.java + +```java +import com.mashibing.bean.Emp; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where empno = ?"; + Emp emp = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Emp.class), 7369); + System.out.println(emp); + } +} +``` + +##### 6、查询返回集合对象 + +MyTest.java + +```java +import com.mashibing.bean.Emp; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import java.sql.SQLException; +import java.util.List; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where sal > ?"; + List query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Emp.class), 1500); + for (Emp emp : query) { + System.out.println(emp); + } + } +} +``` + +##### 7、返回组合函数的值 + +MyTest.java + +```java +import com.mashibing.bean.Emp; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import java.sql.SQLException; +import java.util.List; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select max(sal) from emp"; + Double aDouble = jdbcTemplate.queryForObject(sql, Double.class); + System.out.println(aDouble); + } +} +``` + +##### 8、使用具备具名函数的JdbcTemplate + +jdbcTemplate.xml + +```xml + + + + + + + + + + + + + + + + +``` + +MyTest.java + +```java +import com.mashibing.bean.Emp; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + NamedParameterJdbcTemplate jdbcTemplate = context.getBean("namedParameterJdbcTemplate", NamedParameterJdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(:empno,:ename)"; + Map map = new HashMap<>(); + map.put("empno",2222); + map.put("ename","sili"); + int update = jdbcTemplate.update(sql, map); + System.out.println(update); + } +} +``` + +##### 9、整合EmpDao + +jdbcTemplate.xml + +```xml + +``` + +EmpDao.java + +```java +package com.mashibing.dao; + +import com.mashibing.bean.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; + +public class EmpDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public void save(Emp emp){ + String sql = "insert into emp(empno,ename) values(?,?)"; + int update = jdbcTemplate.update(sql, emp.getEmpno(), emp.getEname()); + System.out.println(update); + } +} +``` + +MyTest.java + +```java +import com.mashibing.bean.Emp; +import com.mashibing.dao.EmpDao; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + EmpDao empDao = context.getBean("empDao", EmpDao.class); + empDao.save(new Emp(3333,"wangwu")); + } +} +``` + +### 2、声明式事务 + +##### 1、环境准备 + +tx.sql + +```sql +/* +Navicat MySQL Data Transfer + +Source Server : localhost +Source Server Version : 50528 +Source Host : localhost:3306 +Source Database : tx + +Target Server Type : MYSQL +Target Server Version : 50528 +File Encoding : 65001 + +Date: 2020-02-13 19:19:32 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `account` +-- ---------------------------- +DROP TABLE IF EXISTS `account`; +CREATE TABLE `account` ( + `username` varchar(10) NOT NULL DEFAULT '', + `balance` double DEFAULT NULL, + PRIMARY KEY (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of account +-- ---------------------------- +INSERT INTO account VALUES ('lisi', '1000'); +INSERT INTO account VALUES ('zhangsan', '1000'); + +-- ---------------------------- +-- Table structure for `book` +-- ---------------------------- +DROP TABLE IF EXISTS `book`; +CREATE TABLE `book` ( + `id` int(10) NOT NULL, + `book_name` varchar(10) DEFAULT NULL, + `price` double DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of book +-- ---------------------------- +INSERT INTO book VALUES ('1', '西游记', '100'); +INSERT INTO book VALUES ('2', '水浒传', '100'); +INSERT INTO book VALUES ('3', '三国演义', '100'); +INSERT INTO book VALUES ('4', '红楼梦', '100'); + +-- ---------------------------- +-- Table structure for `book_stock` +-- ---------------------------- +DROP TABLE IF EXISTS `book_stock`; +CREATE TABLE `book_stock` ( + `id` int(255) NOT NULL DEFAULT '0', + `stock` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of book_stock +-- ---------------------------- +INSERT INTO book_stock VALUES ('1', '1000'); +INSERT INTO book_stock VALUES ('2', '1000'); +INSERT INTO book_stock VALUES ('3', '1000'); +INSERT INTO book_stock VALUES ('4', '1000'); + +``` + +BookDao.java + +```java +package com.mashibing.dao; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class BookDao { + + @Autowired + JdbcTemplate jdbcTemplate; + + /** + * 减去某个用户的余额 + * @param userName + * @param price + */ + public void updateBalance(String userName,int price){ + String sql = "update account set balance=balance-? where username=?"; + jdbcTemplate.update(sql,price,userName); + } + + /** + * 按照图书的id来获取图书的价格 + * @param id + * @return + */ + public int getPrice(int id){ + String sql = "select price from book where id=?"; + return jdbcTemplate.queryForObject(sql,Integer.class,id); + } + + /** + * 减库存,减去某本书的库存 + * @param id + */ + public void updateStock(int id){ + String sql = "update book_stock set stock=stock-1 where id=?"; + jdbcTemplate.update(sql,id); + } +} +``` + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + public void checkout(String username,int id){ + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } +} +``` + +MyTest.java + +```java +import com.mashibing.service.BookService; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import java.sql.SQLException; + +public class MyTest { + public static void main(String[] args) throws SQLException { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + BookService bookService = context.getBean("bookService", BookService.class); + bookService.checkout("zhangsan","1"); + } +} +``` + +总结:在事务控制方面,主要有两个分类: + +编程式事务:在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法 + +声明式事务:在方法的外部添加注解或者直接在配置文件中定义,将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。spring的AOP恰好可以完成此功能:事务管理代码的固定模式作为一种横切关注点,通过AOP方法模块化,进而实现声明式事务。 + +##### 2、声明式事务的简单配置 + +​ Spring从不同的事务管理API中抽象出了一整套事务管理机制,让事务管理代码从特定的事务技术中独立出来。开发人员通过配置的方式进行事务管理,而不必了解其底层是如何实现的。 + +​ Spring的核心事务管理抽象是PlatformTransactionManager。它为事务管理封装了一组独立于技术的方法。无论使用Spring的哪种事务管理策略(编程式或声明式),事务管理器都是必须的。 + +​ 事务管理器可以以普通的bean的形式声明在Spring IOC容器中。下图是spring提供的事务管理器 +![事务管理器](image\事务管理器.png) + +1、在配置文件中添加事务管理器 + +jdbcTemplate.xml + +```xml + + + + + + + + + + + + + + + + + + + + + +``` + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional + public void checkout(String username,int id){ + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } +} +``` + +##### 3、事务配置的属性 + +​ isolation:设置事务的隔离级别 + +​ propagation:事务的传播行为 + +​ noRollbackFor:那些异常事务可以不回滚 + +​ noRollbackForClassName:填写的参数是全类名 + +​ rollbackFor:哪些异常事务需要回滚 + +​ rollbackForClassName:填写的参数是全类名 + +​ readOnly:设置事务是否为只读事务 + +​ timeout:事务超出指定执行时长后自动终止并回滚,单位是秒 + +##### 4、测试超时属性 + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(timeout = 3) + public void checkout(String username,int id){ + + bookDao.updateStock(id); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } +} +``` + +##### 5、设置事务只读 + +​ 如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性; + +​ 如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持。 + +​ 对于只读查询,可以指定事务类型为readonly,即只读事务。由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段 + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(timeout = 3,readOnly = true) + public void checkout(String username,int id){ + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } +} +``` + +##### 6、设置哪些异常不回滚 + +​ 注意:运行时异常默认回滚,编译时异常默认不回滚 + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(timeout = 3,noRollbackFor = {ArithmeticException.class,NullPointerException.class}) + public void checkout(String username,int id){ + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + int i = 1/0; + } + + @Transactional(timeout = 3,noRollbackForClassName = {"java.lang.ArithmeticException"}) + public void checkout(String username,int id){ + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + int i = 1/0; + } +} +``` + +##### 7、设置哪些异常回滚 + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(timeout = 3,rollbackFor = {FileNotFoundException.class}) + public void checkout(String username,int id) throws FileNotFoundException { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); +// int i = 1/0; + new FileInputStream("aaa.txt"); + } +} +``` + +##### 8、设置隔离级别 + +​ 隔离级别没有接触的同学可以看我之前的事务视频,里面有详细讲解,此处不再赘述。 + +BookService.java + +```java +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(timeout = 3,isolation = Isolation.READ_COMMITTED) + public void checkout(String username,int id) throws FileNotFoundException { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); +// int i = 1/0; + new FileInputStream("aaa.txt"); + } +} +``` + +##### 9、事务的传播特性 + +事务的传播特性指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行? + +spring的事务传播行为一共有7种: + +![传播特性](E:\lian\spring\image\传播特性.jpg) + +##### 10、测试事务的传播特性 + +BookDao.java + +```java +package com.mashibing.dao; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class BookDao { + + @Autowired + JdbcTemplate jdbcTemplate; + + /** + * 减去某个用户的余额 + * @param userName + * @param price + */ + public void updateBalance(String userName,int price){ + String sql = "update account set balance=balance-? where username=?"; + jdbcTemplate.update(sql,price,userName); + } + + /** + * 按照图书的id来获取图书的价格 + * @param id + * @return + */ + public int getPrice(int id){ + String sql = "select price from book where id=?"; + return jdbcTemplate.queryForObject(sql,Integer.class,id); + } + + /** + * 减库存,减去某本书的库存 + * @param id + */ + public void updateStock(int id){ + String sql = "update book_stock set stock=stock-1 where id=?"; + jdbcTemplate.update(sql,id); + } + + /** + * 修改图书价格 + * @param id + * @param price + */ + public void updatePrice(int id,int price){ + String sql = "update book set price=? where id =?"; + jdbcTemplate.update(sql,price,id); + } +} +``` + +BookService.java + +```java +package com.mashibing.service; + + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Service; + import org.springframework.transaction.annotation.Isolation; + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + import java.io.File; + import java.io.FileInputStream; + import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(propagation = Propagation.REQUIRED) + public void checkout(String username,int id) { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } + + @Transactional(propagation = Propagation.REQUIRED) + public void updatePrice(int id,int price){ + bookDao.updatePrice(id,price); + int i = 1/0; + } +} +``` + +MulService.java + +```java +package com.mashibing.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MulService { + + @Autowired + private BookService bookService; + + @Transactional + public void mulTx(){ + bookService.checkout("zhangsan",1); + bookService.updatePrice(1,1000); + } +} +``` + +MyTest.java + +```java +import com.mashibing.service.MulService; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class MyTest { + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("jdbcTemplate.xml"); + MulService mulService = context.getBean("mulService", MulService.class); + mulService.mulTx(); + } +} +``` + +​ 通过上图的结果发现,如果设置的传播特性是Required,那么所有的事务都会统一成一个事务,一旦发生错误,所有的数据都要进行回滚。 + +------ + +BookService.java + +```java +package com.mashibing.service; + + import com.mashibing.dao.BookDao; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Service; + import org.springframework.transaction.annotation.Isolation; + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + import java.io.File; + import java.io.FileInputStream; + import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void checkout(String username,int id) { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } + + @Transactional(propagation = Propagation.REQUIRED) + public void updatePrice(int id,int price){ + bookDao.updatePrice(id,price); + int i = 1/0; + } +} +``` + +​ 通过修改checkout方法的传播特性为Required_new,发现价格进行了回滚,而其他的数据没有进行回滚。 + +------ + +BookService.java + +```java +package com.mashibing.service; + + import com.mashibing.dao.BookDao; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Service; + import org.springframework.transaction.annotation.Isolation; + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + import java.io.File; + import java.io.FileInputStream; + import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(propagation = Propagation.REQUIRED) + public void checkout(String username,int id) { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } + + @Transactional(propagation = Propagation.REQUIRED) + public void updatePrice(int id,int price){ + bookDao.updatePrice(id,price); + } +} +``` + +MulService.java + +```java +package com.mashibing.service; + +import com.mashibing.bean.Book; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MulService { + + @Autowired + private BookService bookService; + + @Transactional + public void mulTx(){ + bookService.checkout("zhangsan",1); + bookService.updatePrice(1,1000); + int i = 1/0; + } +} +``` + +​ 将bookservice方法的传播行为为Required,并且将报错设置在MulService中,发现会都进行回滚。 + +------ + +BookService.java + +```java +package com.mashibing.service; + + import com.mashibing.dao.BookDao; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Service; + import org.springframework.transaction.annotation.Isolation; + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + import java.io.File; + import java.io.FileInputStream; + import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void checkout(String username,int id) { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void updatePrice(int id,int price){ + bookDao.updatePrice(id,price); + } +} +``` + +MulService.java + +```java +package com.mashibing.service; + +import com.mashibing.bean.Book; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MulService { + + @Autowired + private BookService bookService; + + @Transactional + public void mulTx(){ + bookService.checkout("zhangsan",1); + bookService.updatePrice(1,1000); + int i = 1/0; + } +} +``` + +​ 将bookservice方法的传播行为为Requires_new,并且将报错设置在MulService中,发现都不会进行回滚。 + +------ + +BookService.java + +```java +package com.mashibing.service; + + import com.mashibing.dao.BookDao; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Service; + import org.springframework.transaction.annotation.Isolation; + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + import java.io.File; + import java.io.FileInputStream; + import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + BookDao bookDao; + + /** + * 结账:传入哪个用户买了哪本书 + * @param username + * @param id + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void checkout(String username,int id) { + + bookDao.updateStock(id); + int price = bookDao.getPrice(id); + bookDao.updateBalance(username,price); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void updatePrice(int id,int price){ + bookDao.updatePrice(id,price); + } + + @Transactional + public void mulTx(){ + checkout("zhangsan",1); + updatePrice(1,1000); + int i = 1/0; + } +} +``` + +​ 如果在bookservice执行的话,会发现刚刚的效果就没有了,原因是外层调用的时候使用的AOP,但是本类方法自己的调用就是最最普通的调用,就是同一个事务。 + +总结: + +```tex +1、事务传播级别是REQUIRED,当checkout()被调用时(假定被另一类中commit()调用),如果checkout()中的代码抛出异常,即便被捕获,commit()中的其他代码都会roll back + +2、是REQUIRES_NEW,如果checkout()中的代码抛出异常,并且被捕获,commit()中的其他代码不会roll back;如果commit()中的其他代码抛出异常,而且没有捕获,不会导致checkout()回滚 + +3、是NESTED,如果checkout()中的代码抛出异常,并且被捕获,commit()中的其他代码不会roll back;如果commit()中的其他代码抛出异常,而且没有捕获,会导致checkout()回滚 + + PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行. + 另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务, 它是已经存在事务的一个真正的子事务. 嵌套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交. + 由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 嵌套事务也会被 commit, 这个规则同样适用于 roll back. +``` + + + +### 3、基于xml的事务配置 + +jdbcTemplate.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/06Spring\345\216\237\347\220\206\350\256\262\350\247\243.md" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/06Spring\345\216\237\347\220\206\350\256\262\350\247\243.md" new file mode 100644 index 00000000..88f9ea80 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/06Spring\345\216\237\347\220\206\350\256\262\350\247\243.md" @@ -0,0 +1,253 @@ +# 06Spring原理讲解 + +### 1、什么是Spring框架,Spring框架主要包含哪些模块 + +​ Spring是一个开源框架,Spring是一个轻量级的Java 开发框架。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的full-stack(一站式) 轻量级开源框架。 + +主要包含的模块: + +![](image\spring-overview.png) + +### 2、Spring框架的优势 + +​ 1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发 + +​ 2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL + +​ 3、低侵入式设计,代码的污染极低 + +​ 4、独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺 + +​ 5、Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦 + +​ 6、Spring的AOP允许将一些通用任务如安全、事务、日志等进行集中式处理,从而提供了更好的复用 + +​ 7、Spring的ORM和DAO提供了与第三方持久层框架的的良好整合,并简化了底层的数据库访问 + +​ 8、Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部 + +### 3、IOC和DI是什么? + +​ 控制反转是就是应用本身不负责依赖对象的创建和维护,依赖对象的创建及维护是由外部容器负责的,这样控制权就有应用转移到了外部容器,控制权的转移就是控制反转。 + +​ 依赖注入是指:在程序运行期间,由外部容器动态地将依赖对象注入到组件中如:一般,通过构造函数注入或者setter注入。 + +### 4、描述下Spring IOC容器的初始化过程 + +​ Spring IOC容器的初始化简单的可以分为三个过程: + +​ 第一个过程是Resource资源定位。这个Resouce指的是BeanDefinition的资源定位。这个过程就是容器找数据的过程,就像水桶装水需要先找到水一样。 + +​ 第二个过程是BeanDefinition的载入过程。这个载入过程是把用户定义好的Bean表示成Ioc容器内部的数据结构,而这个容器内部的数据结构就是BeanDefition。 + +​ 第三个过程是向IOC容器注册这些BeanDefinition的过程,这个过程就是将前面的BeanDefition保存到HashMap中的过程。 + +### 5、BeanFactory 和 FactoryBean的区别? + +- **BeanFactory**是个Factory,也就是IOC容器或对象工厂,在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的,提供了实例化对象和拿对象的功能。 + + 使用场景: + + - 从Ioc容器中获取Bean(byName or byType) + - 检索Ioc容器中是否包含指定的Bean + - 判断Bean是否为单例 + +- **FactoryBean**是个Bean,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。 + + 使用场景 + - ProxyFactoryBean + + +### 6、BeanFactory和ApplicationContext的异同 + +![](image\ApplicationContext类图.png) + +相同: + +- Spring提供了两种不同的IOC 容器,一个是BeanFactory,另外一个是ApplicationContext,它们都是Java interface,ApplicationContext继承于BeanFactory(ApplicationContext继承ListableBeanFactory。 +- 它们都可以用来配置XML属性,也支持属性的自动注入。 +- 而ListableBeanFactory继承BeanFactory),BeanFactory 和 ApplicationContext 都提供了一种方式,使用getBean("bean name")获取bean。 + +不同: + +- 当你调用getBean()方法时,BeanFactory仅实例化bean,而ApplicationContext 在启动容器的时候实例化单例bean,不会等待调用getBean()方法时再实例化。 +- BeanFactory不支持国际化,即i18n,但ApplicationContext提供了对它的支持。 +- BeanFactory与ApplicationContext之间的另一个区别是能够将事件发布到注册为监听器的bean。 +- BeanFactory 的一个核心实现是XMLBeanFactory 而ApplicationContext 的一个核心实现是ClassPathXmlApplicationContext,Web容器的环境我们使用WebApplicationContext并且增加了getServletContext 方法。 +- 如果使用自动注入并使用BeanFactory,则需要使用API注册AutoWiredBeanPostProcessor,如果使用ApplicationContext,则可以使用XML进行配置。 +- 简而言之,BeanFactory提供基本的IOC和DI功能,而ApplicationContext提供高级功能,BeanFactory可用于测试和非生产使用,但ApplicationContext是功能更丰富的容器实现,应该优于BeanFactory + +### 7、Spring Bean 的生命周期? + +![](image\bean生命周期.png) + +总结: + +**(1)实例化Bean:** + +对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。 + +**(2)设置对象属性(依赖注入):** + +实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。 + +**(3)处理Aware接口:** + +接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean: + +①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值; + +②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。 + +③如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文; + +**(4)BeanPostProcessor:** + +如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。 + +**(5)InitializingBean 与 init-method:** + +如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。 + +**(6)如果这个Bean实现了BeanPostProcessor接口**,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术; + +以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。 + +**(7)DisposableBean:** + +当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法; + +**(8)destroy-method:** + +最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。 + +### 8、Spring AOP的实现原理? + +​ Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。 + +​ Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。 + +​ 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。 + +### 9、Spring 是如何管理事务的? + +​ Spring事务管理主要包括3个接口,Spring的事务主要是由它们(**PlatformTransactionManager,TransactionDefinition,TransactionStatus**)三个共同完成的。 + +**1. PlatformTransactionManager**:事务管理器--主要用于平台相关事务的管理 + +主要有三个方法: + +- commit 事务提交; +- rollback 事务回滚; +- getTransaction 获取事务状态。 + +**2. TransactionDefinition**:事务定义信息--用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用 + +这个接口有下面四个主要方法: + +- getIsolationLevel:获取隔离级别; +- getPropagationBehavior:获取传播行为; +- getTimeout:获取超时时间; +- isReadOnly:是否只读(保存、更新、删除时属性变为false--可读写,查询时为true--只读) + +事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。 + +**3. TransactionStatus**:事务具体运行状态--事务管理过程中,每个时间点事务的状态信息。 + +例如它的几个方法: + +- hasSavepoint():返回这个事务内部是否包含一个保存点, +- isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚 +- isNewTransaction():判断当前事务是否是一个新事务 + +**声明式事务的优缺点**: + +- **优点**:不需要在业务逻辑代码中编写事务相关代码,只需要在配置文件配置或使用注解(@Transaction),这种方式没有侵入性。 +- **缺点**:声明式事务的最细粒度作用于方法上,如果像代码块也有事务需求,只能变通下,将代码块变为方法。 + +### 10、Spring 的不同事务传播行为有哪些,干什么用的? + +![](image\传播特性.jpg) + +### 11、Spring 中用到了那些设计模式? + +- 代理模式—在AOP中被用的比较多。 +- 单例模式—在spring配置文件中定义的bean默认为单例模式。 +- 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 +- 工厂模式—BeanFactory用来创建对象的实例。 +- 适配器--spring aop +- 装饰器--spring data hashmapper +- 观察者-- spring 事件驱动模型 +- 回调--Spring Aware回调接口 + +### 12、Spring如何解决循环依赖? + +https://blog.csdn.net/qq_36381855/article/details/79752689 + +### 13、bean的作用域 + +(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。 + +(2)prototype:为每一个bean请求提供一个实例。 + +(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。 + +(4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。 + +### 14、Spring框架中有哪些不同类型的事件 + +(1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。 + +(2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。 + +(3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。 + +(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。 + +(5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。 + +### 15、Spring通知有哪些类型 + +(1)前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。 + +(2)返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 + +(3)抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。 + +(4)后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 + +(5)环绕通知(Around Advice):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 环绕通知是最常用的一种通知类型。 + +### 16、Spring的自动装配 + +在spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装载模式。 + +在Spring框架xml配置中共有5种自动装配: + +(1)no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。 + +(2)byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。 + +(3)byType:通过参数的数据类型进行自动装配。 + +(4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。 + +(5)autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。 + +基于注解的方式: + +使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,。在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean: + +如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据; + +如果查询的结果不止一个,那么@Autowired会根据名称来查找; + +如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。 + +@Autowired可用于:构造函数、成员变量、Setter方法 + +注:@Autowired和@Resource之间的区别 + +(1) @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。 + +(2) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。 \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/Spring IOC\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.png" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/Spring IOC\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.png" new file mode 100644 index 00000000..e56916e2 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/Spring IOC\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.png" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/Spring IOC\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.pos" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/Spring IOC\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.pos" new file mode 100644 index 00000000..226d4808 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/Spring IOC\347\232\204\345\210\235\345\247\213\345\214\226\350\277\207\347\250\213.pos" @@ -0,0 +1 @@ +{"diagram":{"image":{"height":3522,"pngdata":"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N75xba699oJsv/3Q7LLLwTnnnEPyhz/8MP/+9+Opra3Nk0/+LQsWzMnChfMyb97sTJr0VPr0GZibbvrRW9euWCnH00+PzhVXfDUf+tDp2WOPw1ebd8KEUWnWrCL33Xdjjj76C+9p7euLYhcAG4NiFwAAAAAAALBBVFVVrZ/n3jVNnYvF4imFQuGU5s2bp6qq6sYkHZL3XuxKkpkzp+Xyy7+Sk046P8OHX56+fQdnp532TllZWRYvXpSKiuYpFotvFbuWPpbxpZeezQc/eHJmzpyWTp16ZMiQg7Llln3TufOWadeuc9q27Zg2bdrlkUf+nHvuuSbbbbdbamtX3HTsf6644qv52Me+vsZS1/z5szNu3D/y5S//Mpdf/pW8//0npmXLNu95/e9Vq1b1GRS7ANhgytY+BAAAAAAAAIASW28luddeezGXXvrZzJr1ep599olMmvSv9O1blWTprl2LFy9IsvQxjElSXl6RRYvmZ/bs6enadau8+OK/07Nnv/Tvv0v23ffYDBgwNFts0SebbdYhhUJZhg79YE455XsZPfrulR7B+NprL+W6676TJDnrrCvWWOpKkr/97eb07z8kfftWZYcd9sx9992wvm4DADR4duwCAAAAAAAANogxY8YUSp2hoamqqnoiyZB1GPpGsVgcXigUbl20aNFfJ0yYsLiqquoDSTZfuHBeKioq39X8CxbMzSWXnJQPfvDk3H77r/LCC09niy22TW1tTaZNm5xiMWnXrnOSZPHiRSkvr0yhUJaXX56Yli03y4IFczNhwqj067d0CaeeOiTt23dZbo65c2fl8stH5ctfviybbdYhSTJ79ozceuvP889//iVDhhyUJOnde4c1Zp09e0buu++GnHHGL5IkRx75uVx88QnZa68j07nzFu9q/evL/Plzl718s5Q5AGjcFLsAAAAAAAAANp41PVVpapLbCoXCrZttttnDI0eOXPE5hm/mrWLXssLUO9WyZZt87WvXpHv3bTJ8+OU588xf5Z57rstLLz2bZ575Z7bddueUlTVLkixatCCVlUsfw9inz6Dsvvuh+f73T8r8+XNz3HFnJknKyyvzwx/es9wcX/jCHkmyXMYWLVqmVau2ueCCm1JZ2SKPPnrncuc8//yEPPPM6Bx66MlJkmKxmBtu+G522mnv9OkzKEnSpctW2WefD+W6676Ts8++ImVl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8XUUERERERGRpCmxS0REREREREREROQJ7Vv7M87pXKnQoHqCNoPBQK22jVnx9VxuXLxiUT2q7cdd2Tx/BTcuXCajR1Y6/6ePOQHK2c2Vw5t3sfa7hdjY2FCgdDEGzBiFvcO/SxAWKF2Mai3qs2XBSvb9tJUJWxdajTFv8UK06efNz4t+4pcNvpSpUZGmPTuwaPR0c5/3hvUlk0dWti9ey4rJc0mfNRONvNslOd8Tn3v/bmz5fgXXz/9z7sP6Uq1F/QRjpLRfYqydT0quRUqvb5t+3mTJ5cHuFRvZPH8Ftna2FChVjE9njqGoZ6kUxRnHxc2Vz7+fiO/SdRzZtpdN85YTEx1DhiwZKVS2BC5urs98zqTO873hH5MpezZ8l6xj1ZR5OLk6k/+NorTo9S4APy9aw6WTfzJiyTQMBgMFShWjequ3WDbJh+KVypEha6YUX0cRERERERGxzpDWAYjI81e+fHkTwPGNPmkdioiIiIiIPEMLVm1l+oI1GAyGr44fPz4kreORF0/c94MbNmxI61Beas2bNwfguM/G5zKf5wfNAPA5/nzmE0ktx3ccYPbn4xi9dg7Z8uR46n4i8mx94Bn79Sa1v76dvXKB98Z+QuHChZkyZUqqziUiIiIir4ZPPvmEixcvYjKZKp44ceJYWsfzPNmkdQAiIiIiIiIiIiIiIiIiIiIiIiJiSYldIiIiIiIiIiIiIiIiIiIiIiIiLxgldomIiIiIiIiIiIiIiIiIiIiIiLxg7NI6ABERERERERERERF59XnWr4bP8Y3PrJ+IiIiIiIjIq04Vu0RE2DhFNQAAIABJREFURERERERERERERERERERERF4wqtglIq+mHH+ldQQiIiIiz93t6wF42L6JAdu0DkVERERERERERERERJ6SKnaJiIiIiIi8IgJD/bkcthcTMWkdioiIiIiIiIiIiIiIPCUldomIiIiIiLxCAoPvKblLREREREREREREROQVoMQuERERERGRV4ySu0REREREREREREREXn5K7BIREREREXkFKblLREREREREREREROTlpsQuERERERGRV5SSu0REREREREREREREXl52aR2AiIiIiIiIpJ7A4HtcZi8FXGtiwDatwxERkafwgWeztA5BRERERERERESeI1XsEhERERERecWpcpeIyMvNs2jptA5BREReE/qaIyIiIiLyYlHFLhERERERkdeAKneJiLy8fAaOS+sQRF46nh/EVrg77rMxjSMREREREREReXKq2CUiIiIiIvKaUOUuEREREREREREREZGXhxK7REREREREXiNK7hIREREREREREREReTkosUtE5BkJC3uY1iGIiIiIpIiSu0REREREREREREREXnxK7BIR+YfRaKJ798Xm7bp1p2I0mlJ07M2bQTRu/B03bgRaHdvHZz/+/iGJtrVp45OieebN+4Xw8Mgk++zY8ac57vXrT7F//yWL9qioGGbP3p+i+VJbdLSRLVt+Jzj4QZL9du4899hjX70awGefrQbA3z+Ejh3nP1GMIiIiryold4mIiIiIiIiIiIiIvNjs0joAEZEXhclk4uTJ6+btoKAITCYTYEj22Jw501OnTlF8fc/RpUvlBO02Ngby5s2Et/dChg9vTLVqBS3mvXo1INk5LlzwZ926U3TvXjXJfp9/vpZ9+z7FxcWBDBlcGD16C6tWvU+6dI5AbGKXj89+PvywOgCenuOTnTu+sWNb0rBhCfO2p+d4bGwsr5HRaOLnn/uRObNrkmPNmbOf+fMP4u1dhb59a1ntN3LkZurWLQZAnTrfkCtXBov28+f9OXJksMW+HTv+JFOm2Pm3b/+TEiWyJ39yIiIir5nA4HtcZi8FXGtiwDatwxERERERERERERERkXiU2CUir72VK3/l7bfLJ9nn2LGr3L4dQrNmpTh16ga9ey9L0MdoNOHra8DHJ2E1rP37P6NRozfIkycjrq4OdOr0PXfuhFr0adBguvn19u39OH36Jn37LjfvCw+PxMnJntq1p1iNc8+eTyy2a9YszJIlmfn22z0MGfJWosccPDgwwT4vr0ksW9adfPkyJWizs0v4S9+tW/taJHGlJFls796LrFp1grlzO/PZZ6spXz4PVasWTPY4OztbFi/uarEv/rUDMJlgw4bTfPllU4xGE6tW/cr9+xEcPHg5wXgNGhTn00/rJTuviIjIq0rJXSIiIiIiIiIiIiIiLyYldonIa2/ChO1WE7tMJli69Bg+PvsZOrQhAGXK5GL//s/MfSpW/Ipt2/qRKZOL1TkuXPDn/Hl/mjYtBcCSJd3MbTExRipVmsD27f0sjildOqc5UevXX/9m4sTt/PCDNw4Oj/cL1379ajN9+m6io43Y2dkQFRWDvf2/Yzg4JP6lwN7e1mrb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SS72DgAAAAAAAAAAKFp1Q8LlW6myDDKoTrUwe8cB8P/s3Xd4lFXax/FveiAkSEiDQEJC70ikSBFEBFeKCCiI1HUpskhbG6tUKQuIgEgXpbcIhN5XDBtUMKAoTXqRQCIhSAshzLx/5J0hIWWehAmh/D7X5XVl5pznnPvc5wkDye15RCSdQJ8AygeXAqCoj38eRyMiIiLycFBhl4iIiIiIiIiIiMhjztHR0Xr6iaOjHuQgIiIPpxeq63HBIiIiIqmpsEtERERERETETjoPHM2B30/ldRiYzeYPqlev/kFexyF5z2w279i3b9/zeR1Hbug8eiAHTv2e12GIPJKW/ndtXocg8kgJK1OZWe+OyfZ1+qwSybkpK+fmdQgij5ScflaJiMjDT/9rloiIiIiIiIidPAxFXSKpOTg4NMzrGHKLflEuIiIPSvTvv+boOn1WiYjIg5LTzyoREXn46cQuERERERERETuLjo7O6xBECAsLy+sQHohZ0evyOgQREXmM9Qhrft9j6LNKRERykz0+q0RE5OGlE7tEREREREREREREREREREREREQeMirsEhEREREREREREREREREREREReciosEtEREREREREREREREREREREROQho8IuERERERERERERERERERERERGRh4wKu0RERERERERERERERERERERERB4yKuwSERERERERERERERERERERERF5yKiwS0RERERERERERERERERERERE5CGjwi4RERERERERERGRR9AP6//Lu0068U69tpw88Dv9n2/PzWvXDV1rtH92x81t0dui6BHWnNizMXkdSp5RDkRERERERJ4cznkdgIiIiIiIiIiIiIi9RG+LYuYHY6yv3fPno+wzlWn/Xk8KF/XP83hc3d3wDvClfK1qvNC+JX5BRXM0bkLsJeYOn0zD116m9suNKFGxNJ+smEG+Ah6Grg+pWCbD/pdiYvEsVBBXd7cs+9nLhVPnGN/9Q3qNG0Tppyumy5fFy2+1o1XvTrkSw4Nyb25FREREREREbFFhl4iIiIiIiIiIiDx2Bs4Yhbe/L7Fnz7N0/Ew+7zuMYeHTcHBwyLt4AvxISrzFxdPn+HHjDoa1+ydvvN+L+q82zfZ4pw8dw3TnDvVbv0RgyWAAPL2fytYY9/b/JXI3UweMYGTEbPyKF8m0n73cSU5m5vtjqNuyMaWfrpim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SjNzxowkyZwcWEnJwn+92ZwQ1tiXXy+3fezLYxZK/6VzpUzardExRUVFmTRufNqsuvI8/9StV69Gc7CgHr5xSD568930Pvagate1KFU1vx3WXC116tbNf558bp59b/77P2nVfqUs33yFGp3z2WEj0n+fY3PHRddm012654LhN2S3w/fPsssvV63jK7r/V1ypdZo0a2qeK1Eb8zy32vo+CNTcB2Peycnb7p//fvd9bZeywJbEMYwe8UyOLO6ZCZ+MWyLrBwBqlxW7AAAAAGABNWm+QjbZqXueHTYie5142DyrzMzRtMXsV5yN+sdD2Xbf3fPxW+/mqaGPVNj2nstvTFGdOmndvl1efPSpvDTymRxy1skVtm24bKPs2HfPbLvf7nlu+MgM/9sd2WzXbZMk/3nyubzy5L+zyc7d07xNy0waNyEP3TAka2zQtSzEsULL2SsJvfDwqHTbsjgdu3X5Sddjbm07tU+XjdbN0CtvyrJNlsvKa6yaV0Y9n1efer5cu9/uckh6HNQnOxy4x3z7m/zFhCTJjOnT895/3siwa2/Nxjt1T+Plm6Tx8k2y2W7b5h9X3JSSktKsten6mTl9Rt564ZWkNNnpkL1qNAfVMaee6VOnZdz7H+eZ+x/Ne6++mSP+9Juy69i8dYsq61qUqprf5Vdslh4H9ckD192RJFm/+2YpKS3Ji/98Ks8/MirHXnJGjc/5yE33ZOdD984mO3dfoEBTRff/wWeekKR619M8L555nlttfx+Emho94plce9qArNCyeS4YfkPq1K07T5vpU6fltF0OzffffJvz7r2uLKxcG74a/2WGXjU4Y54dne+//jaNlls22+7bM3sc07eszaRxE9KkWdM0aNRwvn117No5594zMMssV/WqnQvT0jCGhWVh1r+k3csAwIIR7AIAAACAn2D7A3rlxUefytZ77lRpm/ZrrpY+JxySf948NM8OG5l1t944ux2+f24+74p52u510mF56Ia78uk7H6RZ65bpe8bx2bLXDvOtoV79etmq907ZslePsm1tOrTL419MzKDfX5ip3/2Q5Vs0y3q/2CS9jzu4rE3Hdbpky1475KEbh+SpoQ/nzw8PXoArULmj//z73HbB1Rl87uWpW69uNtpx6+xxTN/c2P+vqVOnTiaNm5ApEyZlg202q7Kvvxw9O3xSp27dtGjXOjv23TM7HbJ3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t6SyZ8+skycDbYJdv/12TW5uLlqypJsxXom5c+eBOnVaoMuXg1S6tJe8vQtq4sTWKlDAQ8HBYfL2/jLJgNqrr9qGscLDo+Tv/6F27/5LjRuXMdqjomJsZi4zmy1q1crPeL5hw7vauvU9ff/977p8+W8NHdrg/8fjvFxd48Jad+e78QAAIABJREFUj3qSexpr376hcnFx0uXLQfrss80aM2azvvqqXZLnSo0rV+5p0KBVWrmylzHmSYXS6tSZavM6fZTFIm3efEIffthYknTkyGW9845vsuc3my367bdrGjKkQarqbdiwtBo2LK06daYar9U6daZqw4Z3JVmDhrGPH50x7XF+9gAA+Lc7ffq0Tp8+rQULFqh48eKqUaOGatSoofz586d1aUhCtCkq2e0eeXIbgZRCZYorMjxCO5auV7uBPeSUKeH7T4vFkmahqCcRe325C+ZT0ztBWvz5dAXf/ls5vDzTtJ5nKaV7/Lge5x7vXbtNfwfe1qs9Oz7TGv4JGW3s2w7sri/eGKR6nVqqeMWyz7QOAAAAAEDyCHYBAJCBlC2bR35+r6tgwRwKCAg0ZgBKzvbtAyRJt2+H6saNEFWsaJ1t6ciRyypZMreyZXOVt/eXNsfcuROq11//VpJ1xinJGhSLbZOsYTDJ+sfikJBwHTo07P/3s6hmzSk6duyqMmd21qFDw41j6tWbJkfHZ7dSdGyIacaMTjKbLfr8860KDAzRN990VIkSuZM9dv36PzR9+h61aVNBX33Vziak1avXEt27F7dc4rJlRxQVFaO2becabQcOnJcklSrlpV9/vSTJGsCqX/9rffBBIzk62mvkyCYqUyaPMmWK63v58qPy978iKenAWXyxAT3Jugzif/+7TRERUWrVyk9VqhQ2AkKSVKXKBJvnsf7665bKl89nPN+375z++uuWmjWbqYcPI40AUf36JTV8eKOnvqf29nYqUiSn+vSppUGDVststsje/sk/sAsJCdeVK/cS3ebjM0llysR9oBIWZjKWWZSkwMAQbd0aNxPbwYPndeNGiHx8iiokJFy//35NY8Zskr299RpatZpj7DtwYF01blxGf/55XaGhEerc2brcp8kUo1GjmtiE7FKjY8f5kqwzfcU+jr/MpfR4P3sAAGQk586d07lz57R48WIVKlRINWrUkK+vrwoWLPivCv48b/47DmjOiPH6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zvrrr5/11lsv3bt3F+aqgxHDP8ri3Wf+nvXGv1/OYl27pE37RbP0isumuEmTvPrkf9JthWUqve7t517N4t2XTNv/hbCKiorSe6N10nujdfLAVbfl7stuyNYH7F6YqWjGqSgrm15lHT8Mu9RFXevrtnyPFBUV5c1hL6frcj0q7dd1+WVSVFSUr0aNSe+N1qn2WDX1r7a+V6V8lrRPXWp46z+vZPwX43LYhf+XpXr1TJK89MgztQ1RnQ1/5c0a269pDGeo6hz/mGuoJhvstEUeufEf+eTt9/Pio89kr5NmLind+X/X79jPPi/UPquqrvGOS3ZOm/aLGvu5HPsZxnz6eVq2aVXjNQ8AAMC859MeAGhEysuTM854IC1aNMvAgX0L2/fbr1/KyyuWMmzevFmaNCnOhhsulwceOCRt2zbP2mufV5h9aVYzZmK66KLdCtsGDFgxgwc/lltv3T9JstVWlyZJPvzwy0pBmK22ujSrrLJEYXan6pSUNEnXru0ybtykwnKRG264XDbccLnCPnff/VqGDfsoTz45PJtvvmKWWqp99t57ndlm5Zq1nprcfPN+ad++Za37VeeHgZ+DD741HTu2ynvvjcmQIb9Mhw61tz116vT84hd/q/b5adPK8sgj76Rjx5aZNKm00ixXTz55VJWvOfTQ2WcfGz16Qk44YWhuvHHfwpKOs+rQoWXefXdMnnvu49x++wEpKyvPOec8nPLy8uy8c59ceOG/cthhG+W3v705Z5+9Q3r16lxr36o6pzXp1Kl1NtusV84666Gcfvq26dmzU95+e3SGDHkme+9d8cHLqFHfZMyYiVl11SWz1FLtU1o6LeXlFR9uzAhLvfrqiKy4Ype0bds8xx//8/z5z49WebwfBrNuuWX/WmuszQ479M6QIU+nd+9u6d69fZ1fV1ZWnjFjJmT//W8sbPv++6mVruNDDtkw22232o++9wCgMVl++eWz3nrrpV+/funadfYZd6jZ3y+6NkXFxencvWtefOTpvPzYs9nn1COTJG07ts/P99o5911ZsRx1n43WTVl5WV7859N5/uGncsjgk5Ik7774ej5958OsuNbqKU95Pn5reFot2ibNW82c5bbdYh2TJC889FRWXb9vlll19plMf6y61tdxicWz3vYDMvTyG9O0WdOstHafTPx6QsZ+9nn67/jzrLvNJrnr4utSVlae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RrALAAAAAAAAAACggRHsAgAAAAAAAAAAaGAEuwAAAAAAAAAAABoYwS4AAAAAAAAAAIAGRrALAAAAAAAAAACggRHsAgAAAAAAAAAAaGAEuwAAAAAAAAAAABoYwS4AYJ769tspKSsrr+8yAAAAAAAAABZogl0AMJ989dV3efnlz+bLscrLky+//DbPPfdxPvlk3GzPf/31pLzxxud5//0vqnz9VVf9O5MmlVbbfllZeY466s68/fbo2Z478cShufzyp+a8+CqMGTMxW299WaWaPv74q+y//w3z9DgwP7muAaDx+ujN93LkJgMz+dvv5vuxX3r02fy277YZ+9mo+X5swD0IAADAvNW0vgsAgIXF2LETc/zx/8hJJ22VjTdePmutdW6WXHLRJBVBqeLiosK+EydOyeOPH5HS0mnp1+/Pad16kUptffvtlErbvv12Sp5//vdp0qQ4u+32t4wfPznt2rVI585tsummvbL00h2y665XZtKk0kydWpa2bZtnscVap3//ZbPccotVanv48LEZOvT17L//etX2pbi4KLvuukYOO+z2nHnmdll33WUKz/3hD1vkoINuyV57rZO2bZvP9tq+fc/J4ou3SZKMHz8pw4Ydl379BqVdu5az9P/7PPPMMYXH99773/Tu3TUtW5YUtj3xxPCsvnq32dr/738/z777Xl+oc+WVl8hpp22THj06VtufeWXWY8+w7LKdcvvtv/7Jjz23Zq29qChp165lNtxwuRx11KZp02b287igHa8hWlCuawDgx1tmlRVyxt+HpEXrVvVdyhx76dFn89fjzy48bt6yRXr9bLUMPO7AdFyyc73XM8PWB+yeHQ/Za67b/2rU2LRpv2hKmi9S+87z0A/71bSkWRZfaomsv/3m2eyXO6S4eN5+L7eqfs7vGhqb0R+PyKDf/CEHnXdCll9jlfouZzaN8d554o7786/b78/xVw9KyzYL7r+zAAAAdSHYBQDzyUordcmgQTvnlltezMYbL582bZpn6NCDkiSbb35xHnnksMK+m256YeHn4uKiPPnkUYXH06eXZe21z6u0rW/fcwo/jx8/uVJbM3zxxbf517+OrBQgSyoCI4ceelvh8aRJpWnevFk23vgv1fblySePyvrrL5vzztspbdoskn79BlV6vrw82WKLiwuPDzxwg+y777pJkpKSJnnwwd8lSaXXzdiW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WX/9VbP88vVyzDHb5I9/fCBNmjTIscf2L4zbb78bkyQtWjRKnz4b5d13x3yvOSgt9aMtJMnQR69K5pQufCA10s33Pporb74/JSUlfx06dOifqrseis/GG29cniQDBgyo7lIW26BBg9K3b9+FjvvmUoxdu3bNCitULNvWr1+/hZzJD62k1jeX9a4I15WXVz12QV4a+FTmzpmTQTfdk0E33VPp2KuPP5d9Tjoy9ZarHGSpVavycuKzvvoqSSp1Olqccd82a+asJEntOvN39fpq2vScf8DxadFq9fT45R5p0WrVjBw2Ijeeful3XvPbysoqugXXKpl/GfhC/d9aNn1R5rvZai2r7E61xe475Mk7H8qH//duJowdn7KyuenSa9uKWubOTZL8+q+npEWr1eY7d8UWKy12HQtTu06dbLvXznn2noezzS965aUBT+aQM0+ocmzVuc3FvGEVluQ916lbJ3+4/q/5v+deyXP3DcpfDjox2+2760KX+Vzcua5TWrfweV6gq6oA4awZFX+2S6sIfQEAAFDcfPsFACy1ll++Xm644YC0bt0sffs+l6uu2ic33/zvDB8+Nq+8MiobbrhGav/vy44ZM2alXr2Kv/TeYIPVsvPOHXPwwbdm6tSZOf747kmS0tLalZYOTJKuXS9OkkKoK0kaNKibxo3r55//PCz169fNgAH/r9I5w4Z9lpdfHpk11lgxZ5wxMFts0TozZ87Jvfe+kXvvfWO+55gxY1aeeWZEWrRonI03XiPbb98uzz33ftZYY8W8/vonef31T3LXXYfmxBPvy4QJ05JUBNVeeWVkbrzxwBx88K1Vzs/06bMKoakkmTRpRvbb78bss0/n7LHHBpXGfvu5O3e+MAMHHl2YvwW56KI9KgWqpk+fld/97p6sv37FlxB33HFIateulcce+086dVo15eXJXXcdWhjfu/c1GTjw6CQVSzu2aNEoTZrUX+w5EOoCgGVbnTp1stFGG2WLLbbIZpttluWX/+5OpBSfeeGcsrK5lfa/+OATab3+etnvD7+utP/TESNzyzmX59XHn82We+z4rWMfpfmaqxa2337p9ay8Wsv5OkYt6rhvW33dtVJSUpJhQ17PauusVenYiDeGZeL4CTn28rMKyxoOfeKFRX7eeVqt1ya1atfOm8/+O6u3XbvSsf+8/Gaar7lqGjdd4TvrXByrrbNW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b7jh39lrr3Xz8MNjcuON+xW+1p9/PiPbb39F+vdfPkny7LPv5oornsjf/75Xttqq7vfA/Hj9NKzXz5Ahe9QZw4J57r6Lksrybx9IgzH01vty4dDbU1JScsZz81qvlkVe7969q5Nk+PDh9V3K9/b000/n1FNP/dZxJSUl6d69e/r375/+/ftnySVrwjJDhw79kSuE766k9Kth+poA4tc/SNGocaP8/soz8vLIURl52735y55HZqNdt8ouRx3wnedq13GptO+0dA444/9y4i6/yaj7Hsvamw1M1ZyagP+BZ/wpHbp0rFNnmw5LLND1NCpvXHi8IHOWNfp+1zY30FUxc1ad+Su+qPkdq3weoS8AAAAoVoJdACySWrZskiFD9kjXru1yySUjc9FFu2To0KczZsz4jBr1btZYo1PKymr+UPzFFxVp0qTmj9G9enXM5pv3zF57Dcu0abNy+OEbJknKy8vqLJHWr99ZSVIIdSVJs2aN07p109x0035p2rRxhg9/pdYxr732cZ555p106tQmxx8/IgMGdM2sWZW59dYXcuutL9S5ji++qMgjj4xNhw6t07t3p/z8590ycuQb6dSpTZ5//v08//z7ueGGfXPkkbdl4sTpSWoCGqNGvZOrrvrlt4Z59txz3UyYMDUVFZUpLS1J48Y1S7wttlizQuBkrj59Ts999/0mSyyxYMsFfpvPP5+RxRdvVnj+2WfT8tRTvy88n3t/F9SUKV9kxRWXzA037Jvky6XkdtvtqnmOnzGjota+yZO/yG67XZVddumTbbftVWvs17/2ffqcnhEjDi58D33VTjutmYsvHpnXX/84Q4b8cp7nbt26aVq3nvebDXNDXfPbvtxyS/zg3wfzMvfrP3v2nPTrd1Yef/zING365Zs2ffqcnsceOyLNm9cNlDz//Pt59dWPcvrp26Rlyya5+OLHcuSRP091dXLqqfdlhx3WzNJL13ShWnPNTrnkkl0LXakWxD//Odrrp4G+fgBgQZWWlma11VbLgAEDsu6666ZNmzb1XRL8oEpKStJr4DrpNXCd3DPkptx5yTXZfL9d0qrNgv/c/FVLL98pA7beOLeeNyS9frZOOq60fEpKSvLZx+PTa+A6P0jNCzrn97m2Dp2XSZJ88v5H6dSta61949/7KM1btfif7xEAAADUB8EuABZZXbu2KzwuLS3Jvvv2y1tv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LXCw64wzHsghhwzMRx9NzsMPj8l++/VLknz88eT85S/351//eis/+9mKqaysKhzz2WfTc+ihN2fgwBXTs+eXy6zss0+/LLvs4unQoVWd83z++Ywcd9yInHbaNmndummt8NfAgecWng8adGHh8Zw5NecsL29U6/ndd7+affftV2v+ysqqNG5cVue806bNypJLtqoV6qqoqMx55z2Se+99LbNnz8nPflYTupv79Rg16p2cd94jefPNCWnfvlWOPnqz9Ou3fGGZx0su2TXnn/9I3nrr03Tu3DYnnrhFundfaoHuNwCwaJkzZ05eeOGFvPDCC7n00kvTs2fP9OvXL/37988SS1gqmh/frecOyeN33J9djvpVVli9e958+fXcev7VtcbcN/SW3D/s9ux0xH5ZftVuGf/uh7nutEvyxdRp2euEwzPunQ9y6e9OyQY7b5G9TzwiX0ybnvHvflQ4/pQ7/5bX/vVcbjjzspolEZdqX6eOu/92Y3Y4bJ80X6xVGjdpnHuvviX/uPTabLHfLvnFnw5JdXV1Rt33WC7/42nZ87jDst62m6THur3z7wcerxXsevruh9O2Q7v07Ndnntf7/pi38sA1d2TLX+2W8qZNFvgak2T0sy9n5d6rZpuD90hlxexce+pFueL/zsip//hbrXPceck12faQX6ZReeMMOe6cXH3CuTnptsu+8T5N+uSzfPzWe9liv13q1Nx97TXyr+EPJkmaNm+Wpbp0TFkjfy4HAACguPhNFQBokMrKSnPCCZsnqQlmzQ1tnXHGA3nssSPqjJ+73GDyZceurz4fNGiVNGtWXtj217/uMM/zfn2Jxq+qrq75f0XFnLz11me5+OLH8sknUzNkyB6ZOHFGrrjiydx118vZdNMeGTHi4Dz2WM0yi7vt1jc779wnJSUlWWutLrnyyn/lrrteKcz76afT5nlNSXLbbS9m6tSZOf/8R5IkV1yxe4455q68++7EzJhRkT32GJqkpmPXtznmmM3y178+lDlzqrPBBislqQl9zQ2AzTVx4oxcc82o7LXXOrW2n3LKffngg0m58cb90qRJo/zpT//IOec8VPg6TZ9ekWOPHZwVV2yXCy98LKeddn/uuuugwvG33/5iLrhgp5SXN8qxxw7PySffm+uvr93RDKitz2a/qe8SqCfV1dV/7N279x/ruw6K11ZbbVXfJfxkqqqq8sorr+SVV17JFVdckZVXXjnrrbdefZdFAzZt0pQ8cvPd2faQX2a9bTdNkizdtXMmTZiYuy67LkkyfcrUDL/8hux3yu/S++cDasYs3ymTJnyWm87+W3b/v0MycdyEVFVVZfX1107HFbokSVbs9eWyge07LZ33l2iT5MslEb9u/e03S8/+fb485xXXZ/A+O2WrA3cvjOm8ygqZNGFi/nHptVlv202y/rab5LI/nJbx736YDl06FsJf/bcelJKvdeP9804Hp7o6mVNZma6rr5KV+6xa2Lcg19i4SXk23av271Yb7bZ1rjnlwkyaMDGLL9m2sH2TPbfPKmvXfNhmo122zC3nDsnUzyd/4336+O33kyRLLbdsnXvTocsymfr55EyfPDUdunTM7644rc4YAAAAqG+CXQDAImX69Fm1Qlzzss46y+Wii778RPeRR96Whx/+b84558G0aVOzLMeUKTMzc+bsPPHE72odO7+AVVLTxWrQoAtSXl6WESMOzllnPZjll18iK6/cPmef/WBWXrlD7rrroLRq1TRJsuuufbLFFj1z5ZX/yvvvf54uXdrmiCM2yvXXP5t77/11Yd711junVujsq7bZZvVsuOHKKSsryb77XpskOfXUrZPUhNCuvXbvJMnjj79R59iv36fS0pJsv/0aOfjgG9O9e4d06NA6lZVVKS//smPX+uv/NUnSuXObtG7drLAU4+efz8g997ya66/ft9BZbI891sqf/nRXIdi14YYrZ+bM2XnzzU/TsmWTfPjhpFody37zm4Fp165l4d4cdtjNlnoEAL6zkpKSlJT4+YEfz3uj38ycysr0WHfNWtuXXr5z4fE7r43N7IqKXHnMWcmxZxe2V1dVZ05lZSZ/+nlW7rNaVlyjRy464qSsM3iDbLDj5unSY6XvVEvX1Vapdc7KitlZc6N+dcb17LdmRt33aCZNmJheA9dJqzaL5d//fDxb7L9r3njhtUwcPyEDthlU57jfnHdC2i61ZGbN+CJvvTImFx1+UtbfdtPs8Nt9Fuga23XskMmfTsyjt9yTt18dkwkfjMvEcROSJBUzZ9U619zQVpK0XWrJJMnM6TO+8T7NnFHzAZYmzZrWqb1J8+aFOb6+fCQAAAAUC8EuAKDB2nLLS5PUdNzacstL8+tf/ywtWjQpdO/6qrkhpmeffTeffDK1VseuJOnXb/l07tw2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","width":2422,"y":-30,"x":-30},"elements":{"page":{"showGrid":true,"gridSize":15,"orientation":"portrait","height":5086,"backgroundColor":"transparent","width":3050,"padding":20},"elements":{"1706377301a0f5":{"to":{"id":"17063773c3824b","angle":3.141592653589793,"y":1397,"x":1130},"id":"1706377301a0f5","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063763e832da","angle":0,"y":1397,"x":1226.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1397,"x":1178.2999954223633},{"y":1397,"x":1178.2999954223633}],"group":"","props":{"zindex":53}},"1706374bb6e8b2":{"to":{"id":"17063749ed55a4","angle":0,"y":1292.3000030517578,"x":1896.3999786376953},"id":"1706374bb6e8b2","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1706373ad81e01","angle":3.141592653589793,"y":1292.3000030517578,"x":1638.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1292.3000030517578,"x":1767.499984741211},{"y":1292.3000030517578,"x":1767.499984741211}],"group":"","props":{"zindex":51}},"17063acb5586c":{"id":"17063acb5586c","to":{"id":"17063a54397c6d","y":3046.6470588235297,"angle":0,"x":1184.388120909415},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":3046.6470588235297,"x":1019.2425033612818},{"y":3046.6470588235297,"x":1019.2425033612818}],"locked":false,"dataAttributes":[],"from":{"id":"17063a88ae8bc7","y":3046.6470588235297,"angle":3.141592653589793,"x":854.0968858131487},"group":"","props":{"zindex":110}},"17063a83853bf5":{"textBlock":[{"position":{"w":"w-20","y":10,"h":"h-20","x":10},"text":"初始化容器事件传播器"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a839ada15","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a839ad795","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a839ada9a","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a839addf","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a839ad652","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a83853bf5","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"备注","name":"note","fillStyle":{"color":"255, 255, 170"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":521.1764705882354,"y":2616.753082631426,"h":64.49383473714948,"angle":0,"x":329.9204152249133,"zindex":98}},"1706370e119887":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706370e11a7db","category":"default","name":"序号","value":"","type":"number"},{"id":"1706370e11a24e","category":"default","name":"名称","value":"","type":"string"},{"id":"1706370e11a81","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706370e11a0ce","category":"default","name":"连接","value":"","type":"link"},{"id":"1706370e11afbb","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706370e119887","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,204,230","type":"solid"},"locked":false,"group":"","props":{"w":466.8000183105469,"angle":0,"h":458.0000305175781,"y":779.6000061035156,"zindex":-3,"x":1199.1999816894531}},"17063aa22f92a7":{"to":{"id":"17063a543979cb","angle":0,"y":3334.8823529411743,"x":1188.1329560792146},"id":"17063aa22f92a7","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063a88ae811","angle":3.141592653589793,"y":3334.8823529411748,"x":854.0968858131487},"dataAttributes":[],"locked":false,"points":[{"y":3334.8823529411748,"x":1021.1149209461817},{"y":3334.8823529411743,"x":1021.1149209461817}],"group":"","props":{"zindex":107}},"17063749ed55a4":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"构建BeanDefinition入口"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706374a65c0e5","category":"default","name":"序号","value":"","type":"number"},{"id":"1706374a65ce78","category":"default","name":"名称","value":"","type":"string"},{"id":"1706374a65c337","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706374a65c6d2","category":"default","name":"连接","value":"","type":"link"},{"id":"1706374a65c238","category":"default","name":"便笺","value":"","type":"string"},{"id":"1706374a65cca1","category":"default","name":"成本","value":"","type":"number"},{"id":"1706374a65c3c9","category":"default","name":"时间","value":"","type":"number"},{"id":"1706374a65c0b1","category":"default","name":"部门","value":"","type":"string"},{"id":"1706374a65ca9e","category":"default","name":"输入","value":"","type":"string"},{"id":"1706374a65c2a7","category":"default","name":"输出","value":"","type":"string"},{"id":"1706374a65c147","category":"default","name":"风险","value":"","type":"string"},{"id":"1706374a65c763","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063749ed55a4","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"开始/结束","category":"flow","name":"terminator","path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"y1":"0","action":"curve","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x":"w-Math.min(w,h)/3","x1":"w+Math.min(w,h)/3/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"y1":"h","action":"curve","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x":"Math.min(w,h)/3","x1":"-Math.min(w,h)/3/3"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":191.20004272460938,"angle":0,"h":50,"y":1267.3000030517578,"zindex":50,"x":1896.3999786376953}},"1706314a0e0142":{"to":{"id":"1706302b1eaa39","angle":0,"y":250.5999984741211,"x":1375.5999908447266},"id":"1706314a0e0142","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"17063102035d6c","angle":3.141592653589793,"y":249.8941161211799,"x":859.2235233082491},"dataAttributes":[],"locked":false,"points":[{"y":249.89411612117988,"x":1065.7743033098157},{"y":250.5999984741211,"x":1169.0492108431602}],"group":"","props":{"zindex":8}},"170633ec458cdf":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"此方法有以下几个操作:
1、createBeanFactory方法会创建一个DefaultListableBeanFactory对象
2、customizeBeanFactory此方法是留给子类实现的,推荐通过overwrite的方式对现有的BeanFactory做个性化设置:allowBeanDefinitionOverriding表示是否允许注册一个同名的类来覆盖原有类,allowCircularReferences表示是否运行多个类之间的循环引用
3、loadBeanDefinitions把所有bean的定义后保存在context注意是bean的定义,而不是实例化
"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"textAlign":"left"},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170633ec458b0b","category":"default","name":"序号","value":"","type":"number"},{"id":"170633ec458ec6","category":"default","name":"名称","value":"","type":"string"},{"id":"170633ec458d4a","category":"default","name":"所有者","value":"","type":"string"},{"id":"170633ec458bf3","category":"default","name":"连接","value":"","type":"link"},{"id":"170633ec458063","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170633ec458cdf","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":593.2000122070312,"angle":0,"h":117.00000762939453,"y":580.8647005417766,"zindex":27,"x":272.92594545357775}},"170637c3cdd87b":{"to":{"id":"170637a704430c","angle":1.5707963267948968,"y":1562.3000030517578,"x":1432.5999908447266},"id":"170637c3cdd87b","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063764a5ff89","angle":4.71238898038469,"y":1532.6999969482422,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1547.5,"x":1432.5999908447266},{"y":1547.5,"x":1432.5999908447266}],"group":"","props":{"zindex":62}},"1706380f4e3ab2":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
DefaultListableBeanFactory
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706380fe4a06a","category":"default","name":"序号","value":"","type":"number"},{"id":"1706380fe4a09f","category":"default","name":"名称","value":"","type":"string"},{"id":"1706380fe4a4aa","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706380fe4a728","category":"default","name":"连接","value":"","type":"link"},{"id":"1706380fe4a761","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706380f4e3ab2","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1873.3000030517578,"h":69.39999389648438,"angle":0,"x":1167.5999908447266,"zindex":71}},"1706363827cb0e":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"LoadBeanDefinitions(beanFactory)
AbstractXmlApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636383e50d","category":"default","name":"序号","value":"","type":"number"},{"id":"170636383e555a","category":"default","name":"名称","value":"","type":"string"},{"id":"170636383e5861","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636383e5654","category":"default","name":"连接","value":"","type":"link"},{"id":"170636383e6334","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706363827cb0e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":56,"y":793.6000061035156,"zindex":29,"x":1226.5999908447266}},"170636f791738f":{"to":{"id":"170636f8fe4c62","angle":0,"y":1093.3000030517578,"x":1893.3999938964844},"id":"170636f791738f","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170636ae9cf617","angle":3.141592653589793,"y":1093.3000030517578,"x":1638.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1093.3000030517578,"x":1765.9999923706055},{"y":1093.3000030517578,"x":1765.9999923706055}],"group":"","props":{"zindex":44}},"17063396c265e3":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"构建BeanFactory入口"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063396d0b965","category":"default","name":"序号","value":"","type":"number"},{"id":"17063396d0b5a1","category":"default","name":"名称","value":"","type":"string"},{"id":"17063396d0bd1b","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063396d0bede","category":"default","name":"连接","value":"","type":"link"},{"id":"17063396d0b042","category":"default","name":"便笺","value":"","type":"string"},{"id":"17063396d0bec8","category":"default","name":"成本","value":"","type":"number"},{"id":"17063396d0b977","category":"default","name":"时间","value":"","type":"number"},{"id":"17063396d0b4b2","category":"default","name":"部门","value":"","type":"string"},{"id":"17063396d0bfec","category":"default","name":"输入","value":"","type":"string"},{"id":"17063396d0bad6","category":"default","name":"输出","value":"","type":"string"},{"id":"17063396d0b629","category":"default","name":"风险","value":"","type":"string"},{"id":"17063396d0bff7","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063396c265e3","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"开始/结束","category":"flow","name":"terminator","path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"y1":"0","action":"curve","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x":"w-Math.min(w,h)/3","x1":"w+Math.min(w,h)/3/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"y1":"h","action":"curve","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x":"Math.min(w,h)/3","x1":"-Math.min(w,h)/3/3"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":191.20004272460938,"angle":0,"h":50,"y":615.5999984741211,"zindex":25,"x":1877.3999938964844}},"17063acac5a52d":{"to":{"id":"17063a543971f4","angle":0,"y":3141.9411764705897,"x":1184.3475943139795},"id":"17063acac5a52d","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063a88ae871d","angle":3.141592653589793,"y":3141.94117647059,"x":854.0968858131487},"dataAttributes":[],"locked":false,"points":[{"y":3141.94117647059,"x":1019.2222400635641},{"y":3141.9411764705897,"x":1019.2222400635641}],"group":"","props":{"zindex":109}},"17063643fa767e":{"id":"17063643fa767e","to":{"id":"1706363827cb0e","y":793.6000061035156,"angle":1.5707963267948968,"x":1432.5999908447266},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":774.6000022888184,"x":1432.5999908447266},{"y":774.6000022888184,"x":1432.5999908447266}],"locked":false,"dataAttributes":[],"from":{"id":"170633713eae03","y":755.5999984741211,"angle":4.71238898038469,"x":1432.5999908447266},"group":"","props":{"zindex":30}},"17063a54397c6d":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
finishRefresh();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a544c2197","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a544c24bf","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a544c2d53","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a544c241e","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a544c2aca","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a54397c6d","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":3011.9470618752875,"h":69.39999389648438,"angle":0,"x":1184.388120909415,"zindex":88}},"170636b89b6583":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
Document
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636b8ab10ae","category":"default","name":"序号","value":"","type":"number"},{"id":"170636b8ab1aef","category":"default","name":"名称","value":"","type":"string"},{"id":"170636b8ab157a","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636b8ab1159","category":"default","name":"连接","value":"","type":"link"},{"id":"170636b8ab15bb","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170636b89b6583","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1156.6000061035156,"h":69.39999389648438,"angle":0,"x":1226.5999908447266,"zindex":37}},"17063393f458d2":{"id":"17063393f458d2","to":{"id":"1706338ef35c9","y":471.5999984741211,"angle":0,"x":1877.3999938964844},"text":"","linkerType":"curve","name":"linker","lineStyle":{},"points":[{"y":471.5999984741211,"x":1734.1199920654296},{"y":471.5999984741211,"x":1781.8799926757813}],"locked":false,"dataAttributes":[],"from":{"id":"170632d27c970f","y":471.5999984741211,"angle":3.141592653589793,"x":1638.5999908447266},"group":"","props":{"zindex":24}},"17063102035d6c":{"textBlock":[{"position":{"w":"w-20","y":10,"h":"h-20","x":10},"text":"此方法简单来说完成了资源定位的功能,但是需要注意的是,在此方法中主要创建了环境对象ConfigurableEnvironment,包含了当前JVM的profile配置信息,环境变量,Java进程变量,而且还创建了PropertyResolver、PropertyPlaceholderHelper对象来替换配置文件中的${}的值"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"textAlign":"left"},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170631020353bd","category":"default","name":"序号","value":"","type":"number"},{"id":"170631020354ee","category":"default","name":"名称","value":"","type":"string"},{"id":"170631020356f6","category":"default","name":"所有者","value":"","type":"string"},{"id":"170631020351ea","category":"default","name":"连接","value":"","type":"link"},{"id":"17063102035a75","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063102035d6c","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"备注","name":"note","fillStyle":{"color":"255, 255, 170"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":588,"y":215.67842984667013,"h":70,"angle":0,"x":273.1151034697254,"zindex":7}},"17063a88ae811":{"textBlock":[{"position":{"w":"w-20","y":10,"h":"h-20","x":10},"text":"重设公共缓存"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a88c5f4dc","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a88c5f825","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a88c5f503","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a88c5fa19","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a88c5f7c6","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a88ae811","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"备注","name":"note","fillStyle":{"color":"255, 255, 170"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":521.1764705882354,"y":3302.6354355726,"h":64.49383473714948,"angle":0,"x":332.9204152249133,"zindex":105}},"170638508de1de":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170638508de6dc","category":"default","name":"序号","value":"","type":"number"},{"id":"170638508dea59","category":"default","name":"名称","value":"","type":"string"},{"id":"170638508de819","category":"default","name":"所有者","value":"","type":"string"},{"id":"170638508deb8b","category":"default","name":"连接","value":"","type":"link"},{"id":"170638508de9a5","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170638508de1de","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,204,230","type":"solid"},"locked":false,"group":"","props":{"w":899,"angle":0,"h":217,"y":1863,"zindex":-7,"x":1160}},"1706339bd5ca79":{"to":{"id":"17063396c265e3","angle":0,"y":640.5999984741211,"x":1877.3999938964844},"id":"1706339bd5ca79","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"1706337f3bca11","angle":3.141592653589793,"y":639.6000061035156,"x":1666},"dataAttributes":[],"locked":false,"points":[{"y":639.6000061035156,"x":1750.5609436126867},{"y":640.5999984741211,"x":1792.8390502837976}],"group":"","props":{"zindex":26}},"17063accde988a":{"to":{"id":"17063a47823e64","angle":0,"y":2744.2941176470567,"x":1180.2412213098844},"id":"17063accde988a","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063a83853b8a","angle":3.141592653589793,"y":2744.2941176470567,"x":854.0968858131487},"dataAttributes":[],"locked":false,"points":[{"y":2744.2941176470567,"x":1017.1690535615165},{"y":2744.2941176470567,"x":1017.1690535615165}],"group":"","props":{"zindex":113}},"1706382bf4f89":{"to":{"id":"17063827f5bca9","angle":1.5707963267948968,"y":1974.3000030517578,"x":1373.5999908447266},"id":"1706382bf4f89","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1706380f4e3ab2","angle":4.71238898038469,"y":1942.6999969482422,"x":1373.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1958.5,"x":1373.5999908447266},{"y":1958.5,"x":1373.5999908447266}],"group":"","props":{"zindex":74}},"170636b57c3642":{"id":"170636b57c3642","to":{"id":"170636ae9cf617","y":1058.6000061035156,"angle":1.5707963267948968,"x":1432.5999908447266},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":1044.3000030517578,"x":1432.5999908447266},{"y":1044.3000030517578,"x":1432.5999908447266}],"locked":false,"dataAttributes":[],"from":{"id":"17063695aa030a","y":1030,"angle":4.71238898038469,"x":1432.5999908447266},"group":"","props":{"zindex":36}},"170636a9428edd":{"to":{"id":"17063695aa030a","angle":1.5707963267948968,"y":960.6000061035156,"x":1432.5999908447266},"id":"170636a9428edd","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063654564c22","angle":4.71238898038469,"y":933.6000061035156,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":947.1000061035156,"x":1432.5999908447266},{"y":947.1000061035156,"x":1432.5999908447266}],"group":"","props":{"zindex":34}},"170637e67ea823":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"BeanDefinitionHolder"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637e67ea7a6","category":"default","name":"序号","value":"","type":"number"},{"id":"170637e67ea6b6","category":"default","name":"名称","value":"","type":"string"},{"id":"170637e67ea64c","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637e67ea7ee","category":"default","name":"连接","value":"","type":"link"},{"id":"170637e67eaec9","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637e67ea823","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":164,"angle":0,"h":70,"y":1662,"zindex":68,"x":948}},"1706379858d5ef":{"to":{"id":"17063763e832da","angle":1.5707963267948968,"y":1362.3000030517578,"x":1432.5999908447266},"id":"1706379858d5ef","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1706373ad81e01","angle":4.71238898038469,"y":1327,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1344.650001525879,"x":1432.5999908447266},{"y":1344.650001525879,"x":1432.5999908447266}],"group":"","props":{"zindex":57}},"170632a8fc4d9e":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
refresh()
AbstractApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170632a90bf6e5","category":"default","name":"序号","value":"","type":"number"},{"id":"170632a90bfa2e","category":"default","name":"名称","value":"","type":"string"},{"id":"170632a90bf3e3","category":"default","name":"所有者","value":"","type":"string"},{"id":"170632a90bfd0b","category":"default","name":"连接","value":"","type":"link"},{"id":"170632a90bf154","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170632a8fc4d9e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":323.5999984741211,"h":56,"angle":0,"x":1375.5999908447266,"zindex":9}},"1706338739c36":{"id":"1706338739c36","to":{"id":"17063366e4c657","y":615.5999984741211,"angle":1.5707963267948966,"x":1432.5999908447266},"text":"","linkerType":"curve","name":"linker","lineStyle":{},"points":[{"y":598.7999984741211,"x":1432.5999908447266},{"y":604.399998474121,"x":1432.5999908447266}],"locked":false,"dataAttributes":[],"from":{"id":"1706335b14850a","y":587.5999984741211,"angle":4.71238898038469,"x":1432.5999908447266},"group":"","props":{"zindex":22}},"17063700586e29":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"用于解析XML配置文件"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706370075c649","category":"default","name":"序号","value":"","type":"number"},{"id":"1706370075c83c","category":"default","name":"名称","value":"","type":"string"},{"id":"1706370075ca","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706370075cf81","category":"default","name":"连接","value":"","type":"link"},{"id":"1706370075c10b","category":"default","name":"便笺","value":"","type":"string"},{"id":"1706370075cd9f","category":"default","name":"成本","value":"","type":"number"},{"id":"1706370075c6be","category":"default","name":"时间","value":"","type":"number"},{"id":"1706370075ce51","category":"default","name":"部门","value":"","type":"string"},{"id":"1706370075caaf","category":"default","name":"输入","value":"","type":"string"},{"id":"1706370075c5d7","category":"default","name":"输出","value":"","type":"string"},{"id":"1706370075c96e","category":"default","name":"风险","value":"","type":"string"},{"id":"1706370075c977","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063700586e29","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"开始/结束","category":"flow","name":"terminator","path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"y1":"0","action":"curve","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x":"w-Math.min(w,h)/3","x1":"w+Math.min(w,h)/3/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"y1":"h","action":"curve","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x":"Math.min(w,h)/3","x1":"-Math.min(w,h)/3/3"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":191.20004272460938,"angle":0,"h":50,"y":1166.3000030517578,"zindex":47,"x":1893.3999938964844}},"17063a3e0f1354":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
prepareBeanFactory(beanFactory)
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a3e23dc8b","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a3e23db25","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a3e23d3d1","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a3e23dc47","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a3e23d3e7","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a3e0f1354","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":2123.7117677576407,"h":69.39999389648438,"angle":0,"x":1172.3058731976673,"zindex":79}},"17063654564c22":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
XmlBeanDefinitionReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636546555b9","category":"default","name":"序号","value":"","type":"number"},{"id":"17063654655955","category":"default","name":"名称","value":"","type":"string"},{"id":"17063654655668","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706365465528f","category":"default","name":"连接","value":"","type":"link"},{"id":"17063654655b75","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063654564c22","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":56,"y":877.6000061035156,"zindex":31,"x":1226.5999908447266}},"170636e64273e5":{"to":{"id":"170636e24e2057","angle":0,"y":905.6000061035156,"x":1888.3999938964844},"id":"170636e64273e5","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063654564c22","angle":3.141592653589793,"y":905.6000061035156,"x":1638.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":905.6000061035156,"x":1763.4999923706055},{"y":905.6000061035156,"x":1763.4999923706055}],"group":"","props":{"zindex":41}},"17063a88ae871d":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"销毁已经创建的Bean"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a88c5f067","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a88c5f2b7","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a88c5fd67","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a88c5fd39","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a88c5fc14","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a88ae871d","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":3109.694259102015,"zindex":103,"x":332.9204152249133}},"170637ea1a695a":{"to":{"id":"170637ea91a02e","angle":3.141592653589793,"y":1792,"x":1112},"id":"170637ea1a695a","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637dcc341ac","angle":0,"y":1792,"x":1167.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1792,"x":1139.7999954223633},{"y":1792,"x":1139.7999954223633}],"group":"","props":{"zindex":69}},"17063aa76277ba":{"to":{"id":"17063a543977e","angle":0,"y":3237.2352941176455,"x":1184.3035983090792},"id":"17063aa76277ba","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063a88ae8d4c","angle":3.141592653589793,"y":3237.235294117646,"x":854.0968858131487},"dataAttributes":[],"locked":false,"points":[{"y":3237.235294117646,"x":1019.200242061114},{"y":3237.2352941176455,"x":1019.200242061114}],"group":"","props":{"zindex":108}},"170633713eae03":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"getBeanFactory()
AbstractRefreshableApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170633714d757d","category":"default","name":"序号","value":"","type":"number"},{"id":"170633714d72a9","category":"default","name":"名称","value":"","type":"string"},{"id":"170633714d739f","category":"default","name":"所有者","value":"","type":"string"},{"id":"170633714d79aa","category":"default","name":"连接","value":"","type":"link"},{"id":"170633714d73b3","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170633713eae03","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":56,"y":699.5999984741211,"zindex":20,"x":1226.5999908447266}},"1706337f3bca11":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706337f3bc48f","category":"default","name":"序号","value":"","type":"number"},{"id":"1706337f3bc955","category":"default","name":"名称","value":"","type":"string"},{"id":"1706337f3bcbb8","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706337f3bc319","category":"default","name":"连接","value":"","type":"link"},{"id":"1706337f3bcbfc","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706337f3bca11","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"255,204,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":466.8000183105469,"y":512.6000061035156,"h":254,"angle":0,"x":1199.1999816894531,"zindex":-1}},"17063a88ae8d4c":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"取消刷新操作,充值容器的同步标识"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a88c5f82b","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a88c5f59f","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a88c5f722","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a88c5ff56","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a88c5f244","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a88ae8d4c","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":3204.988376749071,"zindex":104,"x":332.9204152249133}},"1706366dd57959":{"id":"1706366dd57959","to":{"id":"17063654564c22","y":877.6000061035156,"angle":1.5707963267948968,"x":1432.5999908447266},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":863.6000061035156,"x":1432.5999908447266},{"y":863.6000061035156,"x":1432.5999908447266}],"locked":false,"dataAttributes":[],"from":{"id":"1706363827cb0e","y":849.6000061035156,"angle":4.71238898038469,"x":1432.5999908447266},"group":"","props":{"zindex":32}},"170637f7b16e5f":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":""}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637f7b16c14","category":"default","name":"序号","value":"","type":"number"},{"id":"170637f7b16c59","category":"default","name":"名称","value":"","type":"string"},{"id":"170637f7b16bab","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637f7b1615e","category":"default","name":"连接","value":"","type":"link"},{"id":"170637f7b16e2a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637f7b16e5f","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,204,230","type":"solid"},"locked":false,"group":"","props":{"w":899,"angle":0,"h":510,"y":1342,"zindex":-5,"x":1160}},"1706302b1eaa39":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"setConfigLocations(configLocations)
AbstractRefreshableConfigApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706302b1eaab7","category":"default","name":"序号","value":"","type":"number"},{"id":"1706302b1eaf7b","category":"default","name":"名称","value":"","type":"string"},{"id":"1706302b1eaa82","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706302b1ea911","category":"default","name":"连接","value":"","type":"link"},{"id":"1706302b1ea1b2","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706302b1eaa39","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":56,"y":222.5999984741211,"zindex":3,"x":1375.5999908447266}},"17063366e4c657":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"refreshBeanFactory()
AbstractRefreshableApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063366f4a286","category":"default","name":"序号","value":"","type":"number"},{"id":"17063366f4a07e","category":"default","name":"名称","value":"","type":"string"},{"id":"17063366f4a145","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063366f4a6c7","category":"default","name":"连接","value":"","type":"link"},{"id":"17063366f4af18","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063366e4c657","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":615.5999984741211,"h":56,"angle":0,"x":1226.5999908447266,"zindex":19}},"170632b2735d14":{"id":"170632b2735d14","to":{"id":"170632a8fc4d9e","y":323.5999984741211,"angle":1.5707963267948968,"x":1581.5999908447266},"text":"","linkerType":"curve","name":"linker","lineStyle":{},"points":[{"y":296.5999984741211,"x":1581.5999908447266},{"y":305.5999984741211,"x":1581.5999908447266}],"locked":false,"dataAttributes":[],"from":{"id":"1706302b1eaa39","y":278.5999984741211,"angle":4.71238898038469,"x":1581.5999908447266},"group":"","props":{"zindex":11}},"170636ef48354c":{"id":"170636ef48354c","to":{"id":"170636e7e8ac76","y":995.3000030517578,"angle":0,"x":1893.3999938964844},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":995.3000030517578,"x":1765.9999923706055},{"y":995.3000030517578,"x":1765.9999923706055}],"locked":false,"dataAttributes":[],"from":{"id":"17063695aa030a","y":995.3000030517578,"angle":3.141592653589793,"x":1638.5999908447266},"group":"","props":{"zindex":43}},"17063798b9e7b4":{"to":{"id":"17063764a5ff89","angle":1.5707963267948968,"y":1463.3000030517578,"x":1432.5999908447266},"id":"17063798b9e7b4","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063763e832da","angle":4.71238898038469,"y":1431.6999969482422,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1447.5,"x":1432.5999908447266},{"y":1447.5,"x":1432.5999908447266}],"group":"","props":{"zindex":58}},"170636dce6c925":{"id":"170636dce6c925","to":{"id":"170636d0797b44","y":821.6000061035156,"angle":0,"x":1880.3999938964844},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":821.6000061035156,"x":1759.4999923706055},{"y":821.6000061035156,"x":1759.4999923706055}],"locked":false,"dataAttributes":[],"from":{"id":"1706363827cb0e","y":821.6000061035156,"angle":3.141592653589793,"x":1638.5999908447266},"group":"","props":{"zindex":39}},"17063a458bc83f":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
registerBeanPostProcessors(beanFactory);
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a4626e57a","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a4626e23f","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a4626e7d7","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a4626e952","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a4626e4d6","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a458bc83f","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":2414.3000030517555,"h":69.39999389648438,"angle":0,"x":1180.5333563669674,"zindex":82}},"17063763e832da":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
doRegisterBeanDefinitions(Element root)
DefaultBeanDefinitionDocumentReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063764a5b547","category":"default","name":"序号","value":"","type":"number"},{"id":"17063764a5b9ee","category":"default","name":"名称","value":"","type":"string"},{"id":"17063764a5ba91","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063764a5b26","category":"default","name":"连接","value":"","type":"link"},{"id":"17063764a5bb05","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063763e832da","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1362.3000030517578,"h":69.39999389648438,"angle":0,"x":1226.5999908447266,"zindex":52}},"170637dcc341ac":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean)
BeanDefinitionParserDelegate
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637dd0db0f5","category":"default","name":"序号","value":"","type":"number"},{"id":"170637dd0db893","category":"default","name":"名称","value":"","type":"string"},{"id":"170637dd0dbc36","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637dd0dba15","category":"default","name":"连接","value":"","type":"link"},{"id":"170637dd0db725","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637dcc341ac","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1757.3000030517578,"h":69.39999389648438,"angle":0,"x":1167.5999908447266,"zindex":65}},"1706382b665b13":{"to":{"id":"1706380f4e3ab2","angle":1.5707963267948968,"y":1873.3000030517578,"x":1373.5999908447266},"id":"1706382b665b13","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637dcc341ac","angle":4.71238898038469,"y":1826.6999969482422,"x":1373.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1850,"x":1373.5999908447266},{"y":1850,"x":1373.5999908447266}],"group":"","props":{"zindex":73}},"17063842d1a1f7":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"registerAlias(String name, String alias)
SimpleAliasRegistry
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063843292196","category":"default","name":"序号","value":"","type":"number"},{"id":"17063843292ad4","category":"default","name":"名称","value":"","type":"string"},{"id":"17063843292ad6","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063843292ebc","category":"default","name":"连接","value":"","type":"link"},{"id":"17063843292401","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063842d1a1f7","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1873.3000030517578,"h":69.39999389648438,"angle":0,"x":1594.6000366210938,"zindex":75}},"170637de12e6aa":{"to":{"id":"170637dcc341ac","angle":1.5707963267948968,"y":1757.3000030517578,"x":1373.5999908447266},"id":"170637de12e6aa","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637b54f4059","angle":4.71238898038469,"y":1731.6999969482422,"x":1373.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1744.5,"x":1373.5999908447266},{"y":1744.5,"x":1373.5999908447266}],"group":"","props":{"zindex":66}},"170633868a4ab5":{"to":{"id":"1706335b14850a","angle":1.5707963267948966,"y":531.5999984741211,"x":1432.5999908447266},"id":"170633868a4ab5","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"170632d27c970f","angle":4.71238898038469,"y":499.5999984741211,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":512.399998474121,"x":1432.5999908447266},{"y":518.7999984741211,"x":1432.5999908447266}],"group":"","props":{"zindex":21}},"170636f8fe4c62":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"解析得到document对象"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636f91346ad","category":"default","name":"序号","value":"","type":"number"},{"id":"170636f9134775","category":"default","name":"名称","value":"","type":"string"},{"id":"170636f9134405","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636f9134834","category":"default","name":"连接","value":"","type":"link"},{"id":"170636f91344cc","category":"default","name":"便笺","value":"","type":"string"},{"id":"170636f91342d1","category":"default","name":"成本","value":"","type":"number"},{"id":"170636f9134ed2","category":"default","name":"时间","value":"","type":"number"},{"id":"170636f91342bd","category":"default","name":"部门","value":"","type":"string"},{"id":"170636f9134f25","category":"default","name":"输入","value":"","type":"string"},{"id":"170636f913414c","category":"default","name":"输出","value":"","type":"string"},{"id":"170636f91341ff","category":"default","name":"风险","value":"","type":"string"},{"id":"170636f913402d","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170636f8fe4c62","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"开始/结束","category":"flow","name":"terminator","path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"y1":"0","action":"curve","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x":"w-Math.min(w,h)/3","x1":"w+Math.min(w,h)/3/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"y1":"h","action":"curve","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x":"Math.min(w,h)/3","x1":"-Math.min(w,h)/3/3"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":191.20004272460938,"angle":0,"h":50,"y":1068.3000030517578,"zindex":45,"x":1893.3999938964844}},"170637bfa6359a":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
processAliasRegistration(Element ele)
DefaultBeanDefinitionDocumentReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637c04cb165","category":"default","name":"序号","value":"","type":"number"},{"id":"170637c04cb52","category":"default","name":"名称","value":"","type":"string"},{"id":"170637c04cb069","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637c04cbeb6","category":"default","name":"连接","value":"","type":"link"},{"id":"170637c04cbc3","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637bfa6359a","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1662.3000030517578,"h":69.39999389648438,"angle":0,"x":1594.6000366210938,"zindex":61}},"17063a4815ec7f":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
registerListeners();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a4eefae4e","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a4eefa25c","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a4eefa7fc","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a4eefafdb","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a4eefa2f6","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a4815ec7f","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":2804.888238345873,"h":69.39999389648438,"angle":0,"x":1184.6438759931218,"zindex":86}},"170632d27c970f":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"prepareRefresh()
AbstractApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170632d28c79f1","category":"default","name":"序号","value":"","type":"number"},{"id":"170632d28c7c9b","category":"default","name":"名称","value":"","type":"string"},{"id":"170632d28c765c","category":"default","name":"所有者","value":"","type":"string"},{"id":"170632d28c7203","category":"default","name":"连接","value":"","type":"link"},{"id":"170632d28c7bf5","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170632d27c970f","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":443.5999984741211,"h":56,"angle":0,"x":1226.5999908447266,"zindex":14}},"17063a47823e64":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
onRefresh();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a4815cb31","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a4815c964","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a4815ca5","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a4815ca3b","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a4815c3cd","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a47823e64","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":2709.5941206988145,"zindex":85,"x":1180.2412213098844}},"170632bacff42c":{"to":{"id":"170632bbe6c346","angle":0,"y":351.5999984741211,"x":1874.3999938964844},"id":"170632bacff42c","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"170632a8fc4d9e","angle":3.141592653589793,"y":351.5999984741211,"x":1787.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":351.5999984741211,"x":1822.3199920654297},{"y":351.5999984741211,"x":1839.6799926757812}],"group":"","props":{"zindex":12}},"17063a46e0cdcb":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
initApplicationEventMulticaster();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a47820ef1","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a4782074d","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a47820876","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a47820857","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a4782050f","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a46e0cdcb","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":2614.3000030517587,"h":69.39999389648438,"angle":0,"x":1180.2852173147846,"zindex":84}},"17063a838538fa":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"初始化信息源,和国际化相关"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a839ad6be","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a839ade89","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a839ad281","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a839ad546","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a839adffe","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a838538fa","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2521.4589649843665,"zindex":97,"x":332.9204152249133}},"1706384983a43b":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"Map<String, String> aliasMap
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706384a3c2a9c","category":"default","name":"序号","value":"","type":"number"},{"id":"1706384a3c2411","category":"default","name":"名称","value":"","type":"string"},{"id":"1706384a3c2aa6","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706384a3c2ec4","category":"default","name":"连接","value":"","type":"link"},{"id":"1706384a3c2e62","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706384983a43b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1974.3000030517578,"h":69.39999389648438,"angle":0,"x":1594.6000366210938,"zindex":76}},"170637b54f4059":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)
DefaultBeanDefinitionDocumentReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637b59a4b47","category":"default","name":"序号","value":"","type":"number"},{"id":"170637b59a42ed","category":"default","name":"名称","value":"","type":"string"},{"id":"170637b59a4001","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637b59a4abc","category":"default","name":"连接","value":"","type":"link"},{"id":"170637b59a46b3","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637b54f4059","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1662.3000030517578,"h":69.39999389648438,"angle":0,"x":1167.5999908447266,"zindex":60}},"170636ff0a782a":{"to":{"id":"17063700586e29","angle":0,"y":1191.3000030517578,"x":1893.3999938964844},"id":"170636ff0a782a","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170636b89b6583","angle":3.141592653589793,"y":1191.3000030517578,"x":1638.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1191.3000030517578,"x":1765.9999923706055},{"y":1191.3000030517578,"x":1765.9999923706055}],"group":"","props":{"zindex":46}},"17063a9ceb2e29":{"id":"17063a9ceb2e29","to":{"id":"17063a44bb2e6e","y":2253.7058823529414,"angle":0,"x":1174.6588143741376},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":2253.7058823529414,"x":1014.3778500936431},{"y":2253.7058823529414,"x":1014.3778500936431}],"locked":false,"dataAttributes":[],"from":{"id":"17063a7aece30b","y":2253.7058823529414,"angle":3.141592653589793,"x":854.0968858131487},"group":"","props":{"zindex":106}},"17063a44bb2e6e":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
postProcessBeanFactory(beanFactory);
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a44f0dedf","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a44f0d399","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a44f0d1ef","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a44f0d05a","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a44f0d389","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a44bb2e6e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":2219.0058854046993,"h":69.39999389648438,"angle":0,"x":1174.6588143741376,"zindex":80}},"17063695aa030a":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
doLoadBeanDefinitions(InputSource inputSource, Resource resource)
XmlBeanDefinitionReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063695bd5af1","category":"default","name":"序号","value":"","type":"number"},{"id":"17063695bd5a29","category":"default","name":"名称","value":"","type":"string"},{"id":"17063695bd51b2","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063695bd5594","category":"default","name":"连接","value":"","type":"link"},{"id":"17063695bd5d9d","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063695aa030a","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":960.6000061035156,"zindex":33,"x":1226.5999908447266}},"170637e610c1ff":{"to":{"id":"170637e67ea823","angle":3.141592653589793,"y":1697,"x":1112},"id":"170637e610c1ff","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637b54f4059","angle":0,"y":1697,"x":1167.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1697,"x":1139.7999954223633},{"y":1697,"x":1139.7999954223633}],"group":"","props":{"zindex":67}},"170630fa3df726":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"备注说明"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"vAlign":"top","color":"51,0,0","size":29},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170630fa3dfbc1","category":"default","name":"序号","value":"","type":"number"},{"id":"170630fa3dfc62","category":"default","name":"名称","value":"","type":"string"},{"id":"170630fa3df8bd","category":"default","name":"所有者","value":"","type":"string"},{"id":"170630fa3df309","category":"default","name":"连接","value":"","type":"link"},{"id":"170630fa3df31b","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170630fa3df726","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"255,230,204","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":763.5294117647061,"y":140.5714285714286,"h":3282.117647058824,"angle":0,"x":217.1428571428571,"zindex":6}},"1706338ef35c9":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"准备工作"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706338f0788c8","category":"default","name":"序号","value":"","type":"number"},{"id":"1706338f078ce2","category":"default","name":"名称","value":"","type":"string"},{"id":"1706338f07889f","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706338f078465","category":"default","name":"连接","value":"","type":"link"},{"id":"1706338f078b5","category":"default","name":"便笺","value":"","type":"string"},{"id":"1706338f0782cf","category":"default","name":"成本","value":"","type":"number"},{"id":"1706338f0787e5","category":"default","name":"时间","value":"","type":"number"},{"id":"1706338f07838","category":"default","name":"部门","value":"","type":"string"},{"id":"1706338f07811d","category":"default","name":"输入","value":"","type":"string"},{"id":"1706338f0786cb","category":"default","name":"输出","value":"","type":"string"},{"id":"1706338f078acc","category":"default","name":"风险","value":"","type":"string"},{"id":"1706338f078c8f","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706338ef35c9","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"flow","title":"开始/结束","name":"terminator","fillStyle":{"color":"204,204,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"action":"curve","y1":"0","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x1":"w+Math.min(w,h)/3/3","x":"w-Math.min(w,h)/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"action":"curve","y1":"h","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x1":"-Math.min(w,h)/3/3","x":"Math.min(w,h)/3"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":100,"y":446.5999984741211,"h":50,"angle":0,"x":1877.3999938964844,"zindex":23}},"1706335705923a":{"to":{"id":"170632d27c970f","angle":1.5707963267948968,"y":443.5999984741211,"x":1432.5999908447266},"id":"1706335705923a","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"170632a8fc4d9e","angle":4.71238898038469,"y":379.5999984741211,"x":1581.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":444.4653975710202,"x":1581.5999908447266},{"y":378.73459937722197,"x":1432.5999908447266}],"group":"","props":{"zindex":17}},"17063a543979cb":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
resetCommonCaches();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a544c2f78","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a544c2e29","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a544c220d","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a544c2b24","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a544c297a","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a543979cb","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":3300.182355992932,"zindex":91,"x":1188.1329560792146}},"17063740a8fe7d":{"to":{"id":"170636b89b6583","angle":1.5707963267948968,"y":1156.6000061035156,"x":1432.5999908447266},"id":"17063740a8fe7d","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170636ae9cf617","angle":4.71238898038469,"y":1128,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1142.3000030517578,"x":1432.5999908447266},{"y":1142.3000030517578,"x":1432.5999908447266}],"group":"","props":{"zindex":49}},"17062fdc86e627":{"textBlock":[{"position":{"w":"w","y":0,"h":"h","x":0},"text":"Spring IOC容器初始化过程"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"color":"255,102,102","size":36},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17062fdc86e966","category":"default","name":"序号","value":"","type":"number"},{"id":"17062fdc86e6ca","category":"default","name":"名称","value":"","type":"string"},{"id":"17062fdc86e07f","category":"default","name":"所有者","value":"","type":"string"},{"id":"17062fdc86ed43","category":"default","name":"连接","value":"","type":"link"},{"id":"17062fdc86eb","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17062fdc86e627","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"文本","name":"text","fillStyle":{},"path":[{"lineStyle":{"lineWidth":0},"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":464,"y":44.599998474121094,"h":72,"angle":0,"x":1133.8000030517578,"zindex":1}},"17063a7aece30b":{"textBlock":[{"position":{"w":"w-20","y":10,"h":"h-20","x":10},"text":"为容器的某些子类指定特殊的Post事件处理器"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a7b46e7af","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a7b46e9c4","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a7b46edd3","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a7b46e7da","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a7b46ea87","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a7aece30b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"备注","name":"note","fillStyle":{"color":"255, 255, 170"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":521.1764705882354,"y":2221.4589649843665,"h":64.49383473714948,"angle":0,"x":332.9204152249133,"zindex":94}},"17063797e88e6":{"to":{"id":"1706373ad81e01","angle":1.5707963267948968,"y":1257.6000061035156,"x":1432.5999908447266},"id":"17063797e88e6","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170636b89b6583","angle":4.71238898038469,"y":1226,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1241.8000030517578,"x":1432.5999908447266},{"y":1241.8000030517578,"x":1432.5999908447266}],"group":"","props":{"zindex":56}},"170637a704430c":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)
DefaultBeanDefinitionDocumentReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637a7674e78","category":"default","name":"序号","value":"","type":"number"},{"id":"170637a767409b","category":"default","name":"名称","value":"","type":"string"},{"id":"170637a7674a6a","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637a767470f","category":"default","name":"连接","value":"","type":"link"},{"id":"170637a7674a44","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637a704430c","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1562.3000030517578,"h":69.39999389648438,"angle":0,"x":1226.5999908447266,"zindex":59}},"170634655c3623":{"id":"170634655c3623","to":{"id":"17063366e4c657","y":643.5999984741211,"angle":0,"x":1226.5999908447266},"text":"","linkerType":"curve","name":"linker","lineStyle":{},"points":[{"y":639.3647043564739,"x":1010.3255228839688},{"y":643.5999984741211,"x":1082.400425621367}],"locked":false,"dataAttributes":[],"from":{"id":"170633ec458cdf","y":639.3647043564739,"angle":3.141592653589793,"x":866.1259576606092},"group":"","props":{"zindex":28}},"170636e7e8ac76":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"解析XML文件入口"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636e7f7a75a","category":"default","name":"序号","value":"","type":"number"},{"id":"170636e7f7a473","category":"default","name":"名称","value":"","type":"string"},{"id":"170636e7f7aefc","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636e7f7a3ff","category":"default","name":"连接","value":"","type":"link"},{"id":"170636e7f7a91","category":"default","name":"便笺","value":"","type":"string"},{"id":"170636e7f7af15","category":"default","name":"成本","value":"","type":"number"},{"id":"170636e7f7ad82","category":"default","name":"时间","value":"","type":"number"},{"id":"170636e7f7afbb","category":"default","name":"部门","value":"","type":"string"},{"id":"170636e7f7a4fe","category":"default","name":"输入","value":"","type":"string"},{"id":"170636e7f7aad5","category":"default","name":"输出","value":"","type":"string"},{"id":"170636e7f7a6dd","category":"default","name":"风险","value":"","type":"string"},{"id":"170636e7f7a61","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170636e7e8ac76","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"flow","title":"开始/结束","name":"terminator","fillStyle":{"color":"204,204,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"action":"curve","y1":"0","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x1":"w+Math.min(w,h)/3/3","x":"w-Math.min(w,h)/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"action":"curve","y1":"h","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x1":"-Math.min(w,h)/3/3","x":"Math.min(w,h)/3"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":191.20004272460938,"y":970.3000030517578,"h":50,"angle":0,"x":1893.3999938964844,"zindex":42}},"170632bbe6c346":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"初始化入口"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170632bbe6ca93","category":"default","name":"序号","value":"","type":"number"},{"id":"170632bbe6ca19","category":"default","name":"名称","value":"","type":"string"},{"id":"170632bbe6c11f","category":"default","name":"所有者","value":"","type":"string"},{"id":"170632bbe6c3f7","category":"default","name":"连接","value":"","type":"link"},{"id":"170632bbe6c80c","category":"default","name":"便笺","value":"","type":"string"},{"id":"170632bbe6cf36","category":"default","name":"成本","value":"","type":"number"},{"id":"170632bbe6ca5d","category":"default","name":"时间","value":"","type":"number"},{"id":"170632bbe6c2b4","category":"default","name":"部门","value":"","type":"string"},{"id":"170632bbe6cc28","category":"default","name":"输入","value":"","type":"string"},{"id":"170632bbe6ccc6","category":"default","name":"输出","value":"","type":"string"},{"id":"170632bbe6c7f2","category":"default","name":"风险","value":"","type":"string"},{"id":"170632bbe6cbdd","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170632bbe6c346","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"开始/结束","category":"flow","name":"terminator","path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"y1":"0","action":"curve","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x":"w-Math.min(w,h)/3","x1":"w+Math.min(w,h)/3/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"y1":"h","action":"curve","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x":"Math.min(w,h)/3","x1":"-Math.min(w,h)/3/3"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":100,"angle":0,"h":50,"y":326.5999984741211,"zindex":13,"x":1874.3999938964844}},"17063827f5bca9":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
Map<String, BeanDefinition> beanDefinitionMap
DefaultListableBeanFactory
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170638284659e2","category":"default","name":"序号","value":"","type":"number"},{"id":"17063828465f45","category":"default","name":"名称","value":"","type":"string"},{"id":"17063828465921","category":"default","name":"所有者","value":"","type":"string"},{"id":"170638284658f2","category":"default","name":"连接","value":"","type":"link"},{"id":"17063828465646","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063827f5bca9","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1974.3000030517578,"h":69.39999389648438,"angle":0,"x":1167.5999908447266,"zindex":72}},"17062fe6d4de57":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"ClassPathXmlApplicationContext、FileSystemApplicationContext"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":20},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17062fe6d4d5a7","category":"default","name":"序号","value":"","type":"number"},{"id":"17062fe6d4d058","category":"default","name":"名称","value":"","type":"string"},{"id":"17062fe6d4da75","category":"default","name":"所有者","value":"","type":"string"},{"id":"17062fe6d4da56","category":"default","name":"连接","value":"","type":"link"},{"id":"17062fe6d4da83","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17062fe6d4de57","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255,204,204","type":"solid"},"locked":false,"group":"","props":{"w":880,"angle":0,"h":49,"y":129.5999984741211,"zindex":2,"x":1141.5999908447266}},"17063a83853b8a":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"调用子类的某些特殊Bean的初始化方法"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a839ad68e","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a839ad4c7","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a839add08","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a839ad7f8","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a839adf46","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a83853b8a","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2712.047200278482,"zindex":99,"x":332.9204152249133}},"1706335b14850a":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"obtainFreshBeanFactory()
AbstractApplicationContext
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706335b28db36","category":"default","name":"序号","value":"","type":"number"},{"id":"1706335b28daff","category":"default","name":"名称","value":"","type":"string"},{"id":"1706335b28d73","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706335b28d1f1","category":"default","name":"连接","value":"","type":"link"},{"id":"1706335b28dece","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706335b14850a","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":531.5999984741211,"h":56,"angle":0,"x":1226.5999908447266,"zindex":18}},"170632ab6fcf84":{"to":{"id":"1706302b1eaa39","angle":1.5707963267948968,"y":222.5999984741211,"x":1581.5999908447266},"id":"170632ab6fcf84","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"17062fe6d4de57","y":178.5999984741211,"angle":4.71238898038469,"x":1581.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":196.1999984741211,"x":1581.5999908447266},{"y":204.9999984741211,"x":1581.5999908447266}],"group":"","props":{"zindex":10}},"17063a543976":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
finishBeanFactoryInitialization(beanFactory);
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a544c2eda","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a544c2d96","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a544c29cc","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a544c2a69","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a544c21ce","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a543976","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":2907.2411795223443,"zindex":87,"x":1184.5957333661622}},"17063a83853119":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"为事件传播器注册事件监听器"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a839ad96f","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a839ad1f7","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a839ad607","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a839adcab","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a839adcdd","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a83853119","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2807.3413179255404,"zindex":100,"x":332.9204152249133}},"17063a543977e":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
cancelRefresh(ex);
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a544c29ec","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a544c2e9c","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a544c228a","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a544c2067","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a544c215c","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a543977e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":3202.5352971694033,"h":69.39999389648438,"angle":0,"x":1184.3035983090792,"zindex":90}},"1706384d48f632":{"to":{"id":"17063842d1a1f7","angle":1.5707963267948968,"y":1873.3000030517578,"x":1800.6000366210938},"id":"1706384d48f632","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637bfa6359a","angle":4.71238898038469,"y":1731.6999969482422,"x":1800.6000366210938},"dataAttributes":[],"locked":false,"points":[{"y":1802.5,"x":1800.6000366210938},{"y":1802.5,"x":1800.6000366210938}],"group":"","props":{"zindex":77}},"17063a7e96ecf":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"为BeanFactory注册Post事件处理器"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a7f2560e1","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a7f25696f","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a7f256604","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a7f2560eb","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a7f256f12","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a7e96ecf","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2416.7530826314232,"zindex":96,"x":332.9204152249133}},"17063a44f1181":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
invokeBeanFactoryPostProcessors(beanFactory);
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a458b993","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a458b92b6","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a458b9268","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a458b97d3","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a458b9d4d","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a44f1181","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":2321.35882658117,"zindex":81,"x":1177.3578301664047}},"170637ea91a02e":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"AbstractBeanDefinition"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170637ea91afb2","category":"default","name":"序号","value":"","type":"number"},{"id":"170637ea91a2a2","category":"default","name":"名称","value":"","type":"string"},{"id":"170637ea91af5b","category":"default","name":"所有者","value":"","type":"string"},{"id":"170637ea91a99a","category":"default","name":"连接","value":"","type":"link"},{"id":"170637ea91a0bb","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170637ea91a02e","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":164,"angle":0,"h":70,"y":1757,"zindex":70,"x":948}},"170636e24e2057":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"用于解析XML配置文件"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636e2706fe1","category":"default","name":"序号","value":"","type":"number"},{"id":"170636e270626f","category":"default","name":"名称","value":"","type":"string"},{"id":"170636e2706769","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636e2707bc9","category":"default","name":"连接","value":"","type":"link"},{"id":"170636e2707a68","category":"default","name":"便笺","value":"","type":"string"},{"id":"170636e270778d","category":"default","name":"成本","value":"","type":"number"},{"id":"170636e27077b5","category":"default","name":"时间","value":"","type":"number"},{"id":"170636e2707ae1","category":"default","name":"部门","value":"","type":"string"},{"id":"170636e2707d4d","category":"default","name":"输入","value":"","type":"string"},{"id":"170636e270724e","category":"default","name":"输出","value":"","type":"string"},{"id":"170636e270795a","category":"default","name":"风险","value":"","type":"string"},{"id":"170636e27079ae","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170636e24e2057","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"开始/结束","category":"flow","name":"terminator","path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"y1":"0","action":"curve","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x":"w-Math.min(w,h)/3","x1":"w+Math.min(w,h)/3/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"y1":"h","action":"curve","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x":"Math.min(w,h)/3","x1":"-Math.min(w,h)/3/3"},{"action":"close"}]}],"fillStyle":{"color":"204,204,255","type":"solid"},"locked":false,"group":"","props":{"w":191.20004272460938,"angle":0,"h":50,"y":880.6000061035156,"zindex":40,"x":1888.3999938964844}},"170637c44fd4dc":{"to":{"id":"170637b54f4059","angle":1.5707963267948968,"y":1662.3000030517578,"x":1373.5999908447266},"id":"170637c44fd4dc","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637a704430c","angle":4.71238898038469,"y":1631.6999969482422,"x":1432.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1647,"x":1432.5999908447266},{"y":1647,"x":1373.5999908447266}],"group":"","props":{"zindex":63}},"17063acd9b0c22":{"id":"17063acd9b0c22","to":{"id":"17063a46e0cdcb","y":2649.000000000001,"angle":0,"x":1180.2852173147846},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":2649.000000000001,"x":1015.6910515639667},{"y":2649.000000000001,"x":1015.6910515639667}],"locked":false,"dataAttributes":[],"from":{"id":"17063a83853bf5","y":2649.000000000001,"angle":3.141592653589793,"x":851.0968858131487},"group":"","props":{"zindex":114}},"1706331c6a9fbd":{"textBlock":[{"position":{"w":"w-20","y":10,"h":"h-20","x":10},"text":"此方法完成一些基础的准备工作,例如设置时间、设置启动关闭标志、检查环境变量、并提供子类扩展,用来将属性注入到ApplicationContext中、设置事件监听器集合"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"textAlign":"left"},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706331c6a9ae8","category":"default","name":"序号","value":"","type":"number"},{"id":"1706331c6a9f93","category":"default","name":"名称","value":"","type":"string"},{"id":"1706331c6a93e4","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706331c6a9334","category":"default","name":"连接","value":"","type":"link"},{"id":"1706331c6a9865","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706331c6a9fbd","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"备注","name":"note","fillStyle":{"color":"255, 255, 170"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":588,"y":442.89411612117993,"h":56,"angle":0,"x":274.04705272001377,"zindex":15}},"17063acbda11a":{"to":{"id":"17063a543976","angle":0,"y":2941.9411764705865,"x":1184.5957333661622},"id":"17063acbda11a","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063a88ae8ba","angle":3.141592653589793,"y":2941.9411764705865,"x":854.0968858131487},"dataAttributes":[],"locked":false,"points":[{"y":2941.9411764705865,"x":1019.3463095896554},{"y":2941.9411764705865,"x":1019.3463095896554}],"group":"","props":{"zindex":111}},"17063a6dc79ce8":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"为BeanFactory配置容器特性,例如类加载器、事件处理器"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a6dc79e82","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a6dc79669","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a6dc79e22","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a6dc79665","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a6dc793dd","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a6dc79ce8","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2126.164847337308,"zindex":92,"x":332.9204152249133}},"17063a78041e1b":{"to":{"id":"17063a3e0f1354","angle":0,"y":2158.411764705883,"x":1172.3058731976673},"id":"17063a78041e1b","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063a6dc79ce8","angle":3.141592653589793,"y":2158.4117647058824,"x":854.0968858131481},"dataAttributes":[],"locked":false,"points":[{"y":2158.4117647058824,"x":1013.2013795054077},{"y":2158.411764705883,"x":1013.2013795054077}],"group":"","props":{"zindex":93}},"170636d0797b44":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"加载BeanDefinition入口"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636d0947496","category":"default","name":"序号","value":"","type":"number"},{"id":"170636d094748a","category":"default","name":"名称","value":"","type":"string"},{"id":"170636d09477ed","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636d0947892","category":"default","name":"连接","value":"","type":"link"},{"id":"170636d0947f8a","category":"default","name":"便笺","value":"","type":"string"},{"id":"170636d09479b2","category":"default","name":"成本","value":"","type":"number"},{"id":"170636d09478c5","category":"default","name":"时间","value":"","type":"number"},{"id":"170636d094785","category":"default","name":"部门","value":"","type":"string"},{"id":"170636d0947b2a","category":"default","name":"输入","value":"","type":"string"},{"id":"170636d09477b2","category":"default","name":"输出","value":"","type":"string"},{"id":"170636d0947d5f","category":"default","name":"风险","value":"","type":"string"},{"id":"170636d0947505","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170636d0797b44","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"flow","title":"开始/结束","name":"terminator","fillStyle":{"color":"204,204,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"action":"curve","y1":"0","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x1":"w+Math.min(w,h)/3/3","x":"w-Math.min(w,h)/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"action":"curve","y1":"h","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x1":"-Math.min(w,h)/3/3","x":"Math.min(w,h)/3"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":191.20004272460938,"y":796.6000061035156,"h":50,"angle":0,"x":1880.3999938964844,"zindex":38}},"170633300022cf":{"to":{"id":"170632d27c970f","angle":0,"y":471.5999984741211,"x":1226.5999908447266},"id":"170633300022cf","linkerType":"curve","text":"","lineStyle":{},"name":"linker","from":{"id":"1706331c6a9fbd","angle":3.141592653589793,"y":470.89411612117993,"x":862.0470527200139},"dataAttributes":[],"locked":false,"points":[{"y":470.89411612117993,"x":1007.8685013290615},{"y":471.5999984741211,"x":1080.778542235679}],"group":"","props":{"zindex":16}},"17063773c3824b":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"BeanDefinitionParserDelegate对象"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063773c38a99","category":"default","name":"序号","value":"","type":"number"},{"id":"17063773c38286","category":"default","name":"名称","value":"","type":"string"},{"id":"17063773c38bbf","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063773c38e1e","category":"default","name":"连接","value":"","type":"link"},{"id":"17063773c385ec","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063773c3824b","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{},"locked":false,"group":"","props":{"w":182,"angle":0,"h":70,"y":1362,"zindex":54,"x":948}},"17063a7e96ecb5":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"调用所有注册的BeanFactoryPostProcessor的Bean"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a7f256593","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a7f256176","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a7f256514","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a7f256607","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a7f256c23","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a7e96ecb5","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2323.8119061608377,"zindex":95,"x":329.9204152249133}},"17063764a5ff89":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)
DefaultBeanDefinitionDocumentReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706378f6ccbe8","category":"default","name":"序号","value":"","type":"number"},{"id":"1706378f6cc3e8","category":"default","name":"名称","value":"","type":"string"},{"id":"1706378f6cc869","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706378f6ccb11","category":"default","name":"连接","value":"","type":"link"},{"id":"1706378f6cc4fb","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063764a5ff89","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1463.3000030517578,"h":69.39999389648438,"angle":0,"x":1226.5999908447266,"zindex":55}},"1706373ad81e01":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
registerBeanDefinitions(Document doc, XmlReaderContext readerContext)
DefaultBeanDefinitionDocumentReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"1706373af5a1dc","category":"default","name":"序号","value":"","type":"number"},{"id":"1706373af5aceb","category":"default","name":"名称","value":"","type":"string"},{"id":"1706373af5af15","category":"default","name":"所有者","value":"","type":"string"},{"id":"1706373af5aff6","category":"default","name":"连接","value":"","type":"link"},{"id":"1706373af5a7c9","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"1706373ad81e01","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1257.6000061035156,"h":69.39999389648438,"angle":0,"x":1226.5999908447266,"zindex":48}},"17063a88ae8bc7":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"初始化容器的生命周期事件处理器,并发布容器的生命周期事件"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a88c5f77c","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a88c5f0dd","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a88c5fec5","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a88c5f159","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a88c5fa92","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a88ae8bc7","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":3014.400141454955,"zindex":102,"x":332.9204152249133}},"170632d728df8d":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":""}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170632d728d25a","category":"default","name":"序号","value":"","type":"number"},{"id":"170632d728d2a2","category":"default","name":"名称","value":"","type":"string"},{"id":"170632d728d2d5","category":"default","name":"所有者","value":"","type":"string"},{"id":"170632d728d4ca","category":"default","name":"连接","value":"","type":"link"},{"id":"170632d728deb3","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170632d728df8d","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"229,229,229","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":1205.1999816894531,"y":394.5999984741211,"h":3026.800003051758,"angle":0,"x":1117,"zindex":-8}},"1706384dc15adf":{"to":{"id":"1706384983a43b","angle":1.5707963267948968,"y":1974.3000030517578,"x":1800.6000366210938},"id":"1706384dc15adf","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"17063842d1a1f7","angle":4.71238898038469,"y":1942.6999969482422,"x":1800.6000366210938},"dataAttributes":[],"locked":false,"points":[{"y":1958.5,"x":1800.6000366210938},{"y":1958.5,"x":1800.6000366210938}],"group":"","props":{"zindex":78}},"17063a543971f4":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
destroyBeans();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a544c2481","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a544c20c9","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a544c2c05","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a544c2e0d","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a544c2eea","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a543971f4","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":3107.2411795223475,"zindex":89,"x":1184.3475943139795}},"170637c4d36949":{"to":{"id":"170637bfa6359a","angle":1.5707963267948968,"y":1662.3000030517578,"x":1800.6000366210938},"id":"170637c4d36949","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"170637a704430c","angle":3.141592653589793,"y":1597,"x":1638.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":1597,"x":1800.6000366210938}],"group":"","props":{"zindex":64}},"17063acc75aa5":{"id":"17063acc75aa5","to":{"id":"17063a4815ec7f","y":2839.5882352941153,"angle":0,"x":1184.6438759931218},"text":"","linkerType":"broken","name":"linker","lineStyle":{},"points":[{"y":2839.5882352941153,"x":1019.3703809031352},{"y":2839.5882352941153,"x":1019.3703809031352}],"locked":false,"dataAttributes":[],"from":{"id":"17063a83853119","y":2839.5882352941153,"angle":3.141592653589793,"x":854.0968858131487},"group":"","props":{"zindex":112}},"170630dac54181":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"资源定位"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170630dac54f1b","category":"default","name":"序号","value":"","type":"number"},{"id":"170630dac540c3","category":"default","name":"名称","value":"","type":"string"},{"id":"170630dac54ef7","category":"default","name":"所有者","value":"","type":"string"},{"id":"170630dac54688","category":"default","name":"连接","value":"","type":"link"},{"id":"170630dac54cec","category":"default","name":"便笺","value":"","type":"string"},{"id":"170630dac54de8","category":"default","name":"成本","value":"","type":"number"},{"id":"170630dac54f11","category":"default","name":"时间","value":"","type":"number"},{"id":"170630dac54f91","category":"default","name":"部门","value":"","type":"string"},{"id":"170630dac54282","category":"default","name":"输入","value":"","type":"string"},{"id":"170630dac54d84","category":"default","name":"输出","value":"","type":"string"},{"id":"170630dac5464a","category":"default","name":"风险","value":"","type":"string"},{"id":"170630dac5456a","category":"default","name":"备注","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170630dac54181","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"flow","title":"开始/结束","name":"terminator","fillStyle":{"color":"204,204,255","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"Math.min(w,h)/3"},{"action":"line","y":"0","x":"w-Math.min(w,h)/3"},{"action":"curve","y1":"0","y2":"h","x2":"w+Math.min(w,h)/3/3","y":"h","x1":"w+Math.min(w,h)/3/3","x":"w-Math.min(w,h)/3"},{"action":"line","y":"h","x":"Math.min(w,h)/3"},{"action":"curve","y1":"h","y2":"0","x2":"-Math.min(w,h)/3/3","y":"0","x1":"-Math.min(w,h)/3/3","x":"Math.min(w,h)/3"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":100,"y":225.5999984741211,"h":50,"angle":0,"x":1870.5999908447266,"zindex":4}},"170630ea158ca":{"to":{"id":"170630dac54181","angle":0,"y":250.5999984741211,"x":1870.5999908447266},"id":"170630ea158ca","linkerType":"broken","text":"","lineStyle":{},"name":"linker","from":{"id":"1706302b1eaa39","angle":3.141592653589793,"y":250.5999984741211,"x":1787.5999908447266},"dataAttributes":[],"locked":false,"points":[{"y":250.5999984741211,"x":1829.0999908447266},{"y":250.5999984741211,"x":1829.0999908447266}],"group":"","props":{"zindex":5}},"170636ae9cf617":{"textBlock":[{"position":{"w":"w-20","y":0,"h":"h","x":10},"text":"
doLoadDocument(InputSource inputSource, Resource resource)
XmlBeanDefinitionReader
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"170636aebf2884","category":"default","name":"序号","value":"","type":"number"},{"id":"170636aebf25c1","category":"default","name":"名称","value":"","type":"string"},{"id":"170636aebf25c7","category":"default","name":"所有者","value":"","type":"string"},{"id":"170636aebf2928","category":"default","name":"连接","value":"","type":"link"},{"id":"170636aebf263f","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"170636ae9cf617","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"category":"basic","title":"矩形","name":"rectangle","fillStyle":{"color":"204,255,230","type":"solid"},"path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"locked":false,"group":"","props":{"w":412,"y":1058.6000061035156,"h":69.39999389648438,"angle":0,"x":1226.5999908447266,"zindex":35}},"17063a462711fc":{"textBlock":[{"position":{"w":"w-20","h":"h","y":0,"x":10},"text":"
initMessageSource();
"}],"lineStyle":{},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{"size":15},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a46e09ef2","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a46e09e8f","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a46e09e46","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a46e09445","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a46e098f8","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a462711fc","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"矩形","category":"basic","name":"rectangle","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"204,255,230","type":"solid"},"locked":false,"group":"","props":{"w":412,"angle":0,"h":69.39999389648438,"y":2519.005885404699,"zindex":83,"x":1180.3257439102201}},"17063a88ae8ba":{"textBlock":[{"position":{"w":"w-20","h":"h-20","y":10,"x":10},"text":"初始化所有剩余的单例Bean"}],"lineStyle":{"lineWidth":0},"link":"","children":[],"parent":"","attribute":{"linkable":true,"visible":true,"container":false,"rotatable":true,"markerOffset":5,"collapsable":false,"collapsed":false},"fontStyle":{},"resizeDir":["tl","tr","br","bl"],"dataAttributes":[{"id":"17063a88c5f9c2","category":"default","name":"序号","value":"","type":"number"},{"id":"17063a88c5fece","category":"default","name":"名称","value":"","type":"string"},{"id":"17063a88c5ffd6","category":"default","name":"所有者","value":"","type":"string"},{"id":"17063a88c5f538","category":"default","name":"连接","value":"","type":"link"},{"id":"17063a88c5f4b","category":"default","name":"便笺","value":"","type":"string"}],"shapeStyle":{"alpha":1},"id":"17063a88ae8ba","anchors":[{"y":"0","x":"w/2"},{"y":"h","x":"w/2"},{"y":"h/2","x":"0"},{"y":"h/2","x":"w"}],"title":"备注","category":"basic","name":"note","path":[{"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]},{"fillStyle":{"color":"r-50,g-50,b-50","type":"solid"},"actions":[{"action":"move","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"close"}]},{"fillStyle":{"type":"none"},"actions":[{"action":"move","y":"0","x":"0"},{"action":"line","y":"0","x":"w-16"},{"action":"line","y":"16","x":"w"},{"action":"line","y":"h","x":"w"},{"action":"line","y":"h","x":"0"},{"action":"line","y":"0","x":"0"},{"action":"close"}]}],"fillStyle":{"color":"255, 255, 170"},"locked":false,"group":"","props":{"w":521.1764705882354,"angle":0,"h":64.49383473714948,"y":2909.6942591020115,"zindex":101,"x":332.9204152249133}}}}},"meta":{"id":"5e4e96f2e4b0996b2bab991b","member":"mashibing","exportTime":"2020-03-08 14:44:56","diagramInfo":{"category":"flow","title":"Spring IOC的初始化过程","created":"2020-02-20 22:25:54","creator":"mashibing","modified":"2020-03-07 16:51:10"},"type":"ProcessOn Schema File","version":"1.0"}} \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring-framework-5.1.x.zip" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring-framework-5.1.x.zip" new file mode 100644 index 00000000..4a9bf093 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring-framework-5.1.x.zip" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/compiler.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/compiler.xml" new file mode 100644 index 00000000..a8afeb7a --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/misc.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/workspace.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/workspace.xml" new file mode 100644 index 00000000..2afd762c --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/.idea/workspace.xml" @@ -0,0 +1,1216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rollback + autoc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1582356252096 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/src/test/java/MyTest3.java + 11 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.2.3.RELEASE/spring-core-5.2.3.RELEASE-sources.jar!/org/springframework/core/env/AbstractEnvironment.java + 123 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.2.3.RELEASE/spring-context-5.2.3.RELEASE-sources.jar!/org/springframework/context/support/AbstractApplicationContext.java + 328 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.2.3.RELEASE/spring-context-5.2.3.RELEASE-sources.jar!/org/springframework/context/support/AbstractApplicationContext.java + 518 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.2.3.RELEASE/spring-core-5.2.3.RELEASE-sources.jar!/org/springframework/core/env/AbstractPropertyResolver.java + 272 + + + + + + + + + + + + + + + locations[i] + JAVA + EXPRESSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JAVA + org.springframework.context.support.ClassPathXmlApplicationContext + + org.springframework.beans.factory.HierarchicalBeanFactory + org.springframework.core.io.ResourceLoader + org.springframework.context.support.AbstractXmlApplicationContext + org.springframework.beans.factory.Aware + org.springframework.context.ApplicationContext + java.lang.AutoCloseable + org.springframework.beans.factory.InitializingBean + org.springframework.context.support.AbstractRefreshableConfigApplicationContext + org.springframework.context.Lifecycle + java.lang.FunctionalInterface + org.springframework.context.support.AbstractApplicationContext + org.springframework.core.io.DefaultResourceLoader + java.io.Closeable + org.springframework.core.env.EnvironmentCapable + org.springframework.beans.factory.BeanFactory + org.springframework.context.ConfigurableApplicationContext + org.springframework.context.ApplicationEventPublisher + org.springframework.context.support.ClassPathXmlApplicationContext + org.springframework.core.io.support.ResourcePatternResolver + org.springframework.beans.factory.BeanNameAware + org.springframework.context.support.AbstractRefreshableApplicationContext + org.springframework.beans.factory.ListableBeanFactory + org.springframework.context.MessageSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.springframework.context.support.ClassPathXmlApplicationContext + org.springframework.context.MessageSource + + + All + private + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + spring_aop_tx + + + + + + + + 1.8 + + + + + + + + Maven: aopalliance:aopalliance:1.0 + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/pom.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/pom.xml" new file mode 100644 index 00000000..6f303969 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/pom.xml" @@ -0,0 +1,63 @@ + + + 4.0.0 + + com.mashibing + spring_aop_tx + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.48 + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/spring_aop_tx.iml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/spring_aop_tx.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/spring_aop_tx.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" new file mode 100644 index 00000000..6cdd5110 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" @@ -0,0 +1,50 @@ +package com.mashibing.dao; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class BookDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 减去某个用户的余额 + * @param userName + * @param price + */ + public void updateBalance(String userName,int price){ + String sql = "update account set balance=balance-? where username=?"; + jdbcTemplate.update(sql,price,userName); + } + + /** + * 按照图书的id来获取图书的价格 + * @param id + * @return + */ + public int getPrice(int id){ + String sql = "select price from book where id=?"; + return jdbcTemplate.queryForObject(sql,Integer.class,id); + } + + /** + * 减库存,减去某本书的库存 + * @param id + */ + public void updateStock(int id){ + String sql = "update book_stock set stock=stock-1 where id=?"; + jdbcTemplate.update(sql,id); + } + + /** + * 更新价格 + * @param id + */ + public void updatePrice(int id){ + String sql = "update book set price=price-1 where id=?"; + jdbcTemplate.update(sql,id); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" new file mode 100644 index 00000000..8d8d8aac --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" @@ -0,0 +1,19 @@ +package com.mashibing.dao; + +import com.mashibing.entity.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class EmpDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public void save(Emp emp){ + String sql = "insert into emp(empno,ename) values(?,?)"; + int update = jdbcTemplate.update(sql, emp.getEmpno(), emp.getEname()); + System.out.println(update); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" new file mode 100644 index 00000000..41df701e --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" @@ -0,0 +1,101 @@ +package com.mashibing.entity; + +import java.sql.Date; + +public class Emp { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; + + public Emp() { + } + + public Emp(Integer empno, String ename) { + this.empno = empno; + this.ename = ename; + } + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", deptno=" + deptno + + '}'; + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" new file mode 100644 index 00000000..ba5fcaa8 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" @@ -0,0 +1,53 @@ +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import com.mashibing.entity.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + private BookDao bookDao; + + /* + * propagation:传播特性:表示不同的事务之间执行的关系 + * isolation:隔离级别:4种隔离级别,会引发不同的数据错乱问题 + * timeout:超时时间, + * readonly:只读事务:如果配置了只读事务,那么在事务运行期间,不允许对数据进行修改,否则抛出异常 + * + * 设置哪些异常不会回滚数据 + * noRollBackfor: noRollbackFor = {ArithmeticException.class} + * noRollbackForClassName: + * + * 设置哪些异常回滚 + * rollBackfor: + * rollbackForClassName + * */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void buyBook() { + bookDao.getPrice(1); + bookDao.updateBalance("zhangsan", 100); + bookDao.updateStock(1); + int i = 1 / 0; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void updatePrice() { + bookDao.updatePrice(1); +// int i = 1/0; + } + + @Transactional + public void mult() { + buyBook(); + updatePrice(); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/service/MultService.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/service/MultService.java" new file mode 100644 index 00000000..87ce4bb3 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/java/com/mashibing/service/MultService.java" @@ -0,0 +1,29 @@ +package com.mashibing.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MultService { + + @Autowired + private BookService bookService; + + @Transactional + public void mult(){ + try { + bookService.buyBook(); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("----------"); + bookService.updatePrice(); + int i = 1/0; + } + +// @Transactional + public void buyBook(){ + bookService.buyBook(); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/applicationContext.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/applicationContext.xml" new file mode 100644 index 00000000..9d1a5c9d --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/applicationContext.xml" @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/db.properties" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/db.properties" new file mode 100644 index 00000000..6a5136c5 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://localhost:3306/tx +jdbc.driverName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/tx.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/tx.xml" new file mode 100644 index 00000000..9084b0ce --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/main/resources/tx.xml" @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest.java" new file mode 100644 index 00000000..58c76173 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest.java" @@ -0,0 +1,85 @@ +import com.alibaba.druid.pool.DruidDataSource; +import com.mashibing.dao.EmpDao; +import com.mashibing.entity.Emp; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class MyTest { + + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + @Test + public void test01() throws SQLException { + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource.getConnection()); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + System.out.println(jdbcTemplate); + } + + @Test + public void test02(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + int zhangsan = jdbcTemplate.update(sql, 1111, "zhangsan"); + System.out.println(zhangsan); + } + + @Test + public void test03(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + List list = new ArrayList(); + list.add(new Object[]{2222,"lisi"}); + list.add(new Object[]{3333,"wangwu"}); + list.add(new Object[]{4444,"maliu"}); + int[] result = jdbcTemplate.batchUpdate(sql,list); + for (int i : result) { + System.out.println(i); + } + } + + @Test + public void test04(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "delete from emp where empno = ?"; + int zhangsan = jdbcTemplate.update(sql, 1111); + System.out.println(zhangsan); + } + + @Test + public void test05(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "update emp set ename=? where empno=?"; + int zhangsan = jdbcTemplate.update(sql, "mashibing",2222); + System.out.println(zhangsan); + } + + @Test + public void test06(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where empno=?"; + Emp result = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Emp.class),7369); + System.out.println(result); + } + + @Test + public void test07(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where sal >?"; + List result = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Emp.class),1500); + for (Emp emp : result) { + System.out.println(emp); + } + } + + @Test + public void test08(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + empDao.save(new Emp(1111,"zhangsan")); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest2.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest2.java" new file mode 100644 index 00000000..5cc5db54 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest2.java" @@ -0,0 +1,15 @@ +import com.mashibing.service.BookService; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.FileNotFoundException; + +public class MyTest2 { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + + @Test + public void test01() throws FileNotFoundException { + BookService bean = context.getBean(BookService.class); + bean.buyBook(); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest3.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest3.java" new file mode 100644 index 00000000..4d7aceda --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest3.java" @@ -0,0 +1,19 @@ +import com.mashibing.service.BookService; +import com.mashibing.service.MultService; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.FileNotFoundException; + +public class MyTest3 { + + @Test + public void test01() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); +// MultService bean = context.getBean(MultService.class); +// bean.mult(); +// bean.buyBook(); + BookService bean = context.getBean(BookService.class); + bean.mult(); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest4.java" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest4.java" new file mode 100644 index 00000000..b4d06d93 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/src/test/java/MyTest4.java" @@ -0,0 +1,10 @@ +import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable; + +import java.util.Properties; + +public class MyTest4 { + public static void main(String[] args) { + Properties properties = System.getProperties(); + System.out.println(properties); + } +} diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/applicationContext.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/applicationContext.xml" new file mode 100644 index 00000000..9d1a5c9d --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/applicationContext.xml" @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" new file mode 100644 index 00000000..86f065f4 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..54e52506 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" new file mode 100644 index 00000000..b3fcbd13 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" new file mode 100644 index 00000000..926b1ef5 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/service/MultService.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/service/MultService.class" new file mode 100644 index 00000000..66a0fc3a Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/com/mashibing/service/MultService.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/db.properties" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/db.properties" new file mode 100644 index 00000000..6a5136c5 --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://localhost:3306/tx +jdbc.driverName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/tx.xml" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/tx.xml" new file mode 100644 index 00000000..9084b0ce --- /dev/null +++ "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/classes/tx.xml" @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest.class" new file mode 100644 index 00000000..79b48829 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest2.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest2.class" new file mode 100644 index 00000000..5423dd1c Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest2.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest3.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest3.class" new file mode 100644 index 00000000..0bd21f5a Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest3.class" differ diff --git "a/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest4.class" "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest4.class" new file mode 100644 index 00000000..4f4864c2 Binary files /dev/null and "b/javaframework/spring/08Spring\346\272\220\347\240\201\350\256\262\350\247\243/spring_aop_tx/target/test-classes/MyTest4.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/07\345\212\250\346\200\201\344\273\243\347\220\206.md" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/07\345\212\250\346\200\201\344\273\243\347\220\206.md" new file mode 100644 index 00000000..b26bd9c9 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/07\345\212\250\346\200\201\344\273\243\347\220\206.md" @@ -0,0 +1,1458 @@ +# 07动态代理 + +### 1、jdk的动态代理 + +​ 动态代理与静态代理的区别此处不再赘述,大家可以看马老师的设计模式视频,我们主要讲一下动态代理的实现原理,说明白原理的话肯定是要看源码了,大家不要慌,干就完了!!! + +​ 其实在使用动态代理的时候最最核心的就是Proxy.newProxyInstance(loader, interfaces, h);废话不多说,直接干源码。 + +**动态代理的样例代码:** + +Calculator.java + +```java +package com.mashibing; + +public interface Calculator { + + public int add(int i, int j); + + public int sub(int i, int j); + + public int mult(int i, int j); + + public int div(int i, int j); +} +``` + +MyCalculator.java + +```java +package com.mashibing; + +public class MyCalculator implements Calculator { + public int add(int i, int j) { + int result = i + j; + return result; + } + + public int sub(int i, int j) { + int result = i - j; + return result; + } + + public int mult(int i, int j) { + int result = i * j; + return result; + } + + public int div(int i, int j) { + int result = i / j; + return result; + } +} +``` + +CalculatorProxy.java + +```java +package com.mashibing; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +public class CalculatorProxy { + public static Calculator getProxy(final Calculator calculator){ + ClassLoader loader = calculator.getClass().getClassLoader(); + Class[] interfaces = calculator.getClass().getInterfaces(); + InvocationHandler h = new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object result = null; + try { + result = method.invoke(calculator, args); + } catch (Exception e) { + } finally { + } + return result; + } + }; + Object proxy = Proxy.newProxyInstance(loader, interfaces, h); + return (Calculator) proxy; + } +} +``` + +Test.java + +```java +package com.mashibing; + +public class Test { + public static void main(String[] args) { + Calculator proxy = CalculatorProxy.getProxy(new MyCalculator()); + proxy.add(1,1); + System.out.println(proxy.getClass()); + } +} +``` + +**动态代理的源码:** + +Proxy.java的newProxyInstance方法: + +```java +public static Object newProxyInstance(ClassLoader loader, + Class[] interfaces, + InvocationHandler h) + throws IllegalArgumentException + { + //判断InvocationHandler是否为空,若为空,抛出空指针异常 + Objects.requireNonNull(h); + + final Class[] intfs = interfaces.clone(); + final SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + checkProxyAccess(Reflection.getCallerClass(), loader, intfs); + } + + /* + * Look up or generate the designated proxy class. + * 生成接口的代理类的字节码文件 + */ + Class cl = getProxyClass0(loader, intfs); + + /* + * Invoke its constructor with the designated invocation handler. + * 使用自定义的InvocationHandler作为参数,调用构造函数获取代理类对象实例 + */ + try { + if (sm != null) { + checkNewProxyPermission(Reflection.getCallerClass(), cl); + } + //获取代理对象的构造方法 + final Constructor cons = cl.getConstructor(constructorParams); + final InvocationHandler ih = h; + if (!Modifier.isPublic(cl.getModifiers())) { + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + cons.setAccessible(true); + return null; + } + }); + } + //生成代理类的实例并把InvocationHandlerImpl的实例传给构造方法 + return cons.newInstance(new Object[]{h}); + } catch (IllegalAccessException|InstantiationException e) { + throw new InternalError(e.toString(), e); + } catch (InvocationTargetException e) { + Throwable t = e.getCause(); + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } else { + throw new InternalError(t.toString(), t); + } + } catch (NoSuchMethodException e) { + throw new InternalError(e.toString(), e); + } + } +``` + +getProxyClass0(ClassLoader loader,Class... interfaces) + +```java + private static Class getProxyClass0(ClassLoader loader, + Class... interfaces) { + //限定代理的接口不能超过65535个 + if (interfaces.length > 65535) { + throw new IllegalArgumentException("interface limit exceeded"); + } + + // If the proxy class defined by the given loader implementing + // the given interfaces exists, this will simply return the cached copy; + // otherwise, it will create the proxy class via the ProxyClassFactory + // 如果缓存中已经存在相应接口的代理类,直接返回,否则,使用ProxyClassFactory创建代理类 + return proxyClassCache.get(loader, interfaces); + } + + /** + * a cache of proxy classes + */ + private static final WeakCache[], Class> + proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory()); +``` + +get()方法: + +```java + public V get(K key, P parameter) { + Objects.requireNonNull(parameter); + + expungeStaleEntries(); + + Object cacheKey = CacheKey.valueOf(key, refQueue); + + // lazily install the 2nd level valuesMap for the particular cacheKey + ConcurrentMap> valuesMap = map.get(cacheKey); + if (valuesMap == null) { + ConcurrentMap> oldValuesMap + = map.putIfAbsent(cacheKey, + valuesMap = new ConcurrentHashMap<>()); + if (oldValuesMap != null) { + valuesMap = oldValuesMap; + } + } + + // create subKey and retrieve the possible Supplier stored by that + // subKey from valuesMap + Object subKey = Objects.requireNonNull(subKeyFactory.apply(key, parameter)); + Supplier supplier = valuesMap.get(subKey); + Factory factory = null; + + while (true) { + if (supplier != null) { + // supplier might be a Factory or a CacheValue instance + V value = supplier.get(); + if (value != null) { + return value; + } + } + // else no supplier in cache + // or a supplier that returned null (could be a cleared CacheValue + // or a Factory that wasn't successful in installing the CacheValue) + + // lazily construct a Factory + if (factory == null) { + factory = new Factory(key, parameter, subKey, valuesMap); + } + + if (supplier == null) { + supplier = valuesMap.putIfAbsent(subKey, factory); + if (supplier == null) { + // successfully installed Factory + supplier = factory; + } + // else retry with winning supplier + } else { + if (valuesMap.replace(subKey, supplier, factory)) { + // successfully replaced + // cleared CacheEntry / unsuccessful Factory + // with our Factory + supplier = factory; + } else { + // retry with current supplier + supplier = valuesMap.get(subKey); + } + } + } + } +``` + +在此方法中会调用suppier.get方法,suppier就是Factory,此类定义在WeakCache内部 + +```java + @Override + public synchronized V get() { // serialize access + // re-check + Supplier supplier = valuesMap.get(subKey); + if (supplier != this) { + // something changed while we were waiting: + // might be that we were replaced by a CacheValue + // or were removed because of failure -> + // return null to signal WeakCache.get() to retry + // the loop + return null; + } + // else still us (supplier == this) + + // create new value + V value = null; + try { + value = Objects.requireNonNull(valueFactory.apply(key, parameter)); + } finally { + if (value == null) { // remove us on failure + valuesMap.remove(subKey, this); + } + } + // the only path to reach here is with non-null value + assert value != null; + + // wrap value with CacheValue (WeakReference) + CacheValue cacheValue = new CacheValue<>(value); + + // put into reverseMap + reverseMap.put(cacheValue, Boolean.TRUE); + + // try replacing us with CacheValue (this should always succeed) + if (!valuesMap.replace(subKey, this, cacheValue)) { + throw new AssertionError("Should not reach here"); + } + + // successfully replaced us with new CacheValue -> return the value + // wrapped by it + return value; + } + } +``` + +发现在此方法中调用了valueFactory.apply(key, parameter)方法,此对象其实就是Proxy中的ProxyClassFactory,会调用其apply方法 + +```java + // prefix for all proxy class names + //代理类的前缀 + private static final String proxyClassNamePrefix = "$Proxy"; + + // next number to use for generation of unique proxy class names + //生成代理类名称的计数器 + private static final AtomicLong nextUniqueNumber = new AtomicLong(); +@Override + public Class apply(ClassLoader loader, Class[] interfaces) { + + Map, Boolean> interfaceSet = new IdentityHashMap<>(interfaces.length); + for (Class intf : interfaces) { + /* + * Verify that the class loader resolves the name of this + * interface to the same Class object. + * 家安眼泪加载器是否能通接口名称加载该类 + */ + Class interfaceClass = null; + try { + interfaceClass = Class.forName(intf.getName(), false, loader); + } catch (ClassNotFoundException e) { + } + if (interfaceClass != intf) { + throw new IllegalArgumentException( + intf + " is not visible from class loader"); + } + /* + * Verify that the Class object actually represents an + * interface. + * 检测该类是否是接口类型 + */ + if (!interfaceClass.isInterface()) { + throw new IllegalArgumentException( + interfaceClass.getName() + " is not an interface"); + } + /* + * Verify that this interface is not a duplicate. + * 检验接口是否重复 + */ + if (interfaceSet.put(interfaceClass, Boolean.TRUE) != null) { + throw new IllegalArgumentException( + "repeated interface: " + interfaceClass.getName()); + } + } + + //代理类包名 + String proxyPkg = null; // package to define proxy class in + int accessFlags = Modifier.PUBLIC | Modifier.FINAL; + + /* + * Record the package of a non-public proxy interface so that the + * proxy class will be defined in the same package. Verify that + * all non-public proxy interfaces are in the same package. + * 非public接口,代理类的包名与接口的包名相同 + */ + for (Class intf : interfaces) { + int flags = intf.getModifiers(); + if (!Modifier.isPublic(flags)) { + accessFlags = Modifier.FINAL; + String name = intf.getName(); + int n = name.lastIndexOf('.'); + String pkg = ((n == -1) ? "" : name.substring(0, n + 1)); + if (proxyPkg == null) { + proxyPkg = pkg; + } else if (!pkg.equals(proxyPkg)) { + throw new IllegalArgumentException( + "non-public interfaces from different packages"); + } + } + } + + if (proxyPkg == null) { + // if no non-public proxy interfaces, use com.sun.proxy package + // public代理接口,使用com.sun.proxy包名 + proxyPkg = ReflectUtil.PROXY_PACKAGE + "."; + } + + /* + * Choose a name for the proxy class to generate. + * 为代理类生成名字 + */ + long num = nextUniqueNumber.getAndIncrement(); + String proxyName = proxyPkg + proxyClassNamePrefix + num; + + /* + * Generate the specified proxy class. + * 真正生成代理类的字节码文件的地方 + */ + byte[] proxyClassFile = ProxyGenerator.generateProxyClass( + proxyName, interfaces, accessFlags); + try { + //使用类加载器将代理类的字节码文件加载到JVM中 + return defineClass0(loader, proxyName, + proxyClassFile, 0, proxyClassFile.length); + } catch (ClassFormatError e) { + /* + * A ClassFormatError here means that (barring bugs in the + * proxy class generation code) there was some other + * invalid aspect of the arguments supplied to the proxy + * class creation (such as virtual machine limitations + * exceeded). + */ + throw new IllegalArgumentException(e.toString()); + } + } + } +``` + +实际生成的方法是generateProxyClass + +```java + public static byte[] generateProxyClass(final String var0, Class[] var1, int var2) { + ProxyGenerator var3 = new ProxyGenerator(var0, var1, var2); + final byte[] var4 = var3.generateClassFile(); + //将要生成代理类的字节码文件保存在磁盘中 + if (saveGeneratedFiles) { + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + try { + int var1 = var0.lastIndexOf(46); + Path var2; + if (var1 > 0) { + Path var3 = Paths.get(var0.substring(0, var1).replace('.', File.separatorChar)); + Files.createDirectories(var3); + var2 = var3.resolve(var0.substring(var1 + 1, var0.length()) + ".class"); + } else { + var2 = Paths.get(var0 + ".class"); + } + + Files.write(var2, var4, new OpenOption[0]); + return null; + } catch (IOException var4x) { + throw new InternalError("I/O exception saving generated file: " + var4x); + } + } + }); + } + + return var4; + } +``` + +如果想要生成的话可以添加如下参数: + +```java + System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); +``` + +生成的代理类的反编译码为: + +$Proxy.java + +```java +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package com.sun.proxy; + +import com.mashibing.Calculator; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.lang.reflect.UndeclaredThrowableException; + +public final class $Proxy0 extends Proxy implements Calculator { + private static Method m1; + private static Method m2; + private static Method m3; + private static Method m4; + private static Method m5; + private static Method m6; + private static Method m0; + + public $Proxy0(InvocationHandler var1) throws { + super(var1); + } + + public final boolean equals(Object var1) throws { + try { + return (Boolean)super.h.invoke(this, m1, new Object[]{var1}); + } catch (RuntimeException | Error var3) { + throw var3; + } catch (Throwable var4) { + throw new UndeclaredThrowableException(var4); + } + } + + public final String toString() throws { + try { + return (String)super.h.invoke(this, m2, (Object[])null); + } catch (RuntimeException | Error var2) { + throw var2; + } catch (Throwable var3) { + throw new UndeclaredThrowableException(var3); + } + } + + public final int add(int var1, int var2) throws { + try { + return (Integer)super.h.invoke(this, m3, new Object[]{var1, var2}); + } catch (RuntimeException | Error var4) { + throw var4; + } catch (Throwable var5) { + throw new UndeclaredThrowableException(var5); + } + } + + public final int sub(int var1, int var2) throws { + try { + return (Integer)super.h.invoke(this, m4, new Object[]{var1, var2}); + } catch (RuntimeException | Error var4) { + throw var4; + } catch (Throwable var5) { + throw new UndeclaredThrowableException(var5); + } + } + + public final int mult(int var1, int var2) throws { + try { + return (Integer)super.h.invoke(this, m5, new Object[]{var1, var2}); + } catch (RuntimeException | Error var4) { + throw var4; + } catch (Throwable var5) { + throw new UndeclaredThrowableException(var5); + } + } + + public final int div(int var1, int var2) throws { + try { + return (Integer)super.h.invoke(this, m6, new Object[]{var1, var2}); + } catch (RuntimeException | Error var4) { + throw var4; + } catch (Throwable var5) { + throw new UndeclaredThrowableException(var5); + } + } + + public final int hashCode() throws { + try { + return (Integer)super.h.invoke(this, m0, (Object[])null); + } catch (RuntimeException | Error var2) { + throw var2; + } catch (Throwable var3) { + throw new UndeclaredThrowableException(var3); + } + } + + static { + try { + m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object")); + m2 = Class.forName("java.lang.Object").getMethod("toString"); + m3 = Class.forName("com.mashibing.Calculator").getMethod("add", Integer.TYPE, Integer.TYPE); + m4 = Class.forName("com.mashibing.Calculator").getMethod("sub", Integer.TYPE, Integer.TYPE); + m5 = Class.forName("com.mashibing.Calculator").getMethod("mult", Integer.TYPE, Integer.TYPE); + m6 = Class.forName("com.mashibing.Calculator").getMethod("div", Integer.TYPE, Integer.TYPE); + m0 = Class.forName("java.lang.Object").getMethod("hashCode"); + } catch (NoSuchMethodException var2) { + throw new NoSuchMethodError(var2.getMessage()); + } catch (ClassNotFoundException var3) { + throw new NoClassDefFoundError(var3.getMessage()); + } + } +} +``` + +### 2、cglib的动态代理 + +​ CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。 + +​ CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供方法的interception(拦截)。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的字节码。当然不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。 + +**操作代码:** + +MyCalculator.java + +```java +package com.mashibing.cglib; + +public class MyCalculator { + public int add(int i, int j) { + int result = i + j; + return result; + } + + public int sub(int i, int j) { + int result = i - j; + return result; + } + + public int mult(int i, int j) { + int result = i * j; + return result; + } + + public int div(int i, int j) { + int result = i / j; + return result; + } +} +``` + +MyCglib.java + +```java +package com.mashibing.cglib; + +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.Method; + +public class MyCglib implements MethodInterceptor { + @Override + public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { + Object o1 = methodProxy.invokeSuper(o, objects); + return o1; + } +} +``` + +MyTest.java + +```java +package com.mashibing.cglib; + +import net.sf.cglib.core.DebuggingClassWriter; +import net.sf.cglib.proxy.Enhancer; + +public class MyTest { + public static void main(String[] args) { + //动态代理创建的class文件存储到本地 + System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"d:\\code"); + //通过cglib动态代理获取代理对象的过程,创建调用的对象 + Enhancer enhancer = new Enhancer(); + //设置enhancer对象的父类 + enhancer.setSuperclass(MyCalculator.class); + //设置enhancer的回调对象 + enhancer.setCallback(new MyCglib()); + //创建代理对象 + MyCalculator myCalculator = (MyCalculator) enhancer.create(); + //通过代理对象调用目标方法 + myCalculator.add(1,1); + System.out.println(myCalculator.getClass()); + } +} +``` + +实现原理: + +​ 利用cglib实现动态代理的时候,必须要实现MethodInterceptor接口,此接口源码如下: + +MethodInterceptor.java + +```java +package net.sf.cglib.proxy; + +public interface MethodInterceptor +extends Callback +{ + /* + 此方法用来实现方法的拦截,四个参数分别表示的含义: + obj:表示增强的对象,即实现这个接口类的一个对象 + method:表示要拦截的方法 + args:表示被拦截的方法的参数 + proxy:表示要触发父类的方法对象 + */ + public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, + MethodProxy proxy) throws Throwable; + +} +``` + +​ 在我们的测试类中,大家发现了,我们创建了一个cglib的Enhancer对象,并且设置了父类、回调函数等参数,最重要的入口函数是create()方法: + +#### 1、Enhancer.create() + +```java + /** + * Generate a new class if necessary and uses the specified + * callbacks (if any) to create a new object instance. + * Uses the no-arg constructor of the superclass. + * @return a new instance + * 如果必须要创建一个新类,那么就用指定的回调对象创建一个新的对象实例,使用的父类的参数的构造方法来实 * 例化父类的部分 + */ + public Object create() { + //不作代理类限制 + classOnly = false; + //没有构造参数类型 + argumentTypes = null; + //执行创建 + return createHelper(); + } +``` + +#### 2、Enhancer.createHelper() + +```java + private Object createHelper() { + //校验callbackTypes、filter是否为空,以及为空时的处理 + preValidate(); + // 通过newInstance方法来创建EnhancerKey对象 + Object key = KEY_FACTORY.newInstance((superclass != null) ? superclass.getName() : null, + ReflectUtils.getNames(interfaces), + filter == ALL_ZERO ? null : new WeakCacheKey(filter), + callbackTypes, + useFactory, + interceptDuringConstruction, + serialVersionUID); + // 设置当前enhancer的代理类的key标识 + this.currentKey = key; + // 调用父类即AbstractClassGenerator的创建代理类 + Object result = super.create(key); + return result; + } +``` + +preValidate() + +```java + private void preValidate() { + if (callbackTypes == null) { + //确定传入的callback类型 + callbackTypes = CallbackInfo.determineTypes(callbacks, false); + validateCallbackTypes = true; + } + if (filter == null) { + if (callbackTypes.length > 1) { + throw new IllegalStateException("Multiple callback types possible but no filter specified"); + } + filter = ALL_ZERO; + } + } +``` + +```java +private static final CallbackInfo[] CALLBACKS = { + new CallbackInfo(NoOp.class, NoOpGenerator.INSTANCE), + new CallbackInfo(MethodInterceptor.class, MethodInterceptorGenerator.INSTANCE), + new CallbackInfo(InvocationHandler.class, InvocationHandlerGenerator.INSTANCE), + new CallbackInfo(LazyLoader.class, LazyLoaderGenerator.INSTANCE), + new CallbackInfo(Dispatcher.class, DispatcherGenerator.INSTANCE), + new CallbackInfo(FixedValue.class, FixedValueGenerator.INSTANCE), + new CallbackInfo(ProxyRefDispatcher.class, DispatcherGenerator.PROXY_REF_INSTANCE), + }; +``` + +​ 该方法主要是做验证并确定CallBack类型,我们使用的是MethodInterceptor,然后创建当前代理类的标识代理类,用这个标识代理类调用(AbstractClassGenerator)的create(key)方法创建,下面我们开始分析标识代理类创建逻辑 以及后面父类创建我们需要的代理类的逻辑。 + +​ 标识代理类的创建类成员变量即KEY_FACTORY是创建代理类的核心 + +#### 3、标识代理类 + +##### 1、KEY_FACTORY + +​ 追踪源码可以看到,KEY_FACTORY在Enhancer的初始化即会创建一个final的静态变量 + +```java + private static final EnhancerKey KEY_FACTORY = + (EnhancerKey)KeyFactory.create(EnhancerKey.class, KeyFactory.HASH_ASM_TYPE, null); +``` + +##### 2、Keyfactory_create方法 + +  这儿可以看到使用key工厂创建出对应class的代理类,后面的KeyFactory_HASH_ASM_TYPE即代理类中创建HashCode方法的策略。我们接着点击源码查看 + +```java +public static KeyFactory create(ClassLoader loader, Class keyInterface, KeyFactoryCustomizer customizer, + List next) { + //创建一个最简易的代理类生成器 即只会生成HashCode equals toString newInstance方法 + Generator gen = new Generator(); + //设置接口为enhancerKey类型 + gen.setInterface(keyInterface); + + if (customizer != null) { + //添加定制器 + gen.addCustomizer(customizer); + } + if (next != null && !next.isEmpty()) { + for (KeyFactoryCustomizer keyFactoryCustomizer : next) { + //添加定制器 + gen.addCustomizer(keyFactoryCustomizer); + } + } + //设置生成器的类加载器 + gen.setClassLoader(loader); + //生成enhancerKey的代理类 + return gen.create(); + } +``` + +##### 3、Generator的create方法 + +  这儿创建了一个简易的代理类生成器(KeyFactory的内部类Generator ,与Enhancer一样继承自抽象类AbstractClassGenerator)来生成我们需要的标识代理类,我们接着看gen.create()方法 + +```java +public KeyFactory create() {         + //设置了该生成器生成代理类的名字前缀,即我们的接口名Enhancer.enhancerKey + setNamePrefix(keyInterface.getName()); + return (KeyFactory)super.create(keyInterface.getName()); + } +``` + +##### 4、AbstractClassGenerator的create(Key)方法 + +```java +protected Object create(Object key) { + try { + //获取到当前生成器的类加载器 + ClassLoader loader = getClassLoader(); + //当前类加载器对应的缓存 缓存key为类加载器,缓存的value为ClassLoaderData 这个类后面会再讲 + Map cache = CACHE; + //先从缓存中获取下当前类加载器所有加载过的类 + ClassLoaderData data = cache.get(loader); + //如果为空 + if (data == null) { + synchronized (AbstractClassGenerator.class) { + cache = CACHE; + data = cache.get(loader); + //经典的防止并发修改 二次判断 + if (data == null) { + //新建一个缓存Cache 并将之前的缓存Cache的数据添加进来 并将已经被gc回收的数据给清除掉 + Map newCache = new WeakHashMap(cache); + //新建一个当前加载器对应的ClassLoaderData 并加到缓存中 但ClassLoaderData中此时还没有数据 + data = new ClassLoaderData(loader); + newCache.put(loader, data); + //刷新全局缓存 + CACHE = newCache; + } + } + } + //设置一个全局key + this.key = key; + + //在刚创建的data(ClassLoaderData)中调用get方法 并将当前生成器, + //以及是否使用缓存的标识穿进去 系统参数 System.getProperty("cglib.useCache", "true") + //返回的是生成好的代理类的class信息 + Object obj = data.get(this, getUseCache()); + //如果为class则实例化class并返回 就是我们需要的代理类 + if (obj instanceof Class) { + return firstInstance((Class) obj); + } + //如果不是则说明是实体 则直接执行另一个方法返回实体 + return nextInstance(obj); + } catch (RuntimeException e) { + throw e; + } catch (Error e) { + throw e; + } catch (Exception e) { + throw new CodeGenerationException(e); + } + } +``` + +​ 这个方法可以看到主要为根据类加载器定义一个缓存,里面装载了缓存的类信息,然后调用这个ClassLoaderData的get方法获取到数据,如果为class信息 那么直接使用反射实例化,如果返回的是实体类,则解析实体类的信息,调用其newInstance方法重新生成一个实例(cglib的代理类都会生成newInstance方法) + +##### 5、data.get(this,getUseCache) + +```java +public Object get(AbstractClassGenerator gen, boolean useCache) { + //如果不用缓存 (默认使用) + if (!useCache) { + //则直接调用生成器的命令 + return gen.generate(ClassLoaderData.this); + } else { + //从缓存中获取值 + Object cachedValue = generatedClasses.get(gen); + //解包装并返回 + return gen.unwrapCachedValue(cachedValue); + } + } +``` + +​ 如果可以用缓存则调用缓存,不能调用缓存则直接生成, 这儿我们先看调用缓存的,在之前的步骤中,我们设置了一个key为ClassLoader,值为ClassLoaderData的缓存,这儿我们new了一个ClassLoaderData 并将类加载器传了进去 ,并且设置了这个Generator的key,我们看下new的逻辑 + +```java +public ClassLoaderData(ClassLoader classLoader) { + //判断类加载器不能为空 + if (classLoader == null) { + throw new IllegalArgumentException("classLoader == null is not yet supported"); + } + //设置类加载器 弱引用 即在下次垃圾回收时就会进行回收 + this.classLoader = new WeakReference(classLoader); + //新建一个回调函数 这个回调函数的作用在于缓存中没获取到值时 调用传入的生成的生成代理类并返回 + Function load = + new Function() { + public Object apply(AbstractClassGenerator gen) { + Class klass = gen.generate(ClassLoaderData.this); + return gen.wrapCachedClass(klass); + } + }; + //为这个ClassLoadData新建一个缓存类 这个loadingcache稍后会讲 + generatedClasses = new LoadingCache(GET_KEY, load); + } + + + private static final Function GET_KEY = new Function() { + public Object apply(AbstractClassGenerator gen) { + return gen.key; + } +}; +``` + +​ 可以看到每个类加载器都对应着一个代理类缓存对象 ,这里面定义了类加载器,缓存调用没查询到的调用函数,以及新建了一个LoadingCache来缓存这个类加载器对应的缓存,这儿传入的两个参数,load代表缓存查询失败时的回调函数,而GET_KEY则是回调时获取调用生成器的key 即4中传入的key 也即是我们的代理类标识符。 然后我们接着看generatedClasses.get(gen);的方法 + +##### 6、generatedClasses.get(gen); + +​ 这个方法主要传入代理类生成器 并根据代理类生成器获取值返回。这儿主要涉及到的类就是LoadingCache,这个类可以看做是某个CLassLoader对应的所有代理类缓存库,是真正缓存东西的地方。我们分析下这个类 + +```java +package net.sf.cglib.core.internal; + +import java.util.concurrent.*; + +public class LoadingCache { + protected final ConcurrentMap map; + protected final Function loader; + protected final Function keyMapper; + + public static final Function IDENTITY = new Function() { + public Object apply(Object key) { + return key; + } + }; + //初始化类 kemapper代表获取某个代理类生成器的标识,loader即缓存查找失败后的回调函数 + public LoadingCache(Function keyMapper, Function loader) { + this.keyMapper = keyMapper; + this.loader = loader; + //这个map是缓存代理类的地方 + this.map = new ConcurrentHashMap(); + } + + @SuppressWarnings("unchecked") + public static Function identity() { + return IDENTITY; + } + //这儿key是代理类生成器 + public V get(K key) { + //获取到代理类生成器的标识 + final KK cacheKey = keyMapper.apply(key); + //根据缓代理类生成器的标识获取代理类 + Object v = map.get(cacheKey); + //如果结果不为空且不是FutureTask 即线程池中用于获取返回结果的接口 + if (v != null && !(v instanceof FutureTask)) { + //直接返回 + return (V) v; + } + //否则就是没查询到 或者还未处理完 + return createEntry(key, cacheKey, v); + } + + protected V createEntry(final K key, KK cacheKey, Object v) { + //初始化任务task + FutureTask task; + //初始化创建标识 + boolean creator = false; + if (v != null) { + // 则说明这是一个FutureTask + task = (FutureTask) v; + } else { + //否则还没开始创建这个代理类 直接创建任务 + task = new FutureTask(new Callable() { + public V call() throws Exception { + //这儿会直接调用生成器的generate方法 + return loader.apply(key); + } + }); + //将这个任务推入缓存Map 如果对应key已经有则返回已经有的task, + Object prevTask = map.putIfAbsent(cacheKey, task); + //如果为null则代表还没有创建 标识更新为true 且运行这个任务 + if (prevTask == null) { + // creator does the load + creator = true; + task.run(); + } + //如果是task 说明另一个线程已经创建了task + else if (prevTask instanceof FutureTask) { + task = (FutureTask) prevTask; + } + //到这儿说明另一个线程已经执行完了 直接返回 + else { + return (V) prevTask; + } + + //上面的一堆判断主要是为了防止并发出现的问题 + } + + V result; + try { + //到这儿说明任务执行完并拿到对应的代理类了 + result = task.get(); + } catch (InterruptedException e) { + throw new IllegalStateException("Interrupted while loading cache item", e); + } catch (ExecutionException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw ((RuntimeException) cause); + } + throw new IllegalStateException("Unable to load cache item", cause); + } + //如果这次执行是新建的 + if (creator) { + //将之前的FutureTask缓存直接覆盖为实际的代理类信息 + map.put(cacheKey, result); + } + //返回结果 + return result; + } +} +``` + +  通过上面的分析可以得知,这个类主要作用是传入代理类生成器,根据这个代理类生成器以及代理类生成器的key来获取缓存,如果没有获取到则构建一个FutureTask来回调我们之前初始化时传入的 回调函数,并调用其中的apply方法,而具体调用的则是我们传入的代理类生成器的generate(LoadClassData)方法,将返回值覆盖之前的FutureTask成为真正的缓存。所以这个类的主要作用还是缓存。 这样则和5中不使用缓存时调用了一样的方法。所以我们接着来分析生成方法 generate(ClassLoadData),这儿因为我们使用的代理类生成器是Genrator,该类没有重写generate方法,所以回到了父类AbstractClassGenerator的generate方法 + +##### 7、AbstractClassGenerator.generate 方法 + +```java +protected Class generate(ClassLoaderData data) { + Class gen; + Object save = CURRENT.get(); + //当前的代理类生成器存入ThreadLocal中 + CURRENT.set(this); + try { + //获取到ClassLoader + ClassLoader classLoader = data.getClassLoader(); + //判断不能为空 + if (classLoader == null) { + throw new IllegalStateException("ClassLoader is null while trying to define class " + + getClassName() + ". It seems that the loader has been expired from a weak reference somehow. " + + "Please file an issue at cglib's issue tracker."); + } + synchronized (classLoader) { + //生成代理类名字 + String name = generateClassName(data.getUniqueNamePredicate()); + //缓存中存入这个名字 + data.reserveName(name); + //当前代理类生成器设置类名 + this.setClassName(name); + } + //尝试从缓存中获取类 + if (attemptLoad) { + try { + //要是能获取到就直接返回了 即可能出现并发 其他线程已经加载 + gen = classLoader.loadClass(getClassName()); + return gen; + } catch (ClassNotFoundException e) { + // 发现异常说明没加载到 不管了 + } + } + //生成字节码 + byte[] b = strategy.generate(this); + //获取到字节码代表的class的名字 + String className = ClassNameReader.getClassName(new ClassReader(b)); + //核实是否为protect + ProtectionDomain protectionDomain = getProtectionDomain(); + synchronized (classLoader) { // just in case + //如果不是protect + if (protectionDomain == null) { + //根据字节码 类加载器 以及类名字 将class加载到内存中 + gen = ReflectUtils.defineClass(className, b, classLoader); + } else { + //根据字节码 类加载器 以及类名字 以及找到的Protect级别的实体 将class加载到内存中 + gen = ReflectUtils.defineClass(className, b, classLoader, protectionDomain); + } + } +        //返回生成的class信息 + return gen; + } catch (RuntimeException e) { + throw e; + } catch (Error e) { + throw e; + } catch (Exception e) { + throw new CodeGenerationException(e); + } finally { + CURRENT.set(save); + } + } +``` + +​ 这个方法主要设置了下当前类生成器的类名,然后调用stratege的generate方法返回字节码,根据字节码 类名 类加载器将字节码所代表的类加载到内存中,这个功能看一下大概就懂,我们接下来主要分析字节码生成方法 + +##### 8、DefaultGeneratorStrategy.generate(ClassGenerator cg) + +```java +public byte[] generate(ClassGenerator cg) throws Exception { + //创建一个写入器 + DebuggingClassWriter cw = getClassVisitor(); + //加入自己的转换逻辑后执行代理类生成器的generateClass方法 + transform(cg).generateClass(cw); + //将cw写入的东西转换为byte数组返回 + return transform(cw.toByteArray()); + } +``` + +​ 这里面主要是新建一个写入器,然后执行我们代理类生成器的generateClass方法将class信息写入这个ClassWriter 最后将里面的东西转换为byte数组返回,所以又回到了我们的代理类生成器的generateClass方法,这儿进入的是Generator的generateClass方法 + +##### 9、Generator.generateClass(ClassVisitor v) + +```java +//该方法为字节码写入方法 为最后一步 + public void generateClass(ClassVisitor v) { + //创建类写入聚合对象 + ClassEmitter ce = new ClassEmitter(v); + //找到被代理类的newInstance方法 如果没有会报异常 由此可知 如果想用Generator代理类生成器 必须要有newInstance方法 + Method newInstance = ReflectUtils.findNewInstance(keyInterface); + //如果被代理类的newInstance不为Object则报异常 此处我们代理的Enchaer.EnhancerKey newInstance方法返回值为Object + if (!newInstance.getReturnType().equals(Object.class)) { + throw new IllegalArgumentException("newInstance method must return Object"); + } + //找到newInstance方法的所有参数类型 并当做成员变量 + Type[] parameterTypes = TypeUtils.getTypes(newInstance.getParameterTypes()); + + //1.创建类开始写入类头 版本号 访问权限 类名等通用信息 + ce.begin_class(Constants.V1_8, + Constants.ACC_PUBLIC, + getClassName(), + KEY_FACTORY, + new Type[]{ Type.getType(keyInterface) }, + Constants.SOURCE_FILE); + //2.写入无参构造方法 + EmitUtils.null_constructor(ce); + //3.写入newInstance方法 + EmitUtils.factory_method(ce, ReflectUtils.getSignature(newInstance)); + + int seed = 0; + //4.开始构造 有参构造方法 + CodeEmitter e = ce.begin_method(Constants.ACC_PUBLIC, + TypeUtils.parseConstructor(parameterTypes), + null); + e.load_this(); + //4.1有参构造中调用父类构造方法 即super.构造方法() + e.super_invoke_constructor(); + e.load_this(); + //4.2找到传入的定制器 例如一开始传入的hashCode方法定制器 + List fieldTypeCustomizers = getCustomizers(FieldTypeCustomizer.class); + //4.3遍历成员变量即newInstance方法的所有参数 + for (int i = 0; i < parameterTypes.length; i++) { + Type parameterType = parameterTypes[i]; + Type fieldType = parameterType; + for (FieldTypeCustomizer customizer : fieldTypeCustomizers) { + fieldType = customizer.getOutType(i, fieldType); + } + seed += fieldType.hashCode(); + //4.3将这些参数全部声明到写入类中 + ce.declare_field(Constants.ACC_PRIVATE | Constants.ACC_FINAL, + getFieldName(i), + fieldType, + null); + e.dup(); + e.load_arg(i); + for (FieldTypeCustomizer customizer : fieldTypeCustomizers) { + customizer.customize(e, i, parameterType); + } + //4.4设置每个成员变量的值 即我们常见的有参构造中的this.xx = xx + e.putfield(getFieldName(i)); + } + //设置返回值 + e.return_value(); + //有参构造及成员变量写入完成 + e.end_method(); + + /*************************到此已经在class中写入了成员变量 写入实现了newInstance方法 写入无参构造 写入了有参构造 *************************/ + + // 5.写入hashcode方法 + e = ce.begin_method(Constants.ACC_PUBLIC, HASH_CODE, null); + int hc = (constant != 0) ? constant : PRIMES[(int)(Math.abs(seed) % PRIMES.length)]; + int hm = (multiplier != 0) ? multiplier : PRIMES[(int)(Math.abs(seed * 13) % PRIMES.length)]; + e.push(hc); + for (int i = 0; i < parameterTypes.length; i++) { + e.load_this(); + e.getfield(getFieldName(i)); + EmitUtils.hash_code(e, parameterTypes[i], hm, customizers); + } + e.return_value(); + //hashcode方法结束 + e.end_method(); + + // 6.写入equals方法 + e = ce.begin_method(Constants.ACC_PUBLIC, EQUALS, null); + Label fail = e.make_label(); + e.load_arg(0); + e.instance_of_this(); + e.if_jump(e.EQ, fail); + for (int i = 0; i < parameterTypes.length; i++) { + e.load_this(); + e.getfield(getFieldName(i)); + e.load_arg(0); + e.checkcast_this(); + e.getfield(getFieldName(i)); + EmitUtils.not_equals(e, parameterTypes[i], fail, customizers); + } + e.push(1); + e.return_value(); + e.mark(fail); + e.push(0); + e.return_value(); + //equals方法结束 + e.end_method(); + + // 7.写入toString方法 + e = ce.begin_method(Constants.ACC_PUBLIC, TO_STRING, null); + e.new_instance(Constants.TYPE_STRING_BUFFER); + e.dup(); + e.invoke_constructor(Constants.TYPE_STRING_BUFFER); + for (int i = 0; i < parameterTypes.length; i++) { + if (i > 0) { + e.push(", "); + e.invoke_virtual(Constants.TYPE_STRING_BUFFER, APPEND_STRING); + } + e.load_this(); + e.getfield(getFieldName(i)); + EmitUtils.append_string(e, parameterTypes[i], EmitUtils.DEFAULT_DELIMITERS, customizers); + } + e.invoke_virtual(Constants.TYPE_STRING_BUFFER, TO_STRING); + e.return_value(); + //toString方法结束 + e.end_method(); + //类写入结束 至此类信息收集完成 并全部写入ClassVisitor + ce.end_class(); + } +``` + +​ 这个方法主要将一个完整的类信息写入ClassVisitor中,例如目前实现的Enhancer.EnhancerKey代理,即实现了newInstance方法, 重写了HashCode,toSting,equals方法,并将newInstance的所有参数作为了成员变量,这儿我们也可以看下具体实现newInstance方法的逻辑 即这个代码 EmitUtils.factory_method(ce, ReflectUtils.getSignature(newInstance)); 如果有兴趣可以去研究asm字节码写入的操作 + +```java +public static void factory_method(ClassEmitter ce, Signature sig) + { + //开始写入方法 + CodeEmitter e = ce.begin_method(Constants.ACC_PUBLIC, sig, null); + //写入 一个创建对象命令 即new命令 + e.new_instance_this(); + e.dup(); + //加载参数命令 + e.load_args(); + //执行该类的有参构造命令 + e.invoke_constructor_this(TypeUtils.parseConstructor(sig.getArgumentTypes())); + //将上面指令执行的值返回 + e.return_value(); + //结束写入方法 + e.end_method(); + } +``` + +​ 可以得知 我们通过Generator创建的代理类大致内容应该如下,Enhancer.EhancerKey代理类字节码的class内容应该是把参数换为newInstance中的参数 + +```java +public class EnhancerKeyProxy extends xxx implements xxx{ + + private paramA; + private paramB; + private paramC; + + public EnhancerKeyProxy() { + super.xxx(); + } + public EnhancerKeyProxy(paramA, paramB,paramC) { + super.xxx(); + this.paramA = paramA + this.paramB = paramB + this.paramC = paramC + } + + public Object newInstance(paramA,paramB,paramC){ + EnhancerKeyProxy param = new EnhancerKeyProxy(o); + return param; + } + + public int hashCode(){ + ... + } + public String toString(){ + ... + } + + public boolean equals(Object o){ + ... + } + +} +``` + +​ 最后执行传入的ClassVisitor 即我们传入的实例DebuggingClassWriter的toByteArray即可以将写入的内容转换为byte[]返回 + +​ 至此 我们的成功的生成了Enhancer.EnhancerKey的代理类,也就是我们需要的代理类标识类 用来标识被代理的类,这个代理类主要用来作为被代理类的标识,在进行缓存时作为判断相等的依据。可以看到 cglib代理主要也是利用我们传入的被代理类信息来生成对应的代理类字节码,然后用类加载器加载到内存中。虽然我们的实际的代理任务才刚刚开始,但是要了解的东西已经基本上差不多了,对具体的我们案例中的ProxyFactory代理时,只是生成器Enhancer对比生成器Generator在生成过程中重写了一些操作而已。 + +#### 4、回到步骤2,接着向下看执行的过程 + +```java +private Object createHelper() { + preValidate(); + //获取到了代理类标识类 + Object key = KEY_FACTORY.newInstance((superclass != null) ? superclass.getName() : null, + ReflectUtils.getNames(interfaces), + filter == ALL_ZERO ? null : new WeakCacheKey(filter), + callbackTypes, + useFactory, + interceptDuringConstruction, + serialVersionUID); + //设置当前enhancer正在代理生成的类信息 + this.currentKey = key; + //调用父类的create(key方法) + Object result = super.create(key); + return result; + } +``` + +​ 可以看到获取到代理类标志类后 将其设置为当前代理类生成器的正在代理的类 并同样调用父类AbstractClassGenerator中create(key)的方法,下面开始分析Ehancer生成器的逻辑,由于部分逻辑和Generator生成器一致 + +#### 5、AbstractClassGenerator.create方法 + +​ 这个逻辑和上述步骤一致,查询当前key即代理类标志类对应的ClassLoadData缓存,如果没有则建一个空的缓存并初始化一个对应的ClassLoadData,传入相应的生成器,生成失败回调函数等 + +  按照同样的逻辑一直走到generate(ClassLoadData)方法时,由于Enhancer生成器重写了这个方法 所以我们分析Enahncer的生成逻辑 + +#### 6、Enhancer.generate(ClassLoadData data) + +```java +@Override + protected Class generate(ClassLoaderData data) { + validate(); + if (superclass != null) { + setNamePrefix(superclass.getName()); + } else if (interfaces != null) { + setNamePrefix(interfaces[ReflectUtils.findPackageProtected(interfaces)].getName()); + } + return super.generate(data); + } +``` + +​ 可以发现ehancer生成器只是做了个检查命名操作 在上面的Generator中也是做了个命名操作,然后继续执行父类的generate(data)方法,这个和上述步骤一致,我们主要看其中生成字节码的方法,即最后调用的Enhancer.generatorClass(ClassVisitor c)方法, + +#### 7、Enhancer.generatorClass(ClassVisitor c) + +```java +public void generateClass(ClassVisitor v) throws Exception { + //声明需代理的类 或者接口 + Class sc = (superclass == null) ? Object.class : superclass; + //检查 final类无法被继承 + if (TypeUtils.isFinal(sc.getModifiers())) + throw new IllegalArgumentException("Cannot subclass final class " + sc.getName()); + //找到该类所有声明了的构造函数 + List constructors = new ArrayList(Arrays.asList(sc.getDeclaredConstructors())); + //去掉private之类的不能被继承的构造函数 + filterConstructors(sc, constructors); + + // Order is very important: must add superclass, then + // its superclass chain, then each interface and + // its superinterfaces. + //这儿顺序非常重要 上面是源码的注释 直接留着 相信大家都能看懂 + + //声明代理类方法集合 + List actualMethods = new ArrayList(); + //声明代理接口接口方法集合 + List interfaceMethods = new ArrayList(); + //声明所有必须为public的方法集合 这儿主要是代理接口接口的方法 + final Set forcePublic = new HashSet(); + //即通过传入的代理类 代理接口,遍历所有的方法并放入对应的集合 + getMethods(sc, interfaces, actualMethods, interfaceMethods, forcePublic); + + //对所有代理类方法修饰符做处理 + List methods = CollectionUtils.transform(actualMethods, new Transformer() { + public Object transform(Object value) { + Method method = (Method)value; + int modifiers = Constants.ACC_FINAL + | (method.getModifiers() + & ~Constants.ACC_ABSTRACT + & ~Constants.ACC_NATIVE + & ~Constants.ACC_SYNCHRONIZED); + if (forcePublic.contains(MethodWrapper.create(method))) { + modifiers = (modifiers & ~Constants.ACC_PROTECTED) | Constants.ACC_PUBLIC; + } + return ReflectUtils.getMethodInfo(method, modifiers); + } + }); + //创建类写入器 + ClassEmitter e = new ClassEmitter(v); + + //1.开始创建类 并写入基本信息 如java版本,类修饰符 类名等 + if (currentData == null) { + e.begin_class(Constants.V1_8, + Constants.ACC_PUBLIC, + getClassName(), + Type.getType(sc), + (useFactory ? + TypeUtils.add(TypeUtils.getTypes(interfaces), FACTORY) : + TypeUtils.getTypes(interfaces)), + Constants.SOURCE_FILE); + } else { + e.begin_class(Constants.V1_8, + Constants.ACC_PUBLIC, + getClassName(), + null, + new Type[]{FACTORY}, + Constants.SOURCE_FILE); + } + List constructorInfo = CollectionUtils.transform(constructors, MethodInfoTransformer.getInstance()); + //2. 声明一个private boolean 类型的属性:CGLIB$BOUND + e.declare_field(Constants.ACC_PRIVATE, BOUND_FIELD, Type.BOOLEAN_TYPE, null); + //3. 声明一个public static Object 类型的属性:CGLIB$FACTORY_DATA + e.declare_field(Constants.ACC_PUBLIC | Constants.ACC_STATIC, FACTORY_DATA_FIELD, OBJECT_TYPE, null); + // 这个默认为true 如果为false则会声明一个private boolean 类型的属性:CGLIB$CONSTRUCTED + if (!interceptDuringConstruction) { + e.declare_field(Constants.ACC_PRIVATE, CONSTRUCTED_FIELD, Type.BOOLEAN_TYPE, null); + } + //4. 声明一个public static final 的ThreadLocal:ThreadLocal + e.declare_field(Constants.PRIVATE_FINAL_STATIC, THREAD_CALLBACKS_FIELD, THREAD_LOCAL, null); + //5. 声明一个public static final 的CallBack类型的数组:CGLIB$STATIC_CALLBACKS + e.declare_field(Constants.PRIVATE_FINAL_STATIC, STATIC_CALLBACKS_FIELD, CALLBACK_ARRAY, null); + //如果serialVersionUID不为null 则设置一个public static final 的Long类型 serialVersionUID + if (serialVersionUID != null) { + e.declare_field(Constants.PRIVATE_FINAL_STATIC, Constants.SUID_FIELD_NAME, Type.LONG_TYPE, serialVersionUID); + } + + //遍历CallBackTypes 即我们构建Enhancer是setCallBack的所有类的类型 本案例中是methodInterceptor 并且只传入了一个 + for (int i = 0; i < callbackTypes.length; i++) { + //6.声明一个private 的传入的CallBack类型的属性:CGLIB$CALLBACK_0 (从0开始编号,) + e.declare_field(Constants.ACC_PRIVATE, getCallbackField(i), callbackTypes[i], null); + } + //7声明一个private static 的传入的Object类型的属性:CGLIB$CALLBACK_FILTER + e.declare_field(Constants.ACC_PRIVATE | Constants.ACC_STATIC, CALLBACK_FILTER_FIELD, OBJECT_TYPE, null); + + //判断currentData + if (currentData == null) { + //8.为null则开始声明所有的代理类方法的变量 以及其具体的重写实现方法,还有static初始化执行代码块 + emitMethods(e, methods, actualMethods); + //9.声明构造函数 + emitConstructors(e, constructorInfo); + } else { + //声明默认构造函数 + emitDefaultConstructor(e); + } + // + emitSetThreadCallbacks(e); + emitSetStaticCallbacks(e); + emitBindCallbacks(e); + //如果currentData不为null + if (useFactory || currentData != null) { + //获取到所有CallBack索引数组 + int[] keys = getCallbackKeys(); + //10.声明三个newInstance方法 + //只有一个callback参数 + emitNewInstanceCallbacks(e); + //参数为callback数组 + emitNewInstanceCallback(e); + //参数为callback数组 以及附带的一些参数 + emitNewInstanceMultiarg(e, constructorInfo); + //11.声明getCallBack方法 + emitGetCallback(e, keys); + //12.声明setCallBack方法 + emitSetCallback(e, keys); + //12.声明setCallBacks方法 + emitGetCallbacks(e); + //12.声明setCallBacks方法 + emitSetCallbacks(e); + } + //类声明结束 + e.end_class(); +``` + +​ 可以看到这儿也是声明一个写入类 然后按照Ehancer的代理生成策略写入符合的class信息然后返回,最红依旧会执行toByteArray方法返回byte[]数组,这样则又回到了步骤中 根据类加载器 字节码数组来动态将代理类加载进内存中的方法了。最后我们回到根据class获取实例的代码即可返回被代理实例。 而我们执行方法时执行的是代理类中对应的方法,然后调用我们传入的callback执行 原理和jdk动态代理类似,至此 cglib动态代理源码分析到此结束。 \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/compiler.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/compiler.xml" new file mode 100644 index 00000000..a8afeb7a --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/misc.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/workspace.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/workspace.xml" new file mode 100644 index 00000000..88fce023 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/.idea/workspace.xml" @@ -0,0 +1,1092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rollback + autoc + AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME + CONFIGURATION_BEAN_NAME_GENERATOR + CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME + EVENT_LISTENER_PROCESSOR_BEAN_NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1582356252096 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/src/main/java/com/mashibing/cglib/Test.java + 10 + + + + jar://$MAVEN_REPOSITORY$/cglib/cglib/3.3.0/cglib-3.3.0-sources.jar!/net/sf/cglib/proxy/MethodProxy.java + 225 + + + + + + + + + + + + + + + + + BeanPost + JAVA + EXPRESSION + + + + + cw.toByteArray() + JAVA + EXPRESSION + + + BeanUtils.instantiateClass(constructorToUse) + JAVA + EXPRESSION + + + getInstantiationStrategy() + JAVA + EXPRESSION + + + ((DefaultListableBeanFactory)beanFactory).embeddedValueResolvers + JAVA + org.springframework.beans.factory.support.DefaultListableBeanFactory + EXPRESSION + + + processedBeans.contains(ppName) + JAVA + EXPRESSION + + + getSingleton(beanName, true) + JAVA + EXPRESSION + + + beanFactory.getBeanPostProcessorCount() + JAVA + EXPRESSION + + + registry.getBeanDefinitionCount() + JAVA + EXPRESSION + + + getBeanFactoryPostProcessors() + JAVA + EXPRESSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + spring_aop_tx + + + + + + + + 1.8 + + + + + + + + Maven: aopalliance:aopalliance:1.0 + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/com/sun/proxy/$Proxy0.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/com/sun/proxy/$Proxy0.class" new file mode 100644 index 00000000..c8f0006f Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/com/sun/proxy/$Proxy0.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/pom.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/pom.xml" new file mode 100644 index 00000000..6f303969 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/pom.xml" @@ -0,0 +1,63 @@ + + + 4.0.0 + + com.mashibing + spring_aop_tx + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + cglib + cglib + 3.3.0 + + + + org.aspectj + aspectjweaver + 1.9.5 + + + + aopalliance + aopalliance + 1.0 + + + + org.springframework + spring-aspects + 5.2.3.RELEASE + + + + com.alibaba + druid + 1.1.21 + + + + mysql + mysql-connector-java + 5.1.48 + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/spring_aop_tx.iml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/spring_aop_tx.iml" new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/spring_aop_tx.iml" @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/MyCalculator.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/MyCalculator.java" new file mode 100644 index 00000000..9ef6b94a --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/MyCalculator.java" @@ -0,0 +1,24 @@ +package com.mashibing.cglib; + +public class MyCalculator { + public int add(int i, int j) { + int result = i + j; + return result; + + } + + public int sub(int i, int j) { + int result = i - j; + return result; + } + + public int div(int i, int j) { + int result = i / j; + return result; + } + + public int mul(int i, int j) { + int result = i * j; + return result; + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/MyCglib.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/MyCglib.java" new file mode 100644 index 00000000..7b1ed60d --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/MyCglib.java" @@ -0,0 +1,16 @@ +package com.mashibing.cglib; + +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.Method; + +public class MyCglib implements MethodInterceptor { + @Override + public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { + System.out.println("方法执行之前"); + Object o = proxy.invokeSuper(obj, args); + System.out.println("方法执行之后"); + return o; + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/Test.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/Test.java" new file mode 100644 index 00000000..8c484571 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/cglib/Test.java" @@ -0,0 +1,21 @@ +package com.mashibing.cglib; + +import net.sf.cglib.core.DebuggingClassWriter; +import net.sf.cglib.proxy.Enhancer; + +public class Test { + public static void main(String[] args) { + //动态代理创建的class文件存储到本地 + System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"d:\\code"); + //创建cglib获取代理对象的操作对象 + Enhancer enhancer = new Enhancer(); + //设置enhancer对象的父类 + enhancer.setSuperclass(MyCalculator.class); + //设置enhancer的回调对象 + enhancer.setCallback(new MyCglib()); + //创建代理对象 + MyCalculator myCalculator = (MyCalculator) enhancer.create(); + myCalculator.add(1,1); + System.out.println(myCalculator.getClass()); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" new file mode 100644 index 00000000..6cdd5110 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/dao/BookDao.java" @@ -0,0 +1,50 @@ +package com.mashibing.dao; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class BookDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 减去某个用户的余额 + * @param userName + * @param price + */ + public void updateBalance(String userName,int price){ + String sql = "update account set balance=balance-? where username=?"; + jdbcTemplate.update(sql,price,userName); + } + + /** + * 按照图书的id来获取图书的价格 + * @param id + * @return + */ + public int getPrice(int id){ + String sql = "select price from book where id=?"; + return jdbcTemplate.queryForObject(sql,Integer.class,id); + } + + /** + * 减库存,减去某本书的库存 + * @param id + */ + public void updateStock(int id){ + String sql = "update book_stock set stock=stock-1 where id=?"; + jdbcTemplate.update(sql,id); + } + + /** + * 更新价格 + * @param id + */ + public void updatePrice(int id){ + String sql = "update book set price=price-1 where id=?"; + jdbcTemplate.update(sql,id); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" new file mode 100644 index 00000000..8d8d8aac --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/dao/EmpDao.java" @@ -0,0 +1,19 @@ +package com.mashibing.dao; + +import com.mashibing.entity.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class EmpDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public void save(Emp emp){ + String sql = "insert into emp(empno,ename) values(?,?)"; + int update = jdbcTemplate.update(sql, emp.getEmpno(), emp.getEname()); + System.out.println(update); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" new file mode 100644 index 00000000..41df701e --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/entity/Emp.java" @@ -0,0 +1,101 @@ +package com.mashibing.entity; + +import java.sql.Date; + +public class Emp { + + private Integer empno; + private String ename; + private String job; + private Integer mgr; + private Date hiredate; + private Double sal; + private Double comm; + private Integer deptno; + + public Emp() { + } + + public Emp(Integer empno, String ename) { + this.empno = empno; + this.ename = ename; + } + + public Integer getEmpno() { + return empno; + } + + public void setEmpno(Integer empno) { + this.empno = empno; + } + + public String getEname() { + return ename; + } + + public void setEname(String ename) { + this.ename = ename; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getMgr() { + return mgr; + } + + public void setMgr(Integer mgr) { + this.mgr = mgr; + } + + public Date getHiredate() { + return hiredate; + } + + public void setHiredate(Date hiredate) { + this.hiredate = hiredate; + } + + public Double getSal() { + return sal; + } + + public void setSal(Double sal) { + this.sal = sal; + } + + public Double getComm() { + return comm; + } + + public void setComm(Double comm) { + this.comm = comm; + } + + public Integer getDeptno() { + return deptno; + } + + public void setDeptno(Integer deptno) { + this.deptno = deptno; + } + + @Override + public String toString() { + return "Emp{" + + "empno=" + empno + + ", ename='" + ename + '\'' + + ", job='" + job + '\'' + + ", mgr=" + mgr + + ", hiredate=" + hiredate + + ", sal=" + sal + + ", comm=" + comm + + ", deptno=" + deptno + + '}'; + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/Calculator.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/Calculator.java" new file mode 100644 index 00000000..06547171 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/Calculator.java" @@ -0,0 +1,9 @@ +package com.mashibing.jdk; + +public interface Calculator { + + public int add(int i,int j); + public int sub(int i,int j); + public int div(int i,int j); + public int mul(int i,int j); +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/CalculatorProxy.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/CalculatorProxy.java" new file mode 100644 index 00000000..17f93d65 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/CalculatorProxy.java" @@ -0,0 +1,32 @@ +package com.mashibing.jdk; + + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +public class CalculatorProxy { + + public static Object getProxy( Object Object){ + //获取类加载器 + ClassLoader classLoader = Object.getClass().getClassLoader(); + //获取要实现的接口 + Class[] interfaces = Object.getClass().getInterfaces(); + + InvocationHandler h = new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + Object result = null; + try { + result = method.invoke(Object, args); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + }; + Object o = Proxy.newProxyInstance(classLoader, interfaces, h); + return o; + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/MyCalculator.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/MyCalculator.java" new file mode 100644 index 00000000..6508b0ee --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/MyCalculator.java" @@ -0,0 +1,28 @@ +package com.mashibing.jdk; + +public class MyCalculator implements Calculator{ + @Override + public int add(int i, int j) { + int result = i + j; + return result; + + } + + @Override + public int sub(int i, int j) { + int result = i - j; + return result; + } + + @Override + public int div(int i, int j) { + int result = i / j; + return result; + } + + @Override + public int mul(int i, int j) { + int result = i * j; + return result; + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/Test.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/Test.java" new file mode 100644 index 00000000..d7a9cc25 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/jdk/Test.java" @@ -0,0 +1,10 @@ +package com.mashibing.jdk; + +public class Test { + public static void main(String[] args) { + System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); + Object proxy = CalculatorProxy.getProxy(new MyCalculator()); + System.out.println(((Calculator)proxy).add(1, 1)); + System.out.println(proxy.getClass()); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" new file mode 100644 index 00000000..ba5fcaa8 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/service/BookService.java" @@ -0,0 +1,53 @@ +package com.mashibing.service; + +import com.mashibing.dao.BookDao; +import com.mashibing.entity.Emp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +@Service +public class BookService { + + @Autowired + private BookDao bookDao; + + /* + * propagation:传播特性:表示不同的事务之间执行的关系 + * isolation:隔离级别:4种隔离级别,会引发不同的数据错乱问题 + * timeout:超时时间, + * readonly:只读事务:如果配置了只读事务,那么在事务运行期间,不允许对数据进行修改,否则抛出异常 + * + * 设置哪些异常不会回滚数据 + * noRollBackfor: noRollbackFor = {ArithmeticException.class} + * noRollbackForClassName: + * + * 设置哪些异常回滚 + * rollBackfor: + * rollbackForClassName + * */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void buyBook() { + bookDao.getPrice(1); + bookDao.updateBalance("zhangsan", 100); + bookDao.updateStock(1); + int i = 1 / 0; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void updatePrice() { + bookDao.updatePrice(1); +// int i = 1/0; + } + + @Transactional + public void mult() { + buyBook(); + updatePrice(); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/service/MultService.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/service/MultService.java" new file mode 100644 index 00000000..87ce4bb3 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/java/com/mashibing/service/MultService.java" @@ -0,0 +1,29 @@ +package com.mashibing.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class MultService { + + @Autowired + private BookService bookService; + + @Transactional + public void mult(){ + try { + bookService.buyBook(); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("----------"); + bookService.updatePrice(); + int i = 1/0; + } + +// @Transactional + public void buyBook(){ + bookService.buyBook(); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/aaa.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/aaa.xml" new file mode 100644 index 00000000..13951d14 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/aaa.xml" @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/applicationContext.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/applicationContext.xml" new file mode 100644 index 00000000..63382edc --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/applicationContext.xml" @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/db.properties" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/db.properties" new file mode 100644 index 00000000..6a5136c5 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://localhost:3306/tx +jdbc.driverName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/tx.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/tx.xml" new file mode 100644 index 00000000..9084b0ce --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/main/resources/tx.xml" @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest.java" new file mode 100644 index 00000000..58c76173 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest.java" @@ -0,0 +1,85 @@ +import com.alibaba.druid.pool.DruidDataSource; +import com.mashibing.dao.EmpDao; +import com.mashibing.entity.Emp; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class MyTest { + + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + @Test + public void test01() throws SQLException { + DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class); + System.out.println(dataSource.getConnection()); + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + System.out.println(jdbcTemplate); + } + + @Test + public void test02(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + int zhangsan = jdbcTemplate.update(sql, 1111, "zhangsan"); + System.out.println(zhangsan); + } + + @Test + public void test03(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "insert into emp(empno,ename) values(?,?)"; + List list = new ArrayList(); + list.add(new Object[]{2222,"lisi"}); + list.add(new Object[]{3333,"wangwu"}); + list.add(new Object[]{4444,"maliu"}); + int[] result = jdbcTemplate.batchUpdate(sql,list); + for (int i : result) { + System.out.println(i); + } + } + + @Test + public void test04(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "delete from emp where empno = ?"; + int zhangsan = jdbcTemplate.update(sql, 1111); + System.out.println(zhangsan); + } + + @Test + public void test05(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "update emp set ename=? where empno=?"; + int zhangsan = jdbcTemplate.update(sql, "mashibing",2222); + System.out.println(zhangsan); + } + + @Test + public void test06(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where empno=?"; + Emp result = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Emp.class),7369); + System.out.println(result); + } + + @Test + public void test07(){ + JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class); + String sql = "select * from emp where sal >?"; + List result = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Emp.class),1500); + for (Emp emp : result) { + System.out.println(emp); + } + } + + @Test + public void test08(){ + EmpDao empDao = context.getBean("empDao", EmpDao.class); + empDao.save(new Emp(1111,"zhangsan")); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest2.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest2.java" new file mode 100644 index 00000000..5cc5db54 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest2.java" @@ -0,0 +1,15 @@ +import com.mashibing.service.BookService; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.FileNotFoundException; + +public class MyTest2 { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + + @Test + public void test01() throws FileNotFoundException { + BookService bean = context.getBean(BookService.class); + bean.buyBook(); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest3.java" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest3.java" new file mode 100644 index 00000000..4d7aceda --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/src/test/java/MyTest3.java" @@ -0,0 +1,19 @@ +import com.mashibing.service.BookService; +import com.mashibing.service.MultService; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.FileNotFoundException; + +public class MyTest3 { + + @Test + public void test01() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); +// MultService bean = context.getBean(MultService.class); +// bean.mult(); +// bean.buyBook(); + BookService bean = context.getBean(BookService.class); + bean.mult(); + } +} diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/META-INF/spring_aop_tx.kotlin_module" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/aaa.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/aaa.xml" new file mode 100644 index 00000000..13951d14 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/aaa.xml" @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/applicationContext.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/applicationContext.xml" new file mode 100644 index 00000000..63382edc --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/applicationContext.xml" @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/MyCalculator.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/MyCalculator.class" new file mode 100644 index 00000000..c54c7958 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/MyCalculator.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/MyCglib.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/MyCglib.class" new file mode 100644 index 00000000..d487e971 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/MyCglib.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/Test.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/Test.class" new file mode 100644 index 00000000..b0b3e741 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/cglib/Test.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" new file mode 100644 index 00000000..86f065f4 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/dao/BookDao.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" new file mode 100644 index 00000000..54e52506 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/dao/EmpDao.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" new file mode 100644 index 00000000..b3fcbd13 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/entity/Emp.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/Calculator.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/Calculator.class" new file mode 100644 index 00000000..4490758e Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/Calculator.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/CalculatorProxy$1.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/CalculatorProxy$1.class" new file mode 100644 index 00000000..e1cbbf17 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/CalculatorProxy$1.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/CalculatorProxy.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/CalculatorProxy.class" new file mode 100644 index 00000000..f99aa178 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/CalculatorProxy.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/MyCalculator.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/MyCalculator.class" new file mode 100644 index 00000000..a68cab1d Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/MyCalculator.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/Test.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/Test.class" new file mode 100644 index 00000000..f2d10ff3 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/jdk/Test.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" new file mode 100644 index 00000000..926b1ef5 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/service/BookService.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/service/MultService.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/service/MultService.class" new file mode 100644 index 00000000..66a0fc3a Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/com/mashibing/service/MultService.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/db.properties" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/db.properties" new file mode 100644 index 00000000..6a5136c5 --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/db.properties" @@ -0,0 +1,4 @@ +jdbc.username=root +jdbc.password=123456 +jdbc.url=jdbc:mysql://localhost:3306/tx +jdbc.driverName=com.mysql.jdbc.Driver \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/tx.xml" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/tx.xml" new file mode 100644 index 00000000..9084b0ce --- /dev/null +++ "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/classes/tx.xml" @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/META-INF/spring_aop_tx.kotlin_module" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/META-INF/spring_aop_tx.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/META-INF/spring_aop_tx.kotlin_module" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest.class" new file mode 100644 index 00000000..79b48829 Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest2.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest2.class" new file mode 100644 index 00000000..5423dd1c Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest2.class" differ diff --git "a/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest3.class" "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest3.class" new file mode 100644 index 00000000..0bd21f5a Binary files /dev/null and "b/javaframework/spring/09\345\212\250\346\200\201\344\273\243\347\220\206\346\272\220\347\240\201\345\210\206\346\236\220/spring_aop_tx/target/test-classes/MyTest3.class" differ diff --git a/javaframework/spring/image/2011052709390013.jpg b/javaframework/spring/image/2011052709390013.jpg new file mode 100644 index 00000000..cf2b8ed1 Binary files /dev/null and b/javaframework/spring/image/2011052709390013.jpg differ diff --git "a/javaframework/spring/image/ApplicationContext\347\261\273\345\233\276.png" "b/javaframework/spring/image/ApplicationContext\347\261\273\345\233\276.png" new file mode 100644 index 00000000..f73fda82 Binary files /dev/null and "b/javaframework/spring/image/ApplicationContext\347\261\273\345\233\276.png" differ diff --git "a/javaframework/spring/image/bean\347\224\237\345\221\275\345\221\250\346\234\237.png" "b/javaframework/spring/image/bean\347\224\237\345\221\275\345\221\250\346\234\237.png" new file mode 100644 index 00000000..761e3e61 Binary files /dev/null and "b/javaframework/spring/image/bean\347\224\237\345\221\275\345\221\250\346\234\237.png" differ diff --git a/javaframework/spring/image/dubbo-architecture-roadmap.jpg b/javaframework/spring/image/dubbo-architecture-roadmap.jpg new file mode 100644 index 00000000..d3e65b4f Binary files /dev/null and b/javaframework/spring/image/dubbo-architecture-roadmap.jpg differ diff --git a/javaframework/spring/image/ioc.jpg b/javaframework/spring/image/ioc.jpg new file mode 100644 index 00000000..8d09b4e3 Binary files /dev/null and b/javaframework/spring/image/ioc.jpg differ diff --git a/javaframework/spring/image/mvc.png b/javaframework/spring/image/mvc.png new file mode 100644 index 00000000..ecd4558d Binary files /dev/null and b/javaframework/spring/image/mvc.png differ diff --git a/javaframework/spring/image/spring-overview.png b/javaframework/spring/image/spring-overview.png new file mode 100644 index 00000000..952c9db6 Binary files /dev/null and b/javaframework/spring/image/spring-overview.png differ diff --git "a/javaframework/spring/image/\344\272\213\345\212\241\347\256\241\347\220\206\345\231\250.png" "b/javaframework/spring/image/\344\272\213\345\212\241\347\256\241\347\220\206\345\231\250.png" new file mode 100644 index 00000000..21f05ead Binary files /dev/null and "b/javaframework/spring/image/\344\272\213\345\212\241\347\256\241\347\220\206\345\231\250.png" differ diff --git "a/javaframework/spring/image/\344\274\240\346\222\255\347\211\271\346\200\247.jpg" "b/javaframework/spring/image/\344\274\240\346\222\255\347\211\271\346\200\247.jpg" new file mode 100644 index 00000000..eca0c864 Binary files /dev/null and "b/javaframework/spring/image/\344\274\240\346\222\255\347\211\271\346\200\247.jpg" differ diff --git "a/javaframework/spring/image/\350\200\246\345\220\210\345\257\271\350\261\241.jpg" "b/javaframework/spring/image/\350\200\246\345\220\210\345\257\271\350\261\241.jpg" new file mode 100644 index 00000000..87227369 Binary files /dev/null and "b/javaframework/spring/image/\350\200\246\345\220\210\345\257\271\350\261\241.jpg" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/01SpringMVC\347\256\200\345\215\225\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250.md" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/01SpringMVC\347\256\200\345\215\225\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250.md" new file mode 100644 index 00000000..90f7da1d --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/01SpringMVC\347\256\200\345\215\225\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250.md" @@ -0,0 +1,855 @@ +# 01SpringMVC简单介绍及使用 + +### 1、什么是MVC? + +​ MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。就是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是**降低了视图与业务逻辑间的双向偶合**。MVC不是一种设计模式,**MVC是一种架构模式**。当然不同的MVC存在差异。 + +​ **Model(模型):**数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。 + +​ **View(视图):**负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。 + +​ **Controller(控制器):**接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。 + +​ 其实在最早期的时候还有model1和model2的设计模型 + +**最典型的MVC就是JSP + servlet + javabean的模式。** + +![mvc](image\mvc.png) + +代码展示: + +HelloServlet.java + +```java +package com.mashibing.controller; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class HelloServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String method = request.getParameter("method"); + if (method.equals("add")){ + request.getSession().setAttribute("msg","add"); + }else if(method.equals("sub")){ + request.getSession().setAttribute("msg","sub"); + } + request.getRequestDispatcher("index.jsp").forward(request,response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doPost(request, response); + } +} +``` + +web.xml + +```xml + + + + + HelloServlet + com.mashibing.controller.HelloServlet + + + HelloServlet + /user + + +``` + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + ${msg} + + + +``` + +输入网址:http://localhost:8080/servlet_demo_war_exploded/user?method=add + +### 2、SpringMVC + +##### 1、SpringMVC的介绍 + +```txt +Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”. +Spring Web MVC是构建在Servlet API上的原始Web框架,从一开始就包含在Spring Framework中。 正式名称 “Spring Web MVC,” 来自其源模块(spring-webmvc)的名称,但它通常被称为“Spring MVC”。 +``` + +​ 简而言之,springMVC是Spring框架的一部分,是基于java实现的一个轻量级web框架。 + +​ 学习SpringMVC框架最核心的就是DispatcherServlet的设计,掌握好DispatcherServlet是掌握SpringMVC的核心关键。 + +##### 2、SpringMVC的优点 + +​ 1.清晰的角色划分:控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、试图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现。 + +​ 2.强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器validator)的引用。 +​ 3.可适配、非侵入:可以根据不同的应用场景,选择何事的控制器子类(simple型、command型、from型、wizard型、multi-action型或者自定义),而不是一个单一控制器(比如Action/ActionForm)继承。 +​ 4.可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。 +​ 5.可定制的绑定(binding)和验证(validation):比如将类型不匹配作为应用级的验证错误,这可以保证错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。 +​ 6.可定制的handler mapping和view resolution:Spring提供从最简单的URL映射,到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。 +​ 7.灵活的model转换:在Springweb框架中,使用基于Map的键/值对来达到轻易的与各种视图技术集成。 +​ 8.可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。 +​ 9.简单而强大的JSP标签库(Spring Tag Library):支持包括诸如数据绑定和主题(theme)之类的许多功能。他提供在标记方面的最大灵活性。 +​ 10.JSP表单标签库:在Spring2.0中引入的表单标签库,使用在JSP编写表单更加容易。 +​ 11.Spring Bean的生命周期:可以被限制在当前的HTTp Request或者HTTp Session。准确的说,这并非Spring MVC框架本身特性,而应归属于Spring MVC使用的WebApplicationContext容器。 + +##### 3、SpringMVC的实现原理 + +​ springmvc的mvc模式: + +![](image\springmvc.png) + +SpringMVC的具体执行流程: + +​ 当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。 + +![](image\springmvc运行流程.jpg) + +``` +1、DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。 +2、HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。 +3、返回处理器执行链,根据url查找控制器,并且将解析后的信息传递给DispatcherServlet +4、HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。 +5、执行handler找到具体的处理器 +6、Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。 +7、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。 +8、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。 +9、视图解析器将解析的逻辑视图名传给DispatcherServlet。 +10、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图,进行试图渲染 +11、将响应数据返回给客户端 +``` + +### 3、基于XML的Hello_SpringMVC + +1、添加pom依赖 + +```xml + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + +``` + +2、编写web.xml文件 + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:applicationContext.xml + + + + + springmvc + + / + + +``` + +3、编写springmvc需要的spring配置文件,applicationContext.xml + +```xml + + + + + + + + + + + + + + + + + + +``` + +4、HelloController.java + +```java +package com.mashibing.controller; + + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HelloController implements Controller { + public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { + //创建模型和视图对象 + ModelAndView mv = new ModelAndView(); + //将需要的值传递到model中 + mv.addObject("msg","helloSpringMVC"); + //设置要跳转的视图, + mv.setViewName("hello"); + return mv; + } +} +``` + +5、创建hello.jsp页面 + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/5 + Time: 20:25 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +${msg} + + + +``` + +6、配置tomcat,发送请求 + +http://localhost:8080/hello + +### 4、基于注解的Hello_SpringMVC + +1、添加pom依赖 + +```xml + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + +``` + +2、编写web.xml文件 + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:applicationContext.xml + + + + + springmvc + / + + +``` + +3、编写applicationContext.xml文件 + +```xml + + + + + + + + + + + + + +``` + +4、编写HelloController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class HelloController{ + /* + * @RequestMapping就是用来标识此方法用来处理什么请求,其中的/可以取消 + * 取消后默认也是从当前项目的根目录开始查找,一般在编写的时候看个人习惯 + * 同时,@RequestMapping也可以用来加在类上, + * */ + @RequestMapping("/hello") + public String hello(Model model){ + model.addAttribute("msg","hello,SpringMVC"); + return "hello"; + } +} +``` + +5、编写hello.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +${msg} + + +``` + +6、输入请求http://localhost:8080/hello + +### 5、注意细节 + +##### 1、springmvc_helloworld运行流程: + +​ 通过上述的代码,我们能够总结出具体的运行流程: + +​ 1、客户端发送请求http://localhost:8080/hello + +​ 2、由tomcat接受到对应的请求 + +​ 3、SpringMVC的前端控制器DispatcherServlet接收到所有的请求 + +​ 4、查看请求地址和@RequestMapping注解的哪个匹配,来找到具体的类的处理方法 + +​ 5、前端控制器找到目标处理类和方法之后,执行目标方法 + +​ 6、方法执行完成之后会有一个返回值,SpringMVC会将这个返回值用视图解析器进行解析拼接成完整的页面地址 + +​ 7、DispatcherServlet拿到页面地址之后,转发到具体的页面 + +##### 2、springmvc的配置文件 + +web.xml + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:applicationContext.xml + + + + springmvc + / + + +``` + +##### 3、DispatcherServlet的url-pattern + +web.xml + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:applicationContext.xml + + + + + springmvc + / + + +``` + +##### 4、@RequestMapping + +​ @RequestMapping用来匹配客户端发送的请求,可以在方法上使用,也可以在类上使用。 + +​ 方法:表示用来匹配要处理的请求 + +​ 类上:表示为当前类的所有方法的请求地址添加一个前置路径,访问的时候必须要添加此路径 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/mashibing") +public class HelloController{ + + /* + * @RequestMapping就是用来标识此方法用来处理什么请求,其中的/可以取消 + * 取消后默认也是从当前项目的根目录开始查找,一般在编写的时候看个人习惯 + * 同时,@RequestMapping也可以用来加在类上, + * */ + @RequestMapping("/hello") + public String hello(Model model){ + model.addAttribute("msg","hello,SpringMVC"); + return "hello"; + } +} +``` + +​ **注意:在整个项目的不同方法上不能包含相同的@RequestMapping值** + +​ 除此以外,@RequestMapping注解还可以添加很多额外的属性值,用来精确匹配请求 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping("/mashibing") +public class HelloController{ + + /* + * @RequestMapping就是用来标识此方法用来处理什么请求,其中的/可以取消 + * 取消后默认也是从当前项目的根目录开始查找,一般在编写的时候看个人习惯 + * 同时,@RequestMapping也可以用来加在类上, + * */ + @RequestMapping("/hello") + public String hello(Model model){ + model.addAttribute("msg","hello,SpringMVC"); + return "hello"; + } + + /** + * Request的其他属性值 + * value:要匹配的请求 + * method:限制发送请求的方式: POST GET + * params:表示请求要接受的参数,如果定义了这个属性,那么发送的时候必须要添加参数 + * params有几种匹配规则 + * 1、直接写参数的名称,param1,param2 + * params = {"username"} + * 2、表示请求不能包含的参数,!param1 + * params = {"!username"} + * 3、表示请求中需要要包含的参数但是可以限制值 param1=values param1!=value + * params = {"username=123","age"} + * params = {"username!=123","age"} + * headers:填写请求头信息 + * chrome:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36 + * firefox:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0 + * + * consumers:只接受内容类型是哪种的请求,相当于指定Content-Type + * produces:返回的内容类型 Content-Type:text/html;charset=utf-8 + * + * @return + */ + @RequestMapping(value = "/hello2",method = RequestMethod.POST) + public String hello2(){ + return "hello"; + } + + @RequestMapping(value = "/hello3",params = {"username!=123","age"}) + public String hello3(String username){ + System.out.println(username); + return "hello"; + } + + @RequestMapping(value = "/hello4",headers = {"User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"}) + public String hello4(){ + return "hello"; + } +} + +``` + +​ @RequestMapping还包含了很多复杂的匹配功能,提供了通配符的支持: + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping("/mashibing") +public class HelloController{ + + /* + * @RequestMapping就是用来标识此方法用来处理什么请求,其中的/可以取消 + * 取消后默认也是从当前项目的根目录开始查找,一般在编写的时候看个人习惯 + * 同时,@RequestMapping也可以用来加在类上, + * */ + @RequestMapping("/hello") + public String hello(Model model){ + model.addAttribute("msg","hello,SpringMVC"); + return "hello"; + } + + /** + * Request的其他属性值 + * value:要匹配的请求 + * method:限制发送请求的方式: POST GET + * params:表示请求要接受的参数,如果定义了这个属性,那么发送的时候必须要添加参数 + * params有几种匹配规则 + * 1、直接写参数的名称,param1,param2 + * params = {"username"} + * 2、表示请求不能包含的参数,!param1 + * params = {"!username"} + * 3、表示请求中需要要包含的参数但是可以限制值 param1=values param1!=value + * params = {"username=123","age"} + * params = {"username!=123","age"} + * headers:填写请求头信息 + * chrome:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36 + * firefox:User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0 + * + * consumers:只接受内容类型是哪种的请求,相当于指定Content-Type + * produces:返回的内容类型 Content-Type:text/html;charset=utf-8 + * + * @return + */ + @RequestMapping(value = "/hello2",method = RequestMethod.POST) + public String hello2(){ + return "hello"; + } + + @RequestMapping(value = "/hello3",params = {"username!=123","age"}) + public String hello3(String username){ + System.out.println(username); + return "hello"; + } + + @RequestMapping(value = "/hello4",headers = {"User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"}) + public String hello4(){ + return "hello"; + } + + /** + * @Request包含三种模糊匹配的方式,分别是: + * ?:能替代任意一个字符 + * *: 能替代任意多个字符和一层路径 + * **:能代替多层路径 + * @return + */ + @RequestMapping(value = "/**/h*llo?") + public String hello5(){ + System.out.println("hello5"); + return "hello"; + } +} + +``` + +### 6、@PathVariable + +​ 如果需要在请求路径中的参数像作为参数应该怎么使用呢?可以使用@PathVariable注解,此注解就是提供了对占位符URL的支持,就是将URL中占位符参数绑定到控制器处理方法的参数中。 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping("/mashibing") +public class HelloController{ + + @RequestMapping(value = "/pathVariable/{name}") + public String pathVariable(@PathVariable("name") String name){ + System.out.println(name); + return "hello"; + } +} +``` + +### 7、REST + +​ REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种[软件架构](https://baike.baidu.com/item/软件架构)风格。它是一种针对[网络应用](https://baike.baidu.com/item/网络应用/2196523)的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。 + +​ 在三种主流的[Web服务](https://baike.baidu.com/item/Web服务)实现方案中,因为REST模式的Web服务与复杂的[SOAP](https://baike.baidu.com/item/SOAP/4684413)和[XML-RPC](https://baike.baidu.com/item/XML-RPC)对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;[雅虎](https://baike.baidu.com/item/雅虎/108276)提供的Web服务也是REST风格的。 + +​ REST,翻译过来叫做表现层状态转化,是目前最流行的一个互联网软件架构,它架构清晰,符合标准,易于理解,扩展方便。 + +​ **表现层(Representation)**:把资源具体呈现出来的形式,因此叫做表现层。 + +​ **资源(Resource)**:网络上的一个具体信息,文本,图片,音频,视频都可以称之为资源,如果想要访问到互联网上的某一个资源,那么就必须要使用一个URL来唯一性的获取改资源,也可以这么说,URL是每一个资源的唯一标识符。 + +​ **状态转化(State Transfer)**:当客户端发出一个请求的时候,就代表客户端跟服务端的一次交互过程,HTTP是一种无状态协议,即所有的状态都保存在服务器端,因此,客户端如果想要操作服务器,必须通过某些手段,让服务器的状态发生转化,而这种转化是建立在表现层的,这就是名字的由来(非人话) + +​ 人话:我们在获取资源的时候就是进行增删改查的操作,如果是原来的架构风格,需要发送四个请求,分别是: + +​ 查询:localhost:8080/query?id=1 + +​ 增加:localhost:8080/insert + +​ 删除:localhost:8080/delete?id=1 + +​ 更新:localhost:8080/update?id=1 + +​ 按照此方式发送请求的时候比较麻烦,需要定义多种请求,而在HTTP协议中,有不同的发送请求的方式,分别是GET、POST、PUT、DELETE等,我们如果能让不同的请求方式表示不同的请求类型就可以简化我们的查询 + +​ GET:获取资源 /book/1 + +​ POST:新建资源 /book + +​ PUT:更新资源 /book/1 + +​ DELETE:删除资源 /book/1 + +​ 一切看起来都非常美好,但是大家需要注意了,我们在发送请求的时候只能发送post或者get,没有办法发送put和delete请求,那么应该如何处理呢?下面开始进入代码环节: + +RestController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Controller +public class RestController { + + @RequestMapping(value = "/user",method = RequestMethod.POST) + public String add(){ + System.out.println("添加"); + return "success"; + } + + @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE) + public String delete(@PathVariable("id") Integer id){ + System.out.println("删除:"+id); + return "success"; + } + + @RequestMapping(value = "/user/{id}",method = RequestMethod.PUT) + public String update(@PathVariable("id") Integer id){ + System.out.println("更新:"+id); + return "success"; + } + + @RequestMapping(value = "/user/{id}",method = RequestMethod.GET) + public String query(@PathVariable("id") Integer id){ + System.out.println("查询:"+id); + return "success"; + } +} +``` + +web.xml + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + + contextConfigLocation + classpath:springmvc-servlet.xml + + + + + springmvc + / + + + hiddenFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + hiddenFilter + /* + + +``` + +rest.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/6 + Time: 23:01 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +
+ + +
+ + + +
+ + + + 查询
+ + +``` + +success.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %> + + + Title + + +666 + + +``` + diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/mvc.png" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/mvc.png" new file mode 100644 index 00000000..1fef29ee Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/mvc.png" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/springmvc.png" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/springmvc.png" new file mode 100644 index 00000000..ce9e9f45 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/springmvc.png" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" new file mode 100644 index 00000000..992ceb43 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/artifacts/my_servlet_war_exploded.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/artifacts/my_servlet_war_exploded.xml" new file mode 100644 index 00000000..0668a92c --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/artifacts/my_servlet_war_exploded.xml" @@ -0,0 +1,13 @@ + + + $PROJECT_DIR$/out/artifacts/my_servlet_war_exploded + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/compiler.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/compiler.xml" new file mode 100644 index 00000000..38d573bd --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/compiler.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/encodings.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/misc.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/misc.xml" new file mode 100644 index 00000000..05483570 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/misc.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/modules.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/modules.xml" new file mode 100644 index 00000000..74ee45e2 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/modules.xml" @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/workspace.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/workspace.xml" new file mode 100644 index 00000000..f67b3eb4 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/my_servlet/.idea/workspace.xml" @@ -0,0 +1,449 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1584171856630 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.3.RELEASE/spring-webmvc-5.2.3.RELEASE-sources.jar!/org/springframework/web/servlet/DispatcherServlet.java + 1000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + springmvc_helloworld:war exploded + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + springmvc_helloworld + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/META-INF/MANIFEST.MF" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/META-INF/MANIFEST.MF" new file mode 100644 index 00000000..c1049f27 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/META-INF/MANIFEST.MF" @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: root +Created-By: IntelliJ IDEA +Build-Jdk: 1.8.0_172 + diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/HelloController.class" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/HelloController.class" new file mode 100644 index 00000000..ec5ed977 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/HelloController.class" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/springmvc.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/springmvc.xml" new file mode 100644 index 00000000..28b1a3ce --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..b4c9ae0a Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..839ca434 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..72ead317 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..00f47493 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..abc4420d Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..fa988fa4 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..afa0f577 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..af4bbb08 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/page/hello.jsp" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/page/hello.jsp" new file mode 100644 index 00000000..ad2f5c7b --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/page/hello.jsp" @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:56 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +欢迎加入马士兵教育 +${hello} + + diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/web.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/web.xml" new file mode 100644 index 00000000..230ba767 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/web.xml" @@ -0,0 +1,48 @@ + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:springmvc.xml + + + + + + springmvc + / + + + + default + org.apache.catalina.servlets.DefaultServlet + + + default + *.html + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/heihei.html" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/heihei.html" new file mode 100644 index 00000000..dbfbf846 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/heihei.html" @@ -0,0 +1,10 @@ + + + + + Title + + +hello,html + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/index.jsp" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/index.jsp" new file mode 100644 index 00000000..c977abd5 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/index.jsp" @@ -0,0 +1,22 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:44 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +
+
+ + + + diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/pom.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/pom.xml" new file mode 100644 index 00000000..aacf8927 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/pom.xml" @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.mashibing + springmvc_helloworld + 1.0-SNAPSHOT + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/springmvc_helloworld.iml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/springmvc_helloworld.iml" new file mode 100644 index 00000000..cf17af26 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/springmvc_helloworld.iml" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/src/main/java/com/mashibing/controller/HelloController.java" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/src/main/java/com/mashibing/controller/HelloController.java" new file mode 100644 index 00000000..387d39c2 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/src/main/java/com/mashibing/controller/HelloController.java" @@ -0,0 +1,68 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.Map; + +/** + * + * springmvc处理过程 + * 1、浏览器要发送一个请求 http://localhost:8080/springmvc_helloworld_war_exploded/hello + * 2、首先交给tomcat容器 + * 3、在web.xml文件中配置了DispatcherServlet的类,所以此时会由当前的DispatcherServlet来接受请求 + * 4、接受到请求之后找到对应的Controller,去Controller中寻找@RequestMapping注解标识的方法 + * 5、找到匹配的方法之后,执行方法的逻辑 + * 6、处理完成之后需要返回一个前端页面的名称, + * 7、有视图处理器来根据名称映射到对应的jsp页面的路径 + * 8、DispatcherServlet拿到对应的路径地址之后返回给浏览器 + * + */ +@Controller +@RequestMapping("/hello") +public class HelloController{ + + /* + * @RequestMapping表示用来匹配当前方法要处理的请求,其中/可以写也可以不写,一般推荐协商 + * + * @RequestMapping可以添加在类上,也可以添加在方法上 + * 方法:http://localhost:8080/springmvc_helloworld_war_exploded/hello + * 类:http://localhost:8080/springmvc_helloworld_war_exploded/hello/hello + * 当添加在类上的时候表示给所有的当前类的方法钱添加一个访问路径 + * 什么时候需要在类上添加此注解? + * 当包含多个Controller,通过在不同的Controller中包含同名的请求的时候,需要添加 + * + * @RequestMapping配置的参数 + * value:表示要匹配的请求 + * method:表示请求的方式,post get + * params:表示要求请求中必须要包含的参数 + * 必须要包含username的属性值 + * @RequestMapping( value = "/hello",params = {"username"}) + * 不能包含的参数名称 + @RequestMapping( value = "/hello",params = {"!username"}) + 必须要包含username,age两个属性值,并且username的值为zhangsan + @RequestMapping( value = "/hello",params = {"username=zhangsan","age"}) + * headers:表示限制请求头中的相关属性值,用来做请求的限制 + * produces:限制请求中的Content-Type + * consumers:限制响应中的Content-Type + * + * + * @RequestMapping可以进行模糊匹配 + * ?:替代任意一个字符 + * *:替代多个字符 + * **:替代多层路径 + * 如果能匹配到多个请求,那么优先是精准匹配,其次是模糊匹配 + * */ + @RequestMapping( value = "/hello",headers = {"User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}) + public String hello(Map map){ + map.put("hello","hello,Springmvc"); + return "hello"; + } + + @RequestMapping( value = "/hello*") + public String hello2(Map map){ + map.put("hello","hello,heihei"); + return "hello"; + } +} diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/src/main/resources/springmvc.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/src/main/resources/springmvc.xml" new file mode 100644 index 00000000..28b1a3ce --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/src/main/resources/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/target/classes/com/mashibing/controller/HelloController.class" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/target/classes/com/mashibing/controller/HelloController.class" new file mode 100644 index 00000000..ec5ed977 Binary files /dev/null and "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/target/classes/com/mashibing/controller/HelloController.class" differ diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/target/classes/springmvc.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/target/classes/springmvc.xml" new file mode 100644 index 00000000..28b1a3ce --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/target/classes/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/WEB-INF/page/hello.jsp" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/WEB-INF/page/hello.jsp" new file mode 100644 index 00000000..ad2f5c7b --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/WEB-INF/page/hello.jsp" @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:56 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +欢迎加入马士兵教育 +${hello} + + diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/WEB-INF/web.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/WEB-INF/web.xml" new file mode 100644 index 00000000..230ba767 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/WEB-INF/web.xml" @@ -0,0 +1,48 @@ + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:springmvc.xml + + + + + + springmvc + / + + + + default + org.apache.catalina.servlets.DefaultServlet + + + default + *.html + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/heihei.html" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/heihei.html" new file mode 100644 index 00000000..dbfbf846 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/heihei.html" @@ -0,0 +1,10 @@ + + + + + Title + + +hello,html + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/index.jsp" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/index.jsp" new file mode 100644 index 00000000..c977abd5 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld/web/index.jsp" @@ -0,0 +1,22 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:44 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +
+
+ + + + diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/artifacts/springmvc_helloworld_war_exploded.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/artifacts/springmvc_helloworld_war_exploded.xml" new file mode 100644 index 00000000..4d479f72 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/artifacts/springmvc_helloworld_war_exploded.xml" @@ -0,0 +1,23 @@ + + + $PROJECT_DIR$/out/artifacts/springmvc_helloworld_war_exploded + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/compiler.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/compiler.xml" new file mode 100644 index 00000000..c71c75f6 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/encodings.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/misc.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/workspace.xml" "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/workspace.xml" new file mode 100644 index 00000000..2bb46a24 --- /dev/null +++ "b/javaframework/springmvc/01SpringMVC\347\232\204\344\273\213\347\273\215\345\217\212\344\275\277\347\224\250/springmvc_helloworld_xml/.idea/workspace.xml" @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 姓名:
+ 年龄:
+ 日期:
+ 省份:
+ 城市:
+ 区域:
+
+ + + +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + @RequestMapping("/addUser") + public String addUser(User user){ + System.out.println(user); + return "success"; + } +} +``` + +##### 2、乱码问题的解决 + +​ 我们在表单或者发送请求的时候,经常会遇到中文乱码的问题,那么如何解决乱码问题呢? + +​ GET请求:在server.xml文件中,添加URIEncoding=“UTF-8” + +​ POST请求:编写过滤器进行实现 + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + + contextConfigLocation + classpath:springmvc-servlet.xml + + + + + springmvc + / + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + + encoding + UTF-8 + + + + forceEncoding + true + + + + characterEncodingFilter + /* + + + +``` + +**注意:如果配置了多个过滤器,那么字符编码过滤器一定要在最前面,否则失效。** + +##### 3、SpringMVC对原生API的支持 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.BufferedReader; +import java.io.PrintWriter; + +@Controller +public class UserController { + + @RequestMapping("/addUser") + public String addUser(User user){ + System.out.println(user); + return "success"; + } + + /** + * SpringMVC也可以在参数上使用原生的Servlet API + * + * HttpSession + * HttpServletRequest + * HttpServletResponse + * + * java.security.Principal 安全协议相关 + * Locale:国际化相关的区域信息对象 + * InputStream: + * ServletInputStream inputStream = request.getInputStream(); + * OutputStream: + * ServletOutputStream outputStream = response.getOutputStream(); + * Reader: + * BufferedReader reader = request.getReader(); + * Writer: + * PrintWriter writer = response.getWriter(); + * @param session + * @param request + * @param response + * @return + */ + @RequestMapping("api") + public String api(HttpSession session, HttpServletRequest request, HttpServletResponse response){ + request.setAttribute("requestParam","request"); + session.setAttribute("sessionParam","session"); + return "success"; + } +} +``` + +##### 4、使用Model,Map,ModelMap传输数据到页面 + +​ 在刚开始的helloworld项目中,我们传递了参数回到我们页面,但是后续的操作都只是接受用户的请求,那么在SpringMVC中除了可以使用原生servlet的对象传递数据之外,还有什么其他的方式呢? + +​ 可以在方法的参数上传入Model,ModelMap,Map类型,此时都能够将数据传送回页面 + +OutputController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.Map; + +@Controller +public class OutputController { + + @RequestMapping("output1") + public String output1(Model model){ + model.addAttribute("msg","hello,Springmvc"); + return "output"; + } + + @RequestMapping("output2") + public String output2(ModelMap model){ + model.addAttribute("msg","hello,Springmvc"); + return "output"; + } + + @RequestMapping("output3") + public String output1(Map map){ + map.put("msg","hello,Springmvc"); + return "output"; + } +} +``` + +当使用此方式进行设置之后,会发现所有的参数值都设置到了request作用域中,那么这三个对象是什么关系呢? + +![](image\BindingAwareModelMap.png) + +##### 5、使用ModelAndView对象传输数据到页面 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class OutputController { + + @RequestMapping("mv") + public ModelAndView mv(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("output"); + mv.addObject("msg","hello.modelAndView"); + return mv; + } +} +``` + +​ 发现当使用modelAndView对象的时候,返回值的类型也是此对象,可以将要跳转的页面设置成view的名称,来完成跳转的功能,同时数据也是放到request作用中。 + +##### 6、使用session传输数据到页面 + +@SessionAttribute:此注解可以表示,当向request作用域设置数据的时候同时也要向session中保存一份,此注解有两个参数,一个value(表示将哪些值设置到session中),另外一个type(表示按照类型来设置数据,一般不用,因为有可能会将很多数据都设置到session中,导致session异常)。 + +```java +@Controller +@SessionAttributes(value = "msg") +public class OutputController { + + @RequestMapping("output1") + public String output1(Model model){ + model.addAttribute("msg","hello,Springmvc"); + System.out.println(model.getClass()); + return "output"; + } +} +``` + +##### 7、使用@ModelAttribute来获取请求中的数据 + +​ @ModelAttribute注解用于将方法的参数或者方法的返回值绑定到指定的模型属性上,并返回给web视图。首先来介绍一个业务场景,来帮助大家做理解,在实际工作中,有些时候我们在修改数据的时候可能只需要修改其中几个字段,而不是全部的属性字段都获取,那么当提交属性的时候,从form表单中获取的数据就有可能只包含了部分属性,此时再向数据库更新的时候,肯定会丢失属性,因为对象的封装是springmvc自动帮我们new的,所以此时需要先将从数据库获取的对象保存下来,当提交的时候不是new新的对象,而是在原来的对象上进行属性覆盖,此时就需要使用@ModelAttribute注解。 + +User.java + +```java +package com.mashibing.bean; + +public class User { + private Integer id; + private String name; + private String password; + private Integer age; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", password='" + password + '\'' + + ", age=" + age + + '}'; + } +} +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("user") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute + public void MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); + model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + } +} +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/11 + Time: 13:45 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ + 姓名:张三
+ 密码:
+ 年龄:
+ + + + + +``` + +其实在使用的时候可以简化写法,也就是说,在方法的参数上不加@ModelAttribute也不会有问题 + +```java + @RequestMapping("update") + public String update(User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } +``` + +如果添加的@ModelAttribute(“”)属性的值不对,那么也是获取不到值的。同时可以添加@SessionAttributes属性,但是注意,如果没有设置值的话,会报错 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +@Controller +@SessionAttributes("u") +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("u") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute + public void MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); + model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + } +} + +``` + +注意:ModelAttribute除了可以使用设置值到model中之外,还可以利用返回值。 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +@Controller +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("u") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute("u") + public User MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); +// model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + return user; + } +} + +``` + +总结:通过刚刚的给参数赋值,大家应该能够发现,当给方法中的参数设置值的时候,如果添加了@ModelAttribute注解,那么在查找值的时候,是遵循以下方式: + +1、方法的参数使用参数的类型首字母小写,或者使用@ModelAttribute("")的值 + +2、先看之前是否在model中设置过该属性值,如果设置过就直接获取 + +3、看@SessionAttributes注解标注类中的方法是否给session中赋值,如果有的话,也是直接获取,没有报异常 + +##### 8、使用forward实现页面转发 + +​ 在发送请求的时候,可以通过forward:来实现转发的功能: + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class ForWardController { + + /** + * 当使用转发的时候可以添加前缀forward:index.jsp,此时是不会经过视图解析器的,所以要添加完整的名称 + * + * forward:也可以由一个请求跳转到另外一个请求 + * + * @return + */ + @RequestMapping("/forward01") + public String forward(){ + System.out.println("1"); + return "forward:/index.jsp"; + } + + + @RequestMapping("/forward02") + public String forward2(){ + System.out.println("2"); + return "forward:/forward01"; + } +} +``` + +##### 9、使用redirect来实现重定向 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class RedirectController { + + + /** + * redirect :重定向的路径 + * 相当于 response.sendRedirect("index.jsp") + * 跟视图解析器无关 + * @return + */ + @RequestMapping("redirect") + public String redirect(){ + System.out.println("redirect"); + return "redirect:/index.jsp"; + } + + @RequestMapping("/redirect2") + public String redirect2(){ + System.out.println("redirect2"); + return "redirect:/redirect"; + } +} + +``` + +在javaweb的时候大家应该都接触过重定向和转发的区别,下面再详细说一下: + +转发: + +​ 由服务器的页面进行跳转,不需要客户端重新发送请求: + +​ 特点如下: + +​ 1、地址栏的请求不会发生变化,显示的还是第一次请求的地址 + +​ 2、请求的次数,有且仅有一次请求 + +​ 3、请求域中的数据不会丢失 + +​ 4、根目录:localhost:8080/项目地址/,包含了项目的访问地址 + +![转发](image\转发.png) + +重定向: + +​ 在浏览器端进行页面的跳转,需要发送两次请求(第一次是人为的,第二次是自动的) + +​ 特点如下: + +​ 1、地址栏的地址发生变化,显示最新发送请求的地址 + +​ 2、请求次数:2次 + +​ 3、请求域中的数据会丢失,因为是不同的请求 + +​ 4、根目录:localhost:8080/ 不包含项目的名称 + +![](image\重定向.png) + +​ 对比: + +| **区别** | **转发forward()** | **重定向sendRedirect()** | +| ---------------- | ------------------ | ------------------------ | +| **根目录** | 包含项目访问地址 | 没有项目访问地址 | +| **地址栏** | 不会发生变化 | 会发生变化 | +| **哪里跳转** | 服务器端进行的跳转 | 浏览器端进行的跳转 | +| **请求域中数据** | 不会丢失 | 会丢失 | + +##### 10、静态资源的访问 + +​ 当页面中包含静态资源的时候我们能够正确的获取到吗? + +hello.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + pageContext.setAttribute("ctx",request.getContextPath()); +%> + + + Title + + +hello springmvc + + + +``` + +​ 此时大家发现我们请求的图片根本访问不到,根据查看发现路径是没有问题的,那么为什么会找不到静态资源呢? + +![image-20200312233843775](image\静态资源.png) + +​ 大家发现此时是找不到对应的mapping映射的,此时是因为DispatcherServlet会拦截所有的请求,而此时我们没有对应图片的请求处理方法,所以此时报错了,想要解决的话非常简单,只需要添加一个配置即可 + +``` + + +``` + +​ 但是加上此配置之后,大家又发现此时除了静态资源无法访问之外,我们正常的请求也无法获取了,因此还需要再添加另外的配置: + +``` + + +``` + +### (2)自定义视图解析器 + +​ 我们在之前的操作中已经用了SpringMVC中提供的视图解析器,那么如果我们需要实现自己的视图解析器该如何操作呢? + +![image-20200312211420457](image\视图解析器.png) + +![image-20200312211552245](image\视图对象.png) + +MyViewController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class MyViewController { + + @RequestMapping("/myview") + public String myView(Model model){ + model.addAttribute("msb","马士兵"); + return "msb:/index"; + } +} +``` + +MyViewResolver.java + +```java +package com.mashibing.view; + +import org.springframework.core.Ordered; +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.ViewResolver; + +import java.util.Locale; + +public class MyViewResolver implements ViewResolver, Ordered { + private int order = 0; + public View resolveViewName(String viewName, Locale locale) throws Exception { + + //如果前缀是msb:开头的就进行解析 + if (viewName.startsWith("msb:")){ + System.out.println("msb:"); + return new MyView(); + }else{ + //如果不是,则直接返回null + return null; + } + } + + public int getOrder() { + return this.order; + } + + public void setOrder(Integer order) { + this.order = order; + } +} + +``` + +MyView.java + +```java +package com.mashibing.view; + +import org.springframework.core.Ordered; +import org.springframework.web.servlet.View; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +public class MyView implements View { + + public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("保存的对象是:"+model); + response.setContentType("text/html"); + response.getWriter().write("欢迎加入马士兵教育"); + } + + /** + * 返回数据内容的类型 + * @return + */ + public String getContentType() { + return "text/html"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + +``` + +### (3)自定义类型转换器 + +​ 在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持,但是有些情况下有可能难以满足我们的需求,因此需要我们自己实现,如下: + +![image-20200312211944841](image\类型转换器.png) + +User.java + +```java +package com.mashibing.bean; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } +} +``` + +MyConverter.java + +```java +package com.mashibing.converter; + +import com.mashibing.bean.User; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class MyConverter implements Converter { + public User convert(String source) { + User user = null; + String[] split = source.split("-"); + if (source!=null && split.length==4){ + user = new User(); + user.setId(Integer.parseInt(split[0])); + user.setName(split[1]); + user.setAge(Integer.parseInt(split[2])); + user.setGender(split[3]); + } + return user; + } +} +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + @RequestMapping("/user") + public String add(User user, Model model){ + System.out.println(user); + model.addAttribute("user","user"); + return "success"; + } +} +``` + +success.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/12 + Time: 21:36 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +${requestScope.user} + + + +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + +``` + +### (4)自定义日期格式化转换器 + +​ 有时候我们经常需要在页面添加日期等相关信息,此时需要制定日期格式化转换器,此操作非常简单:只需要在单独的属性上添加@DateTimeFormat注解即可,制定对应的格式 + +User.java + +```java +package com.mashibing.bean; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + '}'; + } +} +``` + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 日期:
+ + + + + +``` + +DateConvertionController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class DateConvertionController { + + @RequestMapping("dateConvertion") + public String dateConvertion(User user){ + System.out.println(user); + return "hello"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + +``` + +​ 此时运行发现是没有问题的,但是需要注意的是,如果同时配置了自定义类型转换器之后,那么日期格式转化是有问题的。 + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + +``` + +​ 原因就在于ConversionServiceFactoryBean对象中有且仅有一个属性converters,此时可以使用另外一个类来做替换FormattingConversionServiceFactoryBean + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### (5)数据校验 + +​ 一般情况下我们会在前端页面实现数据的校验,但是大家需要注意的是前端校验会存在数据的不安全问题,因此一般情况下我们都会使用前端校验+后端校验的方式,这样的话既能够满足用户的体验度,同时也能保证数据的安全,下面来说一下在springmvc中如何进行后端数据校验。 + +​ JSR303是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 。JSR 303 (Java Specification Requests意思是Java 规范提案)通过**在** **Bean** **属性上标注**类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。 + +JSR303: + +![](image\JSR303.png) + +Hibernate Validator 扩展注解: + +![](image\hibernate.png) + +​ spring中拥有自己的数据校验框架,同时支持JSR303标准的校验框架,可以在通过添加注解的方式进行数据校验。在spring中本身没有提供JSR303的实现,需要导入依赖的包。 + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + springmvc_viewResolver + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet + jsp-api + 2.0 + provided + + + org.hibernate + hibernate-validator + 5.1.0.Final + + + + +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/12 + Time: 15:23 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 日期:
+ 邮箱:
+ + + + + +``` + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult) { + System.out.println(user); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + return "redirect:/index.jsp"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } +} +``` + +User.java + +```java +package com.mashibing.bean; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; +import java.util.Date; + +public class User { + + private Integer id; + @NotNull + @Length(min = 5,max = 10) + private String name; + private Integer age; + private String gender; + @Past + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + @Email + private String email; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + ", email='" + email + '\'' + + '}'; + } +} +``` + +此时大家发现在报错的地方无法出现错误提示,可以换另外一种方式: + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +添加用户 + + + + +``` + +add.jsp + +```jsp +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + + id:
+ name:
+ age:
+ gender:
+ birth:
+ email:
+ +
+ + + +``` + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult, Model model) { + System.out.println(user); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + return "add"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } + + @RequestMapping("add") + public String add(Model model){ + model.addAttribute("user",new User(1,"zhangsan",12,"女",null,"1234@qq.com")); + return "add"; + } +} +``` + +web.xml + +```xml + + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + classpath:springmvc.xml + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + + springmvc + / + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + +``` + +原生的表单如何获取错误信息: + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult, Model model) { + System.out.println(user); + Map errorsMap = new HashMap(); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + List fieldErrors = bindingResult.getFieldErrors(); + for (FieldError fieldError : fieldErrors) { + System.out.println(fieldError.getDefaultMessage()); + System.out.println(fieldError.getField()); + errorsMap.put(fieldError.getField(),fieldError.getDefaultMessage()); + } + model.addAttribute("errorInfo",errorsMap); + return "add"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } + + @RequestMapping("add") + public String add(Model model){ + model.addAttribute("user",new User(1,"zhangsan",12,"女",null,"1234@qq.com")); + return "add"; + } +} +``` + +add.jsp + +```jsp +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + + 编号:--->${errorInfo.id}
+ 姓名:--->${errorInfo.name}
+ 年龄:--->${errorInfo.age}
+ 性别:--->${errorInfo.gender}
+ 生日:--->${errorInfobirth}
+ 邮箱:--->${errorInfo.email}
+ +
+ + +``` + +​ \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/REST\346\236\266\346\236\204\350\256\272\346\226\207\344\270\255\346\226\207\347\211\210.pdf" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/REST\346\236\266\346\236\204\350\256\272\346\226\207\344\270\255\346\226\207\347\211\210.pdf" new file mode 100644 index 00000000..1682efdb Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/REST\346\236\266\346\236\204\350\256\272\346\226\207\344\270\255\346\226\207\347\211\210.pdf" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/BindingAwareModelMap.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/BindingAwareModelMap.png" new file mode 100644 index 00000000..04ffe3fc Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/BindingAwareModelMap.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/DispatcherServlet\347\261\273\345\233\276.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/DispatcherServlet\347\261\273\345\233\276.png" new file mode 100644 index 00000000..32e89dbc Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/DispatcherServlet\347\261\273\345\233\276.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/JSR303.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/JSR303.png" new file mode 100644 index 00000000..4d9dcf70 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/JSR303.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/handlerInterceptor.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/handlerInterceptor.png" new file mode 100644 index 00000000..f646ed82 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/handlerInterceptor.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/hibernate.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/hibernate.png" new file mode 100644 index 00000000..14d0ba02 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/hibernate.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/mvc.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/mvc.png" new file mode 100644 index 00000000..1fef29ee Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/mvc.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/springmvc.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/springmvc.png" new file mode 100644 index 00000000..ce9e9f45 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/springmvc.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" new file mode 100644 index 00000000..992ceb43 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 00000000..e00218af Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 00000000..1c5919b9 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2261.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2261.png" new file mode 100644 index 00000000..aad7be0b Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2261.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2262.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2262.png" new file mode 100644 index 00000000..3b7f309c Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2262.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2263.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2263.png" new file mode 100644 index 00000000..8540fe5a Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2263.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2264.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2264.png" new file mode 100644 index 00000000..b0f993c6 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\233\275\351\231\205\345\214\2264.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" new file mode 100644 index 00000000..a23ccb87 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" new file mode 100644 index 00000000..6f6975dc Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" new file mode 100644 index 00000000..0b5424e0 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" new file mode 100644 index 00000000..654ebfdb Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" new file mode 100644 index 00000000..7d2dc78b Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" new file mode 100644 index 00000000..90421791 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" new file mode 100644 index 00000000..4e090ab7 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" new file mode 100644 index 00000000..f133cb54 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" new file mode 100644 index 00000000..b0a4e577 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" new file mode 100644 index 00000000..b3401818 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\275\254\345\217\221.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\275\254\345\217\221.png" new file mode 100644 index 00000000..db98d1a0 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\350\275\254\345\217\221.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\351\207\215\345\256\232\345\220\221.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\351\207\215\345\256\232\345\220\221.png" new file mode 100644 index 00000000..d2e11b95 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\351\207\215\345\256\232\345\220\221.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" new file mode 100644 index 00000000..8ba2d4ad Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/artifacts/springmvc_helloworld_war_exploded.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/artifacts/springmvc_helloworld_war_exploded.xml" new file mode 100644 index 00000000..4d479f72 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/artifacts/springmvc_helloworld_war_exploded.xml" @@ -0,0 +1,23 @@ + + + $PROJECT_DIR$/out/artifacts/springmvc_helloworld_war_exploded + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/compiler.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/compiler.xml" new file mode 100644 index 00000000..c71c75f6 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/encodings.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/misc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/workspace.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/workspace.xml" new file mode 100644 index 00000000..7aebe37c --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/.idea/workspace.xml" @@ -0,0 +1,853 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1584171856630 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.3.RELEASE/spring-webmvc-5.2.3.RELEASE-sources.jar!/org/springframework/web/servlet/HttpServletBean.java + 151 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.3.RELEASE/spring-webmvc-5.2.3.RELEASE-sources.jar!/org/springframework/web/servlet/FrameworkServlet.java + 529 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.3.RELEASE/spring-webmvc-5.2.3.RELEASE-sources.jar!/org/springframework/web/servlet/FrameworkServlet.java + 897 + + + + jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.3.RELEASE/spring-webmvc-5.2.3.RELEASE-sources.jar!/org/springframework/web/servlet/FrameworkServlet.java + 908 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + springmvc_helloworld:war exploded + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + springmvc_helloworld + + + + + + + + 1.8 + + + + + + + + + + + + + + +
\ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/META-INF/MANIFEST.MF" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/META-INF/MANIFEST.MF" new file mode 100644 index 00000000..c1049f27 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/META-INF/MANIFEST.MF" @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: root +Created-By: IntelliJ IDEA +Build-Jdk: 1.8.0_172 + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/HelloController.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/HelloController.class" new file mode 100644 index 00000000..317e9832 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/HelloController.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/PathVariableController.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/PathVariableController.class" new file mode 100644 index 00000000..0550115b Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/com/mashibing/controller/PathVariableController.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/springmvc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/springmvc.xml" new file mode 100644 index 00000000..28b1a3ce --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/classes/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..b4c9ae0a Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..839ca434 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..72ead317 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..00f47493 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..abc4420d Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..fa988fa4 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..afa0f577 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..af4bbb08 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/page/hello.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/page/hello.jsp" new file mode 100644 index 00000000..ad2f5c7b --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/page/hello.jsp" @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:56 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +欢迎加入马士兵教育 +${hello} + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/web.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/web.xml" new file mode 100644 index 00000000..22f12c26 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/WEB-INF/web.xml" @@ -0,0 +1,49 @@ + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + + + springmvc + / + + + + default + org.apache.catalina.servlets.DefaultServlet + + + default + *.html + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/heihei.html" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/heihei.html" new file mode 100644 index 00000000..dbfbf846 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/heihei.html" @@ -0,0 +1,10 @@ + + + + + Title + + +hello,html + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/index.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/index.jsp" new file mode 100644 index 00000000..c977abd5 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/out/artifacts/springmvc_helloworld_war_exploded/index.jsp" @@ -0,0 +1,22 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:44 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +
+
+ + + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/pom.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/pom.xml" new file mode 100644 index 00000000..aacf8927 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/pom.xml" @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.mashibing + springmvc_helloworld + 1.0-SNAPSHOT + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/springmvc_helloworld.iml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/springmvc_helloworld.iml" new file mode 100644 index 00000000..cf17af26 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/springmvc_helloworld.iml" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/java/com/mashibing/controller/HelloController.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/java/com/mashibing/controller/HelloController.java" new file mode 100644 index 00000000..387d39c2 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/java/com/mashibing/controller/HelloController.java" @@ -0,0 +1,68 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.Map; + +/** + * + * springmvc处理过程 + * 1、浏览器要发送一个请求 http://localhost:8080/springmvc_helloworld_war_exploded/hello + * 2、首先交给tomcat容器 + * 3、在web.xml文件中配置了DispatcherServlet的类,所以此时会由当前的DispatcherServlet来接受请求 + * 4、接受到请求之后找到对应的Controller,去Controller中寻找@RequestMapping注解标识的方法 + * 5、找到匹配的方法之后,执行方法的逻辑 + * 6、处理完成之后需要返回一个前端页面的名称, + * 7、有视图处理器来根据名称映射到对应的jsp页面的路径 + * 8、DispatcherServlet拿到对应的路径地址之后返回给浏览器 + * + */ +@Controller +@RequestMapping("/hello") +public class HelloController{ + + /* + * @RequestMapping表示用来匹配当前方法要处理的请求,其中/可以写也可以不写,一般推荐协商 + * + * @RequestMapping可以添加在类上,也可以添加在方法上 + * 方法:http://localhost:8080/springmvc_helloworld_war_exploded/hello + * 类:http://localhost:8080/springmvc_helloworld_war_exploded/hello/hello + * 当添加在类上的时候表示给所有的当前类的方法钱添加一个访问路径 + * 什么时候需要在类上添加此注解? + * 当包含多个Controller,通过在不同的Controller中包含同名的请求的时候,需要添加 + * + * @RequestMapping配置的参数 + * value:表示要匹配的请求 + * method:表示请求的方式,post get + * params:表示要求请求中必须要包含的参数 + * 必须要包含username的属性值 + * @RequestMapping( value = "/hello",params = {"username"}) + * 不能包含的参数名称 + @RequestMapping( value = "/hello",params = {"!username"}) + 必须要包含username,age两个属性值,并且username的值为zhangsan + @RequestMapping( value = "/hello",params = {"username=zhangsan","age"}) + * headers:表示限制请求头中的相关属性值,用来做请求的限制 + * produces:限制请求中的Content-Type + * consumers:限制响应中的Content-Type + * + * + * @RequestMapping可以进行模糊匹配 + * ?:替代任意一个字符 + * *:替代多个字符 + * **:替代多层路径 + * 如果能匹配到多个请求,那么优先是精准匹配,其次是模糊匹配 + * */ + @RequestMapping( value = "/hello",headers = {"User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}) + public String hello(Map map){ + map.put("hello","hello,Springmvc"); + return "hello"; + } + + @RequestMapping( value = "/hello*") + public String hello2(Map map){ + map.put("hello","hello,heihei"); + return "hello"; + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/java/com/mashibing/controller/PathVariableController.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/java/com/mashibing/controller/PathVariableController.java" new file mode 100644 index 00000000..cdc4078e --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/java/com/mashibing/controller/PathVariableController.java" @@ -0,0 +1,27 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Controller +public class PathVariableController { + + /** + * @PathVariable可以获取请求路径中的值 + * 在路径中要使用{变量名称}做标识 + * 在方法参数中可以添加@PathVariable做识别,如果路径中的名称跟参数的名称不一致的时候,可以添加路径中的变量名称 + * 推荐添加 + * @param id + * @param name + * @return + */ + @RequestMapping("/testPathVariable/{id}/{name}") + public String testPathVariable(@PathVariable("id") Integer id ,@PathVariable("name") String name){ + //request.getParameter("name") + System.out.println(id); + System.out.println(name); + return "hello"; + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/resources/springmvc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/resources/springmvc.xml" new file mode 100644 index 00000000..28b1a3ce --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/src/main/resources/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/com/mashibing/controller/HelloController.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/com/mashibing/controller/HelloController.class" new file mode 100644 index 00000000..317e9832 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/com/mashibing/controller/HelloController.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/com/mashibing/controller/PathVariableController.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/com/mashibing/controller/PathVariableController.class" new file mode 100644 index 00000000..e45b49b9 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/com/mashibing/controller/PathVariableController.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/springmvc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/springmvc.xml" new file mode 100644 index 00000000..28b1a3ce --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/target/classes/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/WEB-INF/page/hello.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/WEB-INF/page/hello.jsp" new file mode 100644 index 00000000..ad2f5c7b --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/WEB-INF/page/hello.jsp" @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:56 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +欢迎加入马士兵教育 +${hello} + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/WEB-INF/web.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/WEB-INF/web.xml" new file mode 100644 index 00000000..22f12c26 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/WEB-INF/web.xml" @@ -0,0 +1,49 @@ + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + + + springmvc + / + + + + default + org.apache.catalina.servlets.DefaultServlet + + + default + *.html + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/heihei.html" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/heihei.html" new file mode 100644 index 00000000..dbfbf846 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/heihei.html" @@ -0,0 +1,10 @@ + + + + + Title + + +hello,html + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/index.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/index.jsp" new file mode 100644 index 00000000..c977abd5 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_helloworld/web/index.jsp" @@ -0,0 +1,22 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 15:44 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +
+
+ + + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/artifacts/springmvc_rest_war_exploded.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/artifacts/springmvc_rest_war_exploded.xml" new file mode 100644 index 00000000..5fb7f444 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/artifacts/springmvc_rest_war_exploded.xml" @@ -0,0 +1,23 @@ + + + $PROJECT_DIR$/out/artifacts/springmvc_rest_war_exploded + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/compiler.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/compiler.xml" new file mode 100644 index 00000000..359951ae --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/encodings.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/misc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/uiDesigner.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/workspace.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/workspace.xml" new file mode 100644 index 00000000..e3896c03 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/.idea/workspace.xml" @@ -0,0 +1,1005 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + 查询 + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/out/artifacts/springmvc_rest_war_exploded/user.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/out/artifacts/springmvc_rest_war_exploded/user.jsp" new file mode 100644 index 00000000..6e5c1d14 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/out/artifacts/springmvc_rest_war_exploded/user.jsp" @@ -0,0 +1,28 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 21:27 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 省份:
+ 城市:
+ 区域:
+
+ + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/pom.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/pom.xml" new file mode 100644 index 00000000..c965c97e --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/pom.xml" @@ -0,0 +1,24 @@ + + + 4.0.0 + + com.mashibing + springmvc_rest + 1.0-SNAPSHOT + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/springmvc_rest.iml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/springmvc_rest.iml" new file mode 100644 index 00000000..cf17af26 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/springmvc_rest.iml" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/MyFilter.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/MyFilter.java" new file mode 100644 index 00000000..b9c6dd58 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/MyFilter.java" @@ -0,0 +1,24 @@ +package com.mashibing; + +import javax.servlet.*; +import java.io.IOException; + +public class MyFilter implements Filter { + public void init(FilterConfig filterConfig) throws ServletException { + System.out.println("init"); + } + + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + + System.out.println(this.getClass().getName()+"------start"); + servletRequest.setCharacterEncoding("UTF-8"); + servletResponse.setCharacterEncoding("UTF-8"); + filterChain.doFilter(servletRequest,servletResponse); + System.out.println(this.getClass().getName()+"------stop"); + + } + + public void destroy() { + System.out.println("destroy"); + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/bean/Address.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/bean/Address.java" new file mode 100644 index 00000000..223feeee --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/bean/Address.java" @@ -0,0 +1,50 @@ +package com.mashibing.bean; + +public class Address { + + private String province; + private String city; + private String town; + + public Address() { + } + + public Address(String province, String city, String town) { + this.province = province; + this.city = city; + this.town = town; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTown() { + return town; + } + + public void setTown(String town) { + this.town = town; + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", town='" + town + '\'' + + '}'; + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/bean/User.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/bean/User.java" new file mode 100644 index 00000000..dde7eef9 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/bean/User.java" @@ -0,0 +1,64 @@ +package com.mashibing.bean; + +public class User { + private Integer id; + private String name; + private Integer age; + private String gender; + private Address address; + + public User() { + } + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", address=" + address + + '}'; + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/RequestController.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/RequestController.java" new file mode 100644 index 00000000..940ee5fb --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/RequestController.java" @@ -0,0 +1,68 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class RequestController { + + /** + * request.getParameter("name") + * + * 当发送请求的时候,找到对应的处理方法之后,会根据参数的名称从request中获取对应的参数值,并封装到方法中 + * 此时要求,方法的名字和url中参数的名字必须一致,如果不一致,设置不成功 + * + * 如果设置的值不同,同时又想让参数获取到对应的属性值,可以通过@RequestParam来使用 + * 经常跟@PathVariable混淆,主要注意,两个注解有不同的用处 + * 次注解的参数: + * value:获取的参数值 + * required:表示当前属性值是否是必须存在的,默认值是true,表示请求中必须要包含此参数,如果没有,400,bad request + * defaultValue:如果传递参数了,那么使用传递进来的参数,如果没有使用默认值 + * @param name + * @return + */ + @RequestMapping("/testRequest") + public String testRequest(@RequestParam(value = "username",required = false,defaultValue = "lisi") String name){ + System.out.println(name); + return "success"; + } + + /** + * 获取请求头信息: + * 通过@RequestHeader注解来表示 + * request.getHeader("User-Agent") + * + * 同时也包含了几个参数 + * value: + * required: + * defaultValue: + * 同@RequestParam + * @param userAgent + * @return + */ + @RequestMapping("/testRequestHeader") + public String testRequestHeader(@RequestHeader("User-Agent") String userAgent){ + System.out.println(userAgent); + return "success"; + } + + /** + * 获取cookie中的值,使用@CookieValue注解 + * Cookie[] cookies = request.getCookies(); + * 同时也包含了几个参数 + * * value: + * * required: + * * defaultValue: + * * 同@RequestParam + * @param jsid + * @return + */ + @RequestMapping("/testCookie") + public String testCookie(@CookieValue("JSESSIONID") String jsid){ + System.out.println(jsid); + return "success"; + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/UserController.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/UserController.java" new file mode 100644 index 00000000..9542cf1f --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/UserController.java" @@ -0,0 +1,61 @@ +package com.mashibing.controller; + +import com.mashibing.bean.User; +import com.mashibing.dao.UserDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * localhost:8080/web_project/save + * localhost:8080/web_project/update?id=1 + * localhost:8080/web_project/delete?id=1 + * localhost:8080/web_project/query + * + * 我们在发送请求的时候有不同的请求方式,能不能通过请求方式来做一次转换 + * POST: 新增 /user + * GET: 获取 /user + * PUT: 更新 /user/1 + * DELETE: 删除 /user/1 + * + */ +@Controller +public class UserController { + + @Autowired + private UserDao userDao; + + @RequestMapping(value = "/user",method = RequestMethod.POST) + public String save(){ + System.out.println(this.getClass().getName()+"save"); + userDao.save(new User()); + return "success"; + } + + @RequestMapping(value = "/user",method = RequestMethod.PUT) + public String update(Integer id){ + System.out.println(this.getClass().getName()+"update"); + userDao.update(id); + return "success"; + } + + @RequestMapping(value = "/user" ,method = RequestMethod.DELETE) + public String delete(Integer id){ + System.out.println(this.getClass().getName()+"delete"); + userDao.delete(id); + return "success"; + } + + @RequestMapping(value = "/user",method = RequestMethod.GET) + public String query(){ + System.out.println(this.getClass().getName()+"query"); + userDao.query(); + return "success"; + } + +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/UserController2.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/UserController2.java" new file mode 100644 index 00000000..f59752c4 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/controller/UserController2.java" @@ -0,0 +1,53 @@ +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.util.Locale; + +/** + * 乱码问题解决: + * 我们需要设置request和response的编码方式,可以自己手动编写过滤器,也可以由现成的框架来实现 + * post:必须要分别设置request和response的编码格式 + * get: 在tomcat的server.xml文件中,添加URIEncoding=utf-8 + * + * 在一个应用程序中可能会包含N多个过滤器,这N多个过滤器一般是没有顺序的要求的,但是如果你设置了编码过滤器, + * 那么要求必须要将编码过滤器设置到最上面,保证编码过滤器优先执行 + * + */ +@Controller +public class UserController2 { + + @RequestMapping("/testUser") + public String testUser(User user){ + System.out.println(user); + return "success"; + } + + /** + * Controller中也支持原生Servlet的对象,需要在参数中给出 + * + * HttpServletRequest + * HttpServletResponse + * HttpSession + * Locale:设置区域信息,国际化的操作 + * InputStream: + * OutputStream; + * Reader: + * Writer: + * @param request + * @param response + * @param session + * @return + */ + @RequestMapping("api") + public String servletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session){ + request.setAttribute("request","request"); + session.setAttribute("session","session"); + return "success"; + } +} diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/dao/UserDao.java" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/dao/UserDao.java" new file mode 100644 index 00000000..a80ea2a0 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/java/com/mashibing/dao/UserDao.java" @@ -0,0 +1,30 @@ +package com.mashibing.dao; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Repository; + +import javax.servlet.http.HttpServletRequest; + +@Repository +public class UserDao { + + public void save(User user){ + System.out.println("save"); + } + + public void update(Integer id){ + System.out.println("update"); + System.out.println(id); + } + + public void delete(Integer id){ + System.out.println("delete"); + System.out.println(id); + } + + public void query(){ + System.out.println("query"); + } + +} + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/resources/springmvc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/resources/springmvc.xml" new file mode 100644 index 00000000..0046f1b6 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/src/main/resources/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/MyFilter.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/MyFilter.class" new file mode 100644 index 00000000..8b71e9d1 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/MyFilter.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/bean/Address.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/bean/Address.class" new file mode 100644 index 00000000..6674c007 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/bean/Address.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/bean/User.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/bean/User.class" new file mode 100644 index 00000000..9a43de48 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/bean/User.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/RequestController.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/RequestController.class" new file mode 100644 index 00000000..cc8d3b87 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/RequestController.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/UserController.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/UserController.class" new file mode 100644 index 00000000..a7135610 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/UserController.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/UserController2.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/UserController2.class" new file mode 100644 index 00000000..c0169d03 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/controller/UserController2.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/dao/UserDao.class" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/dao/UserDao.class" new file mode 100644 index 00000000..e013d3b1 Binary files /dev/null and "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/com/mashibing/dao/UserDao.class" differ diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/springmvc.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/springmvc.xml" new file mode 100644 index 00000000..0046f1b6 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/target/classes/springmvc.xml" @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/WEB-INF/page/success.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/WEB-INF/page/success.jsp" new file mode 100644 index 00000000..133abc71 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/WEB-INF/page/success.jsp" @@ -0,0 +1,18 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 20:31 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +操作成功
+request:${requestScope.get("request")} +session:${sessionScope.get("session")} + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/WEB-INF/web.xml" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/WEB-INF/web.xml" new file mode 100644 index 00000000..6ac2a9a6 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/WEB-INF/web.xml" @@ -0,0 +1,55 @@ + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + springmvc + / + + + + + + + + + + + + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + + + hidden + org.springframework.web.filter.HiddenHttpMethodFilter + + + hidden + /* + + \ No newline at end of file diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/index.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/index.jsp" new file mode 100644 index 00000000..c4409d1e --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/index.jsp" @@ -0,0 +1,30 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 20:14 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + + + $Title$ + + +
+ + +
+ + + +
+ + + + 查询 + + diff --git "a/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/user.jsp" "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/user.jsp" new file mode 100644 index 00000000..6e5c1d14 --- /dev/null +++ "b/javaframework/springmvc/02SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2501/springmvc_rest/web/user.jsp" @@ -0,0 +1,28 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/14 + Time: 21:27 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 省份:
+ 城市:
+ 区域:
+
+ + + diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/02SpringMVC\347\232\204\344\275\277\347\224\250.md" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/02SpringMVC\347\232\204\344\275\277\347\224\250.md" new file mode 100644 index 00000000..af687217 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/02SpringMVC\347\232\204\344\275\277\347\224\250.md" @@ -0,0 +1,1841 @@ +# 02SpringMVC的使用 + +### (1)SpringMVC的请求处理 + +##### 1、SpringMVC对请求参数的处理 + +​ 在之前的servlet中我们可以通过request.getParameter()来获取请求中的参数,但是在我们编写的SpringMVC的应用程序中,在具体请求的方法中并不包含request参数,那么我们应该如何获取请求中的参数呢? + +​ 需要使用以下几个注解: + +​ @RequestParam:获取请求的参数 + +​ @RequestHeader:获取请求头信息 + +​ @CookieValue:获取cookie中的值 + +@RequestParam的基本使用 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class RequestController { + + /** + * 如何获取SpringMVC中请求中的信息 + * 默认情况下,可以直接在方法的参数中填写跟请求一样的名称,此时会默认接受参数 + * 如果有值,直接赋值,如果没有,那么直接给空值 + * + * @RequestParam:获取请求中的参数值,使用此注解之后,参数的名称不需要跟请求的名称一致,但是必须要写 + * public String request(@RequestParam("user") String username){ + * + * 此注解还包含三个参数: + * value:表示要获取的参数值 + * required:表示此参数是否必须,默认是true,如果不写参数那么会报错,如果值为false,那么不写参数不会有任何错误 + * defaultValue:如果在使用的时候没有传递参数,那么定义默认值即可 + * + * + * @param username + * @return + */ + @RequestMapping("/request") + public String request(@RequestParam(value = "user",required = false,defaultValue = "hehe") String username){ + System.out.println(username); + return "success"; + } +} + +``` + +@RequestHeader的基本使用: + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import sun.management.resources.agent; + +@Controller +public class RequestController { + + /** + * 如果需要获取请求头信息该如何处理呢? + * 可以使用@RequestHeader注解, + * public String header(@RequestHeader("User-Agent") String agent){ + * 相当于 request.getHeader("User-Agent") + * + * 如果要获取请求头中没有的信息,那么此时会报错,同样,此注解中也包含三个参数,跟@RequestParam一样 + * value + * required + * defalutValue + * @param agent + * @return + */ + @RequestMapping("/header") + public String header(@RequestHeader("User-Agent") String agent){ + System.out.println(agent); + return "success"; + } +} + +``` + +@CookieValue的基本使用 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import sun.management.resources.agent; + +@Controller +public class RequestController { + + /** + * 如果需要获取cookie信息该如何处理呢? + * 可以使用@CookieValue注解, + * public String cookie(@CookieValue("JSESSIONID") String id){ + * 相当于 + * Cookie[] cookies = request.getCookies(); + * for(Cookie cookie : cookies){ + * cookie.getValue(); + * } + * 如果要获取cookie中没有的信息,那么此时会报错,同样,此注解中也包含三个参数,跟@RequestParam一样 + * value + * required + * defalutValue + * @param id + * @return + */ + @RequestMapping("/cookie") + public String cookie(@CookieValue("JSESSIONID") String id){ + System.out.println(id); + return "success"; + } +} +``` + +​ 如果请求中传递的是某一个对象的各个属性值,此时如何在控制器的方法中获取对象的各个属性值呢? + +​ 在SpringMVC的控制中,能直接完成对象的属性赋值操作,不需要人为干预。 + +User.java + +```java +package com.mashibing.bean; + +import java.util.Date; + +public class User { + private Integer id; + private String name; + private Integer age; + private Date date; + private Address address; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", date=" + date + + ", address=" + address + + '}'; + } +} +``` + +Address.java + +```java +package com.mashibing.bean; + +public class Address { + private String province; + private String city; + private String town; + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTown() { + return town; + } + + public void setTown(String town) { + this.town = town; + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", town='" + town + '\'' + + '}'; + } +} +``` + +login.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/7 + Time: 0:11 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 日期:
+ 省份:
+ 城市:
+ 区域:
+
+ + + +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + @RequestMapping("/addUser") + public String addUser(User user){ + System.out.println(user); + return "success"; + } +} +``` + +##### 2、乱码问题的解决 + +​ 我们在表单或者发送请求的时候,经常会遇到中文乱码的问题,那么如何解决乱码问题呢? + +​ GET请求:在server.xml文件中,添加URIEncoding=“UTF-8” + +​ POST请求:编写过滤器进行实现 + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + + contextConfigLocation + classpath:springmvc-servlet.xml + + + + + springmvc + / + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + + encoding + UTF-8 + + + + forceEncoding + true + + + + characterEncodingFilter + /* + + + +``` + +**注意:如果配置了多个过滤器,那么字符编码过滤器一定要在最前面,否则失效。** + +##### 3、SpringMVC对原生API的支持 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.BufferedReader; +import java.io.PrintWriter; + +@Controller +public class UserController { + + @RequestMapping("/addUser") + public String addUser(User user){ + System.out.println(user); + return "success"; + } + + /** + * SpringMVC也可以在参数上使用原生的Servlet API + * + * HttpSession + * HttpServletRequest + * HttpServletResponse + * + * java.security.Principal 安全协议相关 + * Locale:国际化相关的区域信息对象 + * InputStream: + * ServletInputStream inputStream = request.getInputStream(); + * OutputStream: + * ServletOutputStream outputStream = response.getOutputStream(); + * Reader: + * BufferedReader reader = request.getReader(); + * Writer: + * PrintWriter writer = response.getWriter(); + * @param session + * @param request + * @param response + * @return + */ + @RequestMapping("api") + public String api(HttpSession session, HttpServletRequest request, HttpServletResponse response){ + request.setAttribute("requestParam","request"); + session.setAttribute("sessionParam","session"); + return "success"; + } +} +``` + +##### 4、使用Model,Map,ModelMap传输数据到页面 + +​ 在刚开始的helloworld项目中,我们传递了参数回到我们页面,但是后续的操作都只是接受用户的请求,那么在SpringMVC中除了可以使用原生servlet的对象传递数据之外,还有什么其他的方式呢? + +​ 可以在方法的参数上传入Model,ModelMap,Map类型,此时都能够将数据传送回页面 + +OutputController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.Map; + +@Controller +public class OutputController { + + @RequestMapping("output1") + public String output1(Model model){ + model.addAttribute("msg","hello,Springmvc"); + return "output"; + } + + @RequestMapping("output2") + public String output2(ModelMap model){ + model.addAttribute("msg","hello,Springmvc"); + return "output"; + } + + @RequestMapping("output3") + public String output1(Map map){ + map.put("msg","hello,Springmvc"); + return "output"; + } +} +``` + +当使用此方式进行设置之后,会发现所有的参数值都设置到了request作用域中,那么这三个对象是什么关系呢? + +![](image\BindingAwareModelMap.png) + +##### 5、使用ModelAndView对象传输数据到页面 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class OutputController { + + @RequestMapping("mv") + public ModelAndView mv(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("output"); + mv.addObject("msg","hello.modelAndView"); + return mv; + } +} +``` + +​ 发现当使用modelAndView对象的时候,返回值的类型也是此对象,可以将要跳转的页面设置成view的名称,来完成跳转的功能,同时数据也是放到request作用中。 + +##### 6、使用session传输数据到页面 + +@SessionAttribute:此注解可以表示,当向request作用域设置数据的时候同时也要向session中保存一份,此注解有两个参数,一个value(表示将哪些值设置到session中),另外一个type(表示按照类型来设置数据,一般不用,因为有可能会将很多数据都设置到session中,导致session异常)。 + +```java +@Controller +@SessionAttributes(value = "msg") +public class OutputController { + + @RequestMapping("output1") + public String output1(Model model){ + model.addAttribute("msg","hello,Springmvc"); + System.out.println(model.getClass()); + return "output"; + } +} +``` + +##### 7、使用@ModelAttribute来获取请求中的数据 + +​ @ModelAttribute注解用于将方法的参数或者方法的返回值绑定到指定的模型属性上,并返回给web视图。首先来介绍一个业务场景,来帮助大家做理解,在实际工作中,有些时候我们在修改数据的时候可能只需要修改其中几个字段,而不是全部的属性字段都获取,那么当提交属性的时候,从form表单中获取的数据就有可能只包含了部分属性,此时再向数据库更新的时候,肯定会丢失属性,因为对象的封装是springmvc自动帮我们new的,所以此时需要先将从数据库获取的对象保存下来,当提交的时候不是new新的对象,而是在原来的对象上进行属性覆盖,此时就需要使用@ModelAttribute注解。 + +User.java + +```java +package com.mashibing.bean; + +public class User { + private Integer id; + private String name; + private String password; + private Integer age; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", password='" + password + '\'' + + ", age=" + age + + '}'; + } +} +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("user") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute + public void MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); + model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + } +} +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/11 + Time: 13:45 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ + 姓名:张三
+ 密码:
+ 年龄:
+ + + + + +``` + +其实在使用的时候可以简化写法,也就是说,在方法的参数上不加@ModelAttribute也不会有问题 + +```java + @RequestMapping("update") + public String update(User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } +``` + +如果添加的@ModelAttribute(“”)属性的值不对,那么也是获取不到值的。同时可以添加@SessionAttributes属性,但是注意,如果没有设置值的话,会报错 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +@Controller +@SessionAttributes("u") +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("u") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute + public void MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); + model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + } +} + +``` + +注意:ModelAttribute除了可以使用设置值到model中之外,还可以利用返回值。 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +@Controller +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("u") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute("u") + public User MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); +// model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + return user; + } +} + +``` + +总结:通过刚刚的给参数赋值,大家应该能够发现,当给方法中的参数设置值的时候,如果添加了@ModelAttribute注解,那么在查找值的时候,是遵循以下方式: + +1、方法的参数使用参数的类型首字母小写,或者使用@ModelAttribute("")的值 + +2、先看之前是否在model中设置过该属性值,如果设置过就直接获取 + +3、看@SessionAttributes注解标注类中的方法是否给session中赋值,如果有的话,也是直接获取,没有报异常 + +##### 8、使用forward实现页面转发 + +​ 在发送请求的时候,可以通过forward:来实现转发的功能: + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class ForWardController { + + /** + * 当使用转发的时候可以添加前缀forward:index.jsp,此时是不会经过视图解析器的,所以要添加完整的名称 + * + * forward:也可以由一个请求跳转到另外一个请求 + * + * @return + */ + @RequestMapping("/forward01") + public String forward(){ + System.out.println("1"); + return "forward:/index.jsp"; + } + + + @RequestMapping("/forward02") + public String forward2(){ + System.out.println("2"); + return "forward:/forward01"; + } +} +``` + +##### 9、使用redirect来实现重定向 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class RedirectController { + + + /** + * redirect :重定向的路径 + * 相当于 response.sendRedirect("index.jsp") + * 跟视图解析器无关 + * @return + */ + @RequestMapping("redirect") + public String redirect(){ + System.out.println("redirect"); + return "redirect:/index.jsp"; + } + + @RequestMapping("/redirect2") + public String redirect2(){ + System.out.println("redirect2"); + return "redirect:/redirect"; + } +} + +``` + +在javaweb的时候大家应该都接触过重定向和转发的区别,下面再详细说一下: + +转发: + +​ 由服务器的页面进行跳转,不需要客户端重新发送请求: + +​ 特点如下: + +​ 1、地址栏的请求不会发生变化,显示的还是第一次请求的地址 + +​ 2、请求的次数,有且仅有一次请求 + +​ 3、请求域中的数据不会丢失 + +​ 4、根目录:localhost:8080/项目地址/,包含了项目的访问地址 + +![转发](image\转发.png) + +重定向: + +​ 在浏览器端进行页面的跳转,需要发送两次请求(第一次是人为的,第二次是自动的) + +​ 特点如下: + +​ 1、地址栏的地址发生变化,显示最新发送请求的地址 + +​ 2、请求次数:2次 + +​ 3、请求域中的数据会丢失,因为是不同的请求 + +​ 4、根目录:localhost:8080/ 不包含项目的名称 + +![](image\重定向.png) + +​ 对比: + +| **区别** | **转发forward()** | **重定向sendRedirect()** | +| ---------------- | ------------------ | ------------------------ | +| **根目录** | 包含项目访问地址 | 没有项目访问地址 | +| **地址栏** | 不会发生变化 | 会发生变化 | +| **哪里跳转** | 服务器端进行的跳转 | 浏览器端进行的跳转 | +| **请求域中数据** | 不会丢失 | 会丢失 | + +##### 10、静态资源的访问 + +​ 当页面中包含静态资源的时候我们能够正确的获取到吗? + +hello.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + pageContext.setAttribute("ctx",request.getContextPath()); +%> + + + Title + + +hello springmvc + + + +``` + +​ 此时大家发现我们请求的图片根本访问不到,根据查看发现路径是没有问题的,那么为什么会找不到静态资源呢? + +![image-20200312233843775](image\静态资源.png) + +​ 大家发现此时是找不到对应的mapping映射的,此时是因为DispatcherServlet会拦截所有的请求,而此时我们没有对应图片的请求处理方法,所以此时报错了,想要解决的话非常简单,只需要添加一个配置即可 + +``` + + +``` + +​ 但是加上此配置之后,大家又发现此时除了静态资源无法访问之外,我们正常的请求也无法获取了,因此还需要再添加另外的配置: + +``` + + +``` + +### (2)自定义视图解析器 + +​ 我们在之前的操作中已经用了SpringMVC中提供的视图解析器,那么如果我们需要实现自己的视图解析器该如何操作呢? + +![image-20200312211420457](image\视图解析器.png) + +![image-20200312211552245](image\视图对象.png) + +MyViewController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class MyViewController { + + @RequestMapping("/myview") + public String myView(Model model){ + model.addAttribute("msb","马士兵"); + return "msb:/index"; + } +} +``` + +MyViewResolver.java + +```java +package com.mashibing.view; + +import org.springframework.core.Ordered; +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.ViewResolver; + +import java.util.Locale; + +public class MyViewResolver implements ViewResolver, Ordered { + private int order = 0; + public View resolveViewName(String viewName, Locale locale) throws Exception { + + //如果前缀是msb:开头的就进行解析 + if (viewName.startsWith("msb:")){ + System.out.println("msb:"); + return new MyView(); + }else{ + //如果不是,则直接返回null + return null; + } + } + + public int getOrder() { + return this.order; + } + + public void setOrder(Integer order) { + this.order = order; + } +} + +``` + +MyView.java + +```java +package com.mashibing.view; + +import org.springframework.core.Ordered; +import org.springframework.web.servlet.View; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +public class MyView implements View { + + public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("保存的对象是:"+model); + response.setContentType("text/html"); + response.getWriter().write("欢迎加入马士兵教育"); + } + + /** + * 返回数据内容的类型 + * @return + */ + public String getContentType() { + return "text/html"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + +``` + +### (3)自定义类型转换器 + +​ 在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持,但是有些情况下有可能难以满足我们的需求,因此需要我们自己实现,如下: + +![image-20200312211944841](image\类型转换器.png) + +User.java + +```java +package com.mashibing.bean; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } +} +``` + +MyConverter.java + +```java +package com.mashibing.converter; + +import com.mashibing.bean.User; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class MyConverter implements Converter { + public User convert(String source) { + User user = null; + String[] split = source.split("-"); + if (source!=null && split.length==4){ + user = new User(); + user.setId(Integer.parseInt(split[0])); + user.setName(split[1]); + user.setAge(Integer.parseInt(split[2])); + user.setGender(split[3]); + } + return user; + } +} +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + @RequestMapping("/user") + public String add(User user, Model model){ + System.out.println(user); + model.addAttribute("user","user"); + return "success"; + } +} +``` + +success.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/12 + Time: 21:36 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +${requestScope.user} + + + +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + +``` + +### (4)自定义日期格式化转换器 + +​ 有时候我们经常需要在页面添加日期等相关信息,此时需要制定日期格式化转换器,此操作非常简单:只需要在单独的属性上添加@DateTimeFormat注解即可,制定对应的格式 + +User.java + +```java +package com.mashibing.bean; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + '}'; + } +} +``` + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 日期:
+ + + + + +``` + +DateConvertionController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class DateConvertionController { + + @RequestMapping("dateConvertion") + public String dateConvertion(User user){ + System.out.println(user); + return "hello"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + +``` + +​ 此时运行发现是没有问题的,但是需要注意的是,如果同时配置了自定义类型转换器之后,那么日期格式转化是有问题的。 + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + +``` + +​ 原因就在于ConversionServiceFactoryBean对象中有且仅有一个属性converters,此时可以使用另外一个类来做替换FormattingConversionServiceFactoryBean + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### (5)数据校验 + +​ 一般情况下我们会在前端页面实现数据的校验,但是大家需要注意的是前端校验会存在数据的不安全问题,因此一般情况下我们都会使用前端校验+后端校验的方式,这样的话既能够满足用户的体验度,同时也能保证数据的安全,下面来说一下在springmvc中如何进行后端数据校验。 + +​ JSR303是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 。JSR 303 (Java Specification Requests意思是Java 规范提案)通过**在** **Bean** **属性上标注**类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。 + +JSR303: + +![](image\JSR303.png) + +Hibernate Validator 扩展注解: + +![](image\hibernate.png) + +​ spring中拥有自己的数据校验框架,同时支持JSR303标准的校验框架,可以在通过添加注解的方式进行数据校验。在spring中本身没有提供JSR303的实现,需要导入依赖的包。 + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + springmvc_viewResolver + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet + jsp-api + 2.0 + provided + + + org.hibernate + hibernate-validator + 5.1.0.Final + + + + +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/12 + Time: 15:23 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 日期:
+ 邮箱:
+ + + + + +``` + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult) { + System.out.println(user); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + return "redirect:/index.jsp"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } +} +``` + +User.java + +```java +package com.mashibing.bean; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; +import java.util.Date; + +public class User { + + private Integer id; + @NotNull + @Length(min = 5,max = 10) + private String name; + private Integer age; + private String gender; + @Past + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + @Email + private String email; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + ", email='" + email + '\'' + + '}'; + } +} +``` + +此时大家发现在报错的地方无法出现错误提示,可以换另外一种方式: + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +添加用户 + + + + +``` + +add.jsp + +```jsp +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + + id:
+ name:
+ age:
+ gender:
+ birth:
+ email:
+ +
+ + + +``` + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult, Model model) { + System.out.println(user); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + return "add"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } + + @RequestMapping("add") + public String add(Model model){ + model.addAttribute("user",new User(1,"zhangsan",12,"女",null,"1234@qq.com")); + return "add"; + } +} +``` + +web.xml + +```xml + + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + classpath:springmvc.xml + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + + springmvc + / + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + +``` + +原生的表单如何获取错误信息: + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult, Model model) { + System.out.println(user); + Map errorsMap = new HashMap(); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + List fieldErrors = bindingResult.getFieldErrors(); + for (FieldError fieldError : fieldErrors) { + System.out.println(fieldError.getDefaultMessage()); + System.out.println(fieldError.getField()); + errorsMap.put(fieldError.getField(),fieldError.getDefaultMessage()); + } + model.addAttribute("errorInfo",errorsMap); + return "add"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } + + @RequestMapping("add") + public String add(Model model){ + model.addAttribute("user",new User(1,"zhangsan",12,"女",null,"1234@qq.com")); + return "add"; + } +} +``` + +add.jsp + +```jsp +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + + 编号:--->${errorInfo.id}
+ 姓名:--->${errorInfo.name}
+ 年龄:--->${errorInfo.age}
+ 性别:--->${errorInfo.gender}
+ 生日:--->${errorInfobirth}
+ 邮箱:--->${errorInfo.email}
+ +
+ + +``` + +​ \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/BindingAwareModelMap.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/BindingAwareModelMap.png" new file mode 100644 index 00000000..04ffe3fc Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/BindingAwareModelMap.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/DispatcherServlet\347\261\273\345\233\276.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/DispatcherServlet\347\261\273\345\233\276.png" new file mode 100644 index 00000000..32e89dbc Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/DispatcherServlet\347\261\273\345\233\276.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/JSR303.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/JSR303.png" new file mode 100644 index 00000000..4d9dcf70 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/JSR303.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/handlerInterceptor.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/handlerInterceptor.png" new file mode 100644 index 00000000..f646ed82 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/handlerInterceptor.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/hibernate.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/hibernate.png" new file mode 100644 index 00000000..14d0ba02 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/hibernate.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/mvc.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/mvc.png" new file mode 100644 index 00000000..1fef29ee Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/mvc.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/springmvc.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/springmvc.png" new file mode 100644 index 00000000..ce9e9f45 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/springmvc.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" new file mode 100644 index 00000000..992ceb43 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 00000000..e00218af Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 00000000..1c5919b9 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2261.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2261.png" new file mode 100644 index 00000000..aad7be0b Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2261.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2262.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2262.png" new file mode 100644 index 00000000..3b7f309c Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2262.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2263.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2263.png" new file mode 100644 index 00000000..8540fe5a Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2263.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2264.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2264.png" new file mode 100644 index 00000000..b0f993c6 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\233\275\351\231\205\345\214\2264.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" new file mode 100644 index 00000000..a23ccb87 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" new file mode 100644 index 00000000..6f6975dc Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" new file mode 100644 index 00000000..0b5424e0 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" new file mode 100644 index 00000000..654ebfdb Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" new file mode 100644 index 00000000..7d2dc78b Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" new file mode 100644 index 00000000..90421791 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" new file mode 100644 index 00000000..4e090ab7 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" new file mode 100644 index 00000000..f133cb54 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" new file mode 100644 index 00000000..b0a4e577 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" new file mode 100644 index 00000000..b3401818 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\275\254\345\217\221.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\275\254\345\217\221.png" new file mode 100644 index 00000000..db98d1a0 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\350\275\254\345\217\221.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\351\207\215\345\256\232\345\220\221.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\351\207\215\345\256\232\345\220\221.png" new file mode 100644 index 00000000..d2e11b95 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\351\207\215\345\256\232\345\220\221.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" new file mode 100644 index 00000000..8ba2d4ad Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/artifacts/springmvc_response_war_exploded.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/artifacts/springmvc_response_war_exploded.xml" new file mode 100644 index 00000000..079e9ef8 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/artifacts/springmvc_response_war_exploded.xml" @@ -0,0 +1,23 @@ + + + $PROJECT_DIR$/out/artifacts/springmvc_response_war_exploded + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/compiler.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/compiler.xml" new file mode 100644 index 00000000..8bf453cd --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/encodings.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/misc.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/workspace.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/workspace.xml" new file mode 100644 index 00000000..7e713ea7 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/.idea/workspace.xml" @@ -0,0 +1,1155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JAVA + org.springframework.web.servlet.view.InternalResourceViewResolver + + org.springframework.web.context.ServletContextAware + org.springframework.core.Ordered + org.springframework.web.servlet.ViewResolver + org.springframework.web.context.support.WebApplicationObjectSupport + org.springframework.web.servlet.view.UrlBasedViewResolver + org.springframework.web.servlet.view.InternalResourceViewResolver + org.springframework.beans.factory.Aware + org.springframework.web.servlet.view.AbstractCachingViewResolver + org.springframework.context.support.ApplicationObjectSupport + org.springframework.context.ApplicationContextAware + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.springframework.web.servlet.ViewResolver + + + All + private + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BindingAr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ name:张三
+ password:
+ age:
+
+ + + diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/pom.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/pom.xml" new file mode 100644 index 00000000..7b51d80d --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/pom.xml" @@ -0,0 +1,24 @@ + + + 4.0.0 + + com.mashibing + springmvc_response + 1.0-SNAPSHOT + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/springmvc_response.iml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/springmvc_response.iml" new file mode 100644 index 00000000..cf17af26 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/springmvc_response.iml" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/bean/User.java" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/bean/User.java" new file mode 100644 index 00000000..757bebec --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/bean/User.java" @@ -0,0 +1,54 @@ +package com.mashibing.bean; + +public class User { + + private Integer id; + private String name; + private String password; + private Integer age; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", password='" + password + '\'' + + ", age=" + age + + '}'; + } +} diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/ForWardController.java" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/ForWardController.java" new file mode 100644 index 00000000..8407ceb8 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/ForWardController.java" @@ -0,0 +1,26 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class ForWardController { + + /** + * 在使用转发的时候前面要添加forward:前缀,同时通过写的字符串能够看到forward请求不经过视图处理器 + * + * 转发的除了可以转发回到页面之外,还可以转发到其他请求中 + * @return + */ + @RequestMapping("/forward") + public String forward(){ + System.out.println("forward"); + return "forward:/index.jsp"; + } + + @RequestMapping("/forward2") + public String forward2(){ + System.out.println("forward2"); + return "forward:/forward"; + } +} diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/OutputController.java" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/OutputController.java" new file mode 100644 index 00000000..8125001f --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/OutputController.java" @@ -0,0 +1,75 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.servlet.ModelAndView; + +import javax.management.modelmbean.ModelMBeanOperationInfo; +import java.util.Map; + +/** + * 在向页面回显数据的时候,可以在方法的参数中显示的声明 + * Map: + * ModelMap: + * Model: + * 都可以将数据进行回显:回显之后数据是保存在哪个作用域中的? + * page: 当前页面 + * request: 当前请求 + * session: 当前会话 + * application:当前应用 + * 当使用上述参数传递数据的时候回把数据都放置到Request作用域 + * + */ +@Controller +@SessionAttributes(types = String.class) +public class OutputController { + + @RequestMapping("/output") + public String output(Map map){ + map.put("msg","hello,output"); + System.out.println(map.getClass()); + return "success"; + } + + + @RequestMapping("/output2") + public String output2(Model model){ + model.addAttribute("msg","hello,output2"); + System.out.println(model.getClass()); + + return "success"; + } + + @RequestMapping("/output3") + public String output3(ModelMap modelMap){ + modelMap.addAttribute("msg","hello,output3"); + System.out.println(modelMap.getClass()); + + return "success"; + } + + @RequestMapping("/output4") + public ModelAndView output4(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("success"); + mv.addObject("msg","output4"); + return mv; + } + + /** + * 当需要向session中设置数据的时候,可以在当前Controller上添加@SessionAttributes注解, + * 此注解表示,每次在向request作用中设置属性值的时候,顺带着向session中保存一份 + * value和type都写上之后表示session中可以存储名字为value值的参数以及类型为Integer的参数 + * value和type可以分开单独使用,但是尽量不要使用type类型,因为会把所有符合类型的数据都设置到session中,导致session异常 + * @param model + * @return + */ + @RequestMapping("/testSession") + public String testSession(Model model){ + model.addAttribute("username","zhangsan"); + return "success"; + } +} diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/RedirectController.java" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/RedirectController.java" new file mode 100644 index 00000000..73de1665 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/RedirectController.java" @@ -0,0 +1,26 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class RedirectController { + + + /** + * 使用重定向的时候需要注意,添加redirect:前缀 + * 重定向操作也不会经过视图处理器 + * @return + */ + @RequestMapping("/redirect") + public String redirect(){ + System.out.println("redirect"); + return "redirect:/index.jsp"; + } + + @RequestMapping("/redirect2") + public String redirect2(){ + System.out.println("redirect2"); + return "redirect:/redirect"; + } +} diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/StaticController.java" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/StaticController.java" new file mode 100644 index 00000000..34e2c074 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/StaticController.java" @@ -0,0 +1,14 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class StaticController { + + @RequestMapping("/static") + public String testStatic(){ + System.out.println("static"); + return "msb:success"; + } +} diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/UserController.java" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/UserController.java" new file mode 100644 index 00000000..daed065f --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/java/com/mashibing/controller/UserController.java" @@ -0,0 +1,76 @@ +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +/** + * SessionAttributes要注意,在使用的时候如果没有对应的值,可能会报异常 + * + * 在使用@ModelAttribute的时候,需要注意, + * 1、如果参数中的注解没有写名字的话,默认是用参数名称的首字母小写来匹配 + * 2、如果有值,直接返回,如果没有值,会去session中进行查找,也就是说会判断当前类上是否添加过@SessionAttributes注解 + * + * 推荐:注解中最好添加参数,来作为标识,进行对象属性的赋值 + */ +@Controller +@SessionAttributes("user") +public class UserController { + + Object o1 = null; + Object o2 = null; + + Model m1 = null; + + @RequestMapping("/update") + public String update(@ModelAttribute("user2") User user,Model model){ + System.out.println("update--------------------"); + o2 = user; + System.out.println(user); + System.out.println(o1 == o2); + System.out.println(m1 == model); + return "success"; + } + + @RequestMapping("/update2") + public String update2(){ + System.out.println("update2----------"); + return "success"; + } + +// @ModelAttribute +// public void testModelAttribute(Model model){ +// System.out.println("testModelAttribute---------------+"); +// User user = new User(); +// user.setId(1); +// user.setName("李四"); +// user.setAge(11); +// user.setPassword("1234"); +// model.addAttribute("user",user); +// o1 = user; +// m1=model; +// } +// +// @ModelAttribute +// public void testModelAttribute2(Model model){ +// System.out.println("testModelAttribute2---------------+"); +// User user = new User(); +// user.setName("王五"); +// model.addAttribute("user",user); +// } + + @ModelAttribute("user2") + public User testModelAttribute3(){ + System.out.println("testModelAttribute3---------------+"); + User user = new User(); + user.setId(1); + user.setName("李四"); + user.setAge(11); + user.setPassword("1234"); + o1 = user; + return user; + } +} diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/resources/springmvc.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/resources/springmvc.xml" new file mode 100644 index 00000000..1b740e8d --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/src/main/resources/springmvc.xml" @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/bean/User.class" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/bean/User.class" new file mode 100644 index 00000000..952a460e Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/bean/User.class" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/ForWardController.class" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/ForWardController.class" new file mode 100644 index 00000000..0dbc5d1d Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/ForWardController.class" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/OutputController.class" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/OutputController.class" new file mode 100644 index 00000000..8b41f0a1 Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/OutputController.class" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/RedirectController.class" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/RedirectController.class" new file mode 100644 index 00000000..f73919ef Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/RedirectController.class" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/StaticController.class" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/StaticController.class" new file mode 100644 index 00000000..17dd5c5a Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/StaticController.class" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/UserController.class" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/UserController.class" new file mode 100644 index 00000000..d32935bc Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/com/mashibing/controller/UserController.class" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/springmvc.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/springmvc.xml" new file mode 100644 index 00000000..1b740e8d --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/target/classes/springmvc.xml" @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/WEB-INF/page/success.jsp" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/WEB-INF/page/success.jsp" new file mode 100644 index 00000000..b51929ad --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/WEB-INF/page/success.jsp" @@ -0,0 +1,24 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:07 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +欢迎
+${msg}
+page:${pageScope.msg}
+request:${requestScope.msg}
+session:${sessionScope.msg}
+application:${applicationScope.msg}
+
+session:${sessionScope.username}
+request:${requestScope.username}
+ + diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/WEB-INF/web.xml" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/WEB-INF/web.xml" new file mode 100644 index 00000000..25e6ec3f --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/WEB-INF/web.xml" @@ -0,0 +1,35 @@ + + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + springmvc + / + + \ No newline at end of file diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/images/timg.jpg" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/images/timg.jpg" new file mode 100644 index 00000000..f778006e Binary files /dev/null and "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/images/timg.jpg" differ diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/index.jsp" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/index.jsp" new file mode 100644 index 00000000..f0c68a4b --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/index.jsp" @@ -0,0 +1,20 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:03 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +666666666
+ + + diff --git "a/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/update.jsp" "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/update.jsp" new file mode 100644 index 00000000..aebe2626 --- /dev/null +++ "b/javaframework/springmvc/03SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2502/springmvc_response/web/update.jsp" @@ -0,0 +1,25 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:42 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+
+ name:张三
+ password:
+ age:
+
+ + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/02SpringMVC\347\232\204\344\275\277\347\224\250.md" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/02SpringMVC\347\232\204\344\275\277\347\224\250.md" new file mode 100644 index 00000000..7e1c3ee2 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/02SpringMVC\347\232\204\344\275\277\347\224\250.md" @@ -0,0 +1,1841 @@ +# 02SpringMVC的使用 + +### (1)SpringMVC的请求处理 + +##### 1、SpringMVC对请求参数的处理 + +​ 在之前的servlet中我们可以通过request.getParameter()来获取请求中的参数,但是在我们编写的SpringMVC的应用程序中,在具体请求的方法中并不包含request参数,那么我们应该如何获取请求中的参数呢? + +​ 需要使用以下几个注解: + +​ @RequestParam:获取请求的参数 + +​ @RequestHeader:获取请求头信息 + +​ @CookieValue:获取cookie中的值 + +@RequestParam的基本使用 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class RequestController { + + /** + * 如何获取SpringMVC中请求中的信息 + * 默认情况下,可以直接在方法的参数中填写跟请求一样的名称,此时会默认接受参数 + * 如果有值,直接赋值,如果没有,那么直接给空值 + * + * @RequestParam:获取请求中的参数值,使用此注解之后,参数的名称不需要跟请求的名称一致,但是必须要写 + * public String request(@RequestParam("user") String username){ + * + * 此注解还包含三个参数: + * value:表示要获取的参数值 + * required:表示此参数是否必须,默认是true,如果不写参数那么会报错,如果值为false,那么不写参数不会有任何错误 + * defaultValue:如果在使用的时候没有传递参数,那么定义默认值即可 + * + * + * @param username + * @return + */ + @RequestMapping("/request") + public String request(@RequestParam(value = "user",required = false,defaultValue = "hehe") String username){ + System.out.println(username); + return "success"; + } +} + +``` + +@RequestHeader的基本使用: + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import sun.management.resources.agent; + +@Controller +public class RequestController { + + /** + * 如果需要获取请求头信息该如何处理呢? + * 可以使用@RequestHeader注解, + * public String header(@RequestHeader("User-Agent") String agent){ + * 相当于 request.getHeader("User-Agent") + * + * 如果要获取请求头中没有的信息,那么此时会报错,同样,此注解中也包含三个参数,跟@RequestParam一样 + * value + * required + * defalutValue + * @param agent + * @return + */ + @RequestMapping("/header") + public String header(@RequestHeader("User-Agent") String agent){ + System.out.println(agent); + return "success"; + } +} + +``` + +@CookieValue的基本使用 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import sun.management.resources.agent; + +@Controller +public class RequestController { + + /** + * 如果需要获取cookie信息该如何处理呢? + * 可以使用@CookieValue注解, + * public String cookie(@CookieValue("JSESSIONID") String id){ + * 相当于 + * Cookie[] cookies = request.getCookies(); + * for(Cookie cookie : cookies){ + * cookie.getValue(); + * } + * 如果要获取cookie中没有的信息,那么此时会报错,同样,此注解中也包含三个参数,跟@RequestParam一样 + * value + * required + * defalutValue + * @param id + * @return + */ + @RequestMapping("/cookie") + public String cookie(@CookieValue("JSESSIONID") String id){ + System.out.println(id); + return "success"; + } +} +``` + +​ 如果请求中传递的是某一个对象的各个属性值,此时如何在控制器的方法中获取对象的各个属性值呢? + +​ 在SpringMVC的控制中,能直接完成对象的属性赋值操作,不需要人为干预。 + +User.java + +```java +package com.mashibing.bean; + +import java.util.Date; + +public class User { + private Integer id; + private String name; + private Integer age; + private Date date; + private Address address; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", date=" + date + + ", address=" + address + + '}'; + } +} +``` + +Address.java + +```java +package com.mashibing.bean; + +public class Address { + private String province; + private String city; + private String town; + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTown() { + return town; + } + + public void setTown(String town) { + this.town = town; + } + + @Override + public String toString() { + return "Address{" + + "province='" + province + '\'' + + ", city='" + city + '\'' + + ", town='" + town + '\'' + + '}'; + } +} +``` + +login.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/7 + Time: 0:11 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 日期:
+ 省份:
+ 城市:
+ 区域:
+
+ + + +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + @RequestMapping("/addUser") + public String addUser(User user){ + System.out.println(user); + return "success"; + } +} +``` + +##### 2、乱码问题的解决 + +​ 我们在表单或者发送请求的时候,经常会遇到中文乱码的问题,那么如何解决乱码问题呢? + +​ GET请求:在server.xml文件中,添加URIEncoding=“UTF-8” + +​ POST请求:编写过滤器进行实现 + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + + + contextConfigLocation + classpath:springmvc-servlet.xml + + + + + springmvc + / + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + + encoding + UTF-8 + + + + forceEncoding + true + + + + characterEncodingFilter + /* + + + +``` + +**注意:如果配置了多个过滤器,那么字符编码过滤器一定要在最前面,否则失效。** + +##### 3、SpringMVC对原生API的支持 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.BufferedReader; +import java.io.PrintWriter; + +@Controller +public class UserController { + + @RequestMapping("/addUser") + public String addUser(User user){ + System.out.println(user); + return "success"; + } + + /** + * SpringMVC也可以在参数上使用原生的Servlet API + * + * HttpSession + * HttpServletRequest + * HttpServletResponse + * + * java.security.Principal 安全协议相关 + * Locale:国际化相关的区域信息对象 + * InputStream: + * ServletInputStream inputStream = request.getInputStream(); + * OutputStream: + * ServletOutputStream outputStream = response.getOutputStream(); + * Reader: + * BufferedReader reader = request.getReader(); + * Writer: + * PrintWriter writer = response.getWriter(); + * @param session + * @param request + * @param response + * @return + */ + @RequestMapping("api") + public String api(HttpSession session, HttpServletRequest request, HttpServletResponse response){ + request.setAttribute("requestParam","request"); + session.setAttribute("sessionParam","session"); + return "success"; + } +} +``` + +##### 4、使用Model,Map,ModelMap传输数据到页面 + +​ 在刚开始的helloworld项目中,我们传递了参数回到我们页面,但是后续的操作都只是接受用户的请求,那么在SpringMVC中除了可以使用原生servlet的对象传递数据之外,还有什么其他的方式呢? + +​ 可以在方法的参数上传入Model,ModelMap,Map类型,此时都能够将数据传送回页面 + +OutputController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.Map; + +@Controller +public class OutputController { + + @RequestMapping("output1") + public String output1(Model model){ + model.addAttribute("msg","hello,Springmvc"); + return "output"; + } + + @RequestMapping("output2") + public String output2(ModelMap model){ + model.addAttribute("msg","hello,Springmvc"); + return "output"; + } + + @RequestMapping("output3") + public String output1(Map map){ + map.put("msg","hello,Springmvc"); + return "output"; + } +} +``` + +当使用此方式进行设置之后,会发现所有的参数值都设置到了request作用域中,那么这三个对象是什么关系呢? + +![](image\BindingAwareModelMap.png) + +##### 5、使用ModelAndView对象传输数据到页面 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class OutputController { + + @RequestMapping("mv") + public ModelAndView mv(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("output"); + mv.addObject("msg","hello.modelAndView"); + return mv; + } +} +``` + +​ 发现当使用modelAndView对象的时候,返回值的类型也是此对象,可以将要跳转的页面设置成view的名称,来完成跳转的功能,同时数据也是放到request作用中。 + +##### 6、使用session传输数据到页面 + +@SessionAttribute:此注解可以表示,当向request作用域设置数据的时候同时也要向session中保存一份,此注解有两个参数,一个value(表示将哪些值设置到session中),另外一个type(表示按照类型来设置数据,一般不用,因为有可能会将很多数据都设置到session中,导致session异常)。 + +```java +@Controller +@SessionAttributes(value = "msg") +public class OutputController { + + @RequestMapping("output1") + public String output1(Model model){ + model.addAttribute("msg","hello,Springmvc"); + System.out.println(model.getClass()); + return "output"; + } +} +``` + +##### 7、使用@ModelAttribute来获取请求中的数据 + +​ @ModelAttribute注解用于将方法的参数或者方法的返回值绑定到指定的模型属性上,并返回给web视图。首先来介绍一个业务场景,来帮助大家做理解,在实际工作中,有些时候我们在修改数据的时候可能只需要修改其中几个字段,而不是全部的属性字段都获取,那么当提交属性的时候,从form表单中获取的数据就有可能只包含了部分属性,此时再向数据库更新的时候,肯定会丢失属性,因为对象的封装是springmvc自动帮我们new的,所以此时需要先将从数据库获取的对象保存下来,当提交的时候不是new新的对象,而是在原来的对象上进行属性覆盖,此时就需要使用@ModelAttribute注解。 + +User.java + +```java +package com.mashibing.bean; + +public class User { + private Integer id; + private String name; + private String password; + private Integer age; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", password='" + password + '\'' + + ", age=" + age + + '}'; + } +} +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("user") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute + public void MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); + model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + } +} +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/11 + Time: 13:45 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ + 姓名:张三
+ 密码:
+ 年龄:
+ + + + + +``` + +其实在使用的时候可以简化写法,也就是说,在方法的参数上不加@ModelAttribute也不会有问题 + +```java + @RequestMapping("update") + public String update(User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } +``` + +如果添加的@ModelAttribute(“”)属性的值不对,那么也是获取不到值的。同时可以添加@SessionAttributes属性,但是注意,如果没有设置值的话,会报错 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +@Controller +@SessionAttributes("u") +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("u") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute + public void MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); + model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + } +} + +``` + +注意:ModelAttribute除了可以使用设置值到model中之外,还可以利用返回值。 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +@Controller +public class UserController { + + Object o1 = null; + Object o2 = null; + Object o3 = null; + + @RequestMapping("update") + public String update(@ModelAttribute("u") User user,Model model){ + System.out.println(user); + o2 = model; + //可以看到所有的model都是同一个对象 + System.out.println(o1==o2); + //可以看到存储的user对象也是同一个 + System.out.println(user == o3); + return "output"; + } + + @ModelAttribute("u") + public User MyModelAttribute(Model model){ + o1 = model; + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(12); + user.setPassword("123"); +// model.addAttribute("user",user); + System.out.println("modelAttribute:"+user); + o3 = user; + return user; + } +} + +``` + +总结:通过刚刚的给参数赋值,大家应该能够发现,当给方法中的参数设置值的时候,如果添加了@ModelAttribute注解,那么在查找值的时候,是遵循以下方式: + +1、方法的参数使用参数的类型首字母小写,或者使用@ModelAttribute("")的值 + +2、先看之前是否在model中设置过该属性值,如果设置过就直接获取 + +3、看@SessionAttributes注解标注类中的方法是否给session中赋值,如果有的话,也是直接获取,没有报异常 + +##### 8、使用forward实现页面转发 + +​ 在发送请求的时候,可以通过forward:来实现转发的功能: + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class ForWardController { + + /** + * 当使用转发的时候可以添加前缀forward:index.jsp,此时是不会经过视图解析器的,所以要添加完整的名称 + * + * forward:也可以由一个请求跳转到另外一个请求 + * + * @return + */ + @RequestMapping("/forward01") + public String forward(){ + System.out.println("1"); + return "forward:/index.jsp"; + } + + + @RequestMapping("/forward02") + public String forward2(){ + System.out.println("2"); + return "forward:/forward01"; + } +} +``` + +##### 9、使用redirect来实现重定向 + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class RedirectController { + + + /** + * redirect :重定向的路径 + * 相当于 response.sendRedirect("index.jsp") + * 跟视图解析器无关 + * @return + */ + @RequestMapping("redirect") + public String redirect(){ + System.out.println("redirect"); + return "redirect:/index.jsp"; + } + + @RequestMapping("/redirect2") + public String redirect2(){ + System.out.println("redirect2"); + return "redirect:/redirect"; + } +} + +``` + +在javaweb的时候大家应该都接触过重定向和转发的区别,下面再详细说一下: + +转发: + +​ 由服务器的页面进行跳转,不需要客户端重新发送请求: + +​ 特点如下: + +​ 1、地址栏的请求不会发生变化,显示的还是第一次请求的地址 + +​ 2、请求的次数,有且仅有一次请求 + +​ 3、请求域中的数据不会丢失 + +​ 4、根目录:localhost:8080/项目地址/,包含了项目的访问地址 + +![转发](image\转发.png) + +重定向: + +​ 在浏览器端进行页面的跳转,需要发送两次请求(第一次是人为的,第二次是自动的) + +​ 特点如下: + +​ 1、地址栏的地址发生变化,显示最新发送请求的地址 + +​ 2、请求次数:2次 + +​ 3、请求域中的数据会丢失,因为是不同的请求 + +​ 4、根目录:localhost:8080/ 不包含项目的名称 + +![](image\重定向.png) + +​ 对比: + +| **区别** | **转发forward()** | **重定向sendRedirect()** | +| ---------------- | ------------------ | ------------------------ | +| **根目录** | 包含项目访问地址 | 没有项目访问地址 | +| **地址栏** | 不会发生变化 | 会发生变化 | +| **哪里跳转** | 服务器端进行的跳转 | 浏览器端进行的跳转 | +| **请求域中数据** | 不会丢失 | 会丢失 | + +##### 10、静态资源的访问 + +​ 当页面中包含静态资源的时候我们能够正确的获取到吗? + +hello.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + pageContext.setAttribute("ctx",request.getContextPath()); +%> + + + Title + + +hello springmvc + + + +``` + +​ 此时大家发现我们请求的图片根本访问不到,根据查看发现路径是没有问题的,那么为什么会找不到静态资源呢? + +![image-20200312233843775](image\静态资源.png) + +​ 大家发现此时是找不到对应的mapping映射的,此时是因为DispatcherServlet会拦截所有的请求,而此时我们没有对应图片的请求处理方法,所以此时报错了,想要解决的话非常简单,只需要添加一个配置即可 + +``` + + +``` + +​ 但是加上此配置之后,大家又发现此时除了静态资源无法访问之外,我们正常的请求也无法获取了,因此还需要再添加另外的配置: + +``` + + +``` + +### (2)自定义视图解析器 + +​ 我们在之前的操作中已经用了SpringMVC中提供的视图解析器,那么如果我们需要实现自己的视图解析器该如何操作呢? + +![image-20200312211420457](image\视图解析器.png) + +![image-20200312211552245](image\视图对象.png) + +MyViewController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class MyViewController { + + @RequestMapping("/myview") + public String myView(Model model){ + model.addAttribute("msb","马士兵"); + return "msb:/index"; + } +} +``` + +MyViewResolver.java + +```java +package com.mashibing.view; + +import org.springframework.core.Ordered; +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.ViewResolver; + +import java.util.Locale; + +public class MyViewResolver implements ViewResolver, Ordered { + private int order = 0; + public View resolveViewName(String viewName, Locale locale) throws Exception { + + //如果前缀是msb:开头的就进行解析 + if (viewName.startsWith("msb:")){ + System.out.println("msb:"); + return new MyView(); + }else{ + //如果不是,则直接返回null + return null; + } + } + + public int getOrder() { + return this.order; + } + + public void setOrder(Integer order) { + this.order = order; + } +} + +``` + +MyView.java + +```java +package com.mashibing.view; + +import org.springframework.core.Ordered; +import org.springframework.web.servlet.View; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +public class MyView implements View { + + public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("保存的对象是:"+model); + response.setContentType("text/html"); + response.getWriter().write("欢迎加入马士兵教育"); + } + + /** + * 返回数据内容的类型 + * @return + */ + public String getContentType() { + return "text/html"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + +``` + +### (3)自定义类型转换器 + +​ 在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持,但是有些情况下有可能难以满足我们的需求,因此需要我们自己实现,如下: + +![image-20200312211944841](image\类型转换器.png) + +User.java + +```java +package com.mashibing.bean; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + '}'; + } +} +``` + +MyConverter.java + +```java +package com.mashibing.converter; + +import com.mashibing.bean.User; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class MyConverter implements Converter { + public User convert(String source) { + User user = null; + String[] split = source.split("-"); + if (source!=null && split.length==4){ + user = new User(); + user.setId(Integer.parseInt(split[0])); + user.setName(split[1]); + user.setAge(Integer.parseInt(split[2])); + user.setGender(split[3]); + } + return user; + } +} +``` + +UserController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class UserController { + + @RequestMapping("/user") + public String add(User user, Model model){ + System.out.println(user); + model.addAttribute("user","user"); + return "success"; + } +} +``` + +success.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/12 + Time: 21:36 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +${requestScope.user} + + + +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + +``` + +### (4)自定义日期格式化转换器 + +​ 有时候我们经常需要在页面添加日期等相关信息,此时需要制定日期格式化转换器,此操作非常简单:只需要在单独的属性上添加@DateTimeFormat注解即可,制定对应的格式 + +User.java + +```java +package com.mashibing.bean; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + '}'; + } +} +``` + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 日期:
+ + + + + +``` + +DateConvertionController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class DateConvertionController { + + @RequestMapping("dateConvertion") + public String dateConvertion(User user){ + System.out.println(user); + return "hello"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + +``` + +​ 此时运行发现是没有问题的,但是需要注意的是,如果同时配置了自定义类型转换器之后,那么日期格式转化是有问题的。 + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + +``` + +​ 原因就在于ConversionServiceFactoryBean对象中有且仅有一个属性converters,此时可以使用另外一个类来做替换FormattingConversionServiceFactoryBean + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### (5)数据校验 + +​ 一般情况下我们会在前端页面实现数据的校验,但是大家需要注意的是前端校验会存在数据的不安全问题,因此一般情况下我们都会使用前端校验+后端校验的方式,这样的话既能够满足用户的体验度,同时也能保证数据的安全,下面来说一下在springmvc中如何进行后端数据校验。 + +​ JSR303是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 。JSR 303 (Java Specification Requests意思是Java 规范提案)通过**在** **Bean** **属性上标注**类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。 + +JSR303: + +![](image\JSR303.png) + +Hibernate Validator 扩展注解: + +![](image\hibernate.png) + +​ spring中拥有自己的数据校验框架,同时支持JSR303标准的校验框架,可以在通过添加注解的方式进行数据校验。在spring中本身没有提供JSR303的实现,需要导入依赖的包。 + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + springmvc_viewResolver + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet + jsp-api + 2.0 + provided + + + org.hibernate + hibernate-validator + 5.1.0.Final + + + + +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/12 + Time: 15:23 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 编号:
+ 姓名:
+ 年龄:
+ 性别:
+ 日期:
+ 邮箱:
+ + + + + +``` + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult) { + System.out.println(user); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + return "redirect:/index.jsp"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } +} +``` + +User.java + +```java +package com.mashibing.bean; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; +import java.util.Date; + +public class User { + + private Integer id; + @NotNull + @Length(min = 5,max = 10) + private String name; + private Integer age; + private String gender; + @Past + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + @Email + private String email; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + ", email='" + email + '\'' + + '}'; + } +} +``` + +此时大家发现在报错的地方无法出现错误提示,可以换另外一种方式: + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +添加用户 + + + + +``` + +add.jsp + +```jsp +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + + id:
+ name:
+ age:
+ gender:
+ birth:
+ email:
+ +
+ + + +``` + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult, Model model) { + System.out.println(user); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + return "add"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } + + @RequestMapping("add") + public String add(Model model){ + model.addAttribute("user",new User(1,"zhangsan",12,"女",null,"1234@qq.com")); + return "add"; + } +} +``` + +web.xml + +```xml + + + + org.springframework.web.context.ContextLoaderListener + + + contextConfigLocation + classpath:springmvc.xml + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + + springmvc + / + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + +``` + +原生的表单如何获取错误信息: + +DataValidateController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Controller +public class DataValidateController { + @RequestMapping("/dataValidate") + public String validate(@Valid User user, BindingResult bindingResult, Model model) { + System.out.println(user); + Map errorsMap = new HashMap(); + if (bindingResult.hasErrors()) { + System.out.println("验证失败"); + List fieldErrors = bindingResult.getFieldErrors(); + for (FieldError fieldError : fieldErrors) { + System.out.println(fieldError.getDefaultMessage()); + System.out.println(fieldError.getField()); + errorsMap.put(fieldError.getField(),fieldError.getDefaultMessage()); + } + model.addAttribute("errorInfo",errorsMap); + return "add"; + } else { + System.out.println("验证成功"); + return "hello"; + } + } + + @RequestMapping("add") + public String add(Model model){ + model.addAttribute("user",new User(1,"zhangsan",12,"女",null,"1234@qq.com")); + return "add"; + } +} +``` + +add.jsp + +```jsp +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + + 编号:--->${errorInfo.id}
+ 姓名:--->${errorInfo.name}
+ 年龄:--->${errorInfo.age}
+ 性别:--->${errorInfo.gender}
+ 生日:--->${errorInfobirth}
+ 邮箱:--->${errorInfo.email}
+ +
+ + +``` + +​ \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/BindingAwareModelMap.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/BindingAwareModelMap.png" new file mode 100644 index 00000000..04ffe3fc Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/BindingAwareModelMap.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/DispatcherServlet\347\261\273\345\233\276.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/DispatcherServlet\347\261\273\345\233\276.png" new file mode 100644 index 00000000..32e89dbc Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/DispatcherServlet\347\261\273\345\233\276.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/JSR303.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/JSR303.png" new file mode 100644 index 00000000..4d9dcf70 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/JSR303.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/handlerInterceptor.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/handlerInterceptor.png" new file mode 100644 index 00000000..f646ed82 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/handlerInterceptor.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/hibernate.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/hibernate.png" new file mode 100644 index 00000000..14d0ba02 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/hibernate.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/mvc.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/mvc.png" new file mode 100644 index 00000000..1fef29ee Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/mvc.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/springmvc.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/springmvc.png" new file mode 100644 index 00000000..ce9e9f45 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/springmvc.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" new file mode 100644 index 00000000..992ceb43 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/springmvc\350\277\220\350\241\214\346\265\201\347\250\213.jpg" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 00000000..e00218af Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/tomcat\345\256\271\345\231\250\345\210\235\345\247\213\345\214\226\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 00000000..1c5919b9 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\212\240\350\275\275servlet\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2261.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2261.png" new file mode 100644 index 00000000..aad7be0b Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2261.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2262.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2262.png" new file mode 100644 index 00000000..3b7f309c Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2262.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2263.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2263.png" new file mode 100644 index 00000000..8540fe5a Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2263.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2264.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2264.png" new file mode 100644 index 00000000..b0f993c6 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\233\275\351\231\205\345\214\2264.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" new file mode 100644 index 00000000..a23ccb87 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" new file mode 100644 index 00000000..6f6975dc Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" new file mode 100644 index 00000000..0b5424e0 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" new file mode 100644 index 00000000..654ebfdb Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" new file mode 100644 index 00000000..7d2dc78b Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" new file mode 100644 index 00000000..90421791 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" new file mode 100644 index 00000000..4e090ab7 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" new file mode 100644 index 00000000..f133cb54 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\347\261\273\345\236\213\350\275\254\346\215\242\345\231\250.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" new file mode 100644 index 00000000..b0a4e577 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\247\206\345\233\276\345\257\271\350\261\241.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" new file mode 100644 index 00000000..b3401818 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\247\206\345\233\276\350\247\243\346\236\220\345\231\250.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\275\254\345\217\221.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\275\254\345\217\221.png" new file mode 100644 index 00000000..db98d1a0 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\350\275\254\345\217\221.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\351\207\215\345\256\232\345\220\221.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\351\207\215\345\256\232\345\220\221.png" new file mode 100644 index 00000000..d2e11b95 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\351\207\215\345\256\232\345\220\221.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" new file mode 100644 index 00000000..8ba2d4ad Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/image/\351\235\231\346\200\201\350\265\204\346\272\220.png" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/artifacts/springmvc_response_war_exploded.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/artifacts/springmvc_response_war_exploded.xml" new file mode 100644 index 00000000..789c0f49 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/artifacts/springmvc_response_war_exploded.xml" @@ -0,0 +1,27 @@ + + + $PROJECT_DIR$/out/artifacts/springmvc_response_war_exploded + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/compiler.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/compiler.xml" new file mode 100644 index 00000000..8bf453cd --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/encodings.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/misc.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/workspace.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/workspace.xml" new file mode 100644 index 00000000..7cad67b3 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/.idea/workspace.xml" @@ -0,0 +1,1362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BindingAr + viewResolvers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + <%-- --%> + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/index2.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/index2.jsp" new file mode 100644 index 00000000..b2cb2c33 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/index2.jsp" @@ -0,0 +1,29 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:03 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +666666666
+请按照id-name-age-password的方式输入数据
+
+ id:
+ name:
+ age:
+ password:
+ birth:
+ + + <%-- --%> + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/login.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/login.jsp" new file mode 100644 index 00000000..c27e2015 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/login.jsp" @@ -0,0 +1,27 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 21:36 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+ 编码:${errors.id}
+ 姓名:${errors.name}
+ 年龄:${errors.age}
+ 性别:${errors.gender}
+ 生日:${errors.birth}
+ 邮箱:${errors.email}
+
+ + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/update.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/update.jsp" new file mode 100644 index 00000000..aebe2626 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/out/artifacts/springmvc_response_war_exploded/update.jsp" @@ -0,0 +1,25 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:42 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+
+ name:张三
+ password:
+ age:
+
+ + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/pom.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/pom.xml" new file mode 100644 index 00000000..7df315c5 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/pom.xml" @@ -0,0 +1,29 @@ + + + 4.0.0 + + com.mashibing + springmvc_response + 1.0-SNAPSHOT + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + org.hibernate + hibernate-validator + 5.1.0.Final + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/springmvc_response.iml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/springmvc_response.iml" new file mode 100644 index 00000000..cf17af26 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/springmvc_response.iml" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/bean/Person.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/bean/Person.java" new file mode 100644 index 00000000..dee51cfc --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/bean/Person.java" @@ -0,0 +1,82 @@ +package com.mashibing.bean; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; +import java.util.Date; + +public class Person { + + @NotNull + private Integer id; + @Length(min = 3,max = 10) + private String name; + private Integer age; + private String gender; + @Past + private Date birth; + @Email + private String email; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + ", email='" + email + '\'' + + '}'; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/bean/User.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/bean/User.java" new file mode 100644 index 00000000..2362e55a --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/bean/User.java" @@ -0,0 +1,69 @@ +package com.mashibing.bean; + +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +public class User { + + private Integer id; + private String name; + private String password; + private Integer age; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birth; + + public User() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", password='" + password + '\'' + + ", age=" + age + + ", birth=" + birth + + '}'; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/DateConverterController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/DateConverterController.java" new file mode 100644 index 00000000..209ce517 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/DateConverterController.java" @@ -0,0 +1,22 @@ +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 如果使用默认的类型转换器,那么在输入日期的时候必须要使用/作为分隔,如果需要自定义实现该如何操作? + * + * 如果需要添加日期格式化器的话,只需要在实体类上添加@DataTimeFormat("格式")即可, + * 但是需要注意的是,如果在配置日期格式化器的时候,通过配置了类型转换器,那么此时就会失效需要使用FormattingConversionServiceFactoryBean对象 + * + */ +@Controller +public class DateConverterController { + + @RequestMapping("/testDateConverter") + public String testDateConverter(User user){ + System.out.println(user); + return "success"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ForWardController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ForWardController.java" new file mode 100644 index 00000000..8407ceb8 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ForWardController.java" @@ -0,0 +1,26 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class ForWardController { + + /** + * 在使用转发的时候前面要添加forward:前缀,同时通过写的字符串能够看到forward请求不经过视图处理器 + * + * 转发的除了可以转发回到页面之外,还可以转发到其他请求中 + * @return + */ + @RequestMapping("/forward") + public String forward(){ + System.out.println("forward"); + return "forward:/index.jsp"; + } + + @RequestMapping("/forward2") + public String forward2(){ + System.out.println("forward2"); + return "forward:/forward"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/MyConverterController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/MyConverterController.java" new file mode 100644 index 00000000..80d889fd --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/MyConverterController.java" @@ -0,0 +1,24 @@ +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.servlet.http.HttpServletRequest; + +/** + * 自定义类型转换器的时候一定要注意对应的属性值 跟方法中参数的值要对应起来 + * + */ +@Controller +public class MyConverterController { + + @RequestMapping("/converter") + public String testConverter( User user, Model model){ + System.out.println(user); + model.addAttribute("user",user); + return "success"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/OutputController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/OutputController.java" new file mode 100644 index 00000000..8125001f --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/OutputController.java" @@ -0,0 +1,75 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.servlet.ModelAndView; + +import javax.management.modelmbean.ModelMBeanOperationInfo; +import java.util.Map; + +/** + * 在向页面回显数据的时候,可以在方法的参数中显示的声明 + * Map: + * ModelMap: + * Model: + * 都可以将数据进行回显:回显之后数据是保存在哪个作用域中的? + * page: 当前页面 + * request: 当前请求 + * session: 当前会话 + * application:当前应用 + * 当使用上述参数传递数据的时候回把数据都放置到Request作用域 + * + */ +@Controller +@SessionAttributes(types = String.class) +public class OutputController { + + @RequestMapping("/output") + public String output(Map map){ + map.put("msg","hello,output"); + System.out.println(map.getClass()); + return "success"; + } + + + @RequestMapping("/output2") + public String output2(Model model){ + model.addAttribute("msg","hello,output2"); + System.out.println(model.getClass()); + + return "success"; + } + + @RequestMapping("/output3") + public String output3(ModelMap modelMap){ + modelMap.addAttribute("msg","hello,output3"); + System.out.println(modelMap.getClass()); + + return "success"; + } + + @RequestMapping("/output4") + public ModelAndView output4(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("success"); + mv.addObject("msg","output4"); + return mv; + } + + /** + * 当需要向session中设置数据的时候,可以在当前Controller上添加@SessionAttributes注解, + * 此注解表示,每次在向request作用中设置属性值的时候,顺带着向session中保存一份 + * value和type都写上之后表示session中可以存储名字为value值的参数以及类型为Integer的参数 + * value和type可以分开单独使用,但是尽量不要使用type类型,因为会把所有符合类型的数据都设置到session中,导致session异常 + * @param model + * @return + */ + @RequestMapping("/testSession") + public String testSession(Model model){ + model.addAttribute("username","zhangsan"); + return "success"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/RedirectController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/RedirectController.java" new file mode 100644 index 00000000..73de1665 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/RedirectController.java" @@ -0,0 +1,26 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class RedirectController { + + + /** + * 使用重定向的时候需要注意,添加redirect:前缀 + * 重定向操作也不会经过视图处理器 + * @return + */ + @RequestMapping("/redirect") + public String redirect(){ + System.out.println("redirect"); + return "redirect:/index.jsp"; + } + + @RequestMapping("/redirect2") + public String redirect2(){ + System.out.println("redirect2"); + return "redirect:/redirect"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/StaticController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/StaticController.java" new file mode 100644 index 00000000..34e2c074 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/StaticController.java" @@ -0,0 +1,14 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class StaticController { + + @RequestMapping("/static") + public String testStatic(){ + System.out.println("static"); + return "msb:success"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/UserController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/UserController.java" new file mode 100644 index 00000000..daed065f --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/UserController.java" @@ -0,0 +1,76 @@ +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +/** + * SessionAttributes要注意,在使用的时候如果没有对应的值,可能会报异常 + * + * 在使用@ModelAttribute的时候,需要注意, + * 1、如果参数中的注解没有写名字的话,默认是用参数名称的首字母小写来匹配 + * 2、如果有值,直接返回,如果没有值,会去session中进行查找,也就是说会判断当前类上是否添加过@SessionAttributes注解 + * + * 推荐:注解中最好添加参数,来作为标识,进行对象属性的赋值 + */ +@Controller +@SessionAttributes("user") +public class UserController { + + Object o1 = null; + Object o2 = null; + + Model m1 = null; + + @RequestMapping("/update") + public String update(@ModelAttribute("user2") User user,Model model){ + System.out.println("update--------------------"); + o2 = user; + System.out.println(user); + System.out.println(o1 == o2); + System.out.println(m1 == model); + return "success"; + } + + @RequestMapping("/update2") + public String update2(){ + System.out.println("update2----------"); + return "success"; + } + +// @ModelAttribute +// public void testModelAttribute(Model model){ +// System.out.println("testModelAttribute---------------+"); +// User user = new User(); +// user.setId(1); +// user.setName("李四"); +// user.setAge(11); +// user.setPassword("1234"); +// model.addAttribute("user",user); +// o1 = user; +// m1=model; +// } +// +// @ModelAttribute +// public void testModelAttribute2(Model model){ +// System.out.println("testModelAttribute2---------------+"); +// User user = new User(); +// user.setName("王五"); +// model.addAttribute("user",user); +// } + + @ModelAttribute("user2") + public User testModelAttribute3(){ + System.out.println("testModelAttribute3---------------+"); + User user = new User(); + user.setId(1); + user.setName("李四"); + user.setAge(11); + user.setPassword("1234"); + o1 = user; + return user; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ValidationController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ValidationController.java" new file mode 100644 index 00000000..a547b9a4 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ValidationController.java" @@ -0,0 +1,40 @@ +package com.mashibing.controller; + +import com.mashibing.bean.Person; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +public class ValidationController { + + @Validated + @RequestMapping("/validation") + public String validate(@Valid Person person, BindingResult bindingResult, Model model){ + System.out.println(person); + Map map = new HashMap(); + if(bindingResult.hasErrors()){ + System.out.println("登陆失败"); + //获取到当前所有的错误 + List fieldErrors = bindingResult.getFieldErrors(); + for (FieldError fieldError : fieldErrors) { + System.out.println(fieldError.getField()); + System.out.println(fieldError.getDefaultMessage()); + map.put(fieldError.getField(),fieldError.getDefaultMessage()); + } + model.addAttribute("errors",map); + return "forward:/login.jsp"; + }else{ + System.out.println("登陆成功"); + return "success"; + } + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ViewResolverController.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ViewResolverController.java" new file mode 100644 index 00000000..d6f3eb26 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/controller/ViewResolverController.java" @@ -0,0 +1,20 @@ +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class ViewResolverController { + + @RequestMapping("/msb") + public String testView(){ + System.out.println("testView"); + return "msb:/index"; + } + + @RequestMapping("/msb2") + public String testView2(){ + System.out.println("testView"); + return "heihei:/index"; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/converter/MyConverter.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/converter/MyConverter.java" new file mode 100644 index 00000000..5a5987bc --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/converter/MyConverter.java" @@ -0,0 +1,22 @@ +package com.mashibing.converter; + + +import com.mashibing.bean.User; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +public class MyConverter implements Converter { + + @Override + public User convert(String source) { + User user = null; + if ((source != null) && !"".equals(source) && (source.split("-").length == 4)){ + user = new User(); + user.setId(Integer.parseInt(source.split("-")[0])); + user.setName(source.split("-")[1]); + user.setAge(Integer.parseInt(source.split("-")[2])); + user.setPassword(source.split("-")[3]); + } + return user; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/viewResolver/MyView.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/viewResolver/MyView.java" new file mode 100644 index 00000000..05e006aa --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/viewResolver/MyView.java" @@ -0,0 +1,25 @@ +package com.mashibing.viewResolver; + +import org.springframework.web.servlet.View; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.util.Map; + +public class MyView implements View { + @Override + public String getContentType() { + return "text/html"; + } + + @Override + public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("model;"+model); + + response.setContentType("text/html"); + PrintWriter writer = response.getWriter(); + writer.write("

马士兵教育

"); + writer.write("123456"); + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/viewResolver/MyViewResolver.java" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/viewResolver/MyViewResolver.java" new file mode 100644 index 00000000..a5adefa0 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/java/com/mashibing/viewResolver/MyViewResolver.java" @@ -0,0 +1,36 @@ +package com.mashibing.viewResolver; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.ViewResolver; + +import java.util.Locale; + +@Component +@Order(1) +public class MyViewResolver implements ViewResolver, Ordered { + + private int order = 0; + + @Override + public View resolveViewName(String viewName, Locale locale) throws Exception { + + if(viewName.startsWith("msb:")){ + System.out.println(viewName); + return new MyView(); + }else{ + return null; + } + } + + public void setOrder(int order) { + this.order = order; + } + + @Override + public int getOrder() { + return 0; + } +} diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/resources/springmvc.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/resources/springmvc.xml" new file mode 100644 index 00000000..dfe30100 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/src/main/resources/springmvc.xml" @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/bean/Person.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/bean/Person.class" new file mode 100644 index 00000000..34992f7b Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/bean/Person.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/bean/User.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/bean/User.class" new file mode 100644 index 00000000..a67e8743 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/bean/User.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/DateConverterController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/DateConverterController.class" new file mode 100644 index 00000000..bc47f6cb Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/DateConverterController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ForWardController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ForWardController.class" new file mode 100644 index 00000000..0dbc5d1d Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ForWardController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/MyConverterController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/MyConverterController.class" new file mode 100644 index 00000000..1c486221 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/MyConverterController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/OutputController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/OutputController.class" new file mode 100644 index 00000000..8b41f0a1 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/OutputController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/RedirectController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/RedirectController.class" new file mode 100644 index 00000000..f73919ef Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/RedirectController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/StaticController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/StaticController.class" new file mode 100644 index 00000000..021ea049 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/StaticController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/UserController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/UserController.class" new file mode 100644 index 00000000..d32935bc Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/UserController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ValidationController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ValidationController.class" new file mode 100644 index 00000000..ee4efb8c Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ValidationController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ViewResolverController.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ViewResolverController.class" new file mode 100644 index 00000000..2d596043 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/controller/ViewResolverController.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/converter/MyConverter.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/converter/MyConverter.class" new file mode 100644 index 00000000..a31349c2 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/converter/MyConverter.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/viewResolver/MyView.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/viewResolver/MyView.class" new file mode 100644 index 00000000..812f0135 Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/viewResolver/MyView.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/viewResolver/MyViewResolver.class" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/viewResolver/MyViewResolver.class" new file mode 100644 index 00000000..20cf327d Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/com/mashibing/viewResolver/MyViewResolver.class" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/springmvc.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/springmvc.xml" new file mode 100644 index 00000000..dfe30100 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/target/classes/springmvc.xml" @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/WEB-INF/page/success.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/WEB-INF/page/success.jsp" new file mode 100644 index 00000000..b51929ad --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/WEB-INF/page/success.jsp" @@ -0,0 +1,24 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:07 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +欢迎
+${msg}
+page:${pageScope.msg}
+request:${requestScope.msg}
+session:${sessionScope.msg}
+application:${applicationScope.msg}
+
+session:${sessionScope.username}
+request:${requestScope.username}
+ + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/WEB-INF/web.xml" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/WEB-INF/web.xml" new file mode 100644 index 00000000..25e6ec3f --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/WEB-INF/web.xml" @@ -0,0 +1,35 @@ + + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + springmvc + / + + \ No newline at end of file diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/images/timg.jpg" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/images/timg.jpg" new file mode 100644 index 00000000..f778006e Binary files /dev/null and "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/images/timg.jpg" differ diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/index.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/index.jsp" new file mode 100644 index 00000000..0a557d5f --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/index.jsp" @@ -0,0 +1,25 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:03 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +666666666
+请按照id-name-age-password的方式输入数据
+
+
+ + + <%-- --%> + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/index2.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/index2.jsp" new file mode 100644 index 00000000..b2cb2c33 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/index2.jsp" @@ -0,0 +1,29 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:03 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + <% + pageContext.setAttribute("ctp",request.getContextPath()); + %> + +666666666
+请按照id-name-age-password的方式输入数据
+
+ id:
+ name:
+ age:
+ password:
+ birth:
+ + + <%-- --%> + + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/login.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/login.jsp" new file mode 100644 index 00000000..20f90603 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/login.jsp" @@ -0,0 +1,38 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 21:36 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="from" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +<%--
--%> +<%-- 编码:${errors.id}
--%> +<%-- 姓名:${errors.name}
--%> +<%-- 年龄:${errors.age}
--%> +<%-- 性别:${errors.gender}
--%> +<%-- 生日:${errors.birth}
--%> +<%-- 邮箱:${errors.email}
--%> +<%--
--%> +<%----%> + + id:
+ name:
+ age:
+ gender:
+ birth:
+ email:
+ +
+ + diff --git "a/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/update.jsp" "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/update.jsp" new file mode 100644 index 00000000..aebe2626 --- /dev/null +++ "b/javaframework/springmvc/04SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2503/springmvc_response/web/update.jsp" @@ -0,0 +1,25 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/15 + Time: 15:42 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+
+ name:张三
+ password:
+ age:
+
+ + + diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/03SpringMVC\347\232\204\344\275\277\347\224\250.md" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/03SpringMVC\347\232\204\344\275\277\347\224\250.md" new file mode 100644 index 00000000..abab52f3 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/03SpringMVC\347\232\204\344\275\277\347\224\250.md" @@ -0,0 +1,1658 @@ +# 03SpringMVC的使用 + +### 1、SpringMVC的返回JSON数据 + +​ 到目前为止我们编写的所有Controller的方法的返回值都是String类型,但是大家应该都知道,我们有时候数据传递特别是在ajax中,我们返回的数据经常需要使用json,那么如何来保证返回的数据的是json格式呢?使用@ResponseBody注解 + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + springmv_ajax + 1.0-SNAPSHOT + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet + jsp-api + 2.0 + provided + + + + com.fasterxml.jackson.core + jackson-core + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-databind + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.10.3 + + + +``` + +springmvc.xml + +```xml + + + + + + + + + + + + +``` + +JsonController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Controller +public class JsonController { + + @ResponseBody + @RequestMapping("/json") + public List json(){ + List list = new ArrayList(); + list.add(new User(1,"zhangsan",12,"男",new Date(),"1234@qq.com")); + list.add(new User(2,"zhangsan2",12,"男",new Date(),"1234@qq.com")); + list.add(new User(3,"zhangsan3",12,"男",new Date(),"1234@qq.com")); + return list; + } +} +``` + +User.java + +```java +package com.mashibing.bean; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.util.Date; + +public class User { + + private Integer id; + private String name; + private Integer age; + private String gender; + @JsonFormat( pattern = "yyyy-MM-dd") + private Date birth; + @JsonIgnore + private String email; + + public User() { + } + + public User(Integer id, String name, Integer age, String gender, Date birth, String email) { + this.id = id; + this.name = name; + this.age = age; + this.gender = gender; + this.birth = birth; + this.email = email; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + ", gender='" + gender + '\'' + + ", birth=" + birth + + ", email='" + email + '\'' + + '}'; + } +} +``` + +同时@ResponseBody可以直接将返回的字符串数据作为响应内容 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.http.HttpEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class OtherController { + @ResponseBody + @RequestMapping("/testResponseBody") + public String testResponseBody(){ + return "

success

"; + } +} +``` + + + +### 2、发送ajax请求获取json数据 + +ajax.jsp + +```jsp +<%@ page import="java.util.Date" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +<%=new Date()%> +获取用户信息 +
+ +
+ + + +``` + +### 3、使用@RequestBody获取请求体信息 + +testOther.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 15:04 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + + Title + + +
+
+
+
+
+ + + +``` + +OtherController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class OtherController { + + @RequestMapping("/testRequestBody") + public String testRequestBody(@RequestBody String body){ + System.out.println("请求体:"+body); + return "success"; + } +} +``` + +同时@RequestBody能够接受json格式的请求数据: + +testOther.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 15:04 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + + Title + + +
+
+
+
+
+ +
+发送json数据 + + + +``` + +OtherController.java + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class OtherController { + + @RequestMapping("/testRequestBody") + public String testRequestBody(@RequestBody String body){ + System.out.println("请求体:"+body); + return "success"; + } + + @RequestMapping("/testRequestJson") + public String testRequestBody(@RequestBody User user){ + System.out.println("对象:"+user); + return "success"; + } +} +``` + +在接受请求的时候还可以使用HttpEntity对象,用来接受参数,可以获取请求头信息。 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.http.HttpEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class OtherController { + + @RequestMapping("/testHttpEntity") + public String testRequestBody(HttpEntity httpEntity){ + System.out.println(httpEntity); + return "success"; + } +} + +``` + +### 4、使用RespsonseEntity可以用来定制响应内容 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class OtherController { + + @RequestMapping("/testResponseEntity") + public ResponseEntity testResponseEntity(){ + + String body = "

hello

"; + MultiValueMap header = new HttpHeaders(); + header.add("Set-Cookie","name=zhangsan"); + return new ResponseEntity(body,header, HttpStatus.OK); + } +} +``` + +### 5、文件下载 + +```java +package com.mashibing.controller; + +import com.mashibing.bean.User; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +@Controller +public class OtherController { + + @RequestMapping("/download") + public ResponseEntity download(HttpServletRequest request) throws Exception { + //获取要下载文件的路径及输入流对象 + ServletContext servletContext = request.getServletContext(); + String realPath = servletContext.getRealPath("/script/jquery-1.9.1.min.js"); + FileInputStream fileInputStream = new FileInputStream(realPath); + + byte[] bytes = new byte[fileInputStream.available()]; + fileInputStream.read(bytes); + fileInputStream.close(); + //将要下载文件内容返回 + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.set("Content-Disposition","attachment;filename=jquery-1.9.1.min.js"); + return new ResponseEntity(bytes,httpHeaders,HttpStatus.OK); + } +} + +``` + +### 6、文件上传 + +​ Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 **MultipartResolver** 实现的。Spring 用 **Jakarta Commons FileUpload** 技术实现了一个 MultipartResolver 实现类:**CommonsMultipartResovler** + +​ Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 MultipartResolver。 + +pom.xml + +```xml + + + 4.0.0 + + com.mashibing + springmvc_upload + 1.0-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.3.RELEASE + + + + org.springframework + spring-web + 5.2.3.RELEASE + + + + org.springframework + spring-webmvc + 5.2.3.RELEASE + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + + javax.servlet + jsp-api + 2.0 + provided + + + + com.fasterxml.jackson.core + jackson-core + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-databind + 2.10.3 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.10.3 + + + + commons-io + commons-io + 2.6 + + + + commons-fileupload + commons-fileupload + 1.4 + + + +``` + +web.xml + +```xml + + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + + + springmvc + / + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + +``` + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 17:00 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 文件:

+ 描述:

+ + + + + +``` + +UploadHandler.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +@Controller +public class UploadHandler { + + @RequestMapping(value = "/testUpload", method = RequestMethod.POST) + public String testUpload(@RequestParam(value = "desc", required = false) String desc, @RequestParam("file") MultipartFile multipartFile) throws IOException { + System.out.println("desc : " + desc); + System.out.println("OriginalFilename : " + multipartFile.getOriginalFilename()); + multipartFile.transferTo(new File("D:\\file\\"+multipartFile.getOriginalFilename())); + + return "success"; //增加成功页面: /views/success.jsp + } +} +``` + +success.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 17:03 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +success + + + +``` + +如果是多文件上传,那么又改如何处理呢? + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 17:00 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +
+ 文件:

+ 文件:

+ 文件:

+ 描述:

+ + + + + +``` + +UploadHandler.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +@Controller +public class UploadHandler { + + @RequestMapping(value = "/testUpload", method = RequestMethod.POST) + public String testUpload(@RequestParam(value = "desc", required = false) String desc, @RequestParam("file") MultipartFile[] multipartFile) throws IOException { + System.out.println("desc : " + desc); + for (MultipartFile file : multipartFile) { + if (!file.isEmpty()) { + System.out.println("OriginalFilename : " + file.getOriginalFilename()); + file.transferTo(new File("D:\\file\\" + file.getOriginalFilename())); + } + } + + return "success"; //增加成功页面: /views/success.jsp + } +} +``` + +### 7、Springmvc拦截器 + +​ SpringMVC提供了拦截器机制,允许运行目标方法之前进行一些拦截工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现**HandlerInterceptor**接口。 + +![image-20200313173442876](image\handlerInterceptor.png) + +​ **preHandle**():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false + +​ **postHandle**():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。 + +​ **afterCompletion**():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。 + +##### 1、自定义第一个拦截器 + +MyFirstInterceptor.java + +```java +package com.mashibing.interceptor; + + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class MyFirstInterceptor implements HandlerInterceptor { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + System.out.println(this.getClass().getName()+"------->preHandle"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println(this.getClass().getName()+"------->postHandle"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + System.out.println(this.getClass().getName()+"------->afterCompletion"); + } +} + +``` + +TestInterceptorController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class TestInterceptorController { + + @RequestMapping("test01") + public String test01(){ + System.out.println("test01"); + return "success"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + +``` + +success.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +<% System.out.println("success.jsp");%> +success + + + +``` + +​ 通过运行结果能够发现拦截器的执行顺序如下: + +![](E:\lian\springmvc\image\拦截器执行结果.png) + +​ 可以看到先执行拦截器的preHandle方法----》执行目标方法----》执行拦截器的postHandle方法----》执行页面跳转----》执行拦截器的afterCompletion方法 + +​ 在配置拦截器的时候有两个需要注意的点: + +​ 1、如果prehandle方法返回值 为false,那么意味着不放行,那么就会造成后续的所有操作都中断 + +​ 2、如果执行到方法中出现异常,那么后续流程不会处理但是afterCompletion方法会执行 + +##### 2、定义多个拦截器 + +​ 再添加另外一个拦截器 + +MySecondInterceptor.java + +```java +package com.mashibing.interceptor; + + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class MySecondInterceptor implements HandlerInterceptor { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + System.out.println(this.getClass().getName()+"------->preHandle"); + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println(this.getClass().getName()+"------->postHandle"); + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + System.out.println(this.getClass().getName()+"------->afterCompletion"); + } +} + +``` + +看到如下执行顺序: + +![image-20200313182213954](E:\lian\springmvc\image\多个拦截器执行顺序.png) + +调整两个拦截器的配置顺序: + +![image-20200313182350929](image\多个拦截器执行顺序2.png) + +大家可以看到对应的效果,谁先执行取决于配置的顺序。 + +​ 拦截器的preHandle是按照顺序执行的 + +​ 拦截器的postHandle是按照逆序执行的 + +​ 拦截器的afterCompletion是按照逆序执行的 + +​ 如果执行的时候核心的业务代码出问题了,那么已经通过的拦截器的afterCompletion会接着执行。 + +### 8、拦截器跟过滤器的区别 + +​ 1、过滤器是基于函数回调的,而拦截器是基于java反射的 + +​ 2、过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器 + +​ 3、过滤器几乎对所有的请求都起作用,而拦截器只能对action请求起作用 + +​ 4、拦截器可以访问action的上下文,而过滤器不可以 + +​ 5、在controller的生命周期中,拦截器可以多次调用,而过滤器只能在web容器初始化的时候初始化一次,后续匹配的所有请求都会经过过滤器来进行过滤 + +![image-20200313190146352](image\拦截器跟过滤器的执行流程.png) + +![image-20200313190309273](image\拦截器和过滤器的包含关系.png) + +### 9、SpringMVC的国际化操作 + +​ 在日常工作中,如果你的网站需要给不同语言地区的人进行查看,此时就需要使用国际化的基本操作,springmvc的国际化操作比较容易。 + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 17:00 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + 国际化页面登录 + + + +``` + +login.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + Title + + +

+
+ :

+ :

+ "/> + + + +``` + +I18nController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class I18nController { + + @RequestMapping("i18n") + public String i18n(){ + return "login"; + } +} +``` + +login_en_US.properties + +```properties +welcomeinfo=welcome to mashibing.com +username=USERNAME +password=PASSWORD +loginBtn=LOGIN +``` + +login_zh_CN.properties + +```pro +welcomeinfo=欢迎进入马士兵教育 +username=用户名 +password=密码 +loginBtn=登录 +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + +``` + +​ 其实SpringMVC中国际化的处理非常简单,就是按照浏览器所带来的语言信息决定的。 + +```java +Locale locale = request.getLocale();//获取浏览器的区域信息 +``` + +在DispatcherServlet中会包含一个组件,用来专门获取区域信息 + +![image-20200313193757666](image\国际化1.png) + +![image-20200313193823121](image\国际化2.png) + +![image-20200313194137103](image\国际化3.png) + +通过图片能够发现,默认调用的是org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver类 + +![image-20200313194436614](image\国际化4.png) + +在程序中可以获取Locale的相关信息: + +```java +package com.mashibing.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.Locale; + +@Controller +public class I18nController { + + @Autowired + private MessageSource messageSource; + + @RequestMapping("i18n") + public String i18n(Locale locale){ + System.out.println(locale); + String username = messageSource.getMessage("username", null, locale); + System.out.println(username); + return "login"; + } +} +``` + +### 10、通过超链接来切换国际化 + +login.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + Title + + +

+
+ :

+ :

+ "/> + 中文英文 + + + + +``` + +MyLocaleResolver.java + +```java +package com.mashibing; + +import org.springframework.web.servlet.LocaleResolver; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Locale; + +public class MyLocaleResolver implements LocaleResolver { + /** + * 解析并返回locale + * @param request + * @return + */ + @Override + public Locale resolveLocale(HttpServletRequest request) { + Locale locale = null; + String localeStr = request.getParameter("locale"); + if(localeStr!=null && ! "".equals(localeStr)){ + locale = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]); + }else{ + locale = request.getLocale(); + } + return locale; + } + + /** + * 不支持设置locale的信息 + * @param request + * @param response + * @param locale + */ + @Override + public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { + throw new UnsupportedOperationException( + "Cannot change HTTP accept header - use a different locale resolution strategy"); + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + +``` + +除了可以自定义区域信息解析器之外,我们还可以使用SpringMVC中自带的SessionLocaleResolver: + +I18nController.java + +```java +package com.mashibing.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +import javax.servlet.http.HttpSession; +import java.util.Locale; + +@Controller +public class I18nController { + + @Autowired + private MessageSource messageSource; + + @RequestMapping("i18n") + public String i18n(@RequestParam(value = "locale",defaultValue = "zh_CN") String localeStr,Locale locale, HttpSession session){ + + Locale l = null; + if(localeStr!=null && ! "".equals(localeStr)){ + l = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]); + }else{ + l = locale; + } + session.setAttribute(SessionLocaleResolver.class.getName() + ".LOCALE",l); + return "login"; + } +} +``` + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + +``` + +使用LocaleChangeInterceptor来实现国际化: + +springmvc.xml + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +I18nController.java + +```java +package com.mashibing.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +import javax.servlet.http.HttpSession; +import java.util.Locale; + +@Controller +public class I18nController { + + @Autowired + private MessageSource messageSource; + + @RequestMapping("i18n") + public String i18n(@RequestParam(value = "locale",defaultValue = "zh_CN") String localeStr,Locale locale, HttpSession session){ + +// Locale l = null; +// if(localeStr!=null && ! "".equals(localeStr)){ +// l = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]); +// }else{ +// l = locale; +// } +// session.setAttribute(SessionLocaleResolver.class.getName() + ".LOCALE",l); + return "login"; + } +} +``` + +### 11、SpringMVC异常处理机制 + +​ 在SpringMVC中拥有一套非常强大的异常处理机制,SpringMVC通过HandlerExceptionResolver处理程序的异常,包括请求映射,数据绑定以及目标方法的执行时发生的异常。 + +![image-20200313204210754](image\异常处理实现的子类.png) + +在容器启动好,进入DispatcherServlet之后,会对HandlerExceptionResolver进行初始化操作: + +![image-20200313204557902](image\异常初始化.png) + +会默认的从DispatcherServlet.properties中找到对应的异常处理类: + +```properties +#默认的处理类 +org.springframework.web.servlet.HandlerExceptionResolver= +#处理@ExceptionHandler +org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\ +#处理@ResponseStatus,给自定义异常使用 +org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ +#判断是否是SpringMVC自带异常 +org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver +``` + +自己定义异常处理方式: + +index.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +自己处理异常 + + +``` + +ExceptionController.java + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.jws.WebParam; + +@Controller +public class ExceptionController { + + @RequestMapping("exception1") + public String exception(){ + System.out.println("exception......."); + System.out.println(10/0); + return "success"; + } + + @ExceptionHandler(value = {ArithmeticException.class}) + public ModelAndView handlerException(Exception exception){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("error"); + mv.addObject("ex",exception); + return mv; + } +} +``` + +error.jsp + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + +我的出错页面: +错误信息:${ex} + + +``` + +​ 在一个类中可能会包含多个异常的处理方法,在不同的方法上可以使用不同范围的异常,在查找的时候会优先调用范围小的异常处理; + +```java +package com.mashibing.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.jws.WebParam; + +@Controller +public class ExceptionController { + + @RequestMapping("exception1") + public String exception(){ + System.out.println("exception......."); + System.out.println(10/0); + return "success"; + } + + @ExceptionHandler(value = {ArithmeticException.class}) + public ModelAndView handlerException1(Exception exception){ + System.out.println("handlerException1........"); + ModelAndView mv = new ModelAndView(); + mv.setViewName("error"); + mv.addObject("ex",exception); + return mv; + } + + @ExceptionHandler(value = {Exception.class}) + public ModelAndView handlerException2(Exception exception){ + System.out.println("handlerException2........"); + ModelAndView mv = new ModelAndView(); + mv.setViewName("error"); + mv.addObject("ex",exception); + return mv; + } +} +``` + +​ 在不同的类中可能会包含不同的异常处理,因此我们需要定义一个全局的异常控制器,使用@ControllerAdvice注解标注,如果本类跟全局都有相关异常的处理,那么会优先使用本类的。 + +```java +package com.mashibing.controller; + +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.servlet.ModelAndView; + +@ControllerAdvice +public class MyGlobalExceptionHandler { + @ExceptionHandler(value = {ArithmeticException.class}) + public ModelAndView handlerException1(Exception exception){ + System.out.println("handlerException1........"); + ModelAndView mv = new ModelAndView(); + mv.setViewName("error"); + mv.addObject("ex",exception); + return mv; + } +} +``` + +@ResponseStatus的使用: + +​ @ResponseStatus可以标注到方法上,但是标注在方法之后可能导致该方法无法被访问,因此更多的是在自定义类上 + +```java +package com.mashibing.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.ModelAndView; + +import javax.jws.WebParam; + +@Controller +public class ExceptionController { + + @ResponseStatus(reason = "不知道什么原因,反正错误",value = HttpStatus.NOT_ACCEPTABLE) + @RequestMapping("exception1") + public String exception(){ + System.out.println("exception......."); + return "success"; + } +} +``` + +​ @ResponseStatus作用在类上 + +UserNameException.java + +```java +package com.mashibing.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(reason = "名字不是admin",value = HttpStatus.NOT_ACCEPTABLE) +public class UserNameException extends RuntimeException { +} +``` + +ExceptionController.java + +```java +package com.mashibing.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.ModelAndView; + +import javax.jws.WebParam; + +@Controller +public class ExceptionController { + @RequestMapping("exception1") + public String exception(){ + System.out.println("exception......."); + return "success"; + } + @RequestMapping("exception2") + public String exception2(String username){ + System.out.println("exception2222......."); + if ("admin".equals(username)){ + return "success"; + }else{ + throw new UserNameException(); + } + } +} +``` + +springmvc自定义的异常: + +index.jsp + +```jsp +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/13 + Time: 17:00 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + +自己处理异常 +自定义异常处理 +Springmvc自己异常处理 + + +``` + +ExceptionController.java + +```java +package com.mashibing.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.ModelAndView; + +import javax.jws.WebParam; + +@Controller +public class ExceptionController { + + @RequestMapping("exception1") + public String exception(){ + System.out.println("exception......."); + return "success"; + } + @RequestMapping("exception2") + public String exception2(String username){ + System.out.println("exception2222......."); + if ("admin".equals(username)){ + return "success"; + }else{ + throw new UserNameException(); + } + } + + @RequestMapping(value = "exception3",method = RequestMethod.POST) + public String exception3(String username){ + System.out.println("exception3......."); + return "success"; + } +} +``` \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/handlerInterceptor.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/handlerInterceptor.png" new file mode 100644 index 00000000..f646ed82 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/handlerInterceptor.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2261.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2261.png" new file mode 100644 index 00000000..aad7be0b Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2261.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2262.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2262.png" new file mode 100644 index 00000000..3b7f309c Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2262.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2263.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2263.png" new file mode 100644 index 00000000..8540fe5a Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2263.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2264.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2264.png" new file mode 100644 index 00000000..b0f993c6 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\233\275\351\231\205\345\214\2264.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" new file mode 100644 index 00000000..a23ccb87 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\217.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" new file mode 100644 index 00000000..6f6975dc Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\244\232\344\270\252\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\351\241\272\345\272\2172.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" new file mode 100644 index 00000000..0b5424e0 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\274\202\345\270\270\345\210\235\345\247\213\345\214\226.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" new file mode 100644 index 00000000..654ebfdb Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\345\274\202\345\270\270\345\244\204\347\220\206\345\256\236\347\216\260\347\232\204\345\255\220\347\261\273.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" new file mode 100644 index 00000000..7d2dc78b Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\345\222\214\350\277\207\346\273\244\345\231\250\347\232\204\345\214\205\345\220\253\345\205\263\347\263\273.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" new file mode 100644 index 00000000..90421791 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\346\211\247\350\241\214\347\273\223\346\236\234.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" new file mode 100644 index 00000000..4e090ab7 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/image/\346\213\246\346\210\252\345\231\250\350\267\237\350\277\207\346\273\244\345\231\250\347\232\204\346\211\247\350\241\214\346\265\201\347\250\213.png" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/artifacts/springmvc_json_war_exploded.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/artifacts/springmvc_json_war_exploded.xml" new file mode 100644 index 00000000..d89dfa87 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/artifacts/springmvc_json_war_exploded.xml" @@ -0,0 +1,28 @@ + + + $PROJECT_DIR$/out/artifacts/springmvc_json_war_exploded + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/compiler.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/compiler.xml" new file mode 100644 index 00000000..ece8891b --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/encodings.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/encodings.xml" new file mode 100644 index 00000000..4987ecab --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/encodings.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/misc.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/misc.xml" new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/misc.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/uiDesigner.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/uiDesigner.xml" new file mode 100644 index 00000000..e96534fb --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/workspace.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/workspace.xml" new file mode 100644 index 00000000..b58da95c --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/.idea/workspace.xml" @@ -0,0 +1,1042 @@ + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1584772539168 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JAVA + java.lang.Override + + java.lang.Override + java.lang.annotation.Annotation + java.lang.annotation.Target + java.lang.annotation.Retention + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + java.lang.Override + + + All + private + + + + + + + JAVA + org.springframework.validation.support.BindingAwareModelMap + + java.util.LinkedHashMap + org.springframework.validation.support.BindingAwareModelMap + java.lang.Cloneable + org.springframework.ui.Model + java.util.AbstractMap + java.lang.SuppressWarnings + java.util.Map + java.util.HashMap + org.springframework.ui.ExtendedModelMap + org.springframework.ui.ModelMap + java.io.Serializable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.springframework.validation.support.BindingAwareModelMap + java.io.Serializable + + + All + private + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + springmvc_json:war exploded + + + + + + + + + + + + + + + c3p0-0.9.5.4 + + + + + + + + 1.7 + + + + + + + + springmvc_json + + + + + + + + 1.8 + + + + + + + + + + + + + + +
\ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/META-INF/MANIFEST.MF" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/META-INF/MANIFEST.MF" new file mode 100644 index 00000000..c1049f27 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/META-INF/MANIFEST.MF" @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: root +Created-By: IntelliJ IDEA +Build-Jdk: 1.8.0_172 + diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/META-INF/springmvc_json.kotlin_module" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/META-INF/springmvc_json.kotlin_module" new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/META-INF/springmvc_json.kotlin_module" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/bean/User.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/bean/User.class" new file mode 100644 index 00000000..a849c516 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/bean/User.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/DownController.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/DownController.class" new file mode 100644 index 00000000..23287f56 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/DownController.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/EntiryController.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/EntiryController.class" new file mode 100644 index 00000000..53aaa54a Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/EntiryController.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/InterceptorController.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/InterceptorController.class" new file mode 100644 index 00000000..e12486ec Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/InterceptorController.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/JsonController.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/JsonController.class" new file mode 100644 index 00000000..c3a7f2d6 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/JsonController.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/UploadController.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/UploadController.class" new file mode 100644 index 00000000..d6e8ce9a Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/controller/UploadController.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/interceptor/MyInterceptor.class" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/interceptor/MyInterceptor.class" new file mode 100644 index 00000000..e1ef683b Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/com/mashibing/interceptor/MyInterceptor.class" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/springmvc.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/springmvc.xml" new file mode 100644 index 00000000..168444ca --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/classes/springmvc.xml" @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/commons-fileupload-1.4.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/commons-fileupload-1.4.jar" new file mode 100644 index 00000000..e25a6bc9 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/commons-fileupload-1.4.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/commons-io-2.6.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/commons-io-2.6.jar" new file mode 100644 index 00000000..00556b11 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/commons-io-2.6.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-annotations-2.10.3.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-annotations-2.10.3.jar" new file mode 100644 index 00000000..e915f5ba Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-annotations-2.10.3.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-core-2.10.3.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-core-2.10.3.jar" new file mode 100644 index 00000000..a4059c37 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-core-2.10.3.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-databind-2.10.3.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-databind-2.10.3.jar" new file mode 100644 index 00000000..a5d6cf66 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/jackson-databind-2.10.3.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..b4c9ae0a Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-aop-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..839ca434 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-beans-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..72ead317 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-context-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..00f47493 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-core-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..abc4420d Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-expression-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..fa988fa4 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-jcl-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..afa0f577 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-web-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" new file mode 100644 index 00000000..af4bbb08 Binary files /dev/null and "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/lib/spring-webmvc-5.2.3.RELEASE.jar" differ diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/page/success.jsp" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/page/success.jsp" new file mode 100644 index 00000000..bb583b03 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/page/success.jsp" @@ -0,0 +1,19 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/21 + Time: 15:52 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + System.out.println("页面开始执行"); +%> + + + Title + + +

success

+ + diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/web.xml" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/web.xml" new file mode 100644 index 00000000..4969f2e8 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/WEB-INF/web.xml" @@ -0,0 +1,36 @@ + + + + encoding + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encoding + /* + + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc.xml + + 1 + + + springmvc + / + + \ No newline at end of file diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/ajax.jsp" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/ajax.jsp" new file mode 100644 index 00000000..c7fd7bcf --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/ajax.jsp" @@ -0,0 +1,39 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/21 + Time: 15:20 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +获取用户信息 +
+ +
+ + + diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/index.jsp" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/index.jsp" new file mode 100644 index 00000000..0a5f8e12 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/index.jsp" @@ -0,0 +1,16 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/21 + Time: 14:36 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + $Title$ + + + $END$ + + diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/requestbody.jsp" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/requestbody.jsp" new file mode 100644 index 00000000..35058914 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/requestbody.jsp" @@ -0,0 +1,43 @@ +<%-- + Created by IntelliJ IDEA. + User: root + Date: 2020/3/21 + Time: 15:32 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + Title + +<% + pageContext.setAttribute("ctp",request.getContextPath()); +%> + +
+
+
+
+ + +
+发送接送数据 + + + diff --git "a/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/scripts/jquery-1.9.1.min.js" "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/scripts/jquery-1.9.1.min.js" new file mode 100644 index 00000000..006e9531 --- /dev/null +++ "b/javaframework/springmvc/05SpringMVC\347\232\204\345\237\272\346\234\254\344\275\277\347\224\2504/springmvc_json/out/artifacts/springmvc_json_war_exploded/scripts/jquery-1.9.1.min.js" @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("