Spring与Rails的jQuery UJS

我一直想尝试一下是否可以在Spring Boot项目中使用Rails的jQuery UJS 。 jquery-ujs中的UJS代表不引人注目JavaScript 。 我非常喜欢UJS如何将事件处理程序连接到标记有HTML5 data-*属性的合格DOM元素。 我发现自己希望看到更多在Spring Boot Web应用程序中使用的这种方法。 我想知道为什么在网络上很少提及此事。 或者,也许我一直在找错地方。

无论如何,这是jQuery UJS可以做的一些事情,相关的源代码在GitHub上 (尽管使用了不同的示例)。

非GET链接(例如DELETE)

当我需要呈现一个删除项目的链接时,我会使用包裹在<form><button>以及一个带有<form> delete <form>值的_method隐藏字段。 <form>对用户不可见。 但是可见按钮用于提交<form> 。 一些CSS用于使按钮看起来像链接。

<form action="/articles/42" method="post"><input type="hidden" name="_method" value="delete" /><button class="btn btn-link">Delete</button>
</form>

感谢Spring的HiddenHttpMethodFilter (也在Spring Boot中自动配置),提交此<form> ,将使用DELETE方法将其作为请求接收。 它映射到相关@Controller中的@DeleteMapping(path="/articles/{id}")

尽管上述方法有效,但使用jQuery UJS却有一种更简单的方法。 呈现链接以删除项目所需的所有操作如下:

<a href="/articles/42" data-method="delete">Delete</a>

jQuery UJS将增强具有data-method属性的链接。 单击上面的示例链接时,JavaScript将创建一个<form> 。 此<form>的action属性设置为链接的href的值。 该方法设置为post 。 将一个隐藏的_method字段添加到<form>并将其设置为链接的data-method 。 最后,提交<form> (并且不跟随链接)。

确认对话框

通常,在删除任何内容时,最好与用户确认。 可以通过window.confirm()将其实现为简单的对话框。 如果我们从上一个示例构建,则<form>看起来像这样:

<form action="/articles/42" method="post"onsubmit="return confirm('Are you sure?')"><input type="hidden" name="_method" value="delete" /><button>Delete</button>
</form>

尽管上述方法有效,但jQuery UJS向我们展示了一种更好的方法。 删除之前需要确认的所有内容是:

<a href="/articles/42?delete" data-method="delete"data-confirm="Are you sure?">Delete</a>

jQuery UJS将增强具有data-confirm属性的链接(以及<form> )。 单击上面的示例链接时,JavaScript将调用confirm()来显示一个对话框,其中包含作为属性值的文本。 如果用户选择取消,则不会发生<form>的创建/提交(由于data-method )。

Ajax链接

删除项目后,页面通常会重新加载以显示已删除的元素确实已被删除。

假设项目显示在表格中。 每行都有一个唯一的id

<table><tr id="article:18"><!-- data cells for /articles/18 --><td><a href="/articles/18?delete"data-method="delete" data-confirm="Are you sure?">Delete</a></td></tr><tr id="article:42"><!-- data cells for /articles/42 --><td><a href="/articles/42?delete"data-method="delete" data-confirm="Are you sure?">Delete</a></td></tr><!-- other rows -->
</table>

假设我们可以简单地删除代表已删除项目HTML元素,那么我们可以异步发送DELETE请求并获得一个响应,该响应将删除相关HTML元素。 jQuery UJS使此操作变得简单,就像向服务器端控制器添加data-remote="true"和一些小的更改一样。

对于HTML,我们需要的只是data-remote="true"

<a href="/articles/42?delete" data-remote="true"data-method="delete"data-confirm="Are you sure?">Delete</a>

单击链接后,jQuery UJS将再次发送DELETE请求。 但是这次,它将使用Ajax异步发送。 这样做使浏览器不会重新加载整个页面。 并且根据服务器的响应,可以仅更新页面的一部分。 因此,提供了更好的用户体验。

对于服务器端控制器,当请求需要text/javascript时,我们需要发送不同的响应。 我们添加了一个处理程序方法,该方法将使用@RequestMappingproduces元素来响应text/javascript 。 响应将删除相关HTML元素。

// inside a @Controller
@DeleteMapping(path="/articles/{id}")
String delete(... id) {// ... delete article with given identifierreturn "redirect:/articles";
}@DeleteMapping(path="/articles/{id}",produces="text/javascript")
String delete(... id) {// ... delete article with given identifierreturn "articles/delete";
}

该视图是一个包含text/javascript的JSP。 这将由jQuery UJS执行。

<%-- articles/delete.js.jsp --%>
<%@ page contentType="text/javascript" %>
$('#article:${id}').remove();

部分和服务器生成JavaScript响应

现在,如果我们想拥有一个编辑链接来获取一些HTML内容并以模式显示(不刷新页面)会发生什么?

这就是我们可以做的。 我们异步发送GET请求。 预期响应将包含JavaScript,该JavaScript将HTML附加到文档中的目标位置,然后触发模式出现。

<a href="/articles/42?edit" data-remote="true">Edit</a>

当期望的响应是text/javascript ,将呈现articles/edit.js.jsp 。 否则,将呈现常规的articles/edit.jsp

// inside a @Controller
@GetMapping(path="/articles/{id}", params={"edit"})
String edit(... id, ...) {// ...return "articles/edit";
}@GetMapping(path="/articles/{id}", params={"edit"},produces="text/javascript")
String editViaAjax(... id, ...) {// ...return "articles/edit";
}

edit.jsp呈现<form> (部分而不是完整HTML文档),该文件已重构为自己的JSP,以避免重复。

<%-- articles/edit.jsp --%>
<!-- --><jsp:include page="_form.jsp" />
<!-- -->

edit.js.jsp呈现与JS中的字符串相同的<form> (部分而不是完整HTML文档)。 然后将其包括在模态中。 将_form.jsp呈现为字符串非常棘手。 我不得不使用<c:import>

<%-- articles/edit.js.jsp --%>
<%@ page contentType="text/javascript" %>
<c:import var="html" url="…_form.jsp" />
<!-- escape double quotes and remove new lines -->
(function() {const $modal = $('#...'); // ID of modal element$modal.find('.modal-body').html('${html}');if (!$modal.is(':visible')) {$modal.modal('show');}
})()

为此,需要配置另一个text/javascript作为contentType InternalResourceViewResolver (IRVR)bean。 该bean使用相同的前缀和稍微不同的后缀: .js.jsp 。 这样,当请求要求使用text/javascriptCNVR将更喜欢将IRVR bean与text/javascript ,并最终呈现articles/edit.js.jsp

Ajax形式

data-remote="true"属性也可以应用于<form> 。 有了它,jQuery UJS将把表单提交作为Ajax请求处理。 在提交表单时,可以通过添加data-disabled-with来禁用按钮。 例如,

<form ...><!-- ... --><button data-disable-with="Saving...">Save</button>
</form ...>

提交以上表单后,jQuery UJS将禁用该按钮,并将其内容更改为“ Saving…”。

总结思想

我几乎没有触及Rails的jQuery UJS的表面。 它可以提供更多的功能。 我期待在我的Web应用程序中使用它(和类似的技术)。

翻译自: https://www.javacodegeeks.com/2019/06/spring-with-rails-jquery-ujs.html

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

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

相关文章

什么是VGA光纤收发器?

采用先进的非压缩数字高清视频和高速数字光纤传输技术&#xff0c;可以轻松地将计算机主机、高清视频信号源、高清DVD/DVR等设备输出的各种分辨率的VGA高清视频信号长距离传输到远端的器件。那么&#xff0c;VGA光纤收发器的产品特点及技术参数有哪些呢&#xff1f;接下来我们就…

akka使用_使用Akka简化交易系统

akka使用我的同事正在开发一种交易系统&#xff0c;该系统可以处理大量的传入交易。 每笔交易都涵盖一种Instrument &#xff08;例如债券或股票&#xff09;&#xff0c;并且具有某些&#xff08;现在&#xff09;不重要的属性。 他们坚持使用Java&#xff08;<8&#xff0…

浅析HDMI1.4光纤延长器的工作原理和应用领域

HDMI光纤延长器是用来延长信号的传输器件&#xff0c;解决HDMI音视频信号无法远距离传输的问题&#xff0c;且保证信号传输的质量。那么&#xff0c;HDMI光纤延长器的工作原理是什么&#xff1f;HDMI光纤延长器有哪些应用呢&#xff1f;接下来就由飞畅科技的小编来为大家详细介…

Java中的模板方法模式

模板方法模式是一种行为模式&#xff0c;建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是&#xff0c;算法后面的任何更改只会影响超类中的代码。 此外&#xff0c;它还可以提高代码的可…

什么是单模单纤/双纤光纤收发器?

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;按其所需主要分为单纤光纤收发器和双纤光纤收发器&#xff0c;接下来我们就来详细介绍下什么是单模单纤/双纤光纤收发器&#xff1f;单模单纤和单模双纤光纤收…

什么是以太网光纤收发器,其产品特点和技术参数都有哪些?

以太网光纤收发器是一款提供以太网数据信号到光纤数据信号的双向透明转换器&#xff0c;可以将以太网信号通过光纤线路传输突破传输距离100米的限制&#xff0c;使得以太网网络覆盖得到极大的延伸。光纤收发器的出现&#xff0c;确保能够顺畅的将电信号与光纤信号相互转换&…

什么是CAN总线中继器?

CAN网桥&#xff08;Bridge&#xff09;是一个智能的中继器。使用CAN网桥对设备进行互连&#xff0c;克服了CAN总线结点个数及通信距离的物理限制&#xff0c;能有效扩充CAN网络的结点总数&#xff0c;延长通信距离。今天&#xff0c;飞畅科技的小编为大家详细介绍下CAN总线中继…

java百里香_百里香Spring测试的意见

java百里香我最近在基于Spring的Web应用程序中转换为thymeleaf以进行视图模板化&#xff0c;而不是jsp。 百里香叶文档中关于为什么百里香叶在jsp上为什么能保持水分的所有争论&#xff0c;我肯定被卖掉了。 除了能够预览模板之外&#xff0c;对我来说&#xff0c;主要原因之一…

一文读懂工业设备的两种通讯方式:现场总线和工业以太网

随着传统制造企业正在加快智能制造转型的进程&#xff0c;工业互联网迅速在全世界范围内兴起。在工业互联网的技术构架中&#xff0c;通过各类通讯方式接入不同设备、系统和产品&#xff0c;来采集海量数据是其重要的一环。本文将重点介绍工业底层设备的两种通讯方式&#xff1…

Java中的中介器设计模式

在本教程中&#xff0c;我们将学习一种行为模式&#xff0c;该行为模式将促进彼此通信的多个对象之间的松散耦合。 Mediator设计模式背后的想法是拥有一个中心对象&#xff0c;该对象封装了一组对象之间的交互方式。 在调解器模式中&#xff0c;我们在称为调解器的单独类中提取…

什么是中国1号信令?

中国1号信令是在电话自动交换网中&#xff0c;我国所用的随路信令的总称&#xff0c;目前在国内长途网和市话中的局间中继线上使用。那么&#xff0c;什么是中国1号信令&#xff1f;中国1号信令的分类又有哪些呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&…

如何选购工业级光模块

大家都知道光模块是影响整个网络性能的关键因素&#xff0c;特别是在工业以太网中&#xff0c;网络连接控制的多为大型工业设备&#xff0c;光模块的稳定性尤为重要&#xff0c;那么&#xff0c;我们该如何选购工业级光模块呢&#xff1f;接下来就由飞畅科技的小编来为大家详细…

ejb生命周期_无状态EJB:池化和生命周期

ejb生命周期无状态EJB池和生命周期的概述视图&#xff08;注释&#xff09;。 对新手有用。 。 。 。 。 EJB池&#xff1a;快速概述 EJB实例存储在称为EJB池的位置-这不过是内存中的缓存 。 无状态EJB通常按需实例化&#xff0c;即&#xff0c;当客户端调用Bean上的方法时。…

单E1光端机分类及技术指标详解

单E1光端机是一种将G.703的E1信号调制到光纤上传输的设备。采用大规模集成芯片&#xff0c;电路简单&#xff0c;功耗低&#xff0c;可靠性高&#xff0c;具有完整的告警状态指示和完善的网管功能。那么&#xff0c;单E1光端机分类及技术指标有哪些呢&#xff1f;接下来我们就跟…

将Java类作为子进程运行

我本周需要将Java类&#xff08;而不是jar&#xff09;作为子进程运行。 更准确地说&#xff0c;我想从测试内部产生一个新进程&#xff0c;而不是直接在测试内部运行&#xff08;进程内&#xff09;。 我不认为这是幻想或复杂的事情。 但是&#xff0c;这不是我以前不需要做的…

光猫的分类及应用范围有哪些?

光猫也称为单端口光端机&#xff0c;是针对特殊用户环境而设计的产品&#xff0c;它利用一对光纤进行单E1或单V.35或单10BaseT点到点式的光传输终端设备。该设备作为本地网的中继传输设备&#xff0c;适用于基站的光纤终端传输设备以及租用线路设备。而对于多口的光端机一般会直…

关于光模块用单模光纤和多模光纤小知识

通过对光纤的认知&#xff0c;我们了解到光纤是通过导光来传输信号、不导电、不怕雷击&#xff0c;所以也不需要用接地保护&#xff0c;我们按光在光纤中的传输模式分为&#xff1a;多模光纤和单模光纤。对于我们使用者来说&#xff0c;你把多模和单模名称由来记住就可以了。接…

硬盘序列号示例_序列化代理模式示例

硬盘序列号示例有些书极大地改变了你的生活。 其中一本书是Joshua Bloch撰写的“ Effective Java” 。 在下面您可能会发现一些小的实验&#xff0c;该实验的灵感来自于本书的第11章“串行化”。 假设我们有一个为继承而设计的类&#xff0c;它本身不是可序列化的 &#xff0c…

什么是光纤转换器?光纤转换器转换类别介绍

光纤转换器是RS-232/422/485串行数据通过光纤的远距离传输&#xff0c;可以完成串口到光纤的转换&#xff0c;并且可以延长串行通信信号的传输距离。那么&#xff0c;光纤转换器转换类别有哪些呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 光纤…

H2数据库的Spring Boot

在本快速教程中&#xff0c;我们将引导一个由内存H2数据库支持的简单Spring Boot应用程序。 我们将使用Spring Data JPA与我们的数据库进行交互。 项目设置&#xff1a; 首先&#xff0c;让我们使用Spring Initializr生成我们的项目模板&#xff1a; 单击“生成项目”链接后&…