SpringMVC之数据传递一

之前的博客中也说了,mvc中数据传递是最主要的一部分,从url到Controller、从view到Controller、Controller到view以及Controller之间的数据传递。今天主要学习数据传递到Controller的几种方式.

一、从url传递

1.@RequestParam的使用

常见的url中会是?name=XXX&pwd=XXX的这种,如果想获取name,pwd,可以使用.@RequestParam。假如参数是可选参数,可以设置required=false,默认是true,value也要与url的对应。

    @RequestMapping(value="/index.do")
    public ModelAndView login(HttpServletRequest request,HttpServletResponse response,@RequestParam("name")String name,@RequestParam(value="pwd",required=false) String pwd){
        ModelAndView modelAndView = new ModelAndView("Index");
        System.out.println("name:"+name+" pwd:"+pwd);
        return modelAndView;
        }

2.@PathVariable的使用

有的url的格式是url/param1/param2这种,这种获取值可以使用.@PathVariable。

    @RequestMapping(value="/login/{name}/{pwd}",method=RequestMethod.GET)
    public ModelAndView login1(HttpServletRequest request,HttpServletResponse response,@PathVariable("name") String name,@PathVariable("pwd") String pwd){
        ModelAndView modelAndView = new ModelAndView("Index"); 
        System.out.println("name:"+name+" pwd:"+pwd);
        return modelAndView;
        }

 

上面两种传递值得方式也打印出了日志.第一个打印出了name,密码为null,第二种方式打印了name和pwd.

二、从view传递

这里主要用form表单演示。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

<form id="form1" name="myform" method="post" action="../../login.do" >
      用户:<input type="text" name="name"/>
      密码:<input type="password" name="pwd"/>
      <input type="submit"/>
 </form>
</body>
</html>
View Code

1.直接将请求参数名作为Controller中方法的形参

这里在Controller中设置参数是页面form表单控件的name属性。

    @RequestMapping(value="/login.do",method=RequestMethod.POST)
    public ModelAndView login2(HttpServletRequest request,HttpServletResponse response,String name,String pwd){
        ModelAndView modelAndView = new ModelAndView("Index"); 
        System.out.println("name:"+name+" pwd:"+pwd);
        return modelAndView;
        }

2.使用Pojo对象(就是封装的类,类中封装的字段作为参数)绑定请求参数值,原理是利用Set的页面反射机制找到User对象中的属性

这个使用pojo有点类似之前学的,我们可以定义一个User类,然后Controller的参数类型是User.form表单的action这里要注意下要设置成action="../../login3.do".

package com.cyw.web.model;

public class User {
    private String name;
    private String pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }


}
View Code
    @RequestMapping(value="/login3.do")
    public ModelAndView login3(HttpServletRequest request,HttpServletResponse response,User user){
        ModelAndView modelAndView = new ModelAndView("Index"); 
        System.out.println("name:"+user.getName()+" pwd:"+user.getPwd());
        return modelAndView;
        }

3.使用原生的Servlet API 作为Controller 方法的参数

不仅是通过view传到Controller,url传参数到Controller也一样.既然有HttpServletRequest,我们可以通过request对象获取相关参数。

        String username=request.getParameter("name");
        System.out.println("username:"+username);

4.传递数组

<form id="form1" name="myform" method="post" action="../../login.do" >
   <input type="checkbox" name="hobby" value="1" />跑步
    <input type="checkbox" name="hobby" value="2" />游泳
    <input type="checkbox" name="hobby" value="3" />麻将
    <input type="checkbox" name="hobby" value="4" /><input type="submit"/>
 </form>
</body>
</html>
    @RequestMapping(value="/login.do",method=RequestMethod.POST)
    public ModelAndView login2(HttpServletRequest request,HttpServletResponse response,String[] hobby){
        ModelAndView modelAndView = new ModelAndView("Index"); 
        for(int i=0;i<hobby.length;i++)
        {
            System.out.println("hobby:"+hobby[i]);
        }
        return modelAndView;
        }

4.时间传递

只需要在Controller中增加InitBinder然后页面传的时间格式需要与dateFormat 的一致。

    @InitBinder
    protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
<form id="form1" name="myform" method="post" action="../../login.do" >
      用户:<input type="text" name="name"/>
      密码:<input type="password" name="pwd"/>
      出生日期:<input type="date" name="birthday"/>
      <input type="submit"/>
 </form>

这里设置出生日期的type=date,可以在页面选择时间。然后在Controller中获取

    @RequestMapping(value="/login.do",method=RequestMethod.POST)
    public ModelAndView login2(HttpServletRequest request,HttpServletResponse response,String name, String pwd,Date birthday){
        ModelAndView modelAndView = new ModelAndView("Index"); 
        System.out.println("name:"+name+" pwd:"+pwd+" birthday:"+birthday);
        return modelAndView;
        }

三、小结

今天主要介绍了往Controller传参数的几种方法,在以后的博客中会介绍Controller向view传递数据等内容。

posted @ 2018-04-07 21:19  社会主义接班人  阅读(1036)  评论(0编辑  收藏  举报