天天看點

Spring+Velocity+Mybatis整合筆記(step by step)

本文是我對自己學習過程的一個回顧,應該還有不少問題待改進,例如目錄的設定、編碼習慣和配置檔案的處理等,請大家多多指正。

文中用到的開發工具列舉如下:

jdk 1.7.0_79

intellij idea ultimate 14

mysql 5.6.25

maven 3

git、sourcetree

第一步建立工程,選擇maven工程,如圖1所示。注意,“create from archetype”是一些maven的工程模闆,在這裡我們為了學習要從頭開始自己配置。

Spring+Velocity+Mybatis整合筆記(step by step)

圖1 建立maven工程

點選next,出現設定工程坐标的頁面,如圖2所示。groupid 是公司組織的标号;artifactid是項目名稱;綜合來看,在src/main/java目錄下會建立對應的包結構:groupid.artifactid。

Spring+Velocity+Mybatis整合筆記(step by step)

圖2 設定工程坐标

點選next,出現設定工程名字的界面,如圖3所示。這裡跟之前的artifactid一樣就可以,設定完後選擇finish完成工程建構。我們這個示例項目采用的是單子產品項目,我猜這裡是設定子產品相關的吧,還需繼續學習。

Spring+Velocity+Mybatis整合筆記(step by step)

圖3 設定工程名字

我們不需要從頭開始寫.gitignore檔案,已經有人為我們準備好了模闆檔案,隻需要在模闆檔案的基礎上稍作修改即可。

首先要給idea安裝.gitignore插件,然後在工程名字上右擊建立.gitignore檔案,通過插件可以根據項目的内容選擇需要忽略的檔案或者檔案夾。在這裡我選擇了三個類型:java、jetbrains、osx三個模闆的組合檔案。因為maven編譯生成的目錄名為target,我又增加了target檔案夾的忽略,如圖4所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖4 .gitignore檔案内容

通過sourcetree,建立本地倉庫,将目标路徑設定為usersdemo工程的根目錄,如圖5所示。倉庫初始化完成後,我們的項目就在git管理之下了,可以開始下一步了。

Spring+Velocity+Mybatis整合筆記(step by step)

圖5 使用sourcetree

三個月後補充:極力推薦大家使用idea自帶的git插件,非常棒,可以可視化解決沖突。

首先在pom.xml檔案中修改配置,通過properties标簽統一管理依賴庫的版本,友善後續更新;通過dependencies标簽管理所有的庫依賴,本次增加的配置代碼如下所示:

接下來為項目增加spring mvc架構支援,也就是每個web項目都應該有的web檔案夾等等。具體操作如圖6和圖7所示。其中spring mvc架構的庫已經不用下載下傳,使用我們之前在pom中下載下傳好的庫即可。

Spring+Velocity+Mybatis整合筆記(step by step)

圖6 add framework support

選擇相應的web架構和庫檔案

Spring+Velocity+Mybatis整合筆記(step by step)

圖7 add framework support

添加完成後,要對項目的目錄結構做一些調整:将web檔案夾移動到src/main/目錄下,并重命名為webapp,調整後的目錄結構如圖8所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖8 調整後的目錄結構

web.xml的作用是配置dispatcherservlet,在springmvc項目中dispatcherservlet作為前端控制器。伺服器給使用者的接口名并不是真正的servlet類的名字,隻是一個邏輯名稱,由dispatcherservlet完成這個邏輯名稱到真正的servlet類的映射過程。

在web.xml的代碼中,org.springframework.web.servlet.dispatcherservlet的執行個體名稱為usersdemo,這個servlet-name 非常重要,預設情況下,dispatcherservlet在加載時會從一個機遇這個servlet名字的xml檔案中加載spring應用上下文,在這裡,因為servlet-name是usersdemo,是以dispatcherservlet将會從usersdemo-servlet.xml檔案中加載應用上下文。現在項目的目錄結構圖如圖9所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖9 目前項目目錄結構

通過servlet-mapping标簽指定由usersdemo這個dispatcherservlet執行個體處理哪些映射,在這裡我們設定為“/”,即聲明該dispatcherservlet執行個體會吹所有的請求,包括靜态資源的請求。

最後,web.xml的代碼列舉如下:

dispatcherservlet需要咨詢一個或者多個處理器映射器來決定要将請求發送給哪個控制器,我們這裡常用的處理器映射器是defaultannotationhandlermapping:即将請求映射給使用@requestmapping注解的控制器和控制器方法。

最新的spring的發展趨勢是依靠注解來減少xml配置,是以我們在usersdemo.xml中添加下面一行配置,就可以得到spring mvc提供的注解驅動測試

我們将會給控制器類添加@controller來表明這是一個控制器類,這個類是@component的子類,也就是說可以通過"context:component-scan标簽"來查找控制器類并将其自動注冊為bean。需要再usersdemo.xml中添加下面一行配置:

經過了上一步的鋪墊,控制器的代碼比較簡單。@controller注解告訴spring這是一個控制器類,要将它注冊為bean;@requestmapping注解告訴spring将"/showusers“接口,并且http方法是get的請求由showuser方法處理。

在showuser方法中我們使用servlet直接列印http響應内容,很熟悉的hello系列。

userscontroller的代碼列舉如下:

配置maven的建構過程

在pom檔案中要增加兩個配置,第一個是打包格式;第二個是build生成檔案的名稱。

相關的配置代碼為:

配置并運作tomcat

在idea中配置tomcat的步驟有下面幾步:

(1)在螢幕右上角,選擇”edit configuration“,如圖10所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖10 edit configuration

(2)選擇建立一個本地的tomcat容器,如圖11所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖11 run/debug configuration

(3)配置項目的釋出方式為:usersdemo:war exploded,并且将應用程式上下文設定為"/usersdemo",如圖12所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖12 配置部署方式和上下文環境

(4)配置tomcat容器的安裝位址、啟動伺服器後是否需要自動啟動浏覽器、有檔案修改或者檢查到新的架構時容器如何反應,我們這裡選擇”update classes and resources“,如圖13所示。

(5)啟動tomcat容器,url為:http://localhost:8080/usersdemo/showuser。

最後的運作效果如圖所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖14 通路效果圖

使用sourcetree對剛才修改和增加的代碼進行送出,如圖15所示,對于commit message要盡量簡潔。

Spring+Velocity+Mybatis整合筆記(step by step)

圖15 送出commit

velocity的存在是為了輔助前後端分離:後端接口開發人員可以專心于提供資料、前端人員可以使用占位符(模闆檔案)暫時代替資料。渲染:将占位符替換為真正的變量值,并生成最終的網頁頁面。

首先在pom.xml中編輯,下載下傳velocity的支援庫,包括三個支援:velocity、velocity-tool、spring-context-support。

添加的依賴代碼如下:

在usersdemo-servlet.xml檔案中配置velocity視圖解析器。配置代碼如下:

控制器的作用是根據請求調用bll層提供的service執行個體,當服務接口傳回處理結果後,由控制器将模型對象和邏輯視圖名稱傳回。在這裡還不涉及模型資料,是以隻關注邏輯視圖,解析器根據這個邏輯視圖名稱,再加上在usersdemo-servlet.xml檔案中定義的視圖解析器設定,找到對應的模闆檔案進行渲染。

控制器的代碼如下:

現在的模闆檔案非常簡單,就是一句話:”hello velocity!!“,現在項目目錄結構和模闆檔案如圖16所示(注意路徑與usersdemo-servlet.xml中配置的對應關系)。

Spring+Velocity+Mybatis整合筆記(step by step)

圖16 模闆檔案示例

啟動tomat伺服器,運作結果如圖17所示。

Spring+Velocity+Mybatis整合筆記(step by step)

圖17 測試velocity解析器

通過sourcetree送出commit。

mybatis 的着力點,則在于pojo 與sql之間的映射關系。然後通過映射配置檔案,将sql所需的參數,以及傳回的結果字段映射到指定pojo。 相對hibernate“o/r”而言,mybatis是一種“sql mapping”的orm實作。

在pom.xml檔案中增加相應的支援庫,包括mybatis、mybatis-spring、commons-dbcp2、mysql-connector-java等庫。其中commons-dbcp2是用作管理資料庫連接配接池。

增加的配置代碼如下:

Spring+Velocity+Mybatis整合筆記(step by step)

圖18 users表結構

Spring+Velocity+Mybatis整合筆記(step by step)

圖19 users表中的資料

資料源的配置在applicationcontext.xml中完成,具體的配置代碼如下:

在資料庫中,id字段我們設定為自動增加。user.java的代碼如下

要和 spring 一起使用 mybatis,你需要在 spring 應用上下文中定義至少兩樣東西:一個 sqlsessionfactory 和至少一個資料映射器類。在 mybatis-spring 中,sqlsessionfactorybean 是用于建立 sqlsessionfactory 的。

首先建立一個接口usermapper,完成請求方法(getuser)到sql語句的映射,代碼下所示:

接着在applicationcontext.xml檔案中增加配置,将usermapper接口加入到spring容器中,配置代碼如下所示:

至此,dao和資料庫層就已經配置好了。

首先增加userservice接口,代碼如下:

然後增加userserviceimpl實作,代碼如下:

在applicationcontext.xml中配置userservieimpl的執行個體bean,由于已經在代碼中使用@autiwired注解,是以不需要在配置檔案中顯式得規定屬性以及提供setter函數。配置代碼如下:

控制器的邏輯依舊十分簡單,就是三個步驟:

修改後的控制器代碼如下:

在模闆中使用資料就像使用真正的java對象的資料一樣,我們修改後的模闆代碼如下:

這次請求的通路結果如圖20所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖2o 結果展示

該url對應的結果如圖21所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖21 結果展示

至此,一個spring+mybatis+velocity架構構成的簡陋的demo就完成一個查詢功能了,通過sourcetree記錄裡程碑。

我們在這一步還做了一個調整,将applicationcontext.xml調整到src/main/resources檔案夾下。對此我的想法是将應用程式配置檔案放在resources目錄,至于是不是合理,還請各位看官讨論。

如上所示,一個接口從前端後資料庫已經打通了,但是,每次都要等前端頁面寫好了才能開始測試?這樣效率太低了,可不可以将前後端的工作分開,讓後端人員能夠專注于提供接口,并可以及時測試?可以,單元測試。

由于控制器層是非常薄的一層,負責将傳入的url請求傳到bll層對應的service執行個體進行處理。我們可以假定控制器層的代碼不需要測試,那麼隻要service層保證自己的接口正确就ok。java中最流行的單元測試架構是junit,這裡探讨如何在junit的testcase中自動注入service執行個體。

首先在pom.xml中添加測試庫支援,配置代碼如下:

第二,在src/test/java下建立包,與src/main下保持一緻,在這裡我要測試的類是userserviceimpl,是以建立com.alibaba.yunos.usersdemo.service。

建立測試類userserviceimpltest,該類的代碼如下:

@runwith(springjunit4classrunner.class)是為spring 3接入junit 4架構,從spring 3開始提供;

@contextconfiguration("classpath*:/applicationcontext.xml")是加載該類中使用的bean所在的配置檔案

根據上文第一到第六步,我們接着給這個demo增加新的接口:adduser、allusers和deleteuser。

具體的步驟如下:

在usermapper中增加接口getallusers,代碼如下:

在userservice中增加新的接口getallusers,代碼如下:

在userserviceimpl中實作該接口,代碼如下:

在usercontroller控制器中增加allusers接口,代碼如下:

在/web-inf/templates下增加allusers.vm檔案,内容為:

結果如圖22所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖22 allusers接口測試結果

發現有亂碼如圖23所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖23 出現亂碼錯誤

亂碼錯誤是web開發中經常遇到的問題,我的經驗是在每個資料傳輸的節點上都要保持一緻,在這裡我們用utf-8。看一下資料從前端頁面輸入到存到背景資料庫的流程可以看到,有幾個關鍵點:頁面字元、頁面到controller、dao層到資料庫;最終現在的問題我發現是在頁面向controller轉換的時候沒有強制處理,可能有問題。是以我在contoller裡的adduser方法一開始加了一行代碼<code>system.out.println(name);</code>,再次運作發現終端輸出亂碼,是以确定錯誤位置。

解決錯誤的方法是:在web.xml裡增加過濾器,即當頁面向controller映射之前要先經過該字元過濾器處理,過濾器設定的代碼如下:

再次運作web伺服器測試,通路url:localhost:8080/usersdemo/adduser?name=哈哈&amp;age=18

發現運作結果如圖24所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖24 adduser接口運作成功

要通過查詢參數給定一個id,然後bll層根據給定的id删除指定使用者,這裡沒有考慮到資料庫出錯的處理方式。

為了便于驗證,将使用者的id也取出來,需要做下面兩處修改

代碼修改完成,啟動web伺服器,依次訪下列的url:

<a href="http://localhost:8080/usersdemo/deleteuser?id=8" target="_blank">http://localhost:8080/usersdemo/deleteuser?id=8</a>

<a href="http://localhost:8080/usersdemo/deleteuser?id=9" target="_blank">http://localhost:8080/usersdemo/deleteuser?id=9</a>

<a href="http://localhost:8080/usersdemo/deleteuser?id=100" target="_blank">http://localhost:8080/usersdemo/deleteuser?id=100</a>

結果截圖如圖25所示:

Spring+Velocity+Mybatis整合筆記(step by step)

圖25 deleteuser接口驗證

這裡有一個疑問,删除id為100的時候,資料庫中明顯沒有這個資料,但是背景也沒報出異常,原因還有待我繼續學習,有知道的朋友請留言給我,非常感謝。

寫這篇文字的最初目的是幫助自己回顧一遍前幾天學習的東西,如果能碰巧幫助後來的同學就更好了。排版還有點亂,代碼還很簡陋,希望各位朋友指點一二。

<a href="http://my.oschina.net/aaron74/blog/282304" target="_blank">寫給java web一年左右工作經驗的人</a>

<a href="http://www.atatech.org/articles/37103?rnd=148563666" target="_blank">spring+mybatis+velocity 工程示例</a>

<a href="http://segmentfault.com/a/1190000002870283#articleheader7" target="_blank">spring+mybatis+velocity配置</a>

<a href="http://blog.csdn.net/a123demi/article/details/43156479" target="_blank">spring mvc + mybatis + velocity + maven + mysql整合執行個體</a>

<a href="http://blog.csdn.net/naruto_ahu/article/details/10490283#0-tsina-1-43170-397232819ff9a47a7b7e80a40613cfe1" target="_blank">velocity介紹及文法</a>

<a href="http://mybatis.github.io/spring/zh/index.html" target="_blank">mybatis教程</a>

<a href="http://blog.csdn.net/firejuly/article/details/8190229" target="_blank">mybatis與hibernate的比較</a>

<a href="http://blog.arganzheng.me/posts/junit-and-spring-integration-ioc-autowire.html" target="_blank">junit與spring的整合——junit的testcase如何自動注入spring容器托管的對象</a>

《spring 實戰》