2010-11-11 53 views
1

我有兩個觀點:的Spring Portlet MVC:轉發請求參數來模擬

  1. 顯示一些常用信息有關的實體
  2. 顯示更多的細節關於這個實體

第二種觀點有鏈接回第一個。要創建鏈接我需要一些信息,可以說兩個ID(「id1」和「id2」)。這些ID通過請求參數傳遞給第二個視圖的控制器。

要在第二個視圖中創建反向鏈接,我必須將請求參數轉發給模型manualy。這不是很方便。

有沒有辦法自動做這個轉發?

這裏的示例:

鏈接到細節在第一視圖中:

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

Render方法在第二控制器:

@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> 

我在互聯網上搜索了houres,發現了一些我錯過的技巧。但我唯一發現的是:「春天爲你自動服用」。但我無法證實這一點。

感謝您的幫助......

+0

如果答案是不可能的話,那對我來說就沒問題了。 – scheffield 2010-11-24 14:19:19

回答

0

嘗試標誌着您的ID與@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"; 
} 

注意,我註釋掉的id到模型中顯式設置。 我沒有測試這一點,所以請不要報告回來,如果它的工作原理..

+0

嗨,我已經試過了。我可以告訴你它不會工作。抱歉。 – scheffield 2010-11-25 13:41:25

2

好吧,如果@ModelAttribute不利於如何複雜一點的辦法:

使實現組織的類。 springframework.web.portlet HandlerInterceptor。您需要重寫一堆方法,但在其中一個方法中,您可以將其ID設置爲模型。

確保每個返回布爾值的實現方法都返回true。否則,您的portlet方法可能無法調用(例如,如果preHandleRender返回false)。

攔截器必須引入您的portlet才能正常工作。這可以通過添加以下到portlet的上下文配置來完成:

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

好的,我會試試這個。 – scheffield 2010-11-25 14:35:45

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