Почему tomcat не интерпретирует thymeleaf теги

239
21 февраля 2018, 10:18

Добрый день! Установил на VDS томкат 8.5.28. Развернул на него написанный на Spring сайт. Не отображается меню на сайте из-за того, что томкат не интерпретирует тэги вставки th:insert. Они как были так и остались в структуре страницы. Вопрос в том почему так происходит? Почему томкат не интерпретирует теги thymeleaf?

Мой html:

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>Главная страница. LDSV.</title>
    <link href="/avtonomki/static/css/bootstrap.min.css" rel="stylesheet">
    <link href="/avtonomki/static/css/jumbotron.css" rel="stylesheet">
    <link href="/avtonomki/static/css/font-awesome.min.css" rel="stylesheet">
    <link href="/avtonomki/static/css/login-menu.css" rel="stylesheet">
    <script src="/avtonomki/static/js/jquery-3.2.1.min.js"></script>
    <script src="/avtonomki/static/js/popper.js"></script>
    <script src="/avtonomki/static/js/bootstrap.js"></script>
    <script src="/avtonomki/static/js/bootstrap.min.js"></script>
    <script src="/avtonomki/static/js/394.js"></script>
    <script>
         function checkUsernameAndPassword(username,password) {
            if (username.length < 3 || username.length > 32) {
                shakeModal("Длина имени пользователя должна быть больше 3 символов и меньше 32.");
                return false;
            }
            if (password.length < 3 || password.length > 32) {
                shakeModal("Длина пароля должна быть больше 3 символов и меньше 32.");
                return false;
            }
            return true;
         };
        function checkUsernameExist(username) {
           var usernameIsExist = true;
           $.ajax({
              url : "/avtonomki/checkUsername",
              type : "get",
              async: false,
              data: {username: username},
              dataType:"text",
              success : function(isExist) {
                usernameIsExist = (isExist == 'true');
              }
           });
           return usernameIsExist;
        }
         $(function(){
            $("#enter_btn").click(function(){
                username = $("#enter_username").val();
                password = $("#enter_password").val();
                if (!checkUsernameAndPassword(username,password)) {
                   return false;
                }
                if (!checkUsernameExist(username)) {
                    shakeModal("Такого пользователя не существует.");
                    return false;
                }
                return true;
            });
            $("#register_btn").click(function() {
                username = $("#register_username").val();
                password = $("#register_password").val();
                password_confirm = $("#register_passwordConfirm").val();
                if (!checkUsernameAndPassword(username,password)) {
                   return false;
                }
                if (password != password_confirm) {
                    shakeModal("Пароль и его подтверждение не совпадают.");
                    return false;
                }
                if (checkUsernameExist(username)) {
                    shakeModal("Такой пользователь уже существует. Выберите другое имя пользователя.");
                    return false;
                }
                return true;
            });
         });
    </script>
</head>
<body>
    <div th:insert="~{menu.html::menu}"></div>
    <main role="main">
      <!-- Main jumbotron for a primary marketing message or call to action -->
      <div class="jumbotron">
        <div class="container">
          <p>Компания LDSV предлагает качественный ремонт грузовиков, прицепов, полуприцепов в Московской области.
          Производим агрегатный ремонт автономных отопителей и предпусковых подогревателей Eberspacher, Webasto, Планар,
          редукторов, электродвигателей Haldex.</p>
          <p>Наш автосервис готов принять на ремонт тягачи и сцепки близлежащих городов: Щелково, Балашиха, Мытищи, Королев, Москва, Ногинск, Лосино-Петровский, Монино, Обухово, Черноголовка, Пушкино, Ивантеевка, Фрязино,
          Фряново, Красноармейск, Старая Купавна, Реутов, Железнодорожный, Электроугли, Электросталь, Павловский Посад.</p>
          <p>Осуществляем комплексное обслуживание транспортных предприятий, возможен выезд на территорию заказчика.</p>
          <!-- <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more »</a></p> -->
        </div>
      </div>
      <div th:insert="~{footer.html::footer}"></div>
      <div class="modal fade login" id="loginModal">
      <div class="modal-dialog login animated">
      <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <!-- <h4 class="modal-title">Вход</h4> -->
      </div>
      <div class="modal-body">
      <div class="box">
      <div class="content">
      <div id="error" class="error"></div>
      <div class="form loginBox">
      <form method="POST" action="/avtonomki/login" modelAttribute="userForm" accept-charset="UTF-8">
        <input id="enter_username" class="form-control" type="text" placeholder="Логин" name="username">
        <input id="enter_password" class="form-control" type="password" placeholder="Пароль" name="password">
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
        <input id="enter_btn" class="btn btn-default btn-login" type="submit" value="Вход">
      </form>
      </div>
      </div>
      </div>
      <div class="box">
      <div class="content registerBox" style="display:none;">
      <div class="form">
      <form method="POST" html="{:multipart=>true}" modelAttribute="userForm" data-remote="true" action="/avtonomki/registration" accept-charset="UTF-8">
        <input id="register_username" class="form-control" type="text" placeholder="Логин" name="username">
        <input id="register_password" class="form-control" type="password" placeholder="Пароль" name="password">
        <input id="register_passwordConfirm" class="form-control" type="password" placeholder="Повторите пароль" name="passwordConfirm">
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
        <input id="register_btn" class="btn btn-default btn-register" type="submit" value="Создать аккаунт">
      </form>
      </div>
      </div>
      </div>
      </div>
      <div class="modal-footer">
      <div class="forgot login-footer">
      <span>
        <!-- <a href="javascript: showRegisterForm();">Создать аккаунт?</a> -->
      </span>
      </div>
      <div class="forgot register-footer" style="display:none">
      <span>Уже есть аккаунт?</span>
        <a href="javascript: showLoginForm();">Вход</a>
      </div>
      </div>
      </div>
      </div>
      </div>
    </main>
    <footer class="container">
      <p>©LDSV LTD. 2018</p>
    </footer>
</body>
</html>

Моя MVC конфигурация Spring:

@Configuration
@EnableWebMvc
@ComponentScan({ "ru.dev.avtonomki" })
public class WebMVCConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
    @Bean
    public ViewResolver jspViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine(jspTemplateResolver()));
        resolver.setContentType("text/html");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setOrder(1);
        resolver.setViewNames(ArrayUtil.array("*.html"));
        return resolver;
    }
    private TemplateEngine templateEngine(ITemplateResolver templateResolver) {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.addDialect(new LayoutDialect(new GroupingStrategy()));
        engine.addDialect(new Java8TimeDialect());
        engine.setTemplateResolver(templateResolver);
        //engine.setTemplateEngineMessageSource(messageSource());
        return engine;
    }
    private ITemplateResolver jspTemplateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/");
        //resolver.setSuffix(".jsp");
        resolver.setCacheable(false);
        resolver.setTemplateMode(TemplateMode.HTML5);
        return resolver;
    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new NameFormatter());
    }
}

Почему так происходит? Почему tomcat не интерпретирует теги thymeleaf?

READ ALSO
Нужно сравнить два LIst&lt;Integer&gt; поэлементно?

Нужно сравнить два LIst<Integer> поэлементно?

ЗдравствуйтеЕсть list1 - (10,1) и list2 - (1,10) есть метод Integer

190
Ошибка Gradle при создании нового проекта в Android Studio

Ошибка Gradle при создании нового проекта в Android Studio

Ставлю Android Studio на новый пкПри создании нового проекта выходит ошибка

157
CONNECTIVITY_ISSUE uber api android

CONNECTIVITY_ISSUE uber api android

Сразу предупреждаю что зарегистрировал url перенаправления в панели управления ubeВыходит ошибка в AuthenticationError CONNECTIVITY_ISSUE как говорит документация...

180
Делегирование реализации интерфейсов

Делегирование реализации интерфейсов

Есть некий интерфейс A и есть его наследник интерфейс BУ меня есть объект интерфейса A мне нужно создать класс, реализующий интерфейс B

138