近期正好本身有一個小的點子要實現,剛好這學期開了java web的課,也算是略懂一些,因此技術方案採用java作後端,使用ssm框架。前幾天把需求簡單分析了一下,喏,僅僅紙上談兵對程序員來講可不是一個好的習慣,因此準備整合一下ssm框架,供後期編碼作地基。html
不得不說,百度的東西魚龍混雜,看了幾篇博客,最終都沒能搭建一個完整的ssm環境。不是這有問題就是那有問題。一想到這裏就氣,不過氣歸氣,想到可能之後也會有好多人也會像我同樣遇到相似的狀況,但又得不到一個有效的指導,往嚴重了說,可能就此 一個夢想成爲大牛的童鞋就此隕落🤨,因此,我決定本身再堅持搞一搞,而後出一篇文章,但願將來能夠幫助到須要幫助的童鞋。java
本文采用任務驅動方式來搭建ssm開發環境,這樣能夠更加清晰的瞭解整個流程,且目標性更強,使得整個流程更爲連貫,方便理解。mysql
任務:程序員
使用ssm框架實現簡單的用戶信息的增刪查改(數據庫採用Mysql)web
1. 首先,在本地建立一個數據庫名爲SSM,而後在庫中建張user表,具體以下:spring
1 -- ---------------------------- 2 -- Table structure for `user` 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `user`; 5 CREATE TABLE `user` ( 6 `id` int(11) NOT NULL AUTO_INCREMENT, 7 `name` varchar(255) DEFAULT NULL, 8 `password` varchar(255) DEFAULT NULL, 9 PRIMARY KEY (`id`) 10 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
如圖,sql
那麼,準備工做結束後,咱們便開始正式的環境搭建。數據庫
2. 打開IDEA,點擊建立新項目,如圖apache
而後,按圖中標註的序號選擇Maven,並勾選「Create from archetype」,選擇「 ................22-archetype-webapp」,最後Next,如圖json
而後填寫Groupid和artifactid,如圖
名詞解釋:
而後下一步,這裏引用另外一位博主的說法,我沒作測試,你們能夠作個參考
引用: 這裏須要注在Properties中添加一個參數 archetypeCatalog=internal,不加這個參數,在maven生成骨架的時候將會很是慢,有時候直接卡住。來自網上的解釋:archetypeCatalog表示插件使用的archetype元數據,不加這個參數時默認爲remote,local,即中央倉庫archetype元數據,因爲中央倉庫的archetype太多了因此致使很慢,指定internal來表示僅使用內部元數據。
我直接下一步,這裏會讓你輸入項目名詞和存儲路徑,用默認的就OK。
點擊Finish,完成建立。
3. 建立完成後,默認的目錄結構如圖:
因此,咱們須要從新編排一下項目的結構,更改後以下:
這裏,各個文件夾及包的意義已經在圖中作簡要說明,若不理解,請自行學習。
至此,項目的基本框架已經搭建完成,接下來咱們繼續學習 使用maven來集成ssm框架。
4. 這裏咱們使用maven類管理jar包,和他們之間的依賴(自行了解maven相關知識),下面咱們來編輯項目下的pom.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4 5 6 <modelVersion>4.0.0</modelVersion> 7 <packaging>war</packaging> 8 9 <name>SSMTest</name> 10 <groupId>com.xykj</groupId> 11 <artifactId>SSMTest</artifactId> 12 <version>1.0-SNAPSHOT</version> 13 14 <build> 15 <plugins> 16 <plugin> 17 <groupId>org.mortbay.jetty</groupId> 18 <artifactId>maven-jetty-plugin</artifactId> 19 <version>6.1.7</version> 20 <configuration> 21 <connectors> 22 <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> 23 <port>8888</port> 24 <maxIdleTime>30000</maxIdleTime> 25 </connector> 26 </connectors> 27 <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory> 28 <contextPath>/</contextPath> 29 </configuration> 30 </plugin> 31 </plugins> 32 </build> 33 34 35 <properties> 36 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 37 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 38 39 <!-- spring版本號 --> 40 <spring.version>4.2.5.RELEASE</spring.version> 41 42 <!-- mybatis版本號 --> 43 <mybatis.version>3.2.8</mybatis.version> 44 45 <!-- mysql驅動版本號 --> 46 <mysql-driver.version>5.1.29</mysql-driver.version> 47 48 <!-- log4j日誌包版本號 --> 49 <!--<slf4j.version>1.7.18</slf4j.version>--> 50 <!--<log4j.version>1.2.17</log4j.version>--> 51 <!--暫時 用不到--> 52 </properties> 53 54 <dependencies> 55 <!--dependency> 56 <groupId>com.xykj</groupId> 57 <artifactId>[the artifact id of the block to be mounted]</artifactId> 58 <version>1.0-SNAPSHOT</version> 59 </dependency--> 60 61 <!-- 添加junit4依賴 --> 62 <dependency> 63 <groupId>junit</groupId> 64 <artifactId>junit</artifactId> 65 <version>4.11</version> 66 <!-- 指定範圍,在測試時纔會加載 --> 67 <scope>test</scope> 68 </dependency> 69 70 <!-- 添加spring核心依賴 --> 71 <dependency> 72 <groupId>org.springframework</groupId> 73 <artifactId>spring-core</artifactId> 74 <version>${spring.version}</version> 75 </dependency> 76 <dependency> 77 <groupId>org.springframework</groupId> 78 <artifactId>spring-web</artifactId> 79 <version>${spring.version}</version> 80 </dependency> 81 <dependency> 82 <groupId>org.springframework</groupId> 83 <artifactId>spring-oxm</artifactId> 84 <version>${spring.version}</version> 85 </dependency> 86 <dependency> 87 <groupId>org.springframework</groupId> 88 <artifactId>spring-tx</artifactId> 89 <version>${spring.version}</version> 90 </dependency> 91 <dependency> 92 <groupId>org.springframework</groupId> 93 <artifactId>spring-jdbc</artifactId> 94 <version>${spring.version}</version> 95 </dependency> 96 <dependency> 97 <groupId>org.springframework</groupId> 98 <artifactId>spring-webmvc</artifactId> 99 <version>${spring.version}</version> 100 </dependency> 101 <dependency> 102 <groupId>org.springframework</groupId> 103 <artifactId>spring-context</artifactId> 104 <version>${spring.version}</version> 105 </dependency> 106 <dependency> 107 <groupId>org.springframework</groupId> 108 <artifactId>spring-context-support</artifactId> 109 <version>${spring.version}</version> 110 </dependency> 111 <dependency> 112 <groupId>org.springframework</groupId> 113 <artifactId>spring-aop</artifactId> 114 <version>${spring.version}</version> 115 </dependency> 116 117 <dependency> 118 <groupId>org.springframework</groupId> 119 <artifactId>spring-test</artifactId> 120 <version>${spring.version}</version> 121 </dependency> 122 123 <!-- 添加mybatis依賴 --> 124 <dependency> 125 <groupId>org.mybatis</groupId> 126 <artifactId>mybatis</artifactId> 127 <version>${mybatis.version}</version> 128 </dependency> 129 130 <!-- 添加mybatis/spring整合包依賴 --> 131 <dependency> 132 <groupId>org.mybatis</groupId> 133 <artifactId>mybatis-spring</artifactId> 134 <version>1.2.2</version> 135 </dependency> 136 137 <!-- 添加mysql驅動依賴 --> 138 <dependency> 139 <groupId>mysql</groupId> 140 <artifactId>mysql-connector-java</artifactId> 141 <version>${mysql-driver.version}</version> 142 </dependency> 143 <!-- 添加數據庫鏈接池依賴 --> 144 <dependency> 145 <groupId>commons-dbcp</groupId> 146 <artifactId>commons-dbcp</artifactId> 147 <version>1.2.2</version> 148 </dependency> 149 150 <!--添加jackson--> 151 <dependency> 152 <groupId>com.fasterxml.jackson.core</groupId> 153 <artifactId>jackson-databind</artifactId> 154 <version>2.7.0</version> 155 </dependency> 156 157 <dependency> 158 <groupId>commons-io</groupId> 159 <artifactId>commons-io</artifactId> 160 <version>1.3.2</version> 161 </dependency> 162 163 <dependency> 164 <groupId>commons-fileupload</groupId> 165 <artifactId>commons-fileupload</artifactId> 166 <version>1.2.1</version> 167 </dependency> 168 169 170 171 </dependencies>
以上,就是咱們項目中用到的組件,只須要在<dependency>標籤中引入maven就會自動幫咱們引入並管理。
5. 接下來,咱們在resource文件夾下,新建新建jdbc.properties文件,具體以下:
模板以下,相關參數,請自行更改:
driverClasss=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/SSM?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull username=root password=admin #定義初始鏈接數 initialSize=0 #定義最大鏈接數 maxActive=20 #定義最大空閒 maxIdle=20 #定義最小空閒 minIdle=1 #定義最長等待時間 maxWait=60000
6. 緊接着,在resource文件夾下,繼續新建spring-mvc.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 自動掃描 @Controller--> <context:component-scan base-package="com.xykj.controller"/> <!--避免IE執行AJAX時,返回JSON出現下載文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 啓動SpringMVC的註解功能,完成請求和註解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter"/> <!-- JSON轉換器 --> </list> </property> </bean> <!-- 定義跳轉的文件的先後綴 ,視圖模式配置 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp"/> </bean> <!-- 文件上傳配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默認編碼 --> <property name="defaultEncoding" value="UTF-8"/> <!-- 上傳文件大小限制爲31M,31*1024*1024 --> <property name="maxUploadSize" value="32505856"/> <!-- 內存中的最大值 --> <property name="maxInMemorySize" value="4096"/> </bean> </beans>
7. 繼續在resource下,新建spring和mybatis整合所需的配置文件,名爲spring-mybatis.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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 開啓組件掃描 --> <context:component-scan base-package="com.xykj.blog"/> <!-- 第一種方式:加載一個properties文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean> <!-- 第二種方式:加載多個properties文件 <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:common.properties</value> </list> </property> <property name="fileEncoding" value="UTF-8"/> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="properties" ref="configProperties"/> </bean> --> <!-- 配置數據源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driverClasss}"/> <property name="url" value="${jdbcUrl}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!-- 初始化鏈接大小 --> <property name="initialSize" value="${initialSize}"></property> <!-- 鏈接池最大數量 --> <property name="maxActive" value="${maxActive}"></property> <!-- 鏈接池最大空閒 --> <property name="maxIdle" value="${maxIdle}"></property> <!-- 鏈接池最小空閒 --> <property name="minIdle" value="${minIdle}"></property> <!-- 獲取鏈接最大等待時間 --> <property name="maxWait" value="${maxWait}"></property> </bean> <!-- mybatis和spring完美整合,不須要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 自動掃描mapping.xml文件 --> <property name="mapperLocations" value="classpath:sql/*.xml"></property> </bean> <!-- DAO接口所在包名,Spring會自動查找其下的類 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xykj.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
8. web.xml配置,以下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.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> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- spring監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止spring內存溢出監聽器,好比quartz --> <!-- 話說這個我也不知道幹嗎的 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- spring mvc servlet--> <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:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 此處也能夠配置成 *.do 形式 --> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> <!-- session配置 --> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>
忘記上這張圖,進入File -> Project Structure,把對應文件夾,修改爲,我這個樣子:
9. 配置tomcat,步驟以下:
而後,點擊窗口左上角➕,配置一個本地tomcat server
選擇第一個,跳轉到以下界面,點擊OK。
10. tomcat配置完成後,在entity包下新建一個User實體類,以下:
User類代碼:
package com.xykj.entity; import java.io.Serializable; public class User implements Serializable{ private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id= " + id + " ,name= " + name + " ,password= " + password + " ]"; } }
接着,咱們在dao包下新增一個接口,名爲:UserDao
UserDao代碼以下:
package com.xykj.dao; import com.xykj.entity.User; public interface UserDao { public User findByUserId(int id); }
而後,在resource下的sql包下新建一個UserMapper.xml文件,具體以下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xykj.dao.UserDao"> <select id="findByUserId" parameterType="int" resultType="com.xykj.entity.User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>
好嘞,到這裏,咱們就能夠簡單的測試一下咱們的增刪查改功能了,固然,咱們的例子是findByUserId,按id查詢,那麼咱們先在數據庫中增長一條記錄。
而後,在test文件夾下新建一個測試類,名爲TestUserDao,如圖:
TestUserDao代碼以下:
import com.xykj.dao.UserDao; import com.xykj.entity.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestUserDao { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml"); UserDao userDao = applicationContext.getBean(UserDao.class); @Test public void test1(){ User user = userDao.findByUserId(1); System.out.println(user); } }
這裏,咱們使用了Junit的單元測試,詳情請自行了解。
運行test(),輸出:
說明咱們的mybatis和spring的整合已經完成。
11. 接下來咱們繼續測試spring及spring mvc
一樣的方法,咱們來編寫service層及其單元測試
首先,在service包下,新建接口UserService,以下
代碼爲:
package com.xykj.service; import com.xykj.entity.User; import org.springframework.stereotype.Service; @Service public interface UserService { //查詢User User queryUser(int id); }
而後,繼續在service包下,新建一個該接口的實現類UserServiceImp,以下:
代碼爲:
package com.xykj.service; import com.xykj.dao.UserDao; import com.xykj.entity.User; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class UserServiceImp implements UserService { @Resource private UserDao userDao; public User queryUser(int id) { User user = userDao.findByUserId(id); return user; } }
到這裏以後,咱們在test目錄下,新建測試類TestUserService,以下
代碼爲:
import com.xykj.entity.User; import com.xykj.service.UserService; import com.xykj.service.UserServiceImp; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestUserService { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml"); UserService userService = applicationContext.getBean(UserService.class); @Test public void test1(){ User user = userService.queryUser(1); System.out.println(user); } }
運行,獲得以下結果,則成功,不然檢查上述操做是否有誤
👌,到了這步,其實咱們的spring已經測試完成了。在這過程當中,咱們使用的註解和自動注入等spring功能均可正常使用。
12. 13
首先,咱們在controller包下新建一個類,如圖:
代碼爲:
package com.xykj.controller; import com.xykj.entity.User; import com.xykj.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; @Controller @RequestMapping("/test") public class UserController { @Resource private UserService userService; @ResponseBody @RequestMapping(method = RequestMethod.GET) public User func(){ User user = userService.queryUser(1); return user; } }
👌,接下來咱們在webapp目錄下新建一個index.jsp文件(默認啓動該頁面),編寫該頁面測試UserController,進而測試spring mvc.
不過在這以前,請先將UserController的func()方法添加一個參數,更改以下:
index.jsp以下:
13. 最後,咱們啓動tomcat服務器,進行最後的測試:
輸入1,點擊提交
見到改返回,那麼一切大功告成。
但願你們遇到什麼問題,能夠在留言區留言,有時間的話會第一時間給予解答😁