Ответ 1
В API сервлетов нет, но вы можете сделать свой собственный довольно легко. (Некоторые фреймворки, такие как spring -mvc, распорки обеспечивают такую функциональность)
Просто используйте public static ThreadLocal
для хранения и извлечения объекта. Вы даже можете сохранить HttpServletRequest
себя в threadlocal и использовать его методы setAttribute()
/getAttribute()
, или вы можете сохранить threadlocal Map
, чтобы быть агностиком API сервлета. Важно отметить, что вы должны очистить threadlocal после запроса (например, с помощью фильтра).
Также обратите внимание, что передача объекта как параметра считается лучшей практикой, потому что вы обычно передаете его с веб-уровня на сервисный уровень, который не должен зависеть от веб-объекта, например, HttpContext
.
Если вы решите сохранить их в локальном потоке, а не передавать их:
public class RequestContext {
private static ThreadLocal<Map<Object, Object>> attributes = new ThreadLocal<>();
public static void initialize() {
attributes.set(new HashMap<Map<Object, Object>>());
}
public static void cleanup() {
attributes.set(null);
}
public static <T> T getAttribute(Object key) {
return (T) attributes.get().get(key);
}
public static void setAttribute(Object key, Object value) {
attributes.get().put(key, value);
}
}
И необходимый фильтр:
@WebFilter(urlPatterns="/")
public class RequestContextFilter implements Filter {
public void doFilter(..) {
RequestContext.initialize();
try {
chain.doFilter(request, response);
} finally {
RequestContext.cleanup();
}
}
}