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
时,我们需要发送不同的响应。 我们添加了一个处理程序方法,该方法将使用@RequestMapping
的produces
元素来响应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/javascript
, CNVR将更喜欢将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
Spring与Rails的jQuery UJS相关推荐
- rails jquery_Spring与Rails的jQuery UJS
rails jquery 我一直想尝试一下是否可以在Spring Boot项目中使用Rails的jQuery UJS . jquery-ujs中的UJS代表简洁的JavaScript . 我非常喜欢U ...
- Spring MVC Controller与jquery ajax请求处理json
在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: var cmd = {orders:[{"storeId&q ...
- Spring boot整合jpa Jquery实现三级联动
Spring boot 整合jpa JQuery 实现省,市,区, 三级联动效果 三级联动在很多项目都必不可少,尤其是在付款时,需要选取地址,为了更好的用户体验感,从而出现了三级联动. 实现三级联动的 ...
- Spring Boot+MybatisPlus使用JQuery DataTables表格插件展示数据、实现分页和模糊查询等功能
Spring Boot+MybatisPlus使用JQuery DataTables表格插件展示数据.实现分页和查询功能 一.部分技术选型 二.项目结构 三.功能需求和效果展示 四.关键代码 4.1页 ...
- ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery开发案例(1)
前言:由于这段时间公司的事情比较的繁忙,每天都要学习新的东西,所以好久没有写博客了,今天抽空写写博客来记录我这段时间研究的东西,给自己加深一下印象,我用easyUI的组件开发了一个简单操作数据库的小样 ...
- ajax 失败textstatus,rails 3 jquery ajax调用与statusText失败:“parsererror”
在一个轨道3应用了最新的jQuery的轨道宝石"1.0.12"我试图从一个Ajax调用 $.ajax({ type: "POST", cache: false, ...
- mvc 一般注释_使用带有注释和JQuery的Spring MVC 3的Ajax
mvc 一般注释 与Ajax一起工作对我来说一直很有趣! 是不是 ? 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用. 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax ...
- 使用带有注释和JQuery的Spring MVC 3的Ajax
与Ajax一起工作对我来说一直很有趣! 是不是 ? 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用. 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax. 和往常一样,我 ...
- ruby on rails_如何在Ruby on Rails应用中用Vue.js替换jQuery
ruby on rails by Igor Petrov 通过伊戈尔·彼得罗夫(Igor Petrov) 如何在Ruby on Rails应用中用Vue.js替换jQuery (How to repl ...
最新文章
- C#使用Ado.net读取Excel表的代码
- LeetCode 1487. 保证文件名唯一(哈希map)
- python自带的shell、其性能优于ipython_python3.4 shell
- android开源库收集
- python自动保存ping结果_利用python获取Ping结果示例代码
- ZBlog通用视频插件 - ZblogPHP视频播放插件
- 一个账号,防止多设备登陆
- kotlin泛型类、泛型接口
- 竞斗云2.0刷机-刷原厂固件
- 语音技术――性别辨识和语者验证
- Django学习笔记之Ajax入门
- 创业19年的湖南竞网如何拥抱数字化转型,按下成长加速键?
- python创意网络爬虫_基于Python专用型网络爬虫的设计及实现
- 图层重命名快捷键_Principle快捷键大全
- The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals
- 延缓青少年近视进展的新方案
- Angular开发(三)-关于属性绑定与事件绑定
- python spider模块_spider【第三篇】python爬虫模块requests
- ThinkPHP php 仿千图网源码_2018最新友价内核
- 动态规划---买卖股票的最佳时机
热门文章
- jzoj1264,P2866-乱头发节,糟糕的一天Bad Hair Day【单调栈】
- codeforces 939C Convenient For Everybody 简直羞耻
- JavaFX UI控件教程(八)之Choice Box
- Oracle入门(十二)之SQL的DDL
- Maven精选系列--依赖范围、传递、排除
- CSS动画示例(上一篇是CSS过渡…)
- css实现一级下拉菜单
- 2018蓝桥杯省赛---java---C---4( 第几个幸运数)
- 2014年JAVA省赛B组---第四题---大衍数列
- Mysql8.0可以使用解压版 这个比较快 好像现在都是解压版了