¿Que formas conocéis para pasar los valores de un formulario desde la vista al controlador usando ajax?
Sin utilizar ajax la idea es sencilla, un controlador que devuelve la vista pasando en el modelo un objeto, la vista tiene un formulario que representa este objeto ...cuando hacemos el submit el controlador obtiene ese objeto y persistimos...o lo que sea.
Supongamos que tenemos la siguiente clase:
public class Account {
private Long code;
private String name;
// getters y setters
}
El controlador recibe la primera petición y devuelve la vista del formulario:
@RequestMapping(value = '/edit', method = RequestMethod.GET)
public String getCreateForm(Model model) {
Account account= new Account();
model.addAttribute("account", account);
return 'form.jsp';
}
El formulario:
...
<spring:url value="/save" var="formUrl" />
<form:form modelAttribute="account" method="POST" action="${formUrl}">
<table>
<tr>
<td><form:label path="code">Codigo:</form:label></td>
<td><form:input path="code" id="code"/></td>
</tr>
<tr>
<td><form:label path="name">nombre:</form:label></td>
<td><form:input path="name" id="name"/></td>
</tr>
</table>
<input type="submit" value="Save" />
</form:form>
Finalmente el controlador recibe los valores:
@RequestMapping(value = '/save', method = RequestMethod.POST)
public String saveAccount(Model model, @Valid Account account, BindingResult result) {
System.out.println(account.getCode());
System.out.println(account.getName());
//...
}
La idea es buena, me gusta, es fácil de utilizar ... el código queda muy limpio...
Ahora vamos con ajax...y esta es mi duda...cual es la mejor forma de hacerlo?
1) Se pasa todo en en Path
Vista
function submitForm() {
var code = jQuery("#code").val();
var name = jQuery("#name").val();
jQuery.ajax("/save/Code/" + code + "/Name/"+ name + "/",
{
type:"POST"
});
}
Controlador
@RequestMapping(value="/save/Code/{code}/Name/{name}/",method=RequestMethod.POST)
publis void submitForm(@PathVariable String code, @PathVariable String name)
{
//...
}
2) Se pasa en un JSON
Vista
function submitForm() {
var name = jQuery("#name").val();
var active = jQuery("#active").is("checked");
var object = {name:name,active:active};
jQuery.ajax("/Save/",
{
type:"POST",
data: object
});
}
Controlador
@RequestMapping(value="/save/",method=RequestMethod.POST)
publis void submitForm(@RequestParam(value="code") String code, @RequestParam(value="name") String name)
{
//...
}
3) se pasa un JSON en el Path
function submitForm() {
var code = jQuery("#code").val();
var name = jQuery("#name").val();
var object = {code:code,name:name};
jQuery.ajax("/Submit/" + JSON.stringify(object),
{
type:"POST"
});
}
@RequestMapping(value="/save/{json}",method=RequestMethod.POST)
publis void submitForm(@RequestParam(value="code") String code, @RequestParam(value="name") String name)
{
//...
}
4) se pasa un json en el RequestBody que mapeamos con una clase
function submitForm() {
var code = jQuery("#code").val();
var name = jQuery("#name").val();
var object = {code:code,name:name};
jQuery.ajax("/Submit/",
{
type:"POST",
data:JSON.stringify(object)
});
@RequestMapping(value="/save/",method=RequestMethod.POST)
publis void submitForm(@RequestBody Account account)
{
//...
}
$("#account").submit(function() {
var account = $(this).serializeObject();
$.postJSON("account", account, function(data) {
//...
});
return false;
}
@RequestMapping(method=RequestMethod.POST)
public @ResponseBody Map<String, ? extends Object> create(@RequestBody Account account, HttpServletResponse response) {
//...
}
Una vez dicho esto...solo veo la 4 o 5 como mejores formas (aún no he trabajado con ellas)...descartando totalmente las anteriores.
¿Que formas utilizáis vosotros? Entiendo que deben haber mejores formas de pasar los datos de la vista al controlador.