又好一段时间没写博客了..在这里写一个dwr和spring.hibernate整合树型显示的小例子;
首先开发环境是eclipse.这里需要hibernate3.2和spring2.5,dwr2.0.5,dbcp1.2.2的jar包(这些都是在相应的官方网站下载)
这里我选择的场景是从数据库中读取到一个自己链接的类别显示表sort
下面是其实体类和相应的配置文件代码:
Sort.java
package com.tree.entity;
import java.util.HashSet;
import java.util.Set;
public class Sort {
private int id;
private String name;//类别的名字
private Sort parent;//父节点
private Set childrens;//子节点
//geter.seter.....
}
Sort.hbm.xml:
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
package="com.tree.entity">
from Sort sort where sort.parent=null
]]>
from Sort sort where sort.parent.id=?
]]>
看了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
*/
public class SortDaoImpl extends HibernateDaoSupport implements SortDaoInf {
/**
* 添加数据
* @param 需要添加的实例
*/
public void 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() {
return this.getHibernateTemplate().findByNamedQuery("findAllParent");
}
/**
* 通过父节点id找到其子节点实例
* @param id 父节点id
*/
@SuppressWarnings("unchecked")
public List findChildByParentId(int id) {
//使用findByNamedQuery(“相应的配置文件中你对应要使用查询语句的名字”)
return this.getHibernateTemplate().findByNamedQuery("findChildByParent", id);
}
}
HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring 2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介:
q void delete(Object entity):删除指定持久化实例
q deleteAll(Collection entities):删除集合内全部持久化类实例
q find(String queryString):根据HQL查询字符串来返回实例集合
q findByNamedQuery(String queryName):根据命名查询返回实例集合
q get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例
q save(Object entity):保存新的实例
q saveOrUpdate(Object entity):根据实例状态,选择保存或者更新
q update(Object entity):更新实例的状态,要求entity是持久状态
q setMaxResults(int maxResults):设置分页的大小
[color=red]上面对应一些基本的操作解析[/color]
下面是配置文件的配置:
首先是web.xml文件中如下:
dwr-invoker
org.directwebremoting.servlet.DwrServlet
debug
true
dwr-invoker
/dwr/*
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
dwr.xml(存放在WEB-INF中)的文件配置:
applicationContext.xml的配置
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">
com/tree/entity/Sort.hbm.xml
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
完成这些后台的配置与必要的操作定义后..
就可以实现页面树的显示
页面为tree.jsp:因为大部分的操作都使用了tree.js上面.而通过访问http://127.0.0.1:8080/tree(我的项目名称)/dwr可以获取到dwr生成后转化成的js
[color=red]
[/color]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
Insert title here
核心的tree.js的代码如下:
//在页面启动的时候操作
window.onload=function() {
var tree = document.getElementById("tree");
sortDaoInf.findAllParent(function(sorts){//获取到所有的父元素
for(var i=0;i var sort = sorts[i];
var my_ul = document.createElement("ul");
my_ul.innerHTML="";
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 var sort = sorts[i];
str+=""+sort.name+"";//将获取到的数据用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";
}
通过上面的例子使我更清楚的了解的dwr的作用.和spring的强大.为了实现树的显示也对javascript的编写有了进一步了解..在后面还会搞些更好的东西和结合学习到所有技术在学习同时与大家分享一下
下面是所以的源码..jar太大就不上传了.