我目前正在学习使用Spring MVC。在开发过程中,我使用了四种不同的表单处理方式 Ajax& jQuery的即可。现在,我想知道每种方法的优点和缺点是什么。还有其他人吗?
假设我们有一个非常简单的表单,只有2个输入
<input id="name" type="text" value"Name">
<input id="active" type="checkbox">
<input type="button" onclick="submitForm()">
假设我们没有验证客户端和服务器站点上的数据。我们还将omitt处理返回的数据。我只对将数据发送到服务器感兴趣。 现在我们如何处理提交?我的解决方案是:
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 }
我认为优点
缺点
/
的问题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
}
赞成
缺点
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
}
赞成
缺点
这就是我目前所知道的。我会感激和批评,建议更好的解决方案或任何东西。谢谢!
答案 0 :(得分:2)
(1)基于PathVariable的请求
正如您所说,您将遇到特殊字符(例如/
)的问题。如果不做的话,基于路径的URL最易读。例如,/hotel/{h}/room/{r}
。有时,path
和request
参数的组合用于表示mandatory
与optional
参数。
(2)请求数据
这将是一个很好的方法,让您可以灵活地轻松添加/删除Request Parameters
以及管理不同的参数组合。
(3)将JSON作为PathVariable
发送到服务器
我认为此方法与(1)
存在相同的技术问题。如果没有正确的转义(并且当前写入的Spring无法以任何形式处理/
),则此选项不可行。 (4)
是这样做的方法。
(4)JSON为RequestBody,带有类映射
这对于复杂的对象更为可取。通常,spring可以帮助您直接将json映射到Java对象。权衡是它无法通过浏览器轻松测试。我相信这是RESTful服务中的常见模式,尽管它并不一定要求传输技术。
总之,
使用查询参数很简单,并且允许用户直接从浏览器地址栏测试服务。
使用请求正文中的对象有助于灵活处理复杂数据,但无法轻松地从浏览器进行测试。
路径变量选项与spring不相符,除非提交了没有/
等特殊字符的格式良好的数据。
答案 1 :(得分:2)
我经常使用(2)和(4)方法。
(2)因其灵活性。
(4)当我需要高耦合数据并想要轻松验证输入时,即将@Valid
注释添加到Controller的方法参数中,我用来绑定发送的数据。
答案 2 :(得分:2)
我主要做1,2和4。
Spring Roo会自动生成1,2和4的代码。
1,2和4在很大程度上取决于您是否正在执行POST
,GET
,PUT
,DELETE
(分别是CRUD)。
数字1 - 路径变量
对于单个项目几乎总是GET
。这是CRUD中的READ。
第2号 - 请求参数
对于真正的REST,这应该是可选参数,例如使用GET
分页列表或搜索过滤器。应该没有请求机构。
对于POST
,它也用于旧式REST,最重要的是用于传统HTML FORMS(又名application/x-www-form-urlencoded
。
这很重要,因为对于POST
而言,#{1}}比#4更容易做到这一点(#2)。
3号 - 不要这样做。
其他人已说明原因。
第4号 - JSON请求正文
这几乎总是为POST
和PUT
(也就是CRUD的C和U)完成。它通常与PathVariable
组合以指定哪个项目。
这很难在浏览器中测试,并且要求您的客户知道进行更新的有效格式。即。名称值对比JSON / XML模式更容易理解和理解。
我做什么
最近我一直在编号#2,因此我可以同时支持HTML full loads or data only loads of JSON for Single Page Applications。
我是通过自定义视图解析程序完成的,因此我不必为每个请求编写两种方法。
否则,您必须为每个请求创建两个方法(一个使用application/json
,另一个使用HTML)。
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json")
public Object doJson() {}
@RequestMapping(method = RequestMethod.POST)
public Object doHtml() { //after processing redirect. }