【发布时间】:2012-08-20 12:19:43
【问题描述】:
我目前正在学习使用 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 }
我认为的优点
- 在 Controller 中接收数据的快捷方式,简单的注解使其工作
- 基本数据类型(字符串、布尔值、数字)的类型处理
缺点
- 请求地址随所需数据而增长
- 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
}
优点
- 映射到所需的对象
- 快速简单
缺点
- 我们需要为发送到服务器的每个数据编写包装器
这就是我目前所知道的。我将不胜感激和批评,提出更好的解决方案或任何建议。谢谢!
【问题讨论】:
-
在我看来,这不是一个适合问答的问题,你问了很多事情,其中大多数甚至不是全部都是非常主观的。
-
@FrançoisWahl,我同意这是一个边缘案例,但它仍然是一个有趣的问题,我认为 SO 最适合。
-
我不认为方法 4 的“骗局”是“骗局”。您的包装器对象可以被认为是您的域
Model(s) - SpringMVC 的M,您可能已经使用它,也许会持续存在于某个地方? Spring(和 Jackson)已经可以将嵌套的 JSON 转换/绑定到对象 - 请参阅 stackoverflow.com/questions/5900840/…。我认为您应该阅读 RESTful 服务,因为这可能有助于确定最佳方式。我倾向于在项目中使用 1. 和 4.。 -
@JohanSjöberg:你不认为它属于
Chatty, open-ended questions吗?特地求. I would appreciate and critism, suggestions for better solutions or anything.?啊,好吧,如果它对 OP 有帮助,您可以提供答案。一切都很好:)
标签: java spring jquery spring-mvc