2009-12-02 5 views
1

안녕 설정 속성 태그가 제대로 작동하지 않습니다. 나는 webcenter에 포틀릿으로 포함 할 jsp를 가지고있다.jsp : bean에 대한 setProperty가 제대로 작동하지 않습니다.

<jsp:useBean id="pathEditor" class="backing.bean.AppletBean" scope="page"/> 

<jsp:getProperty name="pathEditor" property="username" /> 
${pageContext.request.remoteUser} 
<jsp:setProperty name="pathEditor" property="username" value="${pageContext.request.remoteUser}"/> 
<jsp:getProperty name="pathEditor" property="username" /> 

같은 m/c의 두 브라우저에서 로그인하고 있습니다. 사용자 이름 값이 올 바르고 두 번째 로그인은 ${pageContext.request.remoteUser}을 인쇄하지만 <jsp:getProperty name="pathEditor" property="username" />은 이전에 로그인 한 사용자를 인쇄합니다. 이는 setProperty가 전혀 호출되지 않는다는 인상을줍니다. 두 개의 서로 다른 브라우저와 고정 변수를 사용하고 있습니다.이 테스트 케이스에서는 두 브라우저를 모두 열어 두었습니다. 포틀릿이 웹 센터에서 처리되는 방식 일 수 있습니다. 빈의 범위를 페이지로 선언 할 때 스레드 안전성에 대한 올바른 방법이 아닌가? 스레드를 안전하게 만들려면 어떻게해야합니까? 나는 빈 프로퍼티 변수를 휘발성으로 만들었지 만 그다지 좋지는 않다. 또는 사용 후 콩을 파괴 할 수 있습니까? 어떻게 콩을 파괴 할 수 있습니까?

이렇게 포함 시키면 jsp에서는 < % @ 페이지 isThreadSafe = "false"%>가 작동합니다. 그러나 그것은 또한 작동하지 않습니다.

편집 # 코드 디버깅 후이 비정상적인 동작을 보았습니다. jsp에서 오는 값을 확인하기 위해 bean에 System.out.println을 넣습니다. $ {pageContext.request.remoteUser}가 새로운 값을 출력하지만 - jsp : setProperty name = "pathEditor"속성 = "username"value = "$ {pageContext.request.remoteUser}"/> 이전 값을 bean 설정 메소드로 전달합니다. . 나는 이것을 이해할 수 없다. 도와주세요.

답변

2

두 브라우저의 차이점은 무엇입니까? 과 동일한 브라우저의 다른 탭/창/인스턴스는 모두 과 동일한 세션을 공유합니다. 다른 제조사의 브라우저 (예 : 하나의 파이어 폭스와 다른 IE, 사파리, 크롬 또는 오페라.

다른 브라우저를 사용하여 실제로 테스트하고 있는데도 여전히 동일한 문제가 발생하는 경우 코드는 스레드 세이프가 아닐 가능성이 큽니다. 나는. 변수를 static 변수로 선언하거나 인스턴스 서블릿 클래스 변수로 선언했습니다. Servlet 클래스의 인스턴스 변수와 마찬가지로 모든 스레드간에 변수가 공유됩니다.

편집 # 1 : 직접 답장으로 작성 : 코드는 단순히 threadsafe가 아닙니다. 어떤 수준에서는 정보를 직접 보유하고있는 static 또는 서블릿 인스턴스 변수 (in)가있을 것입니다. 이 거리에서 정확한 코드 행을 가리키는 것은 어렵습니다. 디버거를 실행하고 코드를 디버그하거나 여기 SSCCE을 게시하거나 로컬 전문가에게 코드를 검토하십시오.

편집 # 2 : jsp/servlets의 스레드 안전성은 synchronized/volatile/etc를 사용할지 여부와 관련이 없습니다. 적절한 코드를 작성하는 것입니다. static 변수는 스레드 세이프가 아닙니다. 서블릿 doXXX() 메서드 내에서 선언 된 모든 것은 threadsafe하지만 외부는 NOT입니다. 그런 종류의 것들. 주의 사항 : 하나의 HTTP 요청 계정은 하나의 스레드로 간주됩니다. 응용 프로그램의 수명 동안 서블릿 인스턴스는 하나뿐입니다.

예 :

public class MyBean { 
    private static String property1; // Certainly NOT threadsafe, there is only 1 of it during application's lifetime. 
    private String property2; // Threadsafety depends on class which is holding the Bean instance. 
} 

JSP에서 페이지 범위 확실히 쓰레드이다
public class MyServlet extends HttpServlet { 
    private static Bean bean1 = new Bean(); // Certainly NOT threadsafe, there is only 1 of it during application's lifetime. 
    private Bean bean2 = new Bean(); // This also NOT, because there's only 1 servlet in application's lifetime which is shared among all requests. 

    protected void doSomething(request, response) { 
     Bean bean3 = new Bean(); // Declared threadlocal, thus certainly threadsafe. 
     request.setAttribute("bean", bean3); // 1 request = 1 thread, thus threadsafe. 
     request.getSession().setAttribute("bean", bean3); // Session is shared among requests/threads from same client, thus NOT threadsafe. 
     getServletContext().setAttribute("bean", bean3); // Context is shared among all sessions from different clients, thus certainly NOT threadsafe. 
    } 
} 

. 당신의 문제는 높은 수준에 있습니다. 어딘가에서 static 변수에 내 내기.

관련 문제