目录
一、JSP
JSP = HTML + java
- HTML + CSS + JS
- java代码:和数据库通信的代码
- java代码:将java数据展示在页面上的代码
二、MVC
- M:model(模型)
- V:view(视图)
- C:controller(控制器)
视图层:用于做数据展示和用户交互的一个界面
控制层:能够接受客户端的请求,具体的业务功能还是需要借助于模型组件来完成
模型层:模型层分为很多种,有比较简单的pojo/vo(value object),有业务模型组件,有数据访问层组件
- pojo/vo:值对象
- DAO:数据访问对象
- BO:业务对象
⭐区分业务对象和数据访问对象
1.DAO中的方法都是单精度方法(细粒度方法)
什么是单精度?
一个方法只考虑一个操作,比如添加,那就是insert操作,修改就是update操作,查询就是select操作等......
2.BO中的方法属于业务方法
实际的业务比较复杂,因此业务方法的粒度是比较粗的
⚪注册功能
注册的功能属于业务功能,也就是说注册这个方法属于业务方法
那么这个业务方法中包含了多个DAO方法,也就是说注册这个业务功能需要通过多个DAO方法的组合调用,从而完成注册功能
注册包含的功能?
- 检查用户是否已经被注册 —— DAO中的select操作
- 向用户表新增一条新用户记录 —— DAO中的insert操作
- 向用户积分表新增一条记录(新用户默认初始化积分**分)—— DAO中的insert操作
- 向系统消息表新增一条记录(×××新用户注册了,需要根据通讯录信息向他的联系人推送消息)—— DAO中的insert操作
- 向系统日志表新增一条记录
- ...........
三、IOC
1.耦合/依赖
依赖:某某某离不开某某某
在软件系统中,层与层之间是存在依赖的。我们也称之为耦合
我们在系统架构或者设计的原则是:高内聚,低耦合
层内部的组成应该是高度聚合的,而层与层之间的关 系应该是低耦合的,最理想的情况是0耦合的
2.控制反转 IOC/依赖注入 DI
①控制反转
Ⅰ.之前在Servlet中,我们创建service对象,FruitService fruitService = new FruitServiceImpl()
- 这句话如果出现在servlet中的某个方法内部,那么这个fruitService的作用域(生命周期)应该就是这个方法级别
- 如果这句话出现在servlet的类中,也就是说fruitService是一个成员变量,那么这个fruitService的作用域(生命周期)应该就是这个servlet实例级别
Ⅱ. 之后我们在applicationContext.xml中定义了这个fruitService,然后通过解析xml,产生fruitService实例,存放在beanMap中,这个beanMap在一个BeanFactory中,因此,我们改变了之前的service实例、dao实例等的生命周期,控制权从程序员转移到BeanFactory。
②依赖注入
- 之前我们在控制层出现代码:FruitService fruitService = new FruitServiceImpl()
- 那么,控制层和service层存在耦合
- 之后,我们将代码修改成FruitService fruitService = null;
- 然后在配置文件中配置:
- <bean id = "fruit" class = "FruitController">
- <property name = "fruitService" ref = "fruitService"/>
- </bean>
四、 Filter
Filter也属于Servlet规范
1.过滤器的三要素
①拦截
过滤器之所以能够对请求进行预处理,关键是对请求进行拦截,把请求拦截下来才能够做后续的操作。而且对于一个具体的过滤器,它必须明确它要拦截的请求,而不是所有请求都拦截。
②过滤
根据业务功能实际的需求,看看在把请求拦截到之后,需要做什么检查或什么操作,写对应的代码即可。
③放行
过滤器完成自己的任务或者是检测到当前请求符合过滤规则,那么可以将请求放行。所谓放行,就是让请求继续去访问它原本要访问的资源。
2.Filter开发步骤
- 新建类实现Filter接口,然后实现其中的三个方法Linit、doFilter、destory
- 配置Filter,可以用注解@WebFilter,也可以使用xml文件<filter><filter-mapping>
- Filter在配置时,和servlet一样,也可以配置通配符,例如@WebFilter("*.do")表示拦截所以有.do的结尾
3.过滤器链
- 如果采取的是注解的方式进行配置,那么过滤器链的拦截顺序是按照全类名的先后顺序排序的
- 如果采取的是xml的方式进行配置,那么按照配置的先后顺序进行排序
- 多个Filter的拦截范围如果存在重合部分,那么这些Filter会形成Filter链。
- 浏览器请求重合部分对应的目标资源时,会依次经过Filter链中的每一个Filter。
- Filter链中每一个Filter执行的顺序是由web.xml中filter-mapping配置的顺序决定的。
4.Filter生命周期
和Servlet生命周期类比,Filter生命周期的关键区别是:在Web应用启动时创建对象
5.过滤器匹配规则
①精确匹配
指定被拦截资源的完整路径
②模糊匹配
相比较精确匹配,使用模糊匹配可以让我们创建一个Filter就能够覆盖很多目标资源,不必专门为每一个目标资源都创建Filter,提高开发效率。
①前杠后星
在我们配置了url-pattern为/user/*之后,请求地址只要是/user开头的那么就会被匹配。
②前星后缀
下面我们使用png图片来测试后缀拦截的效果,并不是只能拦截png扩展名。
- 创建一组img标签
- 创建Filter
③前杠后缀,星号在中间
配置方式如下:
<url-pattern>/*.png</url-pattern>
按照这个配置启动Web应用时会抛出异常:
java.lang.IllegalArgumentException: Invalid /*.png in filter mapping
结论:这么配是不允许的!