문제

브라우저에 보내기 전에 전체 페이지를 빌드하기 위해 Struts 2(타일 사용)를 얻을 수 있는 방법이 있습니까?나는 페이지가 브라우저에서 한 번에 한 부분씩 "점진적으로" 구축되는 것을 원하지 않습니다.

내가 해결하려는 주요 문제는 Internet Explorer 7이 콘텐츠 중 일부만 변경된 경우에도 페이지를 깜박이거나 깜박인다는 것입니다(firefox는 이 작업을 훨씬 더 원활하게 수행합니다).

따라서 다음과 같은 페이지가 있는 경우:

머리글

일부 내용

보행인

그리고 "일부 콘텐츠" 영역은 페이지 로드 사이에만 변경되며 FOOTER 부분은 바닥글의 배경색으로 채우기 전에 여전히 흰색 배경을 깜박입니다.나는 전체 페이지를 보내도록 스트럿을 얻음으로써 "깜빡임"을 제거할 수 있을 만큼 빠르게 로드될 것이라고 생각했습니다.이제 FOOTER는 이전 부분보다 조금 늦게 서버에서 나오므로 깜박입니다(인터넷 익스플로러에서는 Firefox가 페이지를 부드럽게 표시합니다).

참고:이는 사이트의 중요한 요구 사항이며 Ajax를 사용하여 중간 콘텐츠를 로드하는 것은 더 이상 필요하지 않습니다(프레임이나 기타 "해킹"도 마찬가지입니다).사이트는 테이블 레이아웃이 아닌 CSS를 사용하여 구축되었습니다. 어쩌면 작동하려면 테이블 레이아웃을 사용해야 할 수도 있습니다...

타일 ​​플러시 매개변수 사용 정보:나는 그것을 시도했지만 내가 원하는대로 작동하지 않습니다.전체 페이지에 대한 플러시 매개변수가 필요합니다.일반 jsp 페이지 지시문 "autoFlush=false"를 시도했지만 작동하지 않았습니다.저는 이 지시어를 타일이 아닌 기본 템플릿 페이지에 설정했습니다.

다음은 머리글, 본문 및 바닥글 템플릿을 사용하는 기본 템플릿의 예입니다.Thread.sleep()을 사용하여 문제를 쉽게 발견할 수 있도록 추가했습니다.바닥글은 페이지의 나머지 부분보다 2초 늦게 렌더링됩니다.

  <body>
  <div id="container">
  <t:insertAttribute name="header" flush="false" />

  <div id="content"><t:insertAttribute name="body" flush="false"/></div>

  <div class="clear"></div>
  <% Thread.sleep(2000); %>
  <t:insertAttribute name="footer" flush="false" />
  </div>
  </body>

업데이트

의견을 보내주셔서 감사합니다.이 요구 사항은 실제로는 일반적인 웹 페이지가 아니기 때문에 거의 합리적입니다. 내장된 것으로 생각하면 됩니다.

하지만 분명히 약간의 지연 후에 렌더링을 시작하도록 IE를 구성할 방법이 없는 것 같습니다(예: Firefox의 구성 가능한 지연 시간은 약 100ms입니다).

TilesResult를 가로채려고 시도했지만 doExecute 메소드는 전체 내용이 명백히 평가되기 전에 실행되므로 jsp가 평가되기 전에 메소드가 이미 종료되었습니다(내 Thread.sleep() 테스트).나는 어떻게 전체 응답을 문자열로 렌더링한 다음 이를 브라우저에 한꺼번에 출력할 수 있는지 궁금했습니다.

나는 이것이 완벽하지 않으며 네트워크 지연 등이 이것을 고려할 수 있다는 것을 알고 있지만 출력에 대한 응답을 한 번에 얻을 수 있고 테이블 기반 레이아웃을 사용할 수 있다면(IE는 테이블이 닫힌 후에만 테이블을 렌더링할 수도 있음) 합리적으로 일하세요.

아니면 이것을 Firefox로 전환해 보거나 이 작은 결함에 대해 모두 잊어버릴 수도 있습니다...

업데이트 2

이것이 나를 괴롭히기 시작하여 몇 가지 조사를 해보았습니다.일반 jsp 페이지(타일 없음)가 있으면 버퍼링이 작동하므로(buffer 속성을 사용하여) Thread.sleep()이 있는 경우 페이지 크기가 버퍼 크기보다 작으면 2초 후에 전체 페이지가 렌더링됩니다.그러나 위의 예에서와 같이 페이지에서 타일을 사용한 경우 페이지를 동시에 렌더링할 수 없습니다(심지어 모든 타일 템플릿/"구성 요소"에 페이지 지시문을 포함했지만 도움이 되지 않았습니다).그러면 타일이 어딘가에 응답을 플러시할까요?

게다가 "문제가 있는 타일"은 struts:form 태그가 포함된 내 신체 부분이었습니다.일반 form-tag로 교체했더니 원하는 대로 작동하더군요...

업데이트 3

좋아요, 아무도 타일이나 지지대 태그의 내부 작동을 모르는 것 같습니다...이는 매우 구체적인 사례 및 요구 사항이므로 큰 문제는 없습니다.저는 Apache를 응용 프로그램 앞의 프록시로 사용하고 Apache의 프록시 구성 옵션을 사용하여 큰 버퍼를 지정함으로써 이 문제를 해결했습니다.이것을 답변으로 표시하겠습니다.

도움이 되었습니까?

해결책

타일 ​​구성요소에 "플러시" 속성을 사용할 수 있나요?

<tiles:insertAttribute name="body" flush="false"/>

또한 출력 버퍼가 너무 커지면 어쨌든 플러시됩니다.버퍼 크기를 늘려보시겠습니까?

<%@ page language="java" buffer="500kb" autoFlush="false" %>

다른 팁

원하는 경우 페이지 데이터를 서버 측에서 한 번에 보낼 수 있습니다(많은 프레임워크에서는 편의를 위해 그렇게 합니다). 하지만 네트워킹의 현실은 페이지 데이터가 모두 한 번에 도착하지 않고 패킷이 도착할 때 브라우저가 이를 렌더링한다는 것입니다.그리고 이는 미학적으로 페이지가 한 번에 모두 표시되기를 원하는 경우에도 반응성에 좋은 것입니다.

마크업을 단순화하고 수축 압축을 사용하여 페이로드 크기를 작게 유지하면 지연을 최대한 줄일 수 있으며 이는 일반적으로 수행할 가치가 있는 작업입니다.또한 스타일이 지정되지 않은 콘텐츠가 깜박이지 않는지 확인할 수 있습니다.그러나 브라우저가 렌더링을 선택하는 시점을 제어할 수는 없습니다. 모든 단점을 수반하는 JavaScript로 모든 작업을 수행하지 않는 한(이 경우에도 브라우저가 느리게 다시 그릴 수 있음)

(* - 또는 귀하의 사이트가 웹의 다른 모든 페이지와 다르게 작동해야 하는 "중요한 요구 사항"을 제시한 사람이 고객/상사인 경우.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top