2017-02-10 7 views
0

КонтроллерМогу ли я использовать операторы switch Thymeleaf с несколькими значениями?

@ControllerAdvice 
public class UserRoleAdvice { 

    private static final Logger log = LoggerFactory.getLogger(UserRoleAdvice.class); 

    @Autowired 
    UsersRepository usersRepository; 

    @ModelAttribute("currentRole") 
    public String currentRole(Principal principal, Model model) { 
     Users user = usersRepository.findOneByInitialName(principal.getName()); 
     if (user != null) { 
      log.info(user.getRole().toString()); 
      model.addAttribute("currentRole", user.getRole().toString()); 
      return user.getRole().toString(); 
     } else { 
      return "ANONYMOUS"; 
     } 
    } 
} 

Я использую заявление переключателя Thymeleaf контролировать то, что на моей странице появляется на основе значения в базе данных.

<th:block th:unless="${currentROLE} eq 'EMPLOYEE'"> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</th:block> 

Я хочу, чтобы скрыть страницу входа в систему, если ${currentROLE} показывает строку EMPLOYEE или MANAGER, но затем показать его, если нет значения для ${currentROLE}.

Есть ли способ сделать что-то вроде этого (псевдокод)?

<th:block th:unless="${currentROLE} eq 'EMPLOYEE' & || eq 'MANAGER'"> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</th:block> 

Или даже

<th:block th:unless="${currentROLE} exists> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</th:block> 

ответ

2

Да th:unless это правильный путь. Думаю, ваш чек ошибочен. Попробуйте с:

"${currentROLE.name == 'EMPLOYEE'}" 

и/или

"${currentROLE.name} == 'EMPLOYEE or MANAGER'" 

или

"${currentROLE.name} == 'EMPLOYEE' or ${currentROLE.name} == 'MANAGER'" 
+0

Странно. Второй дает мне сумасшедшую ошибку: «HTTP Status 500 - обработка запроса не удалась; Вложенное исключение - org.thymeleaf.exceptions.TemplateInputException: ошибка во время разбора шаблона (шаблон: «ресурс пути к шаблону [templates/home.html]») '' – santafebound

+0

обновленный ответ @santafebound. Должен работать сейчас. – Patrick

+1

Спасибо. Я использовал средний, но все они работали. – santafebound

1

http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#switch-statements

Что-то с тремя возможностями Вы не можете не делать если/если вещь с. Это тоже не переключатель; переключатель в основном переключатель (кейс, кейс, кейс ...). Это можно сделать с помощью операторов if, но помимо нескольких опций переключатели легче читать и расширять.

В этом случае он будет выглядеть как

<div th:switch="${currentROLE.name}"> 
    <span th:case="EMPLOYEE">stuff</span> 
    <span th:case="MANAGER">other stuff</span> 
    <span th:case="*">default stuff</span> 
</div> 

"*" указывает на случай, по умолчанию; если ни один из случаев не верен, он идет туда.

Если единственными возможными значениями являются EMPLOYEE, MANAGER или ничего, то стоит отметить, что любая строка, которая не является «false», «off» или «no», оценивается как true, если сравнение отсутствует. Итак, th: if = $ {currentROLE.name} произойдет, если строка есть и не равна null, а th: if = $ {currentROLE.name} произойдет, если нет значения. Это в основном работает как правдивость или фальшивость, которую делает JavaScript.

Следует учитывать, как программа будет развиваться в будущем, а также то, что вы собираетесь здесь делать.

+0

Есть ли причина, по которой вы не используете одинарные кавычки? Как для '' '' выше? – santafebound

+1

То, как я узнал Thymeleaf и соглашение, которое я использую, состоит в том, чтобы блокировать блоки этих значений в двойных кавычках и использовать одинарные кавычки внутри вещи. Я не думаю, что это важно, что вы делаете, если это согласовано, а «МЕНЕДЖЕР» и «МЕНЕДЖЕР» - это фактически одна и та же строка. Однако «МЕНЕДЖЕР» и «МЕНЕДЖЕР» означают разные вещи. – Daveycakes

Смежные вопросы