SpringMVC(二)【请求与响应】(1)

简介: SpringMVC(二)【请求与响应】

0、测试环境

我们简化开发,创建一个简单的环境(因为没有其它包比如 service、dao,所以这里不用 Spring 容器,只用 SpringMVC 容器):

6cd72464d626a21bfb1e6fc54e9c1a23_af2b1963f5464fef829f67b4885ec8be.png

Servelet 容器配置:

package com.lyh.config;
 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
/**
 * Servlet 容器配置类
 */
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[]{"/"};
    }
}

注意有了这个就不需要 web.xml 了,不然启动 tomcat 会报错!!!

SpringMVC 配置:

package com.lyh.config;
 
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@ComponentScan("com.lyh.controller") // 扫描
public class SpringMvcConfig {
 
}

UserController:

package com.lyh.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Controller
public class UserController {
 
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        return "{'module':'user save'}";
    }
 
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        return "{'module':'user delete'}";
    }
}

BookController:

package com.lyh.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Controller
public class BookController {
 
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        return "{'module':'book save'}";
    }
 
}

1、请求映射路径

       在上面的环境中,我们可看到,对于不同 controller 类中存在有相同映射路径(/save),这是我们开发中经常会遇到的问题,也就是不同开发人员设置了相同的映射路径该怎么办?

解决办法:设置模块名作为请求路径前缀

ceb661340bd32ccad74a1713eb0d4bff_e90a761d18404b45806c16814fa2c9f1.png

3ef2552d4771550c9c2e2036b18abbdc_8d42e2983fb24bb287679bfe63c9ad8d.png

       这样,我们就解决了不同业务模块请求路径冲突的问题了,但是我们发现,如果这个每个业务模块下面的方法前面都加一个( /module )是不是太冗余了。所以,SpringMVC 还能帮我们继续简化开发( 直接在 Controller 类上面定义前缀):

91de86df5ca94bf59efef6ac097461c7_c23710b12f964d20bce27dac9a231a13.png

这里我们就可以总结一下注解 @RequestMapping 的用法了:

名称 类型 位置 作用
@RequestMapping 类注解 / 方法注解 控制器类 / 控制器方法上面 设置当前控制器方法请求访问路径,如果加在控制器类上则代表统一访问路径前缀

2、请求方式

2.1、Get 请求

       Get 请求非常简单,我们只需要在访问路径后面跟上一个 ?参数名=参数值 即可,如果是多个参数,直接 ?参数名1=参数值1&参数名2=参数值2  即可。

079e934dcfdfee501c1d2acbd684637f_c152e832f4f249c8acdab82495702cdf.png

注意:我们之前在学习 Servlet 的时候,Get 和 Post 请求是区分的,但是在 SpringMVC 中,我们并不需要在方法中分开处理不同类型的请求。

2.2、Post 请求

这里用 Postman 来进行模拟发送 Post 请求:

cc8e5513e602528f0e1b3f9be2cbe6c5_b46f9403a36d467a9a6415e71291923b.png

注意Post 请求发表单的时候,我们请求体中用的应该是 x-www-from-urlencoded

from-date 区别于 x-www-from-urlencoded 不同的是,它不仅可以发表单,还可以发送文件:

d20d7be2b76cdea7286eed5c11660986_85504e1142bd4f978ef6e4cafa4459be.png

2.3、Post 请求中文乱码问题

       中文乱码的问题我们之前在学习 Servlet 的时候是通过过滤器来实现的,在 SpringMVC 这里是一样的。我们不需要在负责响应的方法里去写,而是直接去 Servlet 容器配置类里重写一下 getServletFilters 方法即可:

ae1685d18f97706f2ea983a4cb608f12_f3495738f62d41ef99f03dd701af2c4f.png

注意这里的过滤器只对 Post 请求有效,Get 请求设置过滤器要复杂一些

2.4、请求参数

参数种类:

  • 普通参数
  • POJO
  • 嵌套POJO
  • 数组
  • 集合

2.4.1、客户端和服务端参数名不一致问题

       也就是客户端请求参数和我们服务端 Controller 类下面的方法形参名不一致,这种问题很常见,解决办法也很简单,直接通过 @RequestParam("参数名")  把客户端的参数名和我们服务端方法的形参绑定在一起:

e31579fb4d6ebbb84b05efc39885f2f5_2ac8e20713404bdfa1376c2d9c6c0cba.png

但是需要注意的是设置了这个注解就相当于指定了客户端的参数名,也就是说客户端要想再用 name 来给服务端传递参数就不行了

2.4.2、POJO 类型参数

我们先创建一个包 domain 并创建一个简单的 User 类:

package com.lyh.domain;
 
public class User {
 
    private String name;
    private int age;
 
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}

在 Controller 中添加一个用 Pojo 作为参数传递的方法:

@RequestMapping("/saveByPojo")
@ResponseBody
public String saveByPojo(User user){
    System.out.println("普通参数传递 name = " + user.getName() + " , age = " + user.getAge());
    return "{'module':'user save'}";
}

注意在Spring MVC中,不允许一个Controller下的不同方法具有相同的映射(我原本想着方法重载的,但是发现不行)。

       运行结果和之前的普通参数传递是一致的,而我们并没有做额外的操作,只是简单的修改了参数类型,SpringMVC 会帮我们自动通过对象的参数名去找到我们的方法形参。所以,这就要求我们 POJO 的参数名必须和方法形参名一致!

2.4.3、嵌套 POJO

嵌套 POJO 也就是一个对象的参数是另一个对象。

我们再创建一个 Address 类(两个属性:province 和 city,这里省略代码)并添加给 User 类。

fc9d311a6a4fc495c223b8d63ef24f94_4619a65c7ef4441b8ca384dc4ee9e34e.png

2.4.4、数组类型

同样非常简单,在控制器类下面添加一个方法:

360389c904cce27bf22555332c8e375b_bdab2238fd9246779ecce81d7f0d10ed.png

发送 Post 请求:

84a37faa1174f94388f5f904f2bbf886_90309097043c46e293c2c34856753887.png

fe7813a6b82fc7826adede7b592d9f72_c80931d5a85940a292e0c0f75dcb800b.png

这样,我们就通过多个相同参数名的方式实现了数组的传递。

2.4.5、集合类型

我们试着用和数组一样的方式去给集合传递参数:

在控制器类下创建一个方法:

6eaf4a11475182a0a657b39fe77f1263_aea8b811625241d5a53b37e38963995b.png

Post 请求测试:

7aed894cf7505b97d6410372e33e5bea_5d661ceec54445f6b324cb0385dd90f5.png

运行结果:

52b8d36743c3430198ca5a8c1ee25a5d_40003442f70e408eaa1bdc483f413e39.png

       可以看到,服务器报了一个构造器的错误,说明服务器在尝试调用 List 的构造方法,但是我们知道 List 是一个接口,根本没有构造器。这也说明,我们上一节在用 Pojo 作为参数传递的时候,SpringMVC 底层其实是会调用形参的那个 Pojo 对象的构造器,然后通过 set 方法进行属性注入。

       解决的办法也很简单,直接通过@RequestParam 注解把我们的请求参数当做集合的元素传递给集合(如果形参前面有 @RequestParam 注解,SpringMVC 会自动识别,而不会把它当做 Pojo 通过构造器创建空对象,然后通过 set 注入属性):

1667ecbec01f9e63365419012356522d_d867455722434ea999697f5660ecda86.png

运行结果:

1f21e605b03aea00de900c1d5957a7f9_729005d09b844feb97d1e0b4c394dacc.png

这样就没问题了。

SpringMVC(二)【请求与响应】(2)https://developer.aliyun.com/article/1534206

相关文章
|
11天前
|
JSON 前端开发 Java
【JavaEE进阶】 关于Spring MVC 响应
【JavaEE进阶】 关于Spring MVC 响应
17 3
|
19天前
|
JSON Java fastjson
SpringMVC(二)【请求与响应】(2)
SpringMVC(二)【请求与响应】
|
3天前
|
JSON 前端开发 数据格式
SpringMVC的数据响应-直接回写json字符串
SpringMVC的数据响应-直接回写json字符串
|
3天前
|
前端开发 Java Spring
|
5天前
|
JSON 前端开发 Java
spring mvc 请求与响应
spring mvc 请求与响应
9 0
|
8月前
|
JSON 前端开发 Java
构建健壮的Spring MVC应用:JSON响应与异常处理
构建健壮的Spring MVC应用:JSON响应与异常处理
41 0
|
1月前
|
JSON 前端开发 Java
SpringMVC请求和响应
Spring MVC通过请求和响应的处理来实现Web应用程序的开发。请求通过控制器处理,响应通过视图渲染器生成最终的HTML响应,并返回给客户端。
56 4
|
1月前
|
JSON 前端开发 Java
【JavaEE进阶】 关于Spring mvc 响应
【JavaEE进阶】 关于Spring mvc 响应
|
1月前
|
JSON 前端开发 Java
Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!
Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!
|
1月前
|
存储
SpringMVC的请求和响应
SpringMVC的请求和响应
15 0