Thymeleaf and Spring Controllers

Slides:



Advertisements
Similar presentations
AngularJS Routing Routes, Route Parameters, Templates, Location, Navigation SoftUni Team Technical Trainers Software University
Advertisements

AngularJS Services Built-in and Custom Services SoftUni Team Technical Trainers Software University
Templating, Routing, lodash Extending functionality using Collections SoftUni Team Technical Trainers Software University
Controllers and Markup Controllers, $scope, Markup, Directives, Expressions, Binding, Filters, Validation SoftUni Team Technical Trainers Software University.
AMD and RequireJS Splitting JavaScript Code into Dependent Modules Software University Technical Trainers SoftUni Team.
Sessions and Cookies State Management, Cookies, Sessions, Hidden Fields SoftUni Team Technical Trainers Software University
Forms Overview, Query string, Submitting arrays, PHP & HTML, Input types, Redirecting the user Mario Peshev Technical Trainer Software.
First Steps in PHP Creating Very Simple PHP Scripts SoftUni Team Technical Trainers Software University
Helpers, Data Validation
Auto Mapping Objects SoftUni Team Database Applications
Introduction to Servlets
Working with Fluent API Inheritance Strategies
Databases basics Course Introduction SoftUni Team Databases basics
Sockets, Routing, Sessions, Handlers
C# Basic Syntax, Visual Studio, Console Input / Output
C# MVC Frameworks – ASP.NET
ASP.NET Essentials SoftUni Team ASP.NET MVC Introduction
C# Basic Syntax, Visual Studio, Console Input / Output
Web API - Introduction AJAX, Spring Data REST SoftUni Team Web API
Introduction to MVC SoftUni Team Introduction to MVC
Cookies, Sessions, Bootstrap
Deploying Web Application
PHP MVC Frameworks Course Introduction SoftUni Team Technical Trainers
PHP Fundamentals Course Introduction SoftUni Team Technical Trainers
Module Development Part 2 Magento 1 Stenik Group Ltd. Martin Grozdanov
Introduction to Entity Framework
ASP.NET Integration Testing
ASP.NET Unit Testing Unit Testing Web API SoftUni Team ASP.NET
Mocking tools for easier unit testing
Parsing JSON JSON.NET, LINQ-to-JSON
State Management Cookies, Sessions SoftUni Team State Management
Browser Routing Design Patterns in JS
EF Code First (Advanced)
PHP MVC Frameworks MVC Fundamentals SoftUni Team Technical Trainers
Spring Filters Spring Interceptors SoftUni Team Spring Interceptors
EF Relations Object Composition
Entity Framework: Code First
Parsing XML XDocument and LINQ
Registration, Login, Thymeleaf
Databases advanced Course Introduction SoftUni Team Databases advanced
C#/Java Web Development Basics
MVC Architecture. Routing
Entity Framework: Relations
Functional Programming
The Right Way Control Flow
ASP.NET Razor Engine SoftUni Team ASP.NET MVC Introduction
MVC Architecture, Symfony Framework for PHP Web Apps
AJAX and jQuery AJAX AJAX Concepts, XMLHttpRequest, jQuery AJAX: $.ajax(), $.get(), $.post() jQuery AJAX XMLHttpRequest SoftUni Team Technical Trainers.
ASP.NET MVC Introduction
C#: ASP.NET MVC Overview
Best Practices and Architecture
Creating UI elements with Handlebars
Testing with Spring Boot
Spring Boot Introduction
Design & Module Development
Magento Basics part 2 Modules & Themes Stenik Group Ltd. Magento
Extending functionality using Collections
ASP.NET REST Services SoftUni Team ASP.NET REST Services
Exporting and Importing Data
ASP.NET Filters SoftUni Team ASP.NET MVC Introduction
ASP.NET Razor Engine SoftUni Team ASP.NET MVC Introduction
C# Advanced Course Introduction SoftUni Team C# Technical Trainers
Course Overview, Trainers, Evaluation
Scheduled Tasks and Web Socket
CSS Transitions and Animations
Train the Trainers Course
Directives & Forms Capturing User Input SoftUni Team
JavaScript: ExpressJS Overview
CSS Transitions and Animations
Iterators and Generators
Presentation transcript:

Thymeleaf and Spring Controllers Spring Essentials Thymeleaf and Spring Controllers Spring Essentials SoftUni Team Technical Trainers Software University http://softuni.bg © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Table of Contents Thymeleaf Spring Controllers Standard Expressions Forms Conditionals Loops Spring Controllers © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Have a Question? sli.do #JavaWeb

Thymeleaf The Templating Engine

What is Thymeleaf? Thymeleaf is a view engine used in Spring It allows us to: Use variables/collections in our views Execute operations on our variables "Thymeleaf is very, very extensible, and it allows you to define your own sets of template attributes (or even tags) with the names you want, evaluating the expressions you want in the syntax you want and applying the logic you want. It’s more like a template engine framework." - thymeleaf.org http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

How to use Thymeleaf? Use Spring Initializr to import Thymeleaf, or use this dependency in your pom.xml: Define the Thymeleaf library in your html file: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

Change Thymeleaf Version You also need to change the Thymeleaf version in your pom.xml: <properties> <thymeleaf.version> 3.0.2.RELEASE </thymeleaf.version> <thymeleaf-layout-dialect.version> 2.2.0 </thymeleaf-layout-dialect.version> </properties>

Thymeleaf Tags and Attributes All Thymeleaf tags and attributes begin with th: by default Example of Thymeleaf attribute: Example of Thymeleaf tag(element processor): th:block is an attribute container that disappears in the HTML <p th:text="Example"></p> <th:block> ... </th:block> © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Thymeleaf Standard Expressions Variable Expressions Selection Expressions Link (URL) Expressions Fragment Expressions ${...} *{...} More on the standard dialect here - http://www.thymeleaf.org/doc/articles/standarddialect5minutes.html @{...} ~{...} © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Thymeleaf Variable Expressions Variable Expressions are executed on the context variables Examples: ${...} ${session.user.name} ${title} ${game.id}

Thymeleaf Selection Expressions Selection Expressions are executed on the previously selected object Example: *{...} <div th:object="${book}"> ... <span th:text="*{title}">...</span> //equivalent to ${book.title} </div>

Thymeleaf Link Expressions Link Expressions are used to build URLs Example: You can also pass query string parameters: Create dynamic URLs @{...} <a th:href="@{/register}">Register</a> <a th:href="@{/details(id=${game.id})}">Details</a> <a th:href="@{/games/{id}/edit(id=${game.id})}">Edit</a> © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Variables in Thymeleaf Variables in Thymeleaf are defined using the following attribute: Where 'var' is the name of our variable and 'pesho' it’s the value Variables exists only in the scope of the tag th:with="var = 'pesho'" <div th:with="name = ${user.name}"> <p th:text="${name}"> // valid </div> <p th:text="${name}"> // invalid

Thymeleaf Fragment Expressions Fragment Expressions are easy way to move around templates Example: ~{...} <div th:with="frag=~{footer :: #main}"> … <p th:insert="${frag}"> </div> © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Thymeleaf Fragments Including entire file Including only a fragment Including fragment with parameter You can also use th:replace in order to replace the entire element th:insert="~{fragments/header}" th:insert="~{fragments/header :: dark}" th:insert="~{fragments/header (theme='dark')}"

Forms in Thymeleaf In Thymeleaf you can create almost normal HTML forms: You can have a controller that will accept an object of given type: <form th:action="@{/user}" th:method="post"> <input type="number" name="id"/> <input type="text" name="name"/> <input type="submit"/> </form> @PostMapping("/user") public ModelAndView register(@ModelAttribute User user) { ... }

Forms in Thymeleaf (2) You can pass objects to forms in order to use validations: The th:field attribute creates different attributes based on the input type <form th:action="@{/user}" th:method="post" th:object=${user}> <input type="number" th:field="*{id}"/> <input type="text" th:field="*{name}"/> <input type="submit"/> </form>

Conditional Statements in Thymeleaf If statements can be created in the following way: You can create inverted if statements using th:unless: <div th:if="${…}"> <p>The statement is true</p> </div> <div th:unless="${…}"> <p>The statement is false</p> </div>

Conditional Statements in Thymeleaf (2) You can also create switch in which the default case is "*": Or use ternary operator: <div th:switch="${writer.role}"> <p th:case="'ADMIN'">The user is admin</p> <p th:case="'MOD'">The user is moderator</p> <p th:case="*">The user has no privileges</p> </div> <p th:text="${row.even} ? 'even' : 'odd'"> ... </p>

Loops in Thymeleaf Creating a for loop: Example: <div th:each="element : ${#numbers.sequence(start, end, step)}"> <p th:text="${element}"></p> </div> <div th:each="element : ${#numbers.sequence(1, 5)}"> <p th:text="${element}"></p> </div> // 1 2 3 4 5

Loops in Thymeleaf (2) Creating a for-each loop: Getting the iterator: <div th:each="book : ${books}"> <p th:text="*{author}"></p> </div> <div th:each="u, iter : ${users}" th:object="${u}"> <p th:text="|ID: *{id}, Username: *{name}|"></p> <p th:text="|${iter.index} of ${iter.size}|"></p> </div>

Annotations, IoC Container Spring Controllers Annotations, IoC Container

Spring Controllers Defined with the @Controller annotation: Controllers can contain multiple actions on different routes. @Controller public class HomeController { … }

Controller Actions Annotated with with @RequestMapping(…) Or @RequestMapping("/home") public String home() { return "home-view"; } @RequestMapping("/home") public ModelAndView home(ModelAndView mav) { mav.setViewName("home-view"); return mav; }

Request Mapping Problem when using @RequestMapping is that it accepts all types of request methods (get, post, put, delete, head, patch…) Execute only on GET requests : @RequestMapping(value="/home", method=RequestMethod.GET) public String home() { return "home-view"; }

Get Mapping Easier way to create route for a GET request: This is alias for RequestMapping with method GET @GetMapping("/home") public String home() { return "home-view"; }

Post Mapping Similar to the GetMapping there is also an alias for RequestMapping with method POST: Similar annotations exist for all other types of request methods @PostMapping("/register") public String register() { … }

Controller Routing You can set all actions in a controller to start with a given routing: Calling the adminPanel() will be done on route "/admin/" @Controller @RequestMapping("/admin") public class AdminController { @GetMapping("/") public String adminPanel() { … }

Passing Attributes to View Passing a string to the view: The Model object will be automatically passed to the view as context variables and the attributes can be accessed from Thymeleaf using the Expression syntax - @GetMapping("/") public String welcome(Model model) { model.addAttribute("name", "Pesho"); return "welcome"; } ${name}

Working with the Session The session will be injected from the IoC container when called: Later the session attributes can be accessed from Thymeleaf using the expression syntax and the #session object: @GetMapping("/") public String home(HttpSession httpSession) { … httpSession.setAttribute("id", 2); } ${session.id}

Setting a Cookie In order to set a cookie, we need to access the HttpResponse: @GetMapping("/darktheme") public String darkTheme(HttpServletResponse httpResponse) { … httpResponse.addCookie("theme", "dark"); }

Getting a Cookie Accessing a cookie, you've set previously: Setting a default value public String index(@CookieValue("theme") String theme) { … } public String index(@CookieValue(value = "theme", defaultValue = "bootstrap.min.css") String theme ) { … }

Http Request Accessing the HttpRequest: Accessing all cookies: public String index(HttpServletRequest httpRequest) { … } public String index(HttpServletRequest httpRequest) { Cookie[] cookies = httpRequest.getCookies(); … }

Request Parameters Getting a parameter from the query string: @RequestParam can also be used to get POST parameters @GetMapping("/details") public String details(@RequestParam("id") Long id) { … } @PostMapping("/register") public String register(@RequestParam("name") String name) { … }

Request Parameters with Default Value Getting a parameter from the query string: Making parameter optional: @GetMapping("/comment") public String comment(@RequestParam(name="author", defaultValue = "Annonymous") String author) { … } @GetMapping("/search") public String search(@RequestParam(name="sort", required = false) String sort) { … }

Form Objects Spring will automatically try to fill objects with a form data The input field names must be the same as the object field names @PostMapping("/register") public String register(@ModelAttribute UserDTO userDto) { … }

Redirecting Redirecting after POST request: @PostMapping("/register") public String register(@ModelAttribute UserDTO userDto) { … return "redirect:/login"; }

Redirecting with Parameters Redirecting with query string parameters @PostMapping("/register") public String register(@ModelAttribute UserDTO userDto, RedirectAttributes redirectAttributes) { redirectAttributes.addAttribute("errorId", 3); return "redirect:/login"; }

Redirecting with Attributes Keeping objects after redirect @PostMapping("/register") public String register(@ModelAttribute UserDTO userDto, RedirectAttributes redirectAttributes) { … redirectAttributes.addFlashAttribute("userDto", userDto); return "redirect:/register"; }

Summary Thymeleaf is a powerful view engine You can work with variables and helper objects You can create loops and conditional statements You can easily create forms The Spring controllers have built-in IoC container You can create routings on actions and controllers You have access to the HttpRequest, HttpResponse, HttpSession, Cookies and others You can redirect between actions

Spring Essentials https://softuni.bg/courses/java-mvc-frameworks-spring © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

License This course (slides, examples, demos, videos, homework, etc.) is licensed under the "Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International" license © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.

Trainings @ Software University (SoftUni) Software University – High-Quality Education, Profession and Job for Software Developers softuni.bg Software University Foundation softuni.org Software University @ Facebook facebook.com/SoftwareUniversity Software University Forums forum.softuni.bg © Software University Foundation – http://softuni.org This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike license.