修改联系人列表页面上的链接地址
编写LinkManAction的edit方法
首先,我们要在LinkManAction类中编写一个跳转到联系人编辑页面的方法。在该方法中,我们不仅要查询出某个联系人,而且还要查询出所有客户。查询出来联系人对象和代表所有客户的List<Customer>
集合之后,需要跳转到联系人编辑页面(edit.jsp),回显联系人对象中携带的数据,其中,联系人编辑页面(edit.jsp)中的所属客户下拉列表中的数据就来源于List<Customer>
集合。现在问题的关键点是怎么把联系人对象和List<Customer>
集合带到联系人编辑页面(edit.jsp)中去呢?将List<Customer>
集合传递到联系人编辑页面(edit.jsp)中,其实很简单,手动将List<Customer>
集合压栈即可。
将联系人对象传递到联系人编辑页面(edit.jsp)中一共有两种方式,下面我会分别介绍它们。
- 第一种方式:手动将联系人对象压栈。
如果我们使用的是这种方式,那么怎么回显联系人对象中携带的数据呢?可以在联系人编辑页面(edit.jsp)中使用Struts2里面的标签回显数据,例如,在edit.jsp页面中回显联系人名称时,可以写成下面这样:
- 第二种方式:其实这个联系人对象就是模型驱动使用的对象,而模型驱动使用的对象默认就在栈顶(这是因为Action类的引用就是栈顶元素),所以,我们可以利用这一特性来回显数据。如果我们使用的是这种方式,那么LinkManAction类中的edit方法就要写成下面这个样子:
此时,怎么回显联系人对象中携带的数据呢?可以在联系人编辑页面(edit.jsp)中使用Struts2里面的标签回显数据,例如,在edit.jsp页面中回显联系人名称时,可以写成下面这样:
这里,我会使用上面讲述的第一种方式,在联系人编辑页面(edit.jsp)中回显数据。编写好LinkManAction的edit方法之后,我们还得在Struts2配置文件中(即struts.xml)对LinkManAction进行如下的配置,即点击修改超链接之后,要跳转到联系人编辑页面(edit.jsp)中。
在联系人编辑页面中回显数据
复制一份联系人添加页面(add.jsp),将其重命名为edit.jsp,以此作为联系人编辑页面。因为在上一讲中,我们就已经对add.jsp页面做了一些修改,比如将普通的form表单改为Struts2框架里面的<s:form>
表单,然后将里面所有的文本输入框都改成了Struts2框架里面的标签,所以,edit.jsp页面无需做任何修改,便可以很方便地进行数据回显。
编写代码实现修改联系人的功能
在联系人编辑页面(edit.jsp)中回显了客户的数据后,接下来,我们就要正式编写代码实现修改联系人的功能了。
修改联系人编辑页面中的提交路径
首先,修改联系人编辑页面中表单的提交路径。
然后,在要提交的表单中添加如下的一个隐藏字段,即联系人ID,在将表单提交到服务端时,也要将表单中隐藏的联系人ID给传递过去。
编写web层
首先,我们要在LinkManAction类中编写一个修改联系人的方法。
然后,我们还得在Struts2配置文件中(即struts.xml)对LinkManAction进行如下的配置,即修改联系人成功后,直接重定向到联系人列表展示页面中。
编写service层
首先,在LinkManService接口中添加一个修改联系人的方法声明,如下:
package com.meimeixia.crm.service;
import org.hibernate.criterion.DetachedCriteria;
import com.meimeixia.crm.domain.LinkMan;
import com.meimeixia.crm.domain.PageBean;
/**
* 联系人的业务层的接口
* @author liayun
*
*/
public interface LinkManService {
PageBean<LinkMan> findAll(DetachedCriteria detachedCriteria, Integer currentPage, Integer pageSize);
void save(LinkMan linkMan);
LinkMan findById(Long lkm_id);
void update(LinkMan linkMan);
void delete(LinkMan linkMan);
}
然后,在以上接口的一个实现类(LinkManServiceImpl.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.LinkManDao;
import com.meimeixia.crm.domain.LinkMan;
import com.meimeixia.crm.domain.PageBean;
import com.meimeixia.crm.service.LinkManService;
/**
* 联系人的业务层的实现类
* @author liayun
*
*/
@Transactional
public class LinkManServiceImpl implements LinkManService {
//注入dao
private LinkManDao linkManDao;
public void setLinkManDao(LinkManDao linkManDao) {
this.linkManDao = linkManDao;
}
//业务层来分页查询联系人的方法
@Override
public PageBean<LinkMan> findAll(DetachedCriteria detachedCriteria, Integer currentPage, Integer pageSize) {
PageBean<LinkMan> pageBean = new PageBean<LinkMan>();
//设置当前页数
pageBean.setCurrentPage(currentPage);
//设置每页显示的记录数
pageBean.setPageSize(pageSize);
//设置总记录数
Integer totalCount = linkManDao.findCount(detachedCriteria);
pageBean.setTotalCount(totalCount);
//设置总页数
double tc = totalCount;
Double num = Math.ceil(tc / pageSize);
pageBean.setTotalPage(num.intValue());
//设置每页显示数据的集合
Integer begin = (currentPage - 1) * pageSize;
List<LinkMan> list = linkManDao.findByPage(detachedCriteria, begin, pageSize);
pageBean.setList(list);
return pageBean;
}
//业务层保存联系人的方法
@Override
public void save(LinkMan linkMan) {
linkManDao.save(linkMan);
}
//业务层根据id去查询联系人的方法
@Override
public LinkMan findById(Long lkm_id) {
return linkManDao.findById(lkm_id);
}
//业务层修改联系人的方法
@Override
public void update(LinkMan linkMan) {
linkManDao.update(linkMan);
}
//业务层删除联系人的方法
@Override
public void delete(LinkMan linkMan) {
linkManDao.delete(linkMan);
}
}
编写dao层
首先,在LinkManDao接口中添加一个修改联系人的方法声明,如下:
package com.meimeixia.crm.dao;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import com.meimeixia.crm.domain.LinkMan;
/**
* 联系人的dao的接口
* @author liayun
*
*/
public interface LinkManDao {
Integer findCount(DetachedCriteria detachedCriteria);
List<LinkMan> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize);
void save(LinkMan linkMan);
LinkMan findById(Long lkm_id);
void update(LinkMan linkMan);
void delete(LinkMan linkMan);
}
然后,在以上接口的一个实现类(LinkManDaoImpl.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.LinkManDao;
import com.meimeixia.crm.domain.LinkMan;
/**
* 联系人的dao的实现类
* @author liayun
*
*/
public class LinkManDaoImpl extends HibernateDaoSupport implements LinkManDao {
//dao中统计个数的方法
@Override
public Integer findCount(DetachedCriteria detachedCriteria) {
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<LinkMan> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
//首先要把count(*)语句给清空掉
detachedCriteria.setProjection(null);
List<LinkMan> list = (List<LinkMan>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
return list;
}
//dao中保存联系人的方法
@Override
public void save(LinkMan linkMan) {
this.getHibernateTemplate().save(linkMan);
}
//dao中根据id去查询联系人的方法
@Override
public LinkMan findById(Long lkm_id) {
return this.getHibernateTemplate().get(LinkMan.class, lkm_id);
}
//dao中修改联系人的方法
@Override
public void update(LinkMan linkMan) {
this.getHibernateTemplate().update(linkMan);
}
//dao中删除联系人的方法
@Override
public void delete(LinkMan linkMan) {
this.getHibernateTemplate().delete(linkMan);
}
}
至此,联系人管理模块中修改联系人的功能,我们就已经实现了,至于测试的话,我就不再这里测试了(偷懒了),反正是好使的!