CRM客户关系管理系统开发第八讲——实现客户管理模块中修改客户的功能

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/yerenyuan_pku/article/details/101936114

修改客户列表页面上的链接地址

在这里插入图片描述

编写CustomerAction的edit方法

首先,我们要在CustomerAction类中编写一个编辑客户的方法。在该方法中,根据客户ID查询出来客户对象后,需要跳转到客户编辑页面(edit.jsp),回显客户对象中携带的数据。问题的关键点是怎么把Customer对象(数据)带到客户编辑页面(edit.jsp)上呢?将Customer对象传递到客户编辑页面(edit.jsp)一共有两种方式,下面我会分别介绍它们。

  • 第一种方式:手动将Customer对象压栈。
    在这里插入图片描述
    如果我们使用的是这种方式,那么怎么回显Customer对象中携带的数据呢?可以在客户编辑页面(edit.jsp)中使用Struts2里面的标签回显数据,例如,在edit.jsp页面中回显客户名称时,可以写成下面这样:
    在这里插入图片描述
  • 第二种方式:其实这个Customer对象就是模型驱动使用的对象,而模型驱动使用的对象默认就在栈顶(这是因为Action类的引用就是栈顶元素),所以,我们可以利用这一特性来回显数据。
    如果我们使用的是这种方式,那么CustomerAction类中的edit方法就要写成下面这个样子:
    在这里插入图片描述
    此时,怎么回显Customer对象中携带的数据呢?可以在客户编辑页面(edit.jsp)中使用Struts2里面的标签回显数据,例如,在edit.jsp页面中回显客户名称时,可以写成下面这样:
    在这里插入图片描述
    还非得写成这样不可,如果你要是写成下面这样:
    在这里插入图片描述
    那么,在客户编辑页面(edit.jsp)中回显Customer对象中携带的数据时,客户名称直接显示的就是model.cust_name。
    在这里插入图片描述
    从上图中可以发现OGNL表达式作为字符串显示出来了,而没有作为OGNL表达式来执行。要解决这个问题,就要使用%号来强制解析OGNL表达式了(即使用%号让表单标签里面的值作为OGNL表达式执行)。

这里,我会使用上面讲述的第二种方式,在客户编辑页面(edit.jsp)中回显数据。编写好CustomerAction的edit方法之后,我们还得在Struts2配置文件中(即struts.xml)对CustomerAction进行如下的配置,即点击修改超链接之后,要跳转到客户编辑页面(edit.jsp)中。
在这里插入图片描述

在客户编辑页面中回显数据

首先,复制一份客户添加页面(add.jsp),将其重命名为edit.jsp,以此作为客户编辑页面。然后,将普通的form表单改为Struts2框架里面的<s:form>表单,而且还要使用上面讲述的第二种方式,在客户编辑页面(edit.jsp)中回显数据。
在这里插入图片描述
接着,还要回显客户级别、客户信息来源以及客户所属行业这三个下拉列表中的数据。如何回显呢?需要修改我们的JS代码成下面这个样子。
在这里插入图片描述
温馨提示:在JS代码里面是不能使用Struts2标签的,但可以使用EL表达式获取值栈中的数据。

编写代码实现修改客户的功能

在客户编辑页面(edit.jsp)中回显了客户的数据后,接下来,我们就要正式编写代码实现修改客户的功能了。

修改客户编辑页面中的提交路径

首先,修改客户编辑页面中表单的提交路径。
在这里插入图片描述
然后,在要提交的表单中添加如下的两个隐藏字段:

  • 第一个隐藏字段,即客户ID,在将表单提交到服务端时,也要将表单中隐藏的客户ID给传递过去。

    <s:hidden name="cust_id" value="%{model.cust_id}"></s:hidden>
    
  • 第二个隐藏字段,即上传的图片的路径,为什么需要它呢?如果现在修改客户的时候,没有再次选择图片,那么该客户还用他原来的图片(如果他有的话),如果我们在这儿给他新选择了一个图片,那么得把他原来的图片删了,然后上传新的图片。

    <s:hidden name="cust_image" value="%{model.cust_image}"></s:hidden>
    

编写web层

首先,我们要在CustomerAction类中编写一个修改客户的方法。在修改客户时,我们必须要判断上传文件项是否已经选择了,如果选择了,那么就删除原有文件,上传新的文件,如果没有选择,那么使用原有文件即可。
在这里插入图片描述
然后,我们还得在Struts2配置文件中(即struts.xml)对CustomerAction进行如下的配置,即修改客户成功后,直接重定向到客户列表展示页面中。
在这里插入图片描述

编写service层

首先,在CustomerService接口中添加一个修改客户的方法声明,如下:

package com.meimeixia.crm.service;

import org.hibernate.criterion.DetachedCriteria;

import com.meimeixia.crm.domain.Customer;
import com.meimeixia.crm.domain.PageBean;

/**
 * 客户管理类的业务层的接口
 * @author liayun
 *
 */
public interface CustomerService {

	void save(Customer customer);

	PageBean<Customer> fingByPage(DetachedCriteria detachedCriteria, Integer currentPage, Integer pageSize);

	Customer findById(Long cust_id);

	void delete(Customer customer);

	void update(Customer customer);

}

然后,在以上接口的一个实现类(CustomerServiceImpl.java)中实现修改客户的方法。

package com.meimeixia.crm.service.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.transaction.annotation.Transactional;

import com.meimeixia.crm.dao.CustomerDao;
import com.meimeixia.crm.domain.Customer;
import com.meimeixia.crm.domain.PageBean;
import com.meimeixia.crm.service.CustomerService;

/**
 * 客户管理的业务层的实现类
 * @author liayun
 *
 */
@Transactional
public class CustomerServiceImpl implements CustomerService {
	
	//注入客户的dao
	private CustomerDao customerDao;

	public void setCustomerDao(CustomerDao customerDao) {
		this.customerDao = customerDao;
	}

	//业务层保存客户的方法
	@Override
	public void save(Customer customer) {
		customerDao.save(customer);
	}

	//业务层分页查询客户的方法
	@Override
	public PageBean<Customer> fingByPage(DetachedCriteria detachedCriteria, Integer currentPage, Integer pageSize) {
		PageBean<Customer> pageBean = new PageBean<Customer>();
		//封装当前的页数
		pageBean.setCurrentPage(currentPage);
		//封装每页显示的记录数
		pageBean.setPageSize(pageSize);
		//封装总记录数
		//得调用dao来查询
		Integer totalCount = customerDao.findCount(detachedCriteria);
		pageBean.setTotalCount(totalCount);
		//封装总页数
		Double tc = totalCount.doubleValue();
		Double num = Math.ceil(tc / pageSize);
		pageBean.setTotalPage(num.intValue());
		//封装每页显示的数据集合
		Integer begin = (currentPage - 1) * pageSize;//计算从哪儿开始?
		List<Customer> list = customerDao.findByPage(detachedCriteria, begin, pageSize);
		pageBean.setList(list);
		return pageBean;
	}

	//业务层根据id去查询客户的方法
	@Override
	public Customer findById(Long cust_id) {
		return customerDao.findById(cust_id);
	}

	//业务层删除客户的方法
	@Override
	public void delete(Customer customer) {
		customerDao.delete(customer);
	}

	//业务层修改客户的方法
	@Override
	public void update(Customer customer) {
		customerDao.update(customer);
	}
	
}

编写dao层

首先,在CustomerDao接口中添加一个修改客户的方法声明,如下:

package com.meimeixia.crm.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

import com.meimeixia.crm.domain.Customer;

/**
 * 客户管理的dao的接口
 * @author liayun
 *
 */
public interface CustomerDao {

	void save(Customer customer);

	Integer findCount(DetachedCriteria detachedCriteria);

	List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize);

	Customer findById(Long cust_id);

	void delete(Customer customer);

	void update(Customer customer);

}

然后,在以上接口的一个实现类(CustomerDaoImpl.java)中实现修改客户的方法。

package com.meimeixia.crm.dao.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.meimeixia.crm.dao.CustomerDao;
import com.meimeixia.crm.domain.Customer;

/**
 * 客户管理的dao的实现类
 * @author liayun
 *
 */
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

	//dao中保存客户的方法
	@Override
	public void save(Customer customer) {
		this.getHibernateTemplate().save(customer);
	}
	
	//dao中带条件去统计个数的方法
	@Override
	public Integer findCount(DetachedCriteria detachedCriteria) {
		//还得给DetachedCriteria对象设置条件,你要没设置条件,就查询所有了。
		//因为我们现在要发送类似select count(*) from xxx where [条件]这样的sql语句
		detachedCriteria.setProjection(Projections.rowCount());
		List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
		if (list.size() > 0) {
			return list.get(0).intValue();
		}
		return null;
	}

	//dao中分页查询客户的方法
	@Override
	public List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		//在查询之前,先要把DetachedCriteria对象中的count那个地方给清空掉,去掉之后,默认就是查所有
		detachedCriteria.setProjection(null);
		return (List<Customer>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
	}

	//dao中根据id去查询客户的方法
	@Override
	public Customer findById(Long cust_id) {
		return this.getHibernateTemplate().get(Customer.class, cust_id);
	}

	//dao中删除客户的方法
	@Override
	public void delete(Customer customer) {
		this.getHibernateTemplate().delete(customer);
	}

	//dao中修改客户的方法
	@Override
	public void update(Customer customer) {
		this.getHibernateTemplate().update(customer);
	}

}

至此,客户管理模块中修改客户的功能,我们就已经实现了,至于测试的话,我就不再这里测试了(偷懒了),反正是好使的!

猜你喜欢

转载自blog.csdn.net/yerenyuan_pku/article/details/101936114