Gradle一分鍾實現Spring-MVC


前提:

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")
}
build gradle

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>
web.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"
       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-servlet.xml

關於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>
home.jsp

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";
    }

}
HomeController.java

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[]{"/"};
    }
}
SampleWebAppInitializer

接下來使用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();
    }
}
SpringMVCConfig

7, 可以復制xml版本的jsp

8,根據SpringMVCConfig.java里的componentscan里的約定,我們將HomeController放在controllers下面。內容同xml版本

9,測試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM