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 @   社会主义接班人  阅读(1042)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示