Servlet 规范(请参阅我之前的问题)保证同一个线程将执行所有 Filter 和关联的 Servlet。鉴于此,我认为使用传递数据没有任何用处HttpServletRequest.setAttribute
如果可以选择使用ThreadLocal
(假设你清理得当)。我觉得使用有两个好处ThreadLocal
:类型安全和更好的性能,因为没有使用字符串键或映射(除了可能通过(非字符串)线程 ID 进入线程集合)。
有人可以确认我是否正确,以便我可以继续放弃setAttribute
?
ThreadLocal 是否优于 HttpServletRequest.setAttribute(“key”, “value”)?
取决于具体的功能需求。
例如,JSF 存储FacesContext
in a ThreadLocal
。这使您能够访问所有 JSF 工件,包括“原始”HttpServletRequest
and HttpServletResponse
执行的代码中的任何位置FacesServlet
,例如托管 Bean。大多数其他基于 Java 的 MVC 框架都遵循相同的示例。
根据你的评论,
我主要需要将 User 和 EntityManager 对象从用户和数据库过滤器传输到 Servlet。我还发现,这些在代码中经常意外地需要,并且我很想在 Servlet 之外使用它们(即在 doGet 调用的嵌套代码中)。我觉得可能有更好的方法来更深入的代码 - 建议?
至于User
对于我假设这是一个会话属性的示例,我宁愿遵循与 JSF 相同的方法。创建一个ThreadLocal<Context>
哪里的Context
是您的自定义包装类保存对当前的引用HttpServletRequest
也许还有HttpServletResponse
这样您就可以在代码中的任何位置访问它们。如有必要,提供便捷的方法来获取User
直接从Context
class.
至于EntityManager
例如,您可以遵循相同的方法,但我个人不会将其放在same ThreadLocal<Context>
,而是另一种。或者,更好的方法是从服务层的 JNDI 获取它,这将允许您对事务进行更细粒度的控制。无论如何,请绝对确保正确处理提交/关闭。从容器接管持久性和事务管理应该非常小心。我真的会重新考虑对使用现有且设计良好的 API/框架(如 EJB/JPA)的厌恶,否则您将面临完全浪费时间重新发明所有已经标准化的 API 和内容的风险。
也可以看看:
- 从 Web 容器外部的 POJO 检索 Web 会话
- 基于网络的应用程序设计模式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)