rails jquery_Spring与Rails的jQuery UJS

rails jquery

我一直想尝试一下是否可以在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

rails jquery

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

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

相关文章

python读word文档doc公文标题_python – 从word doc中提取标题文本

我试图从MS Word文档(.docx文件)中的标题(任何级别)中提取文本.目前我正在尝试使用python-docx来解决,但不幸的是我仍然无法弄清楚它是否在阅读之后是否可行(也许我错了). 我试图在线寻找解决方案,但没有发现我的任务特定.如果有人可以在这里指导我,那将是很棒的. 解决方法: 基…

序列化和反序列化的学习

文章目录序列化构造方法方法使用步骤反序列化构造方法方法使用步骤序列化 把内存中的对象以流的方式写入到文件中&#xff0c;这叫序列化&#xff0c;也叫“写对象” 使用 ObjectOutputStream 写入对象中的数据&#xff0c;这个流叫对象字节输出流&#xff0c;也叫对象的序列化…

java开发展望怎么写_Java开发趋势:2019年展望

java开发展望怎么写在这篇文章中&#xff0c;我们将发表一篇有关2019年Java开发趋势的综合文章。您是否知道Java自上世纪问世以来&#xff0c;现在已在100亿个设备上运行 &#xff1f; 它是数十年来最受欢迎的编码语言&#xff0c;但是在最近几个月中&#xff0c;Java经历了一些…

dml语句包括哪些_MySQL数据操作(DML)语句,入门掌握这些足够了

DML是(Data Manipulation Languages)数据定义语言的缩写主要包括表记录的插入insert、更新update、删除select插入记录insert into table(field1,field2,...fieldn) values(value1,value2,...value)如&#xff1a;向表 emp 中插入以下记录:---------------------------| ename …

Servlet 的实例对象

Servlet 实例是由 Servlet 容器自动创建&#xff0c;也可以说是由 Web Server 创建的。 当请求到达服务器的时候&#xff0c;或者在 web.xml 中配置了 init 方法的时候&#xff0c;容器就会自动创建 Servlet 实例。 如果在 web.xml 中配置了 init 方法&#xff0c;那么启动服…

java 手动装箱拆箱对象_将旧对象装箱可自动关闭

java 手动装箱拆箱对象从Java 7开始&#xff0c;我们可以使用try-with-resources并自动关闭任何实现Autocloseable接口的对象。 如果资源是 Autocloseable 。 一些类需要一些总结&#xff0c;但不是Autocloseable 。 这些主要是某些遗留框架中的旧类&#xff0c;仍然妨碍我们前…

delphi查看源码版本_[Mybatis]-IDEA导入Mybatis源码

该系列文章针对 Mybatis 3.5.1 版本一、下载 Mybatis 源码step1、下载 Mybatis-3.5.1 源码Mybatis 源码仓库地址下载版本信息如下&#xff1a;下载后进行解压&#xff0c;并打开 pom 文件&#xff0c;查看pom 中的父级依赖&#xff0c;如下&#xff1a;根据上述版本信息&#x…

Struts项目中,检测用户名是否被占用/查询账户名称是否被占用/查询账户名称是否已被注册/检查用户名是否被注册

在客户端无法检测注册用户名是否被占用&#xff0c;这需要查询数据库&#xff0c;所以是服务器端负责这块。 实现思路大致描述&#xff1a; 注册表单中添加自动检测用户名是否被占用的功能&#xff0c;其实就是利用 ajax 向服务器发送请求&#xff0c;并带着用户输入的用户名过…

羽毛球双打区域_测试双打简介

羽毛球双打区域当您编写单元测试时&#xff0c;您会遇到许多协作者&#xff0c;而且他们都有非常特殊的行为&#xff0c;知道在正确的时间必须使用哪种测试两倍可以使您的生活更轻松。 假 第一个是Dummy对象&#xff0c;它是最简单的一个&#xff0c;Dummy只是您为满足构造函数…

可为空的对象必须具有一个值_前端:这里有8个常见的JavaScript经典问题,总有一个你不会的...

参考前端小智&#xff1a;https://juejin.im/post/5d2d146bf265da1b9163c5c91.了解函数提升使用var关键字声明的变量在JavaScript中会被提升&#xff0c;并在内存中分配值undefined。 但初始化恰发生在你给变量赋值的地方。 另外&#xff0c;var声明的变量是函数作用域的&#…

Struts2的配置文件struts.xml详解

<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><!-- 所有匹…

hibernate教程_Hibernate多对多教程

hibernate教程介绍&#xff1a; 在本教程中&#xff0c;我们将学习使用Hibernate ManyToMany注释定义和使用多对多实体关联。 上下文构建&#xff1a; 为了继续学习本教程&#xff0c;我们假设我们有两个实体– 雇员和资格&#xff1a; 众所周知&#xff0c;一名员工可以拥有…

python常用命令格式_python常用命令有哪些

原标题&#xff1a;python常用命令有哪些 Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言。它包含了许多命令来帮助我们实现各种各有的功能&#xff0c;接下来在文章中为大家分享【推荐课程&#xff1a;Python教程】 &#xff08;1&#xff09;打开csv文件…

java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag

开发工具&#xff1a;IntelliJ IDEA for Mac 开发项目&#xff1a;struts2-demo 构建工件&#xff1a;Maven 问题描述&#xff1a;在 jsp 中使用了 jstl 标签 <c:forEach>&#xff0c;浏览器访问 Action 组件提示错误&#xff1a; java.lang.ClassNotFoundException: ja…

latex 多行公式_Markdown中输入多行并列的公式

本篇旨在以两个Markdown文件编辑器-Typora与Visual Code Studio为例&#xff0c; 说明对于多行并列公式不同的处理方式。Latex中输入多行并列公式在latex文件编辑器中使用align环境输入多行并列的公式&#xff0c; 如下例&#xff1a;begin{align} x & v_0costheta t y &am…

java 常规类的可见性_Java 12常规可用性

java 常规类的可见性马克雷因霍尔德&#xff08;Mark Reinhold&#xff09; 今天宣布 &#xff0c;“ Java 12的参考实现JDK 12现在已全面上市。” Reinhold在该公告中指出&#xff0c;“可以从https://jdk.java.net/12获得来自Oracle的GPL许可的OpenJDK构建&#xff0c;并且“…

python支持复数以及相关的运算吗_Python: 复数的数学运算

写的最新的网络认证方案代码遇到了一个难题&#xff0c;唯一的解决办法就是使用复数空间&#xff0c;需要使用复数来执行一些计算操作。 复数可以用使用函数complex(real, imag) 或者是带有后缀j 的浮点数来指定。 比如&#xff1a; >>> a complex(2, 4) >>>…

分页查询的实现(struts2+jsp+jstl+el)

文章目录MySQL的分页查询语句如何设置《上一页》和《下一页》的有效性呢&#xff1f;示例代码MySQL的分页查询语句 使用 MySQL 的分页查询语句 select * from project limit 5,5&#xff0c;打开表 project&#xff0c;获取全部记录&#xff0c;只要第 5 条记录后的 5 条记录&…

junit 测试执行顺序_JUnit 5中的测试执行顺序

junit 测试执行顺序一般实践认为&#xff0c;自动化测试应能够独立运行且无特定顺序&#xff0c;并且测试结果不应依赖于先前测试的结果。 但是在某些情况下&#xff0c;可以证明特定的测试执行顺序是正确的&#xff0c;尤其是在集成或端到端测试中。 默认情况下&#xff0c;在…