【问题标题】:spring mvc ajax form post handling, possible methods and their pros and cons [closed]spring mvc ajax表单后期处理,可能的方法及其优缺点[关闭]
【发布时间】: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


【解决方案1】:

我主要做 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。

这很重要,因为人们为POST 执行此操作 (#2) 比 #4 更容易。

第 3 条 - 不要这样做。

其他人已经说明了原因。

数字 4 - JSON 请求正文

这几乎总是针对POST 和PUT(又名CRUD 的C 和U)完成。它通常与PathVariable 结合使用以指定哪些项目。

这很难在浏览器中进行测试,并且需要您的客户知道有效的格式才能进行更新。 IE。名称值对比 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. }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      (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 不匹配。

      【讨论】:

        猜你喜欢
        • 2015-11-18
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 2011-07-13
        • 2012-12-01
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多