web2.0开发技术
使用 Ajax 技术实现动态获取数据的树状菜单。当展开菜单时,自动向服务器发送请求,查询该菜单下的子菜单,并在客户端显示子菜单,而无需刷新整个页面。
源码结构说明
package book.treeview;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
public class Category implements TreeviewElement {
protected int ID;//代表数据库中category_id列;
protected int parentID;//代表数据库中parent_category_id列;
protected String categoryName;//代表数据库中category_name列;
protected String activeStatus="Y";//代表数据库中active_status列;
public Category() {//无参的构造方法
this.ID = -1;
}
public Category(int id) {//有参的构造方法,参数为portlet_id
this.ID = id;
if (!FromDb())//如果有找到该id的porlet
this.ID = -1;
}
public boolean FromDb() {//从数据库中读出,并更新bean
int row = -1;
//读记录的sql语句
String sql = "select * from product_category where category_id=" + this.ID
+ " and active_status='Y'";
ResultSet rs = DbManager.getResultSet(sql);//执行sql语句并返回ResultSet
try {
rs.last();//移动到最后一行
row = rs.getRow();//得到总记录数
if (row == 1) {//如果只查询到一条记录,则代表该记录存在并更新该类的属性
this.parentID = rs.getInt("PARENT_CATEGORY_ID");
this.categoryName = rs.getString("CATEGORY_NAME");
this.activeStatus = rs.getString("ACTIVE_STATUS");
return true;
} else
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
try {//最后关闭ResutltSet,Statement.并释放连接
if (rs != null)
rs.close();
if (rs.getStatement() != null)
rs.getStatement().close();
DbManager.releaseConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public String getActiveStatus() {
return activeStatus;
}
public void setActiveStatus(String activeStatus) {
this.activeStatus = activeStatus;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getID() {
return ID;
}
public void setID(int id) {
ID = id;
}
public int getParentID() {
return parentID;
}
public void setParentID(int parentID) {
this.parentID = parentID;
}
public String getNodeName() {
return getCategoryName();
}
public boolean canExpand() {
String sql ="select category_id from product_category where parent_category_id="+getID();
ResultSet rs = DbManager.getResultSet(sql);//执行sql语句并返回ResultSet
try {
rs.last();//移动到最后一行
int row = rs.getRow();//得到总记录数
if (row <= 0)
return false;
else
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
try {//最后关闭ResutltSet,Statement.并释放连接
if (rs != null)
rs.close();
if (rs.getStatement() != null)
rs.getStatement().close();
DbManager.releaseConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public TreeviewElement[] getChildren() {
String sql ="select category_id from product_category where parent_category_id="+getID();
ResultSet rs = DbManager.getResultSet(sql);//执行sql语句并返回ResultSet
try {
rs.last();//移动到最后一行
int row = rs.getRow();//得到总记录数
if (row <= 0) {//如果没有子结点
return null;//返回null
}
else{//如果有子结点
Vector vData = new Vector();
rs.beforeFirst();
while (rs.next())
vData.add(""+rs.getInt("CATEGORY_ID"));
TreeviewElement[] children = new TreeviewElement[vData.size()];
for (int i=0;i<vData.size();i++)
{
int id = Integer.parseInt((String)vData.get(i));
children[i] = new Category(id);
}
return children;//返回该记录的所有子结点
}
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
try {//最后关闭ResutltSet,Statement.并释放连接
if (rs != null)
rs.close();
if (rs.getStatement() != null)
rs.getStatement().close();
DbManager.releaseConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import java.sql.*;
public class DbManager {
//类成员Connection
protected static Connection conn;
//mysql的驱动类,定义为常量
public static final String CLASS_NAME = "com.mysql.jdbc.Driver";
//数据库的连接地址,定义为常量
public static final String CONNET_STR = "jdbc:mysql://localhost/treeview";
//获得Connetion
public static Connection getConnection() {
try {
Class.forName(CLASS_NAME);//使用类反射加载该驱动类
//获得一个Connection
conn = DriverManager.getConnection(CONNET_STR, "root", "");
return conn;//返回该Connection
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//传入查询数据库的sql语句,返回ResultSet
public static ResultSet getResultSet(String sql) {
boolean bSuccess = true;
Statement stmt = null;//声明Statement stmt
ResultSet rs = null;//声明ResultSet rs
Connection con = getConnection();//调用getConnetion()方法获得一个Connetion
if (con == null)//如果Connection 为null则返回假
bSuccess = false;
if (bSuccess) {
try {
stmt = con.createStatement();//通过Connection创建一个Statemet
rs = stmt.executeQuery(sql);//执行查询语句,
} catch (SQLException e) {
e.printStackTrace();
bSuccess = false;
}
}
if (bSuccess)//如果执行成功,则返回rs
return rs;
else
return null;
}
//传入执行数据更新的语句,返回更新结果,真为成功执行
public static boolean excute(String sql) {
boolean bSuccess = true;
Statement stmt = null;//声明Statement stmt
Connection con = getConnection();//调用getConnetion()方法获得一个Connetion
if (con == null)//如果Connection 为null则返回假
bSuccess = false;
if (bSuccess) {
try {
stmt = con.createStatement();//通过Connection创建一个Statemet
bSuccess = stmt.execute(sql);//执行更新数据操作
} catch (SQLException e) {
e.printStackTrace();
bSuccess = false;
}
}
return bSuccess;
}
//释放Connection
public static void releaseConnection() {
try {
if (conn != null)// 如果Connetion 不为null则关闭Connection
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public interface TreeviewElement {
public String getNodeName( );//该结点的名称
public boolean canExpand();//是否能够展开
public TreeviewElement[] getChildren();//所有的一级子结点
public int getID();//结点的唯一标识
}
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
public class treeviewRender {
static public String renderStatic(TreeviewElement treeElmt, boolean bHidden) {
StringBuffer content = new StringBuffer();
content.append("<li id=" + treeElmt.getID() + ">");//显示li元素
if (bHidden && treeElmt.canExpand())//如果可以展开并且初始化为隐藏,则显示展开图片,并添加showHide事件
content.append("<img src=images/plus.gif onClick=\"showHide('"
+ treeElmt.getID() + "')\">");
else if (treeElmt.canExpand())//如果可以展开,则显示折叠图片,并添加showHide事件
content.append("<img src=images/minus.gif onClick=\"showHide('"
+ treeElmt.getID() + "')\">");
else//否则显示空白图片
content.append("<img src=images/blank.gif>");
content.append("<img src=images/folder.gif><a href=\"#\"");//添加文件夹图片
if (treeElmt.canExpand())//如果可以展开,为节点添加showHide事件
content.append("onClick=\"showHide('" + treeElmt.getID() + "')\"");
content.append(">" + treeElmt.getNodeName() + "</a>");
if (treeElmt.canExpand()) {//如果可以展开,则用UL标记显示子结点
content.append("<ul");
if (bHidden)
content.append(" style=\"display:none;\" ");
content.append(">");
TreeviewElement[] elmts = treeElmt.getChildren();//获得此结点的子节点
for (int i = 0; i < elmts.length; i++)
content.append(renderStatic(elmts[i], bHidden));//递归调用显示子节点
content.append("</ul>");
}
content.append("</li>");//结束显示<li>元素
return content.toString();
}
static public TreeviewElement[] getTopCategory() {
String sql = "select category_id from product_category where parent_category_id=0";
ResultSet rs = DbManager.getResultSet(sql);// 执行sql语句并返回ResultSet
try {
rs.last();// 移动到最后一行
int row = rs.getRow();// 得到总记录数
if (row <= 0) {
return null;
} else {
Vector vData = new Vector();
rs.beforeFirst();
while (rs.next())
vData.add("" + rs.getInt("CATEGORY_ID"));
TreeviewElement[] children = new TreeviewElement[vData.size()];
for (int i = 0; i < vData.size(); i++) {
int id = Integer.parseInt((String) vData.get(i));
children[i] = new Category(id);
}
return children;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
try {// 最后关闭ResutltSet,Statement.并释放连接
if (rs != null)
rs.close();
if (rs.getStatement() != null)
rs.getStatement().close();
DbManager.releaseConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
static public String renderSimple(TreeviewElement treeElmt) {
StringBuffer content = new StringBuffer();
content.append("<li id=" + treeElmt.getID() + "><a href=\"#\">");
content.append( treeElmt.getNodeName() + "</a>");
if (treeElmt.canExpand()) {
content.append("<ul>");
TreeviewElement[] elmts = treeElmt.getChildren();
for (int i = 0; i < elmts.length; i++)
content.append(renderSimple(elmts[i]));
content.append("</ul>");
}
content.append("</li>");
return content.toString();
}
static public String renderTreeViewAjax(TreeviewElement treeElmt,boolean bRenderChildren) {
StringBuffer content = new StringBuffer();
content.append("<li id="+treeElmt.getID()+">");
if (treeElmt.canExpand())
content.append("<img src=images/plus.gif onClick=\"getSubTree('"+treeElmt.getID()+"')\">");
else
content.append("<img src=images/blank.gif>");
content.append("<img src=images/folder.gif><a href=\"#\"");
if (treeElmt.canExpand())
content.append(" onClick=\"getSubTree('"+treeElmt.getID()+"')\"");
content.append(">"+treeElmt.getNodeName()+"</a>");
if ( bRenderChildren&&treeElmt.canExpand( ))
{
content.append("<ul>");
TreeviewElement[] elmts = treeElmt.getChildren();
for (int i=0;i<elmts.length;i++)
content.append(renderTreeViewAjax(elmts[i],false));
content.append("</ul>");
}
content.append("</li>");
return content.toString();
}
}
|