Каков жизненный цикл объекта jsp PageContext - является ли он потокобезопасным? - PullRequest
4 голосов
/ 06 марта 2012

Являются ли объекты jsp PageContext созданными и уничтоженными в рамках цикла http запрос-ответ, или они кэшируются и используются повторно между запросами.

PageContext имеет методы жизненного цикла, которые предлагают повторное использование между запросами. то есть initialize (), release ().

Если они используются повторно, это может вызвать серьезные проблемы с параллелизмом: если поступают два http-запроса, запрашивающих одну и ту же страницу jsp, и каждый запрос обрабатывается собственным потоком, но задает атрибуты для общего объекта PageContext, они будут отображать друг друга 'content.

Любая помощь приветствуется. Кстати, я использую контейнер сервлетов, встроенный в Apache Sling.

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

PageContext доступны только с вашей страницы JSP. Если ваш запрос был сначала обработан сервлетом, а затем перенаправлен на страницу JSP (используя RequestDispatcher.forward), pageContext доступен только на этой странице JSP, но нет способа получить к нему доступ из сервлета (потому что еще не было pageContext в то время).

С точки зрения страницы JSP, он получает новый pageContext при каждом вызове. Контексты страниц могут быть объединены внутри, но не могут использоваться несколькими JSP-страницами одновременно.

Методы

initialize и release имеют такой комментарий: «Этот метод не должен использоваться авторами страниц или библиотек тегов». Просто забудь о них.

3 голосов
/ 06 марта 2012

Питер прав. PageContext предоставляется для объема обработки страницы. Потребители не должны хранить ссылку на эти экземпляры вне этой области, что неявно означает, что экземпляры не должны быть доступны вне текущего потока.

Пример кода обработки JSP из спецификации JSP 2.2 :

public class foo implements Servlet {
// ...
public void _jspService(HttpServletRequest request, HttpServletResponse response)
               throws IOException, ServletException {
  JspFactory factory = JspFactory.getDefaultFactory();
  PageContext pageContext = factory.getPageContext(
      this,
      request,
      response,
      null, // errorPageURL
      false, // needsSession
      JspWriter.DEFAULT_BUFFER,
      true // autoFlush
    );
  // initialize implicit variables for scripting env ...
  HttpSession session = pageContext.getSession();
  JspWriter out = pageContext.getOut();
  Object page = this;
  try {
    // body of translated JSP here ...
  } catch (Exception e) {
    out.clear();
    pageContext.handlePageException(e);
  } finally {
    out.close();
    factory.releasePageContext(pageContext);
  }
}

Способ подготовки экземпляра PageContext (из пулов или создания экземпляра) является подробностью реализации контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...