【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

目录

  • 1 设置请求映射路径
    • 1.1 环境准备
  • 1.2 问题分析
    • 1.3 设置映射路径
  • 2 请求参数
    • 2.1 环境准备
    • 2.2 参数传递
      • 2.2.1 GET发送单个参数
      • 2.2.2 GET发送多个参数
      • 2.2.3 GET请求中文乱码
      • 2.2.4 POST发送参数
      • 2.2.5 POST请求中文乱码

欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《PostMan工具的安装与使用技巧》
在这里插入图片描述前面我们已经完成了入门案例相关的知识学习,接来了我们就需要针对SpringMVC相关的知识点进行系统的学习,之前我们提到过,SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果,所以这一章节是学习SpringMVC的重点内容,我们主要会讲解四部分内容:

  • 请求映射路径
  • 请求参数
  • 日期类型参数传递
  • 响应json数据

1 设置请求映射路径

1.1 环境准备

  • 创建一个Web的Maven项目
  • pom.xml添加Spring依赖
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.itheima</groupId>
	<artifactId>springmvc_03_request_mapping</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>war</packaging>

<dependencies>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>3.1.0</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>5.2.10.RELEASE</version>
	</dependency>
</dependencies>

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<version>2.1</version>
			<configuration>
				<port>80</port>
				<path>/</path>
			</configuration>
		</plugin>
	</plugins>
</build>
</project>
  • 创建对应的配置类
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {

	protected Class<?>[] getServletConfigClasses() {
			return new Class[]{SpringMvcConfig.class};
		}
		protected String[] getServletMappings() {
			return new String[]{"/"};
		}
		protected Class<?>[] getRootConfigClasses() {
			return new Class[0];
	}
}

@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
  • 编写BookController和UserController
@Controller
public class UserController {

	@RequestMapping("/save")
	@ResponseBody
	public String save(){
		System.out.println("user save ...");
		return "{'module':'user save'}";
	}
	
	@RequestMapping("/delete")
	@ResponseBody
		public String save(){
		System.out.println("user delete ...");
		return "{'module':'user delete'}";
	}
}

@Controller
public class BookController {

	@RequestMapping("/save")
	@ResponseBody
	public String save(){
		System.out.println("book save ...");
		return "{'module':'book save'}";
	}
}

最终创建好的项目结构如下:
在这里插入图片描述
把环境准备好后,启动Tomcat服务器,后台会报错:
在这里插入图片描述
从错误信息可以看出:

  • UserController有一个save方法,访问路径为http://localhost/save
  • BookController也有一个save方法,访问路径为http://localhost/save
  • 当访问http://localhost/saved的时候,到底是访问UserController还是BookController?

1.2 问题分析

团队多人开发,每人设置不同的请求路径,冲突问题该如何解决?
解决思路:为不同模块设置模块名作为请求路径前置
对于Book模块的save,将其访问路径设置http://localhost/book/save
对于User模块的save,将其访问路径设置http://localhost/user/save
这样在同一个模块中出现命名冲突的情况就比较少了。

1.3 设置映射路径

步骤1:修改Controller

@Controller
public class UserController {
	@RequestMapping("/user/save")
	@ResponseBody
	public String save(){
		System.out.println("user save ...");
		return "{'module':'user save'}";
	}
	@RequestMapping("/user/delete")
	@ResponseBody
	public String save(){
		System.out.println("user delete ...");
		return "{'module':'user delete'}";
	}
}
@Controller
public class BookController {
	@RequestMapping("/book/save")
	@ResponseBody
	public String save(){
		System.out.println("book save ...");
		return "{'module':'book save'}";
	}
}

问题是解决了,但是每个方法前面都需要进行修改,写起来比较麻烦而且还有很多重复代码,如果/user后期发生变化,所有的方法都需要改,耦合度太高

步骤2:优化路径配置
优化方案:

@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping("/save")
	@ResponseBody
	public String save(){
		System.out.println("user save ...");
		return "{'module':'user save'}";
	}
	@RequestMapping("/delete")
	@ResponseBody
	public String save(){
		System.out.println("user delete ...");
		return "{'module':'user delete'}";
	}
}
@Controller
@RequestMapping("/book")
public class BookController {
	@RequestMapping("/save")
	@ResponseBody
	public String save(){
		System.out.println("book save ...");
		return "{'module':'book save'}";
	}
}

注意:

  • 当类上和方法上都添加了@RequestMapping注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。
  • @RequestMapping注解value属性前面加不加/都可以

扩展小知识:
对于PostMan如何觉得字小不好看,可以使用ctrl+=调大,ctrl±调小。

2 请求参数

请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数?

关于请求参数的传递与接收是和请求方式有关系的,目前比较常见的两种请求方式为:

  • GET
  • POST

针对于不同的请求前端如何发送,后端如何接收

2.1 环境准备

  • 创建一个Web的Maven项目
  • pom.xml添加Spring依赖
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.itheima</groupId>
	<artifactId>springmvc_03_request_mapping</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>war</packaging>

	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>5.2.10.RELEASE</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.1</version>
				<configuration>
					<port>80</port>
					<path>/</path>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
  • 创建对应的配置类
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {

	protected Class<?>[] getServletConfigClasses() {
		return new Class[]{SpringMvcConfig.class};
	}
	protected String[] getServletMappings() {
		return new String[]{"/"};
	}
	protected Class<?>[] getRootConfigClasses() {
		return new Class[0];
	}
}

@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
  • 编写UserController
@Controller
public class UserController {

	@RequestMapping("/commonParam")
	@ResponseBody
	public String commonParam(){
		return "{'module':'commonParam'}";
	}
}
  • 编写模型类,User和Address
public class Address {
	private String province;
	private String city;
	//setter...getter...略
}
public class User {
	private String name;
	private int age;
	//setter...getter...略
}

最终创建好的项目结构如下:
在这里插入图片描述

2.2 参数传递

2.2.1 GET发送单个参数

发送请求与参数:

http://localhost/commonParam?name=itcast

在这里插入图片描述
接收参数:

@Controller
public class UserController {
	@RequestMapping("/commonParam")
	@ResponseBody
	public String commonParam(String name){
		System.out.println("普通参数传递 name ==> "+name);
		return "{'module':'commonParam'}";
	}
}

2.2.2 GET发送多个参数

发送请求与参数:

http://localhost/commonParam?name=itcast&age=15

在这里插入图片描述
接收参数:

@Controller
public class UserController {
	@RequestMapping("/commonParam")
	@ResponseBody
	public String commonParam(String name,int age){
		System.out.println("普通参数传递 name ==> "+name);
		System.out.println("普通参数传递 age ==> "+age);
		return "{'module':'commonParam'}";
	}
}

2.2.3 GET请求中文乱码

如果我们传递的参数中有中文,你会发现接收到的参数会出现中文乱码问题。
发送请求: http://localhost/commonParam?name=张三&age=18
控制台:
在这里插入图片描述
出现乱码的原因相信大家都清楚,Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<version>2.1</version>
			<configuration>
				<port>80</port><!--tomcat端口号-->
				<path>/</path> <!--虚拟目录-->
				<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
			</configuration>
		</plugin>
	</plugins>
</build>

2.2.4 POST发送参数

发送请求与参数
在这里插入图片描述
接收参数:
和GET一致,不用做任何修改

@Controller
public class UserController {
	@RequestMapping("/commonParam")
	@ResponseBody
	public String commonParam(String name,int age){
		System.out.println("普通参数传递 name ==> "+name);
		System.out.println("普通参数传递 age ==> "+age);
		return "{'module':'commonParam'}";
	}
}

2.2.5 POST请求中文乱码

发送请求与参数:
在这里插入图片描述
接收参数:
控制台打印,会发现有中文乱码问题。
在这里插入图片描述
解决方案:配置过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
	protected Class<?>[] getRootConfigClasses() {
		return new Class[0];
	}
	protected Class<?>[] getServletConfigClasses() {
		return new Class[]{SpringMvcConfig.class};
	}
	protected String[] getServletMappings() {
		return new String[]{"/"};
	}
	//乱码处理
	@Override
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter filter = new CharacterEncodingFilter();
		filter.setEncoding("UTF-8");
		return new Filter[]{filter};
	}
}

CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3-17-ref 模板引用的基本使用

什么是模板引用 简单来说&#xff0c;就是在 js 代码中 获取到 html 中的dom元素的完整信息&#xff0c; 从而实现直接操作dom元素的效果。模板引用的语法 1、给 dom 元素添加 ref名称 属性&#xff0c;指定一个独有的名称&#xff1b; 2、js 中 声明一个 与 dom 元素的 ref 同…

华为海思、燧原、海光等齐力打破封锁,谁主AI芯片江山| 百能云芯

近期&#xff0c;美国对英伟达出口进行了限制&#xff0c;导致英伟达无法向中国大陆销售AI芯片&#xff0c;这一局势催生了中国本土IC设计企业的崛起&#xff0c;包括华为旗下的海思科技、腾讯旗下的燧原科技&#xff0c;以及海光信息和新创公司天数智芯等纷纷抢占市场。 据百能…

【问题解决】unable to do port forwarding: socat not found

问题复现 前阵子应公司要求做华为云平台的调研&#xff0c;写了一篇文档包含将华为云CCE下载kuberctl配置及使用kubectl转发流量到本地的操作。 今天一早上同事就发来一个错误界面&#xff0c;说是Java远程调试转发过来的端口出现问题&#xff0c;如下图&#xff1a; 处理思路…

wgcloud访问页面如何加前缀/wgcloud

nginx配置实现加/wgcloud - WGCLOUD

Linux:ELF

文章目录 前置知识从文本文件到可执行文件经历的阶段编译器gcc目标文件 ELFSection&#xff08;节&#xff09;Segment&#xff08;段&#xff09;从链接角度和从程序角度看ELF文件1. Section Header Table:2. Program Header Table: 参考 前置知识 从文本文件到可执行文件经历…

树莓派zero w入坑指南

树莓派zero w入坑指南 入坑契机 说起创客不得不提到开源硬件Raspberry Pi(树莓派)。它是一款基于ARM的微型电脑主板&#xff0c;以MicroSD卡为硬盘&#xff0c;提供HDMI和USB等外部接口&#xff0c;可连接显示器和键鼠。以上部件全部整合在一张仅比信用卡稍大的主板上&#x…

jvm阶段小节

文章目录 静态变量与局部变量的对比&#xff1a; 我们知道类变量有两次初始化的机会&#xff0c;第一次是在“准备阶段”&#xff08;链接&#xff09;&#xff0c;执行系统初始化&#xff0c;对类变量设置默认值&#xff0c;另一次则是在“初始化”阶段&#xff0c;赋予程序员…

Postman测试 restful 接口!

日常开发中经常会遇到没有前提界面&#xff0c;直接调用后台 restful 接口的情景&#xff0c;不管时后台代码先行&#xff0c;并且开发完之后开发人员进行自测还是&#xff0c;或者是专业测试进行 restful 接口测试&#xff0c;都需要一款工具&#xff0c;现在就来介绍 postman…

如何在本地搭建Oracle数据库并实现无公网ip通过PLSQL工具远程连接数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 正文开始前给大家推荐个网站&#xff0c;前些天发…

PythonStudio:一款国人写的python及窗口开发编辑IDE,可以替代pyqt designer等设计器了

本款软件只有十几兆&#xff0c;功能算是强大的&#xff0c;国人写的&#xff0c;很不错的python界面IDE.顶部有下载链接。下面有网盘下载链接&#xff0c;或者从官网直接下载。 目前产品免费&#xff0c;以后估计会有收费版本。主页链接&#xff1a;PythonStudio-硅量实验室 作…

期末数组函数加强练习

前言&#xff1a;由于时间问题&#xff0c;部分题解取自网友&#xff0c;但都是做过的好题。 对于有些用c实现的题目&#xff0c;可以转化成c实现&#xff0c;cin看成c的读入&#xff0c;可以用scanf&#xff0c;输出cout看作printf&#xff0c;endl即换行符 开胃菜&#xff…

从零构建属于自己的GPT系列6:模型部署2(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

在线学习平台-学生端

在线学习平台------手把手教程&#x1f448; 学生端课程分页查询 sql: 学生登入时,只能看见自己的所属课程,需要关联查询,查出学生对应的课程 SELECTt2.course_id,t2.course_name,t2.course_cover,t2.teacher_id,t3.nick_name,t2.remarkfrom sys_user t1LEFT JOIN ms_course t…

计算机系统结构MIPS流水线

题目 其中&#xff1a;R3的初值是R2396。假设&#xff1a;在整个代码序列的运行过程中&#xff0c;所有的存储器访问都是命中的&#xff0c;并且在一个时钟周期中对同一个寄存器的读操作和写操作可以通过寄存器文件“定向”。问&#xff1a; &#xff08;1&#xff09;在没有任…

C++模板编程浅析

函数模板 声明与定义函数模板 #include <iostream> using namespace std; template <class T> void swap_new(T& a, T& b);int main() {int a 1, b 2;float c 1.5, d 3.6;swap_new(a, b);swap_new(c, d);cout << a << " " &…

Redis HyperLogLog 数据结构模型统计

HyperLogLog HyperLogLog 不是一种新的数据结构 &#xff0c; 本质上是字符串类型。 是一种基数算法。 通过 HyperLogLog 可以节省内存空间&#xff0c;并完成独立总数的统计。 HyperLogLog 数据结构可用于仅使用少量恒定内存来计算集合中的唯一元素&#xff0c;具体而言&…

Centos硬盘操作合集

一、硬盘命令说明 lsblk 列出系统上的所有磁盘列表 查看磁盘列表 参数意义 blkid 列出硬盘UUID [rootzs ~]# blkid /dev/sda1: UUID"77dcd110-dad6-45b8-97d4-fa592dc56d07" TYPE"xfs" /dev/sda2: UUID"oDT0oD-LCIJ-Xh7r-lBfd-axLD-DRiN-Twa…

【coco】掩膜mask影像转coco格式txt(含python代码)

最近在做实例分割&#xff0c;遇到二值掩膜影像——coco格式txt的实例分割转换问题&#xff0c;困扰很久&#xff0c;不知道怎么转换&#xff0c;转出来的txt没法用代码成功读取。一系列问题&#xff0c;索性记录下自己的结局路程&#xff0c;方便大家python代码自取。 目录 &…

Python开发运维:Python调用K8S API实现资源管理

目录 一、实验 1.Python操作K8S API获取资源 2.Python操作K8S API创建deployment资源 3.Python操作K8S API删除k8s资源 4.Python操作K8S API修改k8s资源 5.Python操作K8S API查看k8s资源 二、问题 1.Windows11安装kubernetes报错 2.Python通过调用哪些方法实现Pod和De…

C4D云渲染怎么提升速度小技巧?C4D云渲染速度提升技巧

当许多C4D用户转向云渲染时&#xff0c;他们常常会发现渲染速度并没有预期中的提升&#xff0c;这让人产生疑问&#xff0c;为什么使用云渲染服务后&#xff0c;渲染时间依然没有显著缩短&#xff0c;C4D云渲染情况取决于多个因素&#xff0c;如&#xff1a;渲染任务特点以及所…