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控制器,所以它可能对你有用。

http://www.jdal.org/doc/displaytag.php