Sort.java
package com.tree.entity;
import java.util.HashSet;
import java.util.Set;
publicclass Sort {
privateint id;
private String name;//類別的名字
private Sort parent;//父節點
private Set<Sort> childrens;//子節點
//geter.seter.....
}
Sort.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.tree.entity">
<class name="Sort" table="tb_sort">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="parent" column="sid"/>
<set name="childrens">
<key>
<column name="sid"></column>
</key>
<one-to-many class="Sort"/>
</set>
</class>
<!--
//這裏使用了Hibernate的命名查詢.
//將你的每個實現映射實例對應的表操作語句都統一寫到此處..方便統一管理
//命名查詢也可以使用2級緩衝.方便優化Hibernate的數據庫操作
-->
<query name="findAllParent">
<![CDATA[
from Sort sort where sort.parent=null
]]></query>
<query name="findChildByParent">
<![CDATA[
from Sort sort where sort.parent.id=?
]]></query>
</hibernate-mapping>
看了2個相應的映射實例.我們看看如何完成dao
SortDaoImpl.java
package com.tree.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.tree.entity.Sort;
/**
* 這裏與Spring的整合.使用了Spring提供的HibernateDaoSupport
* 因爲該類提供了getHibernateTemplate()的方法可以獲取到HibernateTemplate
* @author chenjj
*/
publicclass SortDaoImpl extends HibernateDaoSupport implements SortDaoInf {
/**
* 添加數據
* @param 需要添加的實例
*/
publicvoid save(Sort sort) {
this.getHibernateTemplate().save(sort);
}
/**
* 通過id查找Sort類實例
* @param 類型id
*/
public Sort find(int id) {
return (Sort) this.getHibernateTemplate().get(Sort.class, id);
}
/**
* 查詢所以父節點實例
*
*/
@SuppressWarnings("unchecked")
public List findAllParent() {
returnthis.getHibernateTemplate().findByNamedQuery("findAllParent");
}
/**
* 通過父節點id找到其子節點實例
* @param id 父節點id
*/
@SuppressWarnings("unchecked")
public List findChildByParentId(int id) {
//使用findByNamedQuery(“相應的配置文件中你對應要使用查詢語句的名字”)
returnthis.getHibernateTemplate().findByNamedQuery("findChildByParent", id);
}
}
首先是web.xml文件中如下:
<!--
//配置DWR攔截器
-->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<!--
//這裏你需要告訴服務器你的spring的配置放到什麼地方.這裏我選擇是在src文件夾下面
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--
//定義 Spring 的上下文監聽器,它會負責初始化 ApplicationContext(spring的環境)
-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
dwr.xml(存放在WEB-INF中)的文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN""http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<!--
//這裏create表示創建的對象方式以及生成的js文件的名字
//javascript:表示生成的js文件的名字;
//creator:表示創建的方式;
//<param>表示要創建具體的類
//name="class"這是一個類;
//value="[編寫具體的類名]";
// 因爲整合spring.這裏creator的屬性設置爲spring.
-->
<create javascript="sortDaoInf" creator="spring">
<!--
//param元素的name屬性值可以是class,beanName等,此處用beanName,
//value得值是定義在applicationContext.xml中某個bean的id值。
-->
<param name="beanName" value="DWRSortDaoInf"></param>
</create>
<!--
//convert:配置具體的javabean;
//match:具體的java類名;
//converter:表示使用的方式;
//bean ==> 符合javabean規範的形式進行創建;
//date ==> 專門用於轉換util.Date和sql.Date
-->
<convert match="com.tree.entity.Sort" converter="bean">
<param name="include" value="id,name"></param>
</convert>
</allow>
</dwr>
applicationContext.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/gao"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 定義HibernateSessionFacotry -->
<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 使用指定的數據源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定需要映射的實體 -->
<property name="mappingResources">
<list>
<value>com/tree/entity/Sort.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect = org.hibernate.dialect.MySQLInnoDBDialect
hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider
hibernate.format_sql = true
hibernate.show_sql = true
hibernate.hbm2ddl.auto = update
</value>
</property>
</bean>
<!--
//這裏DWRSortDaoInf要與dwr中creater的beanName的value相一致
-->
<bean id="DWRSortDaoInf"class="com.tree.dao.SortDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
完成這些後臺的配置與必要的操作定義後..
就可以實現頁面樹的顯示
頁面爲tree.jsp:因爲大部分的操作都使用了tree.js上面.而通過訪問http://127.0.0.1:8080/tree(我的項目名稱)/dwr可以獲取到dwr生成後轉化成的js
<script type='text/javascript' src='/tree/dwr/interface/sortDaoInf.js'></script>
<script type='text/javascript' src='/tree/dwr/engine.js'></script>
<script type='text/javascript' src='/tree/dwr/util.js'></script>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='/tree/dwr/interface/sortDaoInf.js'></script>
<script type='text/javascript' src='/tree/dwr/engine.js'></script>
<script type='text/javascript' src='/tree/dwr/util.js'></script>
<script type="text/javascript" src="js/tree.js"></script>
<title>Insert title here</title>
</head>
<body>
<div id="tree">
</div>
</body>
</html>
核心的tree.js的代碼如下:
//在頁面啓動的時候操作
window. {
var tree = document.getElementById("tree");
sortDaoInf.findAllParent(function(sorts){//獲取到所有的父元素
for(var i=0;i<sorts.length;i++) {
var sort = sorts[i];
var my_ul = document.createElement("ul");
my_ul.innerHTML="<li id="+sort.name+"><img id="+sort.id+" src='img/plus.gif' onclick='getSubtree(\""+sort.name+"\","+sort.id+")'/><img src='img/folder.gif'/></li>";
tree.appendChild(my_ul);
}
});
}
function getSubtree(){
//傳遞的參數可以使用arguments[index..]來獲取.javascript一個擴展特點
var name = arguments[0];//獲取第一個參數的值
var id = arguments[1];//獲取第二個參數的值
var element = document.getElementById(name);
var my_ul = document.createElement("ul");//創建一個ul的元素
sortDaoInf.findChildByParentId(id,function (sorts){//使用sortDaoInf的方法.id爲傳遞的參數.sorts爲回調函數.
var str="";
for(var i=0;i<sorts.length;i++) {
var sort = sorts[i];
str+="<li id="+sort.id+">"+sort.name+"</li>";//將獲取到的數據用li形式表示
}
my_ul.innerHTML = str;//將獲取到所以li元素添加到相應的ul中
element.appendChild(my_ul);
//把"+"號變成"-"號
var img = document.getElementById(id);
img.setAttribute("src","img/minus.gif");
img.onclick = function () {
showHide(name,id,element);
};
});
}
function showHide(){
var name = arguments[0];//獲取第一個參數的值
var id = arguments[1];//獲取第二個參數的值
var root = arguments[2];//獲取第三個參數的值
var element = document.getElementById(name);
var img = document.getElementById(id);//獲取到相應的Img元素
img.src = "img/plus.gif";
img.onclick = function(){
getSubtree(name,id);
}
var subs = element.lastChild;
root.removeChild(subs);//將父元素中子元素刪除掉
//subs.style.display="none";
}