今天这篇文章主要是总结java中常用的框架的总结:
工作原理大多数是复杂的,可以通过图片以及步骤来了解底层的工作,但是个人还是觉得要理解工作原理,还是代码操作一遍好。
1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3.接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;
4.如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;
5.ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
6.ActionProxy创建一个ActionInvocation的实例。
7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
①基于MVC架构,框架架构结构清晰
②使用OGNL:OGNL可以快速的访问值栈中的数据、调用值栈中对象的方法。
③拦截器:Struts2中的很多特性都是通过拦截器实现的,例如:异常处理,文件上传,验证等。
④多种表现层技术,如:JSP、FreeMarker、Velocity。
Stuts2过滤器 | Stuts2拦截器 |
过滤器依赖于Servlet容器 | 拦截器依赖于Servlet容器 |
过滤器可以对几乎所有的请求起作用 | Stuts2拦截器只能对Action请求起作用 |
Stuts2过滤器不能访问Action下问 | Stuts2拦截器可以访问Action上下文(ActionContext) |
在Aciton中生命周期中,过滤器只能在容器初始化的时候调用一次 | 在Aciton中生命周期中,拦截器可以多次调用 |
①ValueStack贯穿整个Action的生命周期,保存在request域中,所以ValueStack和request的生命周期时一样的
② ValueStack是多实例的,因为Action是多实例的(Servlet是单例的),每个Action都有一个对应的值栈,Action对象默认保存在栈顶
③拦截器:Struts2中的很多特性都是通过拦截器实现的,例如:异常处理,文件上传,验证等。
ValueStack本质上就是一个ArrayList
④.使用OGNL访问值栈内容是,不需要#号,而访问作用域中的值时,需要#号
⑤. Struts2重写了request的getAttribute方法,所以可以用EL直接访问值栈中的内容
Hibernate的工作原理相对于Struts2要简单点,Hibernate是一个全自动化的持久化化框架,可以帮我们程序员干很多事情,还是很嗨皮的。
1.通过Configuration读取并解析hibernate.cfg xml配置文件
2.由hibernate.cfg.xml中的读取并解析映射文件
3.通过config.buildSessionFactory创建sessionFactory
4.通过sessionFactory.openSession获取session
5.通过session.beginTransaction开启事务
6.操作数据
7.提交事务
8.关闭session和sessionFactory
优点:
①.对JDBC访问数据库的代码进行了封装,简化了数据库访问层繁琐的重复性代码
②.映射的灵活性,它支持各种关系数据库,从一对一到多对多的各种复杂关系③.非侵入性、移植性会好
④.缓存机制:提供一级缓存和二级缓存
缺点:
①.无法对SQL进行优化
②.框架中使用ORM原则,导致配置过于复杂
③.执行效率和原生的JDBC相比偏差:特别是在批量数据处理的时候
④.不支持批量修改、删除
①临时状态(新建状态):不处于session缓存中
②持久化状态:加入到session缓冲中
③游离状态:已经被持久化,但不在session的缓存中
当调用:session:的load()方法加载实体类时,就会延迟加载
Hibernate进行大批暈更新的经验
直接通过JDBC API执行相关的SQL语句或者调用相关的存储过程是最佳的方式
①getCurrentSession()会先查看当前线程是否绑定了session,如果有则直接返回,如果没有在创建。而openSession()则直接会new一个新的session并返回。
②getCurrentSession()在事务提交中会自动关闭session,而openSession()需要手动关闭。
①QBC标准查询;
②HQL查询(Hibernate quary language hibernate查询语言);
③本地SQL查询(原生态查询);
①. 从返回结果上对比:get方法检索不到结果的话,返回结果为null;但是load()方法检索不到结果的话,则会出现ObjectNotFoundException异常。
②. 从检索机制上对比:load支持延迟加载(懒加载),get不支持延迟加载。
今天先介绍这两种框架,后期再补充别的。希望有用噢