我目前正在学习使用 Spring MVC。在开发过程中,我使用了四种不同类型的Ajax 和 jQuery表单处理。现在,我想知道每种方法的优点和缺点是什么。还有其他人吗?
假设我们有一个非常简单的表单,只有 2 个输入
<input id="name" type="text" value"Name">
<input id="active" type="checkbox">
<input type="button" onclick="submitForm()">
假设我们没有在客户端和服务器站点上验证数据。我们还将省略处理返回的数据。我只是对向服务器发送数据感兴趣。现在我们如何处理提交?我的解决方案是:
1.基于PathVariable的请求
JS 发送请求看起来像这样:
function submitForm() {
var name = jQuery("#name").val();
var active = jQuery("#active").is("checked");
jQuery.ajax("/Submit/Name/" + name + "/Active/"+ active + "/",
{
type:"POST"
});
}
还有控制器:
@RequestMapping(value="/Submit/Name/{name}/Active/{active}/",method=RequestMethod.POST)
publis void submitForm(@PathVariable String name, @PathVariable Boolean active)
{ //something not important here }
我认为的优点
- 在控制器中接收数据的快速方法,简单的注释使其工作
- 基本数据类型的类型处理(字符串、布尔值、数字)
缺点
- 请求地址随所需数据而增长
- url中的特殊字符有问题吗?不确定这个,但我记得我的队友
/
在发送到服务器的数据中用作字符时遇到问题
2. 带数据的请求
我不知道如何命名它,但这是 JS 文件中的想法:
function submitForm() {
var name = jQuery("#name").val();
var active = jQuery("#active").is("checked");
var object = {name:name,active:active};
jQuery.ajax("/Submit/",
{
type:"POST",
data: object
});
}
和控制器:
@RequestMapping(value="/Submit/",method=RequestMethod.POST)
publis void submitForm(@RequestParam(value="name") String name, @RequestParam(value="active") Boolean active)
{ //something not important here }
在我看来,与第一种方法没有太大区别,但是:
优点
- 较短的请求地址
缺点
- 带有许多参数的方法声明可能很大
3.将 JSON 作为 PathVariable 发送到服务器
在 JS 文件中:
function submitForm() {
var name = jQuery("#name").val();
var active = jQuery("#active").is("checked");
var object = {name:name,active:active};
jQuery.ajax("/Submit/" + JSON.stringify(object),
{
type:"POST"
});
}
和控制器
@RequestMapping(value="/Submit/{json}",method=RequestMethod.POST)
publis void submitForm(@RequestParam(value="name") String name, @RequestParam(value="active") Boolean active)
{
//now we are actually doing sth important here, cause we need to parse JSON
}
优点
- 短请求地址
- 简短的方法声明
缺点
- 我自己解析JSON
4.JSON 作为 RequestBody 与类映射
我最喜欢的方法,但并不总是可行的,因为我们需要编写多个类来包装发送的数据,JS:
function submitForm() {
var name = jQuery("#name").val();
var active = jQuery("#active").is("checked");
var object = {name:name,active:active};
jQuery.ajax("/Submit/",
{
type:"POST",
data:JSON.stringify(object)
});
和Java代码:
public class Wrapper {
private String name;
private Boolean active;
//getters and setters
}
@RequestMapping(value="/Submit/",method=RequestMethod.POST)
publis void submitForm(@RequestBody Wrapper wrapper)
{
//all data available with Wrapper class
}
优点
- 映射到所需对象
- 快速简单
缺点
- 我们需要为发送到服务器的每个数据编写包装器
这就是我目前所知道的。我将不胜感激和批评,提出更好的解决方案或任何建议。谢谢!