关于jsf spring 和hibernate集成,对spring和hibernate比较熟悉,因为都在用这个框架,而对jsf还是第一次接触,jsf也是一个mvc框架,jsf提供了很多组件(当然,我现在还不是很熟,只是有个大概的认识),给我的感觉就像swing,同样,组件也就action,这个action可以对应一个javabean的方法,然后根据配置文件配置的导航,跳转到不同的页面。
对于spring,我还算比较熟悉,当然spring也提供了自己的mvc,不过spring最主要的还是ioc,spring就像一个大工厂,通过配置文件的配置,在程序启动的时候,就把所有的对象创建出来,我们可以通过配置讲一个对象注入到另一个对象中,在使用spring的时候,几乎所有的对象都是通过ioc注入到对象中的;spring另外两个常用的功能便是aop和它提供的事务管理。
hibernate在整个系统中处在orm层,是一种数据持久化技术,它利用映射文件来把数据库中的记录映射成具体的对象以及对象之间的级联关系。hibernate还提供了自己的脚本语言(hql),hibernate提供了灵活的配置和丰富的api,可以通过配置文件和这些api方法,采用多种方式对数据库进行操作;但hibernate也有很多缺点,毕竟它是对jdbc的进一步封装,没能发挥数据库的全部功能,比如不能通过hibernate对数据库中的视图进行增删改查(不过听说hinernate3.0已经支持对视图的查询了,还没研究过)。同样用hibernate对数据库进行批量删除和批量更新效率也非常的慢。
现在讲解一下这三者的集成:
jar包是不可少的,自己导入就ok了,
1, 首先要加载jsf的配置文件,在web.xml中添加下面的配置
- <context-param>
- <param-name>javax.faces.CONFIG_FILES</param-name>
- <param-value>/WEB-INF/faces-config.xml</param-value>
- </context-param>
- <listener> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener
- </listener-class>
- </listener>
2,配置一个jsf的servlet和过滤器
- <servlet>
- <servlet-name>Faces Servlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet
- </servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>*.jsf</url-pattern>
- </servlet-mapping>
- <filter>
- <filter-name>MyFacesExtensionsFilter</filter-name>
- <filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter
- </filter-class>
- <init-param>
- <param-name>maxFileSize</param-name>
- <param-value>20m</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>MyFacesExtensionsFilter</filter-name>
- <url-pattern>*.jsf</url-pattern>
- </filter-mapping>
下面过滤器的作用是如果用户发出一个jsf的请求,系统会按着这个jsf请求的名称去自动寻找这个jsp页面,
所有的以.jsf为后缀名的请求都会去请求这个servlet了,这样只要编写一个jsp页面,用这个页面的名字在加上.jsf就能够显示页面的内容了。
比如有一个页面的文件名是welcome.jsp,用户请求的地址应该是welcome.jsf。
3,因为我们还要用到spring,在web.xml中还要加载spring的配置文件
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/application.xml
- /WEB-INF/springDao.xml
- </param-value>
- </context-param>
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
Spring的配置文件可以被分解为多个,可以用回车或逗号分开
4,Spring与Jsf的集成
Spring为jsf提供了解析spring中Bean的类,在Jsf的配置文件中配置如下
- <application>
- <variable-resolver>
- org.springframework.web.jsf.DelegatingVariableResolver
- </variable-resolver>
- </application>
这样在jsf的配置文件中可以直接调用spring中定义的bean了,就想调用jsf中的bean一样。
5,Spring与Hibernate的集成
Hibernate的映射文件和sessionFactory是由spring的配置文件来管理的Spring提供了一个SessionFactory的类,配置如下:
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName">
- <value>${jdbc.driverClassName}</value>
- </property>
- <property name="url">
- <value>${jdbc.url}</value>
- </property>
- <property name="username">
- <value>${jdbc.username}</value>
- </property>
- <property name="password">
- <value>${jdbc.password}</value>
- </property>
- </bean>
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.DB2Dialect
- </prop>
- <prop key="hibernate.show_sql">
- false
- </prop>
- </props>
- </property>
- <property name="mappingResources">
- <list>
- <value>model/User.hbm.xml</value>
- </list>
- </property>
- </bean>
其中数据源的配置是利用了资源文件,因此还需要配置一个解析资源文件的bean,
- <bean id="propertyConfigurer"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>WEB-INF/jdbc.properties</value>
- </list>
- </property>
- </bean>
当然也可以不用资源文件,直接在dataSource那儿写上驱动,地址,用户名和密码也是可以的
程序员在写Dao层的类的时候,要继承HibernateDaoSupport的类
至此,jsf+spring+hibernate的集成已经全部结束