SSM的基礎配置

SSM的基礎配置

來自專欄小白 ON THE WAY

在接觸ssm的第一個crud操作並作為入門ssm很有必要。

這裡就具體的說一下ssm配置的過程。好記性不如敲幾遍。

1.首先創建maven工程

2.在pom.xml文件里引入一些必要的jar包

Maven Repository: Search/Browse/Explore 在這個網址里可以查到可以查到

引入Spring-mvc核心jar包

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.7.RELEASE</version></dependency>

引入Spring事務管理的jar包

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.7.RELEASE</version></dependency>

引入spring面向切面編程的jar包

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.7.RELEASE</version></dependency>

引入myBatis的核心jar包

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version></dependency>

引入myBatis整合spring的jar包

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version></dependency>

引入資料庫連接池的jar包

<dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version></dependency>

引入資料庫驅動的包

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version></dependency>

引入JSTL表達式包

<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version></dependency>

引入servlet-api包。此包雖然在tomcat里有,但在開發中不適用它就會報錯

<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope></dependency>

引入junit測試包

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope></dependency>

引入spring-test測試包

該包測試的時候比較方便,可以使用註解來測試,不然又要從容器中取,什麼getApplicationContextPath之類的...總之加上它測試就方便多了。待會兒會講到它的用法

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.7.RELEASE</version> <scope>test</scope></dependency>

引入junit測試包

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope></dependency>

引入mybatis逆向工程的包(自動創建實體類很方便)

<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version></dependency>

3.在src/main/webapp/WEB-INF/里配置web.xml的信息

在web.xml裡面配置spring 和 springMVC

(1)配置spring的監聽器

不知道為什麼要配置這個東西,具體原理以後會專門寫一篇來探討

<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value></context-param><!-- Bootstraps the root web application context before servlet initialization --><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

這裡我們需要在類路徑下創建applicationContext.xml(當然,名字可以隨便取)

這裡的classpath在maven工程里具體就是resource文件夾。一般的配置文件都要放在這裡。

因為在編譯的時候這些文件會編譯成.class文件最終放在WEB-INF/classes中

(2)配置springMVC前端控制器

<servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet><!-- 攔截所有請求 --><!-- Map all requests to the DispatcherServlet for handling --><servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>

這裡也就不過多的解釋了。當然,這裡的springMVC.xml文件也可以不寫classpath。如下:

<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>dispatcherServlet</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet><!-- 攔截所有請求 --><!-- Map all requests to the DispatcherServlet for handling --><servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>

此時必須在於web.xml文件同級目錄下編寫springMVC配置文件

且文件名必須為<servlet-name>+"-"+servlet.這裡即為 dispatcherServlet-servlet.xml

(3)配置其他過濾器

①字元過濾器:為了保證不出現亂碼,配上字元過濾器

<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>urf-8</param-value> </init-param> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param></filter><filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>

②REST風格過濾器:為了保證代碼風格是REST的,可將POST請求轉換為DELETE或PUT

<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>

基本上web.xml的配置就到此為止了。根據自己的需要添加過濾器

4.編寫spring和springMVC的配置文件

在java Resources的src/main/resources里編寫這兩個配置文件

這裡需要強調的一點是在ssm中,springMVC只是作為控制器(包含網站挑戰),故它的相關配置只與控制有關。springMVC 和spring存在父子容器。在springMVC容器里能看到spring中的bean,但在spring里看不到springMVC中的bean。spring里主要配置一些數據源和事務等,故要分工明確,才能各司其職。避免在兩個容器中都註冊了同一個bean,這樣就麻煩了。

(1)springMVC的配置文件

①frist of all,掃描包

<context:component-scan base-package="com.atguigu" use-default-filters="false"> <!-- 只掃描控制器 --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>

這裡掃描的時候要加上<context:include-filter>子節點。表示它只掃描expression所表示的註解(這裡即為Controller)

②配置前端控制器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views"></property> <property name="suffix" value=".jsp"></property></bean>

用來定位跳轉的位置。

③2個標準配置

<!-- 將springmvc不能處理的請求交給tomcat --><mvc:default-servlet-handler/><!-- 能支持springmvc更高級的一些功能:JSR303校驗,快捷的ajax...映射動態請求 --><mvc:annotation-driven></mvc:annotation-driven>

各自的作用如上所示。但是<mvc:annotation-driven>這個是SpringMVC必須要配置的,因為它聲明了@RequestMapping、@RequestBody、@ResponseBody等。並且,該配置默認載入很多的參數綁定方法,比如json轉換解析器等。

在上面springMVC的配置文件中海油一個屬性沒有進行說明,即use-default-filters="false"

在掃描包的時候的屬性,這個在spring的配置文件之後說明。

(2)spring的配置文件

①掃描包:

<context:component-scan base-package="com.atguigu"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>

除了控制器的部分,其他都要掃描

②配置數據源

在配置數據源的時候一般都不能將其寫死。故用一個properties文件來保存數據源的一些屬性。方便以後進行更改。

創建db.properties

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_crudjdbc.driverClass=com.mysql.jdbc.Driverjdbc.user=rootjdbc.password=1230

在spring中引用該配置文件

<!-- 引入配置文件 --><context:property-placeholder location="classpath:db.properties"/>

配置數據源

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property></bean>

③配置與MyBatis的整合

MyBatis的持久化解決方案是將用戶從原始的JDBC訪問中解放出來,用戶只需要定義需要操作的SQL語句,無須關注底層的JDBC操作,就可以以面向對象的方式來進行持久化層操作.底層資料庫連接的獲取,數據訪問的實現,事務控制等都無須用戶關心,從而將應用層從底層的JDBC/JTA API抽取出來.通過配置文件管理JDBC連接,讓MyBatis解決持久化的實現.在MyBatis中的常見對象有SqlSessionFactory和SqlSession。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定MyBatis全局配置文件 --> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <property name="dataSource" ref="dataSource"></property> <!-- 指定MyBatis mapper配置文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml"></property></bean>

每一個MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心.同時SqlSessionFactory也是線程安全的,SqlSessionFactory一旦被創建,應該在應用執行期間都存在.在應用運行期間不要重複創建多次。

SqlSession對象完全包含以資料庫為背景的所有執行SQL操作的方法,它的底層封裝了JDBC連接,可以用SqlSession實例來直接執行被映射的SQL語句.每個線程都應該有它自己的SqlSession實例.SqlSession的實例不能被共享,同時SqlSession也是線程不安全的,絕對不能講SqlSeesion實例的引用放在一個類的靜態欄位甚至是實例欄位中.也絕不能將SqlSession實例的引用放在任何類型的管理範圍中,比如Servlet當中的HttpSession對象中.使用完SqlSeesion之後關閉Session很重要,應該確保使用finally塊來關閉它.

這裡配置配置三個屬性即可

configLocation:myBatis配置文件的路徑

dataSource:引用之前配置的數據源

mapperLocations:根據mapper里的xml進行具體的操作

配置掃描器

<!-- 配置掃描器,將Mybatis介面的實現加入到ioc容器中 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 掃描所有dao介面的實現,加入到ioc容器中 --> <property name="basePackage" value="com.atguigu.crud.dao"></property></bean>

將mybatis加入到IOC容器中

④事務控制的配置

配置事務管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property></bean>

用於管理事務。包含事務提交,事務回滾等

開啟基於註解的事務

<aop:config> <!-- 切入點表達式 --> <aop:pointcut expression="execution(* com.atguigu.crud.service..*(..))" id="txPoint"/> <!-- 配置事務增強 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/></aop:config>

配置事務切入點(註明哪些方法需要使用事務)

配置事務增強(註明事務切入點的方法如何切入)

<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 所有方法都是事務方法 --> <tx:method name="*"/> <!-- 以get開始的所有方法 --> <tx:method name="get*" read-only="true"/> </tx:attributes></tx:advice>

5.配置myBatis配置文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="com.atguigu.crud.bean"/> </typeAliases></configuration>

因為數據源和連接池在spring里配置了,故這裡無需再配置。在這個配置文件里主要進行一些全局的配置,這裡用的是駝峰命名法和類型別名。

6.使用myBatis逆向工程生成實體類和mapper

去myBatis-generator官網可查看如何使用

①創建一個generator的配置文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 取消生成的注釋 --> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 資料庫連接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssm_crud" userId="root" password="1230"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 指定javabean生成的位置 --> <javaModelGenerator targetPackage="com.atguigu.crud.bean" targetProject=".srcmainjava"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- 指定sql映射文件生成的位置 --> <sqlMapGenerator targetPackage="mapper" targetProject=".srcmain
esources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 指定dao介面生成的位置,mapper介面生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.crud.dao" targetProject=".srcmainjava"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- table指定每個表的生成策略 --> <table tableName="tbl_emp" domainObjectName="Employee"></table> <table tableName="tbl_dept" domainObjectName="Department"></table> </context></generatorConfiguration>

②將以下代碼執行即可

List<String> warnings = new ArrayList<String>();boolean overwrite = true;File configFile = new File("MBG.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);

根據自己的需要對生成的文件進行修改

修改的時候先到dao層添加相關介面,然後再到mapper映射文件中去做相應的修改。

最後,來聊一聊之前遺留的一個問題。為什麼要在spring的配置文件里的<context:component>里添加use-default-filters="false"

如果不添加這個屬性,springMVC容器會把service、dao層的bean重新載入,從而造成新載入的bean覆蓋了老的bean,但事務的AOP代理沒有配置在springMVC.xml配置文件中,造成事務失效。解決辦法是:在spring-mvc.xml配置文件中的context:component-scan標籤中使用use-default-filters=「false」禁用掉默認的行為。

至此,SSM就完成了。

推薦閱讀:

Mybatis9:Mybatis與Hibernate區別
深入淺出MyBatis:JDBC和MyBatis介紹
基於String的SSM框架詳解理解入門(spring Springmvc mybatis)
SSM 框架整合發生異常之(mybatis-config.xml)
MyBatis 原理淺析 2 ——配置解析

TAG:SpringMVC | Spring | MyBatis |