通過上一篇博客我們可以輕松搭建strtus2的環境,接下來由我來繼續介紹spring的環境搭建以及spring注入的簡單使用
相關鏈接:eclipse中SSH三大k框架環境搭建<一>
eclipse中SSH三大框架環境搭建<三>
本例業務需求:將數據庫一張表的信息通過JDBC查詢出來並顯示在頁面中
流程:action控制層-->service業務層-->dao數據層-->數據庫
第1步:我們還是需要加入spring開發中所需要的jar包
找到下載並解壓好的spring文件,然后找到該文件下的libs目錄下文件,我們可以將所有jar包復制到我們web項目下的lib目錄下
注意:1>***.javadoc.jar文檔和***.sources.jar源碼我們可以不拷貝到我們的項目中,如果想加深自己的理解小編建議大家看看源碼(畢竟這是第一手資料)
2>我們還需要加入commons-logging.jar包。用來記錄程序運行時的活動的日志記錄。該文件在struts2文件中app目錄下的struts2-showcase.war包目錄下的WEB-INF下的lib中
3>我們還需要加入struts2中的一個插件包struts2-spring-plugin-2.3.30.jar(經常容易忘記)
4>由於本例我們還需要操作mySql數據庫因此還需加入數據庫驅動包mysql-connector-java-5.1.39-bin.jar
第2步:由於本例用到了struts所以還是需要先配置strtus.xml文件
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 告知Struts2運行時使用Spring來創建對象 --> 8 <constant name="struts.objectFactory" value="spring" /> 9 <package name="001pck" extends="struts-default"> 10 <action name="Index" class="myIndexAction"> 11 <result name="success">/WEB-INF/jsp/index.jsp</result> 12 </action> 13 14 </package> 15 </struts>
注意:這里的class並沒有引用一個具體的類而是取了一個別名,接下來再由spring給它注入
第3步:配置applicationContext.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xmlns:jee="http://www.springframework.org/schema/jee" 8 xmlns:tx="http://www.springframework.org/schema/tx" 9 xsi:schemaLocation=" 10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 11 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 12 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 13 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd 14 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> 15 <!-- 類似於財務部門一樣,類就是錢,所有需要類的實例都由srping去管理, pojo除外--> 16 <bean id="myIndexAction" class="action.IndexAction" scope="prototype"> 17 <property name="index" ref="myService1"></property> 18 </bean> 19 <!-- index = new IndexServiceImpl() --> 20 <bean id="myDao1" class="dao.BookCardDaoImpl" scope="prototype"> 21 <property name="c" ref="myConnection1"></property> 22 </bean> 23 24 <bean id="myService1" class="service.IndexServiceImpl" scope="prototype"> 25 <property name="bcd" ref="myDao1"></property> 26 </bean> 27 28 <bean id="myConnection1" class="util.MyConnection_mysql" scope="prototype"></bean> 29 30 <bean id="myConnection2" class="util.MyConnection_sqlserver" scope="prototype"></bean> 31 32 </beans>
在這里我介紹一下這份配置文件的相關信息吧
1 頭文件我們一般從官方模板中拷貝過來,需要注意一下版本號
2 bean標記就是我們需要給項目中的每一個實例配置一個bean(pojo除外),當哪一層需要調用時,spring會幫我們注入。
3 bean標記中id屬性為在本文件中起一標識作用用來區分其他bean,class屬性的值便是當前bean引用了哪一個類 ,scope屬性的值為prototype為非單例的意思
4 bean標記中的子標記property便是當前這個類中需要注入的屬性,name屬性值為我們java類中的屬性名,ref屬性值為當前類需要引用哪一個實現類。
本例中我們可以看到dao中引用了myConnection1也就是引用了mysql的連接,如此一來便可以輕松切換mySQL和sqlServer兩個數據庫,而並不需要改動我們的任何邏輯代碼。
下面我給出一個dao的樣例代碼
1 public class BookCardDaoImpl implements BookCardDao { 2 3 //只做屬性的申明,不寫死具體的實現 4 private MyConnection c; 5 6 //提供一個set方法spring會自動注入 7 public void setC(MyConnection c) { 8 this.c = c; 9 } 10 11 @Override 12 public List<BookCard> getAllCardInfo() { 13 14 // 第一步:獲取數據庫連接 15 Connection conn = c.getConnection(); 16 17 // 第二步:查詢數據庫 18 // (操作JDBC,需要sql語句,需要執行sql語句對象,需要執行sql語句后結果集合) 19 String sql = "select * from BookCard";// 需要執行的sql語句 20 PreparedStatement stmt = null;// 執行sql語句對象 21 ResultSet rs = null;// 執行sql語句后的結果集 22 try { 23 stmt = conn.prepareStatement(sql); 24 rs = stmt.executeQuery(); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 29 // 第三步 30 // 拿到rs后,執行一個遍歷以及封裝 31 List<BookCard> myBookCardList = new ArrayList<BookCard>(); 32 try { 33 while (rs.next()) { 34 // 風格:實體類是一個pojo對象,一般直接new就行 35 BookCard bc = new BookCard(); 36 // 進行數據庫封裝 37 bc.setCid(rs.getInt("cid")); 38 bc.setName(rs.getString("name")); 39 bc.setSex(rs.getString("sex")); 40 bc.setCardDate(rs.getDate("cardDate")); 41 bc.setDeposit(rs.getBigDecimal("deposit")); 42 myBookCardList.add(bc); 43 } 44 } catch (Exception e1) { 45 e1.printStackTrace(); 46 } 47 48 //關閉資源 49 try { 50 rs.close(); 51 stmt.close(); 52 conn.close(); 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } 56 57 // 第5步返回結果集List給客戶端 58 return myBookCardList; 59 }
spring的環境在這一步已經是搭建完成了,我再來介紹一下spring的注入。
大家可以清晰的看到左邊這幅圖呢是傳統的面向對象編程的寫法,每一層都與另外一層緊密耦合,當一層出現問題,層層都需要變動,在軟件工程中是大忌
右圖中,層與層之間都已經分離出來了,這里具體實現是通過在每一層都定義一個接口,層與層之間調用的都是接口並不關心是哪一個實現類,真正的實現類是誰不在代碼中出現而是交給spring讓他給我們注入。