要解决的问题:

  • 如何组织客户端参数?
  • Ajax 方法的配置属性如何定义才能传递复杂参数?
  • 基于 SpringMVC 的服务端该如何接收?
  • MyBatis 怎么处理批量更新?

客户端脚本

viewMessage: function (messageId) {
console.info('viewMessage');
// 通过 id 获取完整数据对象
var message = $.grep($messageDatagrid.datagrid('getRows'), function (n, i) {
return n.messageId == messageId
})[0];
console.info(message); // 如果该条记录是“未读”则更新为“已读”
if (message.isReaded == YesOrNoEnum.No) {
var updateReadState = {
isReaded: YesOrNoEnum.Yes,
messageIds: [messageId]
}; $.ajax({
data: JSON.stringify(updateReadState),
url: UrlEnum.UpdateReadState,
type: "POST",
dataType: "json",
contentType: 'application/json;charset=utf-8', //“参数为泛型集合 @RequestBody List<> 时”需设置请求头信息
success: function (result) {
console.info('updateReadState success,返回数据如下:↓');
console.info(result); if (result.success) {
$.messager.show({
title: '提示', // 头部面板上显示的标题文本。
msg: result.message
}); $messageDatagrid.datagrid('load');
// 确保没有任何缓存痕迹(必不可少)
$messageDatagrid.datagrid('clearChecked');
$messageDatagrid.datagrid('clearSelections');
}
else {
if (result.operationType == operationTypeEnum.CookieTimeout) {
result.message = decodeURIComponent(result.message);
}
$.messager.alert('提示', result.message, 'warning');
}
},
error: function (result) {
}
}); // end ajax
} // isReaded = no
}

在传递复杂类型的数据时,注意 Ajax 方法的 data 和 contentType 两个参数的设置。在 data 属性中用到了 JSON.stringify(),目的是将 data 属性转化为“JSON字符文本”形式,也是防止 jQuery 内部把 data 属性转化成了“查询字符串”格式(key1=valu1&key2=value2),倘若如此 SpringMVC 就不好识别解析了。

Java 实体类

public class BaseMessageUpdateReadState extends BaseEntity {
private List<Integer> messageIds;
private Integer isReaded; public List<Integer> getMessageIds() {
return messageIds;
} public void setMessageIds(List<Integer> messageIds) {
this.messageIds = messageIds;
} public Integer getIsReaded() {
return isReaded;
} public void setIsReaded(Integer isReaded) {
this.isReaded = isReaded;
}
}

该实体类就是一个复杂形式的实体类,把实体类 BaseMessageUpdateReadState 的字段与客户端的 JSON 对象 updateReadState 作比较,可见二者是如此一致,需注意一下的是 js 中的数组与 Java 中的泛型集合 List 相对应。

控制器

@RequestMapping(value = "/UpdateReadState", method = RequestMethod.POST)
@ResponseBody
public TransactionResult UpdateReadState(@RequestBody BaseMessageUpdateReadState baseMessageUpdateReadState, @CookieValue(value = "base_cookieKey", required = false) CookieObject cookieObject) {
baseMessageUpdateReadState.setCookieObject(cookieObject);
TransactionResult result = null;
try {
result = iBaseMessageService.UpdateReadState(baseMessageUpdateReadState);
return result;
} catch (RuntimeException e) {
result = new TransactionResult(false);
if (e.getMessage() == null) {
ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream();
e.printStackTrace(new java.io.PrintWriter(buf, true));
String expMessage = buf.toString();
try {
buf.close();
} catch (IOException e1) {
e1.printStackTrace();
}
result.setMessage(expMessage);
} else {
result.setMessage(e.getMessage());
}
return result;
}
}

在控制器方法中,参数 BaseMessageUpdateReadState 前面必须带上 @RequestBody,它负责将 JSON 格式的复杂参数转化为 Java 实体类,非常的方便。

MyBatis 应用

接口:

int affectedRows = iBaseMessageDao.UpdateReadState(baseMessageUpdateReadState);

XML映射器:

<!-- 批量更新阅读状态 -->
<update id="UpdateReadState" parameterType="baseMessageUpdateReadState" timeout="20" flushCache="true">
Update BaseMessage
Set
IsReaded = #{isReaded}
Where 1=1
and MessageId in
<foreach collection="messageIds" index="index" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</update>

着重看看 #{isReaded} 和 collection="messageIds",这里也是跟 Java 实体类逐个对应,十分称心。

值得一说的是 ,它主要就是用来构建 in() 条件。

foreach 元素的属性主要有 item、index、collection、open、separator、close。

  • item 表示集合中每一个元素进行迭代时的别名
  • index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置
  • open 表示该语句以什么开始
  • separator 表示在每次进行迭代之间以什么符号作为分隔符
  • close 表示以什么结束

其中在指定“collection”属性时比较容易出错:

  • 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list
  • 如果传入的是单参数且参数类型是一个 array 数组的时候,collection的 属性值为 array

Spring MVC Ajax 复杂参数的批量传递的更多相关文章

  1. spring mvc获取路径参数的几种方式 - 浅夏的个人空间 - 开源中国社区

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  2. Spring MVC url提交参数和获取参数

    [转载:http://blog.csdn.net/mahoking] 普通URL提交参数         该格式url为:url.do?param1=mahc&param2=8888.00 需 ...

  3. 【spring mvc】后台spring mvc接收List参数报错如下:org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.List]: Specified class is an interface

    后台spring mvc接收List参数报错如下:org.springframework.beans.BeanInstantiationException: Failed to instantiate ...

  4. Spring MVC(十)--通过表单序列化传递参数

    通过表单序列化传递参数就是将表单数据转化成字符串传递到后台,序列化之后参数请求变成这种模式param1=value1&&param2=value2,下面用代码实现. 1.创建表单 &l ...

  5. spring mvc redirect 重定向 跳转并传递参数

    在项目中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,具体跳转方式有以下几种方式: 公用代码: @RequestMapping(value=" ...

  6. spring mvc ajax异步文件的上传和普通文件上传

    表单提交方式文件上传和ajax异步文件上传 一:首先是我在spring mvc下的表单提交方式上传 ssm的包配置我就不一一详细列出来了,但是上传的包我还是列出来 这一段我也不知道怎么给大家讲解就是直 ...

  7. Spring MVC控制器方法参数类型

    HttpServletRequest Spring会自动将 Servlet API 作为参数传过来 HttpServletResponse InputStream 相当于request.getInpu ...

  8. spring mvc接收http参数

    1.http协议携带参数,无外乎两个三个存储地点:1.url上 ,2.header里 3.body里. 2.get请求是没有body的,数据全都放在url上,以?xx&xxx形式.注:get请 ...

  9. spring mvc获取路径参数的几种方式

    一.从视图向controller传递值,  controller <--- 视图 1.通过@PathVariabl注解获取路径中传递参数 (参数会被复制到路径变量) @RequestMappin ...

随机推荐

  1. 第二周C++学习总结

    经过这个星期的学习,认识C语言C++语言,学会打代码,但是打出第一个代码还是经历了很大困难,首先我对于打代码真的一窍不通,其次我连打代码的软件也不会装,但在班导的帮助下我还是装好了软件,在打第一个代码 ...

  2. 团队作业8——第二次项目冲刺(Beta阶段)第三天

    BETA阶段冲刺第三天 1.当天站立式会议 2.每个人的工作 (1)昨天已完成的工作: 编写页面讨论 (2)今天计划完成的工作: 完成编写页面 (3)工作中遇到的困难: 验证码正确度 (4)每个人的贡 ...

  3. Beta版本冲刺前期计划及安排

    a. 介绍小组新加入的成员,Ta担任的角色. 吴东益:经讨论决定,Ta担任角色为开发人员 李志霖:在原先的团队中负责前端开发与界面设计.现经讨论决定,Ta此次担任角色为开发人员 由他们替代原来成员陈雄 ...

  4. 201521123053《Java程序设计》第四周总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 现在上课跟着老师的思路走,一般都能理解了.就是课上知识点有些难以记住. 特别讲讲这个思维导图 ...

  5. 201521123096《Java程序设计》第一周学习总结

    1. 本章学习总结: 对JAVA的发展有一定的了解.JAVA是一种高级语言,需要在JVM上执行.初步学会使用eclipse和NOtepad++. 2. 书面作业 Q1:为什么java程序可以跨平台运行 ...

  6. 201521123115 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  7. 第一部分----HTML的基本结构与基本标签

    PART-1  HTML的基本结构以及Header的部分 一.什么是HTML? HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构: 三.详细注释 ...

  8. Mysql修改id自增值

    如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数 truncate table 表名 如果想保留之前的记录,从某一id(3356)重新开始 alter table 表名  ...

  9. CyclicBarrier的使用之王者荣耀打大龙

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正. LOL和王者荣耀的玩家很多,许多人应该都有打大龙的经历,话说前期大家 ...

  10. 使用Pano2VR 切割图片

    图片转换好之后得到一组立方体面片.