保存堆栈
What
值栈就是为了帮助我们存储数据的,但我们使用的时候直接拿出来就行,不用管里面存放了什么东西,他相当于一个小型的数据库存储中心,
另外
处了只用值栈之外我们还可以使用session缓冲区和模型驱动来实现action和页面之间的传递数据,但是数据多的时候就会造成混乱,这个时候我们使用值栈来进行 统一管理
How is 值栈
值栈可以为我们每个请求提供一个公共的数据存储服务,每当有请求访问时,struts2都会为每个请求创建一个新的值栈,所以值栈和请求是一一对应的,不同请求有不同的值栈,正因为这样所以才保证了访问数据时线程安全
在我们值栈中有一个非常重要的特点就是ActionContext是一个容器对象,他里面保存着action所有的信息
例如:request的parameters请求中的参数
请求的属性,request.attribute数据类型为map。
如何进行存储的?
valueStack是存放在actioncontext容器中的,我们可以在jsp页面中通过Struts标签进行访问数据,valueStack是栈对,他满足栈的特点,所以从栈顶向栈低进行寻找对象,
其实实现这种机制是通过OGNL(Object-Graph Navigation ),他可以存储对象的任意属性,调用对象的方法,遍历整个对象的结构图,struts1中比较常用的是EL表达式(用于简写jsp页面的),而struts2默认的是使用OGNl表达式,他结合了struts2的标签库,完成了页面数据绑定,在OGNL附近都是使用的map形式的,所以我们的值栈也大多数使用的是map形式的,
当我们页面上传递一个集合的时候,我们需要通过一个条件来取出集合中的属性,则使用到了#符号
模型驱动对象
模型驱动对象是用来接收参数的
在Struts中接受参数的类型有模型驱动对象,对象驱动,属性驱动,
属性驱动
form表单进行提交
则是在我们jsp页面上有很多属性,而在我们action中也有很多属性,这些属性都是与我们jsp页面中属性是一直的,他们使用set属性来进行接收,例如我们的构造函数一样
模型驱动的
我们使用模型驱动的时候是实现了一个接口 implements ModelDriven,然后通过他的实现方法来封装我们所有的Product参数,这样我们就可以使用了,他的好处就是对于实体里面所有的参数进行统一的处理
其实模型驱动也是运用了OGNl表达式,因为我们最初我们获得前台页面传过来值的时候,都是通过”对象.属性”,而这次我们直接使用属性就可以,原因是因为OGNI在搜索对象的时候直接把对象压入了栈低,所以我们我只需要从上往下进行查找属性就可以了,这也是引入驱动模型的好处
实体类当成页面数据收集对象
getHibernateTemplate
由于Hibernate是对jdbc的封装,所以getHibernateTemplate其实上就是封装后的一些方法让我们去调用,就可以直接去与我们的数据库打交道,他就是有点类似于我们的在BS或者CS中的sqlhelp层一样,用于执行数据库操作的方法
他总共有这几种功能
1,void delete (Object entity)删除制定持久化实体
2 deleteAll(collection entites)删除集合内部持久化类实例
3find(string queryString)根据hql查询字符串返回实体集合
findByNamedQuery(String queryName):根据命名查询返回实例集合
get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例
save(Object entity):保存新的实例
saveOrUpdate(Object entity):根据实例状态,选择保存或者更新
update(Object entity):更新实例的状态,要求entity是持久状态
setMaxResults(int maxResults):设置分页的大小