A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

新增客户==数据字典==
  • 用小海豚执行base_dict.sql
  • 得到一张新的表---==数据字典表==
  • 作用:用于枚举项目中有限个数的字典项
  • 在customer表中,像信息来源,用户等级,用户类型等,以前都是普通的文本输入框.但是我们可以设置成可以从有限的字段中选择出来的
  • 数据字典表可以把项目中的所有枚举统一在一张表中

创建BaseDict对象
  • 数据字典表不需要维护关系,所以可以不创建集合存储多的一方的集合

"BaseDict.class"
public class BaseDict {
    private String dict_id;
    private String dict_type_code;
    private String dict_type_name;
    private String dict_item_name;
    private String dict_item_code;
    private String dict_memo;
    private Integer dict_sort;
    private Character dict_enable
   
    "set and get method"
}
  • 主键生成策略用手动输入assigned和uuid都可以
    • 不需要在引入映射文件,spring已经自动引入了包


<?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 package="cn.itcast.domain" >
    <class name="BaseDict" table="base_dict" >
        <id name="dict_id"  >
            <generator class="assigned"></generator>
        </id>
        <property name="dict_type_code" ></property>
        <property name="dict_type_name" ></property>
        <property name="dict_item_name" ></property>
        <property name="dict_item_code" ></property>
        <property name="dict_memo" ></property>
        <property name="dict_sort" ></property>
        <property name="dict_enable" ></property>
    </class>
</hibernate-mapping>
  • 在customer.class中添加字典表对象(3个对象)

<!-- 多对一 -->
<many-to-one name="cust_source" column="cust_source" class="BaseDict" ></many-to-one>
<many-to-one name="cust_industry" column="cust_industry" class="BaseDict" ></many-to-one>
<many-to-one name="cust_level" column="cust_level" class="BaseDict" ></many-to-one>ajax加载数据字典下拉选
  • Action中返回JSON到浏览器:
    • ServletActionContext.getResponse().getWriter().write();
    • return null;//告诉struts2不进行结果处理


@Override
public String execute() throws Exception {
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(BaseDict.class);
    detachedCriteria.add(Restrictions.eq("dict_type_code", dict_type_code));
    List<BaseDict> list = baseDictService.getListByDictTypeCode(detachedCriteria);
    Gson gson = new Gson();
    String json = gson.toJson(list);
    HttpServletResponse response = ServletActionContext.getResponse();
    response.setContentType("text/json;charset=utf-8");
    response.getWriter().write(json);
    return null;
}"service直接调用BaseDaoImpl的方法"
@Override
public List<BaseDict> getListByDictTypeCode(DetachedCriteria detachedCriteria) {
    List<BaseDict> list = baseDictDao.getList(detachedCriteria);
    return list;
}ajax加载数据字典下拉选前台js部分
  • js最好写一行测一行
  • 使用jQuery就是打开文档复制粘贴的过程

//使用ajax加载数据字典,生成select
//参数1: 数据字典类型 (dict_type_code)
//参数2: 将下啦选放入的标签id
//参数3: 生成下拉选时,select标签的name属性值
//参数4: 需要回显时,选中哪个option
function loadSelect(typecode,positionId,selectname,selectedId){
    //1 创建select对象,将name属性指定
    var $select =  $("<select name="+selectname+" ></select>");
    //2 添加提示选项
    $select.append($("<option value='' >---请选择---</option>"));
    //3 使用jquery 的ajax 方法,访问后台Action
    $.post("${pageContext.request.contextPath}/BaseDictAction", { dict_type_code:typecode},
    function(data){
        //遍历
        //4 返回json数组对象,对其遍历
        $.each( data, function(i, json){
        // 每次遍历创建一个option对象
        var $option = $("<option value='"+json['dict_id']+"' >"+json["dict_item_name"]+"</option>");
            
        if(json['dict_id'] == selectedId){
        //判断是否需要回显 ,如果需要使其被选中
            $option.attr("selected","selected");
        }
        //并添加到select对象
        $select.append($option);
    });
    },"json");
        
    //5 将组装好的select对象放入页面指定位置
    $("#"+positionId).append($select);
}保存客户后台逻辑
  • 对象驱动保存属性

public String add() throws Exception {
    //1 调用Service,保存Customer对象
    cs.save(customer);
    //2 重定向到客户列表Action
    return "toList";
}
  • 在service中调用dao分别取出3个数据字典对象设置到customer里,然后再保存customer
  • 我们从action传给service的customer中,3个数字字典对象都有id,是游离状态的

@Override
public void save(Customer customer) {
    "1 维护Customer与数据字典对象的关系,由于struts2参数封装,会将参数封装到数据字典的id属性."
    "那么我们无需手动维护关系"
    "2 调用Dao保存客户"
    cd.saveOrUpdate(customer);
}扩展-struts2文件上传
  • 之前用的是FileUpLoad来进行文件上传
  • 文件上传有4个要求
    • input type=file
    • 有name属性
    • post提交
    • 表单类型是: enctype为多段式提交(multipart/form-data)

  • 后台代码

"上传的文件会自动封装到File对象"
"在后台提供一个与前台input type=file组件 name相同的属性"
private File photo;
"在提交键名后加上固定后缀FileName,文件名称会自动封装到属性中"
private String photoFileName;
"在提交键名后加上固定后缀ContentType,文件MIME类型会自动封装到属性中 "
private String photoContentType;

public String add() throws Exception {
    if(photo!=null){
        System.out.println("文件名称:"+photoFileName);
        System.out.println("文件类型:"+photoContentType);
        //将上传文件保存到指定位置
        photo.renameTo(new File("E:/upload/haha.jpg"));
    }
   
    //---------------------------------------------------------------------
    //1 调用Service,保存Customer对象
    cs.save(customer);
    //2 重定向到客户列表Action
    return "toList";
}

"set和get方法"扩展-struts2文件上传原理
  • struts2有一个fileupload拦截器
  • 拦截器会判断是否是多段式上传,如果不是多段式就放行
  • 如果是多段式就获取信息放入集合中
  • 然后拼接字符串,最后放入actionContext中
  • 然后在params拦截器赋值

客户修改
  • 在列表页面对用户进行修改
  • 根据id获得customer对象,然后回写到页面
  • 用add.jsp同时用于添加和修改操作

public String toEdit() throws Exception {
    //1调用Service根据id获得客户对象
    Customer c = cs.getById(customer.getCust_id());
    //2 将客户对象放置到request域,并转发到编辑页面
    ActionContext.getContext().put("customer", c);
    return "edit";
}<s:property value="#customer==null?'添加':'修改'" />客户
  • BaseDao中hibernate的saveOrUpDate方法,在页面中加一个隐藏域来存放id


1 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马