Spring Portlet MVC: переадресация параметров запроса в модель

У меня есть два взгляда:

  1. Отображает некоторую общую информацию об объекте
  2. Отображает дополнительные сведения об этом объекте

Второй вид имеет ссылку на первый. Чтобы создать ссылку, мне нужна некоторая информация, скажем, два идентификатора («id1» и «id2»). Эти идентификаторы передаются контроллеру второго представления параметрами запроса.

Чтобы создать обратную ссылку во втором представлении, я должен вручную передать параметры запроса модели. Это не очень удобно.

Есть ли способ сделать эту переадресацию автоматически?

Вот пример:

Ссылка на детали в первом представлении:

<portlet:renderURL var="detailsUrl">
    <portlet:param name="action" value="showDetails" />
    <portlet:param name="id1" value="${entity.id1}" />
    <portlet:param name="id2" value="${entity.id2}"/>
</portlet:renderURL>
<a href="${detailsUrl}">Details</a>

Метод рендеринга во втором контроллере:

@RenderMapping(params = "action=showDetails")
public String showDetails (
        @RequestParam("id1") int id1,
        @RequestParam("id2") int id2,
        Model model) {
    // The current unconvenient approach
    model.addAttribute("id1", id1);
    model.addAttribute("id2", id2);

    return "showDetails";
}

Обратная ссылка во втором представлении:

<portlet:renderURL var="entityUrl">
    <portlet:param name="action" value="showEntity" />
    <portlet:param name="id1" value="${id1}" />
    <portlet:param name="id2" value="${id2}"/>
</portlet:renderURL>
<a href="${entityUrl}">Back</a>

Я искал в Интернете часы, чтобы найти что-то вроде трюка, который я пропустил. Но единственное, что я нашел, было: «Весна дозирует это автоматически для вас». Но я не могу этого подтвердить.

Спасибо за вашу помощь...


person scheffield    schedule 11.11.2010    source источник
comment
Для меня было бы нормально, если бы ответили, что это невозможно.   -  person scheffield    schedule 24.11.2010


Ответы (3)


Хорошо, если @ModelAttribute не помогает, как насчет более сложного подхода:

Создайте класс, реализующий org.springframework.web.portlet HandlerInterceptor. Вам нужно переопределить кучу методов, но в одном из них postHandleRender выполните настройку вашего идентификатора для модели.

Убедитесь, что каждый реализующий метод, который возвращает логическое значение, возвращает значение true. В противном случае методы ваших портлетов могут не вызываться (если, например, preHandleRender возвращает значение false).

Разумеется, перехватчик должен быть введен в ваш портлет, чтобы он работал. Это можно сделать, добавив в контекстную конфигурацию портлета следующее:

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="some.package.to.my.interceptors.MyInterceptor"/>
    </property>         
</bean>
person heikkim    schedule 25.11.2010

Попробуйте пометить свой идентификатор с помощью @ModelAttribute:

@RenderMapping(params = "action=showDetails")
public String showDetails (
        @ModelAttribute @RequestParam("id1") int id1,
        @ModelAttribute @RequestParam("id2") int id2,
        Model model) {
    // The current unconvenient approach
    //model.addAttribute("id1", id1);
    //model.addAttribute("id2", id2);

    return "showDetails";
}

Обратите внимание, что я закомментировал явную настройку идентификатора модели. Я не проверял это, поэтому, пожалуйста, отпишитесь здесь, если это сработает.

person heikkim    schedule 25.11.2010
comment
Привет, я уже пробовал это. И я могу сказать вам, что это не сработает. Извиняюсь. - person scheffield; 25.11.2010

Вы можете просто написать метод, как показано ниже, и добавить создание карты. Добавьте его на карту модели.

private Map<String, String> getParamterMap(PortletRequest request){
        Map<String, String> parameters = new HashMap<String, String>();

        Set<String> keySet = request.getParameterMap().keySet();
        for(String key : keySet){
            parameters.put(key, request.getParameter(key));
        }

        return parameters;

    }

Вызовите этот метод из своего метода RenderMapping, чтобы добавить все параметры запроса в ModelMap.

modelMap.addAllAttributes(getParamterMap(request));
person Raghavendra Reddy Busireddy    schedule 22.08.2013