문제

통합하려고합니다 SiteMesh Tomcat 5를 내 컨테이너로 사용하는 레거시 응용 프로그램으로. 나는있다 main.jsp 간단한 데코레이터로 장식하고 있습니다.

~ 안에 decorators.xml, 나는 방금 하나의 데코레이터를 정의했습니다.

<decorators defaultdir="/decorators">
  <decorator name="layout-main" page="layout-main.jsp">
    <pattern>/jsp/main.jsp</pattern>
  </decorator>
</decorators>

이 데코레이터는 수동으로 이동하면 작동합니다 http://example.com/my-webapp/jsp/main.jsp. 그러나 JSP로 리디렉션을 수행하는 대신 서블릿이 앞으로:

getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response);

이것은 URL이 같은 것으로 유지됨을 의미합니다 http://example.com/my-webapp/servlet/MyServlet JSP 파일 대신에 장식되지 않은 대신 패턴과 일치하지 않기 때문에 추정합니다. decorators.xml.

나는 할 수 없다 <pattern>/*</pattern> 장식 할 필요가없는 다른 JSP가 있기 때문에 layout-main.jsp. 나는 할 수 없다 <pattern>/servlet/MyServlet*</pattern> 왜냐하면 MyServlet 앞으로 나아갈 수 있습니다 main.jsp 때때로 그리고 아마도 error.jsp 다른 시간에.

서블릿의 작동 방식에 대한 광범위한 변화 없이이 문제를 해결할 수있는 방법이 있습니까? 레거시 앱이기 때문에 상황을 바꿀 자유가 많지 않으므로이 문제를 해결할 수있는 구성이 필요합니다.

SiteMesh의 문서는 실제로 그리 좋지 않습니다. 배포와 함께 제공되는 예제 응용 프로그램에서 대부분 작업 해 왔습니다. 나는 SiteMesh를 정말 좋아 하고이 경우에 그것을 작동시킬 수 있기를 바라고 있습니다.

도움이 되었습니까?

해결책

내 이해는 SiteMesh가 Servlet 필터로 응용 프로그램에 통합되어 있다는 것입니다. 기본적으로 서블릿 필터는 원래의 들어오는 요청에 대해서만 호출됩니다 (귀하의 경우 서블릿에 대한 요청). 후속 포워드 또는 포함 요청은 필터를 통해 전달되지 않으므로 SiteMesh를 통과하지 않습니다.

그러나 다음과 같은 것을 사용하여 필터를 전진에 호출하도록 지시 할 수 있습니다.

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <servlet-name>MyServlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

이는 컨테이너가 전달 요청에서만 작동하도록 지시합니다. 다른 옵션은 포함 및 요청이며 여러 요소를 가질 수 있습니다.

따라서 옵션은 필터 구성을 변경하여 앞으로 지정하거나 JSP 경로가 아닌 서블릿 경로와 일치하도록 필터 매핑을 변경하는 것입니다. 어느 쪽이든 작동해야합니다.

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