Spring MVC实战系列教程(2)--常用请求参数接收方式

      在MVC结构中,控制器组件主要的功能就是接收请求、处理请求、生成响应,接收客户端传来的请求参数的往往是控制器要做的第一件事,本节就介绍下spring mvc接收请求参数的几种常用方式。

     (一)直接用方法参数名映射客户端请求参数(也就是查询字符串querystring)
     与Struts2类似,spring mvc也可以通过按照与HTTP请求中的参数名相一致的java代码的的变量名字来自动接收参数,只不过struts2是用的属性(成员变量),spring mvc用的方法参数(局部变量)。看示例代码:
@Controller
@RequestMapping("/paramPassDemo")
public class ParamPassDemo {
    @RequestMapping("/queryString")
    public String test1(String userName,String userPass,int age){
        System.out.println("用户名为:"+userName+",密码为:"+userPass+"年龄为:"+age);
        return "index";
    }
 

这里我们简单传入用户名、密码、年龄三个参数到spring mvc的控制器组件(注意,我们在类和方法上都是用了@RequestMapping注解,那么,该方法最终访问的URL就是类上标注的URL+方法上标注的URL)。这三个方法参数会自动接收同名的请求参数。比如,是用如下URL访问test1:

localhost:8088/HelloSpringMVC/paramPassDemo/queryStringWithSpecName?userName=张三&userPass=123&age=21

程序输出就是用户名为:张三,密码为:123,年龄为:21。这种方式实际上就是COC(约定优于配置)思想的体现,spring mvc框架通过反射自动匹配与请求参数名一致的方法参数名,并且对于非字符串类型的参数也可以自动转换(如int型的age),无需额外配置就可以方便地完成传参。

   那么,如果某个请求参数没有传过来怎么办?大家可以自行实验一下,将用户名或者密码不传,那么在控制器中接收到的就是null。如果年龄(age)不传呢?则会报一个500错误,说不能把age参数转换为null。说明,对于没有传过来的参数,spring mvc默认是以null作为默认值, 由于age类型是基本数据类型Int,则无法设为null。所以在spring mvc开发中不要使用基本数据类型作为方法参数,如果需要使用整型之类的参数应使用其对应的包装类,这样,如果请求参数不存在,spring mvc将自动为其设置为null,比如这个例子,age改为Integer类型即可,请大家自行实验。(当然这个场景中也可以通过设置@required标签将参数设为可选,这个以后我们再介绍)


Spring MVC实战系列教程(2)--常用请求参数接收方式

引用类型的参数不存在,spring mvc会自动为其设置为null


Spring MVC实战系列教程(2)--常用请求参数接收方式
 如果基本类型的参数不存在,则会抛出非法参数异常
 

(二)通过@RequestParam注解来辅助请求参数的接收

      如果客户端请求参数与你方法的参数名确实不一样,也可以用@RequestParam注解来具体指定映射哪一个请求参数,该注解写在方法参数前面,比如:

@RequestMapping("/queryStringWithSpecName")
    public String test2(@RequestParam("userName1") String userName,@RequestParam("userPass1")   String userPass){
        System.out.println("用户名为:"+userName+",密码为:"+userPass);
        return "index";
    }
注解里的字符串表示客户端传过来的参数name,也一样可以自动填充方法参数

(三)使用领域对象接收参数

     一个交互流程中有可能要接收的参数比较多,一个一个方法入餐写会比较麻烦,也不利于复用,spring mvc能不能像struts2一样把参数都作为业务属性封装在一个领域对象里呢,答案是肯定的,看下面的例子:

@RequestMapping("/queryStringWithDomainObj")
    public String test3(User user){
        System.out.println("用户名为:"+user.getUserName()+",密码为:"+user.getUserPass()+"年龄为:"+user.getAge());
        return "index";
    }

其中User类是自定义的一个领域对象,也可以叫值对象(VO),User中封装了userName, userPass等属性。那么在接收时spring mvc会利用反射自动将请求参数名同领域对象的属性名进行映射并填充值,即自动完成装箱。如果传值成功,在方法体里的领域对象不仅被实例化了,而且也拥有了响应属性值。user对象的结构如下:

public class User {
    private String userName;
    private String userPass;
    private Integer age;

    getters/setters...

}

(四)使用URL动态参数方式接收参数

     把请求参数作为URL一部分(不是querystring)传到控制器,又称为路径参数。比如,我们可以这样写:

   @RequestMapping("/user/query/{userId}")
    public String test4(@PathVariable("userId") Integer userId){
        System.out.println("用户id:"+userId);
        return "index";
    }

 这里的{userId}是个占位符,在实际请求时会被URL中相应部分替换,并且在方法参数中使用@PathVariable注解指定该参数要接收的占位符名称。比如实际访问URL为:

localhost:8088/HelloSpringMVC/user/query/101,此时占位符{userId}则被101替换,并且自动传递到标注了@PathVariable("userId")的参数,当然数据类型也自动转换了。这就是流行的restful风格的URL,请大家自行实验。

(五)使用HttpServletRequest接口获取参数
     如果你还是念念不忘原生的servlet,spring mvc也提供了传统的HttpServletRequest方式获取参数。

   @RequestMapping("/queryUser")
    public String test5(HttpServletRequest request){
        System.out.println("用户id:"+request.getParameter("userId"));
        return "index";
    }

这个方法直接将HttpServletRequest作为参数,访问时spring mvc会自动将该接口实例化,这样就可以用传统的request.getParameter的方式获取参数了。

总结:本节介绍了spring mvc框架获取客户端参数的几种常见方式,都非常简单,下节将接受spring mvc控制器向客户端生成响应的常用方式。本节完整的代码上传到附件中。


    

相关推荐