SpringMVC中Model和HttpServletRequest的用法有什么区别?HttpServletRequest可以完全替代Model吗?

luc*_*umt 5 spring spring-mvc

我正在使用开发我的Web项目,但我想将参数传递给jsp页面,我发现了一个问题并希望得到答案:

SpringMVC中ModelHttpServletRequest的用法有什么区别 ?HttpServletRequest可以完全替代Model吗?

我发现我可以使用它们来传递参数,并且我发现它们似乎具有相同的效果。现在我想知道何时使用Model和何时使用HttpServletRequest,我感觉Model似乎是一个重复的类,可以吗替换为HttpServletRequest完全

例如,如果我想通过将用户列表和当前日期传递到 jsp 页面,我可以通过三种不同的方式来完成:

  • 仅使用模型
@RequestMapping(value = "queryUserPage")
public String queryUserPage(int pageNo,int pageSize,Model model) {
    PageBean<UserModel> pageBean = new PageBean<UserModel>();
    pageBean.setPageNo(pageNo);
    pageBean.setPageSize(pageSize);
    pageBean.setResultList(userService.queryUserPage(pageBean));
    model.addAttribute("pageBean", pageBean);
    model.addAttribute("currentTime",new Date());
    return "settings/userManagement.jsp";
}
Run Code Online (Sandbox Code Playgroud)

- 仅使用HttpServletRequest

@RequestMapping(value = "queryUserPage")
public String queryUserPage(int pageNo,int pageSize,HttpServletRequest request) {
    PageBean<UserModel> pageBean = new PageBean<UserModel>();
    pageBean.setPageNo(pageNo);
    pageBean.setPageSize(pageSize);
    pageBean.setResultList(userService.queryUserPage(pageBean));
    request.setAttribute("pageBean", pageBean);
    request.setAttribute("currentTime",new Date());
    return "settings/userManagement.jsp";
}
Run Code Online (Sandbox Code Playgroud)

-同时使用HttpServletRequestModel

@RequestMapping(value = "queryUserPage")
public String queryUserPage(int pageNo,int pageSize,HttpServletRequest request,Model model) {
    PageBean<UserModel> pageBean = new PageBean<UserModel>();
    pageBean.setPageNo(pageNo);
    pageBean.setPageSize(pageSize);
    pageBean.setResultList(userService.queryUserPage(pageBean));
    request.setAttribute("pageBean", pageBean);
    model.addAttribute("currentTime",new Date());
    return "settings/userManagement.jsp";
}
Run Code Online (Sandbox Code Playgroud)

这三种方法都可以,但是我不知道使用Model相对于使用HttpServletRequest 的优势。有人能告诉我何时使用Model以及何时使用HttpServletRequest吗? Model的优势是什么?可以用HttpServletRequest代替吗代替吗?

提前致谢!

Pra*_*mar 3

选择权留给开发人员。但您需要记住几件事。

如果您使用HttpServletRequest,那么您必须显式映射变量并从前端获取变量(request.getAttribute)。

没有更好的事情,这只是您的愿望。因为两者都是请求范围。 但如果你使用的话,Model你有几个优点。

  • 无需映射,因为它会自动按路径名查找(@ModelAttribute)查找。
  • 只需使用注释()即可完成验证@Valid

像这样,您还可以找到询问黑白@RequestParam@ModelAttribute和的差异HttpServletRequest

有时Model也会经历HttpServletRequest

唯一的事情是HttpServletRequest由 处理ServletContainerModel经过DispatcherServlet stack

最后交给开发人员,他/她可以根据他们的需要。