datename=”#cost.startTime”format=”yyyy/MM/ddHH:
mm:
ss”/>
9Action组件的相关使用
1>Action组件的原理
客户发出action请求给struts控制器—>struts控制器会创建ValueStack对
象—>struts控制器根据请求创建Action对象,并将Action压入ValueStack
的root栈顶(线程安全,不用考虑并发问题)—>struts控制器将请求相关的
Request,Session对象放入到ValueStack的Context区域—>struts控制器执
行Action对象的execute方法处理请求—>struts控制器根据execute结果
生成响应信息输出—>请求处理完毕,销毁ValueStack和Action对象。
2>Action属性注入
在配置中,为Action对象的属性指定初始值,使用格式如下
属性值
注意:
type类型如果你想再见跳转的页面需要Action的数据的话要用
dispatcher,如果用redirect时候,将所有的数据删除了,jsp页面中
也不能获取到应有的值了。
10Result组件的相关使用
1>作用:
负责生成响应试图内容。
Struts2框架提供了多种不同的Result组件类型,用于做不同形式响应,例
如json数据响应,流数据响应,jsp页面响应等。
2>Result组件相关配置---声明定义
3>Result组件相关配置---使用定义
4>掌握经常使用的Result组件
--Jsp试图
--dispatcher:
以转发方式调用Jsp页面
--redirect:
以重定向方式调用Jsp页面
Jsp页面
--Action试图
--chain:
以转发方式调用下一个Action
--redirectAction:
以重定向方式调用下一个Action
相同命名空间的调用:
请求名
跨命名空间的调用:
请求名
/命名空间名
5>JSONResult组件
主要负责Action的属性以JSON字符串格式输出,JSONResult的使用步骤:
---引入struts2-json-plugin.jar。
---将元素的extends继承”json-default”;
---使用配置
---只返回Action中一个属性:
属性名
---返回Action中多个属性:
属性名1,属性名2,属性名3
---返回Action中的所以属性值
11拦截器组件
Struts2组件提供了大量的拦截器组件,如果不能满足开发者需求,可以自行
定义,一般利用拦截器封装一些通用性的功能,例如请求参数给action赋值,文件上传,权限检查等;
1>拦截器的作用:
拦截器可以在Action和Result组件调用之前执行,也可以在其之后执行。
2>拦截器的原理:
---所有的拦截器组件实现类都必须实现接口Interceptor此接口必须实现三个方法init,destory,intercept。
或者抽象类AbstractInterceptor此抽象类只需要实现intercept即可,
ai.invoke()拦截器如果只有一个拦截器执行完这个方法后,会返回给试图,
如果多个拦截器,它只有执行完所有的拦截器,才会返回给试图
3>所有拦截器都具有下列注册配置
也可以在使用拦截器的时候给它设置参数,就在的下面用
12Struts表单标签
界面封装了界面显示逻辑,用于简化JSP,以后需要时候再进行查找标签库
例如:
二,Hibernate
1Hibernate框架作用,
1>优点:
----Hibernate框架主要用于对数据库的操作,使用该框架可以简化数据操作代码,这样程序员可以将更多经历放在业务编写上。
----免费开源。
----完全面向对象。
2>缺点:
----性能比较差,尤其是批处理方面,大数据量开发的时候,最好使用JDBC
----HQL的功能相对薄弱
3>本质:
对JDBC技术的封装。
4>原有JDBC技术的缺点:
----需要编写大量复杂的SQL语句。
----需要做大量的对象和记录的转换。
----数据库移植时,需要修改SQL语句。
例如:
分页语句,不同数据库写法不同
5>Hibernate设计原理
----Hibernate框架是一款ORM工具,基于ORM设计思想开发出来的
----ORM:
对象关系映射。
Mapping映射
Object:
对象------Relation关系
对象:
Java中Entity实体类。
关系:
关系型数据库。
思想:
将程序中的对象与关系型数据库中的数据自动映射转化。
-----这样在查询时候,可以自动将记录封装成对象返回。
在更新和插入时候,
可以将对象自动写入数据表中,像中间得SQL+JDBC的操作一样,完全封装在工具的底层。
基于这种思想的框架还有HibernateIbatis等
2Hibernate主要结构
1>Hibernate主要包括以下几个部分构成。
----java实体类(n个):
用于封装数据表记录的Java对象类型。
例如:
Person.java。
----实体类名.hbm.xml(n个):
映射描述文件,里面定义了实体类与数据库之
间的对应关系。
例如:
Person.hbm.xml。
----hibernate.cfg.xml(1个):
主配置文件,里面主要定义链接数据库的参数。
----Hibernate主要API:
在使用时候,需要使用Hibernate提供的API,他们将
SQL+JDBC封装起来了
2>hibernate开发需要导入的jar包
----Hibernate3.jar和hibernate-core-3.3.1.GA.jar(hibernate核心jar包)
----antlr.jar(AnotherToolforLanuageRecognition可构造语言识别器,
将HQL解析为SQL的需要)
----commons-collections.jar(包含了一些Apache开发的集合类,功能比
java.util.*强大)
----dom4j.jar(越来越多的java软件都在使用dom4j来操作xml,Hibernate也
不例外)
----javassist.jar(代码生成工具,Hibernate用它在运行时扩展java类实现,同
cglib包)
----jta.jar(标准的java事务处理接口)
----cglib(cglib字节码解释器)
----slf4-api.jar和slf4j-log4j12.jar(hibernate使用的日志系统)
----asm.jar(ASM字节码库,如果使用”cglib”则必要)
----asm-attrs.jar(ASM字节码库,如果使用”cglib”则必要)
----ehcache.jar(EHCache缓存,如果想使用时候加入)
----log4j.jar(必须加入的)
3>hibernate常用的API
----Configuration:
加载hibernate核心的配置文件hibernate.cfg.xml
----SessionFactory:
hibernate中重量级对象(重量级:
消耗资源最多,功能最强
大的对象),主要是用于创建创建Hibernate中Session对象
控制对数据库的链接,建议一个项目中,最好只有一个
SessionFactory,利用单例模式即可;
-----Session:
hibernate中所有的增删改查操作都是依赖session对象实现其功
能的,代表java程序与数据库的一次链接,是最常用的工具对象。
-----Transaction事务提交:
对表的改变必须依赖程序员开启事务,并且提交
事务
4>Hibernate使用步骤
----创建工程,引入hibernate的jar包。
----在src下追加hibernate.cfg.xml主配置。
----根据数据表创建实体类Entity。
----编辑实体类和数据库表的映射文件hbm.xml。
----利用HibernateAPI实现增删改查操作。
如果想自动生成表则需要以下代码:
//代表控制台输出的sql语句,我们能看到。
3Hibernate映射类型
在***.hbm.xml中,描述属性和字段之间映射的时候,可以使用type属性指定映射类型
1>Hibernate映射类型主要有:
---整数类型:
byte,short,integer,long。
---浮点数类型:
float,double。
---字符串类型:
string。
---事件日期类型:
date,time,timestamp。
---boolean类型:
yes_no(将true/false转换成Y/N),
true_false(将true/false转换成T/F)。
---其他:
big_decimal,big_integer,clob,blob。
4主键的生成策略
1>在***.hbm.xml中,可以主键指定生成方式。
----uuid:
每次插入新的数据时候,hibernate自动生成不重复的32位字符串,hibernate独有的。
----sequence:
采用指定序列生成,适用于Oracle这样需要使用序列自增的DB。
用oracle创建序列:
----identity:
采用数据库自增长机制,适用于mysql和sqlserver数据库。
----native:
根据方言自动选择identity或者sequence生成方式。
----increment:
首先获取最大主键值将其+1,在执行插入操作,适用各种DB。
----assigned:
忽略主键生成,需要程序员自己指定主键值。
2>中配置方法:
5Hibernate框架的基本特性
1>一级缓存(Session级别的,默认开启):
每次创建一个Session时会为这个session
对象提供一个缓冲区,用于缓存Session查询出来的单个对象,当使用Session
再次查询同一个对象时候,就从缓存里面直接查出,避免对数据库进行二次
查询,从而提高效率。
2>一级缓存区管理办法:
evict()---驱逐,clear()—清理等方法,
flush()将session缓存中的数据跟数据库同步。
6Hibernate对象的持久性
Hibernate是一个持久层框架,实体对象可以具有下面三种状态:
----临时态:
采用new方式构建的对象,执行完毕后被垃圾回收掉。
session.save()可将临时态变为持久态;
----持久态:
1>采用Session对象查询出来的,受到了Session对象所管理的对象,
例如:
调用load,get,save,update方法之后的对象,
2>处于持久态的对象特点:
---对象变为持久态对象之后,在调用对象的set方法后,当事务提交
mit()/执行session.flush()方法时,对象的数据状态可以
更新到数据库。
---对象不能被垃圾回收器回收。
---对象存储在一级缓存里面,由Session负责管理。
----托管态/游离态:
脱离Session管理的对象,
例如:
用到了session.evict()/session.clear();
session.update()可将游离态变为持久态。
注意:
我们用saveOrUpdate()方法代替save()和update()。
7Hibernate的延迟加载
Hibernate提供一些方法,利用这些方法所返回的对象,并没有立刻发生sql语句加载数据库中的数据,而是在调用对象的getter方法时候才触发数据库的查询,加载数据记录。
例如session.load()就是延迟加载的一个方法。
-----使用延迟加载方法时需要注意:
要避免出现LazyInitializationException:
couldnotinitializeproxy–notSession
原因是关闭过早了。
-----解析get()和load()的区别:
1>相同点:
都是根据主键Id当条件查询某个对象。
2>不同点:
---load()是采用延迟加载机制,
get采用立即加载机制。
---load()没有符合的记录会抛出异常ObjectNotFoundException,
get()会返回null,而不会抛出异常。
---load()返回的是动态生成一个类型(动态代理),
get()则返回是实体类型。
8Hibernate延迟加载实现原理--------cglib动态代理。
---Hibernate采用了cglib.jar和asm.jar两个开发包,实现了动态新类和动态编
译成class,这是hibernate内部临时生成一个暂时替代的查找对象。
9update()方法
1>先查询出要修改的对象,再调用update()方法
好处:
稳定,不出现空值。
2>直接创建对象,添加id,修改属性
坏处:
容易出现空值。
10Hibernate关系映射的作用
1>一对多关系映射(单向):
(例如:
一个部门有多个员工)由一的一端来维护关联关系,外键字段由一
的一端创建,多的一端不维护关联关系。
----需求:
由一方对象查询n方记录,可以采取一对多的关系映射。
----首先在一方实体实体类中添加集合属性Set。
----然后在一方的***.hbm.xml中定义一对多关系映射的描述。
----使用时,通过一方对象的关系属性,获取n方数据
----语法:
2>多对一关系映射(双向):
(例如:
多个员工可以查询他们同属一个公司的信息)
-----需求:
由多方对象查询一方对象的信息。
-----在多方实体类中添加属性,该属性为一方类型
(例如:
privateDeptdept其中Dept是一方的class类)。
-----在多方的***.hbm.xml中,添加属性描述信息。
column=”关联条件的外键字段”
class=”一的一端的类名路径”/>
-----使用时,通过多方对象的关联属性获取相关一方的记录信息。
11关联操作
1>关联查询:
----默认情况下,关联属性的加载采用了延迟加载机制,