spring mvc ajax form post handling,可能的方法及其优缺点

时间:2012-08-24 23:16:38

标签: java spring jquery spring-mvc

我目前正在学习使用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 }

我认为优点

  • 快速获取Controller中的数据,简单的注释使其有效
  • 基本类型数据的类型加工(字符串,布尔值,数字)

缺点

  • 请求地址随着所需数据而增长
  • 网址中的特殊字符问题?不确定这一个,但我记得我的队友在发送给服务器的数据中用作/的问题

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
 }

赞成

  • 映射到所需对象
  • 快捷简单

缺点

  • 我们需要为发送到服务器的每个数据编写包装器

这就是我目前所知道的。我会感激和批评,建议更好的解决方案或任何东西。谢谢!

3 个答案:

答案 0 :(得分:2)

  

(1)基于PathVariable的请求

正如您所说,您将遇到特殊字符(例如/)的问题。如果不做的话,基于路径的URL最易读。例如,/hotel/{h}/room/{r}。有时,pathrequest参数的组合用于表示mandatoryoptional参数。

  

(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在很大程度上取决于您是否正在执行POSTGETPUTDELETE(分别是CRUD)。

数字1 - 路径变量

对于单个项目几乎总是GET。这是CRUD中的READ。

第2号 - 请求参数

对于真正的REST,这应该是可选参数,例如使用GET分页列表或搜索过滤器。应该没有请求机构。

对于POST,它也用于旧式REST,最重要的是用于传统HTML FORMS(又名application/x-www-form-urlencoded

这很重要,因为对于POST而言,#{1}}比#4更容易做到这一点(#2)。

3号 - 不要这样做。

其他人已说明原因。

第4号 - JSON请求正文

这几乎总是为POSTPUT(也就是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. }