最最最傻瓜式的创建Spring MVC新项目,我就是个小白……写的会很细,借鉴类很多但是还有好多没懂,欢迎指正~
一、新建项目
1、点击Create New Project
2、选择maven,勾选create from archetype,选择webapp项目,next;
-
<groupId>
- The group or organization that the dependency belongs to. -
<artifactId>
- The library that is required. -
<version>
- The specific version of the library that is required.
3、然后就是两个next直到finish,此时会进入idea的正式界面,稍等一会直到全部东西都加载完毕,可能会很长的时间;
全部加载完毕以后,点击右上角向下小箭头的的Edit Configurations,出现下面的界面
4、点击左上角的+号,下拉,选择Tomcat-local
//这里有个问题,为什么选择local呢,上网查了下没有找到很好的答案,以后再补充
点击第二个+号,选择Artifact,选择 war 或者 war exploded 都可以,我选择了war exploded
tips:
exploded war VS war二者的区别:
war,称为packaged模式,将工程以打包的形式部署到应用服务器中
exploded war,称为exploded模式,将工程以文件夹包含需要的内容的方式(含有打包war解压后的内容)部署到应用服务器中
exploded war的特点:部署更快且支持热部署(可以修改代码实时反应),eclipse中的tomcat插件基本都支持这种技术
此时点击右上角的运行按钮,应该会自动启动浏览器并看到hello,world
二、配置几个重要的XML文件
几个重要的xml文件分别是
pom.xml | web.xml | dispatcher-servlet.xml |
导入Spring依赖 | <servlet>:SpringMVC核心配置文件名字和位置 <servlet-mapping>:注册的组件的访问路径 <listener>:会在整个Web应用程序启动的时候运行一次,并初始化传统意义上的Spring的容器 <context-param>:修改listener默认位置 | 一、头部声明,Schema-based XML的声明 二、组件定义,指定组件的实现模式 1. 基于Schema-based XML的配置定义模式 2. 基于Traditional XML的配置定义模式 定义组件:用具体的实现类来指定接口的行为方式,然后在初始化WebApplicationContext时初始化这些组件 |
后两者XML文件的默认位置都是src/webapp/WEB-INF/
1、pom.xml
这是默认情况下pom.xml的配置:
<modelVersion>. POM 模型版本号 (通常为 4.0.0).//这是啥……我也不知道
<groupId>. 组织或者公司名,通常是反向域名
<artifactId>. Name to be given to the project’s library artifact (for example, the name of its JAR or WAR file).
<version>. 当前版本号
<packaging>- 项目的包装方式,默认为jar或者war//不是很懂,等以后解决
我这里已经默认有了一个junit,版本号是3.8.1,这里可以手动改为4.0,然后idea会自动帮你加载
依赖的构成:
<dependencies>
<dependency>//一个依赖
<groupId>junit</groupId>//这个依赖所属于的组织或公司
<artifactId>junit</artifactId>//我们需要的依赖的程序库
<version>4.0</version>//版本号
<scope>test</scope>//作用域
</dependency>//一个依赖的结尾
</dependencies>
Spring版本控制和BOM:
当使用Maven时,可能会意外混合不同版本的Spring JAR。 例如,您可能会发现第三方库或另一个Spring项目会将旧的版本的依赖关系传递给旧版本。 如果您忘记自己明确声明直接依赖,可能会出现各种意外问题。为了克服这些问题,Maven支持 “bill of materials ”(BOM)依赖的概念。 您可以在dependencyManagement部分中导入spring-framework-bom,以确保所有Spring依赖(直接和传递的)都是相同的版本。
具体可以看Spring的官方文档或者看一下这篇文章: maven中DependencyManagement和Dependencies
用BOM的时候出了个很大的问题,使用BOM的格式如下
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>4.3.11.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- spring framework start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> …… <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <!-- spring framework end --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.6.2</version> </dependency> </dependencies> |
可是Spring死命都加载不进来,网上搜索了半天也没发现和我一样问题的;
后来纠结了好几个小时,把pom.xml文件传给了我家大爷,他那边就可以加载??喵喵喵?
至少知道了不是代码的问题,后来又刷新重载了好几次都不行,最后他告诉我
问题在于:网络
maven默认的中央仓库在海外,我在BOM里配置了bom里的4.3.11版本;
电脑里面是之前的版本,就要去海外的服务器下载,连接不上的话就识别不了这个依赖了;
解决方法:https://skyao.gitbooks.io/learning-maven/content/installation/mirror.html
这里还有一个问题要注意,maven的setting的文件可能不是此文所说setting.xml,要去idea的Perferences中查看你的maven的setting文件的位置
最终的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.sandao</groupId> <artifactId>newjavaweb</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>newjavaweb Maven Webapp</name> <url>http://maven.apache.org</url> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>4.3.11.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- spring framework start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <!-- spring framework end --> <!-- servlet start --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>javax.servlet.jsp.jstl-api</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <!-- servlet end --> <!-- json start --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.6.2</version> </dependency> <!-- json end --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.9.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>newjavaweb</finalName> </build> </project> |
2、web.xml
在配置前,web.xml默认是这样的
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app> |
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0">//这里的我还没仔细看!!!! <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>spring-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:web/applicationContext-dispatcherServlet.xml</param-value> </init-param>//这部分可选,用于修改核心配置文件的默认位置 </servlet> <servlet-mapping> <servlet-name>spring-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:context/applicationContext-*.xml</param-value> </context-param>//这部分也可选,用于修改listener配置文件的默认位置 </web-app> |
servlet的配置文件位置修改是包在<servlet>里面的
listener的配置文件位置修改是不包在<listener>里面的
DispatcherServlet和ContextLoaderListener会分别构建不同作用范围的容器(WebApplicationContext)。
ContextLoaderListener所初始化的容器,我们称之为Root WebApplicationContext;
DispatcherServlet所初始化的容器,是SpringMVC WebApplicationContext。
spring-dispatcher-servlet.xml
3、spring-dispatcher-servlet.xml.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> |
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven />//启用注解配置 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/pages/"/> <property name="suffix" value=".jsp"/> </bean>//用于解析 View ,指定了 View 页面的位置及类型(后缀)。 <mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>//将静态文件添加为例外。 <context:component-scan base-package="com.sys.springandspringmvc.controller"/>//配置 Spring 以扫描 controller 目录进行依赖注入。 </beans> |
三、编写Controller和目录点击打开链接
目录结构参见:http://blog.csdn.net/lengyue_wy/article/details/6718637
ps:新建开始的时候是Directory,然后右键 java 文件,在 Mark Directory As 中选择第一个 Source Root 。此时会看见文件夹变天蓝色;
新建一个class作为controller
package com.sys.springandspringmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class IndexController { @RequestMapping("/") public String index() { return "index"; } } |
总之,到这里一个最简单的Spring MVC项目就建好了
参考资料:
Building Java Projects with Maven:https://spring.io/guides/gs/maven/#scratch
Maven 引入 Spring 依赖的最佳方法:http://charmingoh.com/
SpringMVC深度探险(三) —— DispatcherServlet与初始化主线:http://downpour.iteye.com/blog/1341459
在Intellij Idea中使用Maven创建Spring&SpringMVC项目:https://eason-yang.com/2016/08/03/use-maven-to-create-a-spring-springmvc-project-in-intellijidea/