之前接觸到一個無限分類,這次用到了,就自己寫了一下,貼出來供參考。
數據庫類別表的設計以及數據
-- ----------------------------
-- 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>
至此 ,商品的無限分類 以及前端顯示 以及告一段落,待續添加分類 以及邏輯判斷,核心代碼以及思路會貼上。轉載請聲明,謝謝。