Thymeleaf与Spring集成(第1部分)

1.引言

本文重点介绍如何将Thymeleaf与Spring框架集成。 这将使我们的MVC Web应用程序能够利用Thymeleaf HTML5模板引擎,而不会丢失任何Spring功能。 数据层使用Spring Data与mongoDB数据库进行交互。

该示例包含在酒店的单页Web应用程序中,从中我们可以发送两个不同的请求:

  • 插入一个新来宾:一个同步请求,显示Thymeleaf如何与Spring的表单支持bean集成在一起。
  • 列出来宾:异步请求,显示如何使用AJAX处理片段渲染。

本教程希望您了解Thymeleaf的基础知识。 如果不是,则应首先阅读本文 。

这是应用程序流程的示例:

酒店流

本示例基于Thymeleaf 2.1和Spring 4版本。

  • 源代码可以在github上找到。

2.配置

本教程采用JavaConfig方法来配置所需的bean。 这意味着不再需要xml配置文件。

web.xml

由于我们要使用JavaConfig,因此需要指定AnnotationConfigWebApplicationContext作为将配置Spring容器的类。 如果不指定,默认情况下它将使用XmlWebApplicationContext 。

在定义配置文件的位置时,我们可以指定类或包。 在这里,我要说明我的配置类。

<!-- Bootstrap the root context -->
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext -->
<context-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param><!-- @Configuration classes or package -->
<context-param><param-name>contextConfigLocation</param-name><param-value>xpadro.thymeleaf.configuration.WebAppConfiguration</param-value>
</context-param><!-- Spring servlet -->
<servlet><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>springServlet</servlet-name><url-pattern>/spring/*</url-pattern>
</servlet-mapping>

弹簧配置

我的配置分为两类:百里香叶弹簧集成( WebAppConfiguration类)和mongoDB配置( MongoDBConfiguration类)。

WebAppConfiguration.java

@EnableWebMvc
@Configuration
@ComponentScan("xpadro.thymeleaf")
@Import(MongoDBConfiguration.class)
public class WebAppConfiguration extends WebMvcConfigurerAdapter {@Bean@Description("Thymeleaf template resolver serving HTML 5")public ServletContextTemplateResolver templateResolver() {ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();templateResolver.setPrefix("/WEB-INF/html/");templateResolver.setSuffix(".html");templateResolver.setTemplateMode("HTML5");return templateResolver;}@Bean@Description("Thymeleaf template engine with Spring integration")public SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());return templateEngine;}@Bean@Description("Thymeleaf view resolver")public ThymeleafViewResolver viewResolver() {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setTemplateEngine(templateEngine());return viewResolver;}@Bean@Description("Spring message resolver")public ResourceBundleMessageSource messageSource() {  ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();  messageSource.setBasename("i18n/messages");  return messageSource;  }@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/");}
}

通过查看上面的代码可以突出显示以下内容:

  • @EnableWebMvc :这将启用Spring MVC注释,例如@RequestMapping。 这将与xml名称空间<mvc:annotation-driven />相同
  • @ComponentScan(“ xpadro.thymeleaf”) :激活xpadro.thymeleaf程序包和子程序包中的组件扫描。 用@Component和相关注释注释的类将被注册为bean。
  • 我们正在注册三个bean,它们是配置Thymeleaf并将其与Spring框架集成所必需的。
    • 模板解析器:解析模板名称并将其委托给servlet上下文资源解析器。

MongoDBConfiguration.java

@Configuration
@EnableMongoRepositories("xpadro.thymeleaf.repository")
public class MongoDBConfiguration extends AbstractMongoConfiguration {@Overrideprotected String getDatabaseName() {return "hotel-db";}@Overridepublic Mongo mongo() throws Exception {return new Mongo();}
}

此类扩展了AbstracMongoConfiguration ,它定义了mongoFactory和mongoTemplate bean。

@EnableMongoRepositories将扫描指定的包,以查找扩展MongoRepository的接口。 然后,它将为每个容器创建一个bean。 稍后,我们将在数据访问层部分看到这一点。

3.Thymeleaf – Spring MVC集成

酒店控制器

控制器负责访问服务层,根据结果构造视图模型并返回视图。 使用我们在上一节中设置的配置,现在MVC控制器将能够返回将被解析为Thymeleaf视图的视图ID。

在下面,我们可以看到控制器处理初始请求的片段(http:// localhost:8080 / th-spring-integration / spring / home):

@Controller
public class HotelController {@Autowiredprivate HotelService hotelService;@ModelAttribute("guest")public Guest prepareGuestModel() {return new Guest();}@ModelAttribute("hotelData")public HotelData prepareHotelDataModel() {return hotelService.getHotelData();}@RequestMapping(value = "/home", method = RequestMethod.GET)public String showHome(Model model) {prepareHotelDataModel();prepareGuestModel();return "home";}...
}

典型的MVC控制器返回一个“主”视图ID。 Thymeleaf模板解析器将在/ WEB-INF / html /文件夹中查找名为“ home.html”的模板,如配置中所示。 此外,名为“ hotelData”的视图属性将向Thymeleaf视图公开,其中包含需要在初始视图上显示的酒店信息。

主页视图的此片段显示了如何使用Spring表达式语言(Spring EL)访问view属性的某些属性:

<span th:text="${hotelData.name}">Hotel name</span><br />
<span th:text="${hotelData.address}">Hotel address</span><br />

Thymeleaf的另一个不错的功能是,它可以解析通过MessageSource接口配置的Spring托管消息属性。

<h3 th:text="#{hotel.information}">Hotel Information</h3>

错误处理

如果已经存在具有相同ID的用户,则尝试添加新用户将引发异常。 将处理异常,并使用错误消息呈现主视图。

由于我们只有一个控制器,因此无需使用@ControllerAdvice 。 我们将改为使用@ExceptionHandler注释的方法。 您会注意到,我们将国际化消息作为错误消息返回:

@ExceptionHandler({GuestFoundException.class})
public ModelAndView handleDatabaseError(GuestFoundException e) {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("home");modelAndView.addObject("errorMessage", "error.user.exist");modelAndView.addObject("guest", prepareGuestModel());modelAndView.addObject("hotelData", prepareHotelDataModel());return modelAndView;
}

Thymeleaf将使用$ {}解析view属性,然后将解析消息#{}:

<span class="messageContainer" th:unless="${#strings.isEmpty(errorMessage)}" th:text="#{${errorMessage}}"></span>

th:除非Thymeleaf属性仅在返回错误消息后才呈现span元素。

hotelError

4,服务层

服务层访问数据访问层并添加一些业务逻辑。

@Service("hotelServiceImpl")
public class HotelServiceImpl implements HotelService {@AutowiredHotelRepository hotelRepository;@Overridepublic List<Guest> getGuestsList() {return hotelRepository.findAll();}@Overridepublic List<Guest> getGuestsList(String surname) {return hotelRepository.findGuestsBySurname(surname);}@Overridepublic void insertNewGuest(Guest newGuest) {if (hotelRepository.exists(newGuest.getId())) {throw new GuestFoundException();}hotelRepository.save(newGuest);}
}

5,数据访问层

HotelRepository扩展了Spring Data类MongoRepository 。

public interface HotelRepository extends MongoRepository<Guest, Long> {@Query("{ 'surname' : ?0 }")List<Guest> findGuestsBySurname(String surname);
}

这只是一个接口,我们不会实现。 如果您还记得配置类,我们添加了以下注释:

@EnableMongoRepositories("xpadro.thymeleaf.repository")

由于这是存储库所在的包,因此Spring将创建一个bean并向其注入mongoTemplate。 扩展此接口可为我们提供通用的CRUD操作。 如果需要其他操作,则可以使用@Query注释添加它们(请参见上面的代码)。

六,结论

我们已经配置了Thymeleaf来解析Spring托管的Web应用程序中的视图。 这允许视图访问Spring Expression Language和消息解析。 本教程的下一部分将展示如何将表单链接到Spring表单支持bean,以及如何通过发送AJAX请求来重新加载片段。

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

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

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

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

相关文章

html注释快捷键

1.选中需要注释的内容--->ctrlshift/ 2.取消注释--->ctrlshift\ 转载于:https://www.cnblogs.com/wyhluckdog/p/10131898.html

Java中转发(Forward)和重定向(Redirect)的区别

从URL来说&#xff0c;转发的地址栏没有发生改变&#xff0c;而重定向则是新的URL从数据共享来说&#xff0c;转发可以共享request域里面的数据&#xff0c;而重定向则不能。效率来说转发效率高&#xff0c;重定向效率低转发一般用来登陆后转发到对应模块&#xff0c; 重定向一…

oracle 老白,老白学编程 - Netdata学习 - numa

Numa 介绍NUMA,即Non-Uniform Memory Access Architecture&#xff0c;非统一内存访问架构。背景传统的SMP中&#xff0c; 所有处理器共享系统总线&#xff0c;当cpu数目增大时&#xff0c; 系统总现竞争就相应增加&#xff0c;会成为系统的瓶颈&#xff0c;所以SMP系统的CPU数…

几个非常实用的JQuery代码片段

jQuery是一个兼容多浏览器的javascript库&#xff0c;核心理念是write less,do more(写得更少,做得更多)。jQuery使用户能更方便地处理HTML&#xff08;标准通用标记语言下的一个应用&#xff09;、events、实现动画效果&#xff0c;并且方便地为网站提供AJAX交互。jQuery还有一…

编码的喜悦……以及Java中的变异测试

多年以来&#xff0c;为源代码编写单元测试一直是一种好习惯。 并且还可以使用测试覆盖率报告来查看测试覆盖了多少代码。 尽管行分支覆盖率报告非常有用&#xff0c;但是它并不能告诉您单元测试的实际效果。 因此&#xff0c;甚至在测试中没有一个断言的情况下&#xff0c;甚至…

错误1083:配置成在该可执行程序中运行的这个服务不能执行该服务 【解决办法】...

一直好用的服务程序&#xff0c;今天遇到这个问题&#xff0c;搜了一下各位给出的解决办法&#xff1b; 1.程序里多添加serviceInstaller组件的&#xff0c;然而我并没改代码&#xff0c;也没重新编译&#xff0c;不是解决我问题的办法&#xff1b; 2.修改注册表的&#xff0c;…

oracle 更改启动内存,Oracle 11gR2修改内存参数后无法启动问题

Microsoft Windows [版本 6.1.7600]版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\windows\system32>net start oracleserviceorclOracleServiceORCL 服务正在启动 ......OracleServiceORCL 服务已经启动成功。C:\windows\system32>sqlplus / as sysdbaSQL…

查看所有shell类型

[xfxuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh 具体你使用的是那一个&#xff0c;取决于你的用户配置&#xff0c;可以在/etc/passwd文件查看最后一个字段 [xfxuexi ~]$ head -1 /etc/passwd…

Vue—事件修饰符

Vue事件修饰符 Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节&#xff0c;如&#xff1a; event.preventDefault() 或 event.stopPropagation()。Vue.js通过由点 (.) 表示的指令后缀来调用修饰符。 .stop.prevent.capture.self.once <!-- 阻止单击事件冒泡 -->…

如何安装 Angular CLI 并且检查 CLI 的版本

想在系统中安装 Angular CLI &#xff0c;如何进行安装并且如何检查 CLI 的版本&#xff1f; 可以使用命令&#xff1a; npm install -g angular/cli 进行安装。 使用命令 ng version 来查看 Angular 的 CLI 的版本 转载于:https://www.cnblogs.com/huyuchengus/p/10879166.htm…

与Maven和Docker的集成测试

Docker是其中的新热点之一。 与传统虚拟机相比&#xff0c;它具有一套不同的技术和思想&#xff0c;并通过容器的思想实现了相似但同时又有所不同的事物&#xff1a;几乎所有VM都具有强大的功能&#xff0c;但速度更快&#xff0c;并且具有非常有趣的附加功能。 在本文中&…

oracle转mysql总结经验,oracle转mysql总结(转)

ares-sdk初始开发测试使用的是oracle数据库&#xff0c;由于宁波通商的特殊需要&#xff0c;必须把数据库环境从oracle转向mysql。 现对转换过程中出现的问题及经验总结如下&#xff1a;主键生成策略创建一个专门记录序列的表sequence,记录有当前序列号,序列的间隔如1创建记录当…

vue 顶级组件

快 有时候懒的把一些通用组件写到 template里面去&#xff0c;而业务中又需要用到&#xff0c;比如表示 loading状态这样组件。如果是这样的组件&#xff0c;可以选择把组件手动初始化&#xff0c;让组件在整个app生命周期中始终保持活跃。 如&#xff1a; // a.js import Vu…

2018-2019-2 网络对抗技术 20165329 Exp 8 Web基础

2018-2019-2 网络对抗技术 20165329 Exp 8 Web基础 原理与实践说明 实践内容概述基础问题回答实践过程记录 1.Web前端&#xff1a;HTML2.Web前端&#xff1a;javascipt3.Web后端&#xff1a;MySQL基础4.Web后端&#xff1a;编写PHP网页5.最简单的SQL注入&#xff0c;XSS攻击测试…

为JVM分配内存:一个案例研究

这篇文章是关于最近的性能调整练习的。 与往常一样&#xff0c;这些开始于关于症状的模糊表述。 这次&#xff0c;魔鬼采取了“应用程序速度慢&#xff0c;我们无法访问源代码的形式。 我们有什么改善情况的选择”。 对该应用程序进行仔细研究后发现&#xff0c;它由捆绑在一起…

洛谷P4822 冻结

题目描述 “我要成为魔法少女&#xff01;” “那么&#xff0c;以灵魂为代价&#xff0c;你希望得到什么&#xff1f;” “我要将有关魔法和奇迹的一切&#xff0c;封印于卡片之中„„” 在这个愿望被实现以后的世界里&#xff0c;人们享受着魔法卡片&#xff08;\(SpellCard\…

Vue基础指令集锦

v-model双向绑定数据 <input type"text" v-model"msg"> {{msg}} ###v-on 事件 <div id"box"><button v-on:click"say">按钮</button><button click"say">按钮</button> </div>…

oracle删除实体,oracle 按条件删除、查询表

---查询表的名称&#xff0c;字段信息以及字段注释selectus.table_name, --表名ut.COLUMN_NAME,--字段名称uc.comments,--字段注释ut.DATA_TYPE,--字典类型ut.DATA_LENGTH,--字典长度ut.NULLABLE--是否为空from user_tab_columns utinner JOIN user_col_comments ucon ut.TABLE…

Thymeleaf与Spring集成(第2部分)

1.简介 这是Thymeleaf与Spring教程集成的第二部分。 您可以在此处阅读第一部分&#xff0c;在那里您将学习如何配置该项目。 如本教程第一部分开头所述&#xff0c;Web应用程序将发送两种类型的请求&#xff1a; 插入新访客&#xff1a;将同步请求发送到服务器以添加新访客。…

数据结构(一)

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