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,一经查实,立即删除!

相关文章

[poj] 3090 Visible Lattice Points

原题 欧拉函数 我们发现&#xff0c;对于每一个斜率来说&#xff0c;这条直线上的点&#xff0c;只有gcd(x,y)1时可行&#xff0c;所以求欧拉函数的前缀和。2*f[n]1即为答案。 #include<cstdio> #define N 1010 using namespace std; int x,y,n,f[N],m;int read() {int a…

10个必知的网页设计术语计算机与网络,计算机网络专业毕业论文-网页设计与制作(23页)-原创力文档...

安徽工业经济职业技术学院毕业论文PAGEPAGE 4-安徽工业经济职业技术学院毕业论文(设计)论文题目&#xff1a; 网页设计与制作系 部&#xff1a; 计算机科学技术系专业名称&#xff1a; 计算机网络技术论文作者&#xff1a; 李婷婷指导教师&#xff1a; 宋多琳2014年4月12日摘 要…

笔记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;百雀羚今年多次…

html 访问节点,HTML DOM 访问节点

getElementById() 和 getElementsByTagName()getElementById() 和 getElementsByTagName() 这两种方法&#xff0c;可查找整个 HTML 文档中的任何 HTML 元素。这两种方法会忽略文档的结构。假如您希望查找文档中所有的元素&#xff0c;getElementsByTagName() 会把它们全部找到…

CSS3圆圈动画放大缩小循环动画效果

代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>CSS3圆圈动画放大缩小循环动画效果</title> <style>.dot { margin:150px a…

【BZOJ3589】动态树

题解&#xff1a;转载于:https://www.cnblogs.com/yinwuxiao/p/9103046.html

Lambda表达式在Java 8中的简单应用

我一直试图在我编写的代码中放入lambda表达式&#xff0c;而这个简单的例子就是相同的结果。 对于那些完全不了解Java中的Lambda表达式的人&#xff0c;我建议他们在进入本文之前先阅读此内容 。 好的&#xff0c;现在您已经熟悉了Lambda表达式&#xff08;在阅读了介绍性文章…

Poj2758 Checking the Text

题目传送门 经典的数据结构维护字符串哈希 这里用了很慢很慢的splay各种T&#xff08;也可能是死循环&#xff09; 不过没办法因为会写splay的能力还是要有的 #pragma GCC opitmize("O3") #pragma G opitmize("O3") #include<stdio.h> #include<s…

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

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

编程书籍集

【1】OS &#xff08;1&#xff09;《深入理解计算机系统》 &#xff08;2&#xff09;《程序员的自我修养&#xff1a;链接、装载与库》 &#xff08;3&#xff09;《程序员修炼之道》 &#xff08;4&#xff09;《计算机程序的构造和解释》 【2】C &#xff08;1&#xff09;…

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

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

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

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

课后作业-阅读任务-阅读提问-4

敏捷流程&#xff0c;感觉就像以前作业写不完还快开学了&#xff0c;然后一顿猛写:-)&#xff0c;那在实际编程中&#xff0c;是一开始就决定用敏捷流程&#xff1b;还是快到交付日期&#xff0c;大家加紧加班&#xff0c;赶工&#xff0c;自然而然就变成敏捷流程&#xff1f; …

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

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><…