java代码实现商品类别的无限级分类显示

之前接触到一个无限分类,这次用到了,就自己写了一下,贴出来供参考。
数据库类别表的设计以及数据

 -- ----------------------------
-- Table structure for msg_type
-- ----------------------------
CREATE TABLE `msg_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `typename` varchar(50) DEFAULT NULL,
  `remarks` varchar(200) DEFAULT NULL,
  `parentid` int(11) DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
INSERT INTO `msg_type` VALUES (‘1‘, ‘苗木‘, null, ‘0‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘2‘, ‘花卉‘, null, ‘0‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘3‘, ‘景观小品‘, null, ‘0‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘4‘, ‘松树‘, null, ‘1‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘5‘, ‘落叶松‘, null, ‘4‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘6‘, ‘雪松‘, null, ‘4‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘7‘, ‘杨树‘, null, ‘1‘, ‘1‘);
INSERT INTO `msg_type` VALUES (‘8‘, ‘速生杨‘, null, ‘7‘, ‘1‘);

数据库类别表对应的实体

/**
 * 信息类别实体
 * @Description TODO
 * @author zk
 * @version 1.0
 * @date 2015-4-5 下午5:53:48
 */
public class MessageType {
            private int id;
            private String typename ;
            private String remarks ;
            private int parentid;
            private int state;
            public int getParentid() {
            return parentid;
    }
    public void setParentid(int parentid) {
        this.parentid = parentid;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTypename() {
        return typename;
    }
    public void setTypename(String typename) {
        this.typename = typename;
    }
    public String getRemarks() {
        return remarks;
    }
    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }

}  

类别实体中间处理

/**
* 类别 显示中间 处理
* 
* @Description TODO
* @author zk
* @version 1.0
* @date 2015-4-11 上午10:56:03
*/
public class MessageTypeLev extends MessageType {
    private int lev;
    public int getLev() {
        return lev;
    }
    public void setLev(int lev) {
        this.lev = lev;
    }

    /**
         * 类型的转换
         * @param messageType
     */
public void from(MessageType messageType) {
    this.setId(messageType.getId());
    this.setParentid(messageType.getParentid());
    this.setRemarks(messageType.getRemarks());
    this.setState(messageType.getState());
    this.setTypename(messageType.getTypename());
}
   }

控制器请求数据库核心

----------------------核心部分------------------------------
         //调用业务层获取类别表的全部数据
        MessageTypeService ms = new MessageTypeService();
        List<MessageType> mlist = ms.findAll();
        //最终需要得到的数据【经过无限分类 排序之后的】
        List<MessageTypeLev> backList = new ArrayList<MessageTypeLev>();
        //对mlist集合进行排序 并把排序之后报到到backlist中
        recMessageType(backList, mlist, 0, 0);
        //对排序后的数据 再次处理 并且输出
        for (MessageTypeLev messageType : backList) {
            messageType.setTypename(setNBSP(messageType)
                    + messageType.getTypename());
            System.out.println(messageType.getTypename());
            }
        ------------------------核心部分----------------------------
      /**
     * 根据层级的关系处理 类别名称显示
     * @param messageType
     * @return
     */
    private String setNBSP(MessageTypeLev messageType) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < messageType.getLev(); i++) {
            sb.append("---");
        }
        return sb.toString();
    }
/**
 * 对无限分类集合 数组进行排序
 * 
 * @param mlist 要排序的集合
 * @param id    父id 为0开始 
 * @param lev 层数 为了显示缩进 而添加的
 */
public void recMessageType(List<MessageTypeLev> bList,
    List<MessageType> mlist, int id, int lev) {
    for (MessageType messageType : mlist) {
        if (messageType.getParentid() == id) {
            MessageTypeLev messageTypeLev = new MessageTypeLev();
        /*为了显示层数 而 又封装了一个MessageTypeLev 类型,而且在继承原来MessageType 还做了一下转换 [messageTypeLev.from(messageType);
 ]此处方法觉得有点 小小的不可取 ,以后解决 ,目前先解决问题再说 */
            messageTypeLev.from(messageType);
            messageTypeLev.setLev(lev);
            bList.add(messageTypeLev);
            recMessageType(bList, mlist, messageType.getId(), lev + 1);
        }
    }
}

上面输出运行效果

    苗木
    ---松树
------落叶松
------雪松
---杨树
------速生杨
花卉
景观小品

前台界面显示处理,一般保存到request域对象里面 ,前台取值

下拉框的显示

    <select name="typeid" width="40">
    <option value="">--请选择--</option>
    <c:forEach var ="category" items="${backlist }">
    <option value="${category.id }">${category.typename }</option>
    </c:forEach>
    </select>

至此 ,商品的无限分类 以及前端显示 以及告一段落,待续添加分类 以及逻辑判断,核心代码以及思路会贴上。转载请声明,谢谢。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。