2010-02-03 2 views
1

JSP 페이지 서버 측 캐싱에 문제가 발생했습니다.JSP 페이지 가변 캐싱

방문/요청할 때마다 고유 ID를 표시하는 사용자 정의 JSP 인 내부 오류 페이지가 있다고 가정합니다. 이 고유 한 ID는 디버깅을 위해 서버 로그에도 기록됩니다. 몇 요청 후

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

... 변수 ABC는 서버 측에서 캐시와 동일한 가치가 저런 애 유지할 것으로 보인다 : 그러나, 나는 내가 사용 오류 ID를 구현하는 경우 것으로 나타났습니다.

이상한 일이지만, 같은 페이지에, 나는 또한 오류가 캐시되지 항상 현재 시간이 표시됩니다 결코

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

으로 발생되는 시간을 표시합니다.

그래서 대신에 위의 사용 시간을 표시하는, 약간의 실험을했다, 나는 문자열 및 SNAP, 그것은 몇 통화 후 캐시 점점

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

및 인쇄 화면을 사용했다.

내 질문은, 어떻게 이러한 변수를 캐싱에서 서버를 중지합니까?

답변

4

대략 번역되었으므로, JSP 페이지가 컴파일 될 서블릿 클래스의 인스턴스 변수 으로 선언되었습니다. 예 : (서버에서 hotdeploy이 활성화 된 경우 또는 변경 후)

JSP를 보통 시작하는 동안 한 번만 컴파일 얻을으로
public class pagename_jsp_servlet extends HttpServlet { 
    private String abc = UUID.randomUUID().toString(); 

    protected void service(HttpServletRequest ... 

는 매우 같은 서블릿 인스턴스는 모든 요청들 사이에서 공유됩니다! 당신은 그렇게하고 싶지 않습니다.

결국, 스크립틀릿을 JSP 페이지에서 사용하지 않아야합니다. Java 코드는 실제 Java 클래스에 속합니다. 이 경우에는 EL function 또는 bean class 또는 servlet class을 사용할 수 있습니다.

전계 발광 기능은 마침내과 같습니다

<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> 

서블릿 클래스는 JSP 페이지를 다루는 url-pattern (또는 그 반대)에 매핑되어야하고 012가 있어야합니다 사전 처리 요청에 구현방법 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()%>를 교체하는 것이 좋습니다 :

코드를 훨씬 깨끗하게 유지 보수 할 수 있습니다.

+0

아주 좋은 대답, @BalusC 당신은 정말로 JSP 전문가입니다. 특히 UUIDBean이 나를 도왔습니다. – MartinL

0

생성 된. java 코드를보고 나서. 판명

부를 따라서 만 세션 초기화 호출하는 멤버 변수로 선언되어있다. 그래서 세션의 초기화 후에 결코 다시 호출되지 않습니다.

나는 함수를 호출하여 함수를 호출하고 그 함수를 대신 호출하여 문제를 해결하기로 결정했다. 더 나은 접근 방식으로 자유롭게 대답하십시오.