Struts1.3+Spring4.0+Hibernate4.3.5框架搭建

大部分實驗室的項目採用的框架版本太舊了。這次,我嘗試着自己搭建一個最簡單的SSH架構,所用的版本都是現在最新的。搭建之前,看了一下別人的介紹的流程,照着做還是運行不通,可能是版本的問題吧。

毫無疑問,首先是下載相關的包了,當然去官網了,沒的說,挑最新的下。不過那樣就帶了一個問題:包衝突。因爲每個框架要想獨立運行,都會包含一些必要的工具組件,如common-log.jar、log4j.jar,要是不同的框架所包括的工具組件的版本不一樣,自然就衝突了。我已經把SSH架構所需的包上傳上去,全部是官網下載,解決了包衝突問題。下載地址:http://download.csdn.net/detail/u013361010/7979729

首先要在項目配置文件中配置好struts和Spring,以便在項目啓動的時候加載這些框架的配置文件,如下所示:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
  </context-param>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
    熟悉SSH架構的人都應該知道,其中Struts和Hibernate是相互獨立的框架,他們被Spring這個框架容器統一管理着,也就是所要將Struts和Hibernate交給Spring管理。爲把Struts交給Spring管理,如下圖所示:

<action-mapping
  <action
	 path="/modify"
	input="/index.jsp"
	name="addForm"
	 type="org.news.action.AddAction"
  >
	<forward name="success" path="/index.jsp"/>
   </action>
</action-mappings>
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>



其中Controller標籤的配置就是將Struts交給Spring管理,看下Spring的配置文件applicationContext.xml就知道:

<bean name="/modify" class="org.news.action.AddAction">
	  <property name="service" ref="service"/>
</bean>
這樣,當瀏覽器要求請求“/modify.do”時,所要執行的的Action便是“
<span style="font-size:24px;">org.news.action.AddAction”而且其屬性service會被自動注入。</span>
再看Spring是如何管理Hibernate的

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
      <property name="jdbcUrl" value="jdbc:sqlserver://localhost:2996;databaseName=newsDemo"/>
      <property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="user" value="sa"/>
      <property name="password" value="sa"/>
    </bean>
    <!-- 數據源配置end -->
    
    <!-- sessionFatory配置 begin -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <property name="annotatedClasses">
        <list>
          <value>org.news.form.LoginForm</value>
          <value>org.news.form.AddForm</value>
        </list>
      </property>
      <property name="hibernateProperties">
        <props>
          <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
          <prop key="hibernate.show_sql">true</prop>
          <prop key="hibernate.hbm2ddl.auto">update</prop>
          <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
        </props>
      </property>
    </bean>

這裏要提醒注意就是hibernate.current_session_context_class這個屬性的配置,再不能像單獨運行Hibernate一樣配置成thread。

OK,到此爲止SSH的配置已經完了,下面講幾點此版本的SSH和低版本的區別。首先最大的區別是session的獲取,不再是通過sessionFactory.openSession()方法。這個方法爲每次操作創建一個session,而且不會自動關閉,必須手動進行進行關閉,相當麻煩。在此版本中會話的獲取採用session.getCurrentSession(),比如當一個線程創建了一個session,而且還沒有關閉,那麼其他線程要使用session時,就會使用該線程的session,而不會再單獨創建。另外這樣獲取的session在使用完之後會自動關閉,開發者不用擔心。另外,此版的SSH必須註解配置和XML配值都採用org.springframework.orm.hibernate4.LocalSessionFactoryBean類,不做區分。最後最重要的一點是,此版本的SSH中必須做事務管理,否則回報:org.hibernate.HibernateException: No Session found for current thread。異常。具體事務管理我會在其他的博文中詳細介紹。

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章