Php到java-treeview程序
我是java新手,正在尝试一个打印多级菜单的程序。通过搜索,我得到了一个php程序,但我需要用java重写php代码。有人能帮我吗? PHP程序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 = "
<?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);
}