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
方法获取,另外两种方法都是非常好用的方法,根据实际情况进行选取即可
- 那么我们此时的
- 如果传过来的请求参数很多,那么我们使用上面的方法获取请求参数,需要申明很多的方法参数。但是我们可以将传递过来的请求参数封装成一个
-
- 表单中的