1. 为什么
这阵子因为要维护几个管理系统(Spring MVC项目),就看了一下相关代码。我希望对于一个新的东西,能够快速掌握其用法。因为无论看了多少代码,多少书,都不如做起来更有效果。
1.1 Git
无论什么时候开始一个项目,首先要有代码版本管理的意识。当然,作为个人爱好,我更喜欢用Git。即使是做简单项目测试,我也用Git来管理,以便养成良好的开发习惯。
1.2 Maven
Maven目前还是事实上的Java构建标准工具,做Java开发一定要懂Maven。一个项目由maven开始,能减少很多事情,比如四处去找依赖包---以前我真去一个个下载过。直到用上maven,我才知道以前多傻逼。
1.3 Intellij
开发IDE我更偏向Intellij IDEA。最开始转Java方向的时候,即使团队大部分人用Eclipse,我也决定使用Intellij IDEA,阿里内部也更提倡使用Intellij IDEA。这个才是专业的Java IDE,用好了能省很多很多功夫。
1.4 Spring MVC
Spring是一个非常有用的东西。这里面主要涉及两个好处:
- 面向切面编程(AOP)
- 依赖注入(DI)
前者使得非业务性代码如日志、性能监控等对于核心业务的侵入性降低,同时又能形成重用组件,横跨到在系统的各个组件中---这也是面向切面编程的含义。如果了解Python,就知道装饰器,其实也可以把Spring AOP理解为Java的装饰器。
依赖注入是指Spring容器帮助我们创建好对象,并管理对象之间的依赖---通过依赖注入的方式实现。这样能够实现对象组件之间的松耦合和易于测试的特性。
Spring MVC是Spring的Web开发框架,采用MVC架构。实际上就是让你按照它的规约写代码,就能快速实现Web功能。HTTP和TCP的底层是相当繁琐的,框架的目的就是为了减少这种重复性的繁琐,但同时要求你按照它的思想和设计来写代码。MVC就是一种典型的开发思想,Spring MVC框架就是这种思想在Java和Spring世界的实现。
我们此处就以SpringMVC的规范来开发一个简单的管理系统。
1.5 开发系统
目前我的开发主力系统是Ubuntu 16.04 TLS,Intellij IDEA就装在Ubuntu上。一方面是用习惯了,另一方面代码终究是要运行在服务器上,而目前服务器系统几乎全部都是Linux系的。那么,多了解一点代码的生产运行环境也是很好的。
2. 走起来
2.1 创建项目
选择Maven的maven-archetype-webapp
能帮我们快速创建一个基于Maven的web项目结构。后续我们会把它配置成标准的Maven结构,并引入Spring MVC框架。
添加这个配置能帮助快速创建项目,否则会到中央仓库下载,十分缓慢。这个配置告诉Maven用内部的原型创建。
2.2 用Git管理代码
git init
之后,先不要急着git add --all
和git commit
。先把一些不需要跟踪的文件放在.gitignore
文件中,这个文件一般需要自己创建。不需要的文件如上图所示。
我们需要把代码保存到远程库中,此时可以在Github上创建一个库用来保存代码。
git st
是git status
的简写命令。此处注意用
git remote add origin https://github.com/ubear/SpringMVCDemo.git
给本地库增加了远程库。以后的代码就能够用git push origin master
提交到远程。
因为在Github上创建时,自动创建了个README文件,所以先要把远程的文件拉下来:
git pull origin master
然后再把代码推上去:
git push -u origin master
这个命令只需要用一次,后续直接用git push
就能把本地master分支代码推到远程仓库master分支上。
这些命令使用完后,我们的代码就与远程同步了。现在可以配置SpringMVC了。
2.3 配置Spring MVC
使用maven-archetype-webapp
创建的项目并不是标准的maven项目,我们做一些调整:在main目录下创建java目录,并标记为源代码目录(java目录上右键->Make Directory as->Source Root)。src目录下创建test文件夹,在test下创建java,标记为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">
<!--项目基本属性-->
<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>
<!--一些预定义的变量值 在本文件或者子项目的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>
<!--设置build参数-->
<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>
<!-- 目标路径 -->
<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>
<!--针对特定环境的Profile 采用不同配置-->
<profiles>
<!--生产环境-->
<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>
<!--开发环境-->
<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>
这个配置中值得学习的东西很多,但此处并不详细展开。注意profile
的配置能够让我们根据不同的设置(环境)打成不同的war
包。要打开发环境用的包,我们使用以下maven命令:
mvn clean package -DskipTests -P dev
把-P
后面的参数换成product
就能打出生产环境中的包。要想起到过滤作用,我们在resources
文件夹下建立conf.properties
文件,内容为:
# mysql config
dburl=${mysql.db.url}
dbuser=${mysql.db.user}
dbpwd=${mysql.db.pwd}
打包完成后,不同的环境下对应的变量会替换成对应profile
中设置的值。我们可以看到WEB-INF文件夹下多了一些东西,其中classes下有个conf.properties
,里面存放了用profile中的属性替换之后的配置。如按照dev打包,其内容是:
# mysql config
dburl=jdbc:mysql://127.0.0.1:3306/springdemo
dbuser=root
dbpwd=123456
当然,还有另一种方式实现这个功能。可以根据不同的环境设置不同的properties
文件,如dev.properties
、product.properties
等。然后在类似web.xml
,applicationContext.xml
这样的配置文件中引用properties
文件中定义的变量。pom.xml
中可以根据不同profile
定义不同的properties
来过滤这些xml配置文件中的变量,最后在war
包中根据不同的环境生成不同的xml配置文件。在这里就不用种方式。如果需要,可以自己行Google。
3. 总结
在这篇文章中,我们创建了一个SpringMVC项目,且用Git来管理代码,用Maven管理依赖和构建等。并且还介绍了如何根据pom.xml
实现不同的环境打不同的war
包。对于像我这样的JavaWeb初学者,算是已经完成第一步了。图截的不太好,Ubuntu上毕竟没有Windows和Mac截图方便,不过也没啥啦。
接下来我们开始好好配置SpringMVC了,边做边学习。