# web-framework-springboot-gq **Repository Path**: Cerscent/web-framework-springboot-gq ## Basic Information - **Project Name**: web-framework-springboot-gq - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-30 - **Last Updated**: 2021-06-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # web-framework-springboot-gq ### 作业 #### Spring登录页面 1. 项目结构: 三层架构: - 持久层--Mybatis - 表现层--Servlet+Jsp - Spring--管理对象、切面处理 基于MVC模式: - 视图--Jsp - 模型--JavaBean - 控制器--Servlet+JavaBean 2. 数据库设计,项目中有sql文件 3. 项目导入jar包,详情在pom.xml中找到,利用maven依赖导入jar包 4. 创建包结构service中的包结构为dao、entity、service,web中的包结构为controller、global 5. 添加spring.xml,先对spring和mybatis进行整合配置 6. spring.xml中声明式事务和全局扫描配置 7. 创建工具类: 编码过滤器: 首先创建过滤器类,在web.xml中配置过滤器 核心控制器: - Servlet对象由web容器管理、service对象由ioc容器管理 - 当用户向web容器发送请求的时候,web容器把请求全部交给核心控制器Servlet, 判断由那个ioc容器控制 ### 项目 #### 部门管理 1. 步骤:实体类、Dao接口与sql映射文件、Servive接口与其实现类、 控制器、页面 2. sql映射文件在resources中和java一样的包名创建xml文件进行配置 3. 实体类、Dao接口与sql映射文件、Servive接口与其实现类步骤为业务层 4. 控制器、页面为表现层 ### SpringIOC #### 引入Jar包 使用Spring框架的时候需要用到的jar包: 1. spring-core 2. spring-context 3. spring-beans 4. spring-expression #### Ioc Ioc是 Inverse of Control,也就是反转控制的意思, 理解就是在原本在程序中要手动创建的如UserService对象的控制权, 交给Spring框架管理 通过applicationContext.xml对类对象进行创建控制 #### Di Di是 Dependency Injection,依赖注入, 就是在Spring创建对象的过程中,将这个对象所依赖的属性注入进去 #### 代码中表现 在UserServiceImpl中添加方法``setName()`的时候且不是实现UserService接口的内容, 传统方式需要修改UserService u=new UserServiceImpl()为 UserServiceImpl u=new UserServiceImpl(),而使用Spring的时候只需要修改xml配置文件中的内容就行了 #### bean的注入 1. 是利用构造函数进行注入,在bean配置文件中使用对属性进行配置 2. 在Set方法的属性注入中,类要有get set方法,在配置文件中使用 < property>对属性注入 ,当类中有依赖关系(类中有其他类)时需要对依赖类进行bean配置并且不能用 value进行设置值,需要用到ref #### SpEL属性注入 使用#{}的方式直接写入 #### 常用的注解方式bean注入 **方法** 在注解的方法代替xml的方式中用到了@Component的注解方法 其中@Component("id")中的内容就是指定的id名不用写class了 在DAO实现类用到的标签为@Repository 在Service实现类用到的为@Service 在Controller实现类中用到的为@Controller **属性注入** 1. 一般的变量注入是用到了@Value("name") 2. 当注入其他类的时候用到了@Autowired 3. 使用@Qualifier("id")来准确确定注入的类 4. 还有一种方法就是用@Resource(name="") 相当于2和3整合 **生命周期注解** 1. 在执行的方法上添加@PostConstruct为初始化执行 2. 在执行的方法上添加@PreDestroy为销毁时执行 **Bean的作用范围** 1. 默认的是singleton,也就是单例 2. 如果想要创建不同的对象,那么在类的上面加上@Scope("prototype") 也就创建了不同的对象 ### SpringAOP #### jdk的动态代理 **对方法进行权限校验的情况下** 1. 先实现普通的Dao接口和实现类的编写。如对方法1进行权限校验(增强) 2. 使用jdk动态代理的方式实现Proxy的编写,先创建类并实现InvocationHandler接口, 再实现接口的方法 3. 将需要增强的类传递到Proxy类中完成createProxy的编写,用到了Proxy类的newProxyInstance() 方法 4. 完成invoke()方法 对方法1进行判断并实现内容 5. 在创建实现类的时候用我们自己写的Proxy类进行创建 #### cglib的动态代理 1. 引入cglib开发包或spring开发包 2. 实现Dao类,增强方法1 3. 实现Cglib类编写,先将DAO类传递进Cglib类中,创建create方法 其中方法中有4步:创建核心类、设置父类、设置回调、生成代理 4. 创建核心类Enhancer enhancer=new Enhancer(); ,设置父类enhancer.setSuperclass() 将需要增强的Dao类传递进去,设置回调enhancer.setCallback(this); 类Cglib实现MethodInterceptor接口,生成代理enhancer.create() 5. 实现intercept()方法和invoke方法相似 #### 一般切面 1. 引入spring包和aopalliance、spring-aop 2. 创建Dao接口和实现类 3. 创建Advice类,(假设使用前置增强)类实现了MethodBeforeAdvice 并实现抽象方法 4. 创建配置文件,并对Dao实现类进行配置< bean id class>,再对Advice进行配置 最后配置Spring的AOP产生代理对象: #### 带有切入点的切面 1. 创建实体类,并在xml中进行配置 2. 创建Advice类(假设为环绕类) 详情请找到MyAroundAdvice类 并在xml中配置 3. 详情在配置文件中 #### Spring自动代理 **BeanNameAutoProxyCreator** 详情请看applicationContext2.xml中的配置信息 **DefaultAdvisorAutoProxyCreator** 先配置目标类、配置增强、配置切面、基于切面信息进行配置 ### Spring aspectj #### 准备工作 1. 引入4个spring基本开发包 2. 引入aop联盟和spring-aop、aspectjweaver 、spring-aspects 3. 创建spring.xml,加入< aop:aspectj-autoproxy/>,开启AspectJ的注解开发,自动代理 #### 5种通知类型 1. 前置通知 Before 2. 后置通知 AfterReturning 3. 环绕通知 Around 4. 异常抛出通知 AfterThrowing 5. 最终final通知 After #### 使用 在使用注释通知中首先要创建相关aspectj类,并给出通知类型的注解如: @Before(value = "execution(* com.gq.aspectJ.demo.ProductDao.*(..))") 并在xml文件中进行配置 通过JoinPoint对象获得切点信息 同样的其他方法利用相应的注释进行完成 ### JDBC Template #### 准备工作 **Maven配置** 1. 创建好数据库和表 2. 利用maven引入jar包,首先引入mysql-connector-java 3. 引入Spring相关组件(4个基本jar) 4. 引入JDBC和tx **Spring配置** 1. 看xml中的头文件,配置bean的数据源: < bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> < property name="driverClassName" value="com.mysql.jdbc.Driver"/> < property name="url" value="jdbc:mysql://localhost:3306/sty?useUnicode=true&characterEncoding=utf-8"/> < property name="username" value="root"/> < property name="password" value="root"/> < /bean> 2. 配置JDBC Template < bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> < property name="dataSource" ref="dataSource"/> < /bean> 3. #### 基本使用 1. 首先通过ClassPathXmlApplicationContext得到applicationContext对象 2. 新建JdbcTemplate对象JdbcTemplate jdbcTemplate= (JdbcTemplate) applicationContext.getBean("jdbcTemplate") 3. 直接使用JdbcTemplate对象的方法完后sql语句 #### 查询 **查询简单数据项** 1. 获取一个: T queryForObject(String sql,Class type) T queryForObject(String sql,Class type,Object...arg) 2. 获取多个: List queryForList(String sql,Class type) List queryForList(String sql,Class type,Object...arg) **查询复杂对象** 1. 获取一个: Map queryForMap(String sql) Map queryForMap(Object...arg) 2. 获取多个: List> queryForList(String sql) List> queryForList(String sql,Object...arg) **查询复杂对象(封装为实体对象)** 1. 获取一个: T queryForObject(String sql,RowMapper mapper) T queryForObject(String sql,RowMapper mapper,Object...arg) 2. 获取多个: List< T> query(String sql,RowMapper< T> mapper) List< T> query(String sql,RowMapper< T> mapper,Object...arg) 3. 这里的RowMapper mapper是例如以下的信息: public Student mapRow(ResultSet resultSet, int i) throws SQLException { Student stu = new Student(); stu.setId(resultSet.getInt("id")); stu.setName(resultSet.getString("name")); stu.setSex(resultSet.getString("sex")); stu.setBorn(resultSet.getDate("born")); return stu; }