Spring MVC,Ajax和JSON第3部分–客户端代码

如果您一直关注有关Spring,Ajax和JSON的简短博客系列,那么您会回想起我到目前为止已经创建了一个Spring MVC Web应用程序,该应用程序显示一个表单,该表单允许用户选择一堆项目并向服务器提交购买请求。 然后,服务器用一些JSON进行回复,从而允许用户确认其购买。 如果您已经知道所有这些,现在可以跳到此处 。 如果您想知道我在说什么,请阅读本系列的前两个博客:

  • Spring MVC,Ajax和JSON第1部分–设置场景
  • Spring MVC,Ajax和JSON第2部分–服务器端代码

这里

完成服务器端代码后,接下来要做的是继续进行客户端代码,其中涉及编写一些JavaScript。 现在,在您我之间,我不是JavaScript专家,尽管我像大多数服务器端开发人员一样,似乎一头雾水。 对像我这样的人来说,好消息是,在过去的几年中,Javascript出现了突飞猛进的发展,它提供了许多工具和库来减轻开发的痛苦,而在所有这些之中,jQuery似乎已成为事实上的标准。依靠连锁和“少写多做”的哲学。

声明了我正在使用jQuery的下一步是设置JSP,以便我可以开始编写客户端代码。 如果查看shopping.jspHTML <head>元素,您将看到它包含以下链接:

<link rel="stylesheet" href="<c:url value='/resources/blueprint/screen.css'/>" type="text/css" media="screen, projection"/>
<link rel="stylesheet" href="<c:url value='/resources/blueprint/print.css'/>" type="text/css" media="print" />
<!--[if lt IE 8]>
<link rel="stylesheet" href="<c:url value='/resources/blueprint/ie.css' />" type="text/css" media="screen, projection" />
<![endif]-->  <link rel="stylesheet" href="<c:url value='/resources/style.css'/>" type="text/css" media="screen, projection"/>

前三个链接是Blueprint的包含项,正如我在第一个博客中所说的那样,它可以使我在屏幕格式设置方面的工作更加轻松。 指向style.css的最后一个链接很有趣。 它包含两个我从Keith Donald的原始Spring MVC AJAX示例代码中借用的css值。 这些css值是#mask#popup ,它们应用于我添加到我的JSP中的以下隐藏的div

<div id="mask" style="display: none;"></div><div id="popup" style="display: none;"><div class="container" id="insertHere"><div class="span-1 append-23 last"><p><a href="#" onclick="closePopup();">Close</a></p></div></div></div>

mask div用于使浏览器的内容灰显,而popup div用于显示一个弹出框,我将在其中将AJAX调用的JSON结果写入服务器。 请注意insertHere id,这在以后很重要……

JSPHTML head标签的最后两行包括此页面JavaScript文件:

<script type="text/javascript" src="<c:url value='/resources/jQuery-1.9.1.js' /> "></script><script type="text/javascript" src="<c:url value='/resources/shopping.js' /> "></script>

这些导入的第一个是jQuery 1.9.1版。 版本在这里很重要。 如果您使用的是1.7.x或更低版本,则下面的javascript将无法正常工作,因为jQuery Guys更改了jQuery 1.8版本中AJAX调用的工作方式; 但是,如有必要,可以轻松修改JavaScript代码。

第二个JavaScript导入是shopping.js ,其中包括此应用程序所需的所有代码,其关键是:

$(document).ready( function() { $('form').submit( function() { $('.tmp').remove();    // Remove any divs added by the last request if (request) { request.abort();  // abort any pending request } var $form = $(this); // let's select and cache all the fields var $inputs = $form.find("input"); // serialize the data in the form var serializedData = $form.serialize(); // let's disable the inputs for the duration of the ajax request $inputs.prop("disabled", true); // fire off the request to OrderController var request = $.ajax({ url : "http://localhost:8080/store/confirm", type : "post", data : serializedData }); // This is jQuery 1.8+ // callback handler that will be called on success request.done(function(data) { console.log("Resulting UUID: " + data.uuid); $("<div class='span-16 append-8 tmp'><p>You have confirmed the following purchases:</p></div>") .appendTo('#insertHere'); var items = data.items; // Add the data from the request as <div>s to the pop up <div> for ( var i = 0; i < items.length; i++) { var item = items[i]; var newDiv = "<div class='span-4  tmp'><p>" + item.name + "</p></div>"; $(newDiv).appendTo('#insertHere'); newDiv = "<div class='span-6 tmp'><p>" + item.description + "</p></div>"; $(newDiv).appendTo('#insertHere'); newDiv = "<div class='span-4 append-10 last tmp'><p>£" + item.price + "</p></div>"; $(newDiv).appendTo('#insertHere'); console.log("Item: " + item.name + "  Description: " + item.description + " Price: " + item.price); } }); // callback handler that will be called on failure request.fail(function(jqXHR, textStatus, errorThrown) { // log the error to the console alert("The following error occured: " + textStatus, errorThrown); }); // callback handler that will be called regardless if the request failed or succeeded request.always(function() { $inputs.prop("disabled", false);  // re-enable the inputs }); event.preventDefault();   // prevent default posting of form showPopup(); }); });

所有操作都发生在已提交给jQuery的ready()函数的函数内部,并且像JavaScript一样,将函数传递给函数的函数也传递给函数,即我之前所说的链接。 请记住,当文档“准备就绪”可以进行交互时,将调用ready()函数。

第一个内部函数是$('form').submit(…) 。 如果您不了解jQuery,则$是jQuery库的主要入口点,并且只是编写jQuery简写形式。 在此调用中,我选择了文档中的所有表单(只有一个),并将一个函数参数传递给submit(…)方法。

关于jQuery的事情是,您可以使用它来选择文档模型中的对象,然后对它们执行某些操作。 jQuery有自己的选择技术,该技术使用传递给jQuery(…)方法的字符串。 字符串具有以下基本格式:HTML元素(例如“ form”,“ a”,“ div”等)以纯英语编写,当分别传递给jQuery时,将选择
文档中该HTML类型的所有实例。 带有“。”的单词 附加的是CSS值,而带有'#'的单词是html id属性。 因此,例如,如果我写了: $('form#bill').submit(...)那么我将选择所有ID为bill表格,或者如果我写了$('.fred').submit(…)然后选择所有具有class属性为fred文档对象。 一旦掌握了这种查询语言,其余的工作就一帆风顺。

当涉及到jQuery时,我发现O'Reilly jQuery Cookbook非常有用。

传递给$('form').submit(…)方法的函数是所有工作的发生地。 在发出Ajax请求之前,需要完成一些内部整理任务。 其中包括删除带有tmp类的任何文档对象(第一次调用它不会执行任何操作,但此处不作介绍); 中止对服务器的任何未完成的请求(这在大多数情况下将不起作用); 禁用任何表单输入并序列化Ajax请求将发布到服务器的数据。 JavaScript代码的关键部分是
jQuery Ajax请求 :

// fire off the request to OrderController var request = $.ajax({ url : "http://localhost:8080/store/confirm", type : "post", data : serializedData });

该函数的格式通常为: ajax,url,settings 。 我使用的URL是http://localhost:8080/store/confirm ,它对应于我上周描述的Spring RequestMapping 。 可以使用的设置是可选的键值对,并在jQuery Ajax文档中进行了详细说明 。 在这种情况下,我将使用发布请求发送序列化的表单数据。

发出请求后,有几个最终的家务任务要处理。 这些是为了防止HTML表单向服务器提交任何内容,并“弹出”一个将Ajax请求的结果写入其中的div。 这使用了前面提到的两个ID为popupmask div。

function showPopup() { $('body').css('overflow', 'hidden'); $('#popup').fadeIn('fast'); $('#mask').fadeIn('fast'); 
}

回到Ajax请求… $.ajax(...)函数调用返回一个名为request的对象。 这是jqXHR类型,其中XHR的混淆缩写代表XML HTTP RequestjqXHR对象是许多回调方法,旨在让您的代码处理某些事件。 在这种情况下,我实现了: fail(…)always(…)done(…) 。 在请求失败的情况下,浏览器将调用fail(…)显示一个简单的alert(…)always(…)是一种恰当命名的方法,无论请求是成功还是失败,该方法总是被调用。 在这种情况下,它将重新启用所有表单的输入类型。 最后,当Ajax请求成功时,将调用done(…)方法。

request.done(function(data) { console.log("Resulting UUID: " + data.uuid); $("<div class='span-16 append-8 tmp'><p>You have confirmed the following purchases:</p></div>") .appendTo('#insertHere'); var items = data.items; // Add the data from the request as <div>s to the pop up <div> for ( var i = 0; i < items.length; i++) { var item = items[i]; var newDiv = "<div class='span-4  tmp'><p>" + item.name + "</p></div>"; $(newDiv).appendTo('#insertHere'); newDiv = "<div class='span-6 tmp'><p>" + item.description + "</p></div>"; $(newDiv).appendTo('#insertHere'); newDiv = "<div class='span-4 append-10 last tmp'><p>£" + item.price + "</p></div>"; $(newDiv).appendTo('#insertHere'); console.log("Item: " + item.name + "  Description: " + item.description + " Price: " + item.price); } });

done(…)方法在这里最重要。 作为参数,它传递了一个函数,该函数的参数是我们感兴趣的JSON数据。这不是任何旧的原始JSON字符串,jQuery将JSON转换为具有uuiditems属性的对象; 一个分身服务器端的OrderForm对象从我的最后的博客 。 使用此data对象,剩下要做的就是在屏幕上显示结果。 这意味着遍历数据并为每个OrderForm的属性创建一个newDiv变量,并将其转换为HTML。 这是简单的字符串格式,例如:

"<div class='span-4  tmp'><p>" + item.name + "</p></div> "

变成:

<div class='span-4  tmp'><p>Socks</p></div>

div包含一些有用的类属性。 这些属性是“ 蓝图”显示属性,称为tmptmp class属性与前面提到的$('.tmp').remove(); 呼叫。 当用户进行多次提交时,此选项可用于从弹出div中删除用户先前的选择。

创建了newDiv变量后,最后一步是使用带有参数'#insertHere' jQuery的appendTo(…)函数将其附加到弹出div

$(newDiv).appendTo('#insertHere');

如果您运行该应用程序,则现在将获得以下购物表格,从中可以选择要购买的商品:

现在,按确认购买将从服务器请求JSON,对其进行格式化并显示以下弹出div:

除非我错过任何事情,否则就是这样。 这三个博客涵盖了应用程序的创建,添加服务器端代码并​​使用某些客户端JavaScript对其进行格式化。

最后有几点。 首先,我不是Javascript或客户端专家,因此,如果那里有发现错误的专家,那么我希望收到您的来信……其次,我忘了提及此项目的JSON部分是RESTFul ,因此要感谢Josh Long和他在Spring本周中的提及提醒我。 我想我并没有提到这一点,因为作为一般规则,那么它应该不用说每个应用程序都应尽可能使用RESTFul。

有关此博客的完整源代码,请参见GitHub – https://github.com/roghughe/captaindebug/tree/master/ajax-json

参考: Spring MVC,Ajax和JSON第3部分– Captain Debug博客博客中来自JCG合作伙伴 Roger Hughes 的客户端代码 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-mvc-ajax-and-json-part-3-the-client-side-code.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记36 Spring Web Flow——配置

Spring Web Flow是一个Web框架&#xff0c;它适用于元素按规定流程运行的程序。Spring Web Flow是Spring MVC的扩展&#xff0c;它支持开发基于流程的应用程 序。它将流程的定义与实现流程行为的类和视图分离开来。在介绍Spring Web Flow的时候&#xff0c;我们将暂时放下Spitt…

一些关于Viewport与device-width的东西~(转)

内容转自 http://www.cnblogs.com/koukouyifan/p/4066567.html 非常感谢 口口一凡 为我们提供的这篇文章&#xff0c;受益匪浅&#xff0c;特地转到自己的博客收藏起来。 以下是原文内容。 进行移动web开发已经有一年多的时间了&#xff0c;期间遇到了一些令人很困惑的东西。…

创建委托登录模块(用于JBoss EAP 6.1)

[如果只想查看代码&#xff0c;请向下滚动] 动机 在RHQ中&#xff0c;我们需要一个安全域&#xff0c;该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去&#xff0c;我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进行身份验证。 …

【C++】开源:FLTK图形界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍FLTK图形界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0…

蜗牛学院:中国人,努力获得了荣誉却要压抑克制

上周&#xff0c;在取得双11三连冠的佳绩之后&#xff0c;百雀羚顺势推出了一支视频广告《你应该骄傲》。 广告内容感动了无数人&#xff0c;并在广告圈和自媒体引发了持续刷屏。&#xff08;视频见文末&#xff09; 从《一九三一》到《韩梅梅快跑》&#xff0c;百雀羚今年多次…

学计算机专业独立显卡有必要吗,不玩游戏独立显卡有什么作用_如果不玩游戏需要选择独立显卡吗-系统城...

现在有些笔记本刚买来的时候会有自带的独立显卡和集成显卡&#xff0c;有些朋友在买了笔记本后并不想玩游戏&#xff0c;这时候他们就有了一个疑问不玩游戏独立显卡有什么作用呢&#xff1f;如果不玩游戏需要选择独立显卡吗&#xff1f;小编在这里就给大家带来电脑独立显卡的作…

Spring JMS,消息自动转换,JMS模板

在我的一个项目中&#xff0c;我应该创建一个消息路由器&#xff0c;就像所有路由器都应该从一个主题中提取JMS消息并将其放入另一个主题中一样。 该消息本身是JMS文本消息&#xff0c;实际上包含XML消息。 收到消息后&#xff0c;我还应该添加一些其他数据来丰富消息。 我们不…

前端人英语学习的那点事儿

小时候英语学得不好&#xff0c;这个不能怪老师。后来自己想&#xff1a;反正以后我也不出国&#xff0c;加之学习方法不对&#xff0c;英语水平比较差劲、工作之后才发现&#xff0c;英语真是重要、第一手资料几乎都是英文的&#xff0c;很多前端书籍翻译得都挺那啥的&#xf…

大学物理质点动力学思维导图_生理学 | 思维导图

1.声明&#xff1a;第一部分的思维导图来源于网络&#xff0c;但是早就被传疯了。还是一句话&#xff0c;侵删。2.后面明显高清的思维导图是我自己画的,有版权.已经在公众号(id : 医学猿MIT)上传。下面来源&#xff1a;网络▲物质的跨膜转运▲肌细胞的收缩▲血液▲一级消除动力…

WB8使用说明-基础(引用)

1、静态引用链接&#xff1a; 通过设置如下属性来来静态引用CSS和JScssLinks : Array需要在页面中引用的css链接列表。该属性仅在首页或在iframe中运行的模块内有效&#xff0c;内置模块页面引用css请使用Wb.addLink方法。 jsLinks : Array需要在页面中引用的js链接列表。该属性…

jQuary总结11:jQuery插件封装---jQuery封装 手风琴 动画插件

完整代码下载点击我的GitHub: https://github.com/XingJYGo/jquery-accordion 1 手风琴的效果展示如下: 2 封装插件目录结构如下: 主要包括:HTML结构, CCS样式,JS文件以及jquary库. 3 插件封装步骤如下: 3-1首先,编写HTML静态结构: <div id"box"><ul><…

Spring MVC:表单处理卷。 2 –复选框处理

很难想象现代Web应用程序中没有表单复选框的情况。 在之前的一篇文章中&#xff0c;我写了有关Spring MVC中的表单处理的文章 &#xff0c;作为本系列文章的续篇&#xff0c;我将写有关Spring MVC表单的文章&#xff0c;尤其是关于复选框处理的文章 。 这篇文章将介绍标签的标准…

给你的博客换个装-园子换装指南

博客园有很多漂亮的皮肤&#xff0c;但总是有一些地方我不大喜欢&#xff0c;所以经过慎重考虑&#xff0c;我决定亲自动手换个装。本文将介绍博客园换装的一些基础&#xff08;不涉及标准皮肤的做法&#xff09;&#xff0c;如果你想让你的博客更炫&#xff0c;可以参考本文入…

表格过滤器_气缸选型其实并不复杂,知道这些再也不怕选错气缸(附计算表格)...

文/第e机械气动系统概述在介绍气缸之前我们先了解一下气动系统。气动控制技术在国民经济各个领域&#xff0c;最近这些年, 它与传感器技术、电子信息技术密切融合&#xff0c;发展成为包括控制、传动和检测等在内的自动化技术, 现在已发展成为自动化领域的重要组成部分。气动控…

java中equals()和==的区别

java中的数据类型 基础数据类型 基础数据类型有byte、short、char、int、long、float、double、bool、String。除了 String 会比较地址,其它的基础类型的比较,使用 和 equals() 两者都是比较值。 String类的equals()方法源码 1 public boolean equals(Object anObject) {2 …

乒乓球比赛赛程_10月5日至10月11日中央电视台直播录播乒乓球比赛安排

10月5日至10月11日这一周中央电视台居然没有播乒乓球比赛?全国乒乓球锦标赛从5日开始进行各单项比赛&#xff0c;7日进行混双决赛&#xff0c;9日进行男双决赛和女单决赛&#xff0c;10日进行女双决赛和男单决赛。场场都是精彩好看的比赛&#xff0c;中央电视台体育频道一场都…

集合实例(集合覆盖)

集合覆盖是一种优化求解问题&#xff0c;对很多组合数学和资源选择问题给出了很好的抽象模型。 问题如下&#xff1a;给定一个集合S&#xff0c;集合P由集合S的子集A1到An组成&#xff0c;集合C由集合P中的一个或多个子集组成。如果S中的每个成员都包含在C的至少一个子集中则称…

关闭运动轨迹_网球初学者如何正确入门网球运动,有哪些学习细节

网球是一个非常有趣的球类运动。 当您开始入门时&#xff0c;您会越来越喜欢它。 那么网球初学者应该如何正确入门呢&#xff1f; 有什么独特的入门经验&#xff1f;即使没有网球经验&#xff0c;只要您能正确正确地进行定期训练&#xff0c;仍然可以取得很大的进步。首先&…

phpstorm+wamp+xdebug配置php调试环境

本篇文章主要是&#xff1a;教大家如果搭建一套phpstormwampxdebug调试php的环境现在大多数的程序员使用的调试方式一般都是echo, var_dump, file_put_contents等其他方式&#xff0c;效率比较低下&#xff0c;因此我们有必要学习用工具调试&#xff0c;工具调试主要可以用来解…

计算机专用英语1500词带音标,带音标的计算机英语1500词

带音标的计算机英语1500词 (46页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;29.9 积分&#xfeff;计算机专用英语词汇1500词《电脑专业英语》1. file [fail] n. 文件&#xff1b;v. 保存文件 2. …