The*_*olf 7 java session jsp servlets javabeans
有没有办法从POJO中检索会话?或者最终从POJO中检索bean.
澄清:
基本上我是从servlet创建一个bean,我需要从Web容器外部(从POJO)访问该bean的属性.我无法将请求传递给pojo; 并且需要请求来检索会话.
更具体地说,我有一个Web应用程序,它使用Cactus框架从Web界面运行JUnit测试.但是,调用JUnit测试运行器的servlet是在jar中编译的; 我添加了额外的下拉菜单来更改JUnit测试将从中读取的设置以在不同环境(WLI集群)之间切换,因此,如果已经编译了运行器servlet,我无法修改它以处理来自多个环境的额外参数.我已经尝试过写入.dat文件的持久化方法,JUnit测试将通过Reader类读取该文件; 我也尝试过最终无法通过JUnit测试访问的bean方法.
Bal*_*usC 11
只有当你的POJO在运行的同一个线程HttpServletRequest中运行时,你才能在这个帮助下实现这个目标ThreadLocal<T>.
创建以下类:
public final class YourContext implements AutoCloseable {
private static ThreadLocal<YourContext> instance = new ThreadLocal<>();
private HttpServletRequest request;
private HttpServletResponse response;
private YourContext(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
}
public static YourContext create(HttpServletRequest request, HttpServletResponse response) {
YourContext context = new YourContext(request, response);
instance.set(context);
return context;
}
public static YourContext getCurrentInstance() {
return instance.get();
}
@Override
public void close() {
instance.remove();
}
public HttpServletRequest getRequest() {
return request;
}
public HttpSession getSession() {
return request.getSession();
}
public ServletContext getServletContext() {
return request.getServletContext();
}
// ... (add if necessary more methods here which return/delegate the request/response).
}
Run Code Online (Sandbox Code Playgroud)
实现javax.servlet.Filter在doFilter()方法中执行以下操作并映射到url-pattern感兴趣的地方,例如/*或在servlet-name前端控制器servlet上.
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try (YourContext context = YourContext.create(request, response)) {
chain.doFilter(request, response);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意try-with-resources语句的重要性.它保证YourContext#close()在过滤器完成其工作后将调用它,并ThreadLocal清除资源.否则,线程在为另一个HTTP请求回收时仍会包含它.
以下是如何在POJO中使用它:
YourContext context = YourContext.getCurrentInstance();
HttpSession session = context.getSession();
Run Code Online (Sandbox Code Playgroud)
这一切基本上也是Context普通MVC框架的对象如何工作,如JSF FacesContext和Wicket中的对象.
说,你看过CDI吗?也许更容易制作CDI管理的工件,因此您可以将@Inject它们彼此放在一起.
| 归档时间: |
|
| 查看次数: |
8782 次 |
| 最近记录: |