​需求在这​


目录

​BaseServlet抽取(抽取简单增删改查的代码,以后传个类型就不用写了)​

​BaseDao.java​

​BaseDaoImpl.java​

​简单调用(仅仅继承时改下 没有动任何配置文件)​

​CustomerDao.java​

​CustomerDaoImpl.java​

​BaseAction的抽取​

​BaseAction.java​

​LinkmanAction.java​

​顺便上传工具类进一步封装​

​uploadUtils​

​今日项目总结:​

​DAO​

​BaseDao.java​

​BaseDaoImpl.java​

​CustomerDao.java​

​CustomerDaoImpl.java​

​LinkmanDao.java​

​LinkmanDaoImpl.java​

​domain​

​Customer.java​

​Customer.hbm.xml​

​Linkman.java​

​Linkman.hbm.xml​

​CustomerServiceImpl.java​

​LinkmanServiceImpl.java​

​Action​

​BaseAction.java​

​CustomerAction.java​

​LinkmanAction.java​

​JSP​

​list.jsp​

​add.jsp​

​edit.jsp​


BaseServlet抽取(抽取简单增删改查的代码,以后传个类型就不用写了)

BaseDao.java

package com.itheima.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

import com.itheima.domain.PageBean;

/**
* 以后所有的dao接口都需要继承BaseDao 接口
*写成泛型形式,方便动态传入类型
*/
public interface BaseDao<T> {

public void save(T t);

public void delete(T t);

public void update(T t);

public T findById(Long id);

public T findById(String id);//重载id

public List<T> findAll();

public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria);

}

BaseDaoImpl.java

package com.itheima.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

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

import com.itheima.domain.Customer;
import com.itheima.domain.PageBean;

/**
* 以后所有的DaoImpl都可以继承BaseDaoImpl,那么通用增删改查和分页就可以直接用了
* @author 寒面银枪
* 2019年7月6日-下午2:31:22
*/
@SuppressWarnings("all") //忽略所有警告
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {

//定义成员属性(为了拿到T的类型 T.class不行报错)
private Class clazz;
public BaseDaoImpl() {

//1.拿到子类对象
Class c=this.getClass();

//2.获取到BaseDaoImpl<Customer>
Type type = c.getGenericSuperclass();

//将type转换为另一个子类 即可获得泛型
if(type instanceof ParameterizedType) {//注意ParameterizedType是反射包里的
ParameterizedType ptype=(ParameterizedType) type;
//获取Customer
Type[] types = ptype.getActualTypeArguments();//之所以是数组 因为有的泛型有好多个类型 eg:Map<K,V>
this.clazz=(Class) types[0];
}

}

/**
* 添加
*/
@Override
public void save(T t) {
this.getHibernateTemplate().save(t);
}

/**
* 删除
*/
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}

/**
* 修改
*/
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}

/**
* 通过主键查询
*/
@Override
public T findById(Long id) {
T t = (T) this.getHibernateTemplate().get(clazz, id);
return t;
}

/**
* 通过主键查询
*/
@Override
public T findById(String id) {
T t = (T) this.getHibernateTemplate().get(clazz, id);
return t;
}

/**
* 查询所有数据
*/
@Override
public List<T> findAll() {
//此时HQL查询最方便 clazz.getSimpleName()拿到类型名
return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
}

/**
* 分页查询
*/
@Override
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
//创建分页的对象
PageBean<T> page=new PageBean<T>();
page.setPageCode(pageCode);
page.setPageSize(pageSize);

/*hibernate要么用HQL(Hibernate查询语句 要么用QBC 条件查询 好好看QBC条件查询 Hibernate_day04 列了5大类查询)*/

//总记录数
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>) this.getHibernateTemplate().findByCriteria(criteria);
if(list!=null && list.size()>0) {
page.setTotalCount(list.get(0).intValue());
}

criteria.setProjection(null);//一定先清空查询条件 否则默认会发送select count(*) ...语句

//每页的数据(pageSize条记录)
List<T> beanList = (List<T>) this.getHibernateTemplate().findByCriteria(criteria, (pageCode-1)*pageSize, pageSize);

page.setBeanList(beanList);
return page;
}

}

简单调用(仅仅继承时改下 没有动任何配置文件)

CustomerDao.java

package com.itheima.dao;

import com.itheima.domain.Customer;

public interface CustomerDao extends BaseDao<Customer>{

//接口继承了父接口 父接口里都有这些方法的声明了 就不用再写了

}

CustomerDaoImpl.java

package com.itheima.dao;

import com.itheima.domain.Customer;

/**
* 客户的持久层
* @author 寒面银枪
* 2019年7月2日-下午8:22:52
*/ //继承的时候传递了正确的类型就行了
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {

/*基本的增删改查都不用写了 BaseDaoImpl根据泛型已经都实现了通用的方法 */

}

 

BaseAction的抽取

(同样,Action里面也有一些死的属性和方法 可以封装,不用每次都写了)

BaseAction.java

package com.itheima.web.action;

import java.io.File;
import java.lang.reflect.ParameterizedType;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
* 抽取Action父类 定义成抽象类最好
* @author 寒面银枪
* 2019年7月6日-下午6:38:45
*/
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{

private static final long serialVersionUID = 1L;

/**
* Model的抽取
*/
private T model;
public BaseAction() {//必须要new一个实例 没办法
try {
//通过反射获取t真实类型
ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass();
Class<T> clazz= (Class<T>) pt.getActualTypeArguments()[0];
//反射创建t的实例
model=clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public T getModel() {
return model;
}
public void setModel(T model) {
this.model=model;//封装之后取当前model对象麻烦一点了
}


/**
* 分页查询的抽取 注意父类里get方法也要提供了
*/
private Integer pageCode=1;
public void setPageCode(Integer pageCode) {
if(pageCode==null) pageCode=1;
this.pageCode = pageCode;
}
public Integer getPageCode() {
return pageCode;
}
//每页显示的数据的条数 (如果可以让用户选择,那么就不能写死了)
private Integer pageSize=2;//默认2条
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageSize() {
return pageSize;
}

/**
* 上传下载也可以封装了 (前端file的name属性必须写upload了)
*/
private File upload;//要上传的文件 关键是这个麻烦的玩意儿 帮你封装好了 太强了
private String uploadFileName;//要上传的文件名
private String uploadContentType;//要上传的文件类型
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}


/**
* 向值栈设置值
* 调用值栈对象的set方法 一般应用于集合
*/
public void setVs(String key,Object obj) {
ActionContext.getContext().getValueStack().set(key,obj);
}


/**
* 向值栈设置值
* 调用值栈对象的push方法 一般应用于对象
*/
public void pushVs(Object obj) {
ActionContext.getContext().getValueStack().push(obj);
}


/**
* request、response、session的封装
*/
public HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}

public HttpServletResponse getResponse() {
return ServletActionContext.getResponse();
}

private Map<String, Object> getSession() {
return ActionContext.getContext().getSession();
}


//最后自己总结 抽取大框架

}

其他Action继承起来就简单了,model都不用写了,压栈等也方便了

LinkmanAction.java

package com.itheima.web.action;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import com.itheima.domain.Customer;
import com.itheima.domain.Linkman;
import com.itheima.domain.PageBean;
import com.itheima.service.LinkmanService;

public class LinkmanAction extends BaseAction<Linkman>{

private static final long serialVersionUID = 1L;

private LinkmanService linkmanService;
public void setLinkmanService(LinkmanService linkmanService) {
this.linkmanService = linkmanService;
}

/**
* 分页查询
* @return
*/
public String findByPage() {
//调用业务层分页查询
DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
//封装查询条件 "名称"和"所属客户"
//先获取然后判断null,去空格 ,养成习惯
String lkm_name = getModel().getLkm_name();
if(lkm_name!=null&&!lkm_name.trim().isEmpty()) {
criteria.add(Restrictions.like("lkm_name", "%"+lkm_name+"%"));
}
//Long cust_id = getModel().getCustomer().getCust_id();//注意写法
Customer c = getModel().getCustomer();
if(c!=null&&c.getCust_id()!=null) {
criteria.add(Restrictions.eq("customer.cust_id", c.getCust_id()));
}
//调用service查询
PageBean<Linkman> page = linkmanService.findByPage(this.getPageCode(),this.getPageSize(),criteria);
//压栈
this.setVs("page", page);
return "page";
}

}

 

顺便上传工具类进一步封装

uploadUtils

package com.itheima.utils;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import org.apache.commons.io.FileUtils;

public class UploadUtils {

/**
* 默认上传路径
*/
public static final String UPLOAD_PATH="E:/Tomcat/apache-tomcat-8.5.4/webapps/upload/";

public static String getUUIDName(String filename) {
//截取后缀名
String lastName=filename.substring(filename.lastIndexOf("."));
String firstName=UUID.randomUUID().toString().replace("-", "");
return firstName+lastName;
}

/**
* 整个下载的完全封装 在联系人里自己做
* @param uploadFileName 上传文件名
* @param upload 上传的文件
* @throws IOException
*/
public static void upload(String uploadFileName,File upload) throws IOException {
String uuidName = getUUIDName(uploadFileName);
File destFile=new File(UPLOAD_PATH+uuidName);
FileUtils.copyFile(upload, destFile);
}

}

 

今日项目总结:

客户的修改、通用DAO抽取、通用Action抽取、联系人列表显示、联系人条件查询、客户联系人一对多配置等问题

DAO

BaseDao.java

package com.itheima.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

import com.itheima.domain.PageBean;

/**
* 以后所有的dao接口都需要继承BaseDao 接口
*写成泛型形式,方便动态传入类型
*/
public interface BaseDao<T> {

public void save(T t);

public void delete(T t);

public void update(T t);

public T findById(Long id);

public T findById(String id);//重载id

public List<T> findAll();

public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria);

}

BaseDaoImpl.java

package com.itheima.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

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

import com.itheima.domain.Customer;
import com.itheima.domain.PageBean;

/**
* 以后所有的DaoImpl都可以继承BaseDaoImpl,那么通用增删改查和分页就可以直接用了
* @author 寒面银枪
* 2019年7月6日-下午2:31:22
*/
@SuppressWarnings("all") //忽略所有警告
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {

//定义成员属性(为了拿到T的类型 T.class不行报错)
private Class clazz;
/*public BaseDaoImpl(Class clazz) {
this.clazz = clazz;//让子类来传类型 (重写子类无参构造器 daoimpl一般也不会有带参构造器 所以很安全了)
}//注意此类没有无参构造器了 子类必须自己重写无参构造器了(因为继承不到了)
能解决问题 但是很麻烦 每次都要重写无参构造器
*/
public BaseDaoImpl() {
//验证创建子类 父类构造器会自动执行,并且this指的是子类
//System.out.println("BaseDaoImpl执行了... "+this.getClass().getSimpleName());

//下面利用反射 一步一步拿到子类继承此父类时注入的泛型T

//1.拿到子类对象
Class c=this.getClass();

//2.获取到BaseDaoImpl<Customer>
Type type = c.getGenericSuperclass();

//将type转换为另一个子类 即可获得泛型
if(type instanceof ParameterizedType) {//注意ParameterizedType是反射包里的
ParameterizedType ptype=(ParameterizedType) type;
//获取Customer
Type[] types = ptype.getActualTypeArguments();//之所以是数组 因为有的泛型有好多个类型 eg:Map<K,V>
this.clazz=(Class) types[0];
}

}

/**
* 添加
*/
@Override
public void save(T t) {
this.getHibernateTemplate().save(t);
}

/**
* 删除
*/
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}

/**
* 修改
*/
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}

/**
* 通过主键查询
*/
@Override
public T findById(Long id) {
T t = (T) this.getHibernateTemplate().get(clazz, id);
return t;
}

/**
* 通过主键查询
*/
@Override
public T findById(String id) {
T t = (T) this.getHibernateTemplate().get(clazz, id);
return t;
}

/**
* 查询所有数据
*/
@Override
public List<T> findAll() {
//此时HQL查询最方便 clazz.getSimpleName()拿到类型名
return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
}

/**
* 分页查询
*/
@Override
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
//创建分页的对象
PageBean<T> page=new PageBean<T>();
page.setPageCode(pageCode);
page.setPageSize(pageSize);

/*hibernate要么用HQL(Hibernate查询语句 要么用QBC 条件查询 好好看QBC条件查询 Hibernate_day04 列了5大类查询)*/

//总记录数
criteria.setProjection(Projections.rowCount());
List<Number> list = (List<Number>) this.getHibernateTemplate().findByCriteria(criteria);
if(list!=null && list.size()>0) {
page.setTotalCount(list.get(0).intValue());
}

criteria.setProjection(null);//一定先清空查询条件 否则默认会发送select count(*) ...语句

//每页的数据(pageSize条记录)
List<T> beanList = (List<T>) this.getHibernateTemplate().findByCriteria(criteria, (pageCode-1)*pageSize, pageSize);

page.setBeanList(beanList);
return page;
}

}

CustomerDao.java

package com.itheima.dao;

import com.itheima.domain.Customer;

public interface CustomerDao extends BaseDao<Customer>{

//接口继承了父接口 父接口里都有这些方法的声明了 就不用在写了

//public void save(Customer customer);

//public PageBean<Customer> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria);

//public Customer findById(Long cust_id);

//public void delete(Customer customer);

//public void update(Customer customer);

}

CustomerDaoImpl.java

package com.itheima.dao;

import com.itheima.domain.Customer;

/**
* 客户的持久层
* @author 寒面银枪
* 2019年7月2日-下午8:22:52
*/ //继承的时候传递了正确的类型就行了
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {

/*基本的增删改查都不用写了 BaseDaoImpl根据泛型已经都实现了通用的方法 */

}

LinkmanDao.java

package com.itheima.dao;

import com.itheima.domain.Linkman;

/**
* 联系人模块dao
* @author 寒面银枪
* 2019年7月6日-下午6:25:39
*/
public interface LinkmanDao extends BaseDao<Linkman> {

}

LinkmanDaoImpl.java

package com.itheima.dao;

import com.itheima.domain.Linkman;

public class LinkmanDaoImpl extends BaseDaoImpl<Linkman> implements LinkmanDao {

}

domain

Customer.java

package com.itheima.domain;

import java.util.HashSet;
import java.util.Set;

import com.alibaba.fastjson.annotation.JSONField;

public class Customer {

private Long cust_id;//客户名称
private String cust_name;//客户姓名
private Long cust_user_id;//负责人id
private Long cust_create_id;//创建人id 这两个暂时不管

/*private String cust_source;//客户来源
private String cust_industry;//客户所属行业(eg:客户来自于百度 那么行业可以是互联网)
private String cust_level;//客户级别*/

private String cust_linkman;//联系人
private String cust_phone;//固定电话
private String cust_mobile;//移动电话

//一对多 多方写对象 那么上面普通字段的写法就要注释掉了
//一:客户来源 多:客户
private Dict source;
//一:客户行业 多:客户
private Dict industry;
//一:客户级别 多:客户
private Dict level;

// 上传文件保存的路径
private String filepath;

//和联系人配置一对多 (我:百度公司 有多个联系人:CEO、CFO等等...)
@JSONField(serialize=false) //必须禁止set转json 否则就是死循环
private Set<Linkman> linkmans=new HashSet<Linkman>();
//customer(1)和linkman(多) 同样一方可以不写集合(此处还是写了,为了演示问题) 全部交给有外键的多方去配,有双方有一方维护外键就够了
//客户写了联系人 联系人又写了客户 双方互相包含 真的会出现很多问题,不如不写呢 一方维护就行了呗

public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public Long getCust_user_id() {
return cust_user_id;
}
public void setCust_user_id(Long cust_user_id) {
this.cust_user_id = cust_user_id;
}
public Long getCust_create_id() {
return cust_create_id;
}
public void setCust_create_id(Long cust_create_id) {
this.cust_create_id = cust_create_id;
}
public String getCust_linkman() {
return cust_linkman;
}
public void setCust_linkman(String cust_linkman) {
this.cust_linkman = cust_linkman;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
public String getCust_mobile() {
return cust_mobile;
}
public void setCust_mobile(String cust_mobile) {
this.cust_mobile = cust_mobile;
}
public Dict getSource() {
return source;
}
public void setSource(Dict source) {
this.source = source;
}
public Dict getIndustry() {
return industry;
}
public void setIndustry(Dict industry) {
this.industry = industry;
}
public Dict getLevel() {
return level;
}
public void setLevel(Dict level) {
this.level = level;
}
public String getFilepath() {
return filepath;
}
public void setFilepath(String filepath) {
this.filepath = filepath;
}
public Set<Linkman> getLinkmans() {
return linkmans;
}
public void setLinkmans(Set<Linkman> linkmans) {
this.linkmans = linkmans;
}

}

Customer.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.itheima.domain.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>

<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>

<!-- <property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/> -->

<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>

<!-- 上传文件保存的路径 -->
<property name="filepath" column="filepath"/> <!-- 不配置长度就是默认长度 -->

<!-- 一对多 配置多方
本类的全限定名已经知道了 这里配的应该就是另一方javaBean的全路径了
name:当前(多方)javaBean属性 class:关联的另一方(一方)类的全路径 column:表中外键字段名称
-->
<many-to-one name="source" class="com.itheima.domain.Dict" column="cust_source"/>
<many-to-one name="industry" class="com.itheima.domain.Dict" column="cust_industry"/>
<many-to-one name="level" class="com.itheima.domain.Dict" column="cust_level"/>


<!-- customer(一)和Linkman(多)一对多 本来不用配置 为了显示问题而配置的 -->
<set name="linkmans" inverse="true"> <!--一方放弃外键维护 一方维护所有对应的多方很累 双方有一方维护就够了 必须有一方放弃维护 -->
<key column="lkm_cust_id"/><!-- 外键名称 -->
<one-to-many class="com.itheima.domain.Linkman"/>
</set>

</class>

</hibernate-mapping>

Linkman.java

package com.itheima.domain;

/**
* 客户的联系人
* 多方
* @author Administrator
*/
public class Linkman {

/**
* `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
`lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
`lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id',
`lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
`lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
`lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
`lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
`lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',
`lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
`lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
*/

private Long lkm_id;
private String lkm_name;
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;

// 编写一个对象,不要自己new
private Customer customer;

public Long getLkm_id() {
return lkm_id;
}
public void setLkm_id(Long lkm_id) {
this.lkm_id = lkm_id;
}
public String getLkm_name() {
return lkm_name;
}
public void setLkm_name(String lkm_name) {
this.lkm_name = lkm_name;
}
public String getLkm_gender() {
return lkm_gender;
}
public void setLkm_gender(String lkm_gender) {
this.lkm_gender = lkm_gender;
}
public String getLkm_phone() {
return lkm_phone;
}
public void setLkm_phone(String lkm_phone) {
this.lkm_phone = lkm_phone;
}
public String getLkm_mobile() {
return lkm_mobile;
}
public void setLkm_mobile(String lkm_mobile) {
this.lkm_mobile = lkm_mobile;
}
public String getLkm_email() {
return lkm_email;
}
public void setLkm_email(String lkm_email) {
this.lkm_email = lkm_email;
}
public String getLkm_qq() {
return lkm_qq;
}
public void setLkm_qq(String lkm_qq) {
this.lkm_qq = lkm_qq;
}
public String getLkm_position() {
return lkm_position;
}
public void setLkm_position(String lkm_position) {
this.lkm_position = lkm_position;
}
public String getLkm_memo() {
return lkm_memo;
}
public void setLkm_memo(String lkm_memo) {
this.lkm_memo = lkm_memo;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}

}

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.itheima.domain.Linkman" table="cst_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"/>
</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"/>

<!-- 先配置多方
name 当前JavaBean中的属性
class 属性的全路径(当然是name属性对应的了)
column 外键的字段
-->
<many-to-one name="customer" class="com.itheima.domain.Customer" column="lkm_cust_id"/>

</class>

</hibernate-mapping>

CustomerServiceImpl.java

package com.itheima.service;

import java.util.List;

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

import com.itheima.dao.CustomerDao;
import com.itheima.domain.Customer;
import com.itheima.domain.PageBean;

/**
* 客户的业务层
* @author 寒面银枪
* 2019年7月2日-下午7:06:18
*/
@Transactional //下面的方法就都有了事务
public class CustomerServiceImpl implements CustomerService {

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

/**
* 保存客户
*/
public void save(Customer customer) {
customerDao.save(customer);
}

/**
* 分页查询
*/
@Override
public PageBean<Customer> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
return customerDao.findByPage(pageCode,pageSize,criteria);
}

/**
* 通过主键查询客户
*/
@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();
}

}

LinkmanServiceImpl.java

package com.itheima.service;

import java.util.List;

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

import com.itheima.dao.LinkmanDao;
import com.itheima.domain.Linkman;
import com.itheima.domain.PageBean;

@Transactional
public class LinkmanServiceImpl implements LinkmanService {

private LinkmanDao linkmanDao;
public void setLinkmanDao(LinkmanDao linkmanDao) {
this.linkmanDao = linkmanDao;
}

/**
* 分页查询
* @return
*/
public PageBean<Linkman> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
return (PageBean<Linkman>) linkmanDao.findByPage(pageCode, pageSize, criteria);
}

/**
* 保存客户(添加记录)
*/
@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 delete(Linkman linkman) {
linkmanDao.delete(linkman);
}

/**
* 修改联系人
*/
@Override
public void update(Linkman linkman) {
linkmanDao.update(linkman);
}


}

Action

BaseAction.java

package com.itheima.web.action;

import java.io.File;
import java.lang.reflect.ParameterizedType;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
* 抽取Action父类 定义成抽象类最好
* @author 寒面银枪
* 2019年7月6日-下午6:38:45
*/
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{

private static final long serialVersionUID = 1L;

/**
* Model的抽取
*/
private T model;
public BaseAction() {//必须要new一个实例 没办法
try {
//通过反射获取t真实类型
ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass();
Class<T> clazz= (Class<T>) pt.getActualTypeArguments()[0];
//反射创建t的实例
model=clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public T getModel() {
return model;
}
public void setModel(T model) {
this.model=model;//封装之后取当前model对象麻烦一点了
}


/**
* 分页查询的抽取 注意父类里get方法也要提供了
*/
private Integer pageCode=1;
public void setPageCode(Integer pageCode) {
if(pageCode==null) pageCode=1;
this.pageCode = pageCode;
}
public Integer getPageCode() {
return pageCode;
}
//每页显示的数据的条数 (如果可以让用户选择,那么就不能写死了)
private Integer pageSize=2;//默认2条
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageSize() {
return pageSize;
}

/**
* 上传下载也可以封装了 (前端file的name属性必须写upload了)
*/
private File upload;//要上传的文件 关键是这个麻烦的玩意儿 帮你封装好了 太强了
private String uploadFileName;//要上传的文件名
private String uploadContentType;//要上传的文件类型
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}


/**
* 向值栈设置值
* 调用值栈对象的set方法 一般应用于集合
*/
public void setVs(String key,Object obj) {
ActionContext.getContext().getValueStack().set(key,obj);
}


/**
* 向值栈设置值
* 调用值栈对象的push方法 一般应用于对象
*/
public void pushVs(Object obj) {
ActionContext.getContext().getValueStack().push(obj);
}


/**
* request、response、session的封装
*/
public HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}

public HttpServletResponse getResponse() {
return ServletActionContext.getResponse();
}

private Map<String, Object> getSession() {
return ActionContext.getContext().getSession();
}


//最后自己总结 抽取大框架

}

CustomerAction.java

package com.itheima.web.action;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletContext;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import com.itheima.domain.Customer;
import com.itheima.domain.Dict;
import com.itheima.domain.PageBean;
import com.itheima.service.CustomerService;
import com.itheima.utils.FastJsonUtil;
import com.itheima.utils.UploadUtils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;

import sun.print.resources.serviceui;

/**
* 客户的控制层(web层)
* @author 寒面银枪
* 2019年7月4日-下午2:45:06
*/
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{

private static final long serialVersionUID = 1L;

/**
* 以后除非接收的单个参数使用属性驱动 否则都使用模型驱动封装数据 实现ModelDriven接口
* 多简单:实现接口 写一个javaBean属性 接口必须实现的方法内返回对象 即可
*/
private Customer customer=new Customer();//必须手动实例化
//类的属性是由get和set方法决定的 与字段无关 所以Action类有一个属性model
public Customer getModel() {
return customer;
}

//注入service 提供service成员属性
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}//一旦Action给spring管理 Struts的自动注入就失效了 必须手动注入 既然Action在spring的xml中了 那么多配置一个属性就是了


//仅保留今天的部分

/**
* 跳转到初始修改页面
*/
public String initUpdate() {
customer = customerService.findById(customer.getCust_id());//customer多例的 直接赋给customer没事 一次请求新new一个action
/*压栈 但是注意 返回值赋给了customer 而customer是setModel方法的返回值
也即Action属性 而Action默认压栈 所以customer就在值栈内了,eg: model.cust_name就可以取得客户姓名*/
return "initUpdate";
}

/**
* 修改客户功能
* @return
* @throws IOException
*/
public String update() throws IOException {
//判断是否上传新图片
if(uploadFileName!=null) {
//先删除旧图片
//上面upload是上传组件file传过来的 下面的旧的路径名是隐藏域传递过来的
String oldFilepath=customer.getFilepath();
if(oldFilepath!=null&&!oldFilepath.trim().isEmpty()) {
//说明旧的文件存在
File oldfile=new File(oldFilepath);
oldfile.delete();
}
//上传新图片
String uuidName = UploadUtils.getUUIDName(uploadFileName);
File file = new File(UploadUtils.UPLOAD_PATH+uuidName);
FileUtils.copyFile(upload, file);//这个复制工具类是Apache的
//把客户新图片的路径更新到数据库
customer.setFilepath(UploadUtils.UPLOAD_PATH+uuidName);
}
//上面的{}内的逻辑应该是原子性的 所以应该封装到service层去做 (万一删完出错了..咋办) 不应该在web层做的
//任务 进一步封装上传工具类 封装edit方法 (update方法留着 因为通用)


//更新客户的信息就ok了
customerService.update(customer);

return "update";
}

/**
* 查询所有客户 Adjx请求 不用跳转
* @return
*/
public String findAll() {
List<Customer> list=customerService.findAll();
//转换成json
String jsonString = FastJsonUtil.toJSONString(list);
FastJsonUtil.write_json(ServletActionContext.getResponse(), jsonString);
return NONE;
}


}

LinkmanAction.java

package com.itheima.web.action;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import com.itheima.domain.Customer;
import com.itheima.domain.Linkman;
import com.itheima.domain.PageBean;
import com.itheima.service.LinkmanService;

public class LinkmanAction extends BaseAction<Linkman>{

private static final long serialVersionUID = 1L;

private LinkmanService linkmanService;
public void setLinkmanService(LinkmanService linkmanService) {
this.linkmanService = linkmanService;
}

/**
* 分页查询
* @return
*/
public String findByPage() {
//调用业务层分页查询
DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
//封装查询条件 "名称"和"所属客户"
//先获取然后判断null,去空格 ,养成习惯
String lkm_name = getModel().getLkm_name();
if(lkm_name!=null&&!lkm_name.trim().isEmpty()) {
criteria.add(Restrictions.like("lkm_name", "%"+lkm_name+"%"));
}
//Long cust_id = getModel().getCustomer().getCust_id();//注意写法
Customer c = getModel().getCustomer();
if(c!=null&&c.getCust_id()!=null) {
criteria.add(Restrictions.eq("customer.cust_id", c.getCust_id()));
}
//调用service查询
PageBean<Linkman> page = linkmanService.findByPage(this.getPageCode(),this.getPageSize(),criteria);
//压栈
this.setVs("page", page);
return "page";
}

/**
* 新增联系人UI
*/
public String initAddUI() {
return "initAddUI";
}

/**
* 新增联系人
*/
public String save() {
linkmanService.save(getModel());
return "save";
}

/**
* 删除联系人
*/
public String delete() {
//先查再删
setModel(linkmanService.findById(getModel().getLkm_id()));
//肯定有 就不判断了
linkmanService.delete(getModel());
return "delete";
}

/**
* 修改联系人UI
*/
public String initUpdate() {
setModel(linkmanService.findById(getModel().getLkm_id()));//设置到model的好处 默认压栈
return "initUpdate";
}

/**
* 修改联系人
*/
public String update() {
linkmanService.update(getModel());
return "update";
}

}

JSP

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>联系人列表</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
rel=stylesheet>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<SCRIPT language=javascript>
function to_page(page){
if(page){
$("#page").val(page);
}
document.customerForm.submit();
}

$(function() {
//发送adjx请求,异步获取联系人所属客户 得先获取所有客户
var url="${pageContext.request.contextPath}/customer_findAll.action";
$.post(url,function(data){//没有请求参数就不用写
$(data).each(function(){
var cid="${model.customer.cust_id}";//获得model中的客户id 其实就是上次筛选查询时自己提交的 注意表格内只是展示,不是提交的字段,从来没有name属性
if(cid==this.cust_id){
$("#customerId").append("<option value='"+this.cust_id+"' selected>"+this.cust_name+"</option>");
}else{
$("#customerId").append("<option value='"+this.cust_id+"'>"+this.cust_name+"</option>");
}
});

},"json");

})

</SCRIPT>

<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
</HEAD>
<BODY>
<FORM id="customerForm" name="customerForm" action="${pageContext.request.contextPath }/linkman_findByPage.action"
method=post>

<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
border=0></TD>
<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
height=20></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15 background="${pageContext.request.contextPath }/images/new_022.jpg"><IMG
src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
<TD vAlign=top width="100%" bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TR>
<TD class=manageHead>当前位置:联系人管理 > 联系人列表</TD>
</TR>
<TR>
<TD height=2></TD>
</TR>
</TABLE>
<TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0
width="100%" align=center border=0>
<TBODY>
<TR>
<TD height=25>
<TABLE cellSpacing=0 cellPadding=2 border=0>
<TBODY>
<TR>
<TD>联系人名称:</TD>
<TD>
<INPUT class=textbox id=sChannel2 style="WIDTH: 80px" maxLength=50 name="lkm_name" value="${model.lkm_name }">
</TD>

<TD>所属客户:</TD>
<TD>
<select name="customer.cust_id" id="customerId">
<option value="">--请选择--</option>
</select>
</TD>

<TD>
<INPUT class=button id=sButton2 type=submit value=" 筛选 " name=sButton2>
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
</TR>

<TR>
<TD>
<TABLE id=grid
style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc"
cellSpacing=1 cellPadding=2 rules=all border=0>
<TBODY>
<TR
style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none">
<TD>联系人名称</TD>
<TD>所属客户</TD>
<TD>性别</TD>
<TD>办公电话</TD>
<TD>手机</TD>
<TD>操作</TD>
</TR>
<c:forEach items="${page.beanList }" var="linkman">
<TR
style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
<TD>${linkman.lkm_name }</TD>
<TD>${linkman.customer.cust_name }</TD>
<TD>
<c:if test="${linkman.lkm_gender=='1' }"></c:if>
<c:if test="${linkman.lkm_gender=='2' }"></c:if>
</TD>
<TD>${linkman.lkm_phone }</TD>
<TD>${linkman.lkm_mobile }</TD>

<TD>
<a href="${pageContext.request.contextPath }/linkman_initUpdate?lkm_id=${linkman.lkm_id}">修改</a>
  
<a href="${pageContext.request.contextPath }/linkman_delete?lkm_id=${linkman.lkm_id}">删除</a>
</TD>
</TR>

</c:forEach>

</TBODY>
</TABLE>
</TD>
</TR>

<TR>
<TD>
<!-- 静态包含 底层就是简单拷贝代码 -->
<%@include file="/jsp/page.jsp" %>
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"><IMG
src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
border=0></TD>
<TD align=middle width="100%"
background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>

add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>添加联系人</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
rel=stylesheet>
<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script>
<SCRIPT language=javascript>
$(function() {
//发送adjx请求,异步获取所有客户 供用户下拉选
var url="${pageContext.request.contextPath}/customer_findAll.action";
$.post(url,function(data){//没有请求参数就不用写
$(data).each(function(){
var cid="${model.customer.cust_id}";//获得model中的客户id 其实就是上次筛选查询时自己提交的 注意表格内只是展示,不是提交的字段,从来没有name属性
if(cid==this.cust_id){
$("#customerId").append("<option value='"+this.cust_id+"' selected>"+this.cust_name+"</option>");
}else{
$("#customerId").append("<option value='"+this.cust_id+"'>"+this.cust_name+"</option>");
}
});

},"json");

})

</SCRIPT>

</HEAD>
<BODY>
<FORM id=form1 name=form1 action="${pageContext.request.contextPath }/linkman_save.action"
method=post>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
border=0></TD>
<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
height=20></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg><IMG
src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
<TD vAlign=top width="100%" bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TR>
<TD class=manageHead>当前位置:联系人管理 > 添加联系人</TD>
</TR>
<TR>
<TD height=2></TD>
</TR>
</TABLE>
<TABLE cellSpacing=0 cellPadding=5 border=0>
<tr>
<td>所属客户:</td>
<TD>
<select name="customer.cust_id" id="customerId" style="WIDTH: 180px" maxLength=50>
</select>
</TD>
</tr>
<TR>
<td>联系人名称:</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_name">
</td>
<td>联系人性别:</td>
<td>
<input type="radio" value="1" name="lkm_gender">
<input type="radio" value="2" name="lkm_gender">
</td>
</TR>
<TR>
<td>联系人办公电话 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_phone">
</td>
<td>联系人手机 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_mobile">
</td>
</TR>
<tr>
<td rowspan=2>
<INPUT class=button id=sButton2 type=submit value="保存 " name=sButton2>
</td>
</tr>
</TABLE>


</TD>
<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg">
<IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
border=0></TD>
<TD align=middle width="100%"
background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>

edit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>添加联系人</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
rel=stylesheet>
<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script>
<SCRIPT language=javascript>
$(function() {
//发送adjx请求,异步获取所有客户 供用户下拉选
var url="${pageContext.request.contextPath}/customer_findAll.action";
$.post(url,function(data){//没有请求参数就不用写
$(data).each(function(){
var cid="${model.customer.cust_id}";//获得model中的客户id 其实就是上次筛选查询时自己提交的 注意表格内只是展示,不是提交的字段,从来没有name属性
if(cid==this.cust_id){
$("#customerId").append("<option value='"+this.cust_id+"' selected>"+this.cust_name+"</option>");
}else{
$("#customerId").append("<option value='"+this.cust_id+"'>"+this.cust_name+"</option>");
}
});

},"json");

})

</SCRIPT>
</HEAD>
<BODY>
<FORM id=form1 name=form1 action="${pageContext.request.contextPath }/linkman_update.action"
method=post>
<!--隐藏主键千万别忘了 -->
<input type="hidden" name="lkm_id" value="${model.lkm_id }"/>

<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
border=0></TD>
<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
height=20></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg><IMG
src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
<TD vAlign=top width="100%" bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TR>
<TD class=manageHead>当前位置:联系人管理 > 修改联系人</TD>
</TR>
<TR>
<TD height=2></TD>
</TR>
</TABLE>
<TABLE cellSpacing=0 cellPadding=5 border=0>
<tr>
<td>所属客户:</td>
<TD>
<select name="customer.cust_id" id="customerId">
</select>
</TD>
<td colspan="3">
</td>
</tr>
<TR>
<td>联系人名称:</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_name" value="${model.lkm_name}" >
</td>
<td>联系人性别:</td>
<td>
<input type="radio" value="1" name="lkm_gender" <c:if test="${model.lkm_gender=='1' }">checked</c:if>>男

<input type="radio" value="2" name="lkm_gender" <c:if test="${model.lkm_gender=='2' }">checked</c:if>>女
</td>
</TR>
<TR>
<td>联系人办公电话 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_phone" value="${model.lkm_phone}">
</td>
<td>联系人手机 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="lkm_mobile" value="${model.lkm_mobile}">
</td>
</TR>
<tr>
<td rowspan=2>
<INPUT class=button id=sButton2 type=submit value="保存 " name=sButton2>
</td>
</tr>
</TABLE>


</TD>
<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg">
<IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
border=0></TD>
<TD align=middle width="100%"
background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>