码迷,mamicode.com
首页 > 其他好文 > 详细

SSH框架整合截图总结(一)

时间:2017-03-30 17:10:06      阅读:391      评论:0      收藏:0      [点我收藏+]

标签:问题   框架   对象关系映射   cond   复制   控制   开始   ade   bean   

分页相关属性

技术分享

技术分享

 

技术分享

 

技术分享

 

 技术分享

技术分享

技术分享

---------------------------------------------------------------

 

分页思路
表单提交(只需传递当前页的值) ->action

action 调用 service中的方法
action需要完成的操作就是把表单提交的currentPage(当前页的值)传递(调用action中注入的service对象的方法)给service
PageBean pageBean=customerService.listpage(currentPage);并且返回一个list集合 该集合保存的就是处理之后的分页记录集合

技术分享

 

service 调用 dao中的方法
[service需要根据currentPage的值,将来页面需要的所有信息 封装进PageBean对象中 当然有的属性值是需要通过已知的信息 调用dao中的方法得到,或者计算得到]

技术分享

 

dao中就是编写 service在封装pagebean对象时 用到的方法

 查询总的记录数

技术分享

根据已知信息,把用户需要的集合查出来,返回给service

技术分享

 

 --------------------------------------------------------------------------------

jsp页面中

技术分享

action中:

技术分享

 

技术分享

 

 -------------------------------------------------------------------------------------

 模型驱动  获取表单的值 ,表单中的name属性需要和实体类中的属性名称一样 提交之后 在action中就可以使用提交后的对象

技术分享

------------------------------------------------------------------------------------------------------------

条件查询,在action中判断输入的内容是否为空,不为空 则调用条件查询的方法(action调用service service 调dao中的方法)  为空  就调用方法返回表中所有的记录

输入的内容不为空   调用方法演示:

    //条件查询  输入的内容不为空
    public List<Customer> findCondition(Customer customer) {
        // TODO Auto-generated method stub
        //第一种方式:
//        SessionFactory sessionFactory=this.getHibernateTemplate().getSessionFactory();//得到sessionfactory对象
//        Session session=sessionFactory.getCurrentSession();//得到session 这里的session对象和web阶段的HttpSession不是同一个概念
//        Query query=session.createQuery("from Customer where custName like ?");
//        query.setParameter(0,customer.getCustName());
//        List<Customer> list=query.list();
        
        
        //第二种方式: 单一条件查询的时候 这种比较简单  但是多条件查询的时候  使用第三中方式最简单
//        List<Customer> list=(List<Customer>) this.getHibernateTemplate().find("from Customer where custName like ?","%"+customer.getCustName()+"%");
        
        
        //第三种方式:
        //创建离线对象,表示对那个实体类进行操作
        DetachedCriteria criteria=DetachedCriteria.forClass(Customer.class);
        //设置对实体类中的那个属性进行条件查询   如果对多个字段进行条件查询  那么只需要调用add方法即可 
        criteria.add(Restrictions.like("custName","%"+customer.getCustName()+"%"));
        //调用模板中的方法  得到集合
        List<Customer> list=(List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
        return list;
    }    

 ---------------------------------------------------------------------------

对象关系映射配置 (客户和联系人)一对多配置 

客户实体类(一方)中添加set集合表示所有的联系人  联系人实体类(多方)中添加一个客户对象 表示所属的客户

基本配置首先完成  之后两个实体类相互表示 建立关系

建立关系基本结构:

一方映射配置(配置实体类中set属性):

技术分享

多方映射配置(配置实体类中的一方的对象属性):

 技术分享

 

linkman

技术分享

linkman.hbm.xml

技术分享

customer

技术分享

customer.hbm.xml

技术分享

 

-------------------------------------------------------------------------------------

文件上传 

上传要求

技术分享

action配置

技术分享

执行上传时注意导入的包

技术分享

上传操作的完整代码:

技术分享

技术分享

需要注意的问题:在上传的时候  struts中存在上传的默认大小  struts常量配置文件路径

技术分享

上传常量值(默认)大小

技术分享

 

 如果上传的文件超过了默认值 会报404错误

技术分享

在struts.xml中修改默认上传值

技术分享

这样就能够上传20M以下的文件了  当然没有根本解决上传时的问题  因为即使设定了默认值 但是永远存在上传的文件大于设定的默认值的情况

根本解决,就是设置一个input视图,提示用户不能上传规定大小之外的文件

技术分享

这样就提高了系统的容错能力

--------------------------------------------------------

struts和Hibernate中的jar冲突

技术分享

在做ssh整合的时候  注意,需要删掉重复的javassist.jar

-------------------------------------------------------------------

no-session问题

问题的出现:

表中存在外键

技术分享

对应的实体类

技术分享

运行页面:

技术分享

 运行之后:页面能够正常显示外键和基本信息

技术分享

如果现在页面显示的不是外键的名称,而是外键对应的类的记录中的其他信息

技术分享

显示的页面

技术分享

运行之后出现错误:

技术分享

 造成错误的原因:

 

虽然现在使用的是hibernateTemplate 但是底层的实现机制还是通过sessiofactory对象先创建
sesssion对象,然后调用session中的方法进行操作,因为使用模板时,得到的是与本地线程线程绑定了session,所以当dao调用结束之后,创建的线程自然就结束了,即使不手动关闭,session也会自动关闭,这就造成了当再次查询数据库的时候,出现session关闭的情况,即造成了no-session异常
造成这种异常的根本原因是在session已经关闭的情况下 ,再次对数据库进行了操作linkman.customer.cusName
第一次查询的时候,之后查询出linkman的基本信息以及它所关联表的外键,并没有查询外键对应的表的信息
当在jsp页面执行该语句的时候,会根据第一次查询出的外键的信息查询customer表,查询该外键在customer表中对应的记录中的cusName字段,显示在页面,而此时的问题就是session已经关闭了技术分享

(1)no session解决:方式一(推荐使用)
- 让session操作之后不会马上关闭,在action操作之后进行关闭
- 封装实现方式:让session延迟关闭

(2)具体使用
封装过滤器,只需要配置封装的过滤器就可以了
配置到struts2过滤器前面

技术分享

核心过滤器配置:

技术分享

注意:配置的session延迟关闭的过滤器需要在struts核心过滤器之前

技术分享

打开上边这个类,复制类的全路径到filter-class中

技术分享

 运行之后 问题解决

技术分享

过滤器的执行顺序与在web.xml中配置的代码顺序有关系
写在前边的代码会先执行 在解决no-session问题的时候,所配置的过滤器代码应该写在核心控制类过滤器FilterDispatcher之前

(1)no session解决:方式二

为什么第一次不把所有数据查出来呢?

因为Hibernate框架为了优化或者提高性能,使用了懒加载的机制,lazy="true" 默认的值为true 即在配置文件中不写的话  默认是

懒加载的方式(只查询基本数据,而包含的外键数据在真正使用的时候,才会重新查数据库,在一定情况下能够减少查询的次数,提高系统运行的效率,因为有的时候只需要得到基本的数据),那么问题就出现了,对于查询的数据包含外键,就是上面的情况,查询linkman表时,只查出了基本信息,而没有把外键所在的表customer中的数据一并查出来,而在真正使用的时候才重新开始查询数据库,而我们使用的hibernateTemplate模板底层使用的是与本地线程绑定的session,即在调用dao方法查询linkman表中基本数据之后,因为线程的关闭,而session自动也进行了关闭,所以这两个优化机制在一块时就容易发生问题。

解决方法:只需要在查询的目标对象的一方的映射配置文件中配置禁止懒加载 lazy="false"  保证在查该实体类对应的表的数据的时候,把基本数据,以及外键包含的数据一块查出来,就是禁用懒加载 (如果搞不清楚双方都配置懒加载也没问题)

 技术分享

使用该方式可能会增加不必要的查询语句,系统的性能可能会降低,但在本例中,这种查询是允许的,因为我们正好需要外键对应的数据来用于显示,如果只显示基本信息,那么就没有必要查了

----------------------------------------------------------------------------------------------------------

过滤器配置格式:

技术分享

核心过滤器的作用

技术分享

------------------------------------------------------------------------------

action操作过程:
访问action的路径进入action,然后调用方法执行功能,最后action中有返回的结果
根据返回的结果到达指定视图进行显示,进行显示之后,就称为action操作之后,这时action操作结束

-----------------------------------------------------------------------------------

jstl标签--循环与判断的使用

技术分享

记得在文档开头引入该标签

技术分享

不需要导入jstl.jar文件,myeclipse创建项目的时候已经默认提供了这个jar,并且已经加载进项目中了

技术分享

-----------------------------------------------------------------------------------------------

struts.xml中配置重定向(表单提交,数据更新之后,重定向到某个页面)

技术分享

在执行修改操作之后,为什么不直接返回到list.jsp页面呢,因为数据已经更新,所以需要重新加载数据一次,例如点击联系人列表的超链接时,数据是通过查询数据库,然后再到list.jsp页面 呈现数据

这样能够保证 修改之后返回到的视图中的数据都是最新的数据,因为重新查询了一次数据库  包括添加联系人成功之后也需要使用重定向再次访问action检索数据  然后返回list视图

就是第一个action操作完成之后,紧接着重定向另一个action中,重新检索数据,然后在返回到视图页面

 

--------------------------------------------------------------------------------------------------

Inverse属性配置

先演示一个错误

原始配置:

技术分享

技术分享

即现在没有配置inverse属性的值,默认是false,即双方都不放弃表的维护工作,

技术分享

联系人列表

技术分享

客户列表:

技术分享

进行如下操作:

把百度的名称修改为百度1

修改操作能够成功

技术分享

看控制台的打印:

技术分享

做了两次更新操作,而且还把修改的客户对应的联系人的外键字段 置为null

联系人列表

技术分享

为什么会出现这种情况呢,双向维护造成的这种情况的发生  解决这个问题 就需要让某一方放弃表的维护工作,一般都是让一方放弃,所以在customer实体类的映射配置文件中声明inverse=“true”  它的默认值是false

技术分享

现在我们再次修改一条记录

修改之气前 联系人列表 以及客户列表

技术分享

 

技术分享

 

 修改之后 客户列表 和联系人列表

技术分享

 

技术分享

 

-------------------------------------------------------------

级联删除

1.先不配置级联删除 

(0)如果不配置cascade属性值时候,直接删除客户,默认效果

技术分享

把联系人外键设置null,删除客户

2.配置级联删除 cascade="delete"  因为现在是删客户  所以在客户的映射配置文件中配置该属性

技术分享

删除客户表的一条记录 对应这个客户的联系人表中的记录也被删除了

控制台打印

技术分享

先把联系人表中对应的外键置为null(直接删 无法删除 存在外键约束),然后删除联系人  删除客户

 

但是如果这样配置  (表示客户放弃表的维护工作) 同时不配置级联删除

技术分享

删除客户的时候 就会报错

技术分享

原因:既然已经放弃维护表的工作,删除的时候自然只能删除自己的数据,而没有能力对其他表进行操作,同时删除的时候存在外键的约束(联系人表中的外键依赖于客户表的主键),所以就会出现异常,因为只有先把外键的值  置为null 才能够实现删除

解决办法:配置放弃维护的同时  也配置了级联删除

技术分享

这时 就能够实现正常的删除 即两个表中的数据都被删除  虽然没有能力(因为放弃了维护工作)在删除之前把外键置为null  但是因为配置了级联删除操作(反正都要删除,那么就先把影响删除的外键所对应记录删掉吧) 因此,删除的时候就不需要先把外键置为null,再进行删除操作,而是先删除了联系人表中的记录,最后删除了客户表中的记录,避免了外键约束的问题

控制台打印:

技术分享

 

SSH框架整合截图总结(一)

标签:问题   框架   对象关系映射   cond   复制   控制   开始   ade   bean   

原文地址:http://www.cnblogs.com/Joke-Jay/p/6622754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!