SpringMVC学习之请求与响应

本文详细介绍了SpringMVC中请求与响应的处理,包括GET和POST请求发送普通参数、处理中文乱码问题、使用@RequestParam和@RequestBody的区别、日期形参传递,以及响应处理中的@ResponseBody注解的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请求

提出问题,当SpringMVC管理的bean,也就是controller包下被@Controller注解的类,当两个不同业务的Controller有一个相同的方法时,这里两个方法名一样没事,主要是请求路径一样,会冲突,

例如

@Controller
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc':'User'}";
    }
}
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'info':'springmvc' :'BOOK'}";
    }
}

 解决方式一,设置模块名作为请求路径

@Controller
public class UserController {

    @RequestMapping("/user/save")//改动处
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc':'User'}";
    }
}
public class BookController {
    @RequestMapping("/book/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'info':'springmvc' :'BOOK'}";
    }
}

解决方式二,使用@RequestMapping注解设置类的前缀

//方式二
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc':'User'}";
    }
}

@RequestMapping("/user")代表请求路径前缀

@RequestMapping("/save")代表请求路径后缀

GET请求和POST请求发送普通参数

使用插件postman

GET请求

使用pastman对web服务器发送GET请求,并携带请求参数name = tishicha

 在对应的commonParam方法形参列表中直接使用对应类型接收即可,例如

@Controller
public class User1Controller {
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("已接收到普通参数...");
        System.out.println(name);
        System.out.println(age);
        return "{'module';'common Param'}";
    }
}

POST请求

post请求发送普通参数也是一样,只需要让请求体里的参数和bean里方法形参列表一致即可

需要注意的是Body中form-data和x-www-form-urlencoded的区别在于前者可以发送文件类型的参数

解决get或post请求参数中带有中文,接收会乱码问题

        在web配置文件中,重写getServletFilters()方法,让后返回一个过滤器数组,例如

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{};
    }

 SpringMVC提供了一种获取过滤器的方式,如下

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

new一个CharacterEncodingFilter()示例,就可以得到一个过滤器,再为过滤器设置编码,为返回的过滤器集合赋值就可以了

 

需要注意的是,不管是get请求还是post请求,请求的key值必须和接收请求参数方法中形参列表里的形参名一一对应,才能把请求参数映射进方法里。但是有方法可以解决耦合问题,使用@RequestParam注解将绑定请求key值和接收方法中的形参绑定,形参名就可以随意定义

@Controller
public class User1Controller {
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(@RequestParam("name") String name1,@RequestParam("age") int age1){
        System.out.println("已接收到普通参数...");
        System.out.println(name1);
        System.out.println(age1);
        return "{'module';'common Param'}";
    }
}

pojo参数请求

是指web服务器接收的参数类型是一个对象类型,接收的参数key名要和一个实体类中的成员变量名一致即可,示例如下

@Controller
public class User1Controller {
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam( User user) {
        System.out.println("pojo参数请求收到" + user);
        return "'module':'pojo param'";
    }
}

只需要形参列表中的User类中有name和age这两个成员变量即可实现接收pojo类型参数

当User类中有别的成员变量时,就形成了pojo参数嵌套,例如

 此时请求参数应该用user1.成员变量名的方式传参数

数组参数请求

当需要接收一个数组类型的参数时

@Controller
public class User2Controller {
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes) {
        System.out.println("array参数请求收到" + Arrays.toString(likes));
        return "'module':'array param'";
    }
}

参数请求格式是,数组名对应一个value,key值都是数组名

 集合参数请求

如何接收一个集合请求参数

@Controller
public class User2Controller {
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String > likes) {
        System.out.println("list参数请求收到" + likes);
        return "'module':'list param'";
    }
}

和数组类似,只是要使用@RequestParam注解,把参数给到集合里,不加会将集合看成一个pojo,从而报错。

传递json数据

在SpringMVC配置文件上使用注解@EnableWebMvc让SpringMVC能将json数据转换成对象的功能

  • 接收集合String类型的Json
    • @Controller
      public class User3Controller {
          @RequestMapping("/jsonParam")
          @ResponseBody
          public String jsonListParam( @RequestBody List<String > likes) {
              System.out.println("json-list参数请求收到" + likes);
              return "'module':'json-List param'";
          }
      }

      @RequestBody注解告知SpringMVC是一个Json数据,去请求体里解析参数,在一个商法定义上只能用一次

  • 接收pojo类型json
    •     @RequestMapping("/jsonParam1")
          @ResponseBody
          public String pojoParam(@RequestBody User user) {
              System.out.println("pojo参数请求收到" + user);
              return "'module':'json-pojo param'";
          }

      也是需要使用@RequestBody注解。

  • 接收集合pojo类型json
    •     @RequestMapping("/jsonParam2")
          @ResponseBody
          public String listpojoParam(@RequestBody List <User> list) {
              System.out.println("list-pojo参数请求收到" + list);
              return "'module':'json-list-pojo param'";
          }

      和上面类似,主要是json的数据格式不一样

@RequestBody和@RequestParam 区别

  • 前者主要用于接收json参数
  • 后者主要用于接收url地址传参,表单传参

日期形参传递

        日期类型数据基于系统不同格式也不相同,例如

  • * 2022-06-18
    • 这种格式日期由于不是标准日期,所以在接收参数时需要加上@DateTimeFormat注解,并且为pattern指定一种格式,就可以接收这种个格式的日期参数
      •     @RequestMapping("/dateParam1")
            @ResponseBody
            public String dateParam1(@DateTimeFormat(pattern = "yyyy-mm-dd") Date date) {
                System.out.println("日期类型参数请求收到" + date);
                return "'module':'date param'";
            }
  • *2022/05/09
    •      这种格式的日期参数是标准格式,直接用Date对象接收即可
      •     @RequestMapping("/dateParam")
            @ResponseBody
            public String dateParam(Date date) {
                System.out.println("日期类型参数请求收到" + date);
                return "'module':'date param'";
            }

响应

  • 名称:@ResponseBody
  • 位置:定义在SpringMVC控制器方法上方
  • 作用:设置当前控制器返回值为响应体

当响应的是一个界面时是不需要在接收请求的方法上加@ResponseBody注解的,主要将响应页面的名字返回就好 例如

    //响应页面/跳转页面
    //返回值为String类型,设置返回值为页面名称,即可实现页面跳转
    @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("跳转页面");
        return "page.jsp";
    }

当响应参数不是一个页面时,是需要加上@ResponseBody注解的,例如字符串,数组,集合 ,json,了解一下响应json参数是时,是json的依赖将pojo转换成json参数的

    //返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println("返回json对象数据");
        User user = new User();
        user.setName("itcast");
        user.setAge(15);
        return user;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值