2013-02-07 69 views
5

在我們的Web應用程序,使用Spring MVC 3.2我們顯示不同的對象多分頁列表,鏈接到列表中的其他頁面的構造是這樣的:請求參數的映射子集的一個對象Spring MVC中

/servlet/path?pageNum=4&resultsPerPage=10&sortOrder=ASC&sortBy=name 

儘管URL中還可能有其他請求參數(例如搜索過濾器)。

因此,我們必須控制方法是這樣的:

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list") 
public String ajaxlistGroups(Model model, 
    @RequestParam(value="pageNumber",required=false,defaultValue="0") Long pageNumber, 
    @RequestParam(value="resultsPerPage",required=false,defaultValue="10") int resultsPerPage, 
    @RequestParam(value="sortOrder",required=false,defaultValue="DESC") String sortOrder, 
@RequestParam(value="orderBy",required=false,defaultValue="modificationDate")String orderBy) { 
// create a PaginationCriteria object to hold this information for passing to Service layer 
// do Database search 
// return a JSP view name 

} 

,所以我們結束了這個笨拙的方法簽名,反覆多次在應用程序,每個方法需要創建一個PaginationCriteria對象來保存分頁信息並驗證輸入。

有沒有辦法自動創建我們的PaginationCriteria對象,如果這些請求參數存在?例如,替換上面:

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list") 
public String ajaxlistGroups(Model model, @SomeAnnotation? PaginationCriteria criteria, 
) { 
... 
    } 

也就是說,有沒有在Spring的方式採取定義requestParams的子集,從一個普通的GET請求,並將其轉換爲自動的對象,所以它可用於在使用控制器處理方法?我以前只使用了@ModelAttribute,這在這裏看起來並不正確。

謝謝!

回答

6

Spring 3.2應該自動將請求參數映射到自定義的java bean。

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list") 
public String ajaxlistGroups(Model model, PaginationCriteriaBean criteriaBean, 
) { 
//if PaginationCriteriaBean should be populated as long as the field name is same as 
//request parameter names. 
} 

我不知道Spring如何神奇地實現這個(沒有@ModelAttribute),但上面的代碼適用於我。

還有另外一種方法可以達到同樣的目標,實際上可以達到更多,就是春天的AOP。

<bean id="aspectBean" class="au.net.test.aspect.MyAspect"></bean> 
<aop:config> 
    <aop:aspect id="myAspect" ref="aspectBean"> 
    <aop:pointcut id="myPointcut" 
     expression="execution(* au.net.test.web.*.*(..)) and args(request,bean,..)" /> 
    <aop:before pointcut-ref="myPointcut" method="monitor" /> 
    </aop:aspect> 
</aop:config> 
在應用程序上下文

,我們與建議,而你的情況是意見之前,沿申報看點豆以及切入點

下面是源代碼

public class PaginationCriteriaBean { 

     private String id; 
     private String name; 

     public String getId() { 
      return id; 
     } 

     public void setId(String id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 
//custom Aspect 
public class MyAspect { 

    public void monitor(HttpServletRequest request,PaginationCriteriaBean bean){ 
     //populate your pagination bean 
     bean.setId(request.getParameter("id")); 
     bean.setName("my new name"); 
    } 
} 

    @RequestMapping(value="/app") 
    public String appRoot(HttpServletRequest request,PaginationCriteriaBean bean){ 
     System.out.println(bean.getId()); 
     System.out.println(bean.getName()); 
     return "app"; 
    } 

通過這樣做,方面會攔截彈簧控制器並根據請求參數填充PaginationCriteriaBean,甚至可以在請求中更改原始值。通過這個AOP實現,您可以應用更多的邏輯來對付分頁,例如日誌記錄和驗證等。

+0

謝謝您的全面解答!您的第一個解決方案符合我的目標,將該對象添加爲請求範圍的bean。 AOP解決方案看起來很有趣,但是我在過去用干擾春季單元測試的方面包裝控制器時遇到了問題......儘管我在3.2版中還沒有嘗試過,現在可能已經修復了。 – otter606

相關問題