Thymeleaf与Spring集成(第2部分)

1.简介

这是Thymeleaf与Spring教程集成的第二部分。 您可以在此处阅读第一部分,在那里您将学习如何配置该项目。

如本教程第一部分开头所述,Web应用程序将发送两种类型的请求:

  • 插入新访客:将同步请求发送到服务器以添加新访客。 这将展示Thymeleaf如何与Spring的表单支持bean集成在一起。
  • 列出来宾:发送AJAX请求,该请求将更新页面的区域( 片段 ),以显示从服务器返回的来宾列表。

让我们看看我们将如何实现这一目标。

2.处理表格

在本节中,我们将了解如何使用Thymeleaf提交表单。 我们基本上需要三个属性:

  1. 行动
  2. th:对象

前两个在form元素中定义:

<form id="guestForm" th:action="@{/spring/guests/insert}" th:object="${guest}" method="post">

th:action属性重写操作URL,为应用程序上下文添加前缀。

表单元素中的th:object属性是对象选择。 然后可以在表单中引用它。 我们在这里所做的是将表单支持bean绑定到model属性,该属性是我们在呈现视图之前在控制器中定义的:

@ModelAttribute("guest")
public Guest prepareGuestModel() {return new Guest();
}

如我们所见, th:object是指Guest表单支持bean,而th:field是指其属性。 看一下表单主体:

<span class="formSpan"><input id="guestId" type="text" th:field="*{id}" required="required"/><br /><label for="guestId" th:text="#{insert.id}">id:</label>
</span><span class="formSpan" style="margin-bottom:20px"><input id="guestName" type="text" th:field="*{name}" required="required"/><br /><label for="guestName" th:text="#{insert.name}">name:</label>
</span>

th:field将要做的就是将其输入元素的值分配给backing bean属性。 因此,当用户提交表单时,所有这些th:field都将设置表单支持bean属性。

在控制器处,我们将收到Guest实例:

@RequestMapping(value = "/guests/insert", method = RequestMethod.POST)
public String insertGuest(Guest newGuest, Model model) {hotelService.insertNewGuest(newGuest);return showHome(model);
}

现在,可以将访客插入数据库。

3.发送AJAX请求

当试图找到一个通过Thymeleaf发送AJAX请求的简单示例时,我发现了Spring Webflow( 渲染片段 )示例。 我还读过其他文章,说您需要Tiles才能完成此任务。

我不想使用这些框架,因此在本节中,我使用jQuery将AJAX请求发送到服务器,等待响应并部分更新视图(片段渲染)。

表格

<form><span class="subtitle">Guest list form</span><div class="listBlock"><div class="search-block"><input type="text" id="searchSurname" name="searchSurname"/><br /><label for="searchSurname" th:text="#{search.label}">Search label:</label><button id="searchButton" name="searchButton" onclick="retrieveGuests()" type="button" th:text="#{search.button}">Search button</button></div><!-- Results block --><div id="resultsBlock"></div></div>
</form>

该表单包含带有搜索字符串(searchSurname)的输入文本,该文本将被发送到服务器。 还有一个区域(resultsBlock div),将使用从服务器收到的响应进行更新。

searchForm

当用户单击按钮时,retrieveGuests()函数将被调用。

function retrieveGuests() {var url = '/th-spring-integration/spring/guests';if ($('#searchSurname').val() != '') {url = url + '/' + $('#searchSurname').val();}$("#resultsBlock").load(url);
}

jQuery 加载函数以指定的url向服务器发出请求,并将返回HTML放入指定的元素(resultsBlock div)。

如果用户输入搜索字符串,它将搜索具有指定姓氏的所有来宾。 否则,它将返回完整的来宾列表。 这两个请求将到达以下控制器请求映射:

@RequestMapping(value = "/guests/{surname}", method = RequestMethod.GET)
public String showGuestList(Model model, @PathVariable("surname") String surname) {model.addAttribute("guests", hotelService.getGuestsList(surname));return "results :: resultsList";
}@RequestMapping(value = "/guests", method = RequestMethod.GET)
public String showGuestList(Model model) {model.addAttribute("guests", hotelService.getGuestsList());return "results :: resultsList";
}

由于Spring与Thymeleaf集成在一起,因此它现在能够返回HTML片段。 在上面的示例中,返回字符串“ results :: resultsList”是指位于结果页面中的名为resultsList的片段。 让我们看一下这个结果页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org" lang="en"><head>
</head><body><div th:fragment="resultsList" th:unless="${#lists.isEmpty(guests)}" class="results-block"><table><thead><tr><th th:text="#{results.guest.id}">Id</th><th th:text="#{results.guest.surname}">Surname</th><th th:text="#{results.guest.name}">Name</th><th th:text="#{results.guest.country}">Country</th></tr></thead><tbody><tr th:each="guest : ${guests}"><td th:text="${guest.id}">id</td><td th:text="${guest.surname}">surname</td><td th:text="${guest.name}">name</td><td th:text="${guest.country}">country</td></tr></tbody></table></div>
</body>
</html>

该片段是一个具有已注册访客的表,将被插入到结果块中:

结果块

4。结论

集成了两个框架之后,我们学习了如何将表单链接到Spring MVC模型。 我们还学习了如何发送AJAX请求和部分更新视图。

参考:来自XavierPadró博客博客的JCG合作伙伴 Xavier Padro 与Thymeleaf与Spring的集成(第2部分) 。

翻译自: https://www.javacodegeeks.com/2014/03/thymeleaf-integration-with-spring-part-2.html

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

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

相关文章

数据结构(一)

1.数据结构---数据在计算机中的存储和组织。 物理结构&#xff1a;线性存储和链式存储。 逻辑结构&#xff1a;数据的关系和联系&#xff0c;线性结构和非线性结构&#xff08;树一对多&#xff0c;前继&#xff0c;后驱&#xff09;。 数据结构和算法是伴生的&#xff0c;算法…

Vue实例和生命周期

创建一个Vue实例 每个Vue应用都是通过Vue函数创建一个新的Vue实例开始&#xff1a; var vm new Vue({//选项 }) 数据与方法 当一个Vue实例被创建时&#xff0c;它向Vue的响应式系统中加入了其data对象中能找到的所有属性。当这个属性的值发生变化时&#xff0c;视图将产生…

boid模型的Matlab程序,动物集群运动行为模型系列之五-—本科毕业设计.doc

动物集群运动行为模型系列之五-—本科毕业设计动物集群运动模型摘要本文主要模拟了鱼群的集群运动、鱼群躲避捕食者追捕的运动情况以及鸟群觅食运动的模拟&#xff0c;以此研究动物个体间的信息传递机制&#xff0c;同时也是对群体智能的初步探索。针对问题一&#xff0c;需要我…

【 jquery 】常用

$("#input1").show(slide); 渐进显示$("#input1").hide(slide); 渐进隐藏 siblings() 方法返回被选元素的所有同级元素 $("#family_name_pinyin").val(arr[0].replace(" ", "")).siblings("span").hide();…

我们正在破解JDBC,因此您不必

我们喜欢使用JDBC 没人说。 曾经 更严重的是&#xff0c;如果考虑一下&#xff0c;JDBC实际上是一个非常出色的API。 这也可能是Java成为当今流行平台的原因之一 。 在JDK 1.1 之前 &#xff0c; 以及在ODBC之前 &#xff08;这已经很久了&#xff09;&#xff0c;很难想象有任…

python之requests

转载:https://www.cnblogs.com/zhangxinqi/p/9201594.html 阅读目录 1、requests简介2、requests的安装3、requests请求4、请求响应5、requests异常处理6、cookies7、请求会话(Session)8、SSL证书验证9、代理设置10、身份认证11、编码12、其他说明1、requests简介 requests是通…

vue 项目白屏解决方案

在做的项目是使用 vue-cli 脚手架为基础的&#xff0c;只能使用微信浏览器打开的。在某次更新功能代码后&#xff0c;被反馈在一些手机上会出现白屏。经过一番探索&#xff0c;多管齐下解决了问题白屏可能的原因&#xff1a; es6 代码没有被编译成 es5 &#xff1b;文件打包路…

php如何清理网站缓存,php怎么清除opcache缓存

php清除opcache缓存的方法&#xff1a;1、开发环境中修改php.ini文件&#xff0c;将“opcache.revalidate_freq”的值改为1&#xff1b;2、在线上环境中&#xff0c;可以在PHP文件中执行“opcache_reset();”代码&#xff0c;重启web服务器。本教程操作环境&#xff1a;windows…

ActiveMQ中的温度,存储和内存使用百分比

为了有效使用ActiveMQ&#xff0c;了解ActiveMQ如何管理内存和磁盘资源以处理非持久性消息和持久性消息非常重要。 ActiveMQ具有三个关键参数&#xff0c;需要对其进行检查。 临时使用百分比 这是已用于假脱机非持久消息的已分配磁盘存储的百分比 非持久性消息是无法在代理重…

Python 爬虫之 Scrapy 分布式原理以及部署

Scrapy分布式原理 关于Scrapy工作流程 Scrapy单机架构 上图的架构其实就是一种单机架构&#xff0c;只在本机维护一个爬取队列&#xff0c;Scheduler进行调度&#xff0c;而要实现多态服务器共同爬取数据关键就是共享爬取队列。 分布式架构 我将上图进行再次更改 这里重要的就是…

【解决】ERROR in xxx.js from UglifyJs

当我们运行打包脚本 npm run build或者打包ios weexpack build ios有可能会遇到以下报错ERROR in index.js from UglifyJs![](https://img2018.cnblogs.com/blog/1504257/201811/1504257-20181102141127347-447538002.png) 这是因为webpack在打包vue文件时没有成功转换ES6的语法…

linux 给文件添加用户名和密码是什么格式,linux成批添加用户的命令

当我们遇到教学这类情况时我们需要批量添加学生用户&#xff0c;纳闷怎么才能做到成批添加用户呢?下面由学习啦小编为大家整理了linux成批添加用户命令的相关知识&#xff0c;希望大家喜欢!linux批量添加用户命令——newuserslinux批量添加用户流程&#xff1a;批量添中用户流…

JS线程与事件循环解析

JS是单线程&#xff0c;JS代码从上到下依次执行&#xff0c;但是单线程有一个非常大的问题&#xff0c;遇到耗时的任务&#xff0c;后面的任务只能等待它执行完&#xff0c;才能接着执行。比如ajax请求&#xff0c;从服务器上获取数据&#xff0c;本身是耗时的&#xff0c;如果…

Apache Camel中的断路器模式

骆驼通常在分布式环境中用于访问远程资源。 远程服务可能由于各种原因和期间而失败。 对于短时间后暂时不可用且可恢复的服务&#xff0c;重试策略可能会有所帮助。 但是某些服务可能会失败或挂起更长时间&#xff0c;从而使调用应用程序无响应且速度缓慢。 防止级联故障和关键…

深入学习决策树算法原理

分类技术&#xff08;或分类法&#xff09;是一种根据输入数据建立分类模型的系统方法&#xff0c;分类法的例子包括决策分类法&#xff0c;基于规则的分类法&#xff0c;神经网络&#xff0c;支持向量机和朴素贝叶斯分类法。这些技术都使用一种学习算法&#xff08;learning a…

HTML 页面自动刷新

学习就是一个不断积累的过程&#xff0c;每一天能够学到一点新东西说明自己就在进步&#xff01;&#xff01; HTML head 里面设置页面自动刷新功能 <meta http-equiv"Refresh" content"2"> <meta http-equiv"X-UA-Compatible" cont…

linux 编译安装python,linux下编译安装python2.7.6

安装依赖开发包yum install readline-develyum install *argparse*wget https://www.python.org/ftp/python/2.7.6/Python2.7.6.tgzipython 下载地址https://github.com/ipython/ipython/releases/download/rel-2.1.0/ipython-2.1.0.tar.gz编译安装python 2.7.6[[email protec…

kotlin访问控制符可见性

名称访问权限public&#xff08;默认&#xff09;该权限符修饰的成员可以在任何地方被访问internal该权限符修饰的成员可以在该类的内部或者文件的内部或者同一个模块内被访问protected该权限符修饰的成员可以在该类的内部或者文件的内部或者其子类中被访问private该权限符修饰…

JDK 8中方便的新地图默认方法

Map接口在JDK 8中提供了一些方便的新方法 。 因为我在本文中介绍的Map方法是作为默认方法实现的&#xff0c;所以Map接口的所有现有实现都享有默认方法中定义的默认行为&#xff0c;而无需任何新代码。 这篇文章中介绍的JDK 8引入的Map方法是getOrDefault&#xff08;Object&am…

JS观察者模式-自定义事件

111转载于:https://www.cnblogs.com/zoeeying/p/10139131.html