在Java EE系统中编写静态实用程序类

时间:2013-03-19 13:53:00

标签: java jsp java-ee servlets ejb

我想开发一个实用程序类,它可以以静态方式(静态方法)用于企业Java系统(JSP,Servlets,EJB)。它包含一些能够访问用户的HttpSession对象的方法,并检索一些已存储为属性的有用信息(例如当前用户ID)。

有些人可能想知道为什么我需要这样的东西,而我可以简单地将HttpSession对象传递到任何地方。实际上,我正在研究遗留的Java EE 5.0系统,并且一些实用程序类(不是Servlet,JSP和EJB)无法访问HttpSession对象。

是否可以实现此类实用程序类?我/你应该考虑一些限制因素:

  • servlet / JSP托管在与主机EJB不同的机器上。
  • 系统在Weblogic 10.3.0上运行。
  • 在weblogic上,有许多服务器(托管servlet / JSP),它们位于同一个集群中。 EJB服务器也是如此。
  • 如果我在实用程序类中声明了一些静态Collection,它会起作用吗?或者由于多个类加载器和多个JVM,可能会有多个副本?
  • 也许我应该使用共享文件或共享数据库来实现它?我怎么能跟踪哪个用户调用实用程序类?也许跟踪线程?或者可能是与交易有关的事情?

2 个答案:

答案 0 :(得分:4)

利用ThreadLocal。您不应该直接将HttpSession存储在那里。服务层不应该依赖javax.servlet API。相反,直接从HttpSession中提取所需信息并将其存储在那里。

E.g。当您想要将User的{​​{1}}属性公开为线程局部变量时:

HttpSession

,这位于servlet filterpublic class SomeContext { private static ThreadLocal<SomeContext> instance = new ThreadLocal<SomeContext>(); private User user; private SomeContext(User user) { this.user = user; } public static SomeContext getCurrentInstance() { return instance.get(); } public static SomeContext newInstance(User user) { SomeContext someContext = new SomeContext(user); instance.set(someContext); return someContext; } public void release() { instance.remove(); } public User getUser() { return user; } } 中:

doFilter()

在特定过滤器(包括EJB)之后的同一个线程中运行的任何代码中,您可以按如下方式获取User user = (User) request.getSession().getAttribute("user"); SomeContext someContext = SomeContext.newInstance(user); try { chain.doFilter(request, response); } finally { // It's very important to do this in finally! // Threads are namely pooled by the container. someContext.release(); }

User

答案 1 :(得分:1)

HttpSession是Thread的本地。

你真的需要一个HttpSession,或者你能用静态的ThreadLocal属性做你想做的事吗?

请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html

不过,Apache Shiro使用这个类来存储一些“会话”信息。