SpringMVC 获得请求数据

SpringMVC 获得请求数据

1.1 获得请求参数

客户端请求参数的格式是:name=value&name=value… …

服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:

(1)基本类型参数

(2)POJO类型参数

(3)数组类型参数

(4)集合类型参数

1.2 获得基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。

例:http://localhost:8080/quick?username=zhangsan&age=12


@RequestMapping("/quick")
@ResponseBody
public void quickMethod9(String username,int age) throws IOException { 
    System.out.println(username);
    System.out.println(age);
}
输出结果:zhangsan 
         12

1.3 获得POJO类型参数

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。

http://localhost:8080/quick1?name=zhangsan&age=12

//controller层
public class User {
private String username; private int age; getter/setter…
}
@RequestMapping("/quick1")
@ResponseBody
public void quickMethod10(User user) throws IOException { System.out.println(user);
}

//pojo层
    package com.buka.pojo;

public class User {
    private int age;
    private String name;
    
    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;
    }
     @Override
    public String toString() {
        return name+" "+age;
    }
}
输出结果:zhangsan 12
         
    

1.4 获得数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。

http://localhost:8080/quick2?strs=111&strs=222&strs=333


@RequestMapping("/quick11")
@ResponseBody
public void quickMethod11(String[] strs) throws IOException { 
    System.out.println(Arrays.asList(strs));
}


1.5 获得集合类型参数

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以 获得集合参数时,要将集合参数包装到一个POJO中才可以
前端
<form action="${pageContext.request.contextPath}/quick3"    >
   名 <input type="text" name="userList[0].name"><br>
    <%--    这的名必须和POJO里定义的Set方法后面的名字一样--%>
    岁<input type="text" name="userList[0].age"><br>
    名<input type="text" name="userList[1].name"><br>
    岁<input type="text" name="userList[1].age"><br>
    <input type="submit" value="提交"><br>
</form>
后端
        @RequestMapping("quick3")
        @ResponseBody
        public void quick8(UserList userList)  {
        System.out.println(userList.getUserList());
    }

pojo层user和上面user一致
    新增UserList
package com.buka.pojo;
import java.util.List;
public class UserList {
    public List<User>userList;

    public List<User> getList() {
        return userList;
    }

    public void setList(List<User> list) {
        this.userList = list;
    }

    @Override
    public String toString() {
        return "UserList{" +
                "userList=" + userList +
                '}';
    }
}

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。

前端
<script>
//模拟数据
var userList = new Array(); userList.push({username: "zhangsan",age: "20"});
userList.push({username: "lisi",age: "21"});
$.ajax({
type: "POST",
url: "/quick13",
data: JSON.stringify(userList),
contentType : 'application/json;charset=utf-8'
});
</script>

@RequestMapping("/quick13")
@ResponseBody
public void quickMethod13(@RequestBody List<User> userList) throws
IOException {
System.out.println(userList);
}

1.6 请求数据乱码问题

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

写在web.xml里

<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>
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

1.7 参数绑定注解@requestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定。
例:


<form action="${pageContext.request.contextPath}/quick1" method="post">
<input type="text" name="name"><br>
<input type="submit" value="提交"><br>
</form>


@RequestMapping("/quick1")
@ResponseBody
public void quickMethod14(@RequestParam("name") String username) throws
IOException {
System.out.println(username);
}

注解@RequestParam还有如下参数可以使用:
 value:与请求参数名称
 required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
 defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

@RequestMapping("/quick14")
@ResponseBody
public void quickMethod14(@RequestParam(value="name",required =false,defaultValue = "bk") String username) throws IOException {
    System.out.println(username);
}

@PathVariable和@RequestParam的区别

‌[@PathVariable]和 ‌[@RequestParam]的主要区别在于它们在 ‌[URL]中处理参数的位置和方式不同。

  • 位置和用途
    • @PathVariable 用于从 URL 路径中提取变量值。它通常用于 GET 和 DELETE 请求,其中参数直接作为 URL 路径的一部分(例如,/resource/{id} 中的 {id})。这些参数是 URL 路径的一部分,因此它们的值是静态的,不会随请求变化。‌12
    • @RequestParam 用于从请求参数中获取数据。它通常用于 POST、PUT 和 PATCH 请求,其中请求体可能包含动态参数(尽管也可以用于 GET 请求的查询字符串中)。这些参数是动态的,可以随请求变化。
  • 参数处理
    • @PathVariable 不需要问号(?)来传递参数,而是直接将参数嵌入 URL 路径中。它没有默认值参数(defaultValue),因为路径参数通常是必需的。
    • @RequestParam 需要问号(?)来分隔 URL 和查询字符串,其中包含要传递的参数。它支持默认值参数(defaultValue),当请求中没有提供该参数时,将使用默认值。‌14

总结来说,选择使用哪个注解取决于你的需求:如果你需要从 URL 路径中提取静态参数,应使用 @PathVariable;如果你需要从请求体或查询字符串中获取动态参数,应使用 @RequestParam

1.8 获得Restful风格的参数

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务
器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

Restful风格的请求是使用“url+请求方式”表示一次请求的目的,HTTP 协议里面四个表示操作方式的动词如下:
 GET:用于获取资源
 POST:用于新建资源
 PUT:用于更新资源
 DELETE:用于删除资源

Restful风格的注解:
@RestController
@GetMapping = @RequestMapping(method = RequestMethod.GET)
@PostMapping = @RequestMapping(method = RequestMethod.POST)
@PutMapping = @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)

@RestController 与 @Controller 区别?

@Controller:定义传统的Spring MVC控制器。 @Controller注解的类中的方法返回的通常是视图的名称或ModelAndView对象,这些返回值将由Spring MVC的视图解析器用来渲染最终的视图。

@RestController:定义REST风格的Web服务控制器。它是@Controller和@ResponseBody的组合。 @RestController注解的类中的方法可以直接返回业务数据,Spring MVC会自动将这些数据序列化为JSON或XML格式的HTTP响应体。

上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。

http://localhost:8080/quick19/zhangsan

@RequestMapping("/quick19/{name}")
@ResponseBody
//这里面的Pathvariable功能和RequestParam一样,但是RequestParam是把{name}当做路由了,Pathvariable是将他当成值
public void quickMethod19(@PathVariable(value = "name",required = true) String name){
             System.out.println(name);
}

输入url:在这里插入图片描述

输出hello
在这里插入图片描述
我们看下图第二种, 他会 报错 \color{red}报错 报错,他将{name}字符串看成了路由,你需要将类上面的 @Controller改为@RestController
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值