跳转到联系人添加页面
发布我们的项目到Tomcat服务器并启动,然后访问该项目的首页,点击新增联系人超链接之后要能跳转到联系人添加页面。
而且,在跳转到联系人添加页面之后,所属客户下拉列表中的数据要能立马加载出来。那么问题来了,所属客户下拉列表中的数据从何而来呢?传统的方式是在Action的方法里面编写代码,从客户表中查询到那些需要的数据,然后在联系人添加页面上用下拉列表给展示出来,注意这是同步查询。除了这种办法之外,还有没有其他办法呢?其实还有一种办法,我们可以异步去查询客户表中的数据,就是在联系人添加页面跳转过来以后(即现在需要加载add.jsp这个页面),在加载这个页面时,就异步去查询客户表中的数据,然后给它加载到所属客户的下拉列表上。但在这里,我会采用同步查询这种方式,后一种方式前面我也讲过了。那么,如何才能点击新增联系人超链接之后跳转到我们想要的联系人添加页面呢?
在左侧的菜单页面(menu.jsp)中修改提交路径
编写LinkManAction中的saveUI方法
首先,在LinkManAction类中编写一个如下的saveUI方法。
package com.meimeixia.crm.web.action;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import com.meimeixia.crm.domain.Customer;
import com.meimeixia.crm.domain.LinkMan;
import com.meimeixia.crm.domain.PageBean;
import com.meimeixia.crm.service.CustomerService;
import com.meimeixia.crm.service.LinkManService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 联系人的Action类
* @author liayun
*
*/
public class LinkManAction extends ActionSupport implements ModelDriven<LinkMan> {
//模型驱动使用的对象
private LinkMan linkMan = new LinkMan();
@Override
public LinkMan getModel() {
return linkMan;
}
//注入service
private LinkManService linkManService;
public void setLinkManService(LinkManService linkManService) {
this.linkManService = linkManService;
}
//注入客户管理的service
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
//接收如下分页参数:
private Integer currentPage = 1;
private Integer pageSize = 3;
public void setCurrentPage(Integer currentPage) {
if (currentPage == null) {
currentPage = 1;
}
this.currentPage = currentPage;
}
public void setPageSize(Integer pageSize) {
if (pageSize == null) {
pageSize = 3;
}
this.pageSize = pageSize;
}
/*
* 查询联系人列表的方法
*/
public String findAll() {
//创建离线条件查询对象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(LinkMan.class);
//设置条件,有条件就设置条件,没有条件就直接调用业务层
//...
//调用业务层
PageBean<LinkMan> pageBean = linkManService.findAll(detachedCriteria, currentPage, pageSize);
ActionContext.getContext().getValueStack().push(pageBean);
return "findAll";
}
/*
* 跳转到添加页面的方法
*/
public String saveUI() {
//查询所有客户(同步来进行查询的,在一跳转的时候就需要把客户的信息查询出来)
List<Customer> list = customerService.findAll();
//将List集合保存到值栈当中
ActionContext.getContext().getValueStack().set("list", list);
return "saveUI";
}
}
从以上LinkManAction类的代码中,我们可以看出在该类中注入了客户管理模块的service,所以,得修改该类在Spring里面的配置(即注入customerService)。
然后,我们还得在Struts2配置文件中(即struts.xml)对LinkManAction进行如下的配置,即配置页面的跳转。
编写service层
首先,在CustomerService接口中添加一个查询所有客户的方法声明,如下:
package com.meimeixia.crm.service;
import java.util.List;
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);
List<Customer> findAll();
}
然后,在以上接口的一个实现类(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);
}
//业务层查询所有客户的方法
@Override
public List<Customer> findAll() {
return customerDao.findAll();
}
}
编写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);
List<Customer> findAll();
}
然后,在以上接口的一个实现类(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);
}
//dao中查询所有客户的方法
@Override
public List<Customer> findAll() {
return (List<Customer>) this.getHibernateTemplate().find("from Customer");
}
}
修改联系人添加页面
首先,将普通的form表单改为Struts2框架里面的<s:form>
表单,然后将联系人添加页面里面所有的文本输入框都改成Struts2框架里面的标签,因为到时候可以很方便地进行数据回显,尤其是在做修改联系人的时候。
此时,发布我们的项目到Tomcat服务器并启动,然后访问该项目的首页,点击新增联系人超链接之后就能跳转到联系人添加页面了。
编写代码实现保存联系人的功能
现在终于要写代码实现保存联系人的功能了,真是不容易啊!
编写联系人添加页面中的表单提交路径
编写LinkManAction中的save方法
在LinkManAction类中编写如下的一个保存联系人的方法(save方法)。
然后,我们还得在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);
}
然后,在以上接口的一个实现类(LinkManServiceImpl.java)中去实现保存联系人的方法。
package com.meimeixia.crm.service.impl;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
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);
}
}
添加事务
这里一定得记得要在业务层中的实现类(LinkManServiceImpl)上添加@Transactional注解。
编写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);
}
然后,在以上接口的一个实现类(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);
}
}
至此,保存联系人的功能,我们就已经实现了,至于测试的话,我就不再这里测试了(偷懒了),反正是好使的!