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

联系人信息查询
1 点击 联系人信息查询 超链接时候,到查询页面

(1)在查询页面中,选择客户,根据客户进行查询

下拉表框显示所有客户  可以根据所属的客户进行联系人查询 

2 在查询页面中,输入值,提交表单到action,查询数据库得到结果  

使用字符串拼接方式:

使用离线对象实现查询

字符串拼接方式代码:

界面效果:

两个model关系:

点击超接连首先进入查询页面 需要做的工作就是把所有客户都查询出来,并且带查询页面上使用下拉表框进行显示 

用户输入内容或者不输入 点击查询之后  把数据(没有数据将来查询时  就是查询全部信息)提交给action  使用模型驱动完成数据的封装

action中调用service  service调用dao中的方法

最终daoimpl中的方法:

 最后把符合条件的数据保存在域对象中,在联系人列表页面进行显示

思考一下:上面画红线的地方需要注意什么?

需要避免出现no-session的问题,因为底层(使用hibernateTemplate是对session对象的封装)的得到的session是与本地线程绑定的session 所以在daoimpl调用完成之后session就自动关闭了,即使不手动关闭。又因为hibernate的优化机制,即“懒加载机制” ,数据在真正使用到的时候才会再去查数据库,这就造成在session已经关闭情况下,上面的页面需要显示的数据需要再次查询数据库时,报错no-session  解决办法2种(详见 SSH总结一)

第一种  推荐:在web.xml中配置一个session延迟关闭的过虑器

第二种  可能影响性能  在对象关系映射文件中  配置lazy="false"  属性  不让它懒加载  这个值默认是true 不配置的情况下  默认懒加载  这样就会在查询的时候,直接把关联的对象也查询出来了,将来在数据显示的时候就不需要再次查数据库了

创建离线对象方式代码:

其他过程不变,使用离线对象,改变daoimpl中的代码

 1 public List<LinkMan> finCondition(LinkMan linkMan) {
 2         /*
 3         List<Object> p=new ArrayList<Object>();
 4         //先使用构造hql语句的方式 进行查询
 5         String hql="from LinkMan where 1=1";
 6         //判断输入的值是否为空
 7         if(linkMan.getLkmName()!=null&&!"".equals(linkMan.getLkmName())){
 8             //注意  hql语句中都是对实体类进行操作  表名变为对应的实体类名  字段名变为对应属性名
 9             //即 LinkMan不是数据库中的表名  而是将要操作的表对应的实体类的名称  包括下面的lkmName也是实体类中的属性名称
10             hql += " and lkmName=?";
11             p.add(linkMan.getLkmName());
12         }
13         //判断id是否选择  如果选择了id就不为空  并且大于0 因为在表单提交的时候如果用户没选择  那么就将id的值默认为0
14         //这里关键是怎么拼接字符串  因为id的属性值是保存在linkman中的customer对象中的cid属性中
15         if(linkMan.getCustomer().getCid()!=null&&linkMan.getCustomer().getCid()>0){
16             //如果不为空  那么就进行字符串的拼接
17             hql += " and customer.cid=?";
18             p.add(linkMan.getCustomer().getCid());
19         }
20         return (List<LinkMan>) this.getHibernateTemplate().find(hql,p.toArray());
21         */
22         //第二种方式  使用离线对象 完成多条件查询:
23         //表示对LinkMan实体类进行操作
24         DetachedCriteria criteria=DetachedCriteria.forClass(LinkMan.class);
25         //增加条件限制
26         if(linkMan.getLkmName()!=null&&!"".equals(linkMan.getLkmName())){
27             criteria.add(Restrictions.eq("lkmName",linkMan.getLkmName()));//第一个参数 是实体类中的属性名  不要认为是表中的字段名  因为hibernate操作全部都是对实体类进行的操作
28         }
29         if(linkMan.getCustomer().getCid()!=null&&linkMan.getCustomer().getCid()>0){
30             //这里customer.cid 表示linkman实体类中的customer属性  customer中cid属性   和拼接hql语句时一样
31             criteria.add(Restrictions.eq("customer.cid",linkMan.getCustomer().getCid()));
32         }
33         return (List<LinkMan>) this.getHibernateTemplate().findByCriteria(criteria);
34     }

无论是拼接还是离线方式 ,主要就是注意第二个限制条件的书写方式

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

添加数据字典表

1 什么是数据字典表
(1)存储基础数据
- 比如添加客户信息时候,添加客户级别,这个级别不能随便输入,把客户级别存到数据字典表里面,添加时候,查询数据字典所有记录显示
(2)码表

2 数据字典表 和 客户表之间关系是 一对多关系

(1)数据字典表是一

(2)客户表示 多

- 一个级别里面可以有多个客户,一个客户只能属于一个级别

(3)让数据字典表对应一个实体类

- 配置数据字典表和客户表关系

2 配置数据字典和客户映射关系

(1)需求:根据客户查询级别,没有根据级别查询客户的需求

(2)只需要在客户实体类表示所属级别

(3)在映射文件中表示关系

- 在客户映射文件中,配置所属级别就可以了

3 功能分析

(1)到添加客户页面中,在下拉列表中把所有级别显示

(2)点击保存,把数据添加到数据库里面

- 使用模型驱动封装得到值

然后调用方法执行保存

部分代码:

客户级别实体类Dict

 1 package org.model;
 2
 3 public class Dict {
 4     //因为需求是通过客户得到级别   没有得到某个级别的所有客户的需求  所以这里不需要配置set集合  来表示某个级别的所有客户
 5     private String did;
 6     //主键生成策略就不能是native类型了
 7     //native是根据使用的数据库  设置值   mysql数据库 自动增长  并且id的类型是int类型
 8     private String dname;
 9     public String getDid() {
10         return did;
11     }
12     public void setDid(String did) {
13         this.did = did;
14     }
15     public String getDname() {
16         return dname;
17     }
18     public void setDname(String dname) {
19         this.dname = dname;
20     }
21
22 }

对应映射配置文件

客户实体类Customer

对应映射配置文件

点击超链接进入add.jsp页面 ,在该页面需要把所有级别信息显示出来供用户进行选择,所以需要在跳转的action中先把信息检索出来并且保存在域对象中

add.jsp

运行效果:

输入信息并且选择客户的级别点击保存,使用模型驱动完成数据的封装工作,然后调用方法进行保存

添加完成之后,跳到列表页面进行显示

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

主键生成策略

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

统计分析

1 系统中可能有复杂查询操作,使用hibernate不能实现,需要调用普通sql语句实现
(1)在dao里面使用hibernate模板,使用hibernate模板调用普通sql

(2)根据客户级别统计

- 只使用客户表统计效果,客户级别显示的是id值而不是名称,但是希望显示客户级别名称

客户表和数据字典表多表查询操作

2 统计查询之后,返回多条记录,每条记录里面有两个值,返回list集合,

但是list里面泛型没有实体类封装,让list里面的泛型是map集合

根据客户来源统计

(1) 调用底层sql
(2) 把返回结果转换map结构
(3) 在页面中显示list集合内容(list里面每部分是map结构)

根据客户级别统计

1 在dao里面调用普通sql语句

返回list集合,list集合中每部分是数组形式

让list每部分是对象形式

但是返回结果只有两个值,没有对应对象

把list中每部分转换成map集合

2 在jsp中得到list集合内容

(1)遍历list集合,得到list里面多个map集合,根据map的key得到value值

代码实现(根据客户来源进行统计):

点击超链接进入action中,进行数据检索

action调用service,service调用dao中的方法进行查询,都比较简单

值得注意的是dao实现类中的方法

 1     //根据客户来源查询
 2     public List findCountSource() {
 3         //因为查询的操作中牵涉分组  统计 以及连接查询  所以需要创建SQLQuery对象使用sql语句来完成操作
 4         //1.得到session对象
 5         Session session=this.getSessionFactory().getCurrentSession();
 6         //2创建SQLquery对象  里边写的是sql语句
 7         SQLQuery sqlQuery=session.createSQLQuery("select count(*) num,custSource from t_customer group by custSource");
 8         //该对象list方法查询之后返回的是一个数组集合的形式
 9         //为了取值方便 下面把他转换成map类型
10         sqlQuery.setResultTransformer(Transformers.aliasToBean(HashMap.class));
11         //调用方法得到的集合就是一个map结构
12         List list=sqlQuery.list();
13         return list;
14     }

显示页面

底层sql查询出来的num,custSource都作为了map中的key,多条记录,每条记录都是下面这种形式

代码实现(根据客户级别进行统计):

思路和上边的一样  dao实现类中的方法

 1     //根据级别查询
 2     public List findCountLevel() {
 3         //1.得到session对象
 4         Session session=this.getSessionFactory().getCurrentSession();
 5         //2创建SQLquery对象
 6         SQLQuery sqlQuery=session.createSQLQuery("select count(*) num,d.dname from t_customer as c,t_dict as d where c.custLevel=d.did group by d.did");
 7         //该对象list方法查询之后返回的是一个数组集合的形式
 8         //为了取值方便 下面把他转换成map类型
 9         sqlQuery.setResultTransformer(Transformers.aliasToBean(HashMap.class));
10         //调用方法得到的集合就是一个map结构
11         List list=sqlQuery.list();
12         return list;
13     }

显示页面

key值

底层sql查询出来的字段名称,都作为map中的key值

时间: 2025-01-17 04:38:32

SSH框架整合截图总结(三)的相关文章

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

分页相关属性 --------------------------------------------------------------- 分页思路表单提交(只需传递当前页的值) ->action action 调用 service中的方法[action需要完成的操作就是把表单提交的currentPage(当前页的值)传递(调用action中注入的service对象的方法)给servicePageBean pageBean=customerService.listpage(currentPag

SSH框架整合截图(二)

客户拜访管理 1 什么是客户拜访 (1)客户:与公司有业务往来的 (2)用户:可以使用系统的人 2 用户和客户关系 (1)用户和客户之间是拜访的关系 (2)用户 和 客户 是 多对多关系 ** 一个用户可以拜访多个客户,一个客户可以被多个用户拜访 (3)多对多建表: - 创建第三张表,使用外键维护关系 3 多对多配置 (1)缺陷:第三张表只有两个字段(两个id值) 4 把多对多拆分成两个一对多实现(1)用户.客户.拜访(2)用户 和 拜访是一对多 (3)客户和拜访是一对多 配置用户和客户关系 (

dwr与ssh框架整合教程

(1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJAX技术的网站.它可以允许 在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.它包含两个主要的部 分:允许JavaScript从WEB服务器上一 个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站 开发人员轻松地利用获取的数

【课程分享】jQuery2.0应用开发:SSH框架整合jQuery2.0实战OA办公自动化(VSS、operamasks-UI框架)

我的qq是2059055336,对这个课程有兴趣的可以加我qq联系. 课程下载地址:链接:http://pan.baidu.com/share/link?shareid=395438909&uk=3611155194 密码:mlvl 课程下载地址:http://www.kuaipan.cn/file/id_192202874577496484.htm?source=1 一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景 jQuery 2.0 正式版发布,不在支持 IE 6/7/8

SSH框架整合过程总结

---------------------siwuxie095 SSH 框架整合过程总结 (一)导入相关 jar 包(共 41 个) 1.导入 Spring 的核心 jar 包和日志相关的 jar 包(6 个) Commons Logging 下载链接: http://commons.apache.org/proper/commons-logging/download_logging.cgi LOG4J 下载链接: https://www.apache.org/dist/logging/log4

SSH框架整合

ssh框架整合步骤如下 提示:myeclipse环境.工程环境.tomcat环境的jdk保持一致 1.新建一个工程,把工程的编码为utf-8 2.把jsp的编码形式改成utf-8 3.把jar包放入到lib下 4.建立三个src folder src 存放源代码 config 存放配置文件 hibernate 存放hibernate的配置文件 spring 存放spring的配置文件 struts 存放struts的配置文件 struts.xml test 存放单元测试 5.在src下建立包 c

jQuery2.0应用开发:SSH框架整合jQuery2.0实战OA办公自动化(VSS、operamasks-UI框架)

我的qq是2059055336,对这个课程有兴趣的可以加我qq联系. 一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景 jQuery 2.0 正式版发布,不在支持 IE 6/7/8 浏览器.因此该版本更小.更快.       为了提高现代社会人们的办公效率,满足人们自动化办公的需要,我们开发了这套稳定可靠.操作方便.安全有效的MyOffice系统     1.2.课程内容简介       本课程全面详细的介绍jQuery2.0以及OA办公自动化系统的开发流程.其中重点详细的介绍

用myecplise自带工具实现对SSH框架整合

之前搭建ssh环境的,都是先要引入一堆jar包,一下没整明白就会出现jar包冲突的问题,在这里,我们使用myecplise自带的工具,实现jar包的依赖和配置文件的生成. 我们用的到的工具是:myecplise2014 第一步:新建一个web project 第一步:添加项目所依赖的jar包 1.添加struts所依赖的jar包 完成后,在src目录下可以发现struts.xml 2.添加spring所依赖的jar包 完成后,可以在src目录下发现applicationContext.xml 3

ssh框架整合实例

MyEclipse开发SSH(Struts+Spring+Hibernate)入门 Spring技术   2009-02-03 15:59   阅读328   评论0 字号: 大大  中中  小小 2008-01-31 01:31 (本文参考自 oksonic 的"Struts+Spring+Hibernate练习(完整)") 源码下载:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703 注意:这个实例要加入