Как я могу получить URL текущей страницы в весенней загрузке 2 webflux thymeleaf, чтобы установить активную ссылку CSS - PullRequest
0 голосов
/ 31 октября 2018

Привет, у меня есть шаблон, который использует макет по умолчанию и fragemnt для заголовка и меню. То, что я пытаюсь сделать, это определить URL текущей страницы, чтобы я мог добавить требуемый CSS, чтобы показать активный.

Я пробовал th: classappend = "@ {''} == 'find-all'? 'Active': ''", однако это всегда отображает текущий путь как пустой (т. Е. Текущую страницу). Я также попытался $ {# request.getCurrentPath} с ошибкой, сообщающей, что не могу найти значение или имеет значение null.

URL-адрес / find-all, поэтому он должен обнаружить это и применить CSS, но, похоже, он не работает.

Код HTML-фрагмента ниже:

<div class="header" th:fragment="header">
<nav class="navbar navbar-expand-md navbar-dark bg-dark">
    <a class="navbar-brand" th:href="@{/}">Time Keeping/Time Sheets</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar"
            aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbar">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item" th:classappend="@{''} == 'find-all'? 'active': ''">
                <a class="nav-link" th:href="@{/find-all}">Find All</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" th:href="@{/add-new-entry}">Add new Time Entry</a>
            </li>
        </ul>
    </div>
</nav>

фрагмент зависимостей Maven,

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>nz.net.ultraq.thymeleaf</groupId>
        <artifactId>thymeleaf-layout-dialect</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Как указано ниже, это только один из используемых контроллеров.

@Controller
public class HomeController {

  private static final String currentMonthName = LocalDateTime.now().getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH);
  private final TimeKeepingEntryService service;

  public HomeController(TimeKeepingEntryService service) {
    this.service = service;
  }

  @GetMapping("/")
  public Mono<String> index(Model model) {
    model.addAttribute("metaTitle", "Time Keeping Application");
    model.addAttribute("month", currentMonthName);
    model.addAttribute("timeEntries",   service.findByMonth(currentMonthName));
    return Mono.just("index");
  }
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

С Thymeleaf 3.0.x вы можете использовать:

 ${#ctx.getRequest().getPath()}

К сожалению, пока я не вижу абстракций ни для mvc, ни для webflux.

0 голосов
/ 31 октября 2018

Вы можете использовать следующий код в Themeleaf для получения URL текущей страницы.

th:value="${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()}"

Обновление

Поскольку получение текущего URL-адреса с помощью Thymeleaf, похоже, не работает, мы могли бы обойти эту проблему. Мы можем получить текущий текущий URL в нашем @Controller и отправить его через атрибут. Это может быть достигнуто с помощью HttpServletRequest. Код в конечном итоге будет выглядеть примерно так, как показано ниже.

@GetMapping("/")
  public Mono<String> index(Model model, HttpServletRequest request) {
    model.addAttribute("metaTitle", "Time Keeping Application");
    model.addAttribute("month", currentMonthName);
    model.addAttribute("timeEntries", service.findByMonth(currentMonthName));
    model.addAttribute("currentUrl", request.getRequestURL().toString());
    return Mono.just("index");
  }

Теперь все, что вам нужно сделать, это использовать этот новый атрибут в вашем шаблоне.

<p th:text="${currentUrl}"></p>

Обновление 2

Поскольку ни один из последних вариантов не работал, вы можете попробовать использовать jQuery.

$(document).ready(function() {
    var url = $(location).attr('href');
    $("#id").text(url);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p id="id"></p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...