我们以用户登录为例,用户登录涉及两个参数:

账号:userName
密码:passWord

相应的前台源码:

<form action="login">  
    帐号:<input type="text" name="userName" > <br/>  
    密码:<input type="text" name="password" > <br/>  
    <input type="submit" value="登录">  
</form>

方法1:参数直接获取
ps: 函数参数名与请求参数名必须保持一致。

@RequestMapping("/login")  
public String login(String userName,String password){  
    System.out.println("方法1:参数直接获取");  
    System.out.println("userName:"+userName);  
    System.out.println("password:"+password);         
    return "loginSuccess";  
}

方法2:利用@RequestParam获取
使用@RequestParam从路径获取变量,URL中参数传递方式为 HTTP地址后加上?userName=tom&passWord=123 进行参数绑定。问号的后面部分就是请求参数部分,是要向请求路径提交的参数信息。
ps:接收参数名可以随意取,通过注解@RequestParam(“userName”)指明即可。
1.url请求

http://localhost:8080/springmvc/login?userName=tom&passWord=123

2.后台接收

@RequestMapping("/login")  
public String login(@RequestParam("userName") String xm,@RequestParam("password") String mm){  
    System.out.println("方法2:参数绑定获取");  
    System.out.println("userName:"+xm);  
    System.out.println("password:"+mm);          
    return "loginSuccess";  
}

方法3:利用@PathVariable获取请求路径中的参数
使用@PathVariable能够识别URL里面的一个模板,URL中参数传递方式为 HTTP地址后直接加上/参数值 如/123 来进行参数绑定。
1.url请求

// 7954和5684就可以作为两个路径变量 
http://localhost:8080/SpringMVC/hello/1234/5678

2.后台接收

@RequestMapping("/hello/{id}/{num}")
    public String getDetails(
    @PathVariable(value="id") String id,
    @PathVariable(value="num") int num){
.......
}

接收到路径变量之后SpringMVC可以自动将URL字符中的字符串转换为参数指定格式,例如5678会自动解析为对应的int类型.

方法4:@RequestParam加@PathVariable获取请求路径中的参数
1.url请求

http://localhost:8080/springmvc/hello/101?param1=10¶m2=20

2.后台接收

@RequestMapping("/hello/{id}")
    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

方法5:通过对象获取
ps:建立一个对象,属性名对应请求参数名保持一致,并生成相应的getter()和setter()方法。

1.建立对象User:

public class User {  
    private String userName;         
    private String password;   
  
    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;  
    }  
}

2.后台对象作为形参接收

@RequestMapping("/login")  
public String login(User u){  
    System.out.println("方法5:对象获取");  
    System.out.println("loginName:"+u.getLoginName());  
    System.out.println("password:"+u.getPassword());          
    return "loginSuccess";  
}

springMVC的@RequestParam注解和@PathVariable注解的区别

@RequestParam注解和@PathVariable注解的区别,从字面上可以看出前者是获取请求里边携带的参数;后者是获取请求路径里边的变量参数。

(例如:127.0.0.1/user/{userId}?userName=zhangshan,userId是路径上的变量,userName才是请求参数信息)

1.@RequestParam注解

@RequestParam有三个参数:

value:参数名;

required:是否必需,默认为true,表示请求参数中必须包含该参数,如果不包含抛出异常。

defaultValue:默认参数值,如果设置了该值自动将required设置为false,如果参数中没有包含该参数则使用默认值。

示例:@RequestParam(value = "userId", required = false, defaultValue = "1")

2.@PathVariable注解

当使用@RequestMapping URI占位符映射时,Url中可以通过一个或多个{xxxx}占位符映射,通过@PathVariable可以绑定占位符参数到方法参数中。

例如:@PathVariable("userId") Long userId,@PathVariable("userName") String userName

(注:Long类型可以根据需求自己改变String或int,spring会自动做转换)

@RequestMapping(“/user/{userId}/{userName}/query")

请求URL:http://localhost/user/8/张山/query

@PathVariable小误区:

在有些参考资料中说,如果定义的参数名和占位符中的名称是相同的,则可以将 @PathVariable(xxxx) 简写为:@PathVariable,这其实是错误的!

因为在正常编译时,Java类反射对象是不包含方法的入参名称的,如果编译时将debug打开(javac –debug=no),方法的入参名称会记录到类中。