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>

至此 ,商品的無限分類 以及前端顯示 以及告一段落,待續添加分類 以及邏輯判斷,核心代碼以及思路會貼上。轉載請聲明,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章