蒋振飞的博客 - SSH整合CRM(第5天)联系人模块   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

SSH整合CRM(第5天)联系人模块

发布时间: 2019年05月16日 发布人: 蒋振飞 热度: 98 ℃ 评论数: 0

一、准备工作

1.LinkMan.java

public class LinkMan {

    private Long lkm_id;
    private String lkm_name;
    // private Long lkm_cust_id;
    private String lkm_gender;
    private String lkm_phone;
    private String lkm_mobile;
    private String lkm_email;
    private String lkm_qq;
    private String lkm_position;
    private String lkm_memo;
        
    private Customer customer;       
}

2.LinkMan.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.jzfblog.crm.domain.LinkMan" table="cst_linkman">
        <id name="lkm_id" column="lkm_id">
            <generator class="native"></generator>
        </id>

        <property name="lkm_name" column="lkm_name" />
        <property name="lkm_gender" column="lkm_gender" />
        <property name="lkm_phone" column="lkm_phone" />
        <property name="lkm_mobile" column="lkm_mobile" />
        <property name="lkm_email" column="lkm_email" />
        <property name="lkm_qq" column="lkm_qq" />
        <property name="lkm_position" column="lkm_position" />
        <property name="lkm_memo" column="lkm_memo" />

        <!-- 联系人与客户关系多对一 -->
        <many-to-one name="customer" column="lkm_cust_id" class="com.jzfblog.crm.domain.Customer" />
    </class>
</hibernate-mapping>

3.Web层(表示层)

创建LinkManAction.java文件,继承ActionSupport并加入LinkMan时的模型驱动和linkManService属性注入。

/**
* 联系人管理Action类
* @author 蒋振飞
*
*/
public class LinkManAction extends ActionSupport implements ModelDriven<LinkMan>{

    // 模型驱动
    private LinkMan linkMan = new LinkMan();

    public LinkMan getModel() {
        return linkMan;
    }

    // 属性注入
    private CustomerService customerService;
    private LinkManService linkManService;

    public void setLinkManService(LinkManService linkManService) {
        this.linkManService = linkManService;
    }
    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }
}

4.Service层(业务逻辑层)

创建好LinkManService接口和LinkManServiceImpl.java文件,加入linkManDao属性注入。

@Transactionalpublic class LinkManServiceImpl implements LinkManService {
    
    private LinkManDao linkManDao;
    
    public void setLinkManDao(LinkManDao linkManDao) {
        this.linkManDao = linkManDao;
    }

}

5.Dao层(数据访问层)

创建好LinkManDao接口和LinkManDaoImpl.java文件,继承HibernateDaoSupport。

6.applicationContext.xml

在applicationContext.xml文件中加入Action、Service、Dao的管理。

<bean id="linkManAction" class="com.jzfblog.crm.web.action.LinkManAction" scope="prototype">
    <property name="linkManService" ref="linkManService" />
    <property name="customerService" ref="customerService" /></bean><bean id="linkManService" class="com.jzfblog.crm.service.impl.LinkManServiceImpl">
    <property name="linkManDao" ref="linkManDao" /></bean><bean id="linkManDao" class="com.jzfblog.crm.dao.impl.LinkManDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

二、联系人保存功能

1.跳转保存界面

<a href="${ pageContext.request.contextPath }/linkMan_saveUI.action">- 新增联系人</a>

2.struts.xml

在struts.xml中添加linkMan_saveUI.action的路径。

<!-- 配置Action -->
<!-- 配置联系人管理的Action -->
<action name="linkMan_*" class="linkManAction" method="{1}">
    <result name="saveUI">/jsp/linkman/add.jsp</result>
</action>

3.LinkManAction.java

在创建好的LinkManAction类中,添加saveUI方法。

/**
* 跳转保存联系人页面
*/
public String saveUI() {
	
    List<Customer> list = customerService.findAll();
    ActionContext.getContext().getValueStack().set("list", list);;
    return "saveUI";
}

4.确定保存地址

<form id=form1 name=form1 action="${  
pageContext.request.contextPath }/linkMan_save.action" 
method="post">
 
</form>

5.struts.xml

在struts.xml中添加linkMan_save.action的路径,代码中保存成功后重定向跳转的findAll方法在联系人查询中再做记录。

<!-- 配置联系人管理的Action -->
<action name="linkMan_*" class="linkManAction" method="{1}">
    <result name="saveUI">/jsp/linkman/add.jsp</result>
    <result name="success" type="redirectAction">linkMan_findAll.action</result>
</action>

6.LinkManAction.java

在创建好的LinkManAction类中,添加save方法。

/**
* 保存联系人
*/public String save(){

    linkManService.save(linkMan));
    return SUCCESS;

}

7.LinkManServiceImpl.java

在LinkManServiceImpl类中,添加save方法。

/**
* 业务层保存联系人
*/
public void save(LinkMan linkMan) {
    
    linkManDao.save(linkMan);
}

8.LinkManDaoImpl.java

在LinkManDaoImpl类中,添加save方法。

/**
 * 持久层保存联系人
 */
public void save(LinkMan linkMan){
        
    this.getHibernateTemplate().save(linkMan);
}

三、删除用户

1.删除选择框

function doDelete(cust_id) {
    var flag = confirm("是否确定删除");
    if(flag){
        window.location.href = "${pageContext.request.contextPath }/linkMan_delete.action?lkm_id=" + lkm_id;
    }
}
<a href="javascript:void(0)" onclick="doDelete(<s:property value="lkm_id"/>)">删除</a>

2.LinkManAction.java

在创建好的LinkManAction中,添加delete方法。

/**
 * 删除联系人
 */
public String delete() {
    
    linkMan = linkManService.findByIdLinkMan);
    linkManService.delete(linkMan);
    return SUCCESS;
}

3.LinkManServiceImpl.java

在LinkManServiceImpl类中,添加findById和delete方法。

/**
 * 通过cust_id查找customer
 */
public LinkMan findById(LinkMan linkMan) {
    
    return linkManDao.findById(linkMan);
}
 
/**
 * 业务层删除客户
 */
public void delete(LinkMan linkMan) {
 
    linkManDao.delete(linkMan);
}

4.LinkManDaoImpl.java

在LinkManDaoImpl类中,添加findById和delete方法.

/**
 * 通过lkm_id查找linkMan
 */
public LinkMan findById(LinkMan linkMan) {
    return this.getHibernateTemplate().get(LinkMan.class, linkMan.getCust_id());
}
 
/**
 * 持久层删除客户
 */
public void delete(LinkManlinkMan) {
    this.getHibernateTemplate().delete(linkMan);
}

四、修改联系人

1.确定数据回显地址

<a href="${pageContext.request.contextPath }/linkMan_edit.action?lkm_id=<s:property value="lkm_id"/>">修改</a>

2.struts.xml

在struts.xml中添加linkMan_edit.action的路径。

<result name="edit">/jsp/linkMan/edit.jsp</result>

3.LinkManAction.java

在创建好的LinkManAction中,添加edit方法。

/**
 * 修改联系人信息
 */
public String edit() {

    linkMan = linkManService.findById(linkMan);
    List<Customer> list = customerService.findAll();
    ActionContext.getContext().getValueStack().set("list", list);

    return "edit";

}

4.将普通字段回显

所属客户:
<s:select list="list" name="customer.cust_id" value="%{model.customer.cust_id}" headerKey="" headerValue="--请选择--" listKey="cust_id" listValue="cust_name" />

联系人名称:
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_name" value="<s:property value="model.lkm_name" />" >
 
联系人性别:
<s:radio list="#{'1':'男','2':'女' }" name="lkm_gender" theme="simple" value="model.lkm_gender"></s:radio>
 
联系人办公电话 :
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_phone" value="<s:property value="model.lkm_phone" />">
 
联系人手机 :
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_mobile" value="<s:property value="model.lkm_mobile" />">

5.确定更新地址

linkMan_update

6.LinkManAction.java

在创建好的LinkManAction类中,添加update方法。

public String update() {
                
    linkManService.update(linkMan);
    return SUCCESS;
}

7.LinkManServiceImpl.java

在LinkManServiceImpl类中,添加update方法。

/**
 * 修改联系人
 */public void update(LinkMan linkMan) {
 
    linkManDao.update(linkMan);
}

8.LinkManDaoImpl.java

在LinkManDaoImpl类中,添加update方法

/**
 * 修改联系人
 */
public void update(LinkMan linkMan) {
 
    this.getHibernateTemplate().update(linkMan);
}

五、查询所有

1.确定查询地址

<a href="${ pageContext.request.contextPath }/linkMan_findAll.action" target=main>- 客户列表</a>

2.struts.xml

在struts.xml中添加linkManfindAll.action的路径。

<!-- 配置联系人管理的Action -->
<action name="linkMan_*" class="linkManAction" method="{1}">
    <result name="saveUI">/jsp/linkman/add.jsp</result>
    <result name="findAll">/jsp/linkman/list.jsp</result>
    <result name="success" type="redirectAction">linkMan_findAll.action</result>
    <result name="edit">/jsp/linkman/edit.jsp</result>
</action>

3.pageBean.java

创建pageBean.java文件,作为分页参数的设置。

/**
 * 存放分页相关的数据
 *
 *
 */
public class PageBean {
    
    //基本属性
    private int currentPageNum; //当前页数,由用户指定                          
    private int pageSize = 5; //每页显示的条数,固定的                         
    private int totalRecords; //总记录条数,数据库查出来的                     
    private int totalPageNum; //总页数,计算出来的                                     
    private int startIndex; //每页开始记录的索引,计算出来的                     
    private int prePageNum; //上一页                                                         
    private int nextPageNum; //下一页                                                        

    private List records; //已经分好页的结果集,该list中只有10条记录

    // 扩展属性
    // 一共每页显示9个页码按钮
    private int startPage; //开始页码
    private int endPage; //结束页码

    // 完善属性
    private String url;

    // 要想使用我的分页,必须给我两个参数。一个是要看哪一页,另一个是总记录条数
    public PageBean(int currentPageNum,int totalRecords,int pageSize){
        this.currentPageNum = currentPageNum;
        this.totalRecords = totalRecords;
        this.pageSize=pageSize;

        // 计算查询记录的开始索引
        startIndex = (currentPageNum-1)*pageSize;
        // 计算总页数
        totalPageNum = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1);
    
        startPage = currentPageNum - 4; //5
        endPage = currentPageNum + 4;  //13
        // 看看总页数够不够9页
        if(totalPageNum>9){
            //超过了9页
            if(startPage < 1){
                startPage = 1;
                endPage = startPage+8;
            }
            if(endPage>totalPageNum){
                endPage = totalPageNum;
                startPage = endPage-8;
            }
        }else{
            //不够9页
            startPage = 1;
            endPage = totalPageNum;
        }
    }

    public int getPrePageNum() {
        
        prePageNum = currentPageNum - 1;
        if(prePageNum<1){
            prePageNum = 1;
        }
        return prePageNum;
    }
    
    public int getNextPageNum() {
    
        nextPageNum = currentPageNum+1;
        if(nextPageNum>totalPageNum){
            nextPageNum = totalPageNum;
        }
        return nextPageNum;
    }
}

4.linkManAction.java

在创建好的linkManAction类中,添加findAll方法,还需使用属性驱动的方法获取页面传递的currentPageNum和pageSize参数。

// 属性驱动接收当前页
private Integer currentPageNum = 1;
 
public void setCurrentPageNum(Integer currentPageNum) {
    
    if(currentPageNum == null) {
        currentPageNum = 1;
    }
 
    this.currentPageNum = currentPageNum;
}
 
 
// 属性驱动接收每页最大记录数
private Integer pageSize = 3;
 
public void setPageSize(Integer pageSize) {
 
    if(pageSize == null) {
        pageSize = 5;
    }
    this.pageSize = pageSize;
 
}
 
/**
 * 分页查询全部联系人
 * @return
 */
public String findAll() {
 
    // 最好使用DetachedCriterial对象(条件查询)
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(LinkMan.class);
 
    // 调用业务层查询
    PageBean pageBean = linkManService.findByPage(detachedCriteria, currentPageNum, pageSize);
 
    // 将pageBean放入值栈中
    ActionContext.getContext().getValueStack().push(pageBean);
 
    return "findAll";
 
}

5.LinkManServiceImpl.java

在LinkManServiceImpl类中,添加findByPage方法。

/**
 * 业务层分页查询联系人
 */
public PageBean findByPage(DetachedCriteria detachedCriteria, Integer currentPageNum, Integer pageSize) {
        
    //查询总记录数
    int totalRecords = linkManDao.findTotalRecords(detachedCriteria);
        
    // 创建pageBean的对象
    PageBean pageBean = new PageBean(currentPageNum, totalRecords, pageSize);
        
    // 查询当前页的记录
    List<LinkMan> records = linkManDao.findCustomerByPage(detachedCriteria, pageBean.getStartIndex(), pageBean.getPageSize());
        
    pageBean.setRecords(records);
    pageBean.setUrl("");
        
    return pageBean;
}

6.LinkManDaoImpl.java

在LinkManDaoImpl类中,添加findTotalRecords方法和findLinkManByPage方法。

/**
 * 查询总记录数
 */
public Integer findTotalRecords(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;
}
 
/**
 * 分页查询联系人记录
 */
public List<LinkMan> findLinkManByPage(DetachedCriteria detachedCriteria, int startIndex, int pageSize) {
        
    // 清空一下查询条件
    detachedCriteria.setProjection(null);
    return (List<LinkMan>) this.getHibernateTemplate().findByCriteria(detachedCriteria, startIndex, pageSize);
}

7.引入标签库

<%@ taglib uri="/struts-tags" prefix="s"%>
<s:iterator value="records">
    <TR style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
        <TD><s:property value="customer.cust_name" /></TD>
        <TD><s:property value="lkm_name" /></TD>
        <TD><s:if test="lkm_gender==1">男</s:if><s:elseif test="lkm_gender==2">女</s:elseif></TD>
        <TD><s:property value="lkm_phone" /></TD>
        <TD><s:property value="lkm_mobile" /></TD>
        <TD><s:property value="lkm_email" /></TD>
        <TD><s:property value="lkm_qq" /></TD>
        <TD><s:property value="lkm_position" /></TD>
        <TD><s:property value="lkm_memo" /></TD>             
        <TD>
            <a href="${pageContext.request.contextPath }/linkMan_edit.action?lkm_id=<s:property value="lkm_id" />">修改</a>
            <a href="${pageContext.request.contextPath }/linkMan_delete.action?lkm_id=<s:property value="lkm_id" />">删除</a>
        </TD>
    </TR>
</s:iterator>
共[<B><s:property value="totalRecords" /></B>]条记录,[<B><s:property value="totalPageNum" /></B>]页
每页显示
<select name="pageSize" onchange="to_page()">
    <option value="3" <s:if test="pageSize == 3">selected</s:if>>3<aption>
    <option value="5" <s:if test="pageSize == 5">selected</s:if>>5</option>
    <option value="10" <s:if test="pageSize == 10">selected</s:if>>10</option>
</select>
条
<s:if test="currentPageNum != 1">
    [<A href="javascript:to_page(<s:property value="1" />)">首页</A>]
    [<A href="javascript:to_page(<s:property value="prePageNum" />)">前一页</A>]
</s:if><s:if test="currentPageNum != totalPageNum">
    [<A href="javascript:to_page(<s:property value="nextPageNum" />)">后一页</A>] 
    [<A href="javascript:to_page(<s:property value="totalPageNum" />)">尾页</A>] 
</s:if>
<s:iterator var="i" begin="1" end="totalPageNum">        
    <s:if test="currentPageNum == #i">
        <s:property value="#i" />
    </s:if>
    <s:else>
        <A href="javascript:to_page(<s:property value="#i" />)"><s:property value="#i" /></A>
    </s:else>
</s:iterator>

8.重点

需要在web.xml中配置OpenSessionInViewFilter过滤器,否则关联的外键查询没有结果,因为hibernate默认是懒加载。

<!-- 此处针对baseDictSource.dict_item_name等无法显示 -->
<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
  
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>

七、条件查询客户

1.页面增加筛选字段

联系人名称:
<s:textfield theme="simple" name="lkm_name" cssClass="textbox" cssStyle="width:80px" maxlength="50" />
联系人性别:
<s:select theme="simple" list="#{'1':'男','2':'女' }" name="lkm_gender" headerKey="" headerValue="-请选择-" cssClass="textbox" cssStyle="width:80px" maxlength="50" />
<INPUT class=button id=sButton2 type=submit value=" 筛选 " name=sButton2>

2.LinkManAction.java

重写findAll方法。

/**
 * 分页查询全部联系人
 * @return
 */
public String findAll() {
        
    // 最好使用DetachedCriterial对象(条件查询)
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(LinkMan.class);
        
    // 设置条件
    if(linkMan.getLkm_name() != null) {
        // 设置按名称查询条件
        detachedCriteria.add(Restrictions.like("lkm_name", "%"+linkMan.getLkm_name()+"%"));
    }
    if(linkMan.getLkm_gender() != null && !"".equals(linkMan.getLkm_gender())) {
        // 设置按性别查询
        detachedCriteria.add(Restrictions.eq("lkm_gender", linkMan.getLkm_gender()));
    }
    // 调用业务层查询
    PageBean pageBean = linkManService.findByPage(detachedCriteria, currentPageNum, pageSize);
        
    // 将pageBean放入值栈中
    ActionContext.getContext().getValueStack().push(pageBean);
    return "findAll";
}

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表