最近的一个项目。用到了struts2的树形菜单。刚开始觉得有些难。在网上找了一些资料。不过好像都没有一个是特别的符合自己的需求。静态的我就不说了。网上多的是。这里就说说动态树的构造吧。
谈struts2动态树必定要谈到<s:tree/>标签,那先我还是谈谈这标签的一些属性。因为在构造动态树的时候。这些属性是相当重要的。
<s:tree rootNode="root"
nodeIdProperty="id"
nodeTitleProperty="name"
childCollectionProperty="childrens"
showRootGrid="true"
showGrid="true"
theme="bgtheme"
id="nodeId">
</s:tree>
rootNode属性是树形菜单的根。这个对象的构造需要有些特别(也是树形菜单每个节点),必须包涵nodeIdProperty,nodeTitleProperty属性的值(”Id“和“name”)的属性;和childCollectionProperty属性值(childrens)的“getChildrens()”方法;
比如这样一个对象:
public class StrutsTreeNode {
//父子结点之间的连接符
public static final String link = "--";
//本节点ID
private int id;
//父节点ID,为0表示第一层结点
private int parentId;
//父节点,为null表示第一层结点
private StrutsTreeNode parent;
//结点名
private String name;
//结点全名
private String nameAll;
//结点使用图片文件名,为空用缺省的
private String iconFile;
//结点点击对应的URL
private String url;
//结点点击对应的target
private String target;
//结点所在层数
private int layers = 0;
//是否需要check
private boolean bckeck = false;
//是否check,0-否,1-是
private int checkValue = 0;
//是否固定选择项,0-否,1-是
private int fixup = 0;
//数据
private String data;
private List<StrutsTreeNode> childrens = new ArrayList<StrutsTreeNode>();
这里的字段有很多。其他的一些并不是必须的。当然 setter 和getter是必不可少的了。
有了这个对象,那么如何更数据库的数据联系起来呢。那么就需要我们去将数据库里的数据构造成这样要的一个对象了。就拿前段时间这个项目中数据来说吧。
public class Terrain {
private long terrainId;
private long fatherTerrainId;
private String terrainName;
private String fullName;
private String terrainDesc;
}
这个是一个持久化类。这个类中最重要的两个属性就是terrainId,fatherTerrainId。因为他们是组合成树需要的关系,fatherTerrainId应用的是其他的terrinId;比如”成都“fatherTerrainId必定对应着“四川”的terrainId
这个之间的关系想必大家都能够明白。所以就此打住。
最关键的一步就是如果把Terrain构造成一个 StrutsTreeNode :
最理想的方式就是让他们都同时实现一个接口:
public interface ITreeNode {
/**
* 转换对象为树结点
* @return StrutsTreeNode
*/
public StrutsTreeNode toTreeNode();
}
在Terrain里
public StrutsTreeNode toTreeNode() {
StrutsTreeNode treenode = new StrutsTreeNode();
treenode.setId((int)getTerrainId());
treenode.setParentId((int) getFatherTerrainId());
treenode.setName(getTerrainName());
return treenode;
}
在StrutsTreeNode 里
public StrutsTreeNode toTreeNode() {
return this;
}
现在也不过只得到了Id,parent,Name;还没有的获得childrens这个列表啊。这个嘛就要单独获得了哟。这个应该不难吧。
而在Action中必须定义一个 StrutsTreeNode root对象,在获得root钱取得他的childrens的对象列表。这样传到页面
实列下载:
http://cbywxy.iteye.com/admin/blogs/309511