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

kam*_*mil 7 java jquery spring spring-mvc

我目前正在学习使用Spring MVC.在开发过程中,我使用Ajax和jQuery四种不同的表单处理方式.现在,我想知道每种方法的优点和缺点是什么.还有其他人吗?

假设我们有一个非常简单的形式,只有2个输入

<input id="name" type="text" value"Name">
<input id="active" type="checkbox">
<input type="button" onclick="submitForm()">
Run Code Online (Sandbox Code Playgroud)

假设我们没有验证客户端和服务器站点上的数据.我们还将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"
    });   
}
Run Code Online (Sandbox Code Playgroud)

还有控制器:

 @RequestMapping(value="/Submit/Name/{name}/Active/{active}/",method=RequestMethod.POST)
 publis void submitForm(@PathVariable String name, @PathVariable Boolean active)
 { //something not important here }
Run Code Online (Sandbox Code Playgroud)

在我看来,优点

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

缺点

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

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
    });   
}
Run Code Online (Sandbox Code Playgroud)

和控制器:

 @RequestMapping(value="/Submit/",method=RequestMethod.POST)
 publis void submitForm(@RequestParam(value="name") String name, @RequestParam(value="active") Boolean active)
 { //something not important here }
Run Code Online (Sandbox Code Playgroud)

在我看来,与第一种方法没有太大区别,但是:

优点

  • 请求地址越短

缺点

  • 具有许多参数的方法声明可能很大

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"
    });   
}
Run Code Online (Sandbox Code Playgroud)

和控制器

 @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
 }
Run Code Online (Sandbox Code Playgroud)

优点

  • 请求地址短
  • 简短的方法声明

缺点

  • 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)
    });
Run Code Online (Sandbox Code Playgroud)

和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
 }
Run Code Online (Sandbox Code Playgroud)

优点

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

缺点

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

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

Joh*_*erg 2

(1)基于PathVariable的请求

正如您所说,您会遇到特殊字符(例如/)的问题。基于路径的 URL 如果保持简短,则可读性最佳。例如,/hotel/{h}/room/{r}。有时,使用path和参数的组合来表示vs参数。requestmandatoryoptional

(2) 请求数据

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

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

我发现这种方法存在与 相同的技术问题(1)。如果没有适当的转义(并且 Spring 在撰写本文时无法/以任何形式处理),则此选项不可行。(4) 就是这样做的方法。

(4) JSON 作为带有映射类的 RequestBody

这对于复杂的对象来说是更可取的。通常spring可以帮助你直接将json映射到Java对象。缺点是无法通过浏览器轻松测试它。我相信这是 RESTful 服务中的常见模式,尽管它不一定规定传输技术。


总之,

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

  • 在请求正文中使用对象对于获得处理复杂数据的灵活性很有用,但不能轻松地从浏览器进行测试。

/除非提交没有特殊字符的格式正确的数据,否则路径变量选项与 spring 不兼容。