在我们的Web应用程序中,使用Spring MVC 3.2,我们显示了许多不同对象的分页列表,并且列表中其他页面的链接构造如下:
/servlet/path?pageNum=4&resultsPerPage=10&sortOrder=ASC&sortBy=name
Run Code Online (Sandbox Code Playgroud)
虽然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
}
Run Code Online (Sandbox Code Playgroud)
所以我们最终得到了这个笨拙的方法签名,在应用程序中重复了几次,每个方法都需要创建一个PaginationCriteria对象来保存分页信息,并验证输入.
有没有办法自动创建我们的PaginationCriteria对象,如果这些请求参数存在?例如,将以上内容替换为:
@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model, @SomeAnnotation? PaginationCriteria criteria,
) {
...
}
Run Code Online (Sandbox Code Playgroud)
即,Spring中是否有一种方法可以从常规GET请求中获取requestParams的已定义子集,并自动将它们转换为对象,因此可以在Controller处理程序方法中使用它?我之前只使用过@ModelAttribute,这似乎不对.
谢谢!
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.
}
Run Code Online (Sandbox Code Playgroud)
我不确定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>
Run Code Online (Sandbox Code Playgroud)
在应用程序上下文中,我们声明Aspect bean以及Pointcut以及建议,在您的情况下是建议之前
以下是源代码
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";
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,方面将拦截spring控制器并根据请求参数填充PaginationCriteriaBean,您甚至可以在请求中更改原始值.通过这个AOP实现,您可以使用更多逻辑来对抗分页,例如日志记录和验证等.
| 归档时间: |
|
| 查看次数: |
7698 次 |
| 最近记录: |