2010-11-11 3 views
1

я получил два вида: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> 

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

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

+0

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

ответ

0

Try испачкать идентификаторы с @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"; 
} 

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

+0

Привет, я уже пробовал это. И я могу сказать, что это не сработает. Сожалею. – scheffield

2

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

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

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

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

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <bean class="some.package.to.my.interceptors.MyInterceptor"/> 
    </property>   
</bean> 
+0

Хорошо, я попробую это. – scheffield

0

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

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));