Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php到java-treeview程序_Java_Php - Fatal编程技术网

Php到java-treeview程序

Php到java-treeview程序,java,php,Java,Php,我是java新手,正在尝试一个打印多级菜单的程序。通过搜索,我得到了一个php程序,但我需要用java重写php代码。有人能帮我吗? PHP程序 <?php $servername = "localhost"; $dbname = "crudangularjs"; $username = "root"; $password = ""; $conn = new mysqli($servername, $username, $password, $dbname); $sql = "

我是java新手,正在尝试一个打印多级菜单的程序。通过搜索,我得到了一个php程序,但我需要用java重写php代码。有人能帮我吗? PHP程序

    <?php
$servername = "localhost";
$dbname = "crudangularjs";
$username = "root";
$password = "";

$conn = new mysqli($servername, $username, $password, $dbname);

$sql = "SELECT * FROM menus";
$res = mysqli_query($conn, $sql);

//iterate on results row and create new index array of data
while( $row = mysqli_fetch_assoc($res) ) {
$data[] = $row;
}
$itemsByReference = array();


// Build array of item references:
foreach($data as $key => $item) {

$itemsByReference[$item['id']] = $item;
///echo ('<pre>');
    //print_r($itemsByReference[$item['id']]);
// Children array:
$itemsByReference[$item['id']]['nodes'] = array();
// Empty data class (so that json_encode adds "data: {}" )
//$itemsByReference[$item['id']]['data'] = new StdClass();
}
// Set items as children of the relevant parent item.
foreach($data as $key => $item)
if($item['parent'] != '0' && isset($itemsByReference[$item['parent']]))
$itemsByReference [$item['parent']]['nodes'][] = $item;
// Remove items that were added to parents elsewhere:
foreach($data as $key => $item) {
if($item['parent'] && isset($itemsByReference[$item['parent']]))
unset($data[$key]);
}
// Encode:
echo json_encode($data);
?>

我试图将这些代码转换成java程序,如下所示

...
}

public class listItem {
    String id;
    String label;
    String link;
    String parent;
    public listItem(String id, String label, String link, String parent) {
    ...
    public String getId() {
    ...
    public String setLabel(String label) {
    ...
 }
Class.forName(driverName);
Connection conn=DriverManager.getConnection(url、用户名、密码);
语句st=conn.createStatement();
结果集rs=st.executeQuery(“从菜单中选择*);
ResultSetMetaData rsmd=rs.getMetaData();
列表=新的ArrayList();
while(rs.next()){
//System.out.println(rs.getString(“标签”);
添加(rs.getString(“id”);
添加(rs.getString(“标签”);
添加(rs.getString(“链接”);
添加(rs.getString(“父”);
}
//int指数=0;
用于(字符串项:列表){
系统输出打印项次(项);
}

看起来您需要某种类型的数据映射对象。差不多

Class.forName(driverName);
Connection conn = DriverManager.getConnection(url, username, password);
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("SELECT * FROM menus");
ResultSetMetaData rsmd = rs.getMetaData();
List<listItem> list = new ArrayList<>();
while(rs.next()){
    list.add(new listItem(rs.getString("id"),rs.getString("label"),rs.getString("link"), rs.getString("parent"));
}
那么您的代码块看起来更像:

...
<GlobalNamingResources>
    ...
    <Resource auth="Container"
            type="javax.sql.DataSource"
            name="jdbc/mydb"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost/crudangularjs"
            maxActive="10"
            maxIdle="5"
            validationQuery="SELECT 1"
            testOnBorrow="true"
            testWhileIdle="true"
            timeBetweenEvictionRunsMillis="10000"
            minEvictableIdleTimeMillis="60000"
            username="root"
            password=""/>
</GlobalNamingResources>
....
Class.forName(driverName);
Connection conn=DriverManager.getConnection(url、用户名、密码);
语句st=conn.createStatement();
结果集rs=st.executeQuery(“从菜单中选择*);
ResultSetMetaData rsmd=rs.getMetaData();
列表=新的ArrayList();
while(rs.next()){
添加(新列表项(rs.getString(“id”)、rs.getString(“标签”)、rs.getString(“链接”)、rs.getString(“父项”);
}

首先,在tomcat安装的conf/server.xml中添加一个数据源:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/myapp">
    <ResourceLink global="jdbc/mydb" name="jdbc/mydb"
            type="javax.sql.DataSource"/>
</Context>
现在,您需要声明一个类来表示菜单项:

Map<String,MenuItem> items = new HashMap<>();
Map<String,String> parentMap = new HashMap<>();
// Fill the maps
try (Connection cnt = openConnection();
        PreparedStatement stmt = cnt.prepareStatement("SELECT * FROM menus");
        ResultSet rs = stmt.executeQuery()) {
    while (rs.next()) {
        MenuItem item = new MenuItem();
        item.setId(rs.getString("id"));
        item.setLabel(rs.getString("label"));
        item.setLink(rs.getString("link"));
        items.put(item.getId(), item);
        String parent = rs.getString("parent");
        if (parent != null && !parent.equals("0")) {
            parentMap.put(item.getId(), parent);
        }
    }
}
// Resolve the hierarchy
for (Map.Entry<String,String> e: parentMap.entrySet()) {
    MenuItem item = items.get(e.getKey());
    String parentId = e.getValue();
    MenuItem parent = items.get(parentId);
    item.setParent(parent);
    if (parent != null) {
        parent.addChild(item);
    }
}
// Remove all items that have a parent
for (String id: parentMap.keySet()) {
    items.remove(id);
}
更新


请注意,如果您想保留项目的顺序,您可以使用
LinkedHashMap
s而不是
HashMap

这段代码在webapp中吗?您使用的是servlet容器吗?是的,这段代码在webapp中。在tomcat服务器中吗?是的,它在tomcat服务器中谢谢您的回复。我正在寻找foreach循环中的代码。您可以吗请告诉我或让我知道如何用Java编写逻辑非常感谢您的耐心。当我尝试转换“项目”时它显示了java.lang。StackOverflowError@user2121148如果您正在生成json,则不应同时生成父级和子级。如果您不需要指向父级的链接,则可以删除该字段或将其声明为瞬态。但我需要将父级和子级响应作为json发送给frontend使其显示为treeview。@user2121148不可能:JSON不能引用其他对象。@user2121148但您可以发送父对象的id。
Connection openConnection() {
    Context context = new InitialContext();    
    return (Connection)context.lookup("java:comp/env/jdbc/mydb");
}
public class MenuItem {
    private String id;
    private String label;
    private String link;
    private MenuItem parent;
    private final List<MenuItem> children = new ArrayList<>();

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public MenuItem getParent() {
        return parent;
    }

    public void setParent(MenuItem parent) {
        this.parent = parent;
    }

    public List<MenuItem> getChildren() {
        return new ArrayList<>(children);
    }

    public void addChild(MenuItem child) {
        children.add(child);
    }
}
Map<String,MenuItem> items = new HashMap<>();
Map<String,String> parentMap = new HashMap<>();
// Fill the maps
try (Connection cnt = openConnection();
        PreparedStatement stmt = cnt.prepareStatement("SELECT * FROM menus");
        ResultSet rs = stmt.executeQuery()) {
    while (rs.next()) {
        MenuItem item = new MenuItem();
        item.setId(rs.getString("id"));
        item.setLabel(rs.getString("label"));
        item.setLink(rs.getString("link"));
        items.put(item.getId(), item);
        String parent = rs.getString("parent");
        if (parent != null && !parent.equals("0")) {
            parentMap.put(item.getId(), parent);
        }
    }
}
// Resolve the hierarchy
for (Map.Entry<String,String> e: parentMap.entrySet()) {
    MenuItem item = items.get(e.getKey());
    String parentId = e.getValue();
    MenuItem parent = items.get(parentId);
    item.setParent(parent);
    if (parent != null) {
        parent.addChild(item);
    }
}
// Remove all items that have a parent
for (String id: parentMap.keySet()) {
    items.remove(id);
}