10.Spring+SpringMVC+JdbcTemplate整合

我看過很多很多寫企業(yè)級(jí)應(yīng)用開發(fā)栽惶、SSH整合之類的書愁溜,一般這種書會(huì)非常非常厚,里面包括好幾個(gè)項(xiàng)目整合的例子外厂,一眼望過去冕象,深不可測(cè),真要拿到手仔細(xì)琢磨一下汁蝶,猛然發(fā)現(xiàn)沒什么東西渐扮,都是代碼的粘貼论悴,講原理實(shí)際的很少很少。當(dāng)然我這講的更淺了墓律,不過沒關(guān)系膀估,先了解一個(gè)大概,然后必須在實(shí)際項(xiàng)目中不斷歷練耻讽,不斷吸取別人的架構(gòu)知識(shí)察纯,然后慢慢轉(zhuǎn)換為自己的,這樣自己的水平就會(huì)大幅提高齐饮。在國(guó)內(nèi)編程就是一個(gè)相互抄襲或相互借鑒的過程捐寥,誰借鑒的水平高,誰就是牛人了祖驱。

這里也講整合握恳,整合的內(nèi)容就是Spring+SpringMVC+JdbcTemplate,都是Spring系列捺僻,整合起來也就非常容易了乡洼。

pom.xml依賴

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.3.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.25</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

這里沒什么新的,和SpringMVC的依賴一樣匕坯。

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <!-- 加載spring容器配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 設(shè)置Spring容器加載配置文件路徑 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
         classpath:applicationContext.xml
        </param-value>
    </context-param>
    <!-- 字符編碼過濾器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>*.htm</url-pattern>
    </filter-mapping>

    <!-- ================spring mvc 適配器================ -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
</web-app>

這是web啟動(dòng)的初始配置束昵,這里面包括了三段,第一段是啟動(dòng)通過listener加載spring的配置葛峻,第二段是設(shè)置系統(tǒng)的編碼锹雏,這個(gè)是通過過濾器來完成的,第三段是SpringMVC的啟動(dòng)配置术奖,都比較簡(jiǎn)單礁遵,而且很通用,不管是大項(xiàng)目還是小項(xiàng)目采记,基本都是這樣佣耐,一定要記住。

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" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd"
    default-autowire="byName" default-lazy-init="true">
    
    <context:annotation-config />
    <context:component-scan base-package="com.critc"></context:component-scan>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/test" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>

    <!-- 注入jdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>


    <!-- 利用AOP配置事務(wù)處理 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource">
        </property>
    </bean>
    <aop:config>
        <aop:pointcut id="bussinessService"
            expression="execution(public * com.critc.service.*.*(..))" />
        <aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="import*" propagation="REQUIRED" />
            <tx:method name="*" read-only="true" />
        </tx:attributes>
    </tx:advice>
</beans>

Spring的配置文件唧龄,設(shè)置數(shù)據(jù)源兼砖、設(shè)置jdbcTemplate,設(shè)置事務(wù)既棺,也很經(jīng)典讽挟,大部分的項(xiàng)目也都是這么配置的

servlet-context.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.critc"/>

    <!-- 默認(rèn)的注解映射的支持,自動(dòng)注冊(cè)DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven/>

    <!-- 視圖解釋類 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>

    <!-- 對(duì)靜態(tài)資源文件的訪問-->
    <mvc:resources mapping="/assets/**" location="/assets"/>
</beans>

這是SpringMVC的配置丸冕,也是最核心的耽梅。

剩下的就是對(duì)應(yīng)Staff的幾個(gè)類了,包括model晨仑、dao、service、controller洪己,這些很簡(jiǎn)單妥凳,就不說了。

下面說一下在實(shí)際項(xiàng)目中dao和service層的接口問題答捕。

很多書上在說這一塊的時(shí)候逝钥,都會(huì)寫到,先建立一個(gè)dao的接口拱镐,然后再建立對(duì)應(yīng)的實(shí)現(xiàn)impl艘款,具體為什么要這么做,原因是靈活沃琅。

靈活是一個(gè)很抽象的概念哗咆,什么是靈活,什么是不靈活益眉,沒有明確的定義晌柬。咱們?cè)陂_發(fā)中好多也按照教科書的模板,先建立接口郭脂,再寫實(shí)現(xiàn)類年碘。有沒有體現(xiàn)靈活的特性呢,好像沒感覺到展鸡,唯一的想法就是高端大氣上檔次了屿衅,代碼能拿得出手了,代碼是面向接口的編程莹弊,而不是面向具體實(shí)現(xiàn)的涤久。

我來說一下我的理解。面向接口編程是一個(gè)很高端的話題箱硕,一般架構(gòu)師都是這么想的拴竹,我只寫接口,實(shí)現(xiàn)隨便找個(gè)人來寫就可以了剧罩。在ssh這一套架構(gòu)里面栓拜,如果只有一個(gè)實(shí)現(xiàn)類,那就不用寫接口了惠昔,很麻煩的幕与,接口的好處也體現(xiàn)不出來。就是說直接面向?qū)崿F(xiàn)編程镇防,比如StaffDao啦鸣、StaffService就是對(duì)應(yīng)的實(shí)現(xiàn)類,能省下好多好多代碼和時(shí)間来氧。當(dāng)然這有一個(gè)前提诫给,就是項(xiàng)目不大香拉,開發(fā)人員不多的情況下。如果一個(gè)項(xiàng)目非常大中狂,開發(fā)團(tuán)隊(duì)也有好多人凫碌,這時(shí)接口的好處就能體現(xiàn)出來,直接看接口文件就能知道具體有哪些實(shí)現(xiàn)胃榕。如果用到很多設(shè)計(jì)模式的話盛险,接口是不可避免的,這就不是ssh的范疇了勋又。

簡(jiǎn)單來講就是項(xiàng)目簡(jiǎn)單苦掘,人少,就不用接口了楔壤,項(xiàng)目超級(jí)大鹤啡,人也多,就用接口挺邀,規(guī)范一下揉忘。對(duì)很多人來講,90%的情況就是項(xiàng)目不大端铛,開發(fā)人員就那么幾個(gè)人泣矛,這種情況下,直接實(shí)現(xiàn)就可以了禾蚕,不用秀架構(gòu)的高端與否您朽,省事才是最主要的。

源碼下載

本工程詳細(xì)源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末换淆,一起剝皮案震驚了整個(gè)濱河市哗总,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倍试,老刑警劉巖讯屈,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異县习,居然都是意外死亡涮母,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門躁愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叛本,“玉大人,你說我怎么就攤上這事彤钟±春颍” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逸雹,是天一觀的道長(zhǎng)营搅。 經(jīng)常有香客問我云挟,道長(zhǎng),這世上最難降的妖魔是什么转质? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任植锉,我火速辦了婚禮,結(jié)果婚禮上峭拘,老公的妹妹穿的比我還像新娘。我一直安慰自己狮暑,他們只是感情好鸡挠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搬男,像睡著了一般拣展。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缔逛,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天备埃,我揣著相機(jī)與錄音,去河邊找鬼褐奴。 笑死按脚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敦冬。 我是一名探鬼主播辅搬,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼脖旱!你這毒婦竟也來了堪遂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤萌庆,失蹤者是張志新(化名)和其女友劉穎溶褪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践险,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猿妈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捏境。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于游。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垫言,靈堂內(nèi)的尸體忽然破棺而出贰剥,到底是詐尸還是另有隱情,我是刑警寧澤筷频,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布蚌成,位于F島的核電站前痘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏担忧。R本人自食惡果不足惜芹缔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓶盛。 院中可真熱鬧最欠,春花似錦、人聲如沸惩猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧房。三九已至拌阴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奶镶,已是汗流浹背迟赃。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厂镇,地道東北人纤壁。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捺信,于是被迫代替她去往敵國(guó)和親摄乒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理残黑,服務(wù)發(fā)現(xiàn)馍佑,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,806評(píng)論 6 342
  • SSM框架詳細(xì)整合 介紹 Spring + SpringMVC + Mybatis是現(xiàn)在輕量級(jí)J2EE框架方案中梨水,...
    2MuchT閱讀 5,229評(píng)論 3 14
  • 2016年4月22日-24日拭荤,2016血液免疫高峰論壇在杭州召開,浙江大學(xué)醫(yī)學(xué)院附屬第一醫(yī)院黃河教授首次報(bào)告了10...
    可愛天使_15a5閱讀 429評(píng)論 0 0
  • 閉包的概念:自包含的函數(shù)代碼塊 閉包的分類: 1.全局函數(shù)(有名字)疫诽,即第四節(jié)講到的函數(shù) 2.閉包表達(dá)式(匿名)...
    芝麻醬的簡(jiǎn)書閱讀 421評(píng)論 0 0