效果展示:
1.增加节点
2.删除节点
3.修改节点
技术分析:
利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样DWR(根据Java类来动态生成JavaScrip代码).
树是一个我们日常用的组件,EXT给我们提供了一个非常好用的树控件,对于传统HTML页面完全靠手编写代码是非常困难的,因为要编写许多JS代码,还要实现AJAX功能,使用EXT编写树我们的工作将简单方便许多.
Ext.ux.DWRTreeLoader 是对树加载器 Ext.tree.TreeLoader 的扩展 ,实现了通过DWR直接调用后台JAVA类方法,将树结点返回到前台,除此之外,还支持对树进行查找时,将查找参数直接传给后台JAVA类方法.
具体JS代码实现:
// 全局路径 var basePath = "http://localhost:8080/exttree"; if(typeof(glbRootPath) != "undefined"){ basePath = glbRootPath; } // 扩展窗体 FormEditWin = function(){ var curFormWin; return { width : 600, height : 400, showAddDirWin : function(parentNode) { // 显示添加子目录窗口 var number = parentNode.indexOf(parentNode.lastChild) + 1; var editpage = basePath + "/navigateedit?parentId=" + parentNode.id + "&leaf=0&number=" + number; var window = this.createWin("windirnew", "新建目录节点", editpage, function() { parentNode.reload(); }); window.show(); }, showAddLeafWin : function(parentNode) { // 显示添加子叶子节点窗口 var number = parentNode.indexOf(parentNode.lastChild) + 1; var editpage = basePath + "/navigateedit?parentId=" + parentNode.id + "&leaf=1&number=" + number; var window = this.createWin("winleafnew", "新建叶子节点", editpage, function() { parentNode.reload(); }); window.show(); }, showEditDirWin : function(node) { // 显示目录编辑窗口 var editpage = basePath + "/navigateedit?id=" + node.id; var window = this.createWin("win" + node.id, node.text, editpage, function() { var nodeparent = node.parentNode; var tree = node.getOwnerTree(); nodeparent.on("expand", function(pnode) { tree.getNodeById(node.id).select(); }, this, { single : true }); node.parentNode.reload(); }); window.show(); }, showEditLeafWin : function(node) { // 显示叶子节点编辑窗口 var editpage = basePath + "/navigateedit?id=" + node.id; var window = this.createWin("win" + node.id, node.text, editpage, function() { var nodeparent = node.parentNode; var tree = node.getOwnerTree(); nodeparent.on("expand", function(pnode) { tree.getNodeById(node.id).select(); }, this, { single : true }); node.parentNode.reload(); }); window.show(); }, createWin : function(winId, winTitle, iframePage, closeFun) { // 供各类型窗口创建时调用 var win = Ext.getCmp(winId); if (!win) { win = new Ext.Window({ id : winId, title : "菜单编辑窗口-" + winTitle, width : this.width, height : this.height, maximizable : true, modal : true, html : "<iframe width='100%' height='100%' frameborder='0' src='" + iframePage + "'></iframe>" }); this.reloadNavNode = closeFun; } curFormWin = win; return win; }, reloadNavNode : function() { }, close : function() { if(curFormWin){ curFormWin.close(); } } } }(); // 导航树 NavTree = function(){ var nav; var navEditor; var leafMenu; var dirMenu; var loader; var root; var removeFlag = false; var titleChangeFlag = false; var nodeSelected; var mgr; return { init : function(){ if(!mgr){ Ext.Msg.alert("警告提示","请先通过NavTree.setMgr()设置mgr"); return; } if(!loader){ loader = new Ext.tree.TreeLoader({ url : basePath + '/navigatejson' }); loader.on('beforeload', function(treeloader, node) { treeloader.baseParams = { id : node.id, method : 'tree' }; }, this); } if(!root){ root = new Ext.tree.AsyncTreeNode({ id : '0', text : "系统菜单" }); } if(!nav){ nav = new Ext.tree.TreePanel({ title : "左部导航", width : 232, autoScroll : true, animate : true, loader : loader, root : root, enableDD : true, listeners : { 'click' : function(node, event) { if (!node.isLeaf()) { // 为目录节点时,点击不进入链接 event.stopEvent(); } } } }); //事件: 添加右键菜单 nav.on("contextmenu", this.showTreeMenu); //事件: 当节点文本改变时触发 异步更新标题 nav.on("textchange", function(node, newText, oldText) { if (!titleChangeFlag && newText != oldText) { mgr.ajaxUpdateTitle(node.id, newText, function(success) { if (!success) { Ext.Msg.show({ title : "操作失败!", msg : "菜单修改失败!", buttons : Ext.Msg.OK, icon : Ext.MessageBox.ERROR }); titleChangeFlag = true; node.setText(oldText); titleChangeFlag = false; } }); } }); //事件: 当节点移动时触发 nav.on("movenode", function(tree, node, oldParent, newParent, index) { mgr.ajaxMoveNode(node.id, oldParent.id, newParent.id, index); }); //事件: 当节点删除时触发 nav.on("remove", function(tree, parentNode, node) { if (removeFlag) { mgr.ajaxRemoveNode(node.id); } }); } /* 事件: 节点选中单击编辑 if(!navEditor){ navEditor = new Ext.tree.TreeEditor(nav, { allowBlank : false, ignoreNoChange : true, completeOnEnter : true, blankText : '标题不能为空', selectOnFocus : true }); } */ this.setLeafMenu();// 设置叶子菜单 this.setDirMenu();// 设置目录菜单 }, setMgr : function(manager){ mgr = manager; }, getMgr : function(){ return mgr; }, // 设置叶子菜单 setLeafMenu: function(){ if(!leafMenu){ leafMenu = new Ext.menu.Menu({ items : [{ text : "修改标题", handler : function() { navEditor = new Ext.tree.TreeEditor(nav, { allowBlank : false, ignoreNoChange : true, completeOnEnter : true, blankText : '标题不能为空', selectOnFocus : true }); navEditor.triggerEdit(nodeSelected); } }, "-", { text : "编辑", handler : function() { FormEditWin.showEditLeafWin(nodeSelected); } }, "-", { text : "删除", handler : this.delTreeItemComfirm }] }); } }, // 设置目录菜单 setDirMenu: function(){ if(!dirMenu){ dirMenu = new Ext.menu.Menu({ items : [{ text : "修改标题", handler : function() { navEditor = new Ext.tree.TreeEditor(nav, { allowBlank : false, ignoreNoChange : true, completeOnEnter : true, blankText : '标题不能为空', selectOnFocus : true }); navEditor.triggerEdit(nodeSelected); } }, "-", { text : "编辑", handler : function() { FormEditWin.showEditDirWin(nodeSelected); } }, "-", { text : "添加叶子节点", handler : function() { FormEditWin.showAddLeafWin(nodeSelected); } }, "-", { text : "添加目录节点", handler : function() { FormEditWin.showAddDirWin(nodeSelected); } }, "-", { text : "删除", handler : this.delTreeItemComfirm }] }); } }, showTreeMenu : function(node, e){ nodeSelected = node; nodeSelected.select(); if (node.isLeaf()) { // 显示叶子节点菜单 leafMenu.showAt(e.getPoint()); } else { // 显示目录节点菜单 dirMenu.showAt(e.getPoint()); } }, delTreeItemComfirm : function(){ Ext.Msg.confirm("确认删除", "确定要删除所选节点吗?", function(btn) { if (btn == "yes") { NavTree.delTreeItem(); } }); }, delTreeItem : function(){ if (nodeSelected != nav.getRootNode()) { removeFlag = true; nodeSelected.remove(); removeFlag = false; } else { Ext.Msg.alert("警告", "不能删除树的根节点!"); } }, show : function(){ nav.render(Ext.getBody()); nav.getRootNode().toggle(); } } }(); // 文档加载完毕执行 Ext.onReady(function(){ Ext.BLANK_IMAGE_URL = "../scripts/ext/resources/images/default/s.gif"; if(typeof(NavigateManager)=="undefined"){ Ext.Msg.alert("警告提示","请先设置DWR,并实例化NavigateManager"); }else{ NavTree.setMgr(NavigateManager); NavTree.init(); NavTree.show(); } });
servlet 配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>navigatejson</servlet-name> <servlet-class> com.demo.navigate.web.NavigateJsonServlet </servlet-class> </servlet> <servlet> <servlet-name>navigateedit</servlet-name> <servlet-class> com.demo.navigate.web.NavigateEditServlet </servlet-class> </servlet> <servlet> <servlet-name>navigatesave</servlet-name> <servlet-class> com.demo.navigate.web.NavigateSaveServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>navigatejson</servlet-name> <url-pattern>/navigatejson</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>navigateedit</servlet-name> <url-pattern>/navigateedit</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>navigatesave</servlet-name> <url-pattern>/navigatesave</url-pattern> </servlet-mapping> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name> allowGetForSafariButMakeForgeryEasier </param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
DWR配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr//dwr20.dtd"> <dwr> <allow> <create javascript="NavigateManager" creator="new"> <param name="class" value="com.demo.navigate.service.NavigateManager"> </param> <include method="ajaxUpdateTitle" /> <include method="ajaxRemoveNode" /> <include method="ajaxMoveNode" /> </create> </allow> </dwr>
servlet程序:
package com.demo.navigate.web; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.demo.navigate.model.Navigate; import com.demo.navigate.service.NavigateManager; @SuppressWarnings("serial") public class NavigateSaveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { NavigateManager navigateManager = new NavigateManager(); Navigate obj = null; request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String number = request.getParameter("number"); String parentId = request.getParameter("parentId"); String leaf = request.getParameter("leaf"); String title = request.getParameter("title"); String url = request.getParameter("url"); if(null != id && !"".equals(id)){ obj = navigateManager.get(id); if(obj == null){ RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/error.jsp"); dispatcher.forward(request, response); return; } }else{ obj = new Navigate(); obj.setLeaf(new Integer(leaf)); obj.setParentId(new Integer(parentId)); } obj.setNumber(new Integer(number)); obj.setTitle(title); obj.setUrl(url); if(null != id && !"".equals(id)){ navigateManager.update(obj); }else{ navigateManager.save(obj); } RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/success.jsp"); dispatcher.forward(request, response); } }
package com.demo.navigate.web; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.demo.navigate.service.NavigateManager; @SuppressWarnings("serial") public class NavigateJsonServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { NavigateManager navigateManager = new NavigateManager(); request.setAttribute("list", navigateManager.getChildrenById(new Integer(request.getParameter("id")))); RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/console-json.jsp"); dispatcher.forward(request, response); } }
package com.demo.navigate.web; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.demo.navigate.model.Navigate; import com.demo.navigate.service.NavigateManager; @SuppressWarnings("serial") public class NavigateEditServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String idstr = request.getParameter("id"); String parentId = request.getParameter("parentId"); String leaf = request.getParameter("leaf"); String number = request.getParameter("number"); Navigate obj = null; if(null != idstr){ NavigateManager navigateManager = new NavigateManager(); obj = navigateManager.get(idstr); }else{ obj = new Navigate(); obj.setParentId(new Integer(parentId)); obj.setLeaf(new Integer(leaf)); obj.setNumber(new Integer(number)); } request.setAttribute("obj", obj); RequestDispatcher dispatcher = request.getRequestDispatcher("/navigate/console-edit.jsp"); dispatcher.forward(request, response); } }
service程序:
package com.demo.navigate.service; import java.io.Serializable; import java.util.List; import com.demo.navigate.dao.NavigateDao; import com.demo.navigate.model.Navigate; public class NavigateManager { private NavigateDao dao = NavigateDao.getInstanece(); public Navigate get(Serializable id){ return dao.get(id); } /** * 获得指定节点的所有儿子节点 * @param id */ @SuppressWarnings("unchecked") public List<Navigate> getChildrenById(Integer id){ return dao.getChildrenById(id); } /** * 保存数据 * @param obj */ public void save(Navigate obj){ dao.save(obj); } /** * 更新数据 * @param obj */ public void update(Navigate obj){ dao.update(obj); } /** * 删除指定的一条数据 * @param id */ public void removeById(Integer id){ dao.removeById(id); } /** * 异步更新标题 * @param id * @param title * @return true-修改成功 false-修改失败 */ public Boolean ajaxUpdateTitle(Integer id,String title){ return dao.ajaxUpdateTitle(id, title); } /** * 异步删除数据,包括其子孙节点 * @param id * @param title */ public void ajaxRemoveNode(Integer id){ Navigate obj = dao.get(id); dao.downNode(obj.getParentId(), obj.getNumber(), -1); dao.ajaxRemoveNode(id); } /** * 异步移动指定节点 * @param id 指定的节点的id * @param oldParentId 节点移动前所在的父节点 * @param newParentId 节点移动后的目标父节点 * @param nodeIndex 节点移动后的目标位置 */ public void ajaxMoveNode(int id, int oldParentId, int newParentId, int nodeIndex){ dao.ajaxMoveNode(id, oldParentId, newParentId, nodeIndex); } }
model程序:
package com.demo.navigate.model; public class Navigate { private Integer id; private Integer parentId; private String title; private Integer number; private Integer leaf; private String url; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getParentId() { return parentId; } public void setParentId(Integer parentId) { this.parentId = parentId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Integer getNumber() { return number; } public void setNumber(Integer number) { this.number = number; } public Integer getLeaf() { return leaf; } public void setLeaf(Integer leaf) { this.leaf = leaf; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
Dao程序:
package com.demo.navigate.dao; import java.io.Serializable; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.demo.core.dao.DBConn; import com.demo.navigate.model.Navigate; public class NavigateDao { private static NavigateDao dao; private NavigateDao(){ } public static NavigateDao getInstanece(){ if(null == dao){ dao = new NavigateDao(); } return dao; } /** * 获得指定ID的数据 * @param id * @return */ public Navigate get(Serializable id){ Connection conection = null; Statement stmt = null; ResultSet rs = null; Navigate obj = null; try{ conection = DBConn.getConnection(); stmt = conection.createStatement(); StringBuffer sql = new StringBuffer("select * from navigate where id = "); sql.append(id); rs = stmt.executeQuery(sql.toString()); if(rs.next()) { obj = new Navigate(); obj.setId(rs.getInt("id")); obj.setLeaf(rs.getInt("leaf")); obj.setNumber(rs.getInt("number")); obj.setParentId(rs.getInt("parentId")); obj.setTitle(rs.getString("title")); obj.setUrl(rs.getString("url")); } }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(rs != null) { try { rs.close(); } catch (SQLException e) { } rs = null; } if (stmt != null) { try { stmt.close(); } catch (SQLException sqlex) { } stmt = null; } if (conection != null) { try { conection.close(); } catch (SQLException sqlex) { } conection = null; } }catch(Exception e){ e.printStackTrace(); } } return obj; } /** * 获得指定节点的所有儿子节点 * @param id */ @SuppressWarnings("unchecked") public List<Navigate> getChildrenById(Integer id){ List<Navigate> list = new ArrayList<Navigate>(); Connection conection = null; Statement stmt = null; ResultSet rs = null; try{ conection = DBConn.getConnection(); stmt = conection.createStatement(); StringBuffer sql = new StringBuffer("select * from navigate where parentId = "); sql.append(id); sql.append(" order by number,id"); System.out.println("首页加载树SQL=="+sql.toString()); rs = stmt.executeQuery(sql.toString()); while(rs.next()) { Navigate obj = new Navigate(); obj.setId(rs.getInt("id")); obj.setLeaf(rs.getInt("leaf")); obj.setNumber(rs.getInt("number")); obj.setParentId(rs.getInt("parentId")); obj.setTitle(rs.getString("title")); obj.setUrl(rs.getString("url")); list.add(obj); } }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(rs != null) { try { rs.close(); } catch (SQLException e) { } rs = null; } if (stmt != null) { try { stmt.close(); } catch (SQLException sqlex) { } stmt = null; } if (conection != null) { try { conection.close(); } catch (SQLException sqlex) { } conection = null; } }catch(Exception e){ e.printStackTrace(); } } return list; } /** * 保存数据 * @param obj */ public void save(Navigate obj){ StringBuffer sql = new StringBuffer("insert into navigate(parentId,title,leaf,number,url) values("); sql.append(obj.getParentId()); sql.append(",'"); sql.append(obj.getTitle()); sql.append("',"); sql.append(obj.getLeaf()); sql.append(","); sql.append(obj.getNumber()); sql.append(",'"); sql.append(obj.getUrl()); sql.append("')"); this.bulkUpdate(sql.toString()); } /** * 更新数据 * @param obj */ public void update(Navigate obj){ StringBuffer sql = new StringBuffer("update navigate set"); sql.append(" parentId = "); sql.append(obj.getParentId()); sql.append(","); sql.append(" title = '"); sql.append(obj.getTitle()); sql.append("',"); sql.append(" leaf = "); sql.append(obj.getLeaf()); sql.append(","); sql.append(" number = "); sql.append(obj.getNumber()); sql.append(", url = '"); sql.append(obj.getUrl()); sql.append("' where id = "); sql.append(obj.getId()); this.bulkUpdate(sql.toString()); } /** * 异步更新标题 * @param id * @param title * @return true-修改成功 false-修改失败 */ public Boolean ajaxUpdateTitle(Integer id,String title){ Boolean flag = false; Navigate obj = this.get(id); if(null != obj){ StringBuffer sql = new StringBuffer("update navigate set"); sql.append(" title = '"); sql.append(title); sql.append("'"); sql.append(" where id = "); sql.append(id); this.bulkUpdate(sql.toString()); flag = true; } return flag; } /** * 删除指定的一条数据 * @param id */ public void removeById(Integer id){ StringBuffer sql = new StringBuffer("delete from navigate where id = "); sql.append(id); this.bulkUpdate(sql.toString()); } /** * 异步删除数据,包括其子孙节点 * @param id * @param title */ @SuppressWarnings("unchecked") public void ajaxRemoveNode(Integer id){ List list = this.getChildrenById(id); for (Object object : list) { Navigate obj = (Navigate)object; ajaxRemoveNode(obj.getId()); } this.removeById(id); } /** * 移动指定节点 * @param id 指定的节点的id * @param oldParentId 节点移动前所在的父节点 * @param newParentId 节点移动后的目标父节点 * @param nodeIndex 节点移动后的目标位置 */ public void ajaxMoveNode(int id, int oldParentId, int newParentId, int nodeIndex){ Navigate obj = this.get(id); int minIndex = obj.getNumber().intValue(); int maxIndex = nodeIndex; if(oldParentId == newParentId && minIndex != maxIndex){ // 在同一个父节点下发生移动 if(minIndex < maxIndex){ // 当要移动的节点的序号小于要移动到的目标序号,则下移 this.downNode(oldParentId, minIndex, maxIndex); }else if(minIndex > maxIndex){ // 当要移动的节点的序号大于要移动到的目标序号,则上移 maxIndex = minIndex; minIndex = nodeIndex; this.upNode(oldParentId, minIndex, maxIndex); } // 节点本身的序号设置成要移动到的目标序号 obj.setNumber(nodeIndex); this.update(obj); } if(oldParentId != newParentId){ // 在不同父节点下发生移动 //1、相当于要移动的节点在原父节点下下移到最后再删除掉,因此要指定移动发生时节点所在的位置 this.downNode(oldParentId, minIndex, -1); //2、相当于要移动的节点在新父节点下上移到指定的位置,因此需要指定要移动到的位置 this.upNode(newParentId, maxIndex, -1); // 节点本身的序号设置成要移动到的目标序号 obj.setNumber(nodeIndex); obj.setParentId(newParentId); this.update(obj); } } /** * 指定的节点下移 * @param parentId 指定范围内要移动的节点的父节点 * @param minIndex 指定节点移动发生时所在的位置 * @param maxIndex 指定节点要移动到的目标位置 */ @SuppressWarnings("unchecked") public void downNode(int parentId, int minIndex, int maxIndex){ // 指定的节点下移,意味着其范围内的节点各自减1 StringBuffer sql = new StringBuffer("update navigate set number=number-1 where parentId = "); sql.append(parentId); if(maxIndex != -1){ sql.append(" and number <= "); sql.append(maxIndex); } if(minIndex != -1){ sql.append(" and number > "); sql.append(minIndex); } this.bulkUpdate(sql.toString()); } /** * 指定的节点上移 * @param parentId 指定范围内要移动的节点的父节点 * @param minIndex 指定节点要移动到的目标位置 * @param maxIndex 指定节点移动发生时所在的位置 */ @SuppressWarnings("unchecked") public void upNode(int parentId, int minIndex, int maxIndex){ // 指定的节点上移,意味着其范围内的节点各自加1 StringBuffer sql = new StringBuffer("update navigate set number=number+1 where parentId = "); sql.append(parentId); if(maxIndex != -1){ sql.append(" and number < "); sql.append(maxIndex); } if(minIndex != -1){ sql.append(" and number >= "); sql.append(minIndex); } this.bulkUpdate(sql.toString()); } /** * 批量更新或删除操作 * @param sql */ public void bulkUpdate(String sql){ Connection conection = null; Statement stmt = null; try{ conection = DBConn.getConnection(); stmt = conection.createStatement(); stmt.executeUpdate(sql); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if (stmt != null) { try { stmt.close(); } catch (SQLException sqlex) { } stmt = null; } if (conection != null) { try { conection.close(); } catch (SQLException sqlex) { } conection = null; } }catch(Exception e){ e.printStackTrace(); } } } }
package com.demo.core.dao; import java.sql.Connection; import java.sql.DriverManager; public class DBConn { private static String url = "jdbc:mysql://localhost:3306/langsin"; private static String username = "root"; private static String password = "tiger"; private static String driver = "com.mysql.jdbc.Driver"; public static Connection getConnection(){ Connection conn = null; try{ Class.forName(driver); conn = DriverManager.getConnection(url,username,password); }catch(Exception e){ e.printStackTrace(); } return conn; } }
数据库脚本:
create table navigate( id int primary key auto_increment, leaf int not null, number int not null, parentId int not null, title varchar(50) not null, url varchar(200) not null );
页面:
<%@ page contentType="text/html;charset=UTF-8" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><html> <head> <title>导航控制</title> <link rel="stylesheet" type="text/css" href="../scripts/ext/resources/css/ext-all.css"> <script type="text/javascript" src="<%=basePath%>/scripts/ext/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="<%=basePath%>/scripts/ext/ext-all.js"></script> <script type="text/javascript" src="<%=basePath%>/dwr/engine.js"></script> <script type="text/javascript" src="<%=basePath%>/dwr/util.js"></script> <script type="text/javascript" src="<%=basePath%>/dwr/interface/NavigateManager.js"></script> <script type="text/javascript"> var glbRootPath = "<%=basePath%>"; </script> <script type="text/javascript" src="<%=basePath%>/scripts/navigate/console-index.js"></script> </head> <body> </body> </html>
完毕!
转载请标明出处 http://blog.csdn.net/shimiso
技术交流群:361579846