参考
http://www.csdn.net/develop/read_article.asp?id=17732
http://www.csdn.net/develop/read_article.asp?id=17732
解决方案 »
- 关于调用windows文件浏览框的问题
- 更新数据库,如果name0/name1/name2为空时,就不进入更新页面,要怎么做啊
- 哪位仁兄知道长天科技(南京研发中心)的java笔试题啊? 在线等!!!
- JTSL架构包和标签对应
- class问题 请教
- class该放到哪里 or jsp文件怎么改?
- 我不信?
- jsp 可否在iis中运行?
- 如何防止用户盗用页面,修改后再向web server提交?
- 用URL对象如何表示servlet的路径??
- 如何在一个链接上设定一个参数,点击它后将参数传到它链接的那个jsp页面中!!!
- 请教:象sohu体育文字直播,那样的部分刷屏技术,如何解决啊!实现给你100分
package peiyang.priv;import util.db.DB;
import sun.jdbc.rowset.CachedRowSet;
import util.string.StringUtil;
import java.util.ArrayList;public class MenuTree {
public ArrayList tree = new ArrayList();
public ArrayList cach = new ArrayList();
private DB mydb = new DB();
/**
* 取得子菜单数据集(递归调用)
*/
public void getChildMenu(int fatherId) throws java.sql.
SQLException {
CachedRowSet rs = new CachedRowSet();
for (int i=0;i<cach.size();i++){
Menu menuItems=(Menu)cach.get(i);
if (menuItems.getFatherId()==fatherId){
Menu menuItem = new Menu();
menuItem.setMenuId(menuItems.getMenuId());
menuItem.setMenuName(menuItems.getMenuName());
menuItem.setMenuLevel(menuItems.getMenuLevel());
menuItem.setMenuUrl(menuItems.getMenuUrl());
menuItem.setFatherId(menuItems.getFatherId());
tree.add(menuItem);
getChildMenu(menuItem.getMenuId());
}
} }
public void getUserMenu(int fatherId, String userId) throws java.sql.
SQLException {
try {
for (int i=0;i<cach.size();i++){
Menu menuItems=(Menu)cach.get(i);
if (menuItems.getFatherId()==fatherId){
Menu menuItem = new Menu();
menuItem.setMenuId(menuItems.getMenuId());
menuItem.setMenuName(menuItems.getMenuName());
menuItem.setMenuLevel(menuItems.getMenuLevel());
menuItem.setMenuUrl(menuItems.getMenuUrl());
menuItem.setFatherId(menuItems.getFatherId());
tree.add(menuItem);
getUserMenu(menuItem.getMenuId(), userId);
}
}
}
catch (Exception e) {
System.out.println("getUserMenu1"+e.getMessage());
}
} public void initial(String userId) {
CachedRowSet rs = null;
try {
String sql = "select * from v_Menu where userId='" + userId
+ "' order by menuOrder";
//System.out.println(sql);
rs = mydb.executeQuery(sql);
while (rs.next()) {
Menu menuItem = new Menu();
menuItem.setMenuId(rs.getInt("menuId"));
menuItem.setMenuName(rs.getString("menuName"));
menuItem.setMenuLevel(rs.getInt("menuLevel"));
menuItem.setFatherId(rs.getInt("fatherId"));
menuItem.setMenuUrl(rs.getString("menuUrl"));
cach.add(menuItem);
}
}
catch (Exception e) {
System.out.println("initial:"+e.getMessage());
}
} public void initial() {
CachedRowSet rs = null;
try {
String sql = "select * from Menu order by menuOrder";
//System.out.println(sql);
rs = mydb.executeQuery(sql);
while (rs.next()) {
Menu menuItem = new Menu();
menuItem.setMenuId(rs.getInt("menuId"));
menuItem.setMenuName(rs.getString("menuName"));
menuItem.setMenuLevel(rs.getInt("menuLevel"));
menuItem.setFatherId(rs.getInt("fatherId"));
menuItem.setMenuUrl(rs.getString("menuUrl"));
cach.add(menuItem);
}
}
catch (Exception e) {
System.out.println("initial:"+e.getMessage());
}
} public void destroy() {
cach.clear();
} public static void main(String args[]) {
MenuTree mytree = new MenuTree();
mytree.initial("1");
try {
mytree.getUserMenu(0, "1");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
for (int i = 0; i < mytree.tree.size(); i++) {
Menu myMenu = (Menu) mytree.tree.get(i);
System.out.println(myMenu.getMenuName());
}
}
}
这样的算法,在用户登陆的时候速度极慢,我最开始的时候就是用的这样的算法。在递归的时候查询数据库。一个彩旦刷新要3秒钟,(彩旦表里面才100条记录)
这样的算法如果数据库io一次10豪秒,那么便利完所有的记录要nlogn*10,
所以,我采用了把所有的数据库记录都读到一个cach里面。然后在内存中便利。彩旦打开的时间几乎为0。
后天添加了比较强的父子节点关系,才比较顺利的实现了2400多个节点在20s左右显示出来,为什么,因为2400多个节点中都包含了一个checkbox,如果一个页面上包含了2000左右的checkbox,如果要全部遍历一边也需要11s左右, 我咨询过IE开发小组的人员,他们说这应该是一个没有办法的事情,目前的IE中都是这样的情况。关于源代码,暂时我无法给你,如果你需要,联系我,我可以在国庆以后给你,因为代码在公司的服务器上。:)