`
sun4love
  • 浏览: 234536 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

zk+hibernate+spring零配置

    博客分类:
  • zk
阅读更多

 

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(&quot;onClick&quot;,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 -

 

 

 

 

 

 

 

  • 大小: 9.1 KB
  • 大小: 10.5 KB
分享到:
评论
4 楼 Listen_ing 2012-08-14  
zk+spring+hibernate如何配置hibernate的懒加载机制。
我在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的延迟加载在项目里该如何配置
3 楼 peterxq181 2012-06-08  
严重: Method not found in org.apache.commons.lang.StringUtils: boolean endsWith(java.lang.String, java.lang.String) [null:jar:file:/E:/jboss-4.2.3.GA-1/server/default/deploy/zkproject.war/WEB-INF/lib/zktools.jar!/web/WEB-INF/tld/zktools/zktools.tld:9:12]
java.lang.NoSuchMethodException: org.apache.commons.lang.StringUtils.endsWith(java.lang.String, java.lang.String)
2 楼 sun4love 2011-07-07  
ZhuboSky 写道
兄弟啊,<include id="centerVisualer" src="record.zul" style="padding:5px;"></include>其中的"record.zul"页面不存在呵

呵呵,你可以随便添加一个页面,
1 楼 ZhuboSky 2011-07-07  
兄弟啊,<include id="centerVisualer" src="record.zul" style="padding:5px;"></include>其中的"record.zul"页面不存在呵

相关推荐

    ZK+spring+hibernate的整合

    《ZK+Spring+Hibernate整合详解》 ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护...

    zk+spring+hibernate例子

    主要介绍了zk+spring+hibernate的使用方法 早期使用的是 hibernate的配置文件 后来 被改成了 引用注释的方式 老的绑定文件也没有删除,sql下面由数据库文件 导入mysql就可以,不错的教学例子 学习起来很简单

    zk+spring+hibernate整合

    在IT行业中,`ZK`(ZooKeeper)、`Spring`和`Hibernate`都是非常重要的技术组件,分别在分布式协调、应用框架和对象关系映射领域有着广泛应用。本项目是将这三个技术进行整合,用于构建一个基于MySQL数据库的完整...

    zk+spring+hibernate+mysql Demo ()

    使用zk+spring+hibernate+mysql做的demo,只需要修改下MySQL连接字符串就可以运行。因为容量有点大。分卷压缩了,请下全后解压。

    ZK+Spring+Hibernate jar包

    ZK+Spring+Hibernate jar包名稱

    zk+spring+hibernate+mysql demo(2)

    使用zk+spring+hibernate+mysql做的demo,只需要修改下MySQL连接字符串就可以运行。因为容量 有点大。分卷压缩了,请先下载zk+spring+hibernate+mysql demo(),下全后解压。

    zk+spring+hibernate(全部用注解)

    在这个`zk+spring+hibernate(全部用注解)`的项目中,我们将探讨如何完全利用注解来配置和管理这些框架,从而实现更加简洁、高效的代码结构。 `ZK`,全称ZooKeeper,是一个分布式的、开放源码的分布式应用程序协调...

    ZK + Spring + Hibernate

    在名为"SHZ"的压缩包文件中,可能包含了这些整合过程的示例代码、配置文件、教程文档等资源,帮助开发者更好地理解和实践ZK、Spring和Hibernate的整合。通过学习和实践这些内容,开发者可以提升自己的技能,创建出...

    ZK+Spring+Hibernate项目搭建

    本项目采用"ZK+Spring+Hibernate"的技术栈,这是一个常见的Java Web开发组合,旨在提供高效、灵活和可维护的解决方案。下面将详细阐述这三个核心技术及其在项目中的作用。 **ZK框架**: ZK是一个基于组件的Java ...

    zk+spring+hibernate+maven整合项目

    在自个学习zk和其他两个框架整合的时候,总是找不到合适的整合demo进行参考,希望此次上传能对初学者有用,能够给你们一个完整的代码,让你们可以直接把项目运行起来,这样对于开发来说是最重要的

    zk+spring+hibernate增删改查,整合实例,亲测可用

    4. **测试验证**:最后,编写测试用例,确保整合后的系统能够在ZooKeeper的协调下,正常执行Spring+Hibernate的CRUD操作。 这个实例对于理解和掌握分布式环境下基于Spring和Hibernate的业务应用开发非常有帮助,...

    Spring+hibernate+ZK例子

    在"Spring+hibernate+ZK例子"中,可能包含了一个整合这三个技术的应用示例。Spring作为核心框架管理整个应用的生命周期,通过AOP和DI来协调各个组件。Hibernate则被用来处理数据库交互,简化数据存取操作。而ZK可能...

    zk3.5.2+spring2.5+hibernate3.2完整工程

    很多zk初学者对zk与spring和hibernate的整合很头疼,在这花了一晚上的时间整了个完整工程包供大家学习参考,所需jar包很大,都抓成图片了,具体看工程说明. 在遇到zk方面的问题可以加qq群:71714290交流。

    zkoss CE6.0+spring3.0.5+hibernate3.6+oracle10g+mysql5最全包

    这是一个关于企业级应用开发的集成环境包,包含了前端框架ZKoss CE6.0、后端框架Spring3.0.5、ORM框架Hibernate3.6,以及两种数据库Oracle10g和MySQL5。这个组合是早期Java开发中的常见配置,对于理解当时的软件架构...

    [浪曦][原创][A335]Struct+Hibernate+DisplayTag标签+js+Div+css 第1讲(zk原创).rar

    在本课程中,你将学习如何配置Hibernate,创建实体类,以及使用HQL(Hibernate查询语言)进行数据查询和操作。 3. **DisplayTag**: DisplayTag 是一个开源的JSP标签库,主要用于表格展示和复杂的页面布局。它可以...

    zk+jsp实现登录、注册、修改密码小例子

    ZK是一个强大的Java AJAX框架,它简化...通过深入学习和实践,开发者可以进一步了解ZK的高级特性,如Composer、Event Handling、Composer和MVVM模式,以及如何结合其他技术如Spring和MyBatis来构建更复杂的企业级应用。

    spring+springmvc+jpa(hibernate)框架整合

    总的来说,Spring+SpringMVC+JPA(Hibernate)的整合为Java Web应用开发提供了强大的支持,使得我们可以更加专注于业务逻辑,而不是底层的基础设施。这种架构模式在实际项目中广泛应用,能够提高开发效率,降低维护...

    ZK所需jar包

    在ZK、Spring和Hibernate的整合中,Spring通常被用来管理Hibernate的SessionFactory,提供事务管理,并在ZK组件中透明地处理数据访问。 整合这三个框架的过程涉及以下步骤: 1. **设置环境**:确保你有JDK、Maven或...

Global site tag (gtag.js) - Google Analytics