6

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

优点

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

缺点

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

这就是我目前所知道的。我将不胜感激和批评,提出更好的解决方案或任何建议。谢谢!

4

3 回答 3

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 表单(又名application/x-www-form-urlencoded.

这很重要,因为人们做这个(#2)POST比#4容易得多。

3 号 - 不要这样做。

其他人已经说明了原因。

数字 4 - JSON 请求正文

这几乎总是针对 aPOSTPUT(也就是 CRUD 的 C 和 U)完成。它通常与 a 结合PathVariable以指定哪些项目。

这很难在浏览器中进行测试,并且需要您的客户知道有效的格式才能进行更新。IE。名称值对比 JSON/XML 模式更容易记录和理解。

我所做的

最近我一直在做#2,这样我就可以支持单页应用程序的 HTML 完整加载或 JSON 的仅数据加载

我通过自定义视图解析器来完成,这样我就不必为每个请求编写两种方法。

否则,您必须为每个请求创建两种方法(application/json一种用于 HTML,另一种用于 HTML)。

@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json")
public Object doJson() {}

@RequestMapping(method = RequestMethod.POST)
public Object doHtml() { //after processing redirect. }
于 2012-08-26T01:45:56.613 回答
2

我经常使用 (2) 和 (4) 方法。(2) 因为它的灵活性。(4) 当我需要高耦合数据并想要轻松验证输入时,即@Valid添加注释到控制器的方法参数中,我用来绑定发送的数据。

于 2012-08-25T05:37:02.403 回答
2

(1) 基于PathVariable的请求

正如您所说,您会遇到特殊字符(例如/)的问题。如果保持简短,基于路径的 URL 是最易读的。例如,/hotel/{h}/room/{r}。有时,pathrequest参数的组合用于表示mandatoryvsoptional参数。

(2) 带数据的请求

这将是一种很好的方法,让您可以灵活地轻松添加/删除Request Parameters以及管理不同的参数组合。

(3) 将 JSON 作为 PathVariable 发送到服务器

我认为这种方法存在与(1). 如果没有适当的转义(并且在撰写本文时 Spring 无法/以任何形式处理),此选项是不可行的。(4) 这样做的方法。

(4) JSON 作为 RequestBody 与类映射

对于复杂的对象,这将是更可取的。通常,spring 可以帮助您将 json 直接映射到 Java 对象。权衡是它不能从浏览器中轻松测试。我相信这是 RESTful 服务中的一种常见模式,尽管它不一定规定传输技术。


总之,

  • 使用查询参数很简单,用户可以直接从浏览器地址栏测试服务。

  • 在请求正文中使用对象有助于灵活处理复杂数据,但不能从浏览器轻松测试。

/除非提交了没有特殊字符的格式良好的数据,否则路径变量选项与 spring 不匹配。

于 2012-08-24T23:33:42.030 回答