Могу ли я найти URL-адрес для контроллера spring mvc на уровне представления?

Я думаю, что мне нужно, чтобы в Django было указано обратное разрешение URL. Допустим, у меня есть AddUserController, который выглядит примерно так:

@Controller
@RequestMapping("/create-user")
public class AddUserController{ ... }

Я хочу, чтобы какой-то способ динамически найти URL-адрес этого контроллера или сформировать URL-адрес с параметрами для него из представления (JSP), поэтому мне не нужно жестко указывать URL-адреса для контроллеров повсюду. Возможно ли это в Spring MVC?

Ответы

Ответ 1

Считаете ли вы, что bean объединяет все URL-адреса контроллеров, которые вам нужны, в HashMap, а затем добавляет этот контроллер/URL-карту в любую модель, которая этого требует? Каждый контроллер Spring имеет возможность вызывать метод init(), каждый контроллер может добавить его имя и URL-адрес к карте контроллера/URL-адреса в методах init(), чтобы он был готов к использованию, когда контроллеры переходят в режим реального времени.

Ответ 2

Можно решить с помощью API Java Reflection. Создание библиотеки пользовательских тегов. методы выглядят как

Class c = Class.forName("Your Controller");

            for(Method m :c.getMethods()){
                if(m.getName()=="Your Method"){
                    Annotation cc = m.getAnnotation(RequestMapping.class);
                    RequestMapping rm = (RequestMapping)cc;
                    for(String s:rm.value()){
                        System.out.println(s);
                    }
                }
            }

Возможная проблема, с которой вы можете столкнуться:

1.Path Variable > Подобно этому /pet/show/ {id}, поэтому набор имени и значения пути должен быть поддержкой, а затем заменить этот String.replace() перед возвратом url

2.Method Overriding > только один метод не проблема. if Method override Необходимо предоставить последовательность поддержки типа параметра, которую вы действительно хотите, например Method.getParametersType()

3.Multiple Url to Single Method > like @RequestMapping (value = { "/", "welcome" }). поэтому простое правило выбирает первый.

4.Ant Like Style Url > Как этот *.do, чтобы решить это, используйте множественный url, разместив ant как стиль в последнем, например. @RequestMapping(value={"/pet","/pet/*.do"})


Таким образом, возможно, что стиль тега ссылки

<my:link controller="com.sample.web.PetController" method="show" params="java.lang.Integer">
<my:path name="id" value="1" />
</my:link>

Если атрибут parmas является необязательным, если переопределение метода отсутствует.


Могу ли я подумать о какой-то проблеме.:)

Ответ 3

Вы можете получить доступ к объекту запроса в любом JSP файле без необходимости вручную подключать или управлять объектом в JSP. так что вы можете получить URL-адрес от объекта запроса, иметь google в JSP-неявные объекты.

Вот страница, чтобы вы начали http://www.exforsys.com/tutorials/jsp/jsp-implicit-and-session-objects.html

Ответ 4

Я бы, вероятно, попытался создать taglib, который проверяет аннотации, которые вы используете, чтобы найти подходящее совпадение:

<x:url controller="myController">
    <x:param name="action" value="myAction"/>
</x:url>

Код Taglib может быть примерно похож на

  • Задайте Spring для настроенного beans с помощью аннотации @Controller
  • Итерации в подходящем порядке, ища подходящее совпадение в классе контроллера или bean name
  • Если @RequestMapping включает параметры, то замените их
  • Возвращает строку

Это может сработать для вашего конкретного случая (стиль @RequestMapping), но он, вероятно, немного покраснеет, когда у вас будет несколько сопоставлений. Возможно, пользовательская аннотация упростит.

Edit:

AbstractUrlHandlerMapping:: getHandlerMap, который наследуется с помощью DefaultAnnotationHandlerMapping, который вы, скорее всего, используете, возвращает карту URL-адреса обработчику

Верните зарегистрированные обработчики как немодифицированная Карта с зарегистрированным путь как ключ и объект обработчика (или имя обработчика bean в случае lazy-init обработчик) в качестве значения.

Таким образом, вы можете повторить поиск подходящего соответствия, где "подходящее совпадение" - это то, что вы хотите.

Ответ 5

Я подал запрос на повышение для этого еще в мае. Вы можете следовать/голосовать/комментировать здесь: http://jira.springsource.org/browse/SPR-5779

Ответ 6

Проблема заключается в том, что в SpringMVC нет центрального маршрутизатора, где все маршруты зарегистрированы и упорядочены. Тогда обратная маршрутизация не является статическим процессом, и разрешение маршрута на уровне представления может быть сложно интегрировать.

Отметьте этот проект для централизованного маршрутизатора (например, рельсы) и обратную маршрутизацию на уровне представления.

Ответ 7

Spring Библиотека HATEOS позволяет создавать ссылки на контроллеры.

Долгое время я думал о реализации чего-то подобного с помощью прокси CGLib, но был слишком ленив. Оказывается, Spring библиотека HATEOS позволит вам сделать прокси-путь и множество других способов.