1.简介

作为企业Java开发人员,这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序,后果还包括许多挑战。 具体来说,其中一些是状态管理,工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spring的Web框架旨在帮助我们应对这些挑战。 基于模型-视图-控制器(MVC)模式,即使在解决了HTTP协议和其他所有挑战之后,Spring MVC仍可以帮助我们构建松散耦合和灵活的应用程序。

在本课程中,我们将从理解每个Spring MVC组件的目的以及它们在Spring应用程序的整个生命周期中处理请求和响应对象中所扮演的角色开始。 之后,我们将开始配置一个简单的Spring MVC应用程序,在每个步骤中添加一个组件,编写一个非常简单的Thymeleaf模板,最后为我们编写的Controller提供一个JUnit测试用例。 让我们开始吧!

2.请求的生命

请求对象的寿命

网上用户单击HTML页面上的链接后,请求对象的工作就会开始。 当一个请求对象离开浏览器并进入一个Spring MVC应用程序,该应用程序最终转换为响应对象时,它会停下来为MVC组件提供一些信息并加载一些新信息。 上图显示了将请求对象转换为响应对象之前的所有停止操作。

让我们了解一个请求对象在Spring MVC应用程序中需要执行的所有步骤:

  1. 该请求首先到达DispatcherServlet ,后者充当前端控制器,并将职责委托给框架的其他组件进行处理。 为了标识应该在哪里发送请求的Controller, DispatcherServlet咨询Handler映射,该Handler Mappings从请求对象中提取URL,并为该请求找到合适的Controller。
  2. 请求到达控制器后,它将丢弃其拥有的所有信息,并耐心等待控制器执行其处理。 通常,Controller提供一个模型和一个视图名称,该名称和视图名称提供响应HTML内容。
  3. 为了保持Controller和视图之间的分离,Controller仅将逻辑视图名称作为String返回给DispatcherServlet 。 然后DispatcherServlet咨询View Resolver,以将此String逻辑视图名称映射到特定的视图实现,该实现可以是JSP页面或HTML页面。
  4. DispatcherServlet知道要渲染哪个视图之后,它最终将模型数据发送到实际视图,以便可以构造响应对象。 现在,请求对象的生命已经结束。
  5. 现在,该视图已转换为响应对象,并发送回用户,可以在浏览器中显示。

听起来所有工作都是由请求对象完成的,而用户仅看到响应对象。 确实如此!

3.项目设置

我们将使用许多Maven原型之一为我们的示例创建一个示例项目。 要创建项目,请在将用作工作空间的目录中执行以下命令:

建立专案

mvn archetype:generate -DgroupId=com.javacodegeeks.example -DartifactId=JCG-SpringMVC-example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果您是第一次运行maven,则完成生成命令将花费几秒钟,因为maven必须下载所有必需的插件和工件才能完成生成任务。

用Maven创建项目

创建项目后,请随时在您喜欢的IDE中打开它。 下一步是向项目添加适当的Maven依赖关系。

这是带有适当依赖项的pom.xml文件:

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.javacodegeeks.example</groupId><artifactId>JCG-SpringMVC-example</artifactId><version>1.0-SNAPSHOT</version><name>JCG-SpringMVC-example</name><packaging>war</packaging><description>Spring MVC Hello World Example</description><dependencies><!--Spring MVC Dependencies--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.9.RELEASE</version></dependency><!-- Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.6.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.0.0</version><configuration><warSourceDirectory>WebContent</warSourceDirectory></configuration></plugin></plugins><!-- added to remove Version from WAR file --><finalName>${project.artifactId}</finalName></build>
</project>

最后,要了解添加此依赖项时添加到项目中的所有JAR,我们可以运行一个简单的Maven命令,当我们向其添加一些依赖项时,该命令使我们能够查看项目的完整依赖关系树。 这是我们可以使用的命令:

依赖树

mvn dependency:tree

当我们运行此命令时,它将向我们显示以下依赖关系树:

Spring MVC项目依赖树

4.配置DispatcherServlet

正如我们在上一节中所述,一切都始于DispatcherServlet 。 因此,这将是我们要添加到项目中的第一个组件。 请注意,我们将在Java类中配置DispatcherServlet ,而不是web.xml文件:

AppInitializer.java

package com.javacodegeeks.example.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class AppInitializer extendsAbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[] { RootConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[] { WebConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[] { "/" };}
}

这里首先要注意的是,任何扩展AbstractAnnotationConfigDispatcherServletInitializer类都将用于配置DispatcherServlet和应用程序上下文。

方法getServletMappings()标识DispatcherServlet映射到的路径。 在此,我们提供了/ ,它将是应用程序的默认servlet。 当DispatcherServlet启动时,它将创建Spring应用程序上下文,并开始使用由getServletConfigClasses()方法定义的WebConfig类中声明的bean加载该上下文。 最后,由getRootConfigClasses()方法返回的类用于加载ContextLoaderlistener创建的上下文。

让我们现在定义WebConfigRootConfig类,看看它们的功能是什么。

5.启用Web MVC

启用S​​pring MVC组件的经典方法之一是将XML文件与 元素。 但是在本课程中,我们将展示仅使用Java类提供所有配置的最新方法。 让我们通过定义我们的WebConfig类来启用Spring MVC Components:

WebConfig.java

package com.javacodegeeks.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@EnableWebMvc
@ComponentScan("com.javacodegeeks.example")
public class WebConfig extends WebMvcConfigurerAdapter {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/views/");viewResolver.setSuffix(".jsp");viewResolver.setExposeContextBeansAsAttributes(true);return viewResolver;}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}
}

在此配置类中发生了很多事情。 让我们了解所有这些事情:

  • 我们做的第一件事是使用@ComponentScan注释@ComponentScan 。 这告诉Spring扫描哪个软件包来查找我们定义的Spring Bean和组件。 它将解析上述包中的所有子包。
  • 我们还在类上定义一个ViewResolver bean,并将其配置为在相对于应用程序的类路径的指定位置中查找JSP页面。
  • 最后,该类扩展了WebMvcConfigurerAdapter并重写了configureDefaultServletHandling方法,并在configurer对象上调用enable() ,该对象告诉DispatcherServlet将对静态资源的请求转发给ViewResolver而不自己处理。

6.定义根配置

对于ContextLoaderlistener的应用程序上下文bean,我们将不定义任何bean。 在RootConfig类中,我们甚至可以为非Web组件定义Bean。 让我们看一下示例代码:

RootConfig.java

package com.javacodegeeks.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan(basePackages = {"com.javacodegeeks.example"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}

我们唯一要做的就是用@ComponentScan注释@ComponentScan 。 这告诉Spring扫描哪个软件包以查找项目中可能存在的非Web组件。

7.编写一个简单的控制器

当我们定义一个允许最终用户与我们创建的应用程序进行交互的组件时,事情开始变得有趣起来。 控制器是以URL形式提供映射的组件,用户可以与之交互以获得一些响应。 在此示例中,我们将创建一个GET请求映射,该映射仅返回视图的逻辑视图名称,然后由我们创建的已配置视图解析器将其解析为JSP。 让我们看一下我们创建的样本控制器:

HomeController.java

package com.javacodegeeks.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
public class HomeController {@RequestMapping(value = "/", method = RequestMethod.GET)public String home() {return "home";}
}

我们在这里定义了一个GET映射,它仅返回逻辑视图名称,即home 。 这将解析为路径/WebContent/WEB-INF/views/home.jsp

8.设计视图

对于JSP视图,我们将设计一个非常简单的JSP页面,该页面将仅提供示例设计。 我们从应用程序根目录并在/WebContent/WEB-INF/views/home.jsp路径上创建了此文件。 这是文件:

home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html><head><title>JavaCodeGeeks: Spring MVC</title></head><body><h1>Welcome Spring MVC</h1><p>Hello JavaCodeGeeks!</p></body>
</html>

要查看我们所做的事情,我们接下来将运行我们的应用程序。 请注意,这只是一个基本的JSP页面,没有其他内容介绍ViewResolver如何将逻辑视图名称解析为具体视图, DispatcherServlet作为响应返回该视图。

9.运行应用程序

是时候运行我们的应用程序了。 我们使用IntelliJ IDE来运行项目。 要运行项目,首先将Tomcat配置为接受爆炸的WAR工件:

带有爆炸WAR的Tomcat配置

最后,当我们运行应用程序时,我们可以从创建的JSP视图中看到输出:

运行Spring MVC应用程序

10.带有Spring Boot的Spring MVC

Spring Boot是一个出色的平台,它建立在Spring MVC框架之上,使事情变得更快,更容易。 通过使用与我们添加到项目中的依赖项相关的许多默认设置和配置来创建这种轻松性。 Spring Boot提供的另一个优势是,它允许我们定义父依赖关系,通过该依赖关系可以在整个项目中维护版本兼容性。 让我们详细了解一下。

10.1 Spring Boot入门

Spring Boot提供了非常方便的启动程序依赖项 ,它使我们能够选择功能并将与之相关的依赖项添加到我们的项目中。 一旦完成,Spring Boot本身将管理所有相关的依赖项并将它们以正确的版本号带入我们的项目,并保证这些依赖项将彼此兼容。 父依赖项定义为:

入门依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version>
</parent>

当您在此处提供version并在pom.xml文件的“ dependencies部分中使用相同的groupId ,将自动导入版本。

10.2凝视Spring Boot应用程序

每个Spring Boot应用程序都以旧的main()方法的形式提供了一个入口点。 我们可以像正常的main方法一样运行此方法,该方法主要负责初始化Spring Bean和启动应用程序。 Spring Boot主类的最常见形式如下所示:

Spring Boot主类

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

使用@SpringBootApplication的单个注释,我们启用了以下注释:

  • @Configuration :此注释将该类标记为Configuration类,并由Spring Container首先初始化
  • @EnableAutoConfiguration :此注释表示每个标记有@Component注释的@Component都将作为Spring Bean加载。
  • @ComponentScan :最后,此批注将自动启用组件扫描。 默认情况下,当我们不提供任何包值时,此批注将选择此类所在的包,并从那里开始寻找Spring组件。

在这里看看使用Spring Boot使其他事情变得多么容易。

11.结论

在本课程中,我们了解了当请求对象离开Web浏览器时会发生什么以及如何将其转换为响应对象。 这篇文章还解释了DispatcherServlet在处理来自客户端的请求时所起的重要作用。 我们还制作了一个简单的Spring MVC应用程序,以查看视图名称也如何解析为具体的视图实现。

重要的是要理解,即使Spring Boot已将Spring演变为一个更简单的工作区,它仍然依赖Spring MVC提供默认设置和bean。

12.下载源代码

这是简单的Spring MVC应用程序的示例。

下载
您可以在此处下载此示例的完整源代码: JCG-SpringMVC-example

翻译自: https://www.javacodegeeks.com/2018/04/spring-mvc-tutorial-2.html

Spring MVC教程相关推荐

  1. 2017.3.31 spring mvc教程(六)转发、重定向、ajax请求

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  2. spring mvc教程_Spring MVC教程

    spring mvc教程 1.简介 作为企业Java开发人员,这项工作的主要重点之一是开发Web应用程序. 对于Web应用程序,后果还包括许多挑战. 具体来说,其中一些是状态管理,工作流和验证. HT ...

  3. spring mvc 教程_Spring MVC开发–快速教程

    spring mvc 教程 这是我们的JCG合作伙伴之一,来自Manoj的有关使用Spring开发Web应用程序的简短教程, 网址为" The Khangaonkar Report &quo ...

  4. 史上最简单的 Spring MVC 教程(九)

    1 前言 在史上最简单的 Spring MVC 教程(五.六.七.八)等四篇博文中,咱们已经分别实现了"人员列表"的显示.添加.修改和删除等常见的增.删.改.查功能.接下来,也就是 ...

  5. Spring MVC 教程,快速入门,深入分析

    目录  转载自:http://elf8848.iteye.com/blog/875830 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf 点击打开链接 SpringMVC核 ...

  6. Spring MVC 教程,快速入门,深入分析【转】

    2019独角兽企业重金招聘Python工程师标准>>> 转自:赵磊 地址:http://elf8848.iteye.com 目录  一.前言 二.spring mvc 核心类与接口 ...

  7. Spring MVC 教程详解 个人总结 复习必备 面试宝典 狂神笔记

    文章目录 一.MVC 模式 1.什么是 MVC 2.Servlet MVC 小结 二.Spring MVC 1.Spring MVC 概念 为什么学习 Spring MVC 中央控制器 Dispatc ...

  8. Spring MVC 教程,快速入门,深入分析——多视图控制器

    十八.多视图控制器 当有jsp,flt (模板)等多种页面生成展示方式时,spring默认使用的是"视图解析器链". 真是一个链,所以性能不好,spring会在"视图解析 ...

  9. Spring MVC JSP 表单标签教程

    在本教程中,我们将通过一个示例讨论所有与Spring MVC相关的JSP表单标签. 在本教程中,我们将使用下面重要的弹簧MVC表单标签进行讨论: 表单标签 文本字段标签 选择标签 复选框 无线电盒 密 ...

最新文章

  1. [epoll]epoll理解
  2. 分享 | 光纤光缆布线基础知识及系统设计
  3. oracle主键自动增长
  4. 2021中超1 1010 zoto
  5. Java 成员变量和局部变量
  6. (十二)nodejs循序渐进-高性能游戏服务器框架pomelo之创建一个游戏聊天服务器
  7. linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
  8. 如何插入? | 非开车,纯技术交流
  9. Matlab实现人脸识别
  10. iOS Programming - Disallow Alphabetic Characters
  11. python和c 情侣网名_超可爱超有趣的情侣ID
  12. 互联网早报|宠物行业上半年融资吸金超60亿;猿辅导、掌门教育进军素质教育赛道
  13. string.Format()之格式化数值类型数据
  14. CSS,font-family,好看,常用,中文,字体(更新中)
  15. Vue项目实现web端第三方分享(qq、qq空间、微博、微信)
  16. 简单题 6 清点代码库 (25 分)
  17. php文章相似度计算,PHP相似度算法
  18. 各大手机厂商开发者文档网址
  19. WinRAR 3.51 注册码
  20. varlimo阿米洛机械键盘 win lock锁定

热门文章

  1. Sentinel(五)之流量控制
  2. Spark入门(十三)之分组求平均值
  3. mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法
  4. Spring Bean 后置处理器
  5. 图解分布式架构的演进
  6. Maven精选系列--eclipse各种操作
  7. 你喜欢什么样的课堂?
  8. 2019蓝桥杯省赛---java---B---1(组队)
  9. 16-就业课(2.1)-应用容器-Docker
  10. python短视频自动制作_Python 带你一键生成朋友圈超火的九宫格短视频