Spring MVC 中的分页和过滤
Pagination and filter in Spring MVC
我有一个表单,用户可以在其中过滤未决交易。我想使用 Spring 的分页功能。只有当我不想过滤(与 getAll() 查询相同)时,这才有效(如我所愿)。
我的问题是,如果我 post 控制器的表单,它会搜索过滤后的交易,提供有关页数、总数等的信息。但是如果我点击分页按钮,它会转到方法签名是 GET(URL 例如 localhost.../pending?page=2&size=20),我的表单使用默认值初始化。所以过滤器不起作用,只是分页。
@RequestMapping(value = "/pending", method = RequestMethod.GET, produces = "text/html")
public String getPendingTransactions(@ModelAttribute("pendingForm") PendingTransactionForm pendingForm, Model uiModel, HttpServletRequest httpServletRequest, Pageable pageable) {
PageWrapper<Transaction> transactionItems = new PageWrapper<Transaction>(transactionService.searchPendingItemsByParams(pendingForm, pageable));
uiModel.addAttribute("pendingForm", pendingForm);
uiModel.addAttribute("transactionItems", transactionItems);
uiModel.addAttribute("shoplist", transactionService.getShopListForNotFinishedItems());
return "transaction/pendingtransactions";
}
@RequestMapping(value = "/pending", method = RequestMethod.POST)
public String processPendingTransactions(@ModelAttribute("pendingForm") PendingTransactionForm pendingForm, Model uiModel, HttpServletRequest httpServletRequest, Pageable pageable) {
PageWrapper<Transaction> transactionItems = new PageWrapper<Transaction>(transactionService.searchPendingItemsByParams(pendingForm, pageable));
uiModel.addAttribute("pendingForm", pendingForm);
uiModel.addAttribute("transactionItems", transactionItems);
uiModel.addAttribute("shoplist", transactionService.getShopListForNotFinishedItems());
return "transaction/pendingtransactions";
}
有什么解决办法,如何实现过滤和分页一起实现?
更新:感谢 Jose Luis Martin 的回答,它有效!
@RequestMapping("/transactions")
@Controller
@SessionAttributes("pendingForm")
public class TransactionsController {
@ModelAttribute("pendingForm")
public PendingTransactionForm initializePendingForm() {
return new PendingTransactionForm();
}
@RequestMapping(value = "/pending", method = {RequestMethod.POST, RequestMethod.GET}, produces = "text/html")
public String getPendingTransactions(@ModelAttribute("pendingForm") PendingTransactionForm pendingForm, Model uiModel, Pageable pageable) {
PageWrapper<Transaction> transactionItems = new PageWrapper<Transaction>(transactionService.searchPendingItemsByParams(pendingForm, pageable));
uiModel.addAttribute("transactionItems", transactionItems);
uiModel.addAttribute("shoplist", transactionService.getShopListForNotFinishedItems());
return "transaction/pendingtransactions";
}
}
使用 @SessionAttributes
在会话中存储过滤器,因此它可用于分页请求。
前段时间我写了一个displaytag和JDAL的例子,但是控制器是Spring控制器,所以它可能对你有用。
我有一个表单,用户可以在其中过滤未决交易。我想使用 Spring 的分页功能。只有当我不想过滤(与 getAll() 查询相同)时,这才有效(如我所愿)。 我的问题是,如果我 post 控制器的表单,它会搜索过滤后的交易,提供有关页数、总数等的信息。但是如果我点击分页按钮,它会转到方法签名是 GET(URL 例如 localhost.../pending?page=2&size=20),我的表单使用默认值初始化。所以过滤器不起作用,只是分页。
@RequestMapping(value = "/pending", method = RequestMethod.GET, produces = "text/html")
public String getPendingTransactions(@ModelAttribute("pendingForm") PendingTransactionForm pendingForm, Model uiModel, HttpServletRequest httpServletRequest, Pageable pageable) {
PageWrapper<Transaction> transactionItems = new PageWrapper<Transaction>(transactionService.searchPendingItemsByParams(pendingForm, pageable));
uiModel.addAttribute("pendingForm", pendingForm);
uiModel.addAttribute("transactionItems", transactionItems);
uiModel.addAttribute("shoplist", transactionService.getShopListForNotFinishedItems());
return "transaction/pendingtransactions";
}
@RequestMapping(value = "/pending", method = RequestMethod.POST)
public String processPendingTransactions(@ModelAttribute("pendingForm") PendingTransactionForm pendingForm, Model uiModel, HttpServletRequest httpServletRequest, Pageable pageable) {
PageWrapper<Transaction> transactionItems = new PageWrapper<Transaction>(transactionService.searchPendingItemsByParams(pendingForm, pageable));
uiModel.addAttribute("pendingForm", pendingForm);
uiModel.addAttribute("transactionItems", transactionItems);
uiModel.addAttribute("shoplist", transactionService.getShopListForNotFinishedItems());
return "transaction/pendingtransactions";
}
有什么解决办法,如何实现过滤和分页一起实现?
更新:感谢 Jose Luis Martin 的回答,它有效!
@RequestMapping("/transactions")
@Controller
@SessionAttributes("pendingForm")
public class TransactionsController {
@ModelAttribute("pendingForm")
public PendingTransactionForm initializePendingForm() {
return new PendingTransactionForm();
}
@RequestMapping(value = "/pending", method = {RequestMethod.POST, RequestMethod.GET}, produces = "text/html")
public String getPendingTransactions(@ModelAttribute("pendingForm") PendingTransactionForm pendingForm, Model uiModel, Pageable pageable) {
PageWrapper<Transaction> transactionItems = new PageWrapper<Transaction>(transactionService.searchPendingItemsByParams(pendingForm, pageable));
uiModel.addAttribute("transactionItems", transactionItems);
uiModel.addAttribute("shoplist", transactionService.getShopListForNotFinishedItems());
return "transaction/pendingtransactions";
}
}
使用 @SessionAttributes
在会话中存储过滤器,因此它可用于分页请求。
前段时间我写了一个displaytag和JDAL的例子,但是控制器是Spring控制器,所以它可能对你有用。