Spring Portlet MVC: параметры прямого запроса для модели - PullRequest
1 голос
/ 11 ноября 2010

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

  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>

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

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

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

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

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

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

Перехватчик должен быть введен в ваш портлет, чтобы он работал, конечно. Это можно сделать, добавив следующее в context-config портлета:

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="some.package.to.my.interceptors.MyInterceptor"/>
    </property>         
</bean>
0 голосов
/ 22 августа 2013

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

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));
0 голосов
/ 25 ноября 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";
}

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

...