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>
至此 ,商品的无限分类 以及前端显示 以及告一段落,待续添加分类 以及逻辑判断,核心代码以及思路会贴上。转载请声明,谢谢。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。