2015-08-01 2 views
3

Возможно ли создать динамическую замену в Thymeleaf?Thymeleaf + пружинная динамическая замена

У меня есть следующий контроллер:

@Controller 
public class LoginController { 

    @RequestMapping("/login") 
    public String getLogin(Model model){ 
     model.addAttribute("template","login"); 
     return "index"; 
    } 
} 

И следующий вид:

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org" > 
<head></head> 
<body> 

<div th:replace="fragments/${template} :: ${template}"></div> 

</body> 
</html> 

, и я получаю следующее сообщение об ошибке:

Error resolving template "fragments/${template}", template might not exist or might not be accessible by any of the configured Template Resolvers 

UPDATE

Я пытался предобработки мои переменные, как это:

<div th:replace="fragments/${__#{${template}}__} :: ${__#{${template}}__}"></div> 

Как когда-либо в настоящее время ${template} становится заменен login я следующую ошибку сейчас:

Exception evaluating SpringEL expression: "??login_en_US??" 
+0

Я не знаю, если это возможно, но я хотел бы попробовать поместить текст в одинарные кавычки, как так: 'е: заменить =" „фрагменты /“ + $ { template} + '::' + $ {template} "' –

+0

@JoeEssey благодарит за ваш комментарий. Можно выполнить конкатенацию строк, как бы без предварительной обработки это не было: fragments/$ {template} ... – Wermerb

+0

Я думаю, что вы ищете иерархический подход к размещению, такой как Tiles или SiteMesh. Thymeleaf предлагает эту функциональность. Это описано в этой статье: http://www.thymeleaf.org/doc/articles/layouts.html. См. Раздел «Диалог макета тимелеафа». – broadbear

ответ

2

Я считаю, что подходящий метод для управления этим поведением в тимелеафе следует использовать теги layout:fragment. Пожалуйста, поправьте меня, если я ошибаюсь. Вот простой пример моей страницы макета, а страница Логина, который является «динамически» загружено:

layout.html

<html xmlns:layout="http://www.w3.org/1999/xhtml" xmlns:th="http://www.w3.org/1999/xhtml"> 
<head> 
    <title layout:title-pattern="$DECORATOR_TITLE - $CONTENT_TITLE">Layout</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=Edge"/> 
</head> 
<body> 
<div> 
    <div class="app-container"> 
     <div layout:fragment="content"> 
     </div> 
    </div> 
</div> 
<div layout:fragment="script"></div> 
</body> 
</html> 

Затем, когда Логин загружается, он заменяет layout:fragment DIV с ассоциированным ДИВ в представлении HTML, который совпадает со строкой, возвращаемой методом контроллера, в этом случае login.html:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
     xmlns:layout="http://www.w3.org/1999/xhtml" 
     layout:decorator="layout"> 
<head> 
    <title>Login</title> 
</head> 
<body> 
<div layout:fragment="content"> 
    <form th:action="@{/login}" method="post"> 
     <div><label> User Name : <input type="text" name="username"/> </label></div> 
     <div><label> Password: <input type="password" name="password"/> </label></div> 
     <div><input type="submit" value="Sign In"/></div> 
    </form> 
</div> 
</body> 
</html> 

Теперь, если вы хотите загрузить другой фрагмент условно, подход, который я беру, чтобы добавить теги заменить с th: если дела. Вот пример формы, которая отображает различные вопросы, основанные на атрибуте текущего пользователя:

<div th:if="${foo.type)} == 'type_1'"> 
    <div th:replace="fragments/custom-questions :: type-1-checkboxes"></div> 
</div> 
<div th:if="${foo.type} == 'type_2'"> 
    <div th:replace="fragments/custom-questions :: type-2-checkboxes"></div> 
</div> 

Затем связанный ДИВ загружается из файла пользовательского-questions.html:

<div th:fragment="type-1-checkboxes"> 
    //stuff 
</div> 

<div th:fragment="type-2-checkboxes"> 
    //stuff 
</div> 
+0

У меня есть решение, я не знаю, что это хорошая практика:

Wermerb

+0

Снова спасибо за помощь и усилия. – Wermerb

+0

Ваша строка-интерполяция - очень крутое решение. Я только начинаю с тимелеафа после переезда с erb, поэтому я очень рад узнать об этом. –

4

Хотя Джо решение Эссе является работой, а я решил с помощью следующего кода:

<div th:replace="@{'fragments/' + ${template}} :: ${template}"></div> 
0

Я просто сталкиваясь этим вопросом (это мой первый раз с thymeleaf/весной). Это то, что решить это для меня:

<div class="col-md-12" th:include="__${template}__ :: body" ...