Java HTTPServletRequest对象-封装-最佳实践

Java HTTPServletRequest对象-封装-最佳实践,java,servlets,Java,Servlets,在构建java web应用程序时,有时我们使用模型类的表单类“…保存将ServletRequest传递给其他组件(如验证器)的过程。ServletRequest是一种特定于servlet的类型,不应公开给应用程序的其他层。”表单类与模型类是相同的类,但不可序列化 引用自Servlets&JSP和SpringMVC教程。我试图理解第二条语句,即ServletRequest对象是公开的。出于安全原因,这是最佳做法吗?如果有人能解释,那就太好了。显然,实现这一点需要大量的代码,对于初学者来说,这些代码

在构建java web应用程序时,有时我们使用模型类的表单类“…保存将ServletRequest传递给其他组件(如验证器)的过程。ServletRequest是一种特定于servlet的类型,不应公开给应用程序的其他层。”表单类与模型类是相同的类,但不可序列化

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

非常感谢,, A

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);

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

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

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

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);

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

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


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

我理解。谢谢,我明白了。非常感谢。