Spring MVC form提交
这篇文章从业务可能的角度记录 form请求的情况,主要涉及到Spring MVC的 @RequestParam注解
参考 HTTP中application/x-www-form-urlencoded字符说明 https://www.cnblogs.com/zeroingToOne/p/8992746.html
1.form请求的编码格式
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。
当enctype为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url
当enctype为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,浏览器就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
所以如果form请求,没有没有type=file的话,那么它的编码格式就是application/x-www-form-urlencoded 1.可以用@RequestParam注解获取参数,如果参数名没有特殊符号,也可以省略@RequestParam注解 直接用参数名来接收 2.如果这些参数是一个实体类的属性,也可以省略注解直接用也给实体类来接收。
准备两个实体类
public class Person {
private String userName;
private Long age;
private Book book;
//getter setter 方法,重写 toString方法
}
public class Book {
private String author;
private String name;
//getter setter 方法,重写 toString方法
}
2.form 提交一些参数/一个实体类
.jsp文件
<html>
<body>
<!-- <form id="forEntityPost" action="/SpringMVCDemo/formSubmit/forEntity" method="post"> -->
<!-- <form id="forParamPost" action="/SpringMVCDemo/formSubmit/forParam" method="post"> -->
<!-- <form id="forEntityGet" action="/SpringMVCDemo/formSubmit/forEntity" method="get"> -->
<form id="forParamGet" action="/SpringMVCDemo/formSubmit/forParam" method="get">
<div>userName<input type="text" name="userName" /></div>
<div>age<input type="text" name="age" /></div>
<div>bookName<input type="text" name="book.name" /></div>
<div>bookAuthor<input type="text" name="book.author" /></div>
<div><input type="submit" value="forGet" /></div>
</form>
<script type="text/javascript">
</script>
</body>
</html>
controller java文件 不管form的提交方式时get还是post,控制器方法都可以如下写。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.springmvcdemo.entity.Person;
@Controller
@RequestMapping("formSubmit")
public class FormController {
// 1.可以用@RequestParam注解获取参数,如果参数名没有特殊符号,也可以省略@RequestParam注解 直接用参数名来接收
@RequestMapping(value = "/forParam")
public String forPost(String userName, Long age, @RequestParam("book.name") String bookName,
@RequestParam("book.author") String bookAuthor) {
System.out.println("----------forParam--------userName==" + userName + "-aget==" + age
+ "--bookName==" + bookName + "bookAuthor==" + bookAuthor);
return null;
}
// 2.如果这些参数是一个实体类的属性,也可以省略注解直接用也给实体类来接收。
@RequestMapping(value = "/forEntity")
public String forEntityPost(Person person) {
System.out.println("------------forEntity------person==" + person.toString());
return null;
}
}
contoller 控制台输出log
get请求和post请求 虽然编码方式是一样的,所以在控制器中接收参数的方式是一样的。但是其实它们的参数组装方式不一样
get请求的参数是拼接在url中的。
post的参数是在请求体中
使用HttpServletRequest HttpServletResponse
@RequestMapping("/home")
public String hello(HttpServletRequest request,HttpServletResponse response) {
System.out.println(request.getParameter("username"));
return "home";
}