Chỉ và chỉ khi POJO của bạn đang chạy trong cùng chủ đề như HttpServletRequest
đang chạy trong, sau đó bạn sẽ có thể đạt được điều này với sự giúp đỡ của ThreadLocal<T>
.
Tạo lớp sau:
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).
}
Thực hiện javax.servlet.Filter
mà làm như sau trong doFilter()
phương pháp và được ánh xạ vào một url-pattern
quan tâm, ví dụ /*
hoặc trên servlet-name
của servlet bộ điều khiển phía trước của bạn.
@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);
}
}
Lưu ý tầm quan trọng của tuyên bố cố gắng với tài nguyên. Nó đảm bảo rằng YourContext#close()
sẽ được gọi sau khi bộ lọc đã thực hiện công việc của mình và tài nguyên ThreadLocal
sẽ bị xóa. Nếu không, luồng vẫn sẽ chứa nó khi được tái chế cho một yêu cầu HTTP khác.
Và đây là cách bạn có thể sử dụng nó trong các POJO:
YourContext context = YourContext.getCurrentInstance();
HttpSession session = context.getSession();
này tất cả là về cơ bản cũng như thế nào Context
đối tượng của khung MVC trung bình hoạt động, như JSF FacesContext
và một trong Wicket.
Nói rằng, bạn đã xem CDI chưa? Có lẽ nó dễ dàng hơn để làm cho các tạo tác CDI được quản lý để bạn có thể chỉ @Inject
chúng với nhau.
Bạn có thể giải thích một chút về vấn đề của mình không? – Sid
Mô tả vấn đề của bạn tốt hơn. Rõ ràng bạn có một ứng dụng web đang thao tác dữ liệu. Có vẻ như bạn cần lưu trữ và sau đó tham chiếu nó bên ngoài ứng dụng web. – DwB
Được rồi, hãy xem các chỉnh sửa ở trên, cảm ơn. – TheWolf