論壇首頁 Java企業應用論壇

SSH框架xml版整合搭建圖文教程

瀏覽 83 次
精華帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隱藏帖 (0)
作者 正文
   發表時間:2019-06-03   最后修改:2019-06-03

文章轉載自:https://www.jiweichengzhu.com/article/d063714d7af04f699cd6779b498ae96d

如果還有問題,加群交流:686430774

案例代碼下載,請移步原文鏈接!

SSH框架(struts + spring + hibernate),在spring沒有出現之前用的非常多,最近整理以前的筆記,看到很早之前寫的三大框架案例,重新整理了一下,來寫一篇SSH框架的基礎搭建教程,方便自己回憶,也幫助剛入行的新人們學習,由于是很早的筆記,框架的版本也稍微落后了一些,但是一些核心的理念還是沒怎么變化,這里就懶得升級版本了。

數據庫表見resources目錄下的wolff.sql文件,項目結構也很簡單,傳統的MVC模式,struts充當控制器,spring負責容器的管理和事務托管,主要利用了它的ioc來解耦,hibernate提供orm映射機制,方便數據庫操作,簡化sql操作。

版本信息如下:

Struts版本:2.3.20

Spring版本:4.1.5.RELEASE

Hibernate版本:4.3.8.Final

工程目錄如下:

SSH框架基礎整合搭建圖文教程?

結構沒什么多說的,配置文件中一些難理解的地方,當時我都加上了注釋,這次也沒什么過多改動,力求言簡意賅!

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <!-- spring配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 可以自己指定配置文件位置 -->
        <param-value>classpath:applicationContext.xml</param-value>
        <!-- <param-value>/WEB-INF/applicationContext.xml</param-value> -->
    </context-param>

    <!-- struts配置 -->
    <filter>
        <filter-name>struts</filter-name>
        <!--不同版本中配置的不一樣,低版本中,filter-class配置就不是這個class類-->
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>*.action</url-pattern>
        <!-- <url-pattern>/*</url-pattern> -->
    </filter-mapping>

    <!-- 默認頁面 -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

?

這里需要注意一下filter的配置中的注釋,filter-class需要注意版本信息,不同版本配置的是不一樣的。

struts.xml:?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <!-- 打開DMI動態方法,2.3.15之前默認true,之后默認false -->
    <!-- DMI用法: test!add.action -->
    <!-- <constant name="struts.enable.DynamicMethodInvocation" value="true" /> -->

    <!-- struts2的action必須放在一個指定的包空間下定義 -->
    <package name="default" extends="struts-default">
        <!-- 聲明全局的返回結果 -->
        <global-results>
            <result name="fail">/error.jsp</result>
        </global-results>

        <!-- 這里action標簽需要放到最下面,不然會報錯 -->
        <!-- DMI動態方法:閃瞎雙眼的時刻即將到來,在2.3.15之后已經默認為false關閉,需要自己手動打開,不然一個勁兒404,官方表明此種方法有漏洞,推薦使用通配符方式 -->
        <action name="test1" class="com.ssh.controller.StudentController">
            <result name="success">/index.jsp</result>
            <!-- 重定向 -->
            <!-- <result name="redirect" type="redirectAction">test1!showlist.action</result> -->
        </action>

        <!-- 指定method:每個用到的方法都需要為其配置一個action,比較麻煩 -->
        <action name="test2" class="com.ssh.controller.StudentController" method="list">
            <result name="success">/index.jsp</result>
        </action>

        <!-- 通配符:官方推薦使用,如school_list,就是訪問controller中的list方法 -->
        <!-- {1}表示通配符的第一個,可以有多個,并且在result標簽中也可以使用 -->
        <action name="school_*" class="com.ssh.controller.SchoolController" method="{1}">
            <!-- <result name="{1}">/{1}.jsp</result> -->
            <result name="list">/school_list.jsp</result>
            <result name="add">/school_maintain.jsp</result>
            <result name="update">/school_maintain.jsp</result>
            <result name="refresh" type="redirectAction">school_list.action</result>
        </action>

        <action name="student_*" class="com.ssh.controller.StudentController" method="{1}">
            <result name="list">/student_list.jsp</result>
            <result name="add">/student_maintain.jsp</result>
            <result name="update">/student_maintain.jsp</result>
            <result name="refresh" type="redirectAction">student_list.action</result>
        </action>

        <action name="book_*" class="com.ssh.controller.BookController" method="{1}">
            <result name="list">/book_list.jsp</result>
            <result name="add">/book_maintain.jsp</result>
            <result name="update">/book_maintain.jsp</result>
            <result name="refresh" type="redirectAction">book_list.action</result>
        </action>
    </package>
</struts> 
?

截止到我當時做筆記的時候,struts總共有三種映射方式:

一對一映射:比較常見,每一個請求都需要在struts.xml中配置一個action,是早期的方式,非常麻煩;

DMI動態映射:利用感嘆號動態映射,如:test!a.action就代表TestController中的a請求,官方不推薦使用;

通配符映射:利用花括號{}的方式進行匹配,不太好描述,大家看我上面配置文件中的注釋;

applicationContext.xml:

?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 	http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

    <!--配置數據源,可以選擇c3p0、druid等,這里直接使用spring的DataSource數據源-->
    <!--也可以選擇在hibernate.cfg.xml中配置數據源,在這里為了事務的方便管理,將數據源交給spring管理-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true"/>
        <property name="username" value="test"/>
        <property name="password" value="111111"/>
    </bean>

    <!--hibernate的session工廠相關配置-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <!--指定數據源-->
        <property name="dataSource" ref="dataSource"/>
        <!--配置jdbc屬性-->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.autoReconnect">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <!-- 引入映射文件,有兩種方式:-->
        <!-- 1、直接將配置文件寫在spring配置中 -->
        <!--
        <property name="mappingResources">
            <list>
                <value>sqlmap/Book.hbm.xml</value>
                <value>sqlmap/School.hbm.xml</value>
                <value>sqlmap/Student.hbm.xml</value>
            </list>
        </property>
        -->
        <!-- 2、引用外部配置文件,在hibernate配置文件中統一配置 -->
        <property name="configLocations">
           <list>
               <value>classpath:hibernate.cfg.xml</value>
           </list>
       </property>
    </bean>

    <!-- 事務管理 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- 模板,作為公用,調用是只需要加上parent屬性指向這里,不然每個bean中都需要加上這些配置 -->
    <bean id="transactionalTemplate" abstract="true"
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!-- 引入事務管理器 -->
        <property name="transactionManager" ref="transactionManager"/>
        <!-- 配置事務的傳播屬性 -->
        <property name="transactionAttributes">
            <props>
                <!-- 事務管理的方法、方式 -->
                <!-- 例如:add開頭的方法 -->
                <!-- <prop key="add*">PROPAGATION_REQUIRED</prop> -->
                <!-- PROPAGATION_REQUIRED:如果存在一個事務,則支持當前事務。如果沒有事務則開啟。 -->
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

    <!-- dao中注意,需要使用parent將相應的事務管理引入進來,因為每個dao都寫一遍是不現實的,所以抽出公用 -->
    <!-- 使用xml方式注入時,這里的dao不是用接口方式不行? -->
    <bean id="schoolDao" parent="transactionalTemplate">
        <property name="target">
            <bean class="com.ssh.dao.impl.SchoolDaoImpl">
                <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
        </property>
    </bean>
    <bean id="studentDao" parent="transactionalTemplate">
        <property name="target">
            <bean class="com.ssh.dao.impl.StudentDaoImpl">
                <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
        </property>
    </bean>
    <bean id="bookDao" parent="transactionalTemplate">
        <property name="target">
            <bean class="com.ssh.dao.impl.BookDaoImpl">
                <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
        </property>
    </bean>

    <!-- service中注意,需要使用property將相應的dao變量引入進來,否則注入為空 -->

    <bean id="schoolService" class="com.ssh.service.impl.SchoolServiceImpl">
        <property name="schoolDao" ref="schoolDao"/>
    </bean>
    <bean id="studentService" class="com.ssh.service.impl.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"/>
    </bean>
    <bean id="bookService" class="com.ssh.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

</beans>

?

相對于SpringMVC來說,就是只保留了bean管理和事務兩塊二配置,也沒什么多說的,配置方式跟現在也都一模一樣。

hibernate.cfg.xml:

?

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- 如果沒有直接在spring配置文件中集成相關映射文件,就需要在這里配置好,然后再引入到spring中 -->
<hibernate-configuration>

    <session-factory>

<!--        如果么有使用spring托管數據源,就可以在這里進行配置-->

<!--        &lt;!&ndash; 指定連接數據庫所用的驅動 &ndash;&gt;-->
<!--        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>-->
<!--        &lt;!&ndash; 指定連接數據庫的url,hibernate連接的數據庫名 &ndash;&gt;-->
<!--        <property name="connection.url">jdbc:mysql://localhost/數據庫名</property>-->
<!--        &lt;!&ndash; 指定連接數據庫的用戶名 &ndash;&gt;-->
<!--        <property name="connection.username">root</property>-->
<!--        &lt;!&ndash; 指定連接數據庫的密碼 &ndash;&gt;-->
<!--        <property name="connection.password">32147</property>-->
<!--        &lt;!&ndash; 指定數據庫方言 &ndash;&gt;-->
<!--        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>-->
<!--        &lt;!&ndash; 根據需要自動創建數據表 &ndash;&gt;-->
<!--        <property name="hbm2ddl.auto">update</property>-->
<!--        &lt;!&ndash; 顯示Hibernate持久化操作所生成的SQL &ndash;&gt;-->
<!--        <property name="show_sql">true</property>-->
<!--        &lt;!&ndash; 將SQL腳本進行格式化后再輸出 &ndash;&gt;-->
<!--        <property name="hibernate.format_sql">true</property>-->

<!--        下面是使用c3p0數據庫進行數據源配置的樣例-->

<!--        &lt;!&ndash; 指定連接池里最大連接數 &ndash;&gt;-->
<!--        <property name="hibernate.c3p0.max_size">20</property>-->
<!--        &lt;!&ndash; 指定連接池里最小連接數 &ndash;&gt;-->
<!--        <property name="hibernate.c3p0.min_size">1</property>-->
<!--        &lt;!&ndash; 指定連接池里連接的超時時長 &ndash;&gt;-->
<!--        <property name="hibernate.c3p0.timeout">5000</property>-->
<!--        &lt;!&ndash; 指定連接池里最大緩存多少個Statement對象 &ndash;&gt;-->
<!--        <property name="hibernate.c3p0.max_statements">100</property>-->
<!--        <property name="hibernate.c3p0.idle_test_period">3000</property>-->
<!--        <property name="hibernate.c3p0.acquire_increment">2</property>-->
<!--        <property name="hibernate.c3p0.validate">true</property>-->

        <!-- 配置映射文件 -->
        <mapping resource="sqlmap/School.hbm.xml"/>
        <mapping resource="sqlmap/Student.hbm.xml"/>
        <mapping resource="sqlmap/Book.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

?

再看一個hibernate的映射文件:

?

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.ssh.entity.Student" table="students">
        <id name="id" type="java.lang.Integer">
            <!-- scale表示小數位 -->
            <column name="id" precision="10" scale="0"/>
            <!-- 如果是oracle,則需要指定自增序列 -->
            <!-- class表示ID的屬性,自增、關聯另外表的主鍵等,在有對應關系時使用 -->
            <!-- <generator class="sequence">-->
            <!--     <param name="sequence">ZZ_STUDENTS</param>-->
            <!-- </generator>-->
            <!--
                主鍵生成策略:
                1. identity : 主鍵自增.由數據庫來維護主鍵值,錄入時不需要指定主鍵值
                2. sequence : Oracle中的主鍵生成策略
                3. increment : 主鍵自增,由hibernate來維護,每次查詢時會先查詢數據庫中的最大值,然后在最大值的基礎上+1
                4. hilo : 高低位算法,主鍵自增,由hibernate維護,開發時不使用
                5. native : hilo+sequence+identity自動三選一
                6. uuid : 產生隨機字符串作為主鍵,主鍵類型必須為string類型
                7. assigned : 自然主鍵生成策略
             -->
        </id>
        <property name="name" type="java.lang.String">
            <column name="student_name" length="50"/>
        </property>
        <property name="sex" type="java.lang.String">
            <column name="student_sex" length="5"/>
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="student_age" precision="5" scale="0"/>
        </property>
        <property name="birthday" type="java.util.Date">
            <column name="student_birthday"/>
        </property>
        <property name="hobby" type="java.lang.String">
            <column name="student_hobby" length="100"/>
        </property>
        <!-- 與學校對應的關系 -->
        <!-- property-ref屬性指定關聯類的屬性名,若不指定,默認關聯主鍵 -->
        <!-- 外鍵一對一,相當于多對一的一種(注意加上unique='true'的限制保證唯一),嚴格意義上的一對一,是要求兩個表主鍵都相同 -->
        <!-- 注意lazy表示延遲加載,false表示立即加載,但是這里不加會報錯 -->
        <many-to-one name="school" column="school_id" unique="true" lazy="false"/>
    </class>
</hibernate-mapping>

?

注意:表之間的對應關系是重點,一對多、多對一這種,一定要先將關系捋清楚,哪個是主哪個是從,找好關聯的點在哪里。

由于代碼中的注釋寫的比較齊全,這里不再過多贅述了,案例比較簡單,就是CRUD,運行效果圖:

SSH框架基礎整合搭建圖文教程?

?

論壇首頁 Java企業應用版

跳轉論壇:
Global site tag (gtag.js) - Google Analytics 全天上海快3计划网 哈密市| 二连浩特市| 松潘县| 闻喜县| 华安县| 会理县| 六安市| 五常市| 龙口市| 云霄县| 内江市| 惠安县| 体育| 平山县| 武功县| 唐海县| 民和| 喀喇| 大同县| 防城港市| 乡城县| 个旧市| 长丰县| 通榆县| 东辽县| 玛纳斯县| 商城县| 堆龙德庆县| 西乌珠穆沁旗| 大同县| 惠水县| 临沂市| 青阳县| 磴口县| 衡山县| 永川市| 陆川县| 成安县|