Spring MVC教程

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创建项目

用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项目依赖树

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配置

带有爆炸WAR的Tomcat配置

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

运行Spring MVC应用程序

运行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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

Spring Reactor教程

在RESTful服务的世界中&#xff0c;实际上实际上是在幕后进行许多工作&#xff0c;我们通常必须在应用程序中进行很多处理&#xff0c;而实际上并不会影响需要发送给真实用户的响应。 可以被动地做出这些业务决策&#xff0c;以便它们对与应用程序交互的用户没有任何影响。 Spr…

api签名_使用签名保护基于HTTP的API

api签名我在EMC上的一个平台上可以构建SaaS解决方案。 与越来越多的其他应用程序一样&#xff0c;该平台具有基于RESTful HTTP的API。 使用JAX-RS之类的开发框架&#xff0c;构建这样的API相对容易。 但是&#xff0c; 正确构建它们并不容易。 建立基于HTTP的API的问题 问…

【多元域除法】多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的加法和乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、s…

win10高分辨率下修改字体显示大小(不是缩放百分比)

问题 不通过修改设置缩放百分比来增大win10的字体显示大小&#xff0c;缩放百分比调大后会导致很多问题出现&#xff01;&#xff01;&#xff01; 修改 打开设置&#xff0c;或者右键个性化&#xff0c;在搜索栏输入&#xff1a;“放大文本大小”&#xff0c;搜索框下面会自…

应用程序无法正常启动 0xc0150002

Visual Studio 2017在debug下运行程序报错 应用程序无法正常启动 0xc0150002 分析原因 可能是&#xff1a;原程序是低版本的VS所编写的&#xff0c;缺少低版本的运行库&#xff0c;所以报错 解决 安装了VS2010后即可正常运行 error LNK2019: 无法解析的外部符号 __vsnwprin…

Excel之抽奖器实现

Excel实现一个抽奖器&#xff0c;关键在于学会几个Excel中的函数即可轻松实现。 单人抽奖 RANDBETWEEN 例&#xff1a; INDEX(A2:A61,RANDBETWEEN(1,60))缺点&#xff1a;这种方式生成的抽奖器&#xff0c;在多人情况下&#xff0c;由于RANDBETWEEN函数的返回值有可能是相同…

【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 【多元域乘法】多项式乘法电路原理及MATLAB详解 【多元域除法】多项式除法电路原理及MATLAB详解 RS码编码原理 RS码的编码与BCH码类似,区别在于RS码为多进制的 生成多项式…

如何用Java编写类似C的Sizeof函数

如果您刚开始学习Java并且是C语言背景&#xff0c;那么您可能已经注意到Java和C编程语言之间存在一些差异&#xff0c;例如String是Java中的对象&#xff0c;而不是NULL终止的字符数组。 同样&#xff0c;Java中没有sizeof&#xff08;&#xff09;运算符。 所有原始值都有预定…

Spring启动教程

1.简介 如果您一直想使用一个Web框架&#xff0c;它使您能够快速开始API开发&#xff0c;而无须设置Web服务器&#xff0c;收集所有有线依赖项&#xff0c;安装各种工具的麻烦&#xff0c;那么您将拥有一个出色的框架&#xff0c;即Spring开机 Spring Boot的主要座右铭是约定优…

【LDPC系列1】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真

关注公号【逆向通信猿】更精彩!!! 1. 构造编码器对象 采用MATLAB内置的comm.LDPCEncoder构造编码器对象,其中使用默认的校验矩阵,信息位长32400比特,码长64800比特,该校验矩阵中除第一行中1的个数为6个外,其余行中1的个数均为7;前12960列中1的个数为8,后32400列构成…

【LDPC系列2】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真(IEEE 802.16e标准协议基础矩阵)

关注公号【逆向通信猿】更精彩!!! 1. 构造校验矩阵H,并保存为mat文件 采用IEEE 802.16e标准协议中的基础校验矩阵 通过构造QC-LDPC校验矩阵,码长n=2304,信息长k=1152,码率r=1/2,基础矩阵维数为1224: Hb = [-1 94 73 -1

VS2010附加进程调试DLL时断点无法断下的解决方法

系统版本&#xff1a;Win10 x64 1809 VS版本&#xff1a;VS2017 企业版 问题一 在动态链接库(DLL)附加到进程调试时&#xff0c;用VS2017附加后单步调试&#xff0c;结果发现总是在调试过程中卡死&#xff0c;VS2017无响应&#xff1b; 解决办法是&#xff1a;强制结束VS2017…

用于SaaS和NoSQL的Jdbi

一个自然的接口&#xff0c;用于与CRM&#xff0c;ERP&#xff0c;会计&#xff0c;营销自动化&#xff0c;NoSQL&#xff0c;平面文件等基于Java的数据集成 Jdbi是Java的SQL便利库&#xff0c;它为JDBC提供更自然的Java数据库接口&#xff0c;该接口易于绑定到域数据类型。 该…

【卷积码系列3】(n,k,m)卷积码的维特比译码实现(不使用MATLAB库函数)及性能对比(vitdec函数不使用MATLAB库函数【全部代码需私信另外付费获取】)

理论基础 MATLAB库函数polly2trellis(卷积码生成多项式转网格图描述)的实现过程详解 上面这篇仅作为了解!!! 【卷积码系列1】(n,k,m)卷积码的编码原理详解及MATLAB实现 【卷积码系列2】(n,k,m)卷积码的生成多项式矩阵系数转网格图描述(不使用MATLAB库函数) 维特比译码曲…

Java批处理教程

在当今世界&#xff0c;互联网已经改变了我们的生活方式&#xff0c;其主要原因之一是大多数日常琐事都使用互联网。 这导致可用于处理的大量数据。 其中涉及大量数据的一些示例是处理工资单&#xff0c;银行对帐单&#xff0c;利息计算等。因此&#xff0c;请设想一下&#x…

编写junit 测试_使用JUnit和Repeat注​​释编写有效的负载测试

编写junit 测试EasyTest最近推出了一组新的注释&#xff0c;可帮助其用户编写有效的测试用例。 进入EasyTest的两个主要注释是&#xff1a; 重复 持续时间 今天&#xff0c;我们将讨论重复标注。 一种新的方法级别注释 重复已添加到EasyTest Framework。 此批注可用于重复…

【数字信号处理】基于DFT的滤波系列3之插值滤波(含MATLAB代码)

四、基于DFT的(理想)滤波 例2:一个“警告” “理想DFT滤波器”虽然简单、有效,但可能会导致意想不到的问题。在博客 【数字信号处理】基于DFT的滤波系列2(含MATLAB代码) 中,数据本身是理想的,由完美的谐波组成,这些谐波在频域中以单一频率理想地表示(无频谱泄漏),这…

【数字信号处理】基于DFT的滤波系列4之加窗(含MATLAB代码)

四、基于DFT的(理想)滤波 加窗以减少频谱泄漏 在上面的例子中,整数次谐波被用来产生理想中的示例。这意味着一个完整的整数周期适合正在使用的样本数。一个明显的问题是,如果使用非整数周期数(以及谐波)会怎样?答案是远没有那么有效。 在现实世界中,从这个意义上说,数…

【数字信号处理】基于DFT的滤波系列5之二维DFT滤波(含MATLAB代码)

五、二维DFT滤波 前几节介绍的用于对时间序列滤波的原理也可用于对图像的滤波,采用二维傅里叶变换技术。 下图为一幅图像的二维DFT(2D DFT)变换后的幅度值,该图像仅由一个恒定强度组成,因此它是0Hz分量——背景强度。在可视化 2D DFT 的结果时通常使用fftshift(),因此 DC…