Spring MVC教程
Spring Framework可以被使用在很多場合之中,考慮到目前大多數Java EE的項目是B/S結構的,所以這里的快速上手教程會以Spring MVC為切入點,用最簡單的代碼一步一步來實現一個圖書列表的頁面。
在正式動手之前需要做一些準備工作,先安裝并設置好JDK 1.5和Tomcat 5,關于數據庫及其訪問方式可以根據個人習慣進行選擇,教程中使用MySQL數據庫和Hibernate(映射由Hibernate Annotation實現)。請將實際使用到的jar文件復制到WEB-INF/lib目錄中,整個項目的結構見圖1,教程中用到的jar文件見圖2。
項目中的Bean定義分散在多個XML文件中,每完成一部分代碼就給出相應的配置,最后再進行整合和部署。配置中使用default-autowire="byName"實現了Bean的自動織入,節省了很多個工作量,只需注意Bean及屬性的命名即可。
Step 1.Business Objects & DAO
教程中的例子涉及到兩個實體對象,代表文章的Article類和代表作者的Author類,分別對應了數據庫中的article表和author表,一篇文章有一個作者,而一個作者可以有多篇文章。類的代碼如下(省略getter和setter):
代碼:Article.java
















代碼:Author.java


















在MySQL中創建數據表的SQL語句如下,數據請自行添加(如果使用Hibernate,表可以根據映射自動生成,具體做法請參考Hibernate文檔):
代碼:數據庫創建SQL
















考慮到可能會有多種DAO的實現,所以在DAO層先定義一個IArticleDao接口,隨后可以自由選擇具體的實現方式,此處結合Spring的HibernateDaoSupport使用Hibernate來進行實現:
代碼:IArticleDao.java










代碼:ArticleDao.java















接下來對Hibernate進行相應的配置,如果使用了JDO或者iBatis,請參考Spring文檔。applicationContext-dao.xml內容如下:
代碼:applicationContext-dao.xml
















































此處如果使用JNDI提供數據源,請根據注釋進行調整。Spring的事務管理需要聲明事務管理器,由于Hibernate、JDO、JDBC的事 務管理器都不一樣,所以將其與其他事務的配置分開存放。此外,配置中的一些參數使用了占位符(形如${}),這些內容將在Step 4中進行加載。
Step 2.Service
Service層只是調用DAO中的方法為控制器提供圖書列表,Service最好能先給出接口,隨后進行實現,但此處的功能比較簡單,就直接進行實現了:
代碼:ArticleService.java


















Spring通過setArticleDao方法為ArticleService注入DAO,也可以選擇通過構造方法注入,2.5中還能用@Autowired進行注入。
applicationContext-services.xml內容如下:
代碼:applicationContext-services.xml










Step 3.Controller & View
Spring MVC提供了多種實現控制器的方式,此處直接實現Controller接口,開發一個單一動作的簡單控制器,從Service中取得圖書列表,提供給視圖進行呈現,ListArticleController內容如下:
代碼:ListArticleController.java




























ModelAndView中保存了要傳遞給視圖的對象和具體要使用的視圖文件,自2.0起, Spring MVC提供了Convention over Configuration的機制,大大簡化了代碼與配置。簡單地說,名字以Controller結尾的控制器類都會被映射為相應的地 址,ListArticleController對應/listarticle*,如果是MultiActionController則會被映射為一個目 錄;向ModelAndView添加對象時可以不用指定鍵(key),單一對象的鍵取決于類名,比如x.y.User的鍵是user,而某一類對象的 Set、List或數組則稍有些復雜,取第一個對象的類名加上“List”作為它的鍵,比如這里的articles是一個存放Article對象的 List,它的鍵就是articleList;具體的視圖會根據請求自動在指定目錄中尋找對應的視圖文件,本例中就會尋找listarticle(后綴由 配置文件決定)。關于Convention over Configuration還有些別的細節,請參考Spring文檔的相關章節。
此處的視圖比較簡陋,只是一張表格,顯示了圖書的編號、書名和作者,使用JSTL的<c:forEach>標簽來遍歷列表,具體代碼如下:
代碼:listarticle.jsp



























為了使用Spring MVC,需要在web.xml中配置一個分派器,將一些特定格式的請求交給Spring MVC來處理(其實就是一個Servlet,這和Struts有些類似),如果它的名字是dispatcher,那么Spring默認會去尋找名為 dispatcher-servlet.xml的配置文件,該文件內容如下:
代碼:dispatcher-servlet.xml























配置中的DefaultRequestToViewNameTranslator和 ControllerClassNameHandlerMapping就是用來實現Convention over Configuration的,而名為viewResolver的Bean則指定了一些視圖的信息。
Step 4.Configuration & Deployment
至此,大部分的工作已經完成了,接下來就是加載properties文件和配置事務屬性,這些都放在applicationContext.xml中:
代碼:applicationContext.xml


































pointcut屬性確定了AOP攔截的方法,用的是AspectJ pointcut expression,此處對demo.service中每一個類的所有方法都進行了攔截,也就是它們都在事務中執行。
config.properties中保存了一些與數據庫和Hibernate相關的配置信息,它們會代替XML中對應的占位符:
代碼:config.properties















最后要看到的就是web.xml,每個Java EE的Web項目都會有這個配置文件,具體內容如下:
代碼:web.xml








































































此處加載了Spring的配置文件,并對字符編碼進行了處理,*.do和*.html的請求都轉交給了Spring MVC的分派器。OpenSessionInViewFilter是用來解決Hibernate的OpenSessionInView問題的,如果沒有使 用Hibernate則無需配置此過濾器。
項目的部署和一般的Web項目沒有任何區別,將項目打成War包或者直接將目錄放到Tomcat的webapps中即可。假設目錄的名字是SpringDemo,啟動Tomcat后訪問http://localhost:8080/SpringDemo/listarticle.html就能看到頁面的效果了。