Spring MVC介绍

1.Spring MVC起步

1.1 Spring MVC的请求流程

        请求的第一站是Spring的DispatcherServlet,Spring mvc所有的请求都会经过一个前端控制器Servlet,这个前端控制器就是DispatcherServlet

         DispatcherServlet将请求发送给Spring MVC控制器,这个控制器其实是一个用于处理请求的Spring组件,在一个典型的应用程序中可能会有多个控制器,DispatcherServlet需要知道要将请求发送给哪个控制器,因此他会查询一张处理器映射表,来确认下一个站点去哪里。它根据url携带的信息进行选择。

        选择了合适的处理器之后,DispatcherServlet就会卸载它携带的信息给对应的处理器,然后等待处理器去执行。控制器在完成处理后,一般会返回一些信息给用户,这些信息会在浏览器上显式,这些信息就被称为模型。信息一般是格式化的信息,可以转化为HTML,因此信息需要发送给一个视图,通常是JSP。

          控制器做的最后一件事是将模型数据打包,然后标注用于渲染输出的视图名,然后把模型和视图名返回给DispatcherServlet。DispatcherServlet则在接收信息后,使用视图解析器匹配一个特定的视图实现。DispatcherServlet将结果交给视图实现器,视图使用模型数据进行渲染,在页面上呈现给用户。

1.2 搭建Spring MVC

DispatcherServlet是Spring MVC的核心,在早期是使用web.xml文件配置,如今都是使用java 配置。下面是配置的代码:

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

WebConfig和RootConfig是配置类。

这段代码可能不需要了解态度,只需要知道它会自动配置DispatcherServlet和Spring应用上下文,其实就是相关类都在这个抽象类里面配置。

这个类实现了三个方法,getServletMappings将路径映射到DispatcherServlet上,这里的/代表他是默认的Servlet,他会处理所有的请求。

另外两个方法与Spring上下文有关。

当DispatcherServlet启动的时候,他会创建Spring应用上下文,并加载配置文件和生成bean,在getServletConfigClass方法中,我们要求DispatcherServlet加载应用上下文时,它就会使用WebConfig配置需要的类的bean。但是在web应用中,通常还会加载另一个应用上下文,它是由ContextLoaderListener中创建。DispatcherServlet加载包含web组件的bean,比如控制器,视图解析器,以及处理器映射,而ContextLoaderListener加载其他应用中的bean,这些bean通过是驱动应用后端的中间件和数据层组件。

AbstractAnnotationConfigDispatcherServletInitializer会同时创建DispatcherServlet和ContextLoaderListener,而getServletConfigClasses会返回DispatcherServlet需要的bean,getRootConfigClasses会返回ContextLoaderListener所需要的bean。

1.3 启动Spring MVC

我们依然是使用java代码配置。

这里需要一个注解@EnableWebMvc

启动Spring MVC需要配置视图解析器,启动组件扫描,如果不进行配置,那么就会使用默认的servlet。

下面是webconfig的配置文件。

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;
import org.springframework.web.servlet.view.JstlView;@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.example.controller"})
public class WebConfig extends WebMvcConfigurerAdapter {//配置视图解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setViewClass(JstlView.class);viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");viewResolver.setExposeContextBeansAsAttributes(true);return viewResolver;}//配置静态资源的处理@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}
}

首先它有一个扫描的注解,因此它会这个包下的bean,这是后面会补充的部分。

其次配置了视图解析器的bean

最后的重写方法要求DispatcherServlet将静态资源发送给默认的servlet

下面RootConfig类,没有写什么代码,只加入了一个扫描,一个配置类的注解。

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

2. 基本的控制器

2.1 最简单的控制器


import com.liumiao.miyao.controller.SimpleController;
import org.junit.Test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@EnableWebMvc
public class TestOne {@Testpublic void testSimpleController() throws Exception{SimpleController sc = new SimpleController();System.out.println(sc.simpleGet());}
}

这个其实什么也没有做,仅仅是处理了创建了这么一个类,然后调用相关方法,输出返回值。

其实我们可以启动整个项目,然后通过浏览器发起请求。

2.2 定义类级别的请求处理

我们不可能把所有的请求都放在一个方法上。

在web开发中,一般是有好几个请求类型的,分别是GET,POST,PUT,DELETE

requestMapping可以分给其他类进行处理。

@Controller
@RequestMapping(value="/")
public class SimpleController {@RequestMapping(method=RequestMethod.GET)public String simpleGet() {return "simple";}
}

我们在类的上方写了一个代码,在类中的方法又写了一个,看看两行代码做了什么。

在类的上方写这个,说明我们将/路径的请求都放在这个类里面进行处理,然后下面的simpleGet方法用来处理这个路径下的GET请求。@RequestMappping注解有一个value参数,类型为String数组,每一个元素代表一个可以接收的请求路径。

2.3 传递模型数据到视图

        我们不会把所有的代码都写在一个方法里面,也不会让一个模块处理所有的事情,比如控制器模块就只会接收请求,如果需要访问数据库,那么我们还需要一个新的模块来处理请求数据的问题。控制器模块就只需要把请求需要的必要参数发送过来即可。关于数据处理的模块,我们一般称之为Repository。

      然后每次我们查询数据的时候,就会将查询到的数据返回给前端,前端解析数据,显示再页面上。实际上,我们返回的数据应该经过一次处理,也就是model,这个实际上并不是我们需要关心的事情。

 

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

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

相关文章

前端零基础入门到上班:【Day3】从零开始构建网页骨架HTML

HTML 基础入门&#xff1a;从零开始构建网页骨架 目录 1. 什么是 HTML&#xff1f;HTML 的核心作用 2. HTML 基本结构2.1 DOCTYPE 声明2.2 <html> 标签2.3 <head> 标签2.4 <body> 标签 3. HTML 常用标签详解3.1 标题标签3.2 段落和文本标签3.3 链接标签3.4 图…

力扣hot100-->递归/回溯

目录 递归/回溯 1. 17. 电话号码的字母组合 2. 22. 括号生成 3. 39. 组合总和 4. 46. 全排列 5. 78. 子集 递归/回溯 1. 17. 电话号码的字母组合 中等 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到…

[MySQL#4] 表约束(1) | NULL | default | zerofill | 主键 | 自增长

目录 1. 表约束概述 2. 空属性&#xff08;null/not null&#xff09; 3. 默认值&#xff08;default&#xff09; 4. 列描述&#xff08;comment&#xff09; 5. zerofill 6. 主键&#xff08;primary key&#xff09; 7. 自增长&#xff08;auto_increment&#xff09…

Android中常用adb命令

目录 1.adb连接安卓模拟器 2.adb列出所有已经连接的设备 3.adb显示设备的日志信息 4.adb 电脑文件推送到安卓模拟器中 5.adb 手机传送文件到电脑 6.adb获取安卓应用的包名和Activity名 附录 1--命令 1&#xff09;adb devices 2&#xff09;adb install 路径> 3&#xff09;…

【项目管理】PMP冲刺真题200题 (题目+解析)乱序版 【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

尚硅谷 | Nginx | 学习笔记

尚硅谷 | Nginx | 学习笔记 尚硅谷Nginx教程由浅入深&#xff08;一套打通丨初学者也可掌握&#xff09;_哔哩哔哩_bilibili 文章目录 尚硅谷 | Nginx | 学习笔记一、Nginx相关概念1.Nginx是什么2.正向代理和反向代理正向代理反向代理 3.负载均衡和动静分离负载均衡动静分离 二…

小米迎来「新起点」:硬核创新从超越到引领,小米SU7 Ultra 发布

发布 | 大力财经 10月29日&#xff0c;小米15系列暨小米澎湃OS 2新品发布会在北京召开&#xff0c;小米集团创始人、董事长兼CEO雷军宣布了小米汽车原型车在纽北跑出6分46秒874的圈速&#xff0c;登顶“纽北全球最速四门车”的好消息&#xff0c;并领衔发布了小米15系列手机、…

若依微服务架构遇到的一些问题记录

一、nacos启动问题 需要看官网的准备工作&#xff0c;认真看&#xff0c;版本问题卡了两天 https://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C 1.下载nacos&#xff0c;版本需要对应上 版本说明链接 2.记得运行数据库&#xff0…

【工具】Charles对360浏览器抓包抓包

Charles 和 switchy sharp 配合&#xff0c;可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例&#xff0c;介绍如何实现抓包。&#xff08;Mac中操作基本一致&#xff09; 1.安装Charles 可根据自己的电脑下载对应的版本&#xff1a;…

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M

小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN&#xff0c;ploam密码&#xff0c;loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid&#xff08;逻辑id&#xff09;、mac、loid mac三种中…

Kafka-代码示例

一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…

vue2项目在发布后更新,提示用户刷新页面

1、在项目根目录创建resetVersion.js的文件&#xff0c;内容如下 &#xff08;具体路径可能会有点问题&#xff0c;但是不影响&#xff09; const path require(path); const fsExtra require(fs-extra);const runBuild async () > {try {const OUTPUT_DIR public; // …

WebGIS开发丨从入门到进阶,全系列课程分享

WebGIS开发所需的技能 1.前端技能&#xff1a;Html、CSS、 Javascript、WebAPLs、Vue 2.二维技能&#xff1a;WebGIS基础理论及开发、MapGIS二次开发Openlayers、Leaflet、Mapbox 、Echarts、公共开发平台开发等 3.三维技能&#xff1a;Blender、Three.js、Cesium等 Web开发…

17 Docker容器存储架构:docker存储持久化-bind mount

文章目录 三、docker存储持久化-bind mount3.1 将 /root/htdocs 目录下的 index.html 文件挂载给一个 httpd 容器3.2 更新宿主机上的 index.html 文件内容,并查看容器中的内容3.3 查看挂载类型3.4 创建基于 docker volume 的 container 镜像3.5 删除容器,销毁容器后,volume 依…

centos7 zabbix监控nginx的pv和uv和status_code

zabbix监控nginx的pv&#xff1a; pv)cat /var/log/nginx/access.log|awk {print $1}|wc -l;;zabbix-get验证&#xff1a; [rootbogon ~]# zabbix_get -s 192.168.253.231 -k pv_uv[pv] 100zabbix监控nginx的uv uv)cat /var/log/nginx/access.log|awk {print $1}|uniq -c | w…

C++进阶-->多态(Polymorphism)

1. 多态的概念 多态&#xff0c;顾名思义多种形态&#xff1b;多态分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;静态多态就是就是我们前面讲的函数重载和函数模板&#xff0c;可以通过传不同类型&#xff0c;然后…

虚拟机桥接模式连不上,无法进行SSH等远程操作

说明&#xff1a;以下情况在window10上遇到&#xff0c;解决后顺便做了个笔记&#xff0c;以防后续再次用到&#xff0c;也给同道中人提供一个解决方案 一、首先按照以下步骤进行检查 1、是否连接了对应的wifi 2、是否设置了桥接模式 3、上述1、2确认无误的情况下请查看右上…

Flutter Image和Text图文组件实战案例

In this section, we’ll go through the process of building a user interface that showcases a product using the Text and Image widgets. We’ll follow Flutter’s best practices to ensure a clean and effective UI structure. 在本节中&#xff0c;我们将使用“Te…

使用Kubernetes管理容器化应用

使用Kubernetes管理容器化应用 Kubernetes简介 安装Kubernetes 安装Minikube 启动Minikube集群 创建一个简单的Web应用 创建项目目录 初始化项目 安装Node.js依赖 创建Docker镜像 编写Dockerfile 构建并推送Docker镜像 创建Kubernetes配置文件 创建Deployment 创建Service …