2009-11-23 3 views
10

Was ist eine einfache Möglichkeit, den Pfad zu einer JSP-Datei aufzulösen, die sich nicht im Stamm-JSP-Verzeichnis einer Webanwendung befindet Verwenden von SpringMVCs viewResolvers? Angenommen, wir die folgende Web-Anwendung Struktur haben:Spring MVC: Wie Sie den Pfad zu den Unterverzeichnissen des Stammverzeichnisses 'JSP' in einer Webanwendung auflösen

web-app 
    |-WEB-INF 
    |-jsp 
     |-secure 
     |-admin.jsp 
     |-admin2.jsp 
     index.jsp 
     login.jsp 

Ich mag würde einige out-of-the-box-Komponenten verwenden, um die JSP-Dateien im jsp Stammordner und den sicheren zu lösen Unterverzeichnis. Ich habe eine *-servlet.xml Datei, die definiert:

eine Out-of-the-box, InternalResourceViewResolver:

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> 
    <property name="prefix" value="/WEB-INF/jsp/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 

a handler Mapping:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
<property name="mappings"> 
    <props> 
    <prop key="/index.htm">urlFilenameViewController</prop> 
    <prop key="/login.htm">urlFilenameViewController</prop> 
    <prop key="/secure/**">urlFilenameViewController</prop> 
    </props> 
</property> 
</bean> 

eine Out-of-the-box-UrlFilenameViewController Controller:

<bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"> 
</bean> 

Das Problem, das ich habe, ist, dass Anfragen an die JSPs im sicheren Verzeichnis können nicht aufgelöst werden, da jspViewResolver nur ein Präfix hat, das als /jsp/ und nicht /jsp/secure/ definiert ist.

Gibt es eine Möglichkeit, Unterverzeichnisse wie diese zu behandeln? Ich würde es vorziehen, diese Struktur zu behalten, weil ich auch versuche, Spring Security zu verwenden und alle sicheren Seiten in einem Unterverzeichnis zu haben ist eine nette Möglichkeit, dies zu tun.

Es gibt wahrscheinlich eine einfache Möglichkeit, dies zu erreichen, aber ich bin neu in Spring und der Spring MVC-Framework, so dass alle Zeiger geschätzt werden würden.

+0

Unverknüpfte Notiz, aber Sie müssen 'JstlView' nicht mehr als' viewClass' angeben, Spring wird das standardmäßig herausfinden. – skaffman

Antwort

0

Sie müssen die Eigenschaft wie folgt festzulegen:

<property name="prefix" value="/WEB-INF/jsp/"/> 

und dann können Sie den URI zugreifen secure/admin1.jsp

+0

Sorry, dieses Präfix war ein Tippfehler, ich habe es jetzt korrigiert. Wenn ich jedoch/secure/admin1.jsp (oder secure/admin1.htm) bekomme, wird das in /WEB-INF/jsp/admin1.jsp nachschlagen und nicht den sicheren Ordner enthalten, da dieser nicht Teil des Präfixes ist (Ich glaube) – chrisjleu

+0

Welche Federversion verwendest du? Es sollte in 2.5.x funktionieren –

+0

Ich benutze 2.5.6.SEC01. Ich habe es versucht, aber das Problem scheint in der Art zu sein, wie die Mappings in SimpleUrlHandlerMapping in meinem Beispiel angegeben sind. Jegliche Anfragen an/secure/** führen dazu, dass Spring die JSP-Datei in/WEB-INF/jsp/erwartet, wenn sich die eigentliche Datei natürlich in/WEB-INF/jsp/secure/befindet. Ich habe eine geeignete Problemumgehung gefunden, die meinen Zwecken dient, aber sie hat ihre Grenzen. Ich werde fortfahren, das auch zu posten. – chrisjleu

1

können Sie versuchen, Namen der Ansichten im Controller wie

<property name="formView" value="secure/admin"/> 
<property name="successView" value="secure/admin2"/> 
geben

mit Präfix und Suffix wie unten abgebildet

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 

Dies wird schließlich zu /WEB-INF/jsp/secure/admin.jsp und /WEB-INF/jsp/secure/admin2.jsp Karte

+0

Nicht sicher, ich verstehe, wie die Eigenschaften formView und successView hier gelten, wenn ich den UrlFilenameViewController verwenden möchte. – chrisjleu

+0

formView und successView sind die Ansichtsnamen, die Sie in Ihre Controller einfügen können, wenn Sie konfigurierbare Ansichten wünschen. Diese 2 sind standardmäßig verfügbar, wenn Sie SimpleFormController verwenden. –

+0

Nein, das hat nichts mit Formularen zu tun, es sind nur JSP-Seiten mit wenig Inhalt, und obwohl es in meinem Beispiel zwei Seiten gibt, ist es nicht auf zwei begrenzt. Ich verwende nicht einmal einen * Form * -Controller und ich denke, das würde die Eigenschaften von formView und successView missbrauchen, wenn ich versuchen würde, sie so zu verwenden, wie Sie es vorschlagen. Nicht einmal sicher, wie es überhaupt funktionieren würde. – chrisjleu

1

Sie müssen die alwaysUseFullPath Eigenschaft setzen in in die Handler auf true:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    ... 
    <property name="alwaysUseFullPath" value="true" /> 
</bean> 

Dies wird die Handler zwingen, die '/ secure /' Teil der URI und dann der Resolver wird es zu benutzen sind, wenn für eine JSP in WEB-INF/jsp suchen.

+0

Kein Glück mit diesem. Immer noch im Stamm-JSP-Ordner suchen. – chrisjleu

2

Ich konnte die genaue Lösung der gestellten Frage nicht finden, aber ich habe einen Workaround, der meinen speziellen Anforderungen entspricht. Das Problem scheint in der Handkartenzuordnung zu liegen.Wenn Sie wie im Beispiel im Beitrag angegeben werden, führen alle Anforderungen an Seiten im sicheren Ordner zu einem fehlgeschlagenen Versuch, die tatsächliche JSP-Datei im Ordner /WEB-INF/JSP/ zu finden, wenn sich die tatsächliche Datei natürlich in /WEB-INF/jsp/secure/ befindet.

jedoch angegeben, wenn in etwa so:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
    <props> 
    <prop key="/login.htm">loginFormController</prop> 
    <prop key="**/*.htm">urlFilenameViewController</prop> 
    </props> 
    </property> 
</bean> 

Dann werden alle Seiten korrekt aufgelöst. Eine Anfrage an /login.html wird zu einem bestimmten Formular-Controller gehen, aber Anfragen an alle anderen Seiten, egal ob sie sich im Root-JSP-Verzeichnis befinden oder ein Unterverzeichnis gefunden wird. Für mich ist das in Ordnung, denn nach was ich wirklich suchte, war eine Möglichkeit, einen Controller für jede Seite in der Anwendung zu spezifizieren (hmmm ... vielleicht hätte ich das im ersten Beitrag klarstellen sollen - und vielleicht gibt es bessere Möglichkeiten dafür mach das trotzdem (?)). Die **/*.htm fungiert als ein Catch-All-Fall und alle Seiten, die ich von einem anderen Controller behandelt werden soll, können explizit über diese Eigenschaft angegeben werden, wie von /login.htm demonstriert.

2

Versuchen mit UrlFilenameViewController oder return new ModelAndView("secure/login");

1

es so scheint, sollte, arbeiten nach den docs:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/servlet/mvc/UrlFilenameViewController.html

Die configs Sie gezeigt haben, scheinen mit den Beispielen im doc passen . Wenn Ihr Spring MVC-Dispatcher-Servlet "/" zugeordnet ist, sollten Anfragen an "{context} /secure/whatever.jsp" übersetzt werden, um den Namen "secure/whatever" anzuzeigen. Vielleicht hat es etwas mit der Wildcard "**" zu tun? Oder vielleicht sind einige Ihrer anderen Konfigurationen nicht richtig? Können Sie den Teil Ihrer web.xml, in dem Sie Ihr Spring-Dispatcher-Servlet einrichten, einbeziehen und auch die vollständigen Pfade einschließen, die Sie in Ihrem Browser anfordern? Eine andere Möglichkeit, das Problem zu finden, wäre, den Quell-MVC-Quellcode herunterzuladen und ihn in Ihre App einzubinden. Verwenden Sie dann einen Debugger, um genau zu sehen, was in beiden SimpleUrlHandlerMapping- und UrlFilenameViewController-Beans passiert Error. Sie sollten in der Lage sein, ziemlich schnell festzustellen, wo die Dinge so schief laufen.

0

Alle Unterverzeichnisse können

mithilfe von Wild Card in Präfix zugegriffen werden

vom Regler können Sie einfach zurückgeben jsp Namen als String und die jsp wird angezeigt, auch wenn es unter Unterordner von/WEB ist -INF/jsp/like/WEB-INF/jsp/abc