【问题标题】:Java Servlets + state = How to?Java Servlets + 状态 = 如何?
【发布时间】:2012-11-17 18:57:26
【问题描述】:

在我的 Web 应用程序中,我希望在它的所有“页面”中包含某些必要的东西,例如与数据库的连接、用户信息、模板处理等。直到最近我才会有一个抽象的 servlet 来初始化以上所有在其doGetdoPost 方法中,定义抽象方法doLocalLogic(HttpServletRequest req, HttpServletResponse res) 并从doGet/doPost 方法调用它。所有的扩展类都喜欢数据库连接、用户信息等。不幸的是,结果证明这是不好的做法。

我现在想的是创建一个抽象类来完成所有这些工作,我的 servlet 中的所有逻辑都将转移到这个类的子级,servlet 只会创建这些子级的实例。

但是,这会导致我的应用程序中的每个页面都多创建一个类。此外,当您创建一个新的 servlet 时,您没有任何需要重写的抽象方法形式的线索,就像您拥有一个抽象 servlet 一样。

有没有更好的方法?

【问题讨论】:

  • 你能解释一下为什么“结果是不好的做法”吗?
  • @TomaszNurkiewicz 好吧,让我想到的是在同一个浏览器窗口中获得两个或更多完整页面。 IE。当我按下并按住 F5 时,我会得到同一页的两份或更多份。在某些情况下,当我重复导致错误的操作时,我会收到 +1 错误消息(即错误消息将被添加到错误堆栈中,我认为会重新启动)。我开始阅读该主题,并发现在 servlet 中保持状态是一个坏主意。

标签: java servlets


【解决方案1】:

首先,我认为您使用doLocalLogic() 的方法还不错,只要您通过参数而不是字段(线程在请求​​/线程之间共享)传递此本地逻辑:

public void doLocalLogic(
  Connection connection,
  UserInformation user,
  //...
  HttpServletRequest req,
  HttpServletResponse res
)

唯一的问题是您确实准备了大量数据,即使您在 servlet 中不需要它们。而且它不可扩展。

您真正需要的是一个更强大的...框架。首先,您可能需要一个 Web 框架来避免直接对 servlet API 进行编码。其次,您需要像 Spring 这样的 IoC 来管理您的依赖项。每个服务都不需要急切地创建它们并传递它们,而是只要求提供所需的依赖项。

【讨论】:

  • 对我来说,Spring 看起来有点矫枉过正。一方面,我的应用程序并没有那么大(至少目前还没有),另一方面,我认为“HttpServlet”基本上就是那种框架:) 基本上,我需要传递给我的对象的大部分对象是单例,因此将它们作为参数传递的想法看起来非常好。不过,我会再看看 Spring。
【解决方案2】:

我建议使用像 spring-mvc 这样的框架
该框架将允许您在 Web 应用程序中实现 MVC
它可以让您在整个请求流程中传递应用程序上下文,
根据我的记忆,甚至可以在不同的页面之间传递它;
并且当然会让您将大部分逻辑与 Servlet 类分开。

【讨论】:

  • 即使没有 Spring-MVC,我也确实在我的应用程序中实现了 MVC。在我的设计中,Servlet 是控制器,数据库是模型,视图是 FreeMarker 模板。对我来说,Spring 看起来有点过于重量级了。
  • Spring 非常模块化,与 Java EE 相比(或者至少它在 Java EE 6 之前是这样的)。以我的拙见,除了“重量级”的“直觉”之外,在有一个如此广泛使用的框架时实施你的“内部”代码应该是真正合理的。
  • 这是一个很好的观点。但是,使用框架也应该是合理的。那是一场单独的圣战的主题:) 有时,使用框架就像使用混凝土块建造花园棚。但同样,我将研究 Spring。
  • 我同意 - 我建议你看看 Spring-MVC 看看它是否对你有帮助。我可以告诉你,总的来说,我发现自己在编写类似 spring-mvc 的代码,却没有意识到 spring-mvc,这很愚蠢。即使我在我的代码中只使用了 50% 的功能,而不是所有 spring-mvc - 为此编写我自己的代码也是愚蠢的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多