jsp执行原理和顺序
- jsp全称为java server page
当用户发起请求,由tomcat容器接住处理,先翻译jsp为java文件
,然后编译class(该翻译编译过程为第一次请求才做的)执行java代码. - java代码执行完成后,把静态内容和java执行的结果一并响应给
到客户端浏览器. - 浏览器再从上往下执行静态内容(html,css,js)
. servlet的声明周期,是否安全
- 用户在第一次请求的时候,或容器启动的时候(需配置loadOnStartup为非负数,越小优先级越高),服务器或容器会创建servlet对象,并且只创建这一次,servlet是一个单例的.
- 执行init方法完成初始化
- 执行service方法,根据请求方式进入doget/dopost/doput/do…方法.
- 当服务器或容器关闭的时候,会执行destroy方法.完成 销毁工作.
servlet既然是单例的,那么它是否是线程安全的?
servlet本身不存在线程安全的问题. 但是要注意共享变量的定义范围,程序员的不当编写可能会 造成线程不安全.比如多个线程访问了servlet的同一个实例变量.
struts2运行原理
- 用户发送请求到容器,容器经过web.xml中的核心过滤器
StrutsPrepareAndExecuteFilter,看是否符合过滤条件,
,然后去struts.xml中查找匹配的package和action.
然后进入struts2的一系列的拦截器栈后进入我们的action的
execute方法.执行完成后,返回字符串,匹配struts配置文件
中的result,然后跳转到视图. - struts获取数据方法
属性驱动和模型驱动 - struts2是基于拦截器+反射实现的
7. hibernate
-
hibernate运行流程
1). 读取hibernate.cfg.xml核心配置
2). 创建sessionFactory对象
3). 创建session
4). 创建Transaction
5). 提交/回滚事务
6). 关闭资源 -
什么是事务的ACID特性
1). 原子性 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
2). 一致性 事务必须是使数据库从一个一致性状态变到另一个一致性状态。
3). 隔离性 每个事务之间相互不影响
4). 持久性 事务一旦完成,那么数据的存储是持久的 -
一级缓存和二级缓存
1). 一级缓存又称为session级别缓存,默认已打开
2). 二级缓存称为sessionFactory级别缓存,多个session共享.
hibernate二级缓存需要手动开启.一般使用ehcache第三方缓存.
经常修改的数据不适合放入二级缓存,因为可能造成脏读,
或者频繁修改二级缓存. 不经常修改的数据,但是经常查询
的数据,可以放入二级缓存…使用了二级缓存,那么修改数据
最好也同步到二级缓存. -
hibernate三态
1). 瞬时态 程序实例化的对象,session和DB中不存在
2). 持久态 执行get,load,save,update等方法后,对象会缓存到
session和持久化到数据库,此时对象为持久态.
对持久态的对象进行修改,最终会影响到session缓存和数据库.
3). 游离态 调用session的evict,clear,close等方法,对象进入
游离态或脱管态. 此时对象不受session管理.但数据库中有对应
的数据. -
什么是延迟加载? load和get的区别?
1). 延迟加载也称懒加载,指不直接访问数据库,
而是待具体访问对象的属性的时候,才去查询数据库.
做到提升或优化性能的作用.
2). get 是即时加载, 即立即访问数据库查询(会先查12缓存).没有数据
返回null
3). load称为"支持延迟加载", 当启用了延迟加载的时候,
就实现了延迟加载. 如果不启用,那么也会立即加载.
并且load返回的是代理对象,查询不到数据会抛出异常. -
什么是悲观锁和乐观锁
1). 悲观锁使用数据库的锁机制(在sql后面加for update),影响性能.
2). 乐观锁是逻辑层面的锁,应用通过版本号来控制并发操作.
一般给数据添加版本号或时间戳的方式来实现. -
什么是ORM
1). Object Relational Mapping 对象关系映射
2). 类名对应表名
3). 字段名对应数据库列名
4). 对象对应一行数据