【问题标题】:Jsf2 primefaces menubar from database来自数据库的 Jsf2 primefaces 菜单栏
【发布时间】:2015-05-21 03:48:10
【问题描述】:

我是 Java 新手。我正在从数据库表生成一个菜单栏,我能够生成三个级别的子菜单,但我想知道如果有一天我们决定添加一个级别怎么办。我知道我的菜单生成逻辑很糟糕,但我找不到在primefaces上生成孩子的逻辑。这是我查询的 sql 结果。任何人都可以帮助获得解决方案吗?或者有什么想法可以创建一个循环而不是重复 2 个查询?任何教程或任何源代码示例都将不胜感激。

这是我生成 3 级菜单的源代码

connexion c1 = new connexion();
    Connection con = c1.getConnected();

    PreparedStatement ps = con
            .prepareStatement("SELECT * FROM menu_options where parent_option_id is null");

    // get first level menu options from database
    ResultSet result = ps.executeQuery();

    while (result.next()) {
        DefaultSubMenu firstSubmenu = new DefaultSubMenu(
                result.getString("name"));


        PreparedStatement ps2 = con
                .prepareStatement("SELECT * FROM menu_options where parent_option_id="
                        + result.getInt("id"));

        // get menu second level options from database
        ResultSet result2 = ps2.executeQuery();
        DefaultMenuItem item = null;

        while (result2.next()) {

            PreparedStatement ps3 = con
                    .prepareStatement("SELECT * FROM menu_options where parent_option_id="
                            + result2.getInt("id"));

            // get menu third level options from database
            ResultSet result3 = ps3.executeQuery();
            int rowcount = 0;
            if (result3.last()) {
                rowcount = result3.getRow();
                result3.beforeFirst();
            }

            if (rowcount == 0) {
                item = new DefaultMenuItem(result2.getString("name"));
                item.setUrl(result2.getString("url"));
                item.setIcon("ui-icon-arrowreturnthick-1-e");
                // item.setId("fils");
                firstSubmenu.addElement(item);

            } else {
                DefaultSubMenu firstSubmenu2 = null;
                firstSubmenu2 = new     DefaultSubMenu(result2.getString("name"));
                while (result3.next()) {

                    item = new DefaultMenuItem(result3.getString("name"));
                    item.setUrl(result3.getString("url"));
                    item.setIcon("ui-icon-arrowreturnthick-1-e");
                    // item.setId("fils");
                    firstSubmenu2.addElement(item);

                }
                firstSubmenu.addElement(firstSubmenu2);
            }
        }
        menu.addElement(firstSubmenu);
    }

【问题讨论】:

  • 好吧,我知道我要实现一个递归方法,你能不能给我一个例子,而不是扮演堆栈溢出总裁的角色。
  • 好吧,对不起,我不是在寻找如何去做,而是关于如何根据我的源代码实现它的想法,我知道我必须使用递归方法,但如何去做,我不知道,我试过了,但没有成功,这就是我在这里发帖的原因

标签: java mysql jsf jsf-2 primefaces


【解决方案1】:

一个可能的解决方案可能是实现这些方法:

// Returns the item with no parent
private List<Item> searchParentlessItems();

// Returns the item with the given item as parent
private List<Item> searchItemChildren(Item item);

// Returns the children count
private Long countItemChildren(Item item);

// Build a SubMenu for the specified item
private SubMenu createSubMenu(Item item);

// Build a MenuItem for the specified item
private MenuItem createMenuItem(Item item);

那么生成可能看起来像

private MenuModel createMenuModel() {
    MenuModel model = new DefaultMenuModel();
    List<Item> rootItems = searchParentlessItems();
    for (Item item : rootItems) {
        boolean hasChildren = countItemChildren(item) > 0;
        if (hasChildren) {
            SubMenu subMenu = createSubMenu(item);
            model.addElement(subMenu);
            appendChildren(subMenu, item);
        } else {
            MenuItem menuItem = createMenuItem(item);
            model.addElement(menuItem);
        }
    }
}

private void appendChildren(MenuGroup parentMenuItem, Item parentItem) {
    List<Item> children = searchItemChildren(parentItem);
    for (Item child : children) {
        boolean hasChildren = countItemChildren(child) > 0;
        if (hasChildren) {
            SubMenu subMenu = createSubMenu(child);
            parentMenuItem.addElement(subMenu);
            appendChildren(subMenu, child);
        } else {
            MenuItem menuItem = createMenuItem(child);
            parentMenuItem.addElement(menuItem);
        }
    }
}

【讨论】:

  • 谢谢你救了我的命。
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多