2007-09-05

一个dwr+spring+hibernate的示例

关键字: spring, hibernate

这是一个运用dwr+spring+hibernate这样一个框架编写的示例。它展示了一下内容:

1、在dwr中尝试编写的一些通用的代码,包括如何编写一个通用的列表显示框并实现分页、如何编写一个通用的单行编辑框、如何编辑一个通用的存盘和删除程序等等。

2、在dwr中如何与spring兼容,调用bus中的方法;在dwr中如何与hibernate兼容,在页面端操作值对象,以及处理值对象间的各种关系。

3、如何在spring中实现单dao,使这个单dao既可以与hibernate隔离,使其低耦合高内聚,提高可维护性,又能满足各个bus的业务需要,简化开发的过程。

不是美工,界面比较外行,见谅了:)

示例在MyEclipse中安装部署的步骤:

1、创建一个新的web项目并拷贝示例中的文件到项目中。注意web.xml文件应当是将原文件覆盖。

2、添加spring和hibernate。点击项目树中的项目名按Alt+Enter键,弹出项目属性对话框。选择“Java Build Path”中的“Libraries”标签,然后点击“Add Library”按钮,选择“MyEclipse Libraries”,点击“Next”,选择“Hibernate 3.0 Core Libraries”、“Spring 1.2 AOP Libraries”、“Spring 1.2 Core Libraries”、“Spring 1.2 ORM/DAO/Hibernate Libraries”、“Spring 1.2 Web Libraries”,点击“Finish”按钮。

3、点击“Add External JARs”按钮,添加dwr.jar、daosupport.jar、hxtg.jar、hibernate3(必须将hibernate3升级到3.2以上)以及其它数据库相关的jar包到项目中。添加完成以后记得重新部署应用服务器。

4、创建数据库实例,如果是oracle,在pl/sql中运行示例中的employee.sql创建数据库对象。

5、修改ApplicationContext-hibernate.xml中datasource的连接属性为你的数据库。部署完成!

部署完成后运行可能会在部分功能中出错。这些问题的解决我会在《DWR帮助说明-dwr的bug及其解决方法》中详细讨论。

重要提示:部署完成以后需要打开Department.hbm.xml和Employee.hbm.xml,修改schema="TEST"为你自己的用户名。

相关文档:

如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件

DWR帮助文档-dwr.xml文件的配置

DWR帮助说明-如何编写通用的列表显示框

DWR帮助说明-如何编写通用的单行编辑框

DWR帮助说明-服务器端程序的编写

DWR帮助说明-dwr的bug及其解决方法

  • employee.rar (2.6 MB)
  • 描述: 重新修订了一下
  • 下载次数: 4446
评论
lengyue 2008-05-21
正在整理dwr的东西,有时间与lz交流
fangang 2008-05-14
shim 写道
员工页面老提示'sex'为空或不是对象的,但数据库表sex字段是有值的

在emplpyee.jsp的edit()里加一段调试函数:alertValue(vo);看看传过来的vo中是否有sex属性
shim 2008-05-14
fangang 写道
shim 写道
谢谢分享,学习一下
不过我添加了21个部门都还没分页
没找到分页设置的地方哦

还有,holly-x.gif图标貌似显示隐藏用的。
但没效果啊

抱歉,有个小小的BUS所以分页失效,在/WebRoot/department/index.jsp中47行,把if(condition){condition=iniCondition;}改为if(!condition){condition=iniCondition;}就可以了。员工列表是正确的,你也可以参照它。
这里我添加了个默认设置iniCondition,它的定义在../hxtg/public/dwr/util.js中。如果要为每个页面单独设置,可以这样写:
if(!condition){condition={properties:[],operators:[],values:[],page:1,size:12};}
其它都照写,把size改为你需要的每页行数就可以了


还有问题哦,condition=iniCondition应该是condition=iniConditions吧,

还有

员工页面老提示'sex'为空或不是对象的,但数据库表sex字段是有值的
guo_david_wei 2008-05-13
做的很不错啊...
我也正在用这写技术做项目...
谢过
fangang 2008-05-12
shim 写道
谢谢分享,学习一下
不过我添加了21个部门都还没分页
没找到分页设置的地方哦

还有,holly-x.gif图标貌似显示隐藏用的。
但没效果啊

抱歉,有个小小的BUS所以分页失效,在/WebRoot/department/index.jsp中47行,把if(condition){condition=iniConditions;}改为if(!condition){condition=iniConditions;}就可以了。员工列表是正确的,你也可以参照它。
这里我添加了个默认设置iniConditions,它的定义在../hxtg/public/dwr/util.js中。如果要为每个页面单独设置,可以这样写:
if(!condition){condition={properties:[],operators:[],values:[],page:1,size:12};}
其它都照写,把size改为你需要的每页行数就可以了
shim 2008-05-09
谢谢分享,学习一下
不过我添加了21个部门都还没分页
没找到分页设置的地方哦

还有,holly-x.gif图标貌似显示隐藏用的。
但没效果啊
fangang 2008-05-08
xk84123 写道
问题的原因是,dwr调用方法后,如果返回的POJO中包含延迟加载的属性,那么系统就会抛出session closed的异常。转换器我使用的是Hibernate3,如果用bean转换器的话,就失去延迟加载的意义了。

然后我在web.xml中配置了OpenSessionInViewFilter,虽然不会抛出异常了。但是我无法get设置了延迟加载的属性,返回的都是null。

一些朋友说,在return POJO之前,先把需要的属性添加到集合中或者使用Hibernate.initliz。但是这些解决方案都不够灵活,您有更好的方法吗?

如果有描述不清楚的地方还请见谅,麻烦您了。


你的问题可能是:hibernate的延迟加载只能在应用服务器端有效,但dwr往往要到浏览器端才会去读取值对象的属性,因此再也不可能延迟加载了。我认为解决这个问题的办法就是提前加载,也就是在应用服务器端加载,因为作为开发人员肯定知道随后的程序需要读取哪些属性。因此,我在daoSupport.jar中提供了一个方案,你可以看看com.htxx.service.dao.PreloadProps,具体的使用见我的示例中EmployeeBusImp中的这一段:
public ResultSet findEmployee(Condition condition) {
		return new PreloadProps(this.getDao().query(Employee.class, condition),
				new PreloadProxy(){
					public Object[] PreloadProperty(Object vo) {
						Employee emp = (Employee)vo;
						return new Object[]{emp.getDepartment()};
					}}
		);
	}
fangang 2008-05-08
bbwang8088 写道
你好,对你发表dwr演示程序很感兴趣,但是我按照你所写步骤不能运行,我的运行环境是tomcat5.5、jdk1.5。能否把你的web容器内的dwr演示程序直接给我看看,可以的话发我邮箱bbwang8088@126.com,谢谢。

这个示例是在jdk1.4下编写的,但一些朋友告诉我他们在jdk1.5下也可以运行。不知道你是什么问题,可以把错误信息挑关键的发上来。
beyondqinghua 2008-04-17
LZ的DAO好象没共享吧,这才是我想看到的东西!
jaketyao 2008-01-31
不错。项目刚好用到这个!
saintchaos 2008-01-30
我的测试运行环境是eclipse3.2,用内建的tomcat作为服务器,测试下来,当我按第一次时,并不会显示一条记录,按多次后也是有几次不出现然后集中在一起出现好几条记录,然后还会出现concurrentmodificationexception异常,请问问题在哪?

package org.chaos.dwr;

import java.util.ArrayList;

import java.util.List;



public class UserManager {

private List<User> users = new ArrayList<User>();



public void add(final User user){

synchronized(this){

users.add(user);

}

}



public List<User> getAll(){

synchronized(this){

return users;

}

}

}



public class User {


private String id;

private String name;

private String title;




public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}




public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}
}



<?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="jsmanager" creator="new" scope="application">

<param name="class" value="org.chaos.dwr.UserManager"></param>

</create>

<convert match="org.chaos.dwr.User" converter="bean"></convert>

</allow>
</dwr>



<?xml version="1.0" encoding="UTF-8"?>

<html>

<head>

<style>

.usersTable {

background: #FFFFFF;

border-collapse: collapse;

}



.usersTable th {

background: #DDDDDD;

border: 1px solid #FFFFFF;

}



.usersTable td {

border: 1px solid #FFFFFF;

}



.usersTable tr {

background: #FFBBBB;

border: 1px solid #FFFFFF;

}



</style>

<script type='text/javascript' src='/DWR2.0/dwr/interface/jsmanager.js'></script>

<script type='text/javascript' src='/DWR2.0/dwr/engine.js'></script>

<script type='text/javascript' src='/DWR2.0/dwr/util.js'></script>

<script type='text/javascript'>

window.onload = function() {

jsmanager.getAll(fillTable);

}



function addUser() {

var user = { id:"", name:"", title:"" };

DWRUtil.getValues(user);

jsmanager.add(user);

jsmanager.getAll(fillTable);

}



var cellFuncs = [

function(data) { return data.id; },

function(data) { return data.name; },

function(data) { return data.title; }

];



function fillTable(users) {

DWRUtil.removeAllRows("usersBody");

DWRUtil.addRows("usersBody", users, cellFuncs);

}

</script>



</head>



<body>

<h3>Edit User</h3>

<table class="usersTable">

<thead>

<tr>

<th>id</th>

<th>Name</th>

<th>Title</th>

</tr>

</thead>

<tbody id="usersBody" />

</table>



<br />



<table>

<tbody>

<tr>

<td>Id:</td>

<td><input id="id" type="text" size="30" /></td>

</tr>

<tr>

<td>Name:</td>

<td><input id="name" type="text" size="30" /></td>

</tr>

<tr>

<td>Title:</td>

<td><input id="title" type="text" size="30" /></td>

</tr>

<tr>

<td><input type="button" value="add" onclick="addUser()" /></td>

</tr>

</tbody>

</table>



</body>

</html>
GG_wg 2008-01-30
最好能在配置文件里加上注释
fangang 2007-12-21
javachs 写道
部署了,可是单行无法编辑呀?
单击每行后面的编辑按钮,进入编辑窗口进行编辑
javachs 2007-12-18
部署了,可是单行无法编辑呀?
fangang 2007-12-11
yaojunneww 写道
不过能不能把生成的class文件的步骤说下,怎么才能先生成后调用
你看看这篇文章就明白了: DWR帮助文档-dwr.xml文件的配置
yaojunneww 2007-12-10
不过能不能把生成的class文件的步骤说下,怎么才能先生成后调用
yaojunneww 2007-12-10
刚才发现,这框架也太厉害了,自动生成service。
simon1118 2007-12-10
谢谢,正好也在用这三个框架做项目
yaojunneww 2007-12-10
还是不太明白,我现在正在学它,但是我看不到service包的代码,但你说它自动生成,能不能说具体点,
fangang 2007-12-10
frostytop 写道
兄弟,少了部分代码啊,service层的代码都没有啊,能不能给一个全的代码,谢谢

采用dwr配合spring这种框架,dwr可以直接调用spring中的bean,因此它与以前框架的一个巨大的不同就是不需要service层,也就是说dwr帮我们把service层完成了,我们完全不用写任何代码。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

fangang
搜索本博客
我的相册
10f6052e-a238-46fd-b6d3-b62321b2c51d-thumb
MultiSessionFactory
共 4 张
存档
最新评论