1. 為什么
這陣子因?yàn)橐S護(hù)幾個(gè)管理系統(tǒng)(Spring MVC項(xiàng)目),就看了一下相關(guān)代碼。我希望對于一個(gè)新的東西,能夠快速掌握其用法。因?yàn)闊o論看了多少代碼,多少書,都不如做起來更有效果。
1.1 Git
無論什么時(shí)候開始一個(gè)項(xiàng)目,首先要有代碼版本管理的意識。當(dāng)然,作為個(gè)人愛好,我更喜歡用Git。即使是做簡單項(xiàng)目測試,我也用Git來管理,以便養(yǎng)成良好的開發(fā)習(xí)慣。
1.2 Maven
Maven目前還是事實(shí)上的Java構(gòu)建標(biāo)準(zhǔn)工具,做Java開發(fā)一定要懂Maven。一個(gè)項(xiàng)目由maven開始,能減少很多事情,比如四處去找依賴包---以前我真去一個(gè)個(gè)下載過。直到用上maven,我才知道以前多傻逼。
1.3 Intellij
開發(fā)IDE我更偏向Intellij IDEA。最開始轉(zhuǎn)Java方向的時(shí)候,即使團(tuán)隊(duì)大部分人用Eclipse,我也決定使用Intellij IDEA,阿里內(nèi)部也更提倡使用Intellij IDEA。這個(gè)才是專業(yè)的Java IDE,用好了能省很多很多功夫。
1.4 Spring MVC
Spring是一個(gè)非常有用的東西。這里面主要涉及兩個(gè)好處:
- 面向切面編程(AOP)
- 依賴注入(DI)
前者使得非業(yè)務(wù)性代碼如日志、性能監(jiān)控等對于核心業(yè)務(wù)的侵入性降低,同時(shí)又能形成重用組件,橫跨到在系統(tǒng)的各個(gè)組件中---這也是面向切面編程的含義。如果了解Python,就知道裝飾器,其實(shí)也可以把Spring AOP理解為Java的裝飾器。
依賴注入是指Spring容器幫助我們創(chuàng)建好對象,并管理對象之間的依賴---通過依賴注入的方式實(shí)現(xiàn)。這樣能夠?qū)崿F(xiàn)對象組件之間的松耦合和易于測試的特性。
Spring MVC是Spring的Web開發(fā)框架,采用MVC架構(gòu)。實(shí)際上就是讓你按照它的規(guī)約寫代碼,就能快速實(shí)現(xiàn)Web功能。HTTP和TCP的底層是相當(dāng)繁瑣的,框架的目的就是為了減少這種重復(fù)性的繁瑣,但同時(shí)要求你按照它的思想和設(shè)計(jì)來寫代碼。MVC就是一種典型的開發(fā)思想,Spring MVC框架就是這種思想在Java和Spring世界的實(shí)現(xiàn)。
我們此處就以SpringMVC的規(guī)范來開發(fā)一個(gè)簡單的管理系統(tǒng)。
1.5 開發(fā)系統(tǒng)
目前我的開發(fā)主力系統(tǒng)是Ubuntu 16.04 TLS,Intellij IDEA就裝在Ubuntu上。一方面是用習(xí)慣了,另一方面代碼終究是要運(yùn)行在服務(wù)器上,而目前服務(wù)器系統(tǒng)幾乎全部都是Linux系的。那么,多了解一點(diǎn)代碼的生產(chǎn)運(yùn)行環(huán)境也是很好的。
2. 走起來
2.1 創(chuàng)建項(xiàng)目

選擇Maven的maven-archetype-webapp能幫我們快速創(chuàng)建一個(gè)基于Maven的web項(xiàng)目結(jié)構(gòu)。后續(xù)我們會把它配置成標(biāo)準(zhǔn)的Maven結(jié)構(gòu),并引入Spring MVC框架。

添加這個(gè)配置能幫助快速創(chuàng)建項(xiàng)目,否則會到中央倉庫下載,十分緩慢。這個(gè)配置告訴Maven用內(nèi)部的原型創(chuàng)建。

2.2 用Git管理代碼


git init之后,先不要急著git add --all和git commit。先把一些不需要跟蹤的文件放在.gitignore文件中,這個(gè)文件一般需要自己創(chuàng)建。不需要的文件如上圖所示。

我們需要把代碼保存到遠(yuǎn)程庫中,此時(shí)可以在Github上創(chuàng)建一個(gè)庫用來保存代碼。

git st是git status的簡寫命令。此處注意用
git remote add origin https://github.com/ubear/SpringMVCDemo.git
給本地庫增加了遠(yuǎn)程庫。以后的代碼就能夠用git push origin master提交到遠(yuǎn)程。

因?yàn)樵贕ithub上創(chuàng)建時(shí),自動創(chuàng)建了個(gè)README文件,所以先要把遠(yuǎn)程的文件拉下來:
git pull origin master
然后再把代碼推上去:
git push -u origin master
這個(gè)命令只需要用一次,后續(xù)直接用git push就能把本地master分支代碼推到遠(yuǎn)程倉庫master分支上。
這些命令使用完后,我們的代碼就與遠(yuǎn)程同步了?,F(xiàn)在可以配置SpringMVC了。
2.3 配置Spring MVC

使用maven-archetype-webapp創(chuàng)建的項(xiàng)目并不是標(biāo)準(zhǔn)的maven項(xiàng)目,我們做一些調(diào)整:在main目錄下創(chuàng)建java目錄,并標(biāo)記為源代碼目錄(java目錄上右鍵->Make Directory as->Source Root)。src目錄下創(chuàng)建test文件夾,在test下創(chuàng)建java,標(biāo)記為Test Source Root。
再來修改pom.xml文件,引入SpringMVC庫和其他配置。剛開始的pom.xml是這樣的:
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chenyi.learn</groupId>
<artifactId>SpringMVCDemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringMVCDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>SpringMVCDemo</finalName>
</build>
</project>
配置好是這樣的:
<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">
<!--項(xiàng)目基本屬性-->
<modelVersion>4.0.0</modelVersion>
<groupId>com.chenyi.learn</groupId>
<artifactId>SpringMVCDemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringMVCDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<!--一些預(yù)定義的變量值 在本文件或者子項(xiàng)目的pom中引用-->
<properties>
<spring.version>4.3.7.RELEASE</spring.version>
</properties>
<dependencies>
<!--Spring 依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--設(shè)置build參數(shù)-->
<build>
<finalName>SpringMVCDemo</finalName>
<plugins>
<!--編譯插件配置-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<!--打包插件配置-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warName>SpringMVCDemo</warName>
<webResources>
<resource>
<!-- 元配置文件的目錄,相對于pom.xml文件的路徑 -->
<directory>src/main/webapp/WEB-INF</directory>
<!-- 是否過濾文件,也就是是否啟動auto-config的功能 -->
<filtering>true</filtering>
<!-- 目標(biāo)路徑 -->
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
<!--資源文件打包-->
<resources>
<!--全部資源文件都打包-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
<!--但只對properties文件過濾-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!--針對特定環(huán)境的Profile 采用不同配置-->
<profiles>
<!--生產(chǎn)環(huán)境-->
<profile>
<id>product</id>
<properties>
<mysql.db.url>
jdbc:mysql://11.176.112.10:3306/springdemo
</mysql.db.url>
<mysql.db.user>wlmJ19*&</mysql.db.user>
<mysql.db.pwd>&^2e!y</mysql.db.pwd>
</properties>
</profile>
<!--開發(fā)環(huán)境-->
<profile>
<id>dev</id>
<properties>
<mysql.db.url>jdbc:mysql://127.0.0.1:3306/springdemo</mysql.db.url>
<mysql.db.user>root</mysql.db.user>
<mysql.db.pwd>123456</mysql.db.pwd>
</properties>
</profile>
</profiles>
</project>
這個(gè)配置中值得學(xué)習(xí)的東西很多,但此處并不詳細(xì)展開。注意profile的配置能夠讓我們根據(jù)不同的設(shè)置(環(huán)境)打成不同的war包。要打開發(fā)環(huán)境用的包,我們使用以下maven命令:
mvn clean package -DskipTests -P dev
把-P后面的參數(shù)換成product就能打出生產(chǎn)環(huán)境中的包。要想起到過濾作用,我們在resources文件夾下建立conf.properties文件,內(nèi)容為:
# mysql config
dburl=${mysql.db.url}
dbuser=${mysql.db.user}
dbpwd=${mysql.db.pwd}
打包完成后,不同的環(huán)境下對應(yīng)的變量會替換成對應(yīng)profile中設(shè)置的值。我們可以看到WEB-INF文件夾下多了一些東西,其中classes下有個(gè)conf.properties,里面存放了用profile中的屬性替換之后的配置。如按照dev打包,其內(nèi)容是:
# mysql config
dburl=jdbc:mysql://127.0.0.1:3306/springdemo
dbuser=root
dbpwd=123456
當(dāng)然,還有另一種方式實(shí)現(xiàn)這個(gè)功能。可以根據(jù)不同的環(huán)境設(shè)置不同的properties文件,如dev.properties、product.properties等。然后在類似web.xml,applicationContext.xml這樣的配置文件中引用properties文件中定義的變量。pom.xml中可以根據(jù)不同profile定義不同的properties來過濾這些xml配置文件中的變量,最后在war包中根據(jù)不同的環(huán)境生成不同的xml配置文件。在這里就不用種方式。如果需要,可以自己行Google。
3. 總結(jié)
在這篇文章中,我們創(chuàng)建了一個(gè)SpringMVC項(xiàng)目,且用Git來管理代碼,用Maven管理依賴和構(gòu)建等。并且還介紹了如何根據(jù)pom.xml實(shí)現(xiàn)不同的環(huán)境打不同的war包。對于像我這樣的JavaWeb初學(xué)者,算是已經(jīng)完成第一步了。圖截的不太好,Ubuntu上畢竟沒有Windows和Mac截圖方便,不過也沒啥啦。
接下來我們開始好好配置SpringMVC了,邊做邊學(xué)習(xí)。