Springmvc之接受请求参数

Springmvc之接受请求参数

准备工作

  • 新建一个表单提交
    • 请求地址: http://localhost:8080/ProjectName/user/login.do
<form action="<%=request.getContextPath()%>/user/login.do" method="post">
    username:<input type="text" name="username"> <br>
    password:<input type="text" name="password"> <br>
    age:<input type="text" name="age">
    <input type="submit" value="提交">
</form>

【不推荐】HttpServletRequest

  • 直接使用HttpServeletRequest作为方法参数,spring会自动为其注入
  • 需要手动转换参数的类型
    @RequestMapping(value="/login.do")
    public String login(HttpServletRequest request,HttpServletResponse response){
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        int age=Integer.parseInt(request.getParameter("age"));  //转换类型
        System.out.println(username+"--->"+password);
        return "success";
    }

直接在方法中声明对应的参数(name的属性必须和方法参数一致)

  • 表单中的name属性要和方法中的参数一致
  • 涉及到类型转换,直接在方法中申明不同类型的参数即可
  • 优点: 方便,并且可以使Springmvc自动处理数据类型
    @RequestMapping(value = "/login.do")
    public String login(String username,String password,Integer age) {
        System.out.println(username + "--->" + password+"----->"+age);
        return "success";
    }

【推荐】@RequestParam

  • 使用该注解可以获取请求参数,方法中的参数可以与表单中的name属性不一致
  • 使用@RequestParam这个获取的值必须包含在请求参数中,否则报错,除非设置required属性为false
    /**
     * 使用@RequestParam获取请求参数
     * @RequestParam()中的value属性为form表单中对应的name属性
     * 自动转换数据类型,只需要定义方法参数为所需的数据类型即可,spring会为我们自动转换
     */
    @RequestMapping(value = "/login.do")
    public String login(@RequestParam(value = "username") String name,
            @RequestParam("password") String pwd,@RequestParam("age") Integer age) {
        System.out.println(name + "--->" + pwd+"----->"+age);
        return "success";
    }

属性

  • value 指定请求中对应的属性名称,这个就像表单中定义的name属性
  • required指定是否这个参数必须包含在请求地址中,默认是true,即是如果不包含这个参数那么就会报错。
  • defaultValue 指定默认的值,如果设置了required=false,并且没有设置这个值,那么默认的是null,但是也是可以使用这个属性来设置参数默认的值。当然对于设置了int类型的参数,那么并没有指定其值,那么将会报错,因为int类型没有null,只有Integer类型的才有,因此需要设置成Integer
    /*
     * 这里的获取请求参数中的username,age的值
     * 其中username的这个注解默认的是required=true,因此这个是不可以没有的
     * age的这个注解设置了required=false,表示可以没有这个参数,但是如果没有这个参数,那么默认的是null,但是int类型的没有null,因此也会是报错的,有两种解决方式:
     *      1) 通过defalutValue设置其默认的值
     *      2) 如果我们就想要设其为null,可以使用封装类Integer类型即可
     */
    @RequestMapping(value = "/testRequestParams")
    public String testRequestParams(@RequestParam(value="username") String username,@RequestParam(value="age",required=false) int age) {
        System.out.println("username,age  "+ username+"  ,  "+age);
        return SUCCESS;
    }

【推荐】使用自定义数据类型(JavaBean)

  • 如果传过来的请求参数很多,那么我们使用上面的方法获取请求参数,需要申明很多的方法参数。但是我们可以将传递过来的请求参数封装成一个JavaBean,那么我们直接传入一个JavaBean对象即可接收全部的请求参数。
  • 声明一个User类,其中必须为每一个属性添加 set方法,并且其中的变量名要和表单中的name属性一致
public class User {
    private String username;
    private String password;
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
​
}
  • 那么我们此时的UserController中的login方法如下:
@RequestMapping(value = "/login.do")
    public String login(User user) {
        System.out.println(user);
        return "success";
    }

总结

  • 以上的所有方法并不冲突,可以混合使用
    /**
     * 混合使用案例
    */
    @RequestMapping(value = "/login.do")
    public String login(User user,@RequestParam("gender")String gender) {
        System.out.println(user);
        return "success";
    }
  • 不建议使用HttpServletRequest方法获取,另外的方法都是非常好用的方法,根据实际情况进行选取即可

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Spring容器创建对象的三种方式

3766
来自专栏java一日一条

Java 性能笔记:自动装箱/拆箱

如果我说“仅仅修改下面代码中的一个字符就可以获得五倍于当前的运行速度”你会怎么想呢?

801
来自专栏PHP实战技术

PHP垃圾回收机制

1、每一个变量定义时都保存在一个叫zval的容器里面,这里面包含了数量的类型和和值,还包含了一个refcount(理解为存在几个变量个数)和is_ref(理解为...

4045
来自专栏Java后端技术栈

如何在你的项目中使用JSR 303 - Bean Validation进行数值校验?

JSR-303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator。

2114
来自专栏博岩Java大讲堂

Java虚拟机--你的对象有多大如何计算对象大小

4495
来自专栏烂笔头

Python标准库笔记(8) — pprint模块

目录[-] pprint —— 更美观的打印数据结构 pprint 模块包含一个“美观打印器(PrettyPrinter)”,用于产生美观的数据结构视...

4755
来自专栏PHP实战技术

PHP垃圾回收机制

PHP垃圾回收机制 1、每一个变量定义时都保存在一个叫zval的容器里面,这里面包含了数量的类型和和值,还包含了一个refcount(理解为存在几个变量个数)和...

3274
来自专栏python3

习题22:更多的练习

这是函数的工作原理,记住函数内部的变量都是临时的,当你的函数返回以后,返回值可以被赋予一个变量,这里是创建了一个新变量,用来存放函数的返回值

961
来自专栏Linux驱动

C- unsigned :1之位域分析

做低层时,经常会读写寄存器,比如操作某位,设置为0或1,而在C语言中便为我们提供一种数据结构”位域”,使得我们通过读写”位域”来实现操作某位.

1214
来自专栏PHP实战技术

PHP垃圾回收机制

1、每一个变量定义时都保存在一个叫zval的容器里面,这里面包含了数量的类型和和值,还包含了一个refcount(理解为存在几个变量个数)和is_ref(理解为...

45210

扫码关注云+社区

领取腾讯云代金券