- 浏览: 234575 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
newLinuxJava:
http://www.voip-info.org/wiki/v ...
asterisk App Dial 拨号 发起外呼 -
newLinuxJava:
http://www.voip-info.org/wiki/v ...
asterisk App Dial 拨号 发起外呼 -
tsinglongwu:
这种做法在Server端getValue()方法是能获得修改后 ...
client-side programming客户端修改值,但服务端获取仍然旧值的解决办法 -
Listen_ing:
zk+spring+hibernate如何配置hibernat ...
zk+hibernate+spring零配置 -
peterxq181:
严重: Method not found in org.apa ...
zk+hibernate+spring零配置
zk+hibernate+spring零配置
zk5.0.5
hibernate3.6
spring3.05
也许你在使用apply或者use一个类名的或者<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
那么下面的方法对你也许是一种更优雅的方式
一,spring自动扫描注解配置,如果熟悉ss2h,看起来没什么不同
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <description>系统配置信息</description> <!-- 定义受环境影响易变的变量 --> <context:property-placeholder location="/WEB-INF/config/application.properties" /> <!-- --> <!-- 数据源配置 --> <!-- --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> <property name="minPoolSize" value="${jdbc.minPoolSize}"> </property> <property name="initialPoolSize" value="${jdbc.initialPoolSize}"> </property> <property name="maxIdleTime" value="${jdbc.maxIdleTime}"> </property> <property name="acquireIncrement" value="${jdbc.acquireIncrement}"> </property> <property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}"> </property> <property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}"> </property> <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"> </property> <property name="preferredTestQuery" value="${jdbc.preferredTestQuery}"> </property> <property name="numHelperThreads" value="${jdbc.numHelperThreads}"> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop> <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop> <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop> <prop key="hibernate.connection.autocommit">${hibernate.connection.autocommit}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cglib.use_reflection_optimizer">${hibernate.cglib.use_reflection_optimizer}</prop> </props> </property> <property name="packagesToScan" value="org.zkway.entity" /> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 --> <context:component-scan base-package="org.zkway" /> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> </beans>
二,zk controller 注解配置,注意scope必须是prototype,因为composer是一个状态对象
@Controller @Scope("prototype") public class LoginController extends GenericAutowireComposer {
三,页面中使用ctrl
首先要引入我自定义的el函数库,zktools工具将在下面讲到
<?taglib uri="http://www.zkoss.org/zktools/zktools" prefix="z" ?>
然后在window apply中使用,其中z是prefix="z" 中的z,ctrl是zktools.jar中定义的一个el函数,这个和c标签很类 似, 'loginController'是【二】中LoginController类spring 受管理bean名字,通常我们喜欢使用
长长的类路径apply="org.zkway.web.controller.LoginController",
但这样创建的对象不是spring管理,你无法向LoginController类里注入service,当然你可以使用SpringUtil.getBean
获取bean事例,但就丧失使用annotation的好处了
<window apply="${z:ctrl('loginController')}" width="300px"
完整使用
<?xml version="1.0" encoding="utf-8"?> <?page cacheable="false" language="xul/html" zscriptLanguage="Java" contentType="text/html;charset=UTF-8"?> <?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c" ?> <?taglib uri="http://www.zkoss.org/zktools/zktools" prefix="z" ?> <div style="background: url('images/headerbg.png') repeat-x; background-position:0 -53px;height:100%;" xmlns:w="client" xmlns:n="native" xmlns="http://www.zkoss.org/2005/zul" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd"> <window apply="${z:ctrl('loginController')}" width="300px" height="140px" onOK="Events.postEvent("onClick",btnLogin,null);" mode="overlapped" position="center,top" style="margin-top:100px;">
四,获取spring bean的el函数
在【三】中的页面zul中,我们仅仅简单的使用了一个表达式${z:ctrl('loginController')}, 这个表达式由
zk框架解释,还记的我们在页面首部添加的一个指令吗?
<?taglib uri="http://www.zkoss.org/zktools/zktools" prefix="z" ?>
和jsp c标签类似, zk中的标签也是在tld文件中定义的,大部分的web容器都可以自动加载tld文件,
zk也是一样,但zk不会自动加载tld,它自动加载类路径下的一个metainfo/tld/config.xml文件,这是zk的约定
在config.xml文件中我定义了如下内容,当然这些也是zk的约定,taglib-location告诉zk框架tld文件位置,
那么zk自动去找这个文件并解析
<?xml version="1.0" encoding="UTF-8"?> <!-- by sunflower --> <config> <version> <version-class>org.zkway.zktools.Version</version-class> <version-uid>1.0</version-uid> </version> <taglib> <taglib-uri>http://www.zkoss.org/zktools/zktools</taglib-uri> <taglib-location>/web/WEB-INF/tld/zktools/zktools.tld</taglib-location> </taglib> </config>
那么我们看看zktools.tld里如何定义的
<!-- --> <!-- 获取spring 管理bean --> <!-- --> <function> <name>ctrl</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.lang.Object getController(java.lang.String)</function-signature> <description>获取spring 管理controller</description> </function> <function> <name>comp</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.lang.Object getComponent(java.lang.String)</function-signature> <description>获取spring 管理组件对象</description> </function> <function> <name>bean</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.lang.Object getBean(java.lang.String)</function-signature> <description>获取spring 管理bean对象</description> </function> <!-- --> <!-- 工具函数 --> <!-- --> <function> <name>size</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>int size(java.lang.Object)</function-signature> <description>获取一个对象的大小</description> </function> <function> <name>length</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>int size(java.lang.Object)</function-signature> <description>获取一个对象的大小</description> </function> <function> <name>empty</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>boolean isEmpty(java.lang.Object)</function-signature> <description>判断一个对象是否是空对象</description> </function> <!-- --> <!-- 日期工具函数 --> <!-- --> <function> <name>now</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.util.Date currentTime()</function-signature> <description>获取当前时间</description> </function> <function> <name>today</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.util.Date today(int, int, int)</function-signature> <description>获取今天的日期时间,可以指定今天时分秒,-1表示不设置</description> </function> <function> <name>firstDayOfMonth</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.util.Date firstDayOfMonth()</function-signature> <description>获取当前月的第一天</description> </function> <function> <name>lastDayOfMonth</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.util.Date lastDayOfMonth()</function-signature> <description>获取当前月的最后一天</description> </function> <function> <name>fmtDate</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.lang.String formatDate(java.lang.String)</function-signature> <description>根据参数指定的模式,格式化当前日期</description> </function>
1)<name>定义了el函数的名字,例如${z:ctrl('loginController')}中的ctrl对应以下中的ctrl
<function> <name>ctrl</name> <function-class>org.zkway.zktools.ZkCommonTools</function-class> <function-signature>java.lang.Object getController(java.lang.String)</function-signature> <description>获取spring 管理controller</description> </function>
2)function-signature函数指定了函数签名,具体哪个函数
3)function-class为function-signature函数所属的类
4)description为函数描述
那么这个函数必须符合什么规范呢:public,static 可以不是final
public class ZkCommonTools { /** * 获取spring管理的控制器对象, * <p> * * 支持的类型为:{@link Composer},{@link Component},{@link FullComposer} * * @param beanName * @return */ public static final Object getController(String beanName) { Object controller = SpringUtil.getBean(beanName); if (controller instanceof Composer) return controller; else if (controller instanceof FullComposer) return controller; else if (controller instanceof Component) return controller; return null; }
五,总结
首先我们在spring的配置中开启自动扫描
<!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 --> <context:component-scan base-package="org.zkway" />
将controller注册为spring bean
@Controller @Scope("prototype") public class LoginController extends GenericAutowireComposer {
然后我们需要解决的问题是如何获取bean,如果直接apply或use一个类名,
那么类实例由zk创建,我们无法享受spring管理bean给我们带来的任何好处。
也许会这么做,就是在forward到一个zul页面前,先将spring bean放在可用作用域(execution,request,session,ThreadLocal),
然后目标页面直接使用el表达式获取${reqeustScope['loginController']},但实际项目中,下一站到底是什么,大多数情况我们是无法预知的,
只有到达目标你才能知道结果,所以预先读取bean很多情况下有他的局限性。
在本文中我定义了一个el函数ctrl,这个函数的参数为spring bean名字,el函数的返回值是spring管理的bean事例
大致流程如下
spring scan bean ---> register controller bean ---> el function 获取 spring bean -->zk interpret -
- zk_spring_hibernate零配置.part3.rar (5.2 MB)
- 下载次数: 443
- zk_spring_hibernate零配置.part1.rar (7 MB)
- 下载次数: 443
- zk_spring_hibernate零配置.part2.rar (7 MB)
- 下载次数: 533
- zktools函数库.rar (4.4 KB)
- 下载次数: 274
- zktools源码.rar (2.4 MB)
- 下载次数: 366
评论
我在web.xmlz中加入如下代码
<!-- 解决hibernate延迟加载出现的问题,要放在Struts2过滤器之前 -->
<!--
作用:Spring管理hibernate的Session,在事务管理的类执行完后,不立刻关闭Session,
而将Session保存在一个线程变量中,在线程退出前关闭Session;这样在整个request过程中
始终使用一个session,也就可以在request的任何时期lazy loading数据。 主要是为了实现hibernate的延迟加载功能
-->
<filter>
<filter-name>lazyLoadingFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<!-- singleSession默认设置为true,如何为false就等于没有设置OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>lazyLoadingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这段代码是我做ssh2开发时用的,现在放到这里,启动没有报错,在登录的时候,LoginController.java中这段代码报错
public void onLogin() {
try {
if (StringUtils.isBlank(txtUsername.getText())
|| StringUtils.isBlank(txtPassword.getText())) {
clearUserInput();
return;
}
User user = userService.login(txtUsername.getText(),
txtPassword.getText());
user.setLastIp(Executions.getCurrent().getRemoteHost());
ZkUtils.setSessionAttribute(LinkContext.SESSION_USER, user);
user.setPassword(null);
userService.updateUser(user);
ZkUtils.sendRedirect("/");
具体报错地方为
user.setPassword(null);
不加web.xml中那段代码,你的程序运行没有问题,
在登录的时候,提示password字段不能为空,当然是后台报错了
而且password字段值在数据库显示已被修改过了,不是之前的值
我又把web.xml中那段代码去掉,重新部署,和以前一样,可以正常运行,而且password字段没有被修改
我看不明白你的代码这里是什么意思user.setPassword(null);而且这样也可以运行不出错!费解!
再请教一下,hibernate的延迟加载在项目里该如何配置
java.lang.NoSuchMethodException: org.apache.commons.lang.StringUtils.endsWith(java.lang.String, java.lang.String)
呵呵,你可以随便添加一个页面,
发表评论
-
zk主题生成器
2011-09-27 20:37 1805生成器在附件内,兼容zk3.x 与zk5.x,zkth ... -
zk服务器端获取鼠标点击位置
2011-09-08 22:24 2741index.zul <?xml version=&qu ... -
zk Fiddle-zk在线测试保存代码分享平台
2011-09-02 10:40 2074http://zkfiddle.org/ 是zk项目组之一To ... -
zksample2-一个复杂应用的zk示例
2011-09-02 10:32 2139Zksample2 is a demo application ... -
zk5.0.8发布
2011-08-31 18:02 1219该版本是一个维护版本,主要于bug修复及引入几个新特性 ... -
zk数据绑定
2011-08-21 23:53 3825简介: 关于数据绑定:数据绑定是一种机制,在UI组件和数据源 ... -
zk EE/PE/CE的区别
2011-08-18 10:32 4500自从zk5.0以后,zk拆分为 EE / PE / CE ... -
ZK 5.0.8 新特性
2011-08-17 19:03 37108月16日,zk官网:zk5.0.8将要发布 z ... -
zk client与server code结合提高长操作的响应性
2011-08-17 15:58 1320一,关于长操作与响应性 zk client ... -
zk tooltiptext中换行
2011-06-10 23:10 2304<window title="My ... -
zk下载文件中文乱码解决方案
2011-06-02 11:44 3831本文来自http://sun4love.iteye.co ... -
【zk视频】如何了解一个组件默认支持服务器端事件
2011-05-25 15:48 1300如何了解一个组件默认支持服务器端事件? 知识点:在 ... -
【zk视频】如何查看zk源码,了解zk原理
2011-05-25 15:09 1438当org.zkoss.zul.Window关闭时,zk是如何工 ... -
ZK 5.0.7发布,及新特性
2011-05-12 09:27 1341ZK是一套以 AJAX/XUL/Java 为基础的网页应用程式 ... -
use【组件公共属性】
2011-04-12 22:52 1228语法 apply="a-class-nam ... -
zk异步请求异常,自定义错误页面的bug
2011-04-08 13:38 1494zk版本5.0.6 现在遇到一个问题,觉得是b ... -
zk扩展工具--spring集成--字符串处理--日期处理
2011-04-07 12:22 1611事例 <?taglib uri ... -
一张图让你清晰理解zk架构事件流程
2011-03-06 12:17 1556一张图让你清晰理解zk架构事件流程 -
zk组件事件调用的顺序
2011-03-02 13:09 2330将此文赠送给zk群朋友:易语静人(455938495) ... -
了解include组件
2011-02-17 12:12 2171了解include组件 预备知识: 加 ...
相关推荐
《ZK+Spring+Hibernate整合详解》 ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护...
主要介绍了zk+spring+hibernate的使用方法 早期使用的是 hibernate的配置文件 后来 被改成了 引用注释的方式 老的绑定文件也没有删除,sql下面由数据库文件 导入mysql就可以,不错的教学例子 学习起来很简单
在IT行业中,`ZK`(ZooKeeper)、`Spring`和`Hibernate`都是非常重要的技术组件,分别在分布式协调、应用框架和对象关系映射领域有着广泛应用。本项目是将这三个技术进行整合,用于构建一个基于MySQL数据库的完整...
使用zk+spring+hibernate+mysql做的demo,只需要修改下MySQL连接字符串就可以运行。因为容量有点大。分卷压缩了,请下全后解压。
ZK+Spring+Hibernate jar包名稱
使用zk+spring+hibernate+mysql做的demo,只需要修改下MySQL连接字符串就可以运行。因为容量 有点大。分卷压缩了,请先下载zk+spring+hibernate+mysql demo(),下全后解压。
在这个`zk+spring+hibernate(全部用注解)`的项目中,我们将探讨如何完全利用注解来配置和管理这些框架,从而实现更加简洁、高效的代码结构。 `ZK`,全称ZooKeeper,是一个分布式的、开放源码的分布式应用程序协调...
在名为"SHZ"的压缩包文件中,可能包含了这些整合过程的示例代码、配置文件、教程文档等资源,帮助开发者更好地理解和实践ZK、Spring和Hibernate的整合。通过学习和实践这些内容,开发者可以提升自己的技能,创建出...
本项目采用"ZK+Spring+Hibernate"的技术栈,这是一个常见的Java Web开发组合,旨在提供高效、灵活和可维护的解决方案。下面将详细阐述这三个核心技术及其在项目中的作用。 **ZK框架**: ZK是一个基于组件的Java ...
在自个学习zk和其他两个框架整合的时候,总是找不到合适的整合demo进行参考,希望此次上传能对初学者有用,能够给你们一个完整的代码,让你们可以直接把项目运行起来,这样对于开发来说是最重要的
4. **测试验证**:最后,编写测试用例,确保整合后的系统能够在ZooKeeper的协调下,正常执行Spring+Hibernate的CRUD操作。 这个实例对于理解和掌握分布式环境下基于Spring和Hibernate的业务应用开发非常有帮助,...
在"Spring+hibernate+ZK例子"中,可能包含了一个整合这三个技术的应用示例。Spring作为核心框架管理整个应用的生命周期,通过AOP和DI来协调各个组件。Hibernate则被用来处理数据库交互,简化数据存取操作。而ZK可能...
很多zk初学者对zk与spring和hibernate的整合很头疼,在这花了一晚上的时间整了个完整工程包供大家学习参考,所需jar包很大,都抓成图片了,具体看工程说明. 在遇到zk方面的问题可以加qq群:71714290交流。
这是一个关于企业级应用开发的集成环境包,包含了前端框架ZKoss CE6.0、后端框架Spring3.0.5、ORM框架Hibernate3.6,以及两种数据库Oracle10g和MySQL5。这个组合是早期Java开发中的常见配置,对于理解当时的软件架构...
在本课程中,你将学习如何配置Hibernate,创建实体类,以及使用HQL(Hibernate查询语言)进行数据查询和操作。 3. **DisplayTag**: DisplayTag 是一个开源的JSP标签库,主要用于表格展示和复杂的页面布局。它可以...
ZK是一个强大的Java AJAX框架,它简化...通过深入学习和实践,开发者可以进一步了解ZK的高级特性,如Composer、Event Handling、Composer和MVVM模式,以及如何结合其他技术如Spring和MyBatis来构建更复杂的企业级应用。
总的来说,Spring+SpringMVC+JPA(Hibernate)的整合为Java Web应用开发提供了强大的支持,使得我们可以更加专注于业务逻辑,而不是底层的基础设施。这种架构模式在实际项目中广泛应用,能够提高开发效率,降低维护...
在ZK、Spring和Hibernate的整合中,Spring通常被用来管理Hibernate的SessionFactory,提供事务管理,并在ZK组件中透明地处理数据访问。 整合这三个框架的过程涉及以下步骤: 1. **设置环境**:确保你有JDK、Maven或...