Java Servlets + 状态 = 如何实现?

3
在我的Web应用程序中,我希望在所有“页面”中都有某些必要的东西,例如连接到数据库、用户信息、模板处理等。直到最近,我使用抽象Servlet,在其doGet/doPost方法中初始化上述所有内容,定义抽象方法doLocalLogic(HttpServletRequest req, HttpServletResponse res)并从doGet/doPost方法中调用它。所有扩展类都可以享受数据库连接、用户信息等。不幸的是,这被证明是不好的做法。
现在我想创建一个抽象类来完成所有这些工作,我的Servlet逻辑将移动到这个类的子类中,而Servlet只需要创建这些子类的实例即可。
然而,这会导致为我的应用程序中的每个页面创建一个额外的类。此外,当您创建新的Servlet时,您没有任何线索可以重写抽象Servlet中的抽象方法。
有更好的方法吗?

1
你能解释一下为什么“这被证明是不好的实践”吗? - Tomasz Nurkiewicz
@TomaszNurkiewicz 嗯,让我思考的是如何在同一个浏览器窗口中获取两个或更多完整页面。也就是说,当我按住 F5 时,我会得到两个或更多相同页面的副本。在某些情况下,当我重复导致错误的操作时,我会得到 +1 的错误消息(也就是错误消息只会被添加到错误堆栈中,我认为这应该是重新启动的)。我开始阅读相关主题,并了解到在 servlet 中保持状态是一个不好的想法。 - Ibolit
2个回答

2

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

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

唯一的问题是,即使在servlet中没有使用这些数据,您仍然需要准备大量数据。而且它不具有可扩展性。

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


对我来说,Spring 看起来有点过度设计。一方面,我的应用程序并不是那么大(至少目前还不是),另一方面,我认为 "HttpServlet" 基本上就是那种框架 :) 基本上,我需要传递给我的对象的大多数对象都是单例的,所以将它们作为参数传递的想法看起来非常好。但是我会再看看 Spring 的。 - Ibolit

1
我建议使用像spring-mvc这样的框架。
该框架将允许您在Web应用程序中实现MVC
它将允许您在请求流程中传递应用程序上下文,
甚至在处理不同页面时传递它,从我记得的内容来看;
当然,它还将允许您将大部分逻辑与Servlet类分离。

我在我的应用程序中实现了MVC,即使没有Spring-MVC。在我的设计中,Servlets是控制器,数据库是模型,而视图则是FreeMarker模板。对我来说,Spring看起来有点过于笨重。 - Ibolit
Spring非常模块化,与Java EE相比(或至少是Java EE 6之前的版本),它更加灵活。在我看来,如果有一个如此广泛使用的框架,实现自己的“内部”代码应该真正得到证明,而不仅仅是凭感觉认为它很“笨重”。 - Yair Zaslavsky
这是一个很好的观点。然而,使用框架也应该有正当理由。这是一个单独的争论话题 :) 有时候,使用框架就像用混凝土块来建造花园小屋。但我会再看看Spring框架。 - Ibolit
我同意 - 我建议你看看Spring-MVC,看看它是否对你有帮助。总的来说,我发现自己写的代码很像Spring-MVC,但并没有意识到这一点,这是很愚蠢的。即使我只使用了50%的功能,而不是在我的代码中使用所有的Spring-MVC - 为此编写自己的代码也是愚蠢的。 - Yair Zaslavsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接