黑马程序员技术交流社区

标题: 【石家庄校区】Struts2、Hibernate总结 [打印本页]

作者: 马三保    时间: 2018-6-27 15:07
标题: 【石家庄校区】Struts2、Hibernate总结
本帖最后由 小石姐姐 于 2018-6-29 11:21 编辑

【石家庄校区】Struts2部分笔记
1、struts2封装数据的两种方式:
1)属性驱动:
A:直接在action类中提供与请求参数匹配属性,提供get/set方法
B:在action类中创始一个javaBean,对其提供get/set ,在请求时页面上要进行修改,          例如 user.username  user.password ,要使用ognl表达式。
以上两种方式的优缺点:
第一种比较简单,在实际操作我们需要将action的属性在赋值给模型(javaBean)        去操作
        第二种:不需要在直接将值给javaBean过程,因为直接将数据封装到了javaBean        中。它要求在页面上必须使用ognl表达式,就存在页面不通用问题。
2)模型驱动:
步骤:
1.让Action类要实现一个指定接口ModelDriven
2.实例化模型对象(就是要new出来javaBean)
3.重写getModel方法将实例化的模型返回。
2、服务器报错:Multiple Contexts have a path of "/xxxx":将Servers中的server.xml中的context标签中重复的项目配置删除掉即可。
3、Ognl表达式如果从根中获取数据不需要加“#”,如果是从非根中获取数据要加上“#”。
注意:在根中保存了当前action对象。
4、Servlet是单实例多线程,存在线程安全问题。Action是一个多例的,不存在安全问题,每次发起一个请求就会生成一个action实例,每个action都会创建一个ValueStack,Struts2会把一些数据放在ValueStack,然后把ValueStack放在request域中。
5、Struts2使用域对象的两种方式:1)使用ServletActionContext类中的静态方法来获取域对象,进而使用域对象。2)实现对应的接口。
6、面试题:为什么struts2中使用EL表达式能获取到值栈的数据?
7、使用HttpServletRequest或取的session是一个HttpSession对象,使用ServletActionContext.getContext().getSession()或取到的是一个map集合,装的是session中的数据(键值对的形式)。
8、在Struts2中使用工具类上传文件时必须要有两个属性值以及对应的get/set方法,一个是File file ,一个是String fileFileName,这里的File类型的变量file,是表单中input表单中的name属性的名字,String类型的fileFileName,这个名字由两部分组成,一个部分是file(必须与File变量的名字一致)一部分是FileName这部分是固定的,差一个字母都不行,整体也是固定的格式。
9、如果后台向前台返回的是字符串类型的json数据,而前台也没有声明要接收json类型的数据,使用eval(data);可以将这个字符串转换成json对象。
10、在struts2中使用了注解的类所在的包名必须包含:action,actions,struts,struts2中的一个或多个,当然可以同过设置常亮的方式更改设置。
11、ActionContext的主要功能
1)提供WEB上下文。
2)解决线程安全问题。
3)解决与其他Framework不兼容 的问题(例如webLogin)。
12、ServletActionContext是ActionContext的子类。 它的功能是从ActionContext开始,封装方法,使其更加简单直观。我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
13、ServletContext提供了标准的Servlet运行时环境。 实际上是servlet与web容器进行通信的一些方法。
14、什么是MVC
   1)Model模型:
     模型的职责是负责业务逻辑,包含两部分:业务数据和业务处理逻辑.比如实体类,DAO,Service都属于模型层。
   2)View视图:
      视图的职责是显示界面和用户交互(收集用户信息)。属于视图的类是不包含业务,逻辑和控制逻辑的JSP。
   3)Controller控制器:
       控制器是模型层和视图层之间的桥梁,用于流程控制。比如Servlet。
15、Struts2的工作流程:
          1.所有请求提交给前端控制器(FC)
          2.根据配置信息确定要调用的Action
          3.创建一个ValueStack对象(每个请求都有一个独立的VS对象)
          4.创建Action对象,把Action对象放在VS栈顶,将VS对象存到request中,存储的key为
  "struts.valueStack"
          5.控制器调用Action对象接收请求参数,并在方法根据输入属性算出输出属性
         6.在调用Action之前或之后调用一系列Interceptor
          7.根据Action返回的字符串确定Result(10种类型)
          8.调用Result对象,将VS中的数据按照特定的格式输出
         9.很多情况下,Result将转发JSP,JSP页面用Tags取出数据并显示
          10.请求处理完后,将ValueStack对象和Action对象销毁。
16、Struts2中获取request,response,session的三种方式:
1)使用ActionContext获取;
2)使用ServletActionContext获取。
3)使用struts2的拦截器获取SessionAware,ServletRequestAware,ServletResponseAware。
17、Struts2中的控制反转/依赖注入(例如在action中注入session,request...):类继承接口SessionAwear,ServletRequestAwear...声明一个用来接收相应对象的类成员变量,实现对应接口中的方法,将本类中的成员变量进行赋值,拦截器会检测这个action实现了哪些接口,然后会调方法获取到想要的对象,进而调用接口中的方法将获取到的对象注入到action中。
18、Struts2创建action的三种方式:
1)创建一个POJO类,优点:无耦合,适用于逻辑相对简单的action。
2)实现Action接口,接口中有五个常亮属性和一个方法。
3)继承ActionSupport类,此类也实现了Action接口,因为它具有丰富的功能,如表单校验 错误信息 设置国际化等,所以常在开发中使用,但也同样有高耦合的问题。
Hibernate

1. session线程安全问题:1)在方法内获取session,那么就是安全的,注意如果使用的是openSession()方法获取的session,要手动调用close()方法释放资源。如果是将session声明在了类中,使session成了一个成员变量,会存在线程安全问题。2)使用getCurrentSession()方法获取的session没有线程安全问题,而且在事物提交或回滚后也会自动释放资源。
2. Hibernate使用要配置两个文件:1)XXX.hbm.xml(记住标签的顺序结构)一般位于该bean所在的包中(可以通过配置来更改)。2)hibernate.cfg.xml,核心配置文件,配置一些必要的配置,并引入配好的映射文件。
3. Hibernate工作原理:
1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2、由hibernate.cfg.xml中的<mappingresource="xx/xx/xxx.hbm.xml"/>读取解析映射        信息。
3、通过config.buildSessionFactory();//得到sessionFactory。
4、sessionFactory.openSession();//得到session。
5、session.beginTransaction();//开启事务。
6、persistent operate;
7、session.getTransaction().commit();//提交事务
8、关闭session;
9、关闭sessionFactory;
4. 配置映射关系时如果是字符串类型要添加上length属性,因为在hibernate中可以设置如果表不存在自动出创建表,只用指定了字符串类型的字段要有长度。
5. hibernate底层已经将mysql的自动提交事务功能关闭了,所以每次进行数据库操作的时候要手动提交事务。
6. 面试题:get与load方法的区别:                1)Get直接得到了一个持久化对象,他就是立即查询操作。Load它得到的是一个持久化类的代理类对象(子类对象),它采用了一种延迟策略来查询数据。
2)get方法查询时,如果不存在返回的是null;load方法查询时,如果不存在会报错。
7.持久化对象状态:有三种:
1)瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。
2)持久态:在hibernate session管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。
3)托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。
对于托管态对象,它发生改变时hibernate不能检测到。
8. 面试题:cascade与inverse区别?Cascade是用来完成级联操作的。Inverse他只有在双向关联下有作用,他来指定由那一方来维护外键,只能在一的一方的映射文件的set标签中设置(set标签的一个属性),默认值是false,如果将值改为true表示一的一方不在维护外键,但是这个时候如果存储的是一的这一方的对象,多的一方也会存储到表中,但是外键列是null。解决方法是将多的一方中对应的一的那一方的对象进行手动赋值,然后再存储一的一方的对象,这时外键就已经关联上了。
9. JAVA成员变量和静态变量的区别:
        1,成员变量所属于对象。所以也称为实例变量。静态变量所属于类。所以也称为类变量
        2,成员变量存在于堆内存中。静态变量存在于方法区中。
        3,成员变量随着对象创建而存在。随着对象被回收而消失。静态变量随着类的加载而存在。随着类的消失而消失。
        4.成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。
10. 面试题:hibernate与jdbc设置查询语句中的参数的起始数字是不相同的,jdbc是从1开始,hibernate是从0开始。
11. 面试题:Where与having的区别:where先筛选条件,WHERE 子句不能包含聚集函数,因为试图用聚集函数判断那些行输入给聚集运算是没有意义的,having是先分组在筛选。
12. 面试:内连接与外连接的区别?内连接查询到的是交集,只能将有关联的数据查询出来。左外连接查询到的是左表的全部以及右表中与之关联的数据,左表中有而右表中没有与之对应的数据项时,右表中对应的字段显示为null。
13. 内连接与外连接语法?内连接:1)显示内连接:...inner join...on 关联条件 ;2)隐式内连接:使用“逗号”将表分开,使用WHERE来消除笛卡尔积。外连接(以左外连接为例):left outer join...on 关联条件 ,其中outer可以省略。
14. Hibernate多表查询语法:
1. 内连接:1)显示内连接使用的是inner join with 关联条件,显示内连接返回的是一个数组,数组中存储的是两个表对应的实体对象.2)隐式内连接使用“.”运算符类进行关联,隐式内连接只返回一个对象,就是from后面的那个表的对象。在实际开发中内连接不使用。
2. 迫切内连接:使用的是inner join fetch...语法(其中inner join fetch是一个整体),使用迫切内连接结果可能出现重复,所以要使用distinct来去重复,得到的结果是from后面的那个对象不是数组,fetch不能与单独条件的with一起使用,要使用where关键字。
3. 外连接:使用left outer join语法,返回的是一个数组,装的是所关联的两个表的对象。
4. 迫切左外连接:使用left outer join fetch语法,返回的是from后面的那个对象,同样fetch不能与单独条件的with一起使用,添条件时使用where关键字。
5. 内连接与迫切内连接,外连接与迫切外连接的区别其实就是,内连接与外连接返回的是两个对象,存到了一个数组中,迫切内连接与迫切左外连接返回的只是from后面的那个对象。
15. 面试:什么是事务?事务的四个特性(ACID),隔离级别,不考虑隔离级别会引发的问题,Mysql与Oracle的默认隔离级别?
16. 面试:N+1问题。
17. 什么是Hibernate:hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。
18. 使用getCurrentSession获取的与线程绑定的session对象,在事务关闭时,session对象也会close,简单说,就不需要手动close。
Hibernate检索策略分为两种:        1)类级别检索:类级别检索是直接检索某一类的数据,查询的整张表中的数据。类级别检索策略分为立即检索与延迟检索,默认是延迟检索,类级别的检索策略可以通过<class>元素的lazy属性来设置 ,默认值是true。这里的延迟检索与立即检索针对的是load方法,get方法使用的都是立即检索。Get方法具体怎么执行的看第17条。
2)关联级别检索:查询到某个对象,获得其关联的对象或属性,这种称为关联级别检索。主要配置两个属性:Fetch主要描述的是SQL语句的格式(例如是多条(SELECT),子查询(SUBSELECT),多表联查(JOIN)),
Lazy 控制SQL语句何时发送。
19. Hibernate使用配置文件开发时要使用两个配置文件:1 )类名.hbm.xml这个文件配置映射信息,使用配置文件设置映射关系时,每个属性都要配置,都要映射到表中的 字段。使用注解开发时可以省略对普通属性的设置。2)Hibernate.cfg.xml核心配置文件,配置数据库信息,以及一些常亮信息,还有引入映射文件。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2