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 ...
随机推荐
- linux必学
memcache zookeeper activemq
- img标签使用onload进行src更改时出现的内存溢出问题
最近在开发时需要在img标签加载完成后修改src属性,使用了onload方法. 但是在方法体中最后没有把onload事件指向null, 导致了循环调用onload方法,CPU占用一直居高不下,最后只要 ...
- git 添加远程仓库后无法push
push的时候提示fatal: refusing to merge unrelated histories 假如我们的源是origin,分支是master,那么我们 需要这样写git pull o ...
- 10.Query an Array-官方文档摘录
1.插入 db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", " ...
- 【我的Android进阶之旅】如何在浏览器上使用Octotree插件树形地展示Github项目代码?
前言 最近有个同事看到我打开Github项目时,浏览器上的展示效果是树形的,于是他问我这个是什么浏览器插件,我告诉他是Octotree插件.现在我就来介绍介绍这款Octotree插件. 效果对比 1. ...
- Python高级教程-sorted
Python中的排序算法 排序是程序中经常用到的算法.通常规定,对于两个元素x和y,如果认为x<y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法 ...
- 0503-Hystrix保护应用-feign的hystrix支持
一.概述 1.1.基础[示例一] 如果Hystrix在类路径上并且feign.hystrix.enabled = true,Feign将用断路器包装所有方法.还可以返回com.netflix.hyst ...
- Canvas:橡皮筋线条绘制
Canvas:橡皮筋线条绘制 效果演示 实现要点 事件监听 [说明]: 在Canvas中检测鼠标事件是非常简单的,可以在canvas中添加一个事件监听器,当事件发生时,浏览器就会调用这个监听器. 我们 ...
- class_options
一.class_option :stylesheet, :type => :boolean, :default => "true", :description => ...
- javascript Date对象 之 date初始化
javascript Date对象 --> 日期初始化: 总结: 日期初始化的 方式: 1. new Date( yyyy, M(+), d(+), h(+), m(+), s(+) ); 2. ...