SpringMVC-学习笔记

文章目录

    • 1.概述
      • 1.1 SpringMVC快速入门
    • 2. 请求
      • 2.1 加载控制
      • 2.2 请求的映射路径
      • 2.3 get和post请求发送
      • 2.4 五种请求参数种类
      • 2.5 传递JSON数据
      • 2.6 日期类型参数传递
    • 3.响应
      • 3.1 响应格式
    • 4.REST风格
      • 4.1 介绍
      • 4.2 RESTful快速入门
      • 4.3 简化操作

1.概述

SpringMVC是一个基于Java的Web应用程序框架,用于构建灵活和可扩展的MVC(Model-View-Controller)架构的Web应用程序。

  • 它是Spring框架的一部分,旨在简化Web应用程序的开发过程。
  • SpringMVC技术与Servlet技术功能等同,属于WEB层开发技术。

SpringMVC优点:

  • 简化WEB层开发;
  • 与Spring、SpringBoot等框架集成;
  • 提供强大的约定大于配置的契约式编程支持;
  • 支持REST风格;

1.1 SpringMVC快速入门

步骤:

  1. 创建maven-web工程
  2. 添加spring-webmvc依赖
  3. 准备controller类(处理浏览器请求的接口)
  4. 创建配置文件
  5. 定义一个用于配置Servlet容器的初始化类,加载spring配置
  6. 启用测试
<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.imooc</groupId><artifactId>springmvc-demo</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.9.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>81</port><path></path></configuration></plugin></plugins></build>
</project>
package it.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;//3.创建控制器(等同于servlet)
@Controller
public class MyController {//设置当前操作的请求路径@RequestMapping("/save")//设置当前操作的返回类型@ResponseBodypublic String save(){System.out.println("user saving...");return "{'info':'springmvc'}";}
}-------------------------------------------------------------------------------------
package it.conf;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;//4.创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("it.controller")
public class SpringMvcConfig {
}------------------------------------------------------------------------------------------------
package it.conf;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//
//5.定义一个用于配置Servlet容器的初始化类,加载spring配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//创建Servlet应用程序上下文,加载springmvc容器配置@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringMvcConfig.class);return context;}//配置DispatcherServlet映射的URL路径,设置哪些请求归属springmvc处理//{"/"}表示所有请求@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//创建根应用程序上下文,加载spring容器配置@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
}

在这里插入图片描述

2. 请求

2.1 加载控制

Spring相关bean

  • 业务bean(Service)
  • 功能bean(DataSource)

SpringMVC相关bean

  • 表现bean

不同的bean都是通过@controller 定义如何避免扫描混乱?
在这里插入图片描述

配置Servlet容器的初始化,并加载Spring和Spring MVC的配置的两种方式:

方法1:继承自AbstractDispatcherServletInitializer

package it.conf;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//
//定义一个用于配置Servlet容器的初始化类,加载spring配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//创建Servlet应用程序上下文,加载springmvc容器配置@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringMvcConfig.class);return context;}//配置DispatcherServlet映射的URL路径,设置哪些请求归属springmvc处理//{"/"}表示所有请求@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//创建根应用程序上下文,加载spring容器配置@Overrideprotected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringConfig.class);return context;}
}

方法2:继承自AbstractAnnotationConfigDispatcherServletInitializer类

package it.conf;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//
//定义一个用于配置Servlet容器的初始化类,加载spring配置
public class ServletContainersInitConfigg extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

2.2 请求的映射路径

避免不同控制器中有相同的请求映射,每个控制器类中要加应该请求路径前缀,用于区分不同的请求

@Controller
@RequestMapping("/book")   //请求路径的前缀
public class BookController {@RequestMapping("/save")  //请求映射@ResponseBodypublic String save(){System.out.println("book save");return "{'module':'book save'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("book delete");return "{'module':'book save'}";}
}

在这里插入图片描述

2.3 get和post请求发送

get请求

在这里插入图片描述
在这里插入图片描述

post请求

在这里插入图片描述

在这里插入图片描述

解决中文乱码问题

  • 在Springmvc的Servlet容器配置中添加过滤器
@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("utf-8");return new Filter[]{characterEncodingFilter};}

在这里插入图片描述

2.4 五种请求参数种类

参数类型:

  1. 普通参数
  2. POJO类型参数
  3. 嵌套POJO
  4. 数组类型
  5. 集合类型

@ResponseBody的作用

  • 设置当前控制器方法响应内容为当前返回值,无需解析。

参数映射规则

  • 客户端传递的参数名称需要和服务器端的参数名称对应,名称不对应无法接受。
    在这里插入图片描述
  • 解决:注解@RequestParam
    在这里插入图片描述

2.实体类参数传递
在这里插入图片描述

在这里插入图片描述
3.嵌套POJO
在这里插入图片描述
4. 数组类型
在这里插入图片描述
5. 集合类型
在这里插入图片描述

2.5 传递JSON数据

添加json坐标

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>

在SpringMvcConfig配置文件中添加@EnableWebMvc开启Json转换功能

package com.it.config;@Configuration
@ComponentScan("com.it.controller")
@EnableWebMvc
public class SpringMvcConfig{
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6 日期类型参数传递

日期格式:

  • 2023-08-29
  • 2023/08/29
  • 08/23/2023

在这里插入图片描述
在这里插入图片描述

3.响应

3.1 响应格式

响应:将处理完的结果反馈给客户端(浏览器)

  • 响应页面

  • 响应数据

    • 文本数据
    • json数据

@ResponseBody的作用

  • 设置当前控制器返回值作为响应体
  • 对象->json 、list->json

1.响应页面

package com.it.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class UserRespController {//响应页面@RequestMapping("/toJumpPage")public String toJumpPage(){System.out.println("跳转页面中");return "page.jsp";}
}

在这里插入图片描述

<%--Created by IntelliJ IDEA.User: 11445Date: 2023/8/29Time: 18:22To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>跳转页面</title>
</head>
<body>
<h1>跳转页面hh</h1>
</body>
</html>

跳转到其他网站页面

将返回值改为 “redirect:https://www.baidu.com/”

//响应页面2@RequestMapping("/tobaidu")public String tobaidu(){System.out.println("跳转页面中");return "redirect:https://www.baidu.com/";}

在这里插入图片描述
2.响应文本数据

//响应文本@RequestMapping("/toText")@ResponseBodypublic String toText(){System.out.println("响应文本");return "response text";}

在这里插入图片描述
3.响应JSON数据

//响应JSON@RequestMapping("/toJSON")@ResponseBodypublic User toJSON(){System.out.println("响应JSON");User user = new User();user.setId(1);user.setAge(56);user.setName("nimi");return user;}

在这里插入图片描述

4.REST风格

4.1 介绍

REST(Representational State Transfer)表现形式转换

  • 是一种软件架构风格,用于设计网络应用程序的分布式系统。
  • 使用统一的接口基于资源的通信方式,通过HTTP协议进行通信。

REST风格的设计原则

  1. 基于资源:将应用程序的功能抽象为资源,每个资源通过唯一的URL进行标识。
  2. 使用HTTP方法:通过HTTP的不同方法(GET、POST、PUT、DELETE等)对资源进行操作。
  3. 无状态:服务器不保存客户端的状态信息,每个请求都包含足够的信息来完成请求。
  4. 统一接口:使用统一的接口定义资源的操作方式,包括资源的标识、操作方法和表示形式等。
  5. 可缓存性:对于不经常变化的资源,可以使用缓存机制提高性能。
  6. 分层系统:不同的组件可以通过中间层进行通信,提高系统的可伸缩性和灵活性。

与传统资源描述形式的区别

传统风格
http://localhost/user/getById?id=1
http://localhost/user/saveUserREST
http://localhost/user/1
http://localhost/user
---------------------------------------------------------------------------按照REST风格访问资源使用 -行为动作- 区分对资源进行何种操作查全部用户 GET:http://localhost/user                 
查指定用户 GET:http://localhost/user/1
添加用户 POST:http://localhost/user
修改用户 PUT :http://localhost/user
删除用户 DELETE:http://localhost/user/1

优点

  • 隐藏了资源的访问行为,无法通过地址得知对资源是何种操作
  • 书写简化

4.2 RESTful快速入门

package com.it.controller;import com.it.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
public class UserRestController {//1通过id查@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("通过id查询"+id);return "...";}//查全部@RequestMapping(value = "/user",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("查全部");return "...";}//修改//@ResponseBody注解表示该方法的返回值将直接作为HTTP响应的body部分返回给客户端。// insert方法返回的字符串将作为响应的body返回给客户端。//@RequestBody注解表示该方法需要从请求的body部分获取数据,通常用于处理POST、PUT请求中的数据。// @RequestBody User user表示将请求的body中的数据转换为User对象,并作为参数传入insert方法中。@RequestMapping(value = "/user",method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user){System.out.println("修改"+user);return "...";}//新增@RequestMapping(value = "/user",method = RequestMethod.POST)@ResponseBodypublic String insert(@RequestBody User user){System.out.println("新增"+user);return "...";}//删除//@PathVariable是Spring MVC中的注解,它的作用是将路径中的变量与方法参数进行绑定。// @PathVariable注解用于绑定路径中的{id}变量到方法参数id上,即通过{id}来获取请求路径中的id值。@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("通过id删除"+id);return "...";}
}

在这里插入图片描述

4.3 简化操作

package com.it.controller;import com.it.pojo.User;
import org.springframework.web.bind.annotation.*;@RestController //@Controller和@ResponseBody的合体
@RequestMapping("/user")public class UserRestEasyController {//1通过id查@GetMapping("/{id}")public String getById(@PathVariable Integer id){System.out.println("通过id查询1"+id);return "...";}//查全部@GetMappingpublic String getAll(){System.out.println("查全部");return "...";}//修改@PutMappingpublic String update(@RequestBody User user){System.out.println("修改"+user);return "...";}//新增@PostMappingpublic String insert(@RequestBody User user){System.out.println("新增"+user);return "...";}//删除@DeleteMapping("/{id}")public String delete(@PathVariable Integer id){System.out.println("通过id删除"+id);return "...";}
}

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

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

相关文章

七、性能测试之内存分析

性能测试之内存分析与实战 一、内存知识1、理解&#xff1a;2、内存的组成&#xff1a;内存地址、存储单元3、内存---树形结构1、链表2、二叉树 4、数据结构 二、内存使用1、典型案例&#xff1a;JVM&#xff08;java虚拟机&#xff09;包含程序计数器&#xff0c;java虚拟机栈…

说说你了解的 CDC

分析&回答 什么是 CDC CDC,Change Data Capture,变更数据获取的简称&#xff0c;使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游&#xff0c;供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等。用户可以在以下的场景下使用CDC&#xff1a; 使用f…

燃气管网监测系统,提升城市燃气安全防控能力

燃气是我们日常生活中不可或缺的能源&#xff0c;但其具有易燃易爆特性&#xff0c;燃气安全使用、泄漏监测尤为重要。当前全国燃气安全事故仍呈现多发频发态势&#xff0c;从公共安全的视角来看&#xff0c;燃气已成为城市安全的重大隐忧&#xff01;因此&#xff0c;建立一个…

JVM内存模型

文章目录 一、前言二、JVM内存模型1、Java堆2、方法区3、Java栈3.1、局部变量表3.2、操作数栈3.3、动态链接3.4、返回地址 4、本地方法栈5、程序计数器 一、前言 本文将详细介绍JVM内存模型&#xff0c;JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM…

Python 类和对象

类的创建 Python语言中&#xff0c;使用class关键字来创建类&#xff0c;其创建方式如下&#xff1a; class ClassName(bases):# class documentation string 类文档字符串&#xff0c;对类进行解释说明class_suiteclass是关键字&#xff0c;bases是要继承的父类&#xff0c;…

李宏毅机器学习笔记:RNN循环神经网络

RNN 一、RNN1、场景引入2、如何将一个单词表示成一个向量3种典型的RNN网络结构 二、LSTMLSTM和普通NN、RNN区别 三、 LSTM的训练 一、RNN 1、场景引入 例如情景补充的情况&#xff0c;根据词汇预测该词汇所属的类别。这个时候的Taipi则属于目的地。但是&#xff0c;在订票系统…

WEBGL(2):绘制单个点

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

Java单元测试及常用语句 | 京东物流技术团队

1 前言 编写Java单元测试用例&#xff0c;即把一段复杂的代码拆解成一系列简单的单元测试用例&#xff0c;并且无需启动服务&#xff0c;在短时间内测试代码中的处理逻辑。写好Java单元测试用例&#xff0c;其实就是把“复杂问题简单化&#xff0c;建单问题深入化“。在编写的…

英国选校8.27|8.29

目录 IC帝国理工学院 UCL伦敦大学学院​​​​​​​ Band A B C 专业院系 爱丁堡 曼彻斯特 KCL伦敦国王学院 Bristol布里斯托 华威 南安普顿 IC帝国理工学院 UCL伦敦大学学院 24qs专业位置双非雅思气候备注9 MSc Scientific and Data Intensive Computing MSc Ur…

在k8s中使用secret存储敏感数据与四种用法

当需要存储敏感数据时可以使用&#xff0c;secret会以密文的方式存储数据。 创建secret的四种方法 &#xff08;1&#xff09;通过--from-literal #每个--from-literal对应一个信息条目 kubectl create secret generic mysecret --from-literalusernameadmin --from-litera…

Spring Boot 中 Nacos 配置中心使用实战

官方参考文档 https://nacos.io/zh-cn/docs/quick-start-spring-boot.html 本人实践 1、新建一个spring boot项目 我的spirngboot版本为2.5.6 2、添加一下依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

无涯教程-JavaScript - CUBEMEMBERPROPERTY函数

描述 CUBEMEMBERPROPERTY函数从多维数据集返回成员属性的值。使用此函数可以验证多维数据集中是否存在成员名称,并返回该成员的指定属性。 语法 CUBEMEMBERPROPERTY (connection, member_expression, property)争论 Argument描述Required/OptionalconnectionName of the co…

JavaScript基础语法03——JS注释、结束符

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天继续学习JavaScript基础语法知识&#xff0c;注释和结束符&#xff0c;以下为学习笔记。 一、JavaScript注释 JavaScript注释有什么作用&#xff1f; JavaScript注释可以提高代码的可读性&#xff0c;能够帮助像…

arduino仿真 SimulIDE1.0仿真器

SimulIDE 是一个开源的电子电路模拟器&#xff0c;支持模拟各种电子元器件的行为&#xff0c;可以帮助电子工程师和爱好者进行电路设计和测试。以下是 SimulIDE 的安装和使用说明&#xff1a; 安装 SimulIDE SimulIDE 可以在 Windows、Linux 和 Mac OS X 等操作系统上安装。您…

零知识证明(zk-SNARK)(二)

From Computational Problem to zk-SNARK 本部分就是将计算难题转换为多项式&#xff0c;然后使用zk-SNARK。 &#xff08;注&#xff1a;以下用 P&#xff0c;V 替代 Prover&#xff0c;Verifier&#xff09; 计算难题->R1CS R1CS(Rank-1 Constraint System)是一种能够…

jvm的内存区域

JVM 内存分为线程私有区和线程共享区&#xff0c;其中方法区和堆是线程共享区&#xff0c;虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。 1&#xff09;程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也被称为 PC 寄存器&#xff0c;是一块…

基于RabbitMQ的模拟消息队列之二---创建项目及核心类

一、创建项目 创建一个SpringBoot项目&#xff0c;环境&#xff1a;JDK8&#xff0c;添加依赖&#xff1a;Spring Web、MyBatis FrameWork(最主要&#xff09; 二、创建核心类 1.项目分层 2.核心类 在mqserver包中添加一个包&#xff0c;名字为core&#xff0c;表示核心类…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章&#xff0c;基本是基于《MIPI Alliance Specification for D-PHY 》的内容&#xff0c;学习时也以此为准&#xff0c;可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错&#xff0c;既有理论&…

iOS swift5 扫描二维码

文章目录 1.生成二维码图片2.扫描二维码&#xff08;含上下扫描动画&#xff09;2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…

重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

在 Hugging Face&#xff0c;我们一直致力于提升服务安全性&#xff0c;因此&#xff0c;我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始&#xff0c;我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法&#xf…