前提:
1,已安裝JDK
2, 有Intellij IDEA
3, 已安裝Gradle
一分鍾實現步驟:
1,mkdir Spring-MVC;cd Spring-MVC
2,gradle init
3,edit build.gradle file
/*
* This build file was auto generated by running the Gradle 'init' task
* by 'Administrator' at '16-10-2 下午8:42' with Gradle 3.1
*
* This generated file contains a commented-out sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/3.1/userguide/tutorial_java_projects.html
*/
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.akhikhl.gretty:gretty:+'
}
}
ext {
springVersion = '4.3.3.RELEASE'
}
//apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'
apply plugin: 'org.akhikhl.gretty'
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse'
apply plugin: 'idea'
// In this section you declare where to find the dependencies of your project
repositories {
// Use 'jcenter' for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
mavenCentral()
maven { url 'http://repo.spring.io/release' }
}
// In this section you declare the dependencies for your production and test code
dependencies {
//core spring
compile ("org.springframework:spring-context:$springVersion")
compile ("org.springframework:spring-core:$springVersion")
compile ("org.springframework:spring-webmvc:$springVersion")
// The production code uses the SLF4J logging API at compile time
compile ("org.slf4j:slf4j-api:1.7.21")
// Declare the dependency for your favourite test framework you want to use in your tests.
// TestNG is also supported by the Gradle Test task. Just change the
// testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
// 'test.useTestNG()' to your build script.
testCompile ("junit:junit:4.12")
}
4,mkdir src\main\java ; mkdir src\main\resources ; mkdir src\main\webapp
mkdir src\main\webapp\WEB-INF
mkdir src\test\java ; mkdir src\test\resources
5,將項目導入idea,因為gradlew idea這個命令會生成一些多余的文件,不喜歡垃圾多余的東西,故直接導入
6,Spring MVC本質上就是Servlet, 所以需要定義一個web.xml和一個Spring MVC的配置文件,在WEB-INF下面添加web.xml和spring-mvc-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
<?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:p="http://www.springframework.org/schema/p" 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></mvc:annotation-driven> <context:component-scan base-package="org.springframework.samples"/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
關於Spring MVC的配置文件,最簡的配置是申明p,context,mvc命名空間即可。上面p其實是沒有用到的。
7,根據第6步的spring-mvc-servlet.xml的配置,還需要在WEB-INF文件夾下面創建一個views文件夾,並且新建文件home.jsp
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2016/10/2 0002 Time: 21:53 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Home</title> </head> <body> <h1> Hello world! </h1> <P> The time on the server is ${serverTime}. </P> </body> </html>
8,HomeController.java
package org.springframework.samples; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.text.DateFormat; import java.util.Date; import java.util.Locale; /** * Created by Administrator on 2016/10/2 0002. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** * . * Simply selects the home view to render by returning its name. * . */ @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate); return "home"; } }
9,
gradlew tomcatRun
10, http://localhost:8080/Spring-MVC/
11,理論延伸,Spring MVC的Servlet一共有三個層次
HttpServletBean,直接繼承於Java的HttpServlet, 將Servlet中配置的參數設置到相應的屬性,並不參與實際請求的處理
FrameworkServlet,初始化WebApplicationContext,將不同類型的請求合並到processRequest方法中統一處理
DispatcherServlet,初始化自身的9個組件,主要將請求交給doDispatch方法具體處理。哪9大組件呢?他們是:
HandlerMapping,根據request找到相應的Handler(就是常說的Controller)和Interceptors.
HandlerAdapter,共有3個方法,supports判斷是否可以使用某Handler,handler方法具體用Handler干活,getLastModified是用來獲取資源的Last Modified.
HandlerExceptionResolver,根據異常設置ModelAndView.並轉交給render方法進行渲染。
ViewResolver,將String類型的視圖名和Locale解析為View類型的視圖
RequestToViewNameTranslator,根據request獲取到視圖名,因為有些handler並沒有返回視圖名的。我想這個是實現404的最好組件了,一個spring mvc容器里只能配置一個。
LocaleResolver,根據request解析出Locale
ThemeResolver,根據request解析出主題名
MultipartResolver,用於處理上傳文件,將普通的request轉換成MultipartHttpServletRequest
FlashMapManager,用於管理FlashMap的,而FlashaMap主要用於redirect中傳遞參數

Java配置
按Spring的發展趨勢,現在推薦使用Java配置,下面就讓我們來拋棄xml而擁抱Java配置吧
前面1-5步一樣的。從第6步開始開始改變
6, 要拋棄web.xml,必須要在支持Servlet3.0+的服務器才行,實現只需擴展一下
AbstractAnnotationConfigDispatcherServletInitializer
public class SampleWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[0]; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{SpringMVCConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
接下來使用IDEA的Alter +Enter, 自動生成SpringMVCConfig.java
@Configuration @EnableWebMvc @ComponentScan("org.springframework.samples.controllers") public class SpringMVCConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); ; resolver.setExposeContextBeansAsAttributes(true); return resolver; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
7, 可以復制xml版本的jsp
8,根據SpringMVCConfig.java里的componentscan里的約定,我們將HomeController放在controllers下面。內容同xml版本
9,測試
