all gone

          all gone

          SSH(Spring + Struts + Hibernate)小試 之二

          Spring和Struts結合有幾種方法,我選了最常用的PlugIn方式,在struts-config.xml中加入

          <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
          ??????<set-property property="contextConfigLocation"
          ?????????? ?value="/WEB-INF/action-servlet.xml" />
          ?</plug-in>

          WEB-INF目錄下的action-servlet.xml就是Spring的配置文件,下面給出的是整個的action-servlet.xml文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "<beans>

          //Data Source

          ?<bean id="dataSource"
          ??class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          ??<property name="driverClassName">
          ???<value>com.mysql.jdbc.Driver</value>
          ??</property>
          ??<property name="url">
          ???<value>jdbc:mysql://localhost:3306/forum</value>
          ??</property>
          ??<property name="username">
          ???<value>test</value>
          ??</property>
          ??<property name="password">
          ???<null />
          ??</property>
          ?</bean>

          // For Hibernate
          ?<bean id="sessionFactory"
          ??class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          ??<property name="dataSource">
          ???<ref local="dataSource" />
          ??</property>
          ??<property name="mappingResources">
          ???<list>
          ????<value>com/lzy/forum/domain/User.hbm.xml</value>
          ????<value>com/lzy/forum/domain/Article.hbm.xml</value>
          ????<value>com/lzy/forum/domain/Board.hbm.xml</value>
          ???</list>
          ??</property>
          ??<property name="hibernateProperties">
          ???<props>
          ????<prop key="hibernate.dialect">
          ?????org.hibernate.dialect.MySQLDialect
          ????</prop>
          ????<prop key="hibernate.show_sql">true</prop>
          ???</props>
          ??</property>
          ?</bean>

          ?<bean id="transactionManager"
          ??class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          ?

          // For DAO
          ?<bean id="userDAO"
          ??class="com.lzy.forum.dao.impl.UserDAOHibernate">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          ?

          ?<bean id="boardDAO"
          ??class="com.lzy.forum.dao.impl.BoardDAOHibernate">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          ?<bean id="articleDAO"
          ??class="com.lzy.forum.dao.impl.ArticleDAOHibernate">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          //For Struts Action

          ?<bean name="/regist" class="com.lzy.forum.action.RegistAction"
          ??singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>

          ?</bean>


          ?<bean name="/login" class="com.lzy.forum.action.LoginAction"
          ??singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/boardManage"
          ??class="com.lzy.forum.action.BoardManageAction" singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/boardNavigate"
          ??class="com.lzy.forum.action.BoardNavigateAction" singleton="false">
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/boardDisplay"
          ??class="com.lzy.forum.action.BoardDisplayAction" singleton="false">
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/articleManage"
          ??class="com.lzy.forum.action.ArticleManageAction" singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>
          ??<property name="articleDAO">
          ???<ref local="articleDAO" />
          ??</property>


          ?</bean>


          </beans>

          經過這樣的配置之后,Hibernate事務交由Spring管理,sessionFactory從Spring容器獲得。下面通過其中的一個DAO實例來看看這樣做帶來的方便。


          //BoardDAO.java

          package com.lzy.forum.dao;

          import java.util.ArrayList;

          import com.lzy.forum.domain.Board;

          public interface BoardDAO {
          ?
          ?public boolean isBoardExist(String name);
          ?
          ?public void addBoard(Board board);
          ?
          ?public void deleteBoard(Board board);
          ?
          ?public Board loadBoard(int id);
          ?
          ?public Board loadBoard(String name);
          ?
          ?public Board loadBoardWithArticles(int id);
          ?
          ?public ArrayList getRootBoardsList();
          ?
          ?
          ?
          }


          //BoardDAOHibernate.java

          package com.lzy.forum.dao.impl;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.ListIterator;
          import java.util.Set;

          import org.hibernate.Hibernate;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          import com.lzy.forum.dao.BoardDAO;
          import com.lzy.forum.domain.Board;

          public class BoardDAOHibernate extends HibernateDaoSupport implements BoardDAO {

          ?public void deleteBoard(Board board) {
          ??// TODO Auto-generated method stub
          ??this.getHibernateTemplate().delete(board);
          ?}

          ?public void addBoard(Board board) {
          ??// TODO Auto-generated method stub
          ??this.getHibernateTemplate().saveOrUpdate(board);

          ?}

          ?public boolean isBoardExist(String name) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board where name = ? ", new Object[] { name });
          ??if (list.size() > 0) {
          ???// System.out.println("find it");
          ???return true;
          ??}
          ??return false;
          ?}

          ?public Board loadBoard(int id) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board where id = ? ", new Object[] { id });

          ??Board b = null;
          ??if (list.size() > 0) {
          ???b = (Board) list.get(0);
          ??}

          ??return b;
          ?}

          ?public Board loadBoard(String name) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board where name = ? ", new Object[] { name });

          ??Board b = null;
          ??if (list.size() > 0) {
          ???b = (Board) list.get(0);
          ??}

          ??return b;
          ?}

          ?public ArrayList getRootBoardsList() {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board b left join fetch b.ChildBoards where b.Parent = null order by b.id");
          ??System.out.println(list.size() + " root boards found ");
          ??

          ??ListIterator index = list.listIterator();
          ??while (index.hasNext()) {

          ???Board s = (Board) index.next();
          ???//this.getSession(true);
          ???//Hibernate.initialize(s.getChildBoards());
          ???///*
          ??? Set children? = (Set) s.getChildBoards();
          ??? Iterator it = children.iterator();
          ???
          ??? while(it.hasNext()){
          ??? Board b = (Board)it.next();
          ??? //Hibernate.initialize(b);
          ??? System.out.println(b.getName());
          ??? }
          ??? //*/

          ???//System.out.println(children.size() + "child(ren) found ");
          ???//s.setChildBoards(s.getChildBoards());
          ??}

          ??return list;
          ?}

          ?public Board loadBoardWithArticles(int id) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });

          ??Board b = null;
          ??if (list.size() > 0) {
          ???b = (Board) list.get(0);
          ??}

          ??return b;

          ?}


          }


          BoardDAOHibernate繼承 HibernateDaoSupport后,通過getHibernateTemplate()得到一個HibernateTemplate實例,然后執行CRUD操作,非常簡單。需要注意的是,由于執行一次CRUD操作后,Hibernate session關閉,如果有使用延遲加載策略的對象沒有加載,在后面的Web層很容易出現如下錯誤:
          failed to lazily initialize a collection of role
          從網上搜到的解決方法是Open Session In View,
          <filter>
          ???? <filter-name>hibernateFilter</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>hibernateFilter</filter-name>
          ???? <url-pattern>*.do</url-pattern>
          ?? </filter-mapping>
          我試了試,還是有一些問題,所以后來還是放棄了這種方法,所有在Web層中需要的對象都必須在Business層中加載完成。如下面的代碼所示:

          ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });


          這樣Hibernate和Spring的結合也算完成了。其他的一些DAO類和實現代碼我沒有給出,但是大同小異,和Board的實現類似。


          最后將是Struts 和Spring的結合,將在下一篇給出。(未完待續)





          posted on 2006-07-18 16:09 all gone 閱讀(953) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 绥芬河市| 加查县| 丹棱县| 济阳县| 城步| 乌拉特后旗| 黑龙江省| 邻水| 炉霍县| 资阳市| 浦北县| 泌阳县| 沾化县| 武安市| 米林县| 蓬莱市| 云梦县| 牙克石市| 永川市| 盐城市| 夏河县| 安阳县| 治多县| 临颍县| 博白县| 大宁县| 开化县| 竹山县| 潼关县| 滦南县| 金寨县| 北流市| 阳朔县| 深泽县| 长阳| 洛扎县| 襄樊市| 确山县| 桦甸市| 扬州市| 黑山县|