Java高效率复习-SpringMVC[SpringMVC-2]

news/2024/9/19 12:03:02/

SpringMVC获取请求参数

SpringMVC获取请求参数的两种方式↓

通过ServletAPI获取请求参数

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
通过request的API——getParameter(String s)方法来获取请求作用域中保存的请求参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用@RequestParam获取参数

基于同名来获取请求参数
在这里插入图片描述
通过注解来自定义填充形参值
使用@RequestParam来赋值
该注解有三个属性:value、required、defaultValue

  • value:设置根当前形参绑定的网页参数

在这里插入图片描述

  • required: 默认值为true,表示传输的网页参数必须和该形参匹配并赋值上,否则直接报错,设置为false则尽管没有匹配上形参也不会报错

在这里插入图片描述

  • defaultValue:要是没绑定的网页参数没有传入就直接把本身值赋给形参

在这里插入图片描述

@RequestHeader和@CookieValue

@RequestHeader:将请求头信息和控制器方法的形参绑定
@CookieValue:将cookie数据和控制器方法的形参绑定
在这里插入图片描述
在这里插入图片描述

通过POJO获取请求参数

在这里插入图片描述

解决中文乱码问题

在web.xml中添加一个过滤器就行了
在这里插入图片描述
在这里插入图片描述

<!-- 配置Spring的编码过滤器 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><!-- 只是设置的请求的编码 --><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><!-- 会设置响应的编码 --><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

域对象数据共享

使用ServletAPI向request域对象共享数据

request.setAttibute("username","link");

使用ModelAndView向请求域共享数据

ModeAndView是帮我们实现共享数据和页面跳转
不管使用什么方式实现页面跳转和向请求域共享数据,最终都会被封装到ModelAndView
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不管那种方式,底层最后返回的都是ModelAndView对象

使用Model、ModelMap、Map向请求域共享数据

感觉纯托库字访匹
使用Model

@RequestMapping("/test/model")public String testModel(Model model){//Model是让前端控制器帮忙创建的,是个接口model.addAttribute("name","xiaoming");return "success";
}

使用ModelMap

@RequestMapping("/test/modelMap")
public String testModelMap(ModelMap modelMap) {//Model是让前端控制器帮忙创建的,是个接口modelMap.addAttribute("name", "mmm");return "success";
}

使用map集合

@RequestMapping("/test/map")
public String testMap(Map<String,Object> map) {//Model是让前端控制器帮忙创建的,是个接口map.put("name", "凯迪拉克CT6");return "success";
}

上面三个方式的类型都是BindingAwareModelMap
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
它们的类型都一样,我们甚至能用LinkedHashMap来操作,只需要创建BindrgAwareModelMap所继承的类或实现的接口就行
在这里插入图片描述
在这里插入图片描述

向会话域和应用域共享数据

建议直接使用servletAPI去共享数据,简单也方便
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SpringMVC的视图

SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户
SpringMVC视图的种类很多,慕容恩有转发视图和重定向视图
当工程引入jstl依赖,转发视图会自动转换为jstView
若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView

观察源码之验证控制器方法统一的返回值为ModelAndView

在这里插入图片描述

上面的方法返回值是ModelAndView,缩写mv
在这里插入图片描述
当通过ha.handle方法间接的调用我们控制器的方法时,最终会获得一个ModelAndView对象
debug模式的键意
在这里插入图片描述
从左向右为:下一步、进入方法、强制进入方法、从方法中跳出来、返回上一个断点、跳过断点
在这里插入图片描述
在这里插入图片描述
不管用的什么方法,最终都会将数据封装为ModelAndView对象,view逻辑视图,Model数据
它们都会执行上面的两行源码
在这里插入图片描述
在这里插入图片描述

SpringMVC的视图之ThymeleafView

视图名称取决于返回值String或者ModelAndView的mav.setViewName()方法
下面演示了ThymeleafView的创建
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果我们返回的字符串没有任何前缀,其视图类型就是ThymeleafView,但是如果有前缀,会根据前缀判断,然后创建对应的视图类型,其实就是截取字符串进行判断转发类型
在这里插入图片描述

SpringMVC视图之InternalResourceView

这个就是个转发视图,和默认的ThmeleafView视图效果一样,所以用的挺少的
在这里插入图片描述
在这里插入图片描述
上面根据返回的字符串名称创建了一个网络资源视图,转发到了/test/model,然后/test/model又响应进入到了success网页
过程一共创建了2个视图,先是网络资源视图,然后是普通渲染视图
在这里插入图片描述
用的并不多,实现的就是内部转发,地址栏没有变化,内容发生了变化
在这里插入图片描述
在这里插入图片描述
只有通过渲染解析器渲染后我们才能看到动态的数据

SpringMVC视图之RedirectView

这个就是重定向视图
重定向一个请求后最终还是创建了一个Thmeleaf视图,只有通过Thmeleaf视图渲染后,才能显示动态数据
重定向是会改变地址栏的,这也是和内部转发的区别,下面是已经重定向了的网页效果
在这里插入图片描述
底层创建仍然是创建ModelAndView对象,然后执行处理转发,在里面判断视图名称,根据名称创建对应视图,此处是创建了一个RedirectView视图,就是重定向,然后重定向一个请求,此时又创建了一个渲染视图,经过渲染器处理后动态显示了数据
在这里插入图片描述
在这里插入图片描述

说白了创建一个网络资源视图还不如直接默认渲染视图,反正都是转发,而且最终一定是执行的渲染视图类型的转发

SpringMVC的视图控制器

我们在核心配置文件里设置了一个view-controller标签,path属性是要处理的请求路径,view-name是要被解析的逻辑视图,这个标签等同于PageContrller,而且开启后需要额外开启MVC的注解驱动,否则其他请求将不可被处理
在SpringMVC核心配置文件中添加如下代码

<!-- 开启MVC的注解驱动,防止只处理视图控制器的请求 --><mvc:annotation-driven/><!-- 视图控制器,直接处理/请求跳转到index页面,说白了就是PageController --><!-- 设置了视图控制器后,会只处理视图控制器的请求,别的请求都是404 需要再加上一个标签 --><mvc:view-controller path="/" view-name="index"></mvc:view-controller>

在这里插入图片描述

RESTful

在这里插入图片描述
该风格表示我们把服务器中所有内容都看作为资源,一切皆资源,每一个资源都是服务器上一个可命名的抽象概念
在这里插入图片描述

RESTful风格功能实现预设

/*
访问的是用户资源,路径统一
查询所有的用户信息-->/user-->get
根据id查询用户信息-->/user/1-->get
添加用户信息-->/user-->put
修改用户信息-->/user-->get
删除用户信息-->/user/1-->delete*/

RESTful风格查询所有用户

其实挺抽象的,就是一个普通的请求响应
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
超连接发送的请求默认就是GET请求,所以上面正常执行

RESTful风格根据id查询用户

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

RESTful风格添加用户信息

在这里插入图片描述

在这里插入图片描述

使用HiddenHttpMethodFilter处理put和delete请求

这个过滤器的名字意为,隐藏的协议方法过滤器
如果我们直接把表单的method设置为put方式的话,提交时服务器会把该请求方式变为get
在这里插入图片描述

在这里插入图片描述
默认情况下,表单的method属性只有2个值
在这里插入图片描述
如果想发送put或delete请求,我们先去核心配置文件中添加一个过滤器,如下

<!-- 设置处理请求方式的过滤器 -->
<filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

RESTful风格修改用户信息

其次,表单的提交方式也必须是POST
在这里插入图片描述
在这里插入图片描述
经过修改后,再次发送put请求就可以了
在这里插入图片描述
在这里插入图片描述

RESTful删除用户信息

在这里插入图片描述

删除和修改,put和delete它们之间区别不大,就是修改了value值

HiddenHttpMethodFilter源码解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该方法是过滤器表示过滤的方法
包含了是否放行开锁
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
HttpServletRequest的实现类是可以创建一个Request对象的
在这里插入图片描述
在这里插入图片描述
说白了就是只是把post请求的request包装成了PUT提交方式,然后放行,这样就完成了所谓的过滤
@RequestMapping的派生注解
在这里插入图片描述

RESTful案例

请求过滤器一定不能写在编码过滤器之前
我们上面介绍了RESTful风格:相同的资源名词+不同的资源属性来访问,根据提交方式的不同来调用不同的操作,通过HiddenHttpMethodFilter过滤器来将POST请求转换为PUT请求或者DELETE请求等操作,必须是POST请求是因为判断里判断的是POST请求

准备工作

pojo类

package com.atguigu.pojo;
public class Employee {private Integer id;private String lastName;private String email;//1 male, 0 femaleprivate Integer gender;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public Employee(Integer id, String lastName, String email, Integergender) {super();this.id = id;this.lastName = lastName;this.email = email;this.gender = gender;}public Employee() {}
}

固定dao类

package com.atguigu.dao;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.atguigu.pojo.Employee;
import org.springframework.stereotype.Repository;
@Repository
public class EmployeeDao {private static Map<Integer, Employee> employees = null;static{employees = new HashMap<Integer, Employee>();employees.put(1001, new Employee(1001, "E-AA", "aa@163.com", 1));employees.put(1002, new Employee(1002, "E-BB", "bb@163.com", 1));employees.put(1003, new Employee(1003, "E-CC", "cc@163.com", 0));employees.put(1004, new Employee(1004, "E-DD", "dd@163.com", 0));employees.put(1005, new Employee(1005, "E-EE", "ee@163.com", 1));}private static Integer initId = 1006;public void save(Employee employee){if(employee.getId() == null){employee.setId(initId++);}employees.put(employee.getId(), employee);}public Collection<Employee> getAll(){return employees.values();}public Employee get(Integer id){return employees.get(id);}public void delete(Integer id){employees.remove(id);}
}

功能清单

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

查询列表功能

在这里插入图片描述
这个网页我就不详细展示了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实就是调用dao方法,然后获得一个集合,把这个集合放到请求共享域中,在网页上通过语法渲染出来数据就行了

RESTful案例之处理静态资源

前端控制器的请求处理除了.jsp匹配不到,其他都可以匹配到
在这里插入图片描述
正是因为除了jsp请求不会被响应,其他请求都会被前端控制器所响应,那么就导致服务器请求静态资源文件的请求也会被前端控制器所拦截并处理,而前端控制器处理请求的方式就是去控制层找到@RequestMapping注解,然后找对应的value属性等等,但是静态资源是不能这么做的
Tomcat的web.xml文件是有静态资源处理的,这个是默认的Servlet
在这里插入图片描述
在这里插入图片描述
我们可以看到默认的Servlet的url-pattern也是所有 /
Tomcat的web.xml会继承给工程中的web.xml
在这里插入图片描述
这也是默认就访问index.html的原因,就是继承
当配置冲突时,会以子Web.xml为准,也就是说,此时Tomcat的web.xml文件中的defaultServlet被覆盖了
在这里插入图片描述
我们静态资源404找不到的原因就是,静态资源是应该由默认的serlvet来处理的,但是逻辑继承关系让工程的前端控制器覆盖了默认的servlet,就导致静态资源的请求被前端控制器所处理,发生了404错误
在这里插入图片描述

<!-- 配置默认的Servlet来处理静态资源如果不配置这个标签,所有的请求都是由DispatcherServlet处理的但如果只配置这个标签,那么所有的请求都会被默认的Servlet处理,和前端控制器概念一致配置了默认Servlet就一定要配置<mvc:annotation-driven/>来防止自定义请求无效也就是说 只有我们的DispatcherServlet处理不了,再让我们默认的Servlet去处理,此时就是静态资源--><mvc:default-servlet-handler/><!-- 开启MVC的注解驱动,防止只处理视图控制器的请求 --><mvc:annotation-driven/>

实现添加用户功能

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

实现修改用户功能

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

在这里插入图片描述

折腾最多的还是html网页上的th语法

实现删除用户功能

在这里插入图片描述

我们用一个表单来进行发送delete请求
在这里插入图片描述
使用Vue来完成网页操作
在这里插入图片描述
Vue表示,点击后超链接不会默认跳转然后会让form表单提交,此处form表单的action会赋值为当前的超链接的href属性,超链接的href是不同的,所以要动态赋值
然后发送delete请求后,调用组件来删除↓
在这里插入图片描述

SpringMVC异步


http://www.ppmy.cn/news/30000.html

相关文章

2023王道考研数据结构笔记第四章串

第四章 串 4.1 串的定义 4.1.1 串的相关概念 串&#xff1a;即字符串&#xff08;String&#xff09;是由零个或多个字符组成的有限序列。一般记为S‘a1a2…an’ (n>0) 其中S是串名&#xff0c;单引号&#xff08;注&#xff1a;有的地方用双引号&#xff0c;如Java、C&am…

用Python Flask为女朋友做一个简单的网站(附可运行的源码)

&#x1f31f;所属专栏&#xff1a;献给榕榕&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该专栏系为女友准备的&#xff0c;里面会不定时发一些讨好她的技术作品&#xff0c;感兴趣的小伙伴可以关注一下~&#x1f449;文章简介…

【数据结构初阶】详解“树”

目录 前言 1.树概念及结构 &#xff08;1&#xff09;树的概念 &#xff08;2&#xff09;树的名词介绍 &#xff08;3&#xff09;树的表示 ​编辑 2.二叉树概念及结构 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特殊的二叉树 &#xff08;3&#xff0…

[深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?

版权声明&#xff1a;付费作品&#xff0c;未经许可&#xff0c;不可转载前言SSD &#xff08;Solid State Drive&#xff09;&#xff0c;即固态硬盘&#xff0c;通常是一种以半导体闪存&#xff08;NAND Flash&#xff09;作为介质的存储设备。SSD 以半导体作为介质存储数据&…

UNIX编程--Makefile入门

Makefile 文件命名和规则 文件命名 makefile 或者 Makefile Makefile 规则 一个 Makefile 文件中可以有一个或者多个规则目标 ... &#xff1a; 依赖 ...命令 (shell 命令)...目标&#xff1a;最终要生成的文件&#xff0c;伪目标除外依赖&#xff1a;生成目标所需的文件或是目…

【剧前爆米花--爪哇岛寻宝】MySQL中索引和事务

作者&#xff1a;困了电视剧 专栏&#xff1a;《MySQL数据库》 文章分布&#xff1a;这是一篇关于Java中异常类的文章&#xff0c;在本篇文章中详细讲解了异常的使用逻辑和底层的执行过程&#xff0c;如有疏漏&#xff0c;欢迎大佬指正&#xff01; 目录 索引 用法 底层逻辑…

HCIP第一个实验

实验要求与实验拓扑子网划分分析将骨干链路看成一个整体&#xff0c;路由器后的2个环回地址先看成一个&#xff0c;最后再进行拆分。计算得出&#xff0c;一共需要划分为6个子网段&#xff0c;取三位。再将每一条网段&#xff0c;按照题目要求进行划分最后完成子网划分。子网划…

synchronized和lock的区别

区别&#xff1a; 1.synchronized是关键字,Lock是接口; 2.synchronized是隐式的加锁,lock是显式的加锁; 3.synchronized可以作用于方法上,lock只能作用于方法块; 4.synchronized底层采用的是objectMonitor,lock采用的AQS; 5.synchronized是阻塞式加锁,lock是非阻塞式加锁支…

【0177】Linux中POSIX信号量实现机制

文章目录 1. 信号量概念1.1 信号量类比1.2 重要的观察1.3 信号量分类2. POSIX与System V信号量3. 信号量API4. 代码演示5. 信号量内核实现1. 信号量概念 在计算机科学中,信号量(semaphores )是一种变量或抽象数据类型,用于控制多个进程对公共资源的访问,并避免并发系统(如…

gazebo仿真轨迹规划+跟踪(不在move_base框架下)

以Tianbot为例子&#xff0c;开源代码如下&#xff1a; https://github.com/tianbot/tianbot_mini GitHub - tianbot/abc_swarm: Ant Bee Cooperative Swarm, indicating air-ground cooperation. This repository is for Tianbot Mini and RoboMaster TT swarm kit. 1.在…

借助CatGPT让turtlesim小乌龟画曲线

注意这里是CatGPT&#xff0c;不等同OpenAI的ChatGPT&#xff0c;但是用起来十分方便&#xff0c;效果也还行。详细说明ROS机器人turtlesim绘制曲线需要注意哪些ROS机器人turtlesim绘制曲线需要注意以下几点&#xff1a;绘制曲线前需要设置好turtlesim的初始位置和方向&#xf…

机器学习、数据挖掘和统计模式识别学习(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 机器学习是让计算机在没有明确编程的情况下采取行动的科学。在过去的十年中&#xff0c;机器学习为我们提供了自动驾驶汽车&…

蓝桥杯第十四届校内赛(第三期) C/C++ B组

一、填空题 &#xff08;一&#xff09;最小的十六进制 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作…

【数据结构初阶】二叉树顺序结构:堆的实现

前言 前边077带着大家学习了树与二叉树的相关概念&#xff0c;这篇文章我们来实现一个二叉树的顺序结构。 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉…

库函数qsort 的模拟实现

在之前了解了库函数qsort的使用之后 我们来模拟实现一下上篇有介绍 qsort的底层实现是快速排序 由于害怕没有人了解过快速排序 我就用大家熟知的冒泡排序进行模拟实现 先来展示完整代码 以下代码为升序排序 如果降序将冒泡排序中的大于号改为小于号就可以了#define _CRT_SECURE…

【设计模式之美 设计原则与思想:设计原则】19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?

关于 SOLID 原则&#xff0c;我们已经学过单一职责、开闭、里式替换、接口隔离这四个原则。今天&#xff0c;我们再来学习最后一个原则&#xff1a;依赖反转原则。在前面几节课中&#xff0c;我们讲到&#xff0c;单一职责原则和开闭原则的原理比较简单&#xff0c;但是&#x…

「媒体分流直播」媒体直播和传统直播的区别,以及媒体直播的特点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好直播毋庸置疑已经融入到了我们生活的方方面面&#xff0c;小到才艺&#xff0c;游戏&#xff0c;大到政策的发布&#xff0c;许多企业和机构也越来越重视直播&#xff0c;那么一场活动怎么最大化的进行传播&#xff0c;一是…

【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #

文章目录前言移除链表元素相交链表写在最后前言 本章的OJ练习也是相对简单的&#xff0c;只要能够理解解题的思路&#xff0c;并且依照这个思路能够快速的写出代码&#xff0c;我相信&#xff0c;你的链表水平已经足够了。 对于OJ练习&#xff08;2&#xff09; : ->传送门…

x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建

文章目录[toc]关于 docker 版本查看是否开启 experimental 功能开启 experimental 功能查看当前环境平台拉取一个 arm 平台的容器运行一个 arm 平台的容器整一个 qemu-user-static注册可支持的架构解释器尝试启动 arm64 镜像尝试启动 ppc64le 镜像后台运行 arm64 容器build 一个…

java @Autowired @Resource @Inject 三个注解的区别

javax.annotation.Resourcejdk 内置的&#xff0c;JSR-250 中的注解。依赖注入通过 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor 来处理。org.springframework.beans.factory.annotation.Autowired org.springframework.beans.factory.annotati…