Java高效率复习-SpringMVC[SpringMVC-2]
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异步
相关文章:
Java高效率复习-SpringMVC[SpringMVC-2]
SpringMVC获取请求参数 SpringMVC获取请求参数的两种方式↓ 通过ServletAPI获取请求参数 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 通过request的API——getParameter(String s)方法来获取…...
【前端】一个更底层库-React基础知识点
目录Reat是什么?为什么要使用React类库比较容易学习,API非常少。组件内聚,容易组合原生组件和自定义组件融合渲染状态/属性驱动全局更新commonjs生态圈/工具栏完善React基础知识JSX概述JSX嵌入变量Event事件组合组合CHILDREN总结大家好&#…...
C++ 之枚举类型
文章目录参考描述枚举类型枚举类型枚举变量的声明及定义细节枚举常量的默认初始值枚举常量不可被修改赋值运算枚举常量与数据类型为枚举常量指定数据类型可选择的数据类型特殊的 Bool强枚举类型命名冲突强枚举类型参考 项目描述菜鸟教程C 枚举类型详解精通C (第九版…...
软件测试用例(3)
按照测试对象划分: 一)界面测试: 1)软件只是一种工具,软件和人的信息交流是通过界面来进行的,界面是软件和用户交流的最直接的一层,界面的设计决定了用户对于我们设计软件的第一映像,界面如同人的面孔,具有最吸引用户的…...
Spring——Bean管理-注解方式进行属性注入
Spring针对Bean管理中创建对象提供的注解有哪些?Component:普通Service:业务逻辑层Controller:controller层Repository:dao层用注解的方式是为什么?简化xml方式开发,只需要注解就可以完成在配置…...
【设计模式之美 设计原则与思想:设计原则】20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?
上几节课中,我们学习了经典的 SOLID 原则。今天,我们讲两个设计原则:KISS 原则和 YAGNI 原则。其中,KISS 原则比较经典,耳熟能详,但 YAGNI 你可能没怎么听过,不过它理解起来也不难。 理解这两个…...
Java代码弱点与修复之——Copy-paste error(复制粘贴错误)
弱点描述 Copy-paste error,复制粘贴错误。 是指在复制和粘贴代码时产生的错误。这种错误通常是由于程序员在复制代码时未正确编辑所复制的代码或编辑复制后的代码时忘记更改一些值或参数而导致的。复制粘贴错误可能会导致程序逻辑错误、编译错误或运行时错误。 示例代码 …...
Editor.md 的使用方法及图片处理
目录1. 资源下载2. 生成页面2.1 编辑和预览页面2.2 文本渲染页面3. 图片上传3.1 前端配置3.2 后端接口4. 图片粘贴[^2]1. 资源下载 官网下载 gitee 下载 2. 生成页面 2.1 编辑和预览页面 将资源(精简后 Editor.md 资源1)导入项目: 按照官…...
剑指 Offer II 018. 有效的回文
题目链接 剑指 Offer II 018. 有效的回文 easy 题目描述 给定一个字符串 s,验证 s是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, …...
Elasticsearch分析器(Analyzer)
Elasticsearch分析器(Analyzer) 文章目录Elasticsearch分析器(Analyzer)分析器概念内置分析器(8.6版本)自定义分析器elasticsearch-analysis-ik(简称ik,💕14.8kÿ…...
P6入门:了解P6 Professional 工具栏及地图分享
目录 引言 相关分享 引言 凭借更大的灵活性和增强的自定义功能,最新版本的 Oracle Primavera P6 Professional 的界面比早期版本有了巨大改进。对于有经验的伙伴来说,它仍然是熟悉的领域,几乎所有预期的功能都显示在前面。该界面可以更好地…...
习题30 if elif else 语句
people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件,print("We should not take the…...
32 openEuler使用LVM管理硬盘-管理卷组
文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…...
Jackson CVE-2017-17485 反序列化漏洞
0x00 前言 同CVE-2017-15095一样,是CVE-2017-7525黑名单绕过的漏洞,主要还是看一下绕过的调用链利用方式。 可以先看: Jackson 反序列化漏洞原理 或者直接看总结也可以: Jackson总结 涉及版本:2.8.10和2.9.x至2.…...
十大排序(C++版)
测试排序的题目: 912. 排序数组 - 力扣(LeetCode) 堕落的做法: class Solution { public:vector<int> sortArray(vector<int>& nums) {sort(nums.begin(),nums.end());return nums;} };视频推荐: …...
SpringMVC中的常用注解
Java知识点总结:想看的可以从这里进入 目录3.2、常用的注解3.2、常用的注解 Controller:代表此类是一个控制器,需要配置包的扫描。Spring MVC 是通过组件扫描机制查找应用中的控制器类的 在Spring6.0之后要求控制层必须添加该注解才会被识别成…...
English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一
English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一课前活动练习方法大小元音总结小元音准备工作[ʌ] 中元音发音技巧对应单词的发音对应句子的发音常见的字母组合[ɒ] 后元音发音技巧对应单词的发音对应句子的发音常见的字母组合…...
fastadmin后台登录页修改
直接替换就行 <!DOCTYPE html> <html lang"{$config.language}"> <head>{include file"common/meta" /}<style type"text/css">body {color: #999;background-color: #f1f4fd;background-size: cover;}a {color: #444;…...
Java 面向对象(OOP)的三大特性
封装 所谓封装,意思就是隐藏内部细节,在编程中,指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,并尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。…...
Java:openjdk: error: Student is abstract; cannot be instantiated;java编译环境
文章目录编译环境jdkopenjdk错误代码小心javac -verbos编译环境 jdk 需要安装的javac 在java-devel 包里 [root10 ~]# rpm -qf /usr/bin/javac file /usr/bin/javac is not owned by any package [root10 ~]# ll /usr/bin/javac lrwxrwxrwx. 1 root root 23 Jun 15 09:52 /us…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...
