在利用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 上面搜索,解决了我好多问题,整个过程也参考了一些博客内容,写的比较好的是这个。