SpringMVC-基本概念

一、引子

我们在上篇文章Spring集成Web中抛出了一个问题:为什么我们一直在自用Java Web阶段使用的Servlet来承接客户端浏览器的请求呢,我们熟知甚至是已经在日常开发中经常使用的Controller又与之有什么关系呢?我们将在本篇文章解答读者的这一疑惑。

二、基本概念

SpringMVC是一个框架。根据我们前面的一贯的介绍:框架就是用来简化开发的,可以回顾我们在初识Spring框架时对框架的形象化描述。既然如此,SrpingMVC这一框架又是简化了什么呢?正是我们在引子中提到的问题:我们使用的Servlet虽然可以实现我们的开发需求,但是请观察下面一段经典的Servlet代码:

import com.bylearning.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/demo")
public class DemoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {ApplicationContext ioc = WebApplicationContextUtils.getWebApplicationContext(getServletContext());UserService us = ioc.getBean(UserService.class);us.saveUser();}
}

我们每每需要去继承一个HttpServlet接口,然后针对不同请求类型(GET或POST),覆盖对应的方法,在方法中又需要去通过spring-web依赖提供的工具类去获取IoC容器,然后从容器中取出相应的service层的对象来处理逻辑。

我们会发现,上面一段话中,继承接口,重写方法,获取容器,获取对象都是通用的操作。既然是通用的操作,那就可以体现Java抽象的特性,将其封装为通用的代码,即框架。SpringMVC框架就是通过一套注解,让一个简单的Java类(Controller类)成为处理请求的控制器,无须实现任何接口。读到这里,读者是否对SpringMVC框架有了一些认识呢?

三、再理解

详细而言,一个基本的Spring MVC流程如下:

  1. 用户向服务器发送请求(例如,访问一个网页)。
  2. Tomcat服务器接收到请求后,将请求转发给请求服务的前端控制器(DispatcherServlet)。
  3. 前端控制器根据请求的URL和映射关系,找到相应的处理器(Controller)来处理请求。
  4. 控制器处理请求,并与模型(Model)交互,通常是我们的Service层,更新模型中的数据。
  5. 控制器将模型数据传递给视图(View),并通知视图更新。
  6. 视图根据控制器传递的数据进行渲染,生成响应内容。
  7. 前端控制器将视图生成的响应返回给用户,用户在浏览器中看到响应结果。
四、快速使用

1、导入spring-webmvc依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version></dependency>

2、 在web.xml中配置前端控制器Servlet

    <servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

3、编写springmvc.xml配置文件,注意要将Controller层组件配置在该文件中,交由SpringMVC管理。因为SpringMVC的前端控制器接收到请求后,需要把请求分发给不同的Controller,所以在该配置文件中需要将Controller的组件托管给SpringMVC。

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--扫描控制层组件--><context:component-scan base-package="com.bylearning.controller"/></beans>

4、编写Controller层和视图层

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping(value = "/")public String protal() {// 将逻辑视图返回return "index.jsp";}@RequestMapping(value = "/hello")public String hello() {return "success.jsp";}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Success</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>

这里之所以还使用了JSP,是因为还没有引入视图解析器。我们将会后续的篇章里继续优化。此时启动项目访问URL,可以看到将会展示JSP视图。至此,我们终于引出了通过Controller承接请求这一话题。

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

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

相关文章

检测CUDA 是否能访问GPU时回应速度慢【笔记】

SUPWEMICRO 418G-Q20X12 维护记录&#xff1a; 两台设备均已安装CUDA与Pytorch&#xff0c;在检测CUDA 是否能访问GPU&#xff0c;执行torch.cuda.is_available()命令时&#xff0c;一台设备速度秒回应True&#xff0c;但另外一台设备回应速度慢&#xff08;1分钟左右&#xff…

华为网络设备:核心命令一览

1.华为交换机基础配置命令 # 常用命令视图 常用视图名称进入视图视图功能用户视图用户从终端成功登录至设备即进入用户视图&#xff0c;在屏幕上显示&#xff1a;在用户视图下&#xff0c;用户可以完成查看运行状态和统计信息等功能。系统视图在用户视图下&#xff0c;输入命…

本地部署whisper模型(语音转文字)

Whisper是 OpenAI 2022年发布的一款语音预训练大模型,集成了多语种ASR、语音翻译、语种识别的功能。 Whisper使用弱监督训练的方法,可以直接进行多任务的学习 1. 安装ffmpeg 1.1 更新yum yum update1.2 安装gcc yum install gcc1.3 在线安装ffmpeg 1.3.1 Install the EP…

(c语言版)使用随机函数rand

随机函数rand()详解 随机生成1-31号红球5个&#xff0c;随机生成1-16号白球2个&#xff0c;红球白球分别按照从小到大的顺序排序 #include<stdio.h> #include<stdlib.h> int main() {int n 0;int a[7] {0};while (n < 5) {a[n] rand() % 32;}a[n] rand() % …

node,node-sass,sass-loader之间的版本关系

前言 安装配置node-sass 以及 sass-loader想必是很多前端的噩梦–一不小心又不成功还得装个半天。 下面说一下这个问题。 当然&#xff0c;你肯定遇到过&#xff1a; Node Sass version 9.0.0 is incompatible with ^4.0.0-这样的问题&#xff0c;这个也是因为三者关系对不上…

【PyQt】02-基本UI

文章目录 前言一、首先了解什么是GUI&#xff1f;二、初学程序1.界面展示代码运行结果 2.控件2.1按钮展示代码运行结果 2.2 纯文本和输入框代码运行结果 3、重新设置大小 -resize4、移动窗口-move()5、设置界面在电脑中央5.1 代码运行结果 6、设置窗口图标代码运行结果 7、布局…

[linux] which和find有什么区别?

which 和 find 都是 Unix/Linux 系统中的命令&#xff0c;但它们的用途和工作方式有很大的不同。 which 命令&#xff1a;which 命令是用来查找并显示用户可以在当前环境下执行的命令的完整路径。这些命令通常位于 PATH 环境变量中指定的目录中。例如&#xff0c;which python …

Django模型(二)

一、更新数据库表结构 不管是新增模型,还是修改已有模型后,只需要执行行命令即可: 1.1、创建迁移 在项目根目录的cmd中运行: $ python manage.py makemigrations model_app备注 model_app是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备…

开发数据产品+AI产品通关上岸课程

该课程全面解析数据产品和人工智能产品的开发与设计。学员将学习产品规划、数据分析以及AI技术应用&#xff0c;通过案例实践掌握产品开发流程&#xff0c;致力于帮助他们成功进入数据和人工智能产品领域。 课程大小&#xff1a;9.8G 课程下载&#xff1a;https://download.cs…

Java多线程共享变量控制volatile

1. volatile实现可见性&#xff08;jdk 1.5后&#xff09; 1. 可见性 如果一个线程对共享变量值的修改&#xff0c;能够及时的被其他线程看到&#xff0c;叫做共享变量的可见性。如果一个变量同时在多个线程的工作内存中存在副本&#xff0c;那么这个变量就叫共享变量 volati…

【OCPP】ocpp1.6协议第3.5章节:本地授权和离线行为-介绍及翻译

目录 3.5章节 概述 3.5 本地鉴权和离线行为-译文(Local Authorization & Offline Behavior) 3.5.1 鉴权缓存-译文(3.5.1. Authorization Cache) 3.5.2 本地鉴权列表-译文(Local Authorization List) 3.5.3 授权缓存和本地授权列表之间的关系-译文(Relation between A…

如何从零开始开发一个PS5浏览器 | How to develop a PS5 browser

环境&#xff1a;Windows PS5一台 问题&#xff1a;PS5折腾需要使用PKG浏览器访问特定网址&#xff0c;如何自定义网址呢&#xff1f; 解决办法&#xff1a;使用开发套件PS Multi Tools开发一个空应用&#xff0c;利于deeplinkUri 参数访问网页 背景&#xff1a;PS5折腾后&…

dockerpipwork相关测试过程

pipework可以减轻docker实施过程中的工作量&#xff0c;在网上也找了几篇类似的文章&#xff0c;按照相应配置&#xff0c;结果并不相同 如下测试过程记录下&#xff1a; docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

Linux命令-arch命令(显示当前主机的硬件架构类型)

概要 arch [OPTION]...arch 命令输出结果有&#xff1a;i386、i486、i586、alpha、sparc、arm、 m68k、mips、ppc、i686等。 语法 下面是arch命令的语法和语法说明&#xff1a; 选项功能-k显示内核架构-s显示系统架构-i显示所有可用的架构 示例&#xff1a; # 显示当前系…

Altium Designer的学习

PCB设计流程 1.新建空白工程&#xff1a; 创建一个新的工程 新建四个文件&#xff0c;并且保存&#xff1a; 每次打开文件时&#xff0c;打开以.PrjPcb结尾的文件 2.元件符号的创建&#xff1a; 在绘制图形的时候设置成10mil,为了在原理图中显得不那么大。 在绘制引脚的时候设…

拦截器,AOP,自定义注解的使用

自定义注解AOP&#xff0c;实现 进入方法打印参数日志 /*** 定义进入方法前打印日志注解* author zy*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface PrintLog {} /*** 定义一个切面&#xff0c;在使用PrintLog注解的方法进…

【算法学习】编程中的位运算

位运算 位运算是直接对二进制的每一位进行逻辑操作的运算方式 用途&#xff1a;位运算一般用于考察异或的性质、状态压缩、与位运算相关的特殊数据结构、构造题等。 基本的位运算共 6 种&#xff0c;分别为按位与、按位或、按位异或、按位取反、左移和右移。 按位与 & …

华为数通方向HCIP-DataCom H12-831题库(填空题)

第01题 通过执行(Port-isolate mode all )命今,可以使同一VLAN的不同端口用户二三层彻底隔离无法通信。 (请使用英文小写字母将命令补全,且命令不能缩写) port-isolate mode l2 配置端口隔离模式为二层隔离三层互通;port-isolate mode all 配置端口隔离模式为二层三层都隔离…

Hadoop3.x基础(2)- HDFS

来源&#xff1a;B站尚硅谷 目录 HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小&#xff08;面试重点&#xff09; HDFS的Shell操作&#xff08;开发重点&#xff09;基本语法命令大全常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作HDFS的API案例…

springboot 怎么设置局域网访问

如何配置Spring Boot应用以实现局域网访问 在开发一个Spring Boot应用时&#xff0c;我们通常会通过localhost来访问和测试我们的应用。但是&#xff0c;当我们想要在局域网中分享我们的应用&#xff0c;供其他设备访问时&#xff0c;仅仅使用localhost是不够的。本文将引导你…