Struts2中可以通過(guò)s:tree標簽輕松的實(shí)現一個(gè)樹(shù)狀結構。
下面是一個(gè)s:tree的具體實(shí)現的例子。數的結構用mysql數據庫類(lèi)維護。
1.創(chuàng )建數據庫表
DROP TABLE IF EXISTS CATEGORY_MASTER ;
CREATE TABLE CATEGORY_MASTER(
CATEGORY_ID int auto_increment NOT NULL,
CATEGORY_NAME varchar(50) NOT NULL,
PARENT_CATEGORY_ID int DEFAULT -1 NOT NULL,
PRIMARY KEY (CATEGORY_ID)
)
2.創(chuàng )建數據庫連接類(lèi)
3.創(chuàng )建Category.java,用來(lái)保存DB數據和頁(yè)面提交的數據
package s2.ex.data;
public class Category {
private int id;
private String name;
private Category[] children;
private int parentNodeId;
public Category[] getChildren() {
return children;
}
public void setChildren(Category[] children) {
this.children = children;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getParentNodeId() {
return parentNodeId;
}
public void setParentNodeId(int parentNodeId) {
this.parentNodeId = parentNodeId;
}
}
4.創(chuàng )建對數據庫表category_master操作的類(lèi)
package s2.ex.svc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import s2.ex.data.Category;
import s2.ex.db.DBConn;
public class CategoryService {
private static CategoryService instance;
private CategoryService() {
}
public static CategoryService getInstance() {
if (instance == null){
instance = new CategoryService();
}
return instance;
}
public Category[] getCategoryList() {
Connection conn = DBConn.getConnection();
final String SQL = "SELECT * FROM category_master";
ResultSet rs = null;
try {
rs = conn.createStatement().executeQuery(SQL);
ArrayList<Category> aryResult = new ArrayList<Category>();
while (rs.next()) {
Category category = new Category();
category.setId(rs.getInt("CATEGORY_ID"));
category.setName(rs.getString("CATEGORY_NAME"));
aryResult.add(category);
}
Category[] result = new Category[aryResult.size()];
result = aryResult.toArray(result);
return result;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null){
rs.close();
}
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
public boolean addNewTreeNode(Category category) {
Connection conn = DBConn.getConnection();
final String SQL = "INSERT INTO category_master(CATEGORY_NAME,PARENT_CATEGORY_ID) VALUES(?,?)";
PreparedStatement pre = null;
try {
pre = conn.prepareStatement(SQL);
pre.setString(1, category.getName());
pre.setInt(2, category.getParentNodeId());
int result = pre.executeUpdate();
if (result >= 0) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pre != null){
pre.close();
}
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
public Category[] getAllCategory() {
Connection conn = DBConn.getConnection();
final String SQL = "SELECT * FROM category_master where PARENT_CATEGORY_ID=-1";
ResultSet rs = null;
try {
rs = conn.createStatement().executeQuery(SQL);
ArrayList<Category> aryResult = new ArrayList<Category>();
while (rs.next()) {
Category category = new Category();
category.setId(rs.getInt("CATEGORY_ID"));
category.setName(rs.getString("CATEGORY_NAME"));
category.setChildren(this.getChildren(category.getId()));
aryResult.add(category);
}
Category[] result = new Category[aryResult.size()];
result = aryResult.toArray(result);
return result;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null){
rs.close();
}
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
public Category[] getChildren(int categoryId) {
Connection conn = DBConn.getConnection();
final String SQL = "SELECT * FROM category_master where PARENT_CATEGORY_ID=?";
PreparedStatement pre = null;
ResultSet rs = null;
try {
pre = conn.prepareStatement(SQL);
pre.setInt(1, categoryId);
rs = pre.executeQuery();
ArrayList<Category> aryResult = new ArrayList<Category>();
while (rs.next()) {
Category category = new Category();
category.setId(rs.getInt("CATEGORY_ID"));
category.setName(rs.getString("CATEGORY_NAME"));
category.setChildren(this.getChildren(category.getId()));
aryResult.add(category);
}
Category[] result = new Category[aryResult.size()];
result = aryResult.toArray(result);
return result;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null){
rs.close();
}
if (pre != null){
pre.close();
}
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
}
上面getChildren方法里面用到了遞歸。
5.創(chuàng )建action類(lèi)
package s2.ex.action;
import s2.ex.data.Category;
import s2.ex.svc.CategoryService;
import com.opensymphony.xwork2.ActionSupport;
public class SimpleTreeAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private Category root;
private Category[] parentNodeIds;
private Category editCategory;
public String displayTree() {
root = new Category();
root.setId(-1);
root.setName("root");
root.setChildren(CategoryService.getInstance().getAllCategory());
return SUCCESS;
}
public Category getRoot() {
return root;
}
public void setRoot(Category root) {
this.root = root;
}
public String goTreeEdit(){
this.parentNodeIds = CategoryService.getInstance().getCategoryList();
return SUCCESS;
}
public Category[] getParentNodeIds() {
return parentNodeIds;
}
public void setParentNodeIds(Category[] parentNodeIds) {
this.parentNodeIds = parentNodeIds;
}
public Category getEditCategory() {
return editCategory;
}
public void setEditCategory(Category editCategory) {
this.editCategory = editCategory;
}
public String saveTreeNode() {
if (CategoryService.getInstance().addNewTreeNode(this.editCategory)){
return SUCCESS;
}else {
return INPUT;
}
}
}
6.創(chuàng )建TreeIndex.jsp,用來(lái)顯示樹(shù)
<%@ page contentType="text/html; charset=UTF-8" %>
<%@page pageEncoding="utf-8" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Tree</title>
<s:head theme="ajax" debug="true" />
</head> <body>
<script language="JavaScript">
function treeNodeSelected(arg) {
alert("id["+arg.source.widgetId+"], name["+ arg.source.title+ "] selected");
}
dojo.addOnLoad(function() {
var s = dojo.widget.byId('treeTestId').selector;
dojo.event.connect(s, 'select', 'treeNodeSelected');
});</script>
<div style="float:left; margin-right: 50px;">
<s:tree id="treeTestId"
theme="ajax"
rootNode="root"
childCollectionProperty="children"
nodeIdProperty="id"
nodeTitleProperty="name"
treeSelectedTopic="treeSelected">
</s:tree>
<s:form action="GoTreeEdit">
<s:submit value="Add New"/>
</s:form>
</div>
</body>
</html>
7.創(chuàng )建用來(lái)增加節點(diǎn)的TreeEdit.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<
%@page pageEncoding="utf-8" %>
<
%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Session Test</title>
<s:head theme="xhtml"/>
</head>
<body>
<s:form action="SaveTreeNode">
<s:textfield label="Name" name="editCategory.name"/>
<s:select label="Parent Node"
name="editCategory.parentNodeId"
headerKey="-1"
headerValue="Select Parent Node"
list="parentNodeIds"
listKey="id"
listValue="name"
required="false"
value="editCategory.parentNodeId"/>
<s:submit/>
</s:form>
</div>
</body>
</html>
8.配置struts.xml
<package name="Test" extends="struts-default" namespace="/test">
<action name="DisplayTree" class="s2.ex.action.SimpleTreeAction" method="displayTree">
<result>TreeIndex.jsp</result>
</action>
<action name="GoTreeEdit" class="s2.ex.action.SimpleTreeAction" method="goTreeEdit">
<result>TreeEdit.jsp</result>
</action>
<action name="SaveTreeNode" class="s2.ex.action.SimpleTreeAction" method="saveTreeNode">
<result name="input">TreeEdit.jsp</result>
<result type="redirect">DisplayTree.action</result>
</action>
</package>