Java – SpringMVC – REST获取请求参数

通过Servlet获取

SpringMVC 是基于Servlet 封装的 Web 控制器,且请求方法是由Servlet 接收请求,SpringMVC进行截获并调用我们的请求方法,因此SpringMVC会把Servlet接收到的HTTPRequest也传给我们。

    @RequestMapping("unsoft/servletAPI")
    public String request(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("request:" + request + ",response:" + response);
        return "index";
    }

但是通常我们在SpringMVC中比较少用Servlet的方式获取参数。

 

 

通过 SpringMVC 获取

SpringMVC 非常智能,提供了直接传递参数的方法,在前端传递的表单名与控制器方法接收的参数名一致的情况下,可以直接传递。

表单名一致

在前端的表单名一致的情况下,SpringMVC支持直接接收参数

【HTML表单】
<form action="@{/unsoft/param}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登陆">
</form>

【控制器方法】
    @RequestMapping("unsoft/param")
    public String param(String username, String password) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

在表单中的名称如果和控制器方法中的形参名一致时,可以直接传递

 

 

表单名不一致

若表单中的名称如果和控制器方法中的形参名不一致时,SpringMVC提供了注解 @RequestParam 自定义绑定表单名功能。

【HTML表单】
<form action="@{/unsoft/param}" method="post">
    用户名:<input type="text" name="userName"><br>
    密码:<input type="password" name="passWord"><br>
    <input type="submit" value="登陆">
</form>

【控制器方法】
    @RequestMapping("unsoft/param")
    public String param(@RequestParam("userName") String username, @RequestParam("passWord") String password) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

 

@RequestParam 属性

@RequestParam 注解是用于接收表单数据的,它会根据表单名自动与控制器参数名进行绑定

value、name

value 用于存放表单名,与形参绑定的值

 

required

required 默认值为 true ,意指该参数值必须传递,如果设置为false ,则可以不传递表单参数,但是控制器中的对应形参会赋值为 null

【控制器方法】
    @RequestMapping("unsoft/param")
    public String param(@RequestParam(value = "userName",required = true) String username, String password) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

 

defaultValue

defaultValue 是当表单没有传递参数过来时的默认值,默认为 null

defaultValue 初定义时,required 将失效,因为required 指定的是必须传值,当表单没有传值时,defaultValue 会帮其赋默认值,在意义上不存在没有值的情况,所以required 失效。

【控制器方法】
    @RequestMapping("unsoft/param")
    public String param(@RequestParam(value = "userName",defaultValue = "admin") String username, String password) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

 

@RequestHeader 属性

@RequestHeader 注解是用于接收请求头数据的,它会根据请求头的key与控制器参数名进行绑定

value、name

value 用于存放请求头名称key,与形参绑定的值

 

required

required 默认值为 true ,意指该参数值必须传递,如果设置为false ,则请求头可以不存在,但是控制器中的对应形参会赋值为 null

    @RequestMapping("unsoft/param")
    public String param(
            @RequestParam("userName") String username,
            String password,
            @RequestHeader(value = "referer",required = true) String referer) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

defaultValue

defaultValue 是当没有该请求头时将被赋默认值,默认为 null

defaultValue 初定义时,required 将失效,因为required 指定的是必须传值,当请求头没有值时,defaultValue 会帮其赋默认值,在意义上不存在没有值的情况,所以required 失效。

    @RequestMapping("unsoft/param")
    public String param(
            @RequestParam("userName") String username,
            String password,
            @RequestHeader(value = "referer",defaultValue = "http://www.unsoft.cn") String referer) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

@CookieValue 属性

@CookieValue 注解是用于接收cookie数据的,它会根据请求头中的cookies自动与控制器参数名进行绑定

 

value、name

value 用于存放请求头cookie名称key,与形参绑定的值

 

required

required 默认值为 true ,意指该参数值必须传递,如果设置为false ,则请求头cookie可以不存在,但是控制器中的对应形参会赋值为 null

    @RequestMapping("unsoft/param")
    public String param(
            @RequestParam("userName") String username,
            String password,
            @CookieValue(value = "username",required = true) String cookies) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

defaultValue

defaultValue 是当没有该请求头cookie时将被赋默认值,默认为 null

defaultValue 初定义时,required 将失效,因为required 指定的是必须传值,当请求头cookie没有值时,defaultValue 会帮其赋默认值,在意义上不存在没有值的情况,所以required 失效。

    @RequestMapping("unsoft/param")
    public String param(
            @RequestParam("userName") String username,
            String password,
            @CookieValue(value = "username",defaultValue = "admin") String cookies) {
        System.out.println("username:" + username + ",password:" + password);
        return "index";
    }

 

通过 POJO 实体类获取

通过上面直接接收表单数据的方式外,如果表单数据非常多,那么控制器方法中的接收形参也会变得非常多,SpringMVC提供了以POJO实体类封装的方式对表单参数进行赋值,但前提是POJO实体类中的属性名之须要和表单名一致。

【POJO实体类】

public class User {
    
    private String username;
    
    private String password;
    
    private Integer age;
    
    private String gender;

}

【控制器方法】
    @RequestMapping("/unsoft/pojo")
    public String getParamByPOJO(User user){
        System.out.println(user);
        return "index";
    }

 

解决POST或GET中文乱码问题

在SpringMVC中,提供了对编码解码的问题,可以在web.xml文件中增下以下配置,设定UTF-8编码

forceEncoding 在SpringMVC源码中会设定 request 请求 和 response 响应 的编码过程,使得 response 响应 也经过UTF-8编码过滤

【web.xml文件】
    <!--配置springMVC的编码过滤器-->
    <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

注意:SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效

 

Serlvet中解决乱码问题请查看以下文章

简介 在Http应用程序中,网页与服务器之间的互动需要产生数据传输,在Servlet中,提供ServletRequest和s……
2022-12-25

 

获取Axios请求参数

基于Axios异步请求的特殊性,在Axios使用POST请求时所发送的参数中,有两种请求参数

【param】: URL请求参数,Axios中设置param参数后,会直接把参数拼接到URL中

【data】: 请求体参数,就是我们平时POST请求的参数,它保存在请求头中,Axios会对请求体参数以json格式进行打包

 

接收param参数

SpringMVC 可以通过使用【@PathVariable】定义接收URL上的请求参数,这里不再赘述.

 

接收data参数

因为Axios发送的请求会以一个json格式发送过来,那么我们需要对接收到的json数据解析成Java对象。

接收请求体参数,使用【@RequestBody】注解。

通过【@RequestBody】注解的形参,可以接收到Axios的json请求体

 

方法一:实体类对象

    /**
     * 使用实体类对象进行封装
     * @param id
     * @param user
     */
    @RequestMapping("/axios/{id}")
    public void getJsonData(@PathVariable("id") Integer id, @RequestBody User user){
        /**
         * 接收到Axios请求的URL参数【id】
         * 接收到Axios请求的请求体参数 {"id":"xx", "username":"xx", "password":"xx", "age":"xx", } 并封装成 User 对象
         */
    }

 

方法二:Map集合

    /**
     * 使用Map集合进行封装
     * @param id
     * @param map
     */
    @RequestMapping("/axios/{id}")
    public void getJsonData(@PathVariable("id") Integer id, @RequestBody Map<String,Object> map){
        /**
         * 接收到Axios请求的URL参数【id】
         * 接收到Axios请求的请求体参数 {"id":null, "username":"xx", "password":"xx", "age":"xx", "gender":"男"} 
         * 并封装成 Map 对象 {username="xx", password="xx", age="xx", gender="男"}
         */
    }

 

方法三:String字符串,只接收,不进行解析

    /**
     * 使用String接收,不进行任何解析
     * @param id
     * @param json
     */
    @RequestMapping("/axios/{id}")
    public void getJsonData(@PathVariable("id") Integer id, @RequestBody String json){
        /**
         * 接收到Axios请求的URL参数【id】
         * 接收到Axios请求的请求体参数 {"id":null, "username":"xx", "password":"xx", "age":"xx", "gender":"男"}
         * 接到到字符串 json 中 => {"username":"xx", "password":"xx", "age":"xx", "gender":"男"}
         */
    }

 

注意:

使用 @RequestBody 注解将json格式的请求参数转换为java对象
1> 导入 jackson 的依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.1</version>
        </dependency>

2> 在SpringMvc的配置文件中设置【<mvc:annotation-driven />】
3> 在外理请求的控制器方法的形参位置,直接设置 json 格式的请求参数要转换的 java 类型的形参,使用 @ReauestBody

 

响应数据

SpringMVC中使用 HTTPServletResponse 对象进行写数据

    @RequestMapping("/axios")
    public void getJsonData(HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.write("Axios接收数据");
    }

 

@ResponseBody

@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器

在控制器中注解【@ResponseBody】后所返回的String字符串将原始输出,不会转发HTML文件。

    @RequestMapping("/axios/response")
    @ResponseBody
    public String JavaToJson(){
        return "{\"username\":\"admin\", \"password\":\"123456\"}";
    }

 

方法一:返回实体类转为JSON

通过直接返回实体类,可以自动转为Json格式

    @RequestMapping("/axios/response")
    @ResponseBody
    public User JavaToJson() {
        User user = new User("admin", "123456", 23, "男");
        return user;
    }

JSON ==> {"username":"admin", "password":"123456", "age":"23", "gender":"男" }

 

方法二:返回Map集合转为JSON

    @RequestMapping("/axios/response")
    @ResponseBody
    public Map<String, User> MapToJson() {
        User u1 = new User("admin1", "password1", 23, "男");
        User u2 = new User("admin2", "password2", 25, "女");
        User u3 = new User("admin3", "password3", 24, "未知");
        Map<String, User> map = Map.of("1000", u1, "1001", u2, "1002", u3);
        return map;
    }

JSON ==> {"1000":{u1的数据}, "1001":{u2的数据}, "1002":{u3的数据} }

 

方法三:返回List集合转为JSON

    @RequestMapping("/axios/response")
    @ResponseBody
    public List<User> MapToJson() {
        User u1 = new User("admin1", "password1", 23, "男");
        User u2 = new User("admin2", "password2", 25, "女");
        User u3 = new User("admin3", "password3", 24, "未知");
        List<User> users = Arrays.asList(u1, u2, u3);
        return users;
    }

JSON ==> [0:{u1的数据}, 1:{u2的数据}, 2:{u3的数据}]

 

@RestController 注解

@RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解

如果您喜欢本站,点击这儿不花一分钱捐赠本站

这些信息可能会帮助到你: 下载帮助 | 报毒说明 | 进站必看

修改版本安卓软件,加群提示为修改者自留,非本站信息,注意鉴别

THE END
分享
二维码
打赏
海报
Java – SpringMVC – REST获取请求参数
通过Servlet获取 SpringMVC 是基于Servlet 封装的 Web 控制器,且请求方法是由Servlet 接收请求,SpringMVC进行截获并调用我们的请求方法,因此SpringMVC会把Servlet接收到的HTTPRequest也传……
<<上一篇
下一篇>>