2010-02-03 5 views
1

У меня возникла проблема с кешированием на стороне сервера JSP.Кэширование переменной страницы JSP

Предположим, у меня есть внутренняя страница ошибки, которая является настраиваемым JSP, который будет отображать уникальный идентификатор каждый раз, когда он будет посещен/запрошен. Этот уникальный идентификатор также регистрируется в журнале сервера для отладки. Тем не менее, я заметил, что если я реализую идентификатор ошибки с помощью:

<%!private String <b>abc</b> = UUID.randomUUID().toString();%> 

После нескольких запросов ... переменные а, кажется, кэшируются на стороне сервера и то же значение держать внезапное вверх.

Как ни странно, на той же странице, я также отображать время, в котором ошибка встречается с

XXXError encountered on <%=Calendar.getInstance().getTime().toString()%> 

, который никогда не будет в кэше и всегда отображать текущее время.

Так что я сделал небольшой эксперимент, вместо отображения времени с помощью выше, я использовал

<%!private String etime = Calendar.getInstance().getTime().toString();%> 

и печать на экран, что строка, и SNAP, она становится кэшированным после нескольких звонков.

Итак, мой вопрос: как остановить сервер от кеширования этих переменных?

ответ

4

Грубо переведенный, это объявлено как переменная экземпляра класса сервлета, с которой скомпилирована страница JSP. Например.

public class pagename_jsp_servlet extends HttpServlet { 
    private String abc = UUID.randomUUID().toString(); 

    protected void service(HttpServletRequest ... 

Как JSPs обычно компилируются только один раз при запуске (или после изменения, если hotdeploy на сервере включена), тот же экземпляр очень сервлета будет распределяться между всеми запросами! Вы не хотите этого делать.

В конце концов, вы не должны использовать scriptlets в JSP-страницах. Java-код принадлежит к реальному классу Java. В этом конкретном случае вы можете использовать EL function или bean class, или servlet class.

Функция EL наконец выглядеть следующим образом:

класса
<c:set var="uuid" value="${uuid:random()}" /> 
<p>UUID: ${uuid}</p> 

боб будет выглядеть следующим образом:

public class UUIDBean { 
    public String getRandom() { 
     return UUID.randomUUID().toString(); 
    } 
} 

, которые могут быть использованы в качестве:

<jsp:useBean id="uuid" class="com.example.UUIDBean" /> 
<p>First UUID: ${uuid.random}</p> 
<p>Next UUID: ${uuid.random}</p> 

сервлет класс должен отображаться на url-pattern, охватывающий страницу JSP (или наоборот) и должен иметь doGet() метод, реализованный на запросы предварительной обработки перед отображением данных на странице JSP:

UUID uuid = UUID.randomUUID().toString(); 
request.setAttribute("uuid", uuid); 
request.getRequestDispatcher("page.jsp").forward(request, response); 

пересланный JSP-страница может выглядеть следующим образом:

<p>UUID from servlet: ${uuid}</p> 

Далее, <%=Calendar.getInstance().getTime().toString()%> лучше заменить следующим образом:

<jsp:useBean id="now" class="java.util.Date" /> 
<p>The date is now: ${now} 
<p>The date in yyyy-MM-dd format: <fmt:formatDate value="${now}" pattern="yyyy-MM-dd" /> 

Он сохраняет код намного чище и удобнее обслуживать.

+0

очень хороший ответ, @BalusC Вы действительно эксперт jsp :) Особенно, что UUIDBean помог мне – MartinL

0

Посмотрите на сгенерированные коды .java. Оказалось, что

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

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

Смежные вопросы