Предоставляет ли Spring MVC какой-либо Java API для создания веб-ссылок? - PullRequest
2 голосов
/ 19 января 2011

Прямо сейчас мой web.xml настроен так, что Spring MVC принимает на себя все, что имеет суффикс * .html.У меня есть несколько контроллеров, которые генерируют веб-ссылки на основе текущего состояния пользователя.

Например, у меня есть следующий код, чтобы определить, на что должна указывать кнопка «Далее»:

if (nextSlide != null) {
    nextLink = String.format("/%s/module/%d/slide/%d.html", studyName, moduleId, nextSlide.getKey());
}
else {
    nextLink = String.format("/%s/module/all.html", studyName);
}

Но мне не нравится этот подход, потому что я жестко прописываю «.html» к ссылкам здесь.Я, конечно, мог бы создать фабрику, которая генерирует ссылки с суффиксом ".html", чтобы скрыть их от всего кода контроллера, но для этого все же требуется, чтобы я один раз жестко закодировал ".html" в своем коде Java ... не слишком СУХОЙ.

Я надеюсь, что в Spring MVC есть несколько API, которые позволяют мне создавать ссылки.Если эти API не существуют, вы жестко закодировали суффикс в коде Java, как то, что я делаю здесь?

Ответы [ 2 ]

1 голос
/ 20 января 2011

Там нет. Учитывая, что у вас есть, у вас есть три варианта. Два из них ваш выбор, и вариант DBW. Другой - создать свой собственный taglib .

Похоже, вы выполняете какие-то функции мастера (где экран 2 зависит от нажатия на экране 1). В таком случае я бы посмотрел на Spring Webflow .

Еще одна возможность - выполнить AJAX-вызов для какого-либо метода принятия решения, или вы можете обработать все это на стороне клиента с помощью JavaScript.

Кроме того, FWIW, я не думаю, что кодирование .html нарушает DRY, но я был бы обеспокоен обслуживанием в случае, если ваш сервлет когда-либо совпадал с чем-то кроме этого суффикса. Скорее всего, вы могли бы сделать что-то похожее на приведенный ниже пример, просто по существу вернув новый ModelAndView или перенаправив на него как минимум:

@RequestMapping("slide/{id}")
public String goToSlide(@PathParam("id") String id, ModelMap model) {
    model.adAttribute("slide", slideService.findById(id));
    return "slides/slide";
}

@RequestMapping("all")
public String getAllSlides() {
    return "slides/all";
}

@RequestMapping(value="slideshow/{id}", method=RequestMethod.GET)
public String getSlideshow(@PathParam("id") String slideshowId, ModelMap model) {
    model.attAttribute("slideshow", slideshowService.findById(slideshowId));
    return "slides/slideshow";
}

@RequestMapping(value="slideshow", method=RequestMethod.POST)
public String postSlideshow(@QueryParam("slideId") String slideId) {
    if(slideId != null) {
        return "slide/" + slideId;
    }
    return "redirect:all";
}
1 голос
/ 19 января 2011

Кажется, что создание URL-адресов должно обрабатываться в представлении, а не в контроллере. Перемещение его в представление избавит от необходимости жестко кодировать что-либо на Java. Вы также сможете использовать URL-тег Spring. Из документов API Spring:

<spring:url value="/url/path/{variableName}">
    <spring:param name="variableName" value="more than JSTL c:url" />
</spring:url>

// Results in: /currentApplicationContext/url/path/more%20than%20JSTL%20c%3Aurl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...