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.hqwc.cn/news/95062.html

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

相关文章

手写Mybatis:第8章-把反射用到出神入化

文章目录 一、目标&#xff1a;元对象反射类二、设计&#xff1a;元对象反射类三、实现&#xff1a;元对象反射类3.1 工程结构3.2 元对象反射类关系图3.3 反射调用者3.3.1 统一调用者接口3.3.2 方法调用者3.3.3 getter 调用者3.3.4 setter 调用者 3.4 属性命名和分解标记3.4.1 …

Django传递dataframe对象到前端网页

在django前端页面上展示的数据&#xff0c;还是使用django模板自带的语法 方式1 不推荐使用 直接使用 【df.to_html(indexFalse)】 使用to_html他会生成一个最基本的表格没有任何的样式&#xff0c;一点都不好看&#xff0c;如果有需要的话可以自行修改表格的样式&#xff0c;…

bazel远程缓存(Remote Cache)

原理 您可以将服务器设置为构建输出&#xff08;即这些操作输出&#xff09;的远程缓存。这些输出由输出文件名列表及其内容的哈希值组成。借助远程缓存&#xff0c;您可以重复使用其他用户的 build 中的构建输出&#xff0c;而不是在本地构建每个新输出。 增量构建极大的提升…

区块链技术与应用 - 学习笔记1【引言】

大家好&#xff0c;我是比特桃。本系列主要将我之前学习区块链技术时所做的笔记&#xff0c;进行统一的优化及整合。其中大量笔记源于视频课程&#xff1a;北京大学肖臻老师《区块链技术与应用》公开课。肖老师的课让我找回了求知若渴般的感觉&#xff0c;非常享受学习这门课的…

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…

使用多线程std::thread发挥多核计算优势(解答)

使用多线程std::thread发挥多核计算优势&#xff08;题目&#xff09; 单核无能为力 如果我们的电脑只有一个核&#xff0c;那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们…

国标视频云服务EasyGBS国标视频平台迁移服务器后无法启动的问题解决方法

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

【力扣每日一题】2023.9.2 最多可以摧毁的敌人城堡数量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题难在阅读理解&#xff0c;题目看得我匪夷所思&#xff0c;错了好多个测试用例才明白题目说的是什么。 我简单翻译一下就是寻找1和…

【ES6】JavaScript的Proxy:理解并实现高级代理功能

在JavaScript中&#xff0c;Proxy是一种能够拦截对对象的读取、设置等操作的机制。它们提供了一种方式&#xff0c;可以在执行基本操作之前或之后&#xff0c;对这些操作进行自定义处理。这种功能在许多高级编程场景中非常有用&#xff0c;比如实现数据验证、日志记录、权限控制…

【算法系列篇】模拟算法

文章目录 前言1.替换所有问号1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 提莫攻击2.1 题目要求2.2 做题思路2.3 Java代码实现 3. N 字形变换3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 外观数列4.1 题目要求4.2 做题思路4.3 Java代码实现 5. 数青蛙5.1 题目要求5.2 做题思…

【Interaction交互模块】AngularJointDrive角度关节驱动

文章目录 一、预设体位置二、案例&#xff1a;做一个“能开合的门” 1、在已建好的门框下&#xff0c;建门 2、设置参数 3、解决产生的问题 三、其它属性 一、预设体位置 交互模块——可控制物体——物理关节——角度关节驱动 二、案例&#xff1a;做一个“能…

HTML+JavaScript+CSS DIY 分隔条splitter

一、需求分析 现在电脑的屏幕越来越大&#xff0c;为了利用好宽屏&#xff0c;我们在设计系统UI时喜欢在左侧放个菜单或选项面板&#xff0c;在右边显示与菜单或选项对应的内容&#xff0c;两者之间用分隔条splitter来间隔&#xff0c;并可以通过拖动分隔条splitter来动态调研…