在利用maven搭建 Spring MVC 項目之前,需要在本機上安裝配置好 Maven。
本機配置Maven
首先去Apache官網下載所需要的maven,注意需要下載 bin.tar.gz 格式,不要下成 bin.zip 或者 src.tar.zip。
解壓在自己的文件夾,我放在了 Users/Yourname/Applications/maven/apache-maven-3.6.1 下面。
配置環境變量
1 vim ~/.bash_profile
在里面添加
1 export M2_HOME=/Users/lzz/Applications/maven/apache-maven-3.6.1
2 export M2=$M2_HOME/bin
3 export PATH=$M2:$PATH
把路徑改為 maven 所在的目錄即可
然后使命令生效
1 source ~/.bash_profile
更改Maven默認倉庫
如果不更改倉庫位置,系統會自動生成一個.m2 文件夾用以存放本地倉庫,我們更改了默認倉庫位置可以更方便管理
在maven下面創建倉庫文件夾:Users/Yourname/Applications/maven/repository
創建 setting.xml:Users/Yourname/Applications/maven/setting.xml。在 apache-maven-3.6.1/bin 下面就有一個 setting.xml,我們自己配的setting.xml 就是用來替代它的。
配置setting.xml

1 <?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 6 <pluginGroups /> 7 <proxies /> 8 <servers /> 9 10 <localRepository>/User/lzz/Application/maven/repository</localRepository> 11 12 <mirrors> 13 <mirror> 14 <id>alimaven</id> 15 <mirrorOf>central</mirrorOf> 16 <name>aliyun maven</name> 17 <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> 18 </mirror> 19 <mirror> 20 <id>alimaven</id> 21 <name>aliyun maven</name> 22 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 23 <mirrorOf>central</mirrorOf> 24 </mirror> 25 <mirror> 26 <id>central</id> 27 <name>Maven Repository Switchboard</name> 28 <url>http://repo1.maven.org/maven2/</url> 29 <mirrorOf>central</mirrorOf> 30 </mirror> 31 <mirror> 32 <id>repo2</id> 33 <mirrorOf>central</mirrorOf> 34 <name>Human Readable Name for this Mirror.</name> 35 <url>http://repo2.maven.org/maven2/</url> 36 </mirror> 37 <mirror> 38 <id>ibiblio</id> 39 <mirrorOf>central</mirrorOf> 40 <name>Human Readable Name for this Mirror.</name> 41 <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url> 42 </mirror> 43 <mirror> 44 <id>jboss-public-repository-group</id> 45 <mirrorOf>central</mirrorOf> 46 <name>JBoss Public Repository Group</name> 47 <url>http://repository.jboss.org/nexus/content/groups/public</url> 48 </mirror> 49 <mirror> 50 <id>google-maven-central</id> 51 <name>Google Maven Central</name> 52 <url>https://maven-central.storage.googleapis.com 53 </url> 54 <mirrorOf>central</mirrorOf> 55 </mirror> 56 <!-- 中央倉庫在中國的鏡像 --> 57 <mirror> 58 <id>maven.net.cn</id> 59 <name>oneof the central mirrors in china</name> 60 <url>http://maven.net.cn/content/groups/public/</url> 61 <mirrorOf>central</mirrorOf> 62 </mirror> 63 </mirrors> 64 </settings>
配置好 Maven 后,查看所配置的 maven 是否和本機使用的 JDK 版本一致:mvn -v
1 ➜ ~ mvn -v
2 Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00) 3 Maven home: /Users/lzz/Applications/maven/apache-maven-3.6.1 4 Java version: 11.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home 5 Default locale: zh_CN_#Hans, platform encoding: UTF-8 6 OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
我用的 JDK 版本是 11.0.2。和 maven 匹配,說明已經配置好 Maven 了。
在 IDEA 中選擇配置好的Maven
在設置中選擇 Build tools-> Maven。選擇好我們之前配置好的Maven目錄,倉庫和 setting.xml。
在 Build tools->Maven->Runner中,JRE 環境選擇與 Maven 匹配的版本,我這里是 11.0.2。
創建 Maven 項目
點擊next,GroupId 是GroupID 是項目組織唯一的標識符,實際對應 Java 的包的結構,是 main 目錄里 Java 的目錄結構,ArtifactId 是項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱。
繼續點擊next,在這里選擇好 Maven 的家目錄,setting file 和 倉庫位置選擇我們自己定義的位置。要先勾選覆蓋按鈕。
點擊 next,填寫項目名
繼續點擊 next,創建完成后,IDEA 會幫我們拉取所需的 jar 包,所以創建過程中需要保持網絡暢通,如果我們在之前設置過 jar 拉取的源,比如使用阿里的源,這個過程很快就可以完成。
等IDEA幫我們拉去完jar包后,看看創建出來的初始項目結構
webapp 文件夾下放一些頁面,以及項目的啟動配置,WEB-INF,其下面的 web.xml 會對項目的整體進行配置,后面會進行單獨對他配置。
我拉取出來的項目 main下面沒有 resource 文件夾,這個文件夾我們需要自己創建,並且右鍵選擇將其設置為 resource root。
配置環境
首先我們在 pom.xml 來配置項目依賴。
在 Maven 倉庫 中搜索想要使用的 jar 包依賴。將其依賴放在 pom.xml 中。

1 <dependencies> 2 <dependency> 3 <groupId>junit</groupId> 4 <artifactId>junit</artifactId> 5 <version>4.11</version> 6 <scope>test</scope> 7 </dependency> 8 <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --> 9 <dependency> 10 <groupId>org.springframework</groupId> 11 <artifactId>spring-beans</artifactId> 12 <version>${springframework.version}</version> 13 </dependency> 14 <!-- spring-context --> 15 <dependency> 16 <groupId>org.springframework</groupId> 17 <artifactId>spring-context</artifactId> 18 <version>${springframework.version}</version> 19 </dependency> 20 21 <!-- Spring MVC + Spring web --> 22 <dependency> 23 <groupId>org.springframework</groupId> 24 <artifactId>spring-web</artifactId> 25 <version>${springframework.version}</version> 26 </dependency> 27 28 <dependency> 29 <groupId>org.springframework</groupId> 30 <artifactId>spring-webmvc</artifactId> 31 <version>${springframework.version}</version> 32 </dependency> 33 34 <!--jdbc --> 35 <dependency> 36 <groupId>org.springframework</groupId> 37 <artifactId>spring-jdbc</artifactId> 38 <version>${springframework.version}</version> 39 </dependency> 40 41 <!-- mybatis --> 42 <dependency> 43 <groupId>org.mybatis</groupId> 44 <artifactId>mybatis</artifactId> 45 <version>3.4.0</version> 46 </dependency> 47 <dependency> 48 <groupId>org.mybatis</groupId> 49 <artifactId>mybatis-spring</artifactId> 50 <version>1.3.0</version> 51 </dependency> 52 53 <!-- druid 數據源的管理 --> 54 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> 55 <dependency> 56 <groupId>com.alibaba</groupId> 57 <artifactId>druid</artifactId> 58 <version>1.1.12</version> 59 </dependency> 60 61 <!-- mysql --> 62 <dependency> 63 <groupId>mysql</groupId> 64 <artifactId>mysql-connector-java</artifactId> 65 <version>5.1.30</version> 66 </dependency> 67 68 <!-- lombok,可以得到一堆注解,get、set、toString就可以省略這些方法了 --> 69 <dependency> 70 <groupId>org.projectlombok</groupId> 71 <artifactId>lombok</artifactId> 72 <optional>true</optional> 73 <version>1.18.8</version> 74 </dependency> 75 76 <!-- Jackson 處理json數據 --> 77 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 --> 78 <dependency> 79 <groupId>com.fasterxml.jackson.datatype</groupId> 80 <artifactId>jackson-datatype-jsr310</artifactId> 81 <!--jackson-datatype-guava ???? --> 82 <version>2.9.8</version> 83 </dependency> 84 85 </dependencies>
配置完 pom.xml 之后我們可以在左側的外部依賴看到所有 Spring 為我們拉取進來的 jar 包。
配置 web.xml
如果之前我們沒有將 resource 設置為 resource root,那么我們在配置 web.xml 的時候 context-param標簽會找不到 applicationContext.xml 的路徑。

1 <!-- Spring beans 配置文件所在目錄--> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value>classpath:applicationContext.xml</param-value> 5 </context-param> 6 7 <!-- Spring MVC 的配置 --> 8 <servlet> 9 <servlet-name>spring</servlet-name> 10 <!-- 就是對應spring-servlet這個配置文件--> 11 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 12 </servlet> 13 14 <servlet-mapping> 15 <servlet-name>spring</servlet-name> 16 <url-pattern>/</url-pattern> 17 </servlet-mapping> 18 19 <filter> 20 <filter-name>encodingFilter</filter-name> 21 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 22 <init-param> 23 <param-name>encoding</param-name> 24 <param-value>UTF-8</param-value> 25 </init-param> 26 <init-param> 27 <param-name>forceEncoding</param-name> 28 <param-value>true</param-value> 29 </init-param> 30 </filter> 31 32 <filter-mapping> 33 <filter-name>encodingFilter</filter-name> 34 <url-pattern>/*</url-pattern> 35 </filter-mapping> 36 37 <!-- druid 的基本使用--> 38 <servlet> 39 <!-- 指定哪個servlet去處理相關的請求--> 40 <servlet-name>DruidStatServlet</servlet-name> 41 <servlet-class>com.alibaba.druid.support.http.StatViewFilter</servlet-class> 42 <!-- 在做了這個基本配置之后,我們這個druid是需要進行登錄才可以訪問的,用戶名和密碼都是druid--> 43 <init-param> 44 <param-name>loginUsername</param-name> 45 <param-value>druid</param-value> 46 </init-param> 47 <init-param> 48 <param-name>loginPassword</param-name> 49 <param-value>druid</param-value> 50 </init-param> 51 </servlet> 52 <servlet-mapping> 53 <servlet-name>DruidStatServlet</servlet-name> 54 <url-pattern>/sys/druid/*</url-pattern> 55 </servlet-mapping> 56 57 <!-- 告訴druid要攔截那些請求--> 58 <filter> 59 <filter-name>DruidWebStatFilter</filter-name> 60 <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 61 <!-- 還可以初始化參數--> 62 <init-param> 63 <param-name>exclusions</param-name> 64 <param-value>*.js,*.css,*.jpg,*.png,*.ico,*.gif,/sys/druid/*</param-value> 65 </init-param> 66 </filter> 67 <filter-mapping> 68 <filter-name>DruidWebStatFilter</filter-name> 69 <url-pattern>/*</url-pattern> 70 </filter-mapping> 71 72 73 <!-- 項目啟動的時候,默認訪問的目錄,項目生成的時候已經有了--> 74 <welcome-file-list> 75 <welcome-file>index.jsp</welcome-file> 76 </welcome-file-list>
配置 sping-servle
在配置 servlet 的時候,又創建了一個配置文件,在WEB-INF下面 spring-servlet.xml
啟動注解驅動的包掃描功能,這里需要建一些包,在main下面建立項目包:java.com.mmall,下面建一些實際的邏輯代碼包。
將 java 包標示為 source root,源代碼路徑。

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:mvc="http://www.springframework.org/schema/mvc" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/mvc 12 http://www.springframework.org/schema/mvc/spring-mvc.xsd "> 13 14 15 <context:annotation-config /> 16 17 <!-- 啟動注解驅動的 spring MVC 功能 --> 18 <mvc:annotation-driven /> 19 20 <!-- 啟動包掃描功能, 一般會掃描 controller 和 service, dao 相關的會通過 mybatis 來處理--> 21 <context:component-scan base-package="com.mmall.controller"/> 22 <context:component-scan base-package="com.mmall.service"/> 23 24 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 25 <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 26 27 <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> 28 29 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 30 <property name="prefix" value="/views/" /> 31 <property name="suffix" value=".jsp" /> 32 </bean> 33 34 </beans>
配置 applicationContext
在做數據庫配置的時候,可以將 driverClassName、url、username、passwd 等放在配置文件 setting.propertities 中。在 propertyConfigurer 這個bean 中,配置了要去哪里取配置文件的地址:locations。於是又在resource 下面創建了一個 setting.properties 。這樣配好了之后,就可以從這個配置文件中獲取key-value值,將 value 填充到 dataSource 中的變量里。用 ${varaible}占位符表示變量。

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" xmlns:tx="http://www.springframework.org/schema/tx" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 5 6 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 7 <property name="locations"> 8 <list> 9 <!-- 這里又用到了 classpath,表示去resource 里面找配置文件 --> 10 <value>classpath:settings.properties</value> 11 </list> 12 </property> 13 </bean> 14 15 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 16 <property name="driverClassName" value="${db.driverClassName}" /> 17 <property name="url" value="${db.url}" /> 18 <property name="username" value="${db.username}" /> 19 <property name="password" value="${db.password}" /> 20 <property name="minIdle" value="3" /> 21 <property name="maxActive" value="20" /> 22 <property name="maxWait" value="60000" /> 23 <property name="filters" value="stat,wall" /> 24 </bean> 25 26 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 27 <!-- 添加配置文件--> 28 <property name="configLocation" value="classpath:mybatis-config.xml" /> 29 <property name="dataSource" ref="dataSource" /> 30 <!-- 定義sql寫在哪里 ,mybatis會去mapper下面讀取所有xml文件進行映射--> 31 <property name="mapperLocations" value="classpath:mapper/*.xml" /> 32 </bean> 33 34 <!-- mybatis自己的一些庫--> 35 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" > 36 <!-- 定義要掃描java里的那些包--> 37 <property name="basePackage" value="com.mmall.dao" /> 38 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 39 </bean> 40 41 <!-- 事物--> 42 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > 43 <property name="dataSource" ref="dataSource" /> 44 <tx:annotation-driven transaction-manager="transactionManager" /> 45 </bean> 46 47 <!-- druid 其中為stat的filter--> 48 <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter" > 49 <!-- 如果這個sql執行超過了3000ms,則被視為慢sql--> 50 <property name="slowSqlMillis" value="3000" /> 51 <!-- 如果是慢sql,則以日志形式記錄下來 --> 52 <property name="logSlowSql" value="true" /> 53 <property name="mergeSql" value="true" /> 54 </bean> 55 56 <!-- druid 為wall-filter --> 57 <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter"> 58 <property name="dbType" value="mysql" /> 59 </bean> 60 </beans>
其中setting.propertities內容如下:

1 db.driverClassName=com.mysql.jdbc.Driver 2 db.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 3 db.username=root 4 db.password=yourDBpasswd
在配置完上述內容后,我們對一個Spring項目的基本配置就已經結束了,其中有些數據庫相關的配置,如果暫時用不上可以不要。為了將我們的servlet發布到容器上,我們還需要配置Tomcat。
配置 Tomcat
首先仍然在Apache官網下載Tomcat,解壓縮放在自己想要放的文件夾下面。
在 IDEA 中配置 Tomcat
點擊 + 號
選擇 local
配置 server
如果你之前沒有配置過,在 Application server 中沒有版本,點擊右邊的 Configure,找到之前解壓的 Tomcat 目錄即可。
配置完 Server 之后,還有配置 Deployment,點擊下面的 + 號,選擇 Artifact,選擇 war exploded。
等 tomcat 服務器也配置好,我們最后創建一個簡單的控制類進行測試
1 package com.mmall.controller; 2 3 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.ResponseBody; 7 8 9 @Controller 10 @RequestMapping("/test") 11 public class TestController { 12 // private static final Logger logger = LoggerFactory.getLogger(TestController.class); 13 @RequestMapping("/hello") 14 @ResponseBody 15 public String hello() { 16 return "hello, myTestController"; 17 } 18 }
打開瀏覽器,輸入 http://localhost:8080/permission_war_exploded/ 出現歡迎界面,
輸入 http://localhost:8080/permission_war_exploded/test/hello,
出現我們自己設定的字符串界面,即說明這個簡單的 Spring MVC 項目已經運行在我們的本地服務器上了。
目前為止,通過在本機配置 Maven,IDEA中 創建 Maven 項目,配置 Spring 需要的一些文件,配置服務器並測試服務一系列的操作,我們基本實現了一個簡單 Spring MVC 項目的雛型。其中有些依賴包在最開始的時候可以不要,免得將項目結構搞的異常復雜。在這個過程中也遇到了一些問題,可以根據對應問題的錯誤提示去 stackOverFlow 上面搜索,解決了我好多問題,整個過程也參考了一些博客內容,寫的比較好的是這個。