《精通Spring MVC 4》——1.5 那就正式开始吧

简介: 如果你还不熟悉Gradle的话,那么可以将其视为Maven的继任者,它是一个现代化的构建工具。与Maven类似,它会使用约定,例如如何组织Java应用的结构。我们的源码依然会放在“src/main/java”之中,Web应用的代码放到“src/main/webapp”之中,诸如此类。

本节书摘来自异步社区《精通Spring MVC 4》一书中的第1章,第1.5节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.5 那就正式开始吧

现在Web应用已经准备就绪,先看一下它是如何编写的。在进一步学习之前,我们可以将工作的成果保存到Git上。

screenshot

在Windows下,需要安装Git bash,这可以在https://msysgit.github.io找到。在Mac下,如果你使用homebrew的话,很可能已经安装过Git了,否则的话,使用brew install git命令来进行安装。
如果要使用Git版本化我们的工作内容,那么可以在控制台中输入如下的命令:

$ cd app
$ git init

使用IntelliJ的话,要忽略自动生成的文件,即“.idea”和“*.iml”。使用Eclipse的话,应该将“.classpath”文件和“.settings”文件夹提交上去。不管是哪种情况,都要忽略“.gradle”文件夹和build文件夹。

创建一个包含如下文本内容的“.gitignore“文件:

# IntelliJ project files
.idea
*.iml

# gradle
.gradle
build

现在,我们可以将其他文件添加到Git中:

$ git add .
$ git commit -m "Generated with curl start.Spring.io"
[master (root-commit) eded363] Generated with curl start.Spring.io
4 files changed, 75 insertions(+)
create mode 100644 build.Gradle
create mode 100644 src/main/Java/com/geowarin/AppApplication.Java
create mode 100644 src/main/resources/application.properties
create mode 100644 src/test/Java/com/geowarin/AppApplicationTests.Java

1.5.1 Gradle构建
如果你还不熟悉Gradle的话,那么可以将其视为Maven的继任者,它是一个现代化的构建工具。与Maven类似,它会使用约定,例如如何组织Java应用的结构。我们的源码依然会放在“src/main/java”之中,Web应用的代码放到“src/main/webapp”之中,诸如此类。与Maven类似,我们可以使用Gradle插件来处理各种构建任务。但是,Gradle真正的闪光点在于,它允许我们使用Groovy DSL编写自己的构建任务。默认库使得管理文件、声明任务之间的依赖以及增量执行job都变得非常容易。

screenshot

如果你使用OS X的话,那么可以通过brew install gradle命令,借助brew来安装Gradle。在任意的*NIX的系统下(包括Mac),都可以使用gvm(http://gvmtool.net/)来进行安装。另外,也可以在https://Gradle.org/downloads下获取二进制分发包。
使用Gradle创建应用的第一个最佳实践就是生成Gradle包装器(wrapper)。Gradle包装器是一个小的脚本,它能够在你的代码中进行共享,从而确保会使用相同版本的Gradle来构建你的应用。

生成包装器的命令是gradle wrapper:

$ gradle wrapper
:wrapper

BUILD SUCCESSFUL

Total time: 6.699 secs

如果我们看一下新创建的文件,可以看到有两个脚本和两个目录:

$ git status -s
?? .gradle/
?? gradle/
?? gradlew
?? gradlew.bat

在“.gradle”目录中包含了Gradle二进制文件,我们不希望将其添加到版本控制之中。

前面已经忽略了这个文件和构建目录,所以可以安全地对其他内容执行git add操作:

$ git add .
$ git commit -m "Added Gradle wrapper"

gradle 目录包含了如何得到二进制文件的信息。另外两个文件是脚本:用于 Windows的批处理脚本(gradlew.bat)以及用于其他系统的shell脚本。

我们可以使用Gradle运行应用,替换借助IDE来执行应用的方式:

$ ./gradlew bootrun
执行上面的命令将会运行一个嵌入式的Tomcat,应用会位于它里面!

如图1-7所示,日志提示服务器运行在8080端口上,我们检查一下。

screenshot

图1-7

可以想象到你内心的失望,因为应用还没有为完全公开做好准备。

换句话说,在工程中,这两个文件所完成的工作内容还是很让人振奋的。我们来看一下。

首先是Gradle构建文件,也就是build.gradle:

buildscript {
    ext {
        springBootVersion = '1.2.5.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-
plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-
plugin:0.5.1.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'

jar {
    baseName = 'masterSpringMvc'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}
eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.
eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

在这里,都看到了什么呢?

对Spring Boot插件的依赖,它分布在Maven中央仓库中。
我们的项目是Java工程。Gradle可以为IntelliJ或Eclipse生成IDE工程文件。
该应用将会生成JAR文件。
我们的项目的依赖是托管在Maven中央仓库中的。
类路径在生产环境下包含spring-boot-starter-web,在测试环境中,还包含spring- boot-starter-test。
针对Eclipse的一些额外配置。
Gradle包装器的版本是2.3。
Spring Boot插件将会产生一个胖(fat)JAR文件,其中包含了项目的所有依赖。要构建的话,只需输入:

./gradlew build
我们将会在“build/libs”目录下找到这个JAR文件。该目录下会包含两个文件,其中一个为胖JAR包,名为masterSpringMvc-0.0.1-SNAPSHOT.jar,另外一个是普通的JAR文件,名为masterSpringMvc-0.0.1-SNAPSHOT. jar.original,这个文件不包含任何的依赖。

screenshot

Spring Boot主要的一个优势在于将应用所需的所有内容都放到一个易于重发布的JAR文件中,其中包含了Web服务器。如果你运行java jar masterSpringMvc-0.0.1- SNAPSHOT.jar的话,Tomcat将会在8080端口上启动,就像在开发期一样。如果要将其部署到生产环境或云中,这都是相当便利的。
在这里,主要的依赖是spring-boot-starter-web,Spring Boot提供了很多的Starter,它们会对应用的很多方面进行自动化配置,这是通过提供典型的依赖和Spring配置来实现的。

例如,spring-boot-starter-web将会包含对tomcat-embedded和Spring MVC的依赖。它会自动运行Spring MVC最为常用的配置并提供一个分发器(dispatcher),使其监听“/”根路径,还会提供错误处理页面,就像之前所看到的404页面那样。除此之外,还有一个典型的视图解析器(view resolver)配置。

稍后,我们将会看到更多的内容,首先从下一节开始吧!

1.5.2 让我们看一下代码
这里将会展现运行应用的所有代码,它是一个经典的main函数,这种方式有很大的优势,因为我们可以在IDE中像运行其他程序那样运行这个应用。我们可以对其进行调试,并且不需要插件就能实现一些类的重新加载。

在开发模式下,当我们在Eclipse中保存文件或者在IntelliJ中点击“Make Project”就会触发重新加载的过程。只有JVM支持切换至新编译版本的类文件时,它才是可行的,如果修改静态变量或配置文件的话,我们必须要重新加载应用。

主类如下所示:

package masterSpringMvc;

import org.Springframework.boot.SpringApplication;
import org.Springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppApplication {

    public static void main(String[] args) {
        SpringApplication.run(AppApplication.class, args);
    }
}

需要注意的是@SpringBootApplication注解,如果看一下这个注解的代码的话,就会发现它实际上组合了3个其他的注解,也就是@Configuration、@EnableAutoConfiguration和@ComponentScan:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {

  /**
  * Exclude specific auto-configuration classes such that they will
never be applied.
  */
  Class<?>[] exclude() default {};
}

如果你之前使用Java代码配置过Spring应用的话,那么你应该对@Configuration非常熟悉。它表明我们的这个类将会处理Spring的常规配置,如bean的声明。

@ComponentScan也是一个比较经典的注解,它会告诉Spring去哪里查找Spring组件(服务、控制器等)。在默认情况下,这个注解将会扫描当前包以及该包下面的所有子包。

在这里,比较新颖的是@EnableAutoConfiguration注解,它会指导Spring Boot发挥其魔力。如果你将其移除掉的话,就无法从Spring Boot的自动配置中收益了。

使用Spring Boot来编写MVC应用的第一步通常是在代码中添加控制器。将控制器放到controller子包中,这样它就能够被@ComponentScan注解所发现:

package masterSpringMvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @RequestMapping("/")
    @ResponseBody
    public String hello() {
        return "Hello, world!";
    }
}

现在,如果打开浏览器并访问http://localhost:8080的话,就能看到我们钟爱的“Hello, world!”被输出了出来(见图1-8)。

screenshot

图1-8

相关文章
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
1123 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1765 0
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
1152 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
1208 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
742 0
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
1030 0
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
500 0
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
542 0
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
1131 29