ThreadLocal 比 HttpServletRequest.setAttribute(“key”, “value”) 更可取吗?
取决于具体的功能要求。
例如,JSFFacesContext
将ThreadLocal
. 这使您能够访问所有 JSF 工件,包括“原始”HttpServletRequest
和HttpServletResponse
由 执行的代码中的任何位置FacesServlet
,例如托管 bean。大多数其他基于 Java 的 MVC 框架都遵循相同的示例。
根据你的评论,
我主要需要将 User 和 EntityManager 对象从用户和数据库过滤器传输到 Servlet。我还发现,在后面的代码中经常和意外地需要这些,我很想在 Servlet 之外使用它们(即在 doGet 调用的嵌套代码中)。我觉得可能有更好的方法来编写更深入的代码 - 建议?
至于User
我假设这是一个会话属性的示例,我宁愿遵循与 JSF 相同的方法。创建一个ThreadLocal<Context>
whereContext
是您的自定义包装类,其中包含对当前的引用HttpServletRequest
,也许还可以HttpServletResponse
让您可以在代码中的任何位置访问它们。如有必要,提供方便的方法以User
直接从Context
类中获取。
至于这个EntityManager
例子,你可以采用同样的方法,但我个人不会把它放在同一个 ThreadLocal<Context>
,而是一个不同的。或者,更好的是,只需从服务层的 JNDI 获取它,这将允许您对事务进行更细粒度的控制。在任何情况下,请绝对确保您正确处理提交/关闭。从容器中接管持久性和事务管理应该非常小心。我真的会重新考虑反对使用现有的和精心设计的 API/框架(如 EJB/JPA),否则您将冒着完全浪费时间重新发明所有已经标准化的 API 和东西的风险。
也可以看看: