栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在容器外部的POJO中检索servlet上下文,会话和请求

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在容器外部的POJO中检索servlet上下文,会话和请求

仅且仅当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).    }

javax.servlet.Filter
doFilter()
方法中执行以下操作并映射到
url-pattern
感兴趣的对象(例如,
/*
或在
servlet-name
您的前端控制器servlet上)的实现。

@Overridepublic 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);    }}

注意try-with-
resources语句的重要性。它保证

YourContext#close()
在过滤器完成其工作并且
ThreadLocal
将清除资源后将调用。否则,线程在为另一个HTTP请求回收时仍将包含它。

这是在POJO中使用它的方式:

YourContext context = YourContext.getCurrentInstance();HttpSession session = context.getSession();

这基本上也是

Context
普通MVC框架的对象的工作方式,例如JSF
FacesContext
和Wicket中的对象。

话说回来,您看过CDI吗?使工件进行CDI管理也许更容易,所以您可以将

@Inject
它们相互配合。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/466502.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号