文章目录
一.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
-
@PathVariable
为了支持REST风格的url而增加的功能; 可以将路径上的值作为参数
-
RESTful风格的url
更多参考:在RESTFUL风格中怎样定义需要多个参数才能确定的资源路径 -
如何发起PUT、DELETE请求
REST风格会使用到PUT、DELETE请求,但是ajax发送PUT、DELETE请求时通常无法传递参数 => 原因:由于tomcat的问题,导致PUT、DELETE请求的参数无法被springMVC封装,解决方案参考:Ajax发送PUT/DELETE请求时出现错误的原因及解决方案
请求数据的传入
- 默认方式
方法的参数直接写为与请求的参数相同的变量名,这个变量就用来接收请求参数,springMVC会自动解析参数 - @RequestParam
- @RequestHeader
- @CookieValue
- 传入pojo
- 直接传入原生API
返回数据输出
- Map、Model、ModelMap
三、MyBatis
概述
- Mybatis与Hibernate
原生JDBC :步骤很多,且sql语句硬编码在程序中,耦合严重
Hibernate:ORM框架,对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对象发起的请求,而不是浏览器直接发起,所以不会修改浏览器地址!!!