在构建Java Web应用程序时,有时我们会在模型类中使用Form类,以“ ...将ServletRequest传递给其他组件(例如验证器)。ServletRequest是Servlet特定的类型,不应公开给Servlet的其他层申请。”表单类与模型类相同,但不可序列化。

引用来自Servlets&JSP和Spring MVC教程。我正在尝试理解第二条语句,即ServletRequest对象已公开。出于安全原因,这是最佳做法吗?如果有人可以解释,那就太好了。显然,实现此功能需要大量代码,对于我来说,对于初学者而言,这似乎是多余的。

非常感谢,
一个。

最佳答案

ServletRequest是特定于Servlet的类型,不应暴露给应用程序的其他层。


如果您的服务,数据访问对象等都绑定到ServletRequest类(例如,它们都以ServletRequest作为参数),那么您有两个主要缺点:


该代码仅在Servlet上下文中可用:您不能在控制台应用程序中或在不基于Servlet规范的Web应用程序中使用它们,也不能在HTTP请求以外的其他动作(例如来自例如一个队列)
该代码更难阅读,理解和测试


让我们举一个简单的例子。在这两个版本的方法之间最容易理解的是:

class TransferForm {
  String fromAccountId;
  String toAccountId;
  BigDecimal amount;

  // constructor, methods omitted for brevity
}

void transferMoney(TransferForm form);


要么

void transferMoney(HttpServletRequest request)


知道必须将什么作为参数传递给这两种方法有多容易?

在第一种情况下,这非常清楚。

在第二种情况下:请求中的金额在哪里?是参数吗?属性?如何命名?应该有什么类型?如何在测试中创建并填充HttpServletRequest的实例?

07-26 03:09