From 5cf0388a29b1d66fcf7a6f24c94610954ee3ad45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Fern=C3=A1ndez?= Date: Sat, 7 Jan 2023 23:29:11 +0000 Subject: [PATCH] Updated articles and 3.1 tutorials after latest package changes --- doc/articles/fromhtmltohtmlviahtml.html | 2 +- doc/articles/layouts.html | 14 +- ...ainextendingthymeleafevenmore5minutes.html | 4 +- .../sayhelloextendingthymeleaf5minutes.html | 2 +- doc/articles/springmail.html | 2 +- doc/articles/springmvcaccessdata.html | 204 +++++++++--------- doc/articles/springsecurity.html | 2 +- doc/articles/standarddialect5minutes.html | 2 +- doc/articles/thvsjsp.html | 6 +- doc/articles/thymeleaf3migration.html | 6 +- doc/tutorials/3.1/extendingthymeleaf.epub | Bin 219646 -> 219656 bytes doc/tutorials/3.1/extendingthymeleaf.html | 2 +- doc/tutorials/3.1/extendingthymeleaf.mobi | Bin 305231 -> 305239 bytes doc/tutorials/3.1/extendingthymeleaf.pdf | Bin 420540 -> 420718 bytes doc/tutorials/3.1/thymeleafspring.epub | Bin 119353 -> 119356 bytes doc/tutorials/3.1/thymeleafspring.mobi | Bin 308148 -> 308148 bytes doc/tutorials/3.1/thymeleafspring.pdf | Bin 339335 -> 339335 bytes doc/tutorials/3.1/usingthymeleaf.epub | Bin 145817 -> 145818 bytes doc/tutorials/3.1/usingthymeleaf.mobi | Bin 289478 -> 289478 bytes doc/tutorials/3.1/usingthymeleaf.pdf | Bin 647561 -> 647561 bytes 20 files changed, 123 insertions(+), 123 deletions(-) diff --git a/doc/articles/fromhtmltohtmlviahtml.html b/doc/articles/fromhtmltohtmlviahtml.html index 9b2f6405b..f813f6c25 100644 --- a/doc/articles/fromhtmltohtmlviahtml.html +++ b/doc/articles/fromhtmltohtmlviahtml.html @@ -149,7 +149,7 @@

So what is HTML5?

Can I use HTML5 already?

Mostly yes. While (as of 2016) there is no browser that fully implements the whole HTML5 feature set, most of the common ones do implement a large part of it. So as long as your users are not stuck with very old versions of (now-defunct) Internet Explorer, you should be fine in most scenarios.

Also, note that browser support actually evolves with time not only because of the quick pace at which browsers release new versions, but also because the specification itself is still work in progress.

-

For a list of HTML5 features and the corresponding browser support, check the Can I use… website. Notably, the HTML5 category list for all of the features: http://caniuse.com/#cats=HTML5

+

For a list of HTML5 features and the corresponding browser support, check the Can I use… website. Notably, the HTML5 category list for all of the features: http://caniuse.com/#cats=HTML5

And what about XHTML5? Does that exist?

diff --git a/doc/articles/layouts.html b/doc/articles/layouts.html index 2b1e734ca..fcb995160 100644 --- a/doc/articles/layouts.html +++ b/doc/articles/layouts.html @@ -88,7 +88,7 @@

Hierarchical-style layouts

Example Application

-

All the samples and code fragments presented in this article are available on GitHub at https://github.com/thymeleaf/thymeleafexamples-layouts

+

All the samples and code fragments presented in this article are available on GitHub at https://github.com/thymeleaf/thymeleafexamples-layouts

Thymeleaf Standard Layout System

@@ -154,10 +154,10 @@

Basic inclusion with th:insert and th:replace

Home page when not signed in
Home page when not signed in
-

In the above example, we are building a page that consists of page header and page footer. In Thymeleaf all fragments can be defined in a single file (e.g. fragments.html) or in a separate files, like in this particular case.

+

In the above example, we are building a page that consists of page header and page footer. In Thymeleaf all fragments can be defined in a single file (e.g. fragments.html) or in a separate files, like in this particular case.

Let’s shortly analyze the inclusion statement:

<div th:replace="fragments/header :: header">...</div>
-

The first part of the statement, fragments/header, is a template name that we are referencing. This can be a file (like in this example) or it can reference to the same file either by using the this keyword (e.g. this :: header) or without any keyword (e.g. :: header). The expression after double colon is a fragment selector (either fragment name or Markup Selector). As you can also see, the header fragment contains a markup that is used for static prototyping only.

+

The first part of the statement, fragments/header, is a template name that we are referencing. This can be a file (like in this example) or it can reference to the same file either by using the this keyword (e.g. this :: header) or without any keyword (e.g. :: header). The expression after double colon is a fragment selector (either fragment name or Markup Selector). As you can also see, the header fragment contains a markup that is used for static prototyping only.

Header and footer are defined in the following files:

Template fragments/header.html

<!DOCTYPE html>
@@ -226,7 +226,7 @@ 

Basic inclusion with th:insert and th:replace

Including with Markup Selectors

In Thymeleaf, fragments don’t need to be explicitly specified using th:fragment at the page they are extracted from. Thymeleaf can select an arbitrary section of a page as a fragment (even a page living on an external server) by means of its Markup Selector syntax, similar to XPath expressions, CSS or jQuery selectors.

<div th:insert="https://www.thymeleaf.org :: section.description" >...</div>
-

The above code will include a section with class="description" from thymeleaf.org.

+

The above code will include a section with class="description" from thymeleaf.org.

In order to make it happen, the template engine must be configured with UrlTemplateResolver:

@Bean
 public SpringTemplateEngine templateEngine() {
@@ -463,7 +463,7 @@ 

Creating a layout

Layout page
Layout page
-

The above file is our decorator for content pages we will be creating in the application. The most important thing about the above example is layout:fragment="content". This is the heart of the decorator page (layout). You can also notice, that header and footer are included using Standard Thymeleaf Layout System.

+

The above file is our decorator for content pages we will be creating in the application. The most important thing about the above example is layout:fragment="content". This is the heart of the decorator page (layout). You can also notice, that header and footer are included using Standard Thymeleaf Layout System.

The content page looks as follows (WEB-INF/views/task/list.html):

<!DOCTYPE html>
 <html layout:decorate="~{task/layout}">
@@ -502,7 +502,7 @@ 

Creating a layout

Layout page
Layout page
-

Content of this task/list view will be decorated by the elements of task/layout view. Please note layout:decorate="~{task/layout}" attribute in <html> element. This attribute signals to the Layout Dialect which layout should be used to decorate given view. And please note it is using Thymeleaf Fragment Expression syntax.

+

Content of this task/list view will be decorated by the elements of task/layout view. Please note layout:decorate="~{task/layout}" attribute in <html> element. This attribute signals to the Layout Dialect which layout should be used to decorate given view. And please note it is using Thymeleaf Fragment Expression syntax.

And what about Natural Templates using the Layout Dialect? Again, possible! You simply need to add some prototyping-only markup around the fragments being included in your templates and that’s it!

@@ -584,7 +584,7 @@

Thymeleaf Custom Layout

  • Controllers return view names, that translate to single Thymeleaf view file (1)
  • Before rendering the view, the original viewName attribute in ModelAndView object is replaced with with the name of the layout view and the original viewName becomes an attribute in ModelAndView.
  • -
  • The layout view (2) contains several include elements: <div th:replace="${view} :: content">Page Content</div>
  • +
  • The layout view (2) contains several include elements: <div th:replace="${view} :: content">Page Content</div>
  • The actual view file contains fragments, pulled by the template which embeds the actual view

The project can be found on GitHub.

diff --git a/doc/articles/sayhelloagainextendingthymeleafevenmore5minutes.html b/doc/articles/sayhelloagainextendingthymeleafevenmore5minutes.html index 30d33fd43..777b31595 100644 --- a/doc/articles/sayhelloagainextendingthymeleafevenmore5minutes.html +++ b/doc/articles/sayhelloagainextendingthymeleafevenmore5minutes.html @@ -66,7 +66,7 @@

Thymeleaf

Say Hello Again! Extending Thymeleaf even more in another 5 minutes

-

This article is a continuation of “Say Hello! Extending Thymeleaf in 5 minutes” and is meant to be read after it. Code in this article comes from the same example application, which you can view or download from its GitHub repo.

+

This article is a continuation of “Say Hello! Extending Thymeleaf in 5 minutes” and is meant to be read after it. Code in this article comes from the same example application, which you can view or download from its GitHub repo.

Some improvements for our ‘hello’ dialect

So far our HelloDialect allowed us to turn this:

@@ -75,7 +75,7 @@

Some improvements for our ‘hello’ dialect

<p>Hello World!</p>

And it works just fine… but we want to add some nice additional features. For example:

    -
  • Allow Spring EL expressions as attribute values, like in most tags in the Spring Thymeleaf Dialect. For example: hello:sayto="${user.name}"
  • +
  • Allow Spring EL expressions as attribute values, like in most tags in the Spring Thymeleaf Dialect. For example: hello:sayto="${user.name}"
  • Internationalize output: say Hello for English, Hola for Spanish, Olá for Portuguese, etc.

And we will need all that because we want to be able to create a new attribute, called “saytoplanet” and salute all the planets in the solar system, with a template like this:

diff --git a/doc/articles/sayhelloextendingthymeleaf5minutes.html b/doc/articles/sayhelloextendingthymeleaf5minutes.html index c88bcbcaa..4d4c60bc3 100644 --- a/doc/articles/sayhelloextendingthymeleaf5minutes.html +++ b/doc/articles/sayhelloextendingthymeleaf5minutes.html @@ -67,7 +67,7 @@

Thymeleaf

Say Hello! Extending Thymeleaf in 5 minutes

Extending Thymeleaf is easy: we only have to create a dialect and add it to our template engine. Let’s see how.

-

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

+

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

Dialects

Thymeleaf Dialects are sets of features we can use in your templates. These features include:

diff --git a/doc/articles/springmail.html b/doc/articles/springmail.html index 04d68dd24..9258933b0 100644 --- a/doc/articles/springmail.html +++ b/doc/articles/springmail.html @@ -77,7 +77,7 @@

Prerequisites

Example application

-

All the code in this article comes from a working example application. You can view or download the source from its GitHub repo. Downloading this application, executing it and exploring its source code is highly recommended (note that you will have to configure your SMTP user name and password (and your SMTP server if you are not using GMail) at src/main/resources/configuration.properties).

+

All the code in this article comes from a working example application. You can view or download the source from its GitHub repo. Downloading this application, executing it and exploring its source code is highly recommended (note that you will have to configure your SMTP user name and password (and your SMTP server if you are not using GMail) at src/main/resources/configuration.properties).

Sending email with Spring

diff --git a/doc/articles/springmvcaccessdata.html b/doc/articles/springmvcaccessdata.html index 22183f774..76df7515a 100644 --- a/doc/articles/springmvcaccessdata.html +++ b/doc/articles/springmvcaccessdata.html @@ -70,110 +70,110 @@

Spring MVC and Thymeleaf: how to access data from templates

In a typical Spring MVC application, @Controller classes are responsible for preparing a model map with data and selecting a view to be rendered. This model map allows for the complete abstraction of the view technology and, in the case of Thymeleaf, it is transformed into a Thymeleaf context object (part of the Thymeleaf template execution context) that makes all the defined variables available to expressions executed in templates.

-
-

Spring model attributes

-

Spring MVC calls the pieces of data that can be accessed during the execution of views model attributes. The equivalent term in Thymeleaf language is context variables.

-

There are several ways of adding model attributes to a view in Spring MVC. Below you will find some common cases:

-

Add attribute to Model via its addAttribute method:

-
    @RequestMapping(value = "message", method = RequestMethod.GET)
-        public String messages(Model model) {
-            model.addAttribute("messages", messageRepository.findAll());
-            return "message/list";
-        }
-

Return ModelAndView with model attributes included:

-
    @RequestMapping(value = "message", method = RequestMethod.GET)
-        public ModelAndView messages() {
-            ModelAndView mav = new ModelAndView("message/list");
-            mav.addObject("messages", messageRepository.findAll());
-            return mav;
-        }
-

Expose common attributes via methods annotated with @ModelAttribute:

-
    @ModelAttribute("messages")
-        public List<Message> messages() {
-            return messageRepository.findAll();
-        }
-

As you may have noticed, in all the above cases the messages attribute is added to the model and it will be available in Thymeleaf views.

-

In Thymeleaf, these model attributes (or context variables in Thymeleaf jargon) can be accessed with the following syntax: ${attributeName}, where attributeName in our case is messages. This is a Spring EL expression. In short, Spring EL (Spring Expression Language) is a language that supports querying and manipulating an object graph at runtime.

-

You can access model attributes in views with Thymeleaf as follows:

-
    <tr th:each="message : ${messages}">
-            <td th:text="${message.id}">1</td>
-            <td><a href="#" th:text="${message.title}">Title ...</a></td>
-            <td th:text="${message.text}">Text ...</td>
-        </tr>
-
-
-

Request parameters

-

Request parameters can be easily accessed in Thymeleaf views. Request parameters are passed from the client to server like:

-
    https://example.com/query?q=Thymeleaf+Is+Great!
-

Let’s assume we have a @Controller that sends a redirect with a request parameter:

-
    @Controller
-        public class SomeController {
-            @RequestMapping("/")
-            public String redirect() {
-                return "redirect:/query?q=Thymeleaf+Is+Great!";
-            }
-        }
-

In order to access the q parameter you can use the param. prefix:

-
    <p th:text="${param.q}">Test</p>
-

In the above example if parameter q is not present, empty string will be displayed in the above paragraph otherwise the value of q will be shown.

-

Since parameters can be multivalued (e.g. `https://example.com/query?q=Thymeleaf%20Is%20Great!&q=Really%3F) you may access them using brackets syntax:

-
    <p th:text="${param.q[0] + ' ' + param.q[1]}" th:unless="${param.q == null}">Test</p>
-

Note: If you access multivalued parameter with ${param.q} you will get a serialized array as a value.

-

Another way to access request parameters is by using the special #request object that gives you direct access to the javax.servlet.http.HttpServletRequest object:

-
    <p th:text="${#request.getParameter('q')}" th:unless="${#request.getParameter('q') == null}">Test</p>
-
-
-

Session attributes

-

In the below example we add mySessionAttribute to session:

-
    @RequestMapping({"/"})
-        String index(HttpSession session) {
-            session.setAttribute("mySessionAttribute", "someValue");
-            return "index";
-        }
-

Similarly to the request parameters, session attributes can be accessed by using the session. prefix:

-
    <p th:text="${session.mySessionAttribute}" th:unless="${session == null}">[...]</p>
-

Or by using #session, that gives you direct access to the javax.servlet.http.HttpSession object: ${#session.getAttribute('mySessionAttribute')}

-
-
-

ServletContext attributes

-

The ServletContext attributes are shared between requests and sessions. In order to access ServletContext attributes in Thymeleaf you can use the #servletContext. prefix:

-
        <table>
-                <tr>
-                    <td>My context attribute</td>
-                    <!-- Retrieves the ServletContext attribute 'myContextAttribute' -->
-                    <td th:text="${#servletContext.getAttribute('myContextAttribute')}">42</td>
-                </tr>
-                <tr th:each="attr : ${#servletContext.getAttributeNames()}">
-                    <td th:text="${attr}">javax.servlet.context.tempdir</td>
-                    <td th:text="${#servletContext.getAttribute(attr)}">/tmp</td>
-                </tr>
-            </table>
-
-
-

Spring beans

-

Thymeleaf allows accessing beans registered at the Spring Application Context with the @beanName syntax, for example:

-
    <div th:text="${@urlService.getApplicationUrl()}">...</div> 
-

In the above example, @urlService refers to a Spring Bean registered at your context, e.g.

-
    @Configuration
-        public class MyConfiguration {
-            @Bean(name = "urlService")
-            public UrlService urlService() {
-                return () -> "domain.com/myapp";
-            }
+
+

Spring model attributes

+

Spring MVC calls the pieces of data that can be accessed during the execution of views model attributes. The equivalent term in Thymeleaf language is context variables.

+

There are several ways of adding model attributes to a view in Spring MVC. Below you will find some common cases:

+

Add attribute to Model via its addAttribute method:

+
    @RequestMapping(value = "message", method = RequestMethod.GET)
+    public String messages(Model model) {
+        model.addAttribute("messages", messageRepository.findAll());
+        return "message/list";
+    }
+

Return ModelAndView with model attributes included:

+
    @RequestMapping(value = "message", method = RequestMethod.GET)
+    public ModelAndView messages() {
+        ModelAndView mav = new ModelAndView("message/list");
+        mav.addObject("messages", messageRepository.findAll());
+        return mav;
+    }
+

Expose common attributes via methods annotated with @ModelAttribute:

+
    @ModelAttribute("messages")
+    public List<Message> messages() {
+        return messageRepository.findAll();
+    }
+

As you may have noticed, in all the above cases the messages attribute is added to the model and it will be available in Thymeleaf views.

+

In Thymeleaf, these model attributes (or context variables in Thymeleaf jargon) can be accessed with the following syntax: ${attributeName}, where attributeName in our case is messages. This is a Spring EL expression. In short, Spring EL (Spring Expression Language) is a language that supports querying and manipulating an object graph at runtime.

+

You can access model attributes in views with Thymeleaf as follows:

+
    <tr th:each="message : ${messages}">
+        <td th:text="${message.id}">1</td>
+        <td><a href="#" th:text="${message.title}">Title ...</a></td>
+        <td th:text="${message.text}">Text ...</td>
+    </tr>
+
+
+

Request parameters

+

Request parameters can be easily accessed in Thymeleaf views. Request parameters are passed from the client to server like:

+
    https://example.com/query?q=Thymeleaf+Is+Great!
+

Let’s assume we have a @Controller that sends a redirect with a request parameter:

+
    @Controller
+    public class SomeController {
+        @RequestMapping("/")
+        public String redirect() {
+            return "redirect:/query?q=Thymeleaf+Is+Great!";
         }
+    }
+

In order to access the q parameter you can use the param. prefix:

+
    <p th:text="${param.q}">Test</p>
+

In the above example if parameter q is not present, empty string will be displayed in the above paragraph otherwise the value of q will be shown.

+

Since parameters can be multivalued (e.g. `https://example.com/query?q=Thymeleaf%20Is%20Great!&q=Really%3F) you may access them using brackets syntax:

+
    <p th:text="${param.q[0] + ' ' + param.q[1]}" th:unless="${param.q == null}">Test</p>
+

Note: If you access multivalued parameter with ${param.q} you will get a serialized array as a value.

+

Another way to access request parameters is by using the special #request object that gives you direct access to the javax.servlet.http.HttpServletRequest object:

+
    <p th:text="${#request.getParameter('q')}" th:unless="${#request.getParameter('q') == null}">Test</p>
+
+
+

Session attributes

+

In the below example we add mySessionAttribute to session:

+
    @RequestMapping({"/"})
+    String index(HttpSession session) {
+        session.setAttribute("mySessionAttribute", "someValue");
+        return "index";
+    }
+

Similarly to the request parameters, session attributes can be accessed by using the session. prefix:

+
    <p th:text="${session.mySessionAttribute}" th:unless="${session == null}">[...]</p>
+

Or by using #session, that gives you direct access to the javax.servlet.http.HttpSession object: ${#session.getAttribute('mySessionAttribute')}

+
+
+

ServletContext attributes

+

The ServletContext attributes are shared between requests and sessions. In order to access ServletContext attributes in Thymeleaf you can use the #servletContext. prefix:

+
        <table>
+            <tr>
+                <td>My context attribute</td>
+                <!-- Retrieves the ServletContext attribute 'myContextAttribute' -->
+                <td th:text="${#servletContext.getAttribute('myContextAttribute')}">42</td>
+            </tr>
+            <tr th:each="attr : ${#servletContext.getAttributeNames()}">
+                <td th:text="${attr}">javax.servlet.context.tempdir</td>
+                <td th:text="${#servletContext.getAttribute(attr)}">/tmp</td>
+            </tr>
+        </table>
+
+
+

Spring beans

+

Thymeleaf allows accessing beans registered at the Spring Application Context with the @beanName syntax, for example:

+
    <div th:text="${@urlService.getApplicationUrl()}">...</div> 
+

In the above example, @urlService refers to a Spring Bean registered at your context, e.g.

+
    @Configuration
+    public class MyConfiguration {
+        @Bean(name = "urlService")
+        public UrlService urlService() {
+            return () -> "domain.com/myapp";
+        }
+    }
 
-        public interface UrlService {
-            String getApplicationUrl();
-        }
-

This is fairly easy and useful in some scenarios.

-
-
-

References

- -
+ public interface UrlService { + String getApplicationUrl(); + }
+

This is fairly easy and useful in some scenarios.

+
+
+

References

+ +
diff --git a/doc/articles/springsecurity.html b/doc/articles/springsecurity.html index f31c4dfdc..148aaed53 100644 --- a/doc/articles/springsecurity.html +++ b/doc/articles/springsecurity.html @@ -70,7 +70,7 @@

Thymeleaf + Spring Security integration basics

Have you switched to Thymeleaf but your login and error pages are still using JSP? In this article we will see how to configure your Spring application to use Thymeleaf for login and error pages.

-

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

+

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

Note that the Thymeleaf integration packages for Spring Security support both Spring MVC and Spring WebFlux applications since Spring Security 5, but this article will focus on a Spring MVC configuration.

Prerequisites

diff --git a/doc/articles/standarddialect5minutes.html b/doc/articles/standarddialect5minutes.html index b15ddb137..6a2e67127 100644 --- a/doc/articles/standarddialect5minutes.html +++ b/doc/articles/standarddialect5minutes.html @@ -70,7 +70,7 @@

Getting started with the Standard dialects in 5 minutes

Standard dialects?

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.

-

Out of the box, nevertheless, it comes with something called the standard dialects (named Standard and SpringStandard) that define a set of features which should be more than enough for most scenarios. You can identify when these standard dialects are being used in a template because it will contain attributes starting with the th prefix, like <span th:text="...">.

+

Out of the box, nevertheless, it comes with something called the standard dialects (named Standard and SpringStandard) that define a set of features which should be more than enough for most scenarios. You can identify when these standard dialects are being used in a template because it will contain attributes starting with the th prefix, like <span th:text="...">.

Note that the Standard and the SpringStandard dialects are almost identical, except that SpringStandard includes specific features for integrating into Spring MVC applications (like, for example, using Spring Expression Language for expression evaluation instead of OGNL).

Also note we usually refer to features in the Standard dialects when we talk about Thymeleaf without being more specific.

diff --git a/doc/articles/thvsjsp.html b/doc/articles/thvsjsp.html index cfcad51ef..4ab72ad44 100644 --- a/doc/articles/thvsjsp.html +++ b/doc/articles/thvsjsp.html @@ -67,7 +67,7 @@

Thymeleaf

Spring MVC view layer: Thymeleaf vs. JSP

In this article we will compare the same page (a subscription form) created twice for the same Spring MVC application: once using Thymeleaf and another time using JSP, JSTL and the Spring tag libraries.

-

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

+

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

Common requirements

Our customers need a form for subscribing new members to a message list, with two fields:

@@ -231,7 +231,7 @@

Changing the page style using Thymeleaf

Thymeleaf page - valid as a prototype
Thymeleaf page - valid as a prototype
-

Step 2: Open the .css file with our favourite text editor. The template file statically links to the CSS in its <link rel="stylesheet" ...> tag (with an href that Thymeleaf substitutes when executing the template by the one generated by th:href). So any changes we make to that CSS will be applied to the static page our browser is displaying.

+

Step 2: Open the .css file with our favourite text editor. The template file statically links to the CSS in its <link rel="stylesheet" ...> tag (with an href that Thymeleaf substitutes when executing the template by the one generated by th:href). So any changes we make to that CSS will be applied to the static page our browser is displaying.

Step 3: Make the colour changes. As was the case with JSP, we will probably have to try several colour combinations, which will be refreshed in our browser just by pressing F5.

Done!

@@ -265,7 +265,7 @@

And what about trying to use the JSP as a static prototype?

Got HTML5?

But hey – we said at the beginning that our page was going to be HTML5, so… why don’t we use some of the cool new HTML5 form-related features?

-

For example, there is now an <input type="email" ...>, which will make our browser check that the text input by users has the shape of an email address. And also, there is a new property for all inputs called placeholder which shows a text in the field that automatically dissapears when the input gains focus (usually by the user clicking on it).

+

For example, there is now an <input type="email" ...>, which will make our browser check that the text input by users has the shape of an email address. And also, there is a new property for all inputs called placeholder which shows a text in the field that automatically dissapears when the input gains focus (usually by the user clicking on it).

Sounds good, doesn’t it? Unfortunately not all browsers support this yet (as of 2011, Opera 11 and Firefox 4 do), but we are safe using these features anyway because all browsers will treat an input of a type they do not understand (email) as a text input, and will silently ignore the placeholder attribute in the same way they ignore Thymeleaf’s th:* ones.

Doing HTML5 with JSP

diff --git a/doc/articles/thymeleaf3migration.html b/doc/articles/thymeleaf3migration.html index f20d9ac78..a230a84b5 100644 --- a/doc/articles/thymeleaf3migration.html +++ b/doc/articles/thymeleaf3migration.html @@ -71,7 +71,7 @@

Thymeleaf 3 ten-minute migration guide

Let’s have a quick look at each of the important new concepts and features this new version brings:

Template changes

-

The only change we recommend doing to your templates is removing any th:inline="text" attributes you might have, because they are not needed anymore in order to have output inlined expressions in HTML or XML templates. And it’s just a recommendation — templates will work anyway. But you will benefit from some extra processing performance if you remove those.

+

The only change we recommend doing to your templates is removing any th:inline="text" attributes you might have, because they are not needed anymore in order to have output inlined expressions in HTML or XML templates. And it’s just a recommendation — templates will work anyway. But you will benefit from some extra processing performance if you remove those.

See more information about this below in the Improved inlining mechanism section.

@@ -153,7 +153,7 @@

Template modes

There are two markup template modes (HTML and XML), three textual template modes (TEXT, JAVASCRIPT and CSS) and a no-op template mode (RAW).

The HTML template mode will admit any kind of HTML markup input, including HTML5, HTML 4 and XHTML. No markup validation of well-formedness check will be performed, and template markup code structure will be respected to the biggest possible extent in output.

For a detailed explanation of the different template modes, please take a look at Thymeleaf 3.0 Template Mode set.

-

You can see a simple example exercising the new template modes at https://github.com/jmiguelsamper/thymeleaf3-template-modes-example

+

You can see a simple example exercising the new template modes at https://github.com/jmiguelsamper/thymeleaf3-template-modes-example

Textual template modes

The new textual template modes bring to Thymeleaf the ability to output CSS, Javascript and plain text. This is handy if you want to use the values of server-side variables in your CSS and Javascript files, or to generate plain text content as, for example, in e-mail composing.

@@ -168,7 +168,7 @@

Improved inlining mechanism

Sometimes it is handy to be able to output data without using extra tags or attributes, as in:

<p>This product is called [[${product.name}]] and it's great!</p>

This capability, called inlining, has been greatly improved and is now much better supported in Thymeleaf 3. See Inlined output expressions for details.

-

The existing inlining mechanism also matches the new template modes and, indeed, make innecesary the th:inline="text" attribute because inlining now exists in HTML mode itself. Take a look at the discussion on Refactoring of the inlining mechanism

+

The existing inlining mechanism also matches the new template modes and, indeed, make innecesary the th:inline="text" attribute because inlining now exists in HTML mode itself. Take a look at the discussion on Refactoring of the inlining mechanism

diff --git a/doc/tutorials/3.1/extendingthymeleaf.epub b/doc/tutorials/3.1/extendingthymeleaf.epub index c912c76a7abda44d116f34f00c6d545b1204e925..58e205ba8dd39d1661caa160b22633222f807e05 100644 GIT binary patch delta 8529 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 i18n messages

Message resolution is an extension point in Thymeleaf (IMessageResolver interface), and therefore how these parameters are treated depends on the specific implementation being used. The default implementation in non-Spring-enabled applications (StandardMessageResolver) will do the following:

  • First look for .properties files with the same name as the template file + the locale. So if the template is /views/main.html and locale is gl_ES, it will look for /views/main_gl_ES.properties, then /views/main_gl.properties and last /views/main.properties.
  • -
  • If not found, then use the origin class (which could have been specified null) and look for .properties files in classpath with the name of the class specified there (the processor’s own class): classpath:thymeleafexamples/extrathyme/dialects/score/RemarkForPositionAttributeTagProcessor_gl_ES.properties, etc. This allows the componentization or processors and dialects with their whole set of i18n resource bundles in plain old .jar files.
  • +
  • If not found, then use the origin class (which could have been specified null) and look for .properties files in classpath with the name of the class specified there (the processor’s own class): classpath:org/thymeleaf/examples/spring6/extrathyme/dialects/score/RemarkForPositionAttributeTagProcessor_gl_ES.properties, etc. This allows the componentization or processors and dialects with their whole set of i18n resource bundles in plain old .jar files.
  • If none of these are found, have a look at the absent message representation flag. If false, simply return null. If true, create some kind of text that will allow the developer or user to quickly identify the fact that an i18n resource is missing: ??remarks.rel_gl_ES??.

(Note that, in Spring-enabled applications, this message resolution mechanism will be replaced by default with Spring’s own, based on the MessageSource beans declared at the Spring Application Context.)

diff --git a/doc/tutorials/3.1/extendingthymeleaf.mobi b/doc/tutorials/3.1/extendingthymeleaf.mobi index 68f3ecd2575bf3a6bfa8b7b6716154df9c81b49e..5ac7d1eb2bc7f0076cbabdb1c3c67cc9cc8f990c 100644 GIT binary patch delta 1577 zcma)+e^3-<7{}k;J2-_15uHqj={#iw<=Erbah&Htn24Fh2&LwXw(PxdCwsTs-kyM? zxhr>Y{E#@_L~BO78bh6&N;mUIN@gaS&cu&WnKDtKjz(jsP-oDw_k`@<_L=YddFI{s zdEOt-JMZ^hQ?GPQZAsJ|e|VC?I+PMaY@G`LFayxN3DW|=VMxNmeBW+4D$@t7|H@F)iJCCn+9FN1J207ZZxXJD=bM8rwV5}@9%!h8*L z9_DJGHta9P&g)oYSj$+D7|sB|idXW(Q-rYapNB&Uy=PmoABjeY=UU0h$`mq(SYNAa|96fC_+Vq*}8D&{ClbK^n&%!Z0RwhHUj#2@dbN)vR3aXx&lA$-G z=?&Q>=^5rUlQ}J0=~Qh_ROJ{oo#4ZjowU7QAz#iDL~n`A)Q95f3VQR-(n z0aB>DBOV36eQN7yvv&QG;=0(n=#)W`N&Ug@a5sinuF~CbhvA$&=YlTLv5DSxpwV1! zs(nlL*WdR-e}_Z3XXjY>7Zm*?jx>|&Pw3`60@EZl7dE`ZvjKj1dr@Q023lx*-yJv_ z_&ftQ<95W=G#HTRrZ-yWwj8F(w-uy6w_ssjwY*F82=87*Ps_EU;E}g50;ENMhzs;r zI2tDTlAHUzMc%4P2g^1s_V(D|M#yfL8!zlUkI=a}(^``d%FPu54enF{vMow(?(X&I z;yLZ~9UtnUi!Nn%*=e3<9ZW;1drul7J5vZBqB`di_fbhFz4f%ShOQkFV4$nc;mwu$ z+GD(Kd2n|~ltvo6Jb}K3-uh6X=wz43H`*HaT`Cher#y=e39xLD&Mu0)nW8+d(wdbp zwf(-%`l__WLebXS_&U%+bxK>G?Vzr9xkuo+Ptyg?Q*P%x;zwZrS#$loaYI?>eI8#9XDxF8;$unjxoFlxm2obdm=dKVNsBgi zCu!wBEZgW?9LoudbaM>GbW=9eS<9iA4{2A;D!Br6cIQU=m-?3yK_#Z=pgJxUN8=RY zcv9>kdCjzV9I=A4LAHQqL{6x-P;wd?xST}RtU~culGVOPI;)a*r9EOgBLLzPiS*%W z!^JG;hD%uJME8D{N#6mq`C8)4y669<%iX_nf^^eOJE7Jm*J^#+2K|de%IRx`1o>XP z5`A445mjy%7Xji6oC;m1wWw%-(RqU`d)rX~rTH~cW(&nzEqn+%!UKK3J+>RlF9XNa z`36I_AswF#-ouypVC(`{`Q&6uC9NnGN?P(vP+Dh^j>(gs9L_|P3(D7(pN2{zlE%YR z@z7!pH5u_L2VSmdp-OQH!j+IrD6TIRZ5mx3 z<^5{HPNA;R2f7_scXa#siK4%i?!2 S{AsZ!;V1j?qdn9d6ZH?{6jj3j delta 1451 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 x!nH6coRAqL42eV$6f0ha!nZLq9^t5 delta 23082 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

yJxw%lJd5yv2ANI6=@c5~RC9 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 C{{-9s delta 3471 zcmZ8kc|25Y8=hm$z6~<64U@Grp|TZIc0x?_QVdzMBx6lxY<+ggGGrUeh}WL1F_uy^ z8A~DiM3#9~NV3K!^Y(t<+xh3Ye%J51uIE1YInVFhr=^Iwsfd}=%!r-=45B*%0=;Oy zk4)w~!*ICjPaLi(G60d~Cn26=h>}cM21GEVhgoXe_cwxA)1DZIaT6_Gj?OX8c#xe9 z1rjP)8;-yo+kUvQINLiYU5ri3Uth8aC=>44Ssu}l?8Dze3c%+=wOGJUj4gcaV&_=Aek4!DV{_jY4~dvg~oNS-XX!+lOKA2bRqa`9D5^sm$TRbTjTwWn+dhJ+Rrxp>NZal3jAr$ z*Z1@73o3kFO&zS~v_AaUrZRXJpG|%z-d`9RL#BkZwzrccqbIc0bY4~O=y>Q*Fp00e zE!nXvq(7na^nwpLF{Qry8m=z**490f69F!yd+*q*7VJ@(o}8)Ri|C2x(71UY0#w=2>uzYW|Gy zFa-9A6P9adzPV_p`0}+b%D)ljhtZbH(qwMBI5O|7G}1X~)H{~PhW$V+U)qot@=%yB z4^XhWZpxqDZn5AXNX!}J+Kbo^FzPnqUSUSNbAqKT4Bp7m8vNnuOoT)!3(jJ&9;>AS49+GUQxFQ3lBT1Knkx$-I#?(wLpPS z(-~ZV-4448OAC3DQuP*fYUv9Y65qPhh{3Z+y9)3rlUN=NG4uw9J1c3|=HN%~RZ@5M z>3btJ)>wk(m)BZcD$x^avqDu(RRP+m5ij?7tSvvo3Q|)W>0+sRxMAjoT(6u&qRZrk zN?&IlkfKN!<@RM)C5;4r3Q^lXWfDHO zEn77%Vn3q2;tuW0Zn{Esdt7U+a2e70@vq3Z1+rahPvH9jQ-8{2qVFCC$fssMG{az% z;7A6TRI$tDlHIrQQJk!S1+E3;Y-6d%Lc3JuPkp-RqwzKB$FEOt1=DK?ZQO0tlMX$V z5s1CuYqsF|=0UOhjf;K(=Sv%*10q4iI1MAq&uL%CRt`_zDegY(I?wOj0{@)q@K}ON zG&8mYxPmSviz#(6N)E_kg0rg}Am*npP8a^ivc1_U z(C~e&*ti7VKPkG22!W(w&b>kJg)FGNe7AV%3WG~xXnmn_>$HV+T*{nn*FbQW8mufp z=-H0YG>e)f;Hh;oBjA}=$CBe8_+zj8#{2qo&f0HY<7PCnwi#lyz^u))l{MYHuWmEz zh@5duNODTVl>9jriWHT}zrPm&HPF8lT`7Ls6%Tn$6;gG-%;D{Z^|1zt{aM&%r^lrU zZ+>uueJ-zGGfiW#r#wHFXuev2g10;TV2R_cAFNJUZ!b-rn7yOJ zqN;XCx)K7IaufT4h~5lrOIFr7Vo_tn4;3dY@l@tUf$-eNSee1YpGg4}3Rs^GoR^jD?+{{V1%{ZZ-msqR)tJcUkgXML(I3>7P*$f|<$XJDo*)krGWOxE z=Z(%snNOu1ecp_>bRKtqtwD;xFwD(CW5?E@n3w`jv9Y)H3LBC#N*8n|q)(j2kXI8W zysr)FnK@Ku7^CDWX3U|SX_--ADzSt^73I{S-}w?T6{N!FI?51_|29!;e?wpCgthP^ z2J9oxn_5YxqndGR+wf-d{kzHD2+JNac^Yo8on7xBbtC{HV=$zws8Fcb2P$FR!9bT8H=^iqwYzE-j= zELOqh0r#+(PuQ4#v{PN4R@$aq>3O>Ir!|qRrw!H(yk~9S)oQfoX%RLX6U|~yzxOn* zNEBsX`d}IENKeF^d^$NQpwv9Bv!Tr5hVh9s$)6UFEx4tf>nJ{1orfmLtD7Sno$#yW zk@fHA)7Os)yw%~75MsI?>1Vm!zHFclX!{h)#;JscPxQ6;TKpb6b_wOqlasD_L;)5Uqc8B(PaZk2q4L+N z;FWu%;|!_o<=bmr-dWdt->RSJhE8|iQ8Mz{?os>l)qATds(72(dSM^<_ZP1A4Es3K z;mlae&v%rLhT!}L01br-7<N;*|K?;|&l^BR>}Lgs-+d+!hzbLN*g^k)oxq9o0>U)6MlS#XU^uH@K;+Q%eI}Uj z5deV{89*S&|C>MzxRhQ%mgZ_daM6kLr(EC{!EN;d?1$E2m8KJ-ULerT2oMPTFRLd` ziVV;?k24}4Y}kr({)b37An2+~Qu;~+aBXCOowh^Y0ZV^M3c#630Rr-7M!-QYfBq}b zW}5oUSbhvW2sChTfBgU2$^>_!50Dc7*#LUhM;Kua5J>Lq@1lJL;;)3ppSTb3sV+^{9hfw9fCj z6}YxvqW`@mzl)r3bOXPl1Mx4q&oi3{Ol=oXn)6R4Y>=^i00bEG}TA lYiOivU>0IzY-MC*WnkIN#?sEl!U)7nK+L?IjfG|1dH~mtFYy2X diff --git a/doc/tutorials/3.1/thymeleafspring.pdf b/doc/tutorials/3.1/thymeleafspring.pdf index a9a1ff0f1318398e5c9c6682a4dd88bbeb8419c3..06769ad952a6487037cf4e2b13ae26863695107d 100644 GIT binary patch delta 39 vcmZp_Ez*8lWWruwX;oEFBMN delta 39 vcmZp_Ez*8lWWruwX;oE7%Wa diff --git a/doc/tutorials/3.1/usingthymeleaf.epub b/doc/tutorials/3.1/usingthymeleaf.epub index 62871b28494573aa5aeaa80221c95614b999e5d6..d6a450885a48fb1a26053bfdd68827653a2893d9 100644 GIT binary patch delta 6522 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 delta 6499 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 diff --git a/doc/tutorials/3.1/usingthymeleaf.mobi b/doc/tutorials/3.1/usingthymeleaf.mobi index 99d3b7aff85d22ac450f94a4b2f7fd517a91cf43..f3576662e157d59a9377dbdc2d69a56e8edee86c 100644 GIT binary patch delta 190 zcmX?hRq)tV!3nDDJO6G?2I7r6OISEkgf)v97#P?lKV*@g{DFmY6RQbhy{Um=N}{<* zvaW%pVXCf)rG>Gsg?VbSu4%GmibblCp^2fP8BkLJ5St_?=42)nrCJfEhw&>=509&p xzc-N10%AoY10!Qy14CT{^AICrD?=509&p xzc-N10%AoY10y3{LnB=Svk)U=D6)XS% delta 51 zcmV-30L=f1!zYQuCy=)bGBGkRHZn6ZGch%R!iB;Cg~9@b!UKiE1ckx{g~A4f!Uu)I J2(`iq$KU|26)FG#