(一)
Appfuse简介
Appfuse是Matt Raible 开发的一个指导性的
入门级J2EE框架,
它对如何集成流行的Spring、Hibernate、ibatis、struts、Xdcolet、junit 等基础框架给出了示范,最
新的1.7版更是提供了对Taperstry和JSF的支持。
在持久层,AppFuse采用了Hibernate O/R映射工具( http://www.hibernate.org);
在容器方面,它采用了Spring Framework( http://www.springframework.org)。
web框架方面:用户可以自由选择
Struts、Spring/MVC,
Webwork,Taperstry、
JSF这几个。
采用TDD的开发方式,使用JUnit测试各层,甚至测试 jsp 输出的w/o 错误。
为了简化开发,预定义好了一套目录结构、基类、用来创建数据库、配置Tomcat、测试部署应用的 Ant 任务,帮助快速自动生成源程序和自动维护部分配置文件。
(二)
1.
Spring中,BeanFactory提供了一种先进的配置机制来管理任何种类bean(对象),
ApplicationContext是BeanFactory的完全超集,我们大部分时间面对的是ApplicationContext,通过它取得 bean,处理bean,而其他的事务管理、远程访问等则交由Spring容器去管理好了。
2.
ApplicationContext可以通过编码加载并实例化,对于web应用,Spring提供了可配置的
ApplicationContext加载机制。
加载器目前有两种选择:
1 : ContextLoaderListener (基于Servlet2.3版本中新引入的Listener接口实现)
2 : ContextLoaderServlet (基于Servlet接口实现)
这两者在功能上完全相同
(三)
AppFuse中的Spring配置
(1)
指定ApplicationContext配置文件的位置,该参数不是必须的如果不指定该参数,web容器会自动加
载 WEB-INF/applicationContext.xml, 并实例化ApplicationContext.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
(2)
AppFuse中的ApplicationContext加载是通过ContextLoaderListener配置实现的.
Web容器启动时,通过ContextLoaderListener,会调用Spring的contextInitialized事件初始化
Spring的ApplicationContext。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-
class>
</listener>
(3)
初始化完ApplicationContext后,就可以通过以下方式引用ApplicationContext来管理beans了:
ApplicationContext ctx =
WebApplicationContextUtils.getRequiredWebApplicationContext(context);
(4)
Spring事务管理两种:
1.
Spring即提供了对于JDBC,Hibernate Trasaction等依赖特定事务资源的事务处理
2.
提供了依赖容器的参数化事务支持(即:又Spring容器管理事务).
(5)
Spring事务管理配置
1.
使用Hibernate提供的OpenSessionInView技术,即在视图层开启和关闭 Session,在service层进行
Transaction管理,这个较为简单,只需要设置一个filter即可,在web.xml中配置
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-
class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.
配置数据源,这里采用Jndi访问方式。
< bean id = " dataSource " class = " org.springframework.jndi.JndiObjectFactoryBean " >
< property name = " jndiName " >
< value > java:comp / env / jdbc / dudu </ value >
</ property >
</ bean >
3.
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>mf/org/user/User.hbm.xml</value>
</list>
</property>
</bean>
/*
这一个 bean 让 spring 为我们注入了什么呢?事务,对!我们把 hibernate 的事务注入到了 spring 的 IOC 容器之中了。
*/
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
/*
这个 bean 又是让 spring 为我们注入了了什么呢?事务代理,对了!我们把事务的代理交给一个 txProxyTemplate 的去做了.
这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的: PROPAGATION_REQUIRED,-Exception 。
当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了;
开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了.
*/
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userManager" parent="txProxyTemplate">
<property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget" class=" mf.org.hb.user.service.impl.UserManagerImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
(6)
数据访问形式:
public class UserDAOHibernate extends BaseDAOHibernate implements UserDAO
{
public void saveUser( final User user) {
getHibernateTemplate().saveOrUpdate(user);
getHibernateTemplate().flush();
}
}
(7)
以下是一些AppFuse中实现的,辅助的Spring监听器和过滤器
7.1
保证Spring所管理的JavaBeans能被正常的初始化和销毁,这个监听器不是 Spring框架必须的。
WEB-INF/web.xml
< listener >
< listener - class >
org.springframework.web.util.IntrospectorCleanupListener
</ listener - class >
</ listener >
7.2
解决Web应用中POST的中文乱码问题,为用户请求定义字符编码,这是因为当前的浏览器一般都不设
置字符编码,即便是你在Html文件获Form中设置了字符编码
WEB-INF/web.xml
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7.3
一般的web容器加载Spring的ApplicationContext配置如下:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-
class>
</listener>
或
< servlet >
< servlet - name > context </ servlet - name >
< servlet - class >
org.springframework.web.context. ContextLoaderServlet
</ servlet - class >
< load - on - startup > 1 </ load - on - startup >
</ servlet >