天天看点

SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)

SpringMVC之参数绑定(上)

众所周知,springmvc是用来处理页面的一些请求,提交请求的数据是通过方法形参来接收的。从客户端请求的 key/value 数据,经过参数绑定,将 key/value 数据绑定到 Controller 的形参上,然后在 Controller 就可以直接使用该形参,最终再将数据再通过视图返回给用户的,在这一篇博文中,将总结一下springmvc中如何接收前台页面的参数,即springmvc中的参数绑定问题。

1、默认支持的类型

SpringMVC 有支持的默认参数类型,我们直接在形参上给出这些默认类型的声明,就能直接使用了。如下:

①、HttpServletRequest 对象

②、HttpServletResponse 对象

③、HttpSession 对象

④、Model/ModelMap 对象 

  

在参数绑定过程中,如果遇到上面类型就直接进行绑定。也就是说,我们可以在controller的方法的形参中直接定义上面这些类型的参数,springmvc会自动绑定。

看一个简单的例子:

Controller代码:

@Controller
public class MyController {
    @RequestMapping("/first")
    public ModelAndView test(HttpServletRequest request, HttpServletResponse response, HttpSession session,
                             Model model , ModelMap modelMap) throws Exception{
        request.setAttribute("requestParam","request类型");
        session.setAttribute("sessionParam", "session类型");
        model.addAttribute("modelParam", "model类型");
        modelMap.addAttribute("modelMapParam", "modelMap类型");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("show");
        return mv;
    }
}
           

这里要说明一下的就是Model/ModelMap对象,Model是一个接口,ModelMap是一个接口实现 ,作用是将Model数据填充到request域,跟ModelAndView类似。

show.jsp页面:

<body>
  show页面:<br>
   request:   ${requestParam}<br>
   session:   ${sessionParam}<br>
   model:   ${modelParam}<br>
   modelMap:   ${modelMapParam}<br>
</body>
           

然后访问页面,结果如下:

SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)
2、绑定简单类型(通过参数直接绑定前台的数据)

我们只需将请求的参数名称 和处理器方法的形参保持一致, SpringMVC会自动将请求的参数和形参进行绑定(简化了request 获取参数的过程):

表单页面:

<form method="post" action="two">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交"><br>
</form>
           

Controller:

@RequestMapping("/two")
    public ModelAndView test2(String name, int age) throws Exception{
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", name);
        mv.addObject("age", age);
        mv.setViewName("showEasy");
        return mv;
    }
           
SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)
SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)

在上面的绑定中,有一个要求,表单中字段的 name 、age属性要和接口中的变量名一一对应,才能映射成功,否则服务端接收不到前端传来的数据。有一些特殊情况,我们的服务端的接口变量名可能和前端不一致,这个时候我们可以通过 @RequestParam 注解来解决。

@RequestParam这个注解的的功能主要有三方面:

  1. 给变量取别名
  2. 设置变量是否必填
  3. 给变量设置默认值

JSP页面代码不变,保持原样,Controller 代码如下:

@RequestMapping("/two")
    public ModelAndView test2(@RequestParam(value = "name") String username, int age) throws Exception{
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", username);
        mv.addObject("age", age);
        mv.setViewName("showEasy");
        return mv;
    }
           

注解中的 “name” 表示给 username这个变量取的别名,也就是说,username将接收前端传来的 name 这个变量的值。在这个注解中,还可以添加 required 属性和 defaultValue 属性,如下:

@RequestMapping("/two")
    public ModelAndView test2(@RequestParam(value = "name", required = true,defaultValue = "yunzhongmanbu") String username, int age) throws Exception{
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", username);
        mv.addObject("age", age);
        mv.setViewName("showEasy");
        return mv;
           

required 属性默认为 true,即只要添加了 @RequestParam 注解,这个参数默认就是必填的,如果不填,请求无法提交,会报 400 错误,如果这个参数不是必填项,可以手动把 required 属性设置为 false。但是,如果同时设置了 defaultValue(如果没有请求参数与之对应的默认值),这个时候,前端不传该参数到后端,即使 required 属性为 true,它也不会报错。

解决获取请求参数中文乱码问题:

在上面的示例中,POST 请求传上来的中文会乱码,所以,我们在 web.xml 中再额外添加一个编码过滤器,最好将其设置在其他过滤器之前,因为过滤器是按照web.xml中的顺序执行的::

<!--字符编码过滤器-->
<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>

    <!--强制指定字符编码,即如果在request中指定了字符编码,那么也会为其强制指定当前设置的字符编码-->
    <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的源码中看到forceEncoding如果设置为true的话,那么不论你是否在request中设置了字符编码,spring mvc都会强制将其字符编码设置为我们在web.xml文件中写的字符编码。

参数绑定支持的基本数据类型有:

一、byte,占用一个字节,取值范围为 -128-127,默认是“\u0000”,表示空
二、short,占用两个字节,取值范围为 -32768-32767
三、int,占用四个字节,-2147483648-2147483647
四、long,占用八个字节,对 long 型变量赋值时必须加上"L"或“l”,否则不认为是 long 型
五、float,占用四个字节,对 float 型进行赋值的时候必须加上“F”或“f”,如果不加,会产生编译错误,因为系统
自动将其定义为 double 型变量。double转换为float类型数据会损失精度。float a = 12.23产生编译错误的,float a = 12是正确的
六、double,占用八个字节,对 double 型变量赋值的时候最好加上“D”或“d”,但加不加不是硬性规定
七、char,占用两个字节,在定义字符型变量时,要用单引号括起来
八、boolean,只有两个值“true”和“false”,默认值为false,不能用0或非0来代替,这点和C语言不同
           

此外,字符串string类型和基本类型的包装器类型同样也是支持的。

问题:我们这里的参数是基本数据类型,如果从前台页面传递的值为null 或 “”的话,那么会出现数据转换的异常,就是必须保证表单传递过来的数据不能为null或”",所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。

SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)

如果前台年龄这里不填直接提交请求,那么将穿到后台一个空字符串“”,而我们后台接受的却是一个int类型的参数,将报错:

SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)

所以 最好将参数数据类型定义成包装类型:

以上面代码为例,如果表单中age为”"或者表单中无age这个input,那么,Controller方法参数中的age值则为null。

SpringMVC框架学习(九)——参数绑定(上)SpringMVC之参数绑定(上)