2009-03-06 13 views
5

Próbuję zintegrować SiteMesh w starszej aplikacji, używając Tomcat 5 jako mojego kontenera. Mam main.jsp, którą dekoruję prostym dekoratorem.Używanie SiteMesh z forwardDispatcher's forward()

W decorators.xml, Mam tylko jedno dekorator zdefiniowane:

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

ten dekorator działa gdybym ręcznie przejść do http://example.com/my-webapp/jsp/main.jsp. Jednakże, istnieje kilka miejsc, gdzie aplet, zamiast robić przekierowanie do JSP, robi forward:

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

Oznacza to, że adres URL pozostaje na coś podobnego http://example.com/my-webapp/servlet/MyServlet zamiast pliku JSP i dlatego nie jest będąc dekorowanym, zakładam, ponieważ nie pasuje do wzoru w decorators.xml.

Nie mogę wykonać <pattern>/*</pattern>, ponieważ istnieją inne jsp, które nie muszą być dekorowane przez layout-main.jsp. Nie mogę wykonać <pattern>/servlet/MyServlet*</pattern>, ponieważ MyServlet może czasami przesyłać do main.jsp i być może error.jsp.

Czy istnieje sposób obejścia tego problemu bez rozległych zmian w działaniu serwletów? Ponieważ jest to starsza aplikacja, nie mam tyle swobody, aby coś zmienić, więc mam nadzieję na coś, co poprawi konfigurację.

Dokumentacja SiteMesh naprawdę nie jest tak wspaniała. Pracowałem głównie nad przykładową aplikacją dołączoną do dystrybucji. Bardzo podoba mi się SiteMesh i mam nadzieję, że uda mi się go uruchomić w tym przypadku.

Odpowiedz

9

Rozumiem, że SiteMesh jest zintegrowany z aplikacją jako filtr serwletów. Domyślnie filtry serwletów są wywoływane tylko w stosunku do pierwotnego żądania przychodzącego (w twoim przypadku żądanie do serwletu). Kolejne żądania przekazywania lub dołączania nie są przekazywane przez filtr, a zatem nie są przekazywane za pośrednictwem sitemesh.

Można jednak nakazać filtr powoływać się na napastników za pomocą czegoś takiego:

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

która nakazuje pojemnik działają tylko na prośby naprzód. Inne opcje to ZAWIERAJ i ŻĄDŹ, możesz mieć kilka elementów.

Twoje opcje polegają na zmianie konfiguracji filtru, tak aby określała FORWARD, lub na zmianie mapowania filtra, tak aby odpowiadała ścieżce serwletu, a nie ścieżce JSP. Każdy powinien działać.

+1

To działało, stosując filtr do przesłanego żądania, a tym samym stosując dekorator witryn do przesłanej strony jsp. Dzięki! –

+1

Dzięki skaffman, to była dla mnie OGROMNA pomoc! –

+1

Widziałem te nowe dyrektywy, ale jeszcze ich nie potrzebowałem. Dobra rada. –

Powiązane problemy