crm开发(基于ssh)(2)
今天内容
1 新增客户
2 客户列表
3 修改客户
4 删除客户
5 分页显示客户列表
Hibernate模板里面的方法

1 新增客户
配置
<mapping resource="cn/itcast/entity/Customer.hbm.xml" />
创建userAction和CustomerAction,然后在struts.xml中进行配置。
创建实体类,User和Customer,并创建配置文件,在数据库中建表。
使用模型驱动的条件:模型驱动的属性(javabean)名字和表单输入项name属性值要一样。
出现如下异常

这样改变即可。
import org.springframework.transaction.annotation.Transactional; import cn.itcast.dao.CustomerDao;
import cn.itcast.entity.Customer; @Transactional
public class CustomerService {
表单提交方式是post提交,不需要进行处理,自动处理乱码。
客户列表功能
1 查询所有的客户显示到页面的列表里面
(1)查询所有客户,在dao里面调用Hibernate模板里面的find方法
(2)在action得到返回所有客户list集合,把list集合传递到页面中显示
-把list放到域对象
-把list放到值栈
2 具体实现
(1)在dao使用hibernate模板的find方法
//客户列表功能
@SuppressWarnings("all")
public List<Customer> findAll() {
return (List<Customer>) this.getHibernateTemplate().find("from Customer");
}
在action中
// 3 客户添加列表的方法
public String list() {
List<Customer> list = customerService.findAll();
//放到域对象
ServletActionContext.getRequest().setAttribute("list", list);
return "list";
}
使用值栈的方式
//定义list变量
private List<Customer> list;
//生成变量的list方法
public List<Customer> getList(){
return list;
} // 3 客户添加列表的方法
public String list() {
//List<Customer> list = customerService.findAll();
//放到域对象
//ServletActionContext.getRequest().setAttribute("list", list); //返回list放到值栈里面
list = customerService.findAll();
//上面操作就是把数据放到值栈
//运行成功没有报错
return "list";
}
使用struts2标签+ognl表达式
<s:iterator value="list" var="cus">
<TR
style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
<TD><s:property value="#cus.custName" /></TD>
<TD><s:property value="#cus.custLevel" /></TD>
<TD><s:property value="#cus.custSource" /></TD>
<TD><s:property value="#cus.custPhone" /></TD>
<TD><s:property value="#cus.custMobile" /></TD> </TR>
</s:iterator>
而用EL表达式的性能比较低。
删除客户功能
1 在每条记录后面删除超链接,点击超链接删除这条记录
<a href="${pageContext.request.contextPath}/customer_delete.action?cid=${customer.cid}">删除</a>
2 创建action的删除方法
(1)得到cid值
<result name="delete" type="redirectAction">customer_list</result>
//根据id查询
public Customer findOne(int cid) {
return this.getHibernateTemplate().get(Customer.class, cid);
} //删除功能
public void delete(Customer c) {
this.getHibernateTemplate().delete(c);
}
(1)有的浏览器会出问题,如两次提交。
添加判断是否为空的语句就行了。
Customer c = customerService.findOne(cid);
//判断根据id查询对象是否为空
if(c != null){
//调用方法删除
customerService.delete(c);
//级联,分页
}
(2)在修改页面表单里面,修改内容,点击保存,真正修改数据库
<input type="hidden" name="custId" value="${customer.cid }"/>
分页相关知识点
1 在mysql里面使用分页sql语句:
(1)使用关键字limit
select * from t_customer limit 0,3
第一个参数是开始位置,第二个参数是每页显示几条记录
2 分页相关属性
(1)当前页
(2)每页显示记录数
(3)总记录数
(4)总页数
-总记录数 除以 每页显示记录数
-比如10条记录,每页显示5条,有2页
-比如10条记录,每页显示9条,有两页
-总记录除以每页显示记录数,如果能够整除,结果是相除结果,如果不能整除,结果为整数结果+1
int a = 10;
int b = 9;
a/b = 1
1+1 = 2;
(5)开始位置

(6)每页记录的list集合
3 hibernate分页操作
(1)hql
(2)qbc
//封装分页的数据到pagebean里面
public PageBean listpage(Integer currentPage) {
//创建PageBean对象
PageBean pageBean = new PageBean();
//当前页
pageBean.setCurrentPage(currentPage);
//总记录数
int totalCount = customerDao.findCount();
pageBean.setTotalCount(totalCount); //每页显示记录数
int pageSize = 3; //总页数
//总记录数除以每页显示记录数
//能够整除
int totalPage = 0;
if(totalCount % pageSize == 0){//整除
totalPage = totalCount / pageSize;
}else{
totalPage = totalCount / pageSize + 1;
}
pageBean.setTotalPage(totalPage); //开始位置
int begin = (currentPage - 1) * pageSize; //每页记录的list集合
List<Customer> list = customerDao.findPage(begin,pageSize); pageBean.setList(list); return pageBean;
}
在页面中显示分页数据,判断前一页和后一页
<c:if test="${pageBean.currentPage!=1 }">
[<A href="${pageContext.request.contextPath}/customer_listpage.action?currentPage=${pageBean.currentPage-1 }">前一页</A>]
</c:if>
<c:if test="${pageBean.currentPage!=pageBean.totalPage }">
[<A href="${pageContext.request.contextPath}/customer_listpage.action?currentPage=${pageBean.currentPage+1 }">后一页</A>]
</c:if>
分页基本信息
共[<B>${pageBean.totalCount}</B>]条记录,[<B>${pageBean.totalPage}</B>]页
,当前第[<b>${pageBean.currentPage}</b>]页
2 在dao进行分页操作
(1)查询记录数
//查询记录数
public int findCount() {
//调用hibernateTemplate里面的find方法实现
List<Object> list = (List<Object>) this.getHibernateTemplate().find("select count(*) from Customer");
//从list中得到值
if(list != null && list.size() != 0){
Object obj = list.get(0);
//变成int
Long lobj = (Long)obj;
int count = lobj.intValue();
return count;
}
return 0;
}
(2)分页查询
有两种方式
第一种 在hibernate模板里面使用底层hibernate代码实现(不用,但是需要知道)。
第二种 使用离线对象和Hibernate模板的方法

第二种方式是对第一种方式的封装
//分页查询操作
public List<Customer> findPage(int begin, int pageSize) {
//第一种 使用Hibernate底层代码实现(了解)
//得到sessionFactory
//SessionFactory sessionFactory = this.getHibernateTemplate().getSessionFactory();
//得到session对象
//Session session = sessionFactory.getCurrentSession();
//设置分页信息
/*Query query = session.createQuery("from Customer");
query.setFirstResult(begin);
query.setMaxResults(pageSize);
List<Customer> list = query.list();*/
//hibernate本身有一定缺陷,无法做复杂查询,
//这种情况是在复杂查询的时候会用到 //第二种 使用离线对象和hibernateTemplate的方法实现
//1 创建离线对象,设置对哪个实体类进行操作
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class); //调用hibernateTemplate的方法实现
//第一个参数是离线对象
//第二个参数是开始位置
//第三个参数是每页记录数
//用find的方法无法实现分页
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria,begin,pageSize);
return list;
}
条件查询
//条件查询
public List<Customer> findCondition(Customer customer) {
//第一种方式:
/*SessionFactory sessionFactory = this.getHibernateTemplate().getSessionFactory();
//得到session对象
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from Customer where custName=?");
query.setParameter(0, "%"+customer.getCustName()+"%"); List<Customer> list = query.list();
return list;*/ //第二种方式:调用hibernateTemplate的find方法实现
List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer where custName like ?", "%"+customer.getCustName()+"%");
return list;
}
第三种方式
(1)使用离线对象,调用hibernateTemplate里面的方法
//第三种方式
// 1 创建离线对象,设置对哪个实体类进行操作
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
// 2 设置对实体类哪个属性
criteria.add(Restrictions.like("custName", "%"+customer.getCustName()+"%"));
// 3 调用hibernateTemplate里面的方法得到list集合
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
return list;
5 web阶段多条件组合查询,拼接sql语句实现
String sql = "select * from user where 2=2";
List list = new ArrayList();
if(username != null){
sql += "and username=?";
}
if(password != null){
sql += "and password=?";
}
crm开发(基于ssh)(2)的更多相关文章
- 基于ssh框架的在线考试系统开发的质量属性
我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...
- 实现基于SSH的门票管理系统开发的质量属性
我要做的是一个基于SSH的门票售卖系统,在系统中常见的质量属性有:可用性.可修改性.性能.安全性.易用性. 可用性方面: 可用性是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系统崩溃情况 ...
- 基于SSH框架的在线考勤系统开发的质量属性
我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...
- 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现
基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...
- 基于SSH框架的网上书店系统开发的质量属性
基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...
- 基于SSH框架的学生公寓管理系统的质量属性
系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...
- 基于ssh反向代理实现的远程协助
本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码. 可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下) web开启该功能后,ssh才能登录 ...
- 【Ansible】 基于SSH的远程管理工具
[Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...
- 基于SSH的高校网上选课系统的质量属性的实现
我对于基于SSH的高校网上选课系统的质量属性的实现是从可用性.性能.安全性.可维护性.易用性五个方面进行的实现. 可用性方面: 实现方式:(1)当系统试图超出限制范围来进行课程查询或选课时必须进行错误 ...
- 基于SSH的网上图书商城-JavaWeb项目-有源码
开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 技术:Java:JSP:JDBC,struts2,spring,hibernate数据库: mysqlweb ...
随机推荐
- canvas基本使用
1.什么是CANVAS canvas是html5新增的画布元素,可以通过javascript来在画布上绘制图形,图标以及任何视觉性的图像. 2.canvas的用途 替代flash,做各种动态效果,做小 ...
- php 字母和数字验证码
//验证码 <?php //实现简单的验证码 //session_start session_start(); //画布 $image = imagecreatetruecolor(100, 3 ...
- html常见兼容性问题
html常见兼容性问题? 1.双边距BUG float引起的 使用display 2.3像素问题 使用float引起的 使用dislpay:inline -3px 3.超链接hover 点击后失效 ...
- junit test 报错,java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=esopCreateTest],
java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=esopCreateTest], {ExactMatc ...
- 查找文件路径find
查找文件路径find 1.按照文件名查找 (1)find / -name httpd.conf #在根目录下查找文件httpd.conf,表示在整个硬盘查找 (2)find ...
- pandas 如何判断指定列是否(全部)为NaN(空值)
判断某列是否有NaN df['$open'].isnull().any() # 判断open这一列列是否有 NaN 判断某列是否全部为NaN df['$open'].isnull().all() # ...
- 安装指定版本的Ionic或Cordova(转载)
安装ionic 及 cordova npm install -g cordova ionic 更新命令 npm update -g cordova ionic 安装特定版本 npm install - ...
- redis的数据类型与应用场景(二)
1. 如何学习 redis有好多数据类型,有这么多数据类型,我们不可能每个都记得完完全全.但是我们必须知道它有哪些数据类型,每个数据类型是怎样的,有什么作用.redis的每一个数据类型都有一大堆命令, ...
- Window mysql 安装配置
1.下载 安装包 mysql-noinstall--winx64.zip 2.解压缩zip包 安装路径 C:\Program Files\MySQL\mysql--winx64 3.配置环境变量 添加 ...
- APP数据埋点分类方式
1.数据埋点的重要性 在现实工作中,数据的整体流程为:数据生产-数据采集-数据处理-数据分析和挖掘-数据可视化,其中,数据采集是很重要的一个环节,数据采集得全不全.对不对,直接决定数据广度和质 ...