首页 > 其他分享 >【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

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

时间:2023-12-23 23:37:44浏览次数:45  
标签:return 请求 SpringMVC Spring class save public String



目录

  • 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工具的安装与使用技巧》

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

前面我们已经完成了入门案例相关的知识学习,接来了我们就需要针对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'}";
	}
}

最终创建好的项目结构如下:

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


把环境准备好后,启动Tomcat服务器,后台会报错:

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


从错误信息可以看出:

  • 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...略
}

最终创建好的项目结构如下:

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

2.2 参数传递

2.2.1 GET发送单个参数

发送请求与参数:

http://localhost/commonParam?name=itcast

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


接收参数:

@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

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


接收参数:

@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

控制台:

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


出现乱码的原因相信大家都清楚,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发送参数

发送请求与参数

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


接收参数:

和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请求中文乱码

发送请求与参数:

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


接收参数:

控制台打印,会发现有中文乱码问题。

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


解决方案:配置过滤器

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包。


标签:return,请求,SpringMVC,Spring,class,save,public,String
From: https://blog.51cto.com/u_12948819/8947859

相关文章

  • 在Spring Cloud中使用OpenFeign完成从一个微服务上传到另一个微服务中
    跨服务上传文件,嘿嘿,来一篇实用性高的,本篇将主要完成在Feign中上传文件到另一个微服务中。步骤如下:我们需要在服务提供者和服务消费者的项目中添加相应的依赖:对于服务提供者的项目,你需要添加SpringBoot的Web依赖和SpringCloud的Feign依赖。在pom.xml文件中添加以下依赖:<dependenci......
  • 在Spring Cloud中实现Feign声明式服务调用客户端
    如果你学过SpringCloud,你应该知道我们可以通过OpenFeign从一个服务中调用另一个服务,我们一般采用的方式就是定义一个Feign接口并使用@FeignClient注解来进行标注,feign会默认为我们创建的接口生成一个代理对象。当我们在代码中调用Feign接口的方法的时候,实际上就是在调用我们Feign......
  • Swagger(一) Swagger/Springfox 入门简介
    转载自:https://blog.csdn.net/donglinjob/article/details/108550636 Swagger/Springfox入门简介一、Swagger 简介1前言接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要,但是由于项目周期等原因后端人员经......
  • 将 Spring Boot WAR 部署到 Tomcat 服务器
    Servlet容器期望应用程序满足要部署的某些协定。对于Tomcat,合约是 ServletAPI3.0。为了让我们的应用程序满足这个契约,我们必须对源代码进行一些小的修改。 首先,我们需要打包一个WAR应用程序而不是JAR。为此,我们将使用以下内容更改 pom.xml:<packaging>war</packaging......
  • org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis
    Requestprocessingfailed;nestedexceptionisorg.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.binding.BindingException:Parameter'keyWord'notfound.Availableparametersare[keyword,param1] 错误原因:我在mapper里加......
  • Spring Boot框架必知,满满干货!
    1、初识SpringBoot框架1.1SpringBoot框架定义SpringBoot并不是替代Spring框架的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具,同时SpringBoot还集成了大量常用的第三方库配置,本质上是基于Spring的Web应用程序开发框架。1.2SpringBoot框架的优点可快速构......
  • 8.非连续存储分配(基本分页、请求分页、基本分段、段页式)
    基本分页存储管理引入分页的原因尽量避免碎片的产生,增大内存利用率对换是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,调入内存。对换是提高内存利用率的有效措施对换的类型:......
  • Jmeter:一个简单的http请求
    一前言环境:window10Jmeter5.3Jmeter是以协议为基础(如http协议ftp协议),通过接口的方式向服务端发送数据和接收数据,所以在使用Jmeter时,最好有一些对应的协议基础知识二一些简单的http请求步骤:在testplan新建threadgroup在threadgroup中新建http请求在threadgroup中......
  • SpringSecurity:自定义身份认证异常处理器不生效
    由于我配置了全局异常处理器,再配置身份认证异常处理器后,发现异常直接被全局异常处理器捕获了@RestControllerAdvice("com.gsy.wy")@Slf4jpublicclassGlobalException{@ExceptionHandler(Exception.class)publicResulthandlerException(Exceptione){l......
  • Java Spring Boot 集成 elasticsearch6.8.x
    在全文搜索领域,毫无疑问,当下elasticsearch应用广泛,其优势自不必说,凭借全文快速搜索,可以在短时内实现大数据量的查询。今天学习下在SpringBoot中集成elasticsearch开发,这里主要展示可以怎么用,至于开发人员向通过ElasticsearchORM封装,也可以参考下面的示例。环境:Sprin......