大部分實驗室的項目採用的框架版本太舊了。這次,我嘗試着自己搭建一個最簡單的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。異常。具體事務管理我會在其他的博文中詳細介紹。