接收表单数据有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}来获取项目名(/项目名的形式),否则会把后面的路径直接拼接到域名后面。

如果是SpringBoot,则不用加${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(@RequestParamint user_id,Model model){
model.addAttribute("user_id", user_id);
return "user_info";
} }

用@RequestParam修饰某个参数,表示这个参数是必需的,如果没有传递此参数,不会调用业务方法,直接报错。

如果请求参数的字段名和业务方法的形参名不一致,比如请求参数中的字段名是id,而业务方法中的形参名是user_id,则必须指定该形参与请求参数中的哪个字段绑定:

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

如果请求参数的字段名和业务方法的形参名一致,直接写@RequestParam就行,SpringMVC会自动把请求参数赋给业务方法中同名的形参。

注意:

必需和必填不是一个概念,必需是指请求参数中必须要有这个字段,只有要这个字段就行,值可以是空的。

如果一个表单字段(有name属性),没填就提交了,请求参数中是有这个字段的,只不过值是空的。

可以设置是否必需:

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

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

SpringMVC 接收表单数据、数据绑定、解决请求参数中文乱码的更多相关文章

  1. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)

    前述:      在写这篇笔记之前,对笔记中的设计模式进行介绍:      本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式           (1)装饰(包装)设计模式口诀:         ...

  2. 详解get请求和post请求参数中文乱码的解决办法

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  3. [原创作品] Express 4.x 接收表单数据

    好久没有写博客,从现在开始,将介绍用nodejs进行web开发的介绍.欢迎加群讨论:164858883. 之前的express版本在接收表单数据时,可以统一用res.params['参数名'],但在4 ...

  4. struts2自动接收表单数据

    提交页面主要代码: <form method="post" action="messageAction">   <input type=&qu ...

  5. java web项目get,post请求参数中文乱码解决

    [转载]原文地址:https://www.cnblogs.com/tom-plus/p/6392279.html 在开发过程中,有时候会碰到get,post请求参数中文乱码. 原因: Http请求传输 ...

  6. get请求和post请求参数中文乱码的解决办法

    get请求参数中文乱码的解决办法 在tomcat的server.xml里的Connector加个URIEncoding="UTF-8",把 <Connector connec ...

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

    利用$_POST超级全局变量接收表单的数据,然后利用echo输出到页面. 下面是代码: <!doctype html> <html> <head> <titl ...

  8. SpringMVC封装表单数据

    1.domain类 package com.xiaostudy.domain; public class User { private int id; private String username; ...

  9. JSP中解决获取请求参数中文乱码问题

    分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...

随机推荐

  1. 关于XMlHttpRequest对象

    //创建XMLHttpRequest对象的三种方法 1 var xhr = createXMLHttpRequest(); function createXMLHttpRequest(){ try{ ...

  2. 原生js按回车键实现登录

    这篇文章主要介绍了原生JS按回车键实现登录的方法,众所周知,这是在web程序设计中的一个非常实用的小技巧,主要用于表单提交,包括注册.登录等等功能,具有很好的用户体验,有着非常广泛的实用价值,需要的朋 ...

  3. Go语言基础之Path包与FilePath包

    文章引用自 path包的使用 package main; import ( "fmt" "path" ) //go语言path包的学习 func main() ...

  4. 微服务架构中的Redis

    了解如何将Redis与Spring Cloud和Spring Data一起使用以提供配置服务器,消息代理和数据库. Redis可以广泛用于微服务架构中.它可能是少数流行的软件解决方案之一,你的应用程序 ...

  5. Fluent_Python_Part3函数即对象,05-1class-func,一等函数,函数即对象

    一等函数 一等函数即将函数看作一等对象.一等对象满足一下条件: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 1. 一等函数 例子1. 证明function是 ...

  6. Golang核心编程

    源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...

  7. WLAN配置SKC

    1.关于SKC WLC支持粘滞密钥缓存(Sticky Key Caching,SKC). 通过SKC,客户端为其关联的每个AP接收并存储不同的PMKID. AP还维护发布给客户端的PMKID数据库. ...

  8. CF10D LCIS 最长公共上升子序列

    题目描述 This problem differs from one which was on the online contest. The sequence a1,a2,...,an a_{1}, ...

  9. pytorch资料

    torchvision是独立于pytorch的关于图像操作的一些方便工具库. torchvision的详细介绍在:https://pypi.org/project/torchvision/ torch ...

  10. subprocess.Popen()

    def run(): str_shell='ipconfig' sub=subprocess.Popen(args=str_shell,shell=True,stdin=subprocess.PIPE ...