就目前的情况来看,这个问题并不适合我们的问答形式。我们希望答案能得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或广泛讨论。如果您觉得这个问题可以改进,并可能重新打开,请访问帮助中心寻求指导。
8年前关门了。
我目前正在学习使用springmvc。在开发过程中,我使用了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作为类Map的requestbody
我最喜欢的方法,但并不总是可行的,因为我们需要编写多个类来 Package 发送的数据,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
}
赞成的意见
Map到所需对象
快速简单
欺骗
我们需要为发送到服务器的每个数据编写 Package 器
我现在只知道这些。我会感激你的批评,更好的解决方案或任何建议。谢谢!
3条答案
按热度按时间oyjwcjzk1#
(1) 基于pathvariable的请求
正如你所说的,你会遇到特殊角色的问题(例如
/
). 如果留短的话,基于路径的URL是最可读的。例如。,/hotel/{h}/room/{r}
. 有时path
以及request
参数用于表示mandatory
与optional
参数。(2) 带数据的请求
这将是一个很好的方法,让您可以灵活地添加/删除
Request Parameters
以及管理不同的参数组合。(3) 将json作为pathvariable发送到服务器
我认为这种方法的技术问题与
(1)
. 如果没有正确的转义(而spring在当前编写时无法处理)/
在任何形式)这一选择是不可行的。(4)
就是这样做的方法。(4) json作为类Map的requestbody
这对于复杂对象更为可取。通常,spring可以帮助您直接将jsonMap到java对象。折衷的办法是,它不能像在浏览器上那样容易地进行测试。我相信这是restful服务中的一种常见模式,尽管它不一定要求传输技术。
总之,
使用查询参数很简单,用户可以直接从浏览器地址栏测试服务。
在请求体中使用对象有助于获得处理复杂数据的灵活性,但无法从浏览器中轻松测试。
路径变量选项不适用于spring,除非格式良好的数据没有特殊字符,例如
/
已提交。iyzzxitl2#
我主要做1,2和4。
springroo将自动生成1、2和4的代码。
1、2和4在很大程度上取决于你是否在做一件事
POST
,GET
,PUT
,DELETE
(分别为积垢)。数字1-路径变量
几乎总是
GET
对于单个项目。这是读入积垢。数字2-请求参数
对于真正的rest,这应该是可选参数,比如分页列表或使用
GET
. 不应该有请求主体。为了
POST
它还用于老式的rest,最重要的是用于传统的html表单(aka)application/x-www-form-urlencoded
.这一点很重要,因为这一点对人们来说要容易得多
POST
比4强。第三,不要这样做。
其他人已经说明了原因。
第四,json请求主体
几乎每次都是这样
POST
以及PUT
(又名积垢的c和u)。它通常与PathVariable
指定哪些项目。这很难在浏览器中进行测试,并且需要您的客户端知道进行更新的有效格式。名称-值对比json/xml模式更容易记录和理解。
我做什么
最近我一直在做第2项工作,这样我就可以支持单页应用程序的html完全加载或json的仅数据加载。
我通过一个定制的视图解析器来实现,这样就不必为每个请求编写两个方法。
否则,您必须为每个请求创建两个方法(一个带有
application/json
另一个用于html)。z9gpfhce3#
我经常使用(2)和(4)方法。这是因为它的灵活性。(4)当我需要高耦合的数据,并希望验证输入容易,即与
@Valid
添加到控制器的方法参数的注解,我用来绑定发送的数据。