SSM基础-雷丰阳

一.Spring

概述

  • spring模块
  • spring核心功能

IOC

  • 控制反转(IOC)与依赖注入(DI)
    IOC:资源(有功能的类)的获取不再是由程序员自己创建,而是由容器来创建和管理
    DI:容器知道类A运行的时候需要另一个类B;容器通过反射的形式,将类B的对象注入到类A的属性中。
  • IOC细节

    .使用ApplicationContext和ClassPathXmlApplicationContext可直接获取ioc容器对象,然后使用getBeans()方法获取对象
    .IOC容器实际上就是一个Map!!!
  • 配置文件beans标签中的属性
    xmlns:xmls=“url” => 整个xml文件默认的命名空间(不用加前缀)
    xmlns:prefix:xmlns:prefix=“url” => 以prefix作为前缀的命名空间,此处prefix只是一个代称,可以换成其他英文表示。使用prefix命名空间中定义的元素标签时,需要加上前缀
    xmlns:xsi:xmlns:xsi=“url” => 本文件遵守的 XML 规范(不表示命名空间!!!)
    xsi:schemaLocation:xsi:schemaLocation=“url” => 定义各命名空间的文档的路径。成对出现,前一个是命名空间(即prefix后面的url),后一个是该url下面的具体文档
  • 配置文件xml标签
    • bean对应一个对象 => 其中标签属性id是该对象的标志; class指定对象属于哪个类; parent指定字段信息继承自哪个对象(注意不是类继承,两个对象属于同一个类); abstract表名这个bean是模板,只能被继承;scope指定bean的作用域
    • property嵌套于bean标签中,用于设置对象字段的默认值(使用无参构造器) => name字段名;value字段值(限于基本类型);ref引用容器中其他对象为该字段赋值(也可以property中嵌套bean为字段赋值);
    • constructor-arg嵌套于bean标签中,通过调用对象的带参构造函数设置字段值 => name 、value…; index指定参数索引; type指定参数所属的类
    • list内部包含若干个bean,构成复杂对象List
    • map内部包含若干个entry标签,构成复杂对象Map => 内部一个entry标签对应一个k-v
    • props 内部包含若干prop标签,构成复杂对象Properties
  • bean的作用域
    由bean标签的scope属性指定
  • 通过工厂创建bean



    也可通过spring自带的FactoryBean完成bean的创建 => 自行了解
  • bean的后置处理器
    Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理; bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理而非单一实例,其典型应用是:检查Bean 属性准确性或根据特定的标准更改 Bean 属性…,参考:Bean 的后置处理器
  • 引用外部配置文件

    或者
  • 基于xml的自动装配(自动赋值)
    bean的属性中包含对象时,之前都是手动写配置文件进行赋值 => 可以使用bean 标签的autowired属性选择自动赋值的方式,spring自动为属性对象进行赋值
  • SpEL
    Spring Expression Language,Spring的表达式语言; 与jsp的EL表达式基本一样;书写方式:#{…} => 例如
  • 通过注解创建bean

    spring底层不会区分注解与层是否对应;
    id就是类名首字母小写;bean默认单例
    使用注解需要导入aop包
  • spring 如何扫描加了注解的bean

    可以进一步使用exclue-filter标签排除部分组件,使其不被扫描; include-filter指定只扫描哪些组件
  • @Autowired
    …与基于xml的自动装配行为一样,但是使用注解更方便;
    spring注入时,先根据类型匹配,再根据id匹配…;
    方法上有Autowired注解的话,方法会自动注入参数;
    注意:
  • spring单元测试

AOP

  • AOP概念

    AOP底层原理就是动态代理
  • AOP相关专业术语
  • spring AOP用法
    1.目标类和切面类加入IOC容器
    2.切面类标注@Aspect注解
    3.切面类中的方法,通过切入点表达式标注出在哪个目标类的哪个方法的何时运行,如下:

    4.xml配置文件中开启基于注解的AOP功能(aspectj-autoproxy标签)
  • AOP细节
    细节一、IOC容器中保存的是目标类的代理对象而不是目标类的对象(只是,目标类有接口时使用jdk创建代理对象,应该使用接口类型获取对象;目标类没有接口时,由cglib创建代理对象,可直接使用目标类类型回去对象)


    细节二、切入点表达式的写法

    细节三、通知方法的执行顺序

    细节四、JoinPoint获取目标方法的详细信息;通知方法接收异常

    细节五、抽取可重用的切入点表达式

    之后直接在通知方法的切入点表达式中写这个空方法名即可!!
    细节六、环绕通知
    就是其他几个通知的结合体。。。功能强大;环绕通知就是一个动态代理,目标方法是在环绕通知内部执行!! <=> 而其他通知只是在目标方法的前或者后执行
    多切面运行顺序

    优先级高的切面先进入,后返回,默认优先级是按照切面类的首字母排序;
    也可以通过@Order注解手动设置优先级
  • 基于xml配置的AOP
    基本如下:
  • AOP应用

    基本上过滤器能做的都能使用AOP实现

jdbcTemplate

  • 概述
    spring提供的数据库操作; 但是比较简单,通常不会使用
  • 使用示例
    1.配置数据源

    2.配置jdbcTemplate

    3.使用
  • 其他
    整个jdbcTemplate都很少用,略…

声明式事务

  • 概念
  • spring声明式事务的原理

  • 使用方法

    最后在事务对应的方法上添加注解@Transactional即可

二、springMVC

概述

  • springMVC示意图

    相较于传统的MVC模式多了一个前端控制器,用于完成请求的拦截与分发;
    这个前端控制器就是DispatcherServlet
  • springMVC运行流程
  • 视图解析器
    springMVC配置文件中配置InternalResourceViewSolver(视图解析器) => 方便处理页面地址拼接(比如可以在视图解析器中直接指明页面的目录,从而简化…)
  • url-pattern
    / =>拦截所有请求,但是不包括jsp页面(即*.jsp)
    /* => 拦截所有请求,包括jsp页面(即*.jsp)

@RequestMapping

  • RequestMapping中的属性



  • RequestMapping的模糊匹配

RESTful / @PathVariable

请求数据的传入

  • 默认方式
    方法的参数直接写为与请求的参数相同的变量名,这个变量就用来接收请求参数,springMVC会自动解析参数
  • @RequestParam
  • @RequestHeader
  • @CookieValue
  • 传入pojo
  • 直接传入原生API

返回数据输出

  • Map、Model、ModelMap

三、MyBatis

概述

  • Mybatis与Hibernate
    原生JDBC :步骤很多,且sql语句硬编码在程序中,耦合严重
    HibernateORM框架,对JDBC完全封装,开发人员不需要写SQL ,通过Hibernate框架的方法即可操作数据库;全自动化;但是难以定制SQL,不适用于复杂业务
    MyBatis:持久化层/SQL映射框架,将JDBC中的重要步骤(sql,写在配置文件中)抽取出来手工完成,其他部分由MyBatis封装; 半自动化
  • MyBatis的配置文件
  • 细节

MyBatis的全局配置文件

所有配置信息包含在标签中;
最重要的标签是settings 和 mappers

  • properties标签
  • settings标签

    settings配置mybatis运行时的一些行为,具体的配置有很多,详见文档;上图中的配置就是将数据库表列名中的下划线与pojo属性字段的驼峰命名对应
  • typeAliases标签
  • typeHandlers标签
    作用:自动处理pojo参数类型与数据库表字段类型的对应关系
    mybatis默认已经能自动处理对应关系;如果还需要配置自定义的映射(如何自定义查文档),如下:
  • plugins标签
    配置mybatis插件;插件在mybatis中能够工作的原理:
  • enviroments标签
    主要用于配置数据库连接环境,不过基本用不上,而是使用spring
  • databaseIdProvider

    如果可能做数据库移植的话,还需要在写sql语句的时候指定数据库Id(即配置中的value);
    不过基本不会用到这个技术,数据库选型基本都是在项目初期确定,一般不会更改
  • mappers标签

    也有不用写sql映射文件,直接在接口的方法上使用注解标注sql语句的方法 => 但是会导致耦合,不推荐

SQL映射文件

  • 映射文件中的标签
  • 获取自增主键的值
  • 获取非自增主键的值
  • 参数传递

  • #{}和${}的区别

    => 因此通常都是使用#{}
    ${}也有其应用场景:因为mysql只支持数据库字段的预编译,对于想要动态传入表名等情况就无法使用#{},此时可使用 ${}
    什么是预编译:Mysql预编译
  • 查询返回list

    resultType指明集合内元素的封装类型即可
  • 查询多条记录封装成map

    resultType应该写map中value的类型; 此外,还需要在接口的方法上用注解指明哪个字段作为key
  • resultMap自定义结果集

    使用时在查询语句的标签上使用resultMap属性引用这个自定义resultMap的id即可!
  • 联合查询
    1.resultMap封装级联属性

    2.使用association封装(对1的改进)
    resultMap的写法改为如下:

四、javaWeb复习(不全)

监听器

  • 监听器分类

                 
                 

  • 监听器如何工作

  • session生命周期

    session活化与钝化:Session 的钝化与活化
    session绑定与解绑:session 对象的绑定、解绑和钝化、活化

  • 监听器使用场景
    常用的两个监听器

    对于HttpSessionBindingListener可用于统计登录的用户数(每次登录就会有一个对象绑定到session域中,登出会解绑 => 从而方便统计登录用户)

国际化

  • 目的
    同一套软件,根据不用国家/地区显示不同的语言
    由于文化风格的差异,即使语言可以自由切换,仍有用户可能不习惯 => 更多时候是针对不同语言环境,直接开发多套系统
  • 示意图

文件上传下载

  • 文件上传简介

    文件上传的表单需要使用multipart/form-data编码格式,表单格式如下:
    后端需要解析这个格式的表单数据,从而获得文件 => 过程比较麻烦,通常直接使用封装好工具(commons-fileupload)
  • 文件下载
    如果给出文件的路径,对于浏览器能够识别的文件类型,浏览器通常是默认直接打开文件,通常不采用这种静态方式 => 而是通过动态请求,servlet处理动态请求将文件流交给浏览器

    注意:将文件流交给浏览器的时候需要设置响应头,指定浏览器如何处理这个文件

javaWeb前端

  • html、css、js、jquery

tomcat目录结构

bin:下面存储可执行程序 => startup.bat、shutdown.bat等
conf:配置文件 => servlet.xml(tomcat集中配置的地方)、web.xml(所有项目都会继承这个web.xml)
lib:tomcat运行期间需要的jar包
log、temp…
webapps:所有运行的项目(默认访问下面的ROOT,否则要加上项目名)
work:存放运行期间编译的一些东西(比如jsp)

servlet(重要)

  • servlet基础
    Servlet:接口
    HttpServlet:使用doGet()、doPost()
    在web.xml中配置servlet如下:
  • ServletContext
    1.servletContext是四大域对象之一(PageContext、ServletRequest、HttpSession、ServletContext)
    2.域对象:存储数据的区域,在域中保存一些数据,即使跨页面也可获取保存的数据
    3.由于一个web应用中的所有Servlet共享同一个ServletContext对象:因此Servlet对象之间可以通过ServletContext来是实现通讯;也可使用ServletContext获取当前项目信息
  • HttpServletRequest
  • HttpServletResponse
  • 乱码
    请求乱码:注意GET和POST请求乱码的原因并不相同;对于GET,tomcat直接使用默认格式解码URL然后封装成request对象;对于POST,tomcat在使用请求体时才使用默认格式解码请求体


    响应乱码

    小结:常用的统一处理方式

JSP

  • jsp原理
  • 四大域对象
  • JSTL
  • EL表达式


    request对象和requestscope对象的关系?其他同理 => request域中保存的数据就放在它的requestScope属性中

cookie & session & token

参考:添加链接描述博客中后端部分有讲解

过滤器

  • javaWeb三大组件
    serlvet:处理请求
    filter:过滤拦截请求
    listener:监听
    三大组件基本需要在web.xml中进行注册,之后才能使用

  • 过滤器配置

    其中url-pattern的书写规则:

  • 过滤的过程

json和ajax

  • json
    1.和xml相比,是一种轻量级的数据交换格式
    2.json是js对象的表示方法,前后端传递的json数据本质上就是字符串
    3.所以前端收到后端的json数据通常都需要JSON.parse(data)解析成js对象
    4.对于jquery的ajax,如果不想手动解析,可以在dataType字段指定返回数据的类型为json,会直接转换为json;如果dataType是jsonp,ajax底层会给请求加上回调函数,并且直接将收到的字符串当做js解析(从而解决跨域),导致拿到的数据也是js对象
  • ajax原理
    http请求不再是直接由浏览器发起;而是由xhr对象作为代理发送请求并接收数据;
    注意:ajax可以无刷新改变页面内容,但无法改变页面URL(不过使用特定技术可以改变)

杂七杂八

  • 类路径
    通常是指项目源码包的开始路径(默认是src下)
  • 浏览器地址栏到底代表什么
    浏览器地址栏显示的仅仅是浏览器直接发起的http请求的地址;
    ajax由于是xhr对象发起的请求,而不是浏览器直接发起,所以不会修改浏览器地址!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值