在业务中,可能因为表单内容过于庞大,字段过于繁杂,如果人为去拼接的话 ,需要耗费大量的时间和精力,与此同时,代码看上去也是冗余不堪。

所以,提交表单的时候如果能整个表单数据整体提交,那是非常开心的事情。

同时,有时候会有需求在前台提交给后台数据之后,希望后台能在处理之后返回数据给前台,可能是标识也好,可能是具体的数据也罢。

这时候又需要使用ajax去提交数据。【因为使用jQuery的submit()方法是没有回调函数的,那个函数只是当表单发生提交时,要同时执行的函数而已,例如:$("#poFromId").submit()】

那能不能使用ajax进行局部页面刷新的同时将整个表单的数据提交呢?

答案肯定是可以的,

首先,咱们把整个的一圈代码给出来:

1.jsp页面

 <form action="../department/addPosition.htmls" method="post"  role="form" id="poFromId" >
<div class="form-group">
<label class="col-md-3 control-label">职位名称</label>
<div class="col-md-9" style="width: 77%">
<input type="hidden" name="positionId" />
<input type="hidden" name="positionCre" />
<input type="text" class="form-control" name="positionName" placeholder="eq:软件开发工程师" data-bv-trigger="keyup" />
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">职位所属等级</label>
<select class="selectpicker input input-big" name="positionGrade">
<option value="专员">专员</option>
<option value="经理">经理</option>
<option value="总监">总监</option>
</select>
</div>
<hr/>
<div class="form-group center">
<button type="button" class="btn btn-success positionUp">提交职务</button>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<button type="reset" class="btn btn-warning">重置页面</button>
</div>
</form>

2.js  表单整体使用ajax提交部分

 /**
* 提交职位
*/
$(".positionUp").click(function(){
$("input[name='positionId']").val(UUID());
$("input[name='positionCre']").val(parent.departmentId);
var position = $("#poFromId").serialize(); $.getJSON("../department/addPosition.htmls?"+position,function(data){
if(data){
layer.msg('添加成功', {
icon: 1,
time: 2000
}, function(){
});
parent.layer.close(parent.positionAdd);
}
}); });

3.controller后台接收部分

 @RequestMapping("addPosition")
@ResponseBody
public boolean addPosition(Position position){
position.setCreateDate(new Timestamp(System.currentTimeMillis()));
position.setUpdateDate(new Timestamp(System.currentTimeMillis()));
//操作人 未插入
positionService.save(position); return true;
}

4.上面表单中name对应的实体Position

 package com.agen.entity;

 import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /**
* Position 岗位表
*/
@Entity
@Table(name = "position", catalog = "performance")
@JsonIgnoreProperties(value = {"positionchanges"})
public class Position implements java.io.Serializable { // Fields private String positionId;
private String positionName; //岗位名称
private String positionGrade; //岗位对应等级
private Timestamp createDate;
private Timestamp updateDate;
private String operation;
private String positionCre; //岗位所属部门
private Set<Positionchange> positionchanges = new HashSet<Positionchange>(0); // Constructors /** default constructor */
public Position() {
} /** full constructor */
public Position(String positionName, String positionGrade,
Timestamp createDate, Timestamp updateDate, String operation,
String positionCre, Set<Positionchange> positionchanges) {
this.positionName = positionName;
this.positionGrade = positionGrade;
this.createDate = createDate;
this.updateDate = updateDate;
this.operation = operation;
this.positionCre = positionCre;
this.positionchanges = positionchanges;
} // Property accessors
//@GenericGenerator(name = "generator", strategy = "uuid.hex")
@Id
//@GeneratedValue(generator = "generator")
@Column(name = "positionID", unique = true, nullable = false, length = 36)
public String getPositionId() {
return this.positionId;
} public void setPositionId(String positionId) {
this.positionId = positionId;
} @Column(name = "positionName", length = 30)
public String getPositionName() {
return this.positionName;
} public void setPositionName(String positionName) {
this.positionName = positionName;
} @Column(name = "positionGrade", length = 20)
public String getPositionGrade() {
return this.positionGrade;
} public void setPositionGrade(String positionGrade) {
this.positionGrade = positionGrade;
} @Column(name = "createDate", length = 0)
public Timestamp getCreateDate() {
return this.createDate;
} public void setCreateDate(Timestamp createDate) {
this.createDate = createDate;
} @Column(name = "updateDate", length = 0)
public Timestamp getUpdateDate() {
return this.updateDate;
} public void setUpdateDate(Timestamp updateDate) {
this.updateDate = updateDate;
} @Column(name = "operation", length = 36)
public String getOperation() {
return this.operation;
} public void setOperation(String operation) {
this.operation = operation;
} @Column(name = "positionCre", length = 500)
public String getPositionCre() {
return this.positionCre;
} public void setPositionCre(String positionCre) {
this.positionCre = positionCre;
} @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "position")
public Set<Positionchange> getPositionchanges() {
return this.positionchanges;
} public void setPositionchanges(Set<Positionchange> positionchanges) {
this.positionchanges = positionchanges;
} }

接下来,咱们要细细谈一谈这上面需要注意的小细节:

1.首先,如果你想使用js控制提交整个表单,那最起码的,页面中不能存在元素的name=submit的,当然最下面的提交按钮也不能使用type=submit了,因为你想在js中处理之后再去使用js提交表单数据嘛!!

2.其次,js中,获取整体的表单数据,使用了var position = $("#poFromId").serialize();序列化的方法去获取整个表单的数据!!

3.再者说,既然你讲前后台表单数据传输交给spring去管理了,那最起码的要求,你得在form表单中将实体中规定不能为null的字段值都给上,同样的,如果你想前台传递给后台,后台直接拿到的就是一个字段都比较完整的实体对象,那表单中的name就要尽量多的和实体中的字段值保持一致;

4.对于第3点中,可能会出现,实体中的某个属性也是个实体,例如:【注册的时候,User实体需要选择是哪个部门的,而Department实体在注册页面上,也就是个下拉框,也就是个departmentId而已,对于这种情况,我们可以将name设置为其他的,在后台单独接收这个name对应的值,然后将departmentId实例化成Department对象,再赋值给User实体】

5.注意ajax中,data部分是:$.getJSON("../department/addPosition.htmls?"+position,拼接的,而不是$.getJSON("../department/addPosition.htmls",{position:position},给出的。这就需要试验一下,两种方式最后请求的地址是什么样子的;

6.Controller中,这里需要返回数据给前台,才使用了@ResponseBody这个注解;而就算你返回是void的,不希望给前台返回值,也需要@ResponseBody。不然,spring会认为你要去找那一串地址,会无休止的找下去,就会报错。

这里接着说:

上面那个表单,数据量很小,如果提交的是个大表单,那么就不能采用上面这种ajax的写法了,而是:

  var xmlDocument = [create xml document];
$.ajax({
url: "page.php",
processData: false,
data: xmlDocument,
success: handleResponse
});

使用jQuery中最原始的ajax的写法,这样就可以保证大量的数据传递给后台了。

【ajax 提交表单】多种方式的注意事项的更多相关文章

  1. Jquery ajax提交表单几种方法

    在jquery中ajax提交表单有post与get方式,在使用get方式时我们可以直接使用ajax 序列化表单$('#表单ID').serialize();就行了,下面我来介绍两个提交表单数据的方法. ...

  2. lavarel框架中如何使用ajax提交表单

    开门见山,因为laravel以post形式提交数据时候需要加{{csrf_field()}}防止跨站攻击,所以当你用ajax提交表单时候自然也要加 在网上看了很多的解决方式,我是用下面这种方法解决的: ...

  3. Jquery ajax提交表单几种方法详解

    [导读] 在jquery中ajax提交表单有post与get方式,在使用get方式时我们可以直接使用ajax 序列化表单$( 表单ID) serialize();就行了,下面我来介绍两个提交表单数据的 ...

  4. ajax提交表单序列化(serialize())数据

    知识点: $("#form").serialize();将表单数据序列化为标准URL编码文本字符串(key1=value1&key2=value2…). 以下用一个例子来演 ...

  5. ajax提交表单、ajax实现文件上传

    ajax提交表单.ajax实现文件上传,有需要的朋友可以参考下. 方式一:利用from表单的targer属性 + 隐藏的iframe 达到类似效果, 支持提交含有文件和普通数据的复杂表单 方式二:使用 ...

  6. 关于ajax提交表单的一些实例及遇到的问题和解决办法

    ajax提交的表单有两种情况: 第一种:input type类型没有file上传文件类型的表单 第二种:input type类型有file上传文件类型的表单 之所以分为两种:是因为原生ajax是不能提 ...

  7. JQuery ajax提交表单及表单验证

    JQuery ajax提交表单及表单验证 博客分类: jsp/html/javascript/ajax/development Kit 开源项目   注:经过验证,formValidator只适合一个 ...

  8. ajax提交表单,包括跳入的坑!

    本来今天上午写了一个js执行上下文的一个了解.但是写一大半的时候出去有事,电脑关了啥都没了. 还是让我们进入正题 ajax提交表单,很简单,原生js的代码太复杂,我们就jq的去写. 创建html文件, ...

  9. Validator验证Ajax提交表单的方法

    Validator验证Ajax提交表单的方法 转自:http://hunanpengdake.iteye.com/blog/1671360 当我们在一些稍微复杂的业务时,可能会遇到需要多个表单form ...

  10. jquery实现ajax提交表单

    一般情况下,我们提交form表单采用的是submit的方法,典型的场景如下. <form id="thisForm" method="post" acti ...

随机推荐

  1. npm 发布到远程资源库

    一.npm 发布到远程资源库 1.创建package.json Package.json 属性说明 name - 包名. version - 包的版本号. description - 包的描述. ho ...

  2. 01 HDFS 简介

    01.HDFS简介 大纲: hadoop2 介绍 HDFS概述 HDFS读写流程 hadoop2介绍 框架的核心设计是HDFS(存储),mapReduce(分布式计算),YARN(资源管理),为海量的 ...

  3. iOS小知识:计算字符串长度(如果有表情,表情的长度为1)

    在做项目的时候,textField能够输入表情,但是iOS的表情是占两个字符的,再计算字符串长度的时候就和想象的不一样了,所以用了次方法会将表情的长度转成1,最后得到的字符串的长度就是能看到的实际的长 ...

  4. js时间Date对象介绍及解决getTime转换为8点的问题

    前言 在做时间转换的时候,发现用“2016-04-12”转出来的时间戳是 2016-04-12 08:00的时间点,而不是0点. new Date('2016-04-12').getTime(); ) ...

  5. CI加载model的问题

    1.需求 CI在linux上无法加载model 2.原因 因为linux区分大小写,且model文件名首字符要大写. As said in the comments : Your model's fi ...

  6. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  7. bzoj4691: Let There Be Light

    如果原点能被一个光源照到,那么这两个点之间一定没有任何球.我们可以通过三分距离来确定某线段和球是否有交点. 注意到m非常小,于是我们可以枚举原点被哪些光源照到.由于\(O(2^{n}*m)\)会超时, ...

  8. [mark] Linux下如何批量删除空文件

    可以使用 xargs 命令来批量处理,代码如下: $ find . -name '*' -type f -size 0c | xargs rm -f

  9. apache 虚拟机配置

    <VirtualHost *:80> DocumentRoot /www/htdocs/caipiao ServerName www.aaa.com ServerAlias aaa.com ...

  10. python之路十四

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...