SpringMVC 接收表单数据、数据绑定

接收表单数据有3种方式。

1、使用简单类型接收表单数据(绑定简单数据类型)

表单:

  <form action="${pageContext.request.contextPath}/userController/handler" method="post">
    用户名:<input name="username" type="text" /><br />
    密码:<input name="password" type="password" /><br />
    年龄:<input name="age" type="number" /><br />
    <button type="submit">提交</button>
  </form>

action会有提示,但我们需要在前面加${pageContext.request.contextPath}来获取项目名(/项目名的形式),否则会把后面的路径直接拼接到域名后面。

controller:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public ModelAndView handler(String username, String password, int age){
        ModelAndView mav = new ModelAndView("user_info");
        mav.addObject("username", username);
        mav.addObject("password", password);
        mav.addObject("age", age);
        return mav;
    }

}

参数名要和表单字段的name一致。

SpringMVC会自动将请求参数转换为需要的数据类型。

如果表单字段很多,业务方法要写很多参数,太麻烦,不推荐。


2、使用pojo类接收表单数据(绑定pojo类型)

pojo:

public class User {
    private String username;
    private String password;
    private int age;

    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;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

属性名要与表单字段的name一致。

controller:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public ModelAndView handler(User user){
        ModelAndView mav = new ModelAndView("user_info");
        mav.addObject("user", user);
        return mav;
    }

}

推荐使用。


3、使用扩展类接收表单数据(绑定pojo的包装类)

扩展类:

public class UserExt {
    private User user;
    //此处省略其它成员变量

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

把bean写为成员变量。

表单:

  <form action="${pageContext.request.contextPath}/userController/handler" method="post">
    用户名:<input name="user.username" type="text" /><br />
    密码:<input name="user.password" type="password" /><br />
    年龄:<input name="user.age" type="number" /><br />
    <button type="submit">提交</button>
  </form>

这里的user对应扩展类中的成员变量名。

controller:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public ModelAndView handler(UserExt userExt){
        ModelAndView mav = new ModelAndView("user_info");
        mav.addObject("userExt", userExt);
        return mav;
    }

}

使用扩展类接收参数,主要是表单传过来的数据有一些不属于实体类,还需要用其它的成员变量来接收。


单选框、复选框的数据接收

单选框可用普通类型来接收。

复选框常用于同时勾选多个选项,比如选择爱好、批量删除等(同一个name、多个value)。

复选框使用数组来接收,复选框的name要与数组名一致。

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public ModelAndView handler(String[] hobby){
        ModelAndView mav = new ModelAndView("user_info");
        mav.addObject("hobby",hobby);
        return mav;
    }

}

批量修改,使用List来接收

有时候我们需要批量插入、批量修改。

比如视图以表格的形式列出了多个用户的信息,管理员在页面上修改了多个用户的信息,现在要提交修改,需要使用List<User>来传递数据,批量添加也是一样的。

不能直接使用List<User>来接收参数,需要使用包装类包装一下。

包装类:

public class UserVO {
    private List<User> list;

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }
}

VO只有一个属性,及其getter、setter方法。

表单:

  <form action="${pageContext.request.contextPath}/userController/handler" method="post">
    User1:<br />
    username:<input name="list[0].username" type="text"><br />
    password:<input name="list[0].password" type="password"><br /><br />

    User2:<br />
    id:<input name="list[1].username" type="text"><br />
    name:<input name="list[1].password" type="password"><br /><br />

    <button type="submit">提交</button>
  </form>

此处list对应包装类的成员变量名。

controller:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public ModelAndView handler(UserVO userVO){
        ModelAndView mav = new ModelAndView("user_info");
        mav.addObject("list", userVO.getList());
        return mav;
    }

}

日期的接收

有时候需要接收表单传递的日期,比如生日。

后台有2种接收方式:

  • 使用String接收日期

如果不进行相关计算,使用String表示日期即可;如果要进行相关计算,先用String接收日期,在业务方法中把String转换为Date(可以封装为工具类,在业务方法中调用)。

表单使用<input type="text" />、<input type="date" />都可以,type="text"要严格校验日期格式。

  • 使用Date接收日期

表单使用<input type="text" />、<input type="date" />都可以,如果使用type="text",日期格式只能是 年/月/日 (/分隔)。


DataBinder   数据绑定

数据绑定的概念:将请求参数的内容与controller中业务方法的参数绑定,比如表单数据的提交。

数据绑定的流程:

(1)Spring MVC将ServletRequest对象传递给DataBinder

(2)Spring MVC从controller的业务方法的签名(声明)中获取参数表(形参名),把它传递给DataBinder

(3)DataBinder调用ConversionService对ServletRequest中的请求参数进行数据类型的转换、格式化

   ( ConversionService会根据  原始类型  ——目标类型  调用对应的Converter来进行数据转换。Spring MVC内置了常用的类型转换器,我们也可以自定义类型转换器。)

(4)DataBinder调用Validator校验已经被转换好的请求参数是否合法

(5)DataBinder调用BindingResult,把请求参数赋给业务方法中对应的参数,完成数据绑定。


解决前端传过来的数据中文乱码

使用spring mvc提供的编码过滤器,过滤所有请求。

在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>
    </filter>

    <!--过滤所有请求-->
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

@RequestParam   必需的请求参数

controller:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public String handler(int user_id,Model model){
        model.addAttribute("user_id", user_id);
        return "user_info";
    }

}

就算请求参数中没有user_id这个字段,也会调用这个业务方法来处理,就是说参数不是必需传递的。

如果参数是必需的,要求HTTP请求参数中必需要有这个字段,可以这样:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public String handler(@RequestParam("user_id") int user_id,Model model){
        model.addAttribute("user_id", user_id);
        return "user_info";
    }

}

在参数表的最前面加@RequestParam,里面写必需的请求参数。

如果没有传递此参数,不会调用业务方法,直接报错。

可以设置是否必需:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public String handler(@RequestParam(value = "user_id",required = false) int user_id,Model model){
        model.addAttribute("user_id", user_id);
        return "user_info";
    }

}

默认为true——必需,没传递该参数直接报错。

false——不是必需的,传不传递都行,都会调用业务方法。

可以设置默认值:

@org.springframework.stereotype.Controller
@RequestMapping("/userController")
public class UserController{

    @RequestMapping("/handler")
    public String handler(@RequestParam(value = "user_id",defaultValue = "0") int user_id,Model model){
        model.addAttribute("user_id", user_id);
        return "user_info";
    }

}

如果没有传递此参数,会自动使用默认值。

原文地址:https://www.cnblogs.com/chy18883701161/p/12244518.html

时间: 2024-10-10 21:14:18

SpringMVC 接收表单数据、数据绑定的相关文章

spring mvc 接收表单数据

---恢复内容开始--- 一个普通的表单. 表单的代码如下: <%@ 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/T

PHP利用超级全局变量$_GET来接收表单数据。

我们在linux上用 touch php_get.html php_get.php创建两个文件. php_get.html文件的代码如下: 1 <!doctype html> 2 <html> 3 <head> 4 <title>超级全局变量$_GET来接收提交的数据,然后返回信息</title> 5 <meta http-equiv="contnet-type" content="text/htm"

struts接收表单数据的3种方式

一.普通属性 1.将Action类作为一个POJO,直接进行接收 在Action类内部定义字段名称,并为之声明get/set方法.页面表单name属性与定义字段名称相同. package com.common.login; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class LoginAction extends ActionSupport{ private Str

2016 系统设计第一期 (档案一)MVC 控制器接收表单数据

1.FormCollection collection   user.UserId =Convert.ToInt32(collection["UserId"]); /// <summary> /// 更新 /// </summary> /// <param name="userId"></param> /// <param name="collection"></param>

如何发送HTML表单数据

多数时候,HTML表单的目的只是为了把数据发给服务器,之后服务器再处理这些数据并发送响应给用户.虽然看起来挺简单的,但我们还是得注意一些事情以确保传送的数据不会破坏服务器.或者给你的用户制造麻烦. 数据会到哪里去 关于客户端/服务器架构 整个web都是基于一种基本的客户端/服务器架构,该架构可以归纳如下: 一个客户端(通常是Web浏览器)使用HTTP协议发送一个请求给服务器(通常是web服务器程序,譬如Apache, Nginx, IIS, Tomcat等等),而服务器则以相同的协议响应这个请求

JSP简单练习-获取表单数据

在JSP中,server端程序与client交互最经常使用的方法就是採用表单提交数据.表单提交的方法主要有两种,一种是get方法.还有一种是post方法.两者最大的差别:使用get方法提交的数据会显示在浏览器的地址栏中,而post方法则不会显示,故post方法更为经常使用.表单中提交的数据能够是文本框.列表框及文本区域等. 使用request对象的getParameter()方法可得到表单中对应数据项的值. 下面为"获得表单数据"的代码: <!-- userRegist2.jsp

JSP简单练习-用Servlet获取表单数据

// javaBean代码 package servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class AcceptUserRegist extends HttpServlet { public String codeToString(String str) // 处理中文字符串的函数 { String s=str; try { byte tempB[]=s.getByt

【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引自:http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-1 By Mike Wasson|June 15, 2012 作者:Mike Wasson | 日期:2012-6-15 Part

jQuery通过AJAX快速提交表单数据

当表单数据项很多时,手动获取表单项的值将变得效率低下,结合jQuery提供的函数serialize(),我们可以实现快速获取数据并提交表单数据. 请看下面的表单: <form id="fm"> <table> <tr> <td>姓名</td> <td> <input type="text" name="name" /> </td> </tr>