2009-11-23 22 views
10

¿Cuál es una manera simple de resolver la ruta a un archivo JSP que no se encuentra en el directorio raíz JSP de una aplicación web usando SpringMVCs viewResolvers? Por ejemplo, supongamos que tenemos la siguiente estructura de aplicaciones web:Spring MVC: Cómo resolver la ruta a los subdirectorios de la carpeta raíz 'JSP' en una aplicación web

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

me gustaría utilizar algunos componentes fuera de la caja para resolver los archivos JSP dentro de la carpeta raíz JSP y la seguro subdirectorio. Tengo un archivo *-servlet.xml que define:

un 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> 

una asignación de controlador:

<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> 

un out-of-the-box UrlFilenameViewController controlador:

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

El problema que tengo es que las solicitudes al Los JSP en el directorio seguro no se pueden resolver, ya que el jspViewResolver solo tiene un prefijo definido como /jsp/ y no /jsp/secure/.

¿Hay alguna manera de manejar subdirectorios como este? Preferiría mantener esta estructura porque también estoy tratando de hacer uso de Spring Security y tener todas las páginas seguras en un subdirectorio es una buena manera de hacerlo.

Probablemente haya una manera simple de lograr esto, pero soy nuevo en Spring y en el framework Spring MVC, así que cualquier puntero sería apreciado.

+0

Nota no relacionada, pero ya no es necesario que especifique 'JstlView' como' viewClass', Spring lo resolverá de manera predeterminada. – skaffman

Respuesta

0

Tiene que establecer la propiedad de la siguiente manera:

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

y entonces usted puede acceder al URI secure/admin1.jsp

+0

Perdón, ese prefijo era un error tipográfico, lo he corregido ahora. Sin embargo, si tengo que proteger/admin1.jsp (o secure/admin1.htm), eso resolverá la búsqueda en /WEB-INF/jsp/admin1.jsp y no incluirá la carpeta segura, ya que no forma parte del prefijo. (I blieve) – chrisjleu

+0

¿Qué versión de primavera estás usando? Debería funcionar en 2.5.x –

+0

Estoy usando 2.5.6.SEC01. Lo he intentado, pero el problema parece estar en la forma en que se especifican las asignaciones en SimpleUrlHandlerMapping en mi ejemplo. Cualquier solicitud a/secure/** dará como resultado Spring que espera que el archivo JSP resida en/WEB-INF/jsp /, cuando por supuesto el archivo real se encuentra en/WEB-INF/jsp/secure /. He descubierto una solución adecuada que sirve para mis propósitos, pero tiene sus limitaciones. Voy a proceder a publicar eso también. – chrisjleu

1

Usted puede tratar de darle nombres de las vistas en el controlador como

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

teniendo el prefijo y el sufijo mapeados como a continuación

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

Esto a la larga va a asignar a /WEB-INF/jsp/secure/admin.jsp y /WEB-INF/jsp/secure/admin2.jsp

+0

No estoy seguro de que entiendo cómo las propiedades formView y successView se aplican aquí cuando quiero usar el UrlFilenameViewController. – chrisjleu

+0

formView y successView son los nombres de vista que puede insertar en sus controladores, si desea vistas configurables. Estos 2 están disponibles por defecto para usted en caso de que use SimpleFormController. –

+0

No, esto no tiene nada que ver con formularios, solo son páginas JSP con poco contenido, y aunque hay dos páginas en el ejemplo que di, no está limitada a dos. Ni siquiera estoy usando un controlador * form * y creo que esto abusaría de las propiedades formView y successView si intentara usarlo de la manera que sugieres. Ni siquiera estoy seguro de cómo funcionaría de todos modos. – chrisjleu

1

Tiene que establecer la propiedad en alwaysUseFullPath en el controlador de verdad:

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

Esto obligará al manejador de usar la parte '/ seguro /' de la URI y luego el resolver lo incluirá en la búsqueda de una JSP en WEB-INF/jsp.

+0

No hubo suerte con esto. Sigue buscando en la carpeta raíz JSP. – chrisjleu

2

No he podido encontrar la solución exacta a la pregunta que hice, pero tengo una solución que se ajusta a mis requisitos particulares. El problema parece estar en el mapeo de handers.Si se especifica como en el ejemplo de la publicación, cualquier solicitud a páginas en la carpeta segura dará como resultado un intento fallido de localizar el archivo JSP real en la carpeta /WEB-INF/JSP/ cuando, por supuesto, el archivo real se encuentre en /WEB-INF/jsp/secure/.

Sin embargo, si se especifica así:

<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> 

A continuación, todas las páginas se resuelven correctamente. Una solicitud al /login.html irá a un controlador de formulario específico, pero las solicitudes a todas las demás páginas, independientemente de si se encuentran en el directorio raíz JSP o se encontrará un subdirectorio. Para mí esto está bien porque lo que realmente estaba buscando era una manera de evitar especificar un controlador para cada página en la aplicación (hmmm ... tal vez debería haber dejado eso en claro en la primera publicación, y tal vez hay mejores formas de hacer esto de todos modos (?)). El **/*.htm actúa como un caso general y cualquier página que desee que maneje un controlador diferente puede especificarse explícitamente arriba de esta propiedad, como lo demuestra /login.htm.

2

intento con UrlFilenameViewController o return new ModelAndView("secure/login");

1

Parece que esto debería funcionar, de acuerdo con los documentos:

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

Las configuraciones que ha mostrado parecen coincidir con los ejemplos en el documento . Si su servlet despachador Spring MVC está mapeado a "/", las solicitudes a "{context} /secure/whatever.jsp" deberían traducirse para ver el nombre "seguro/lo que sea". ¿Tal vez tiene algo que ver con el comodín "**"? ¿O tal vez algunas de tus otras configuraciones no son correctas? ¿Puede incluir la porción de su web.xml donde configuró su servlet de distribución Spring y también incluir las rutas completas que está solicitando en su navegador?

Otra forma de encontrar el problema sería descargar el código fuente de Spring MVC e incluirlo en su aplicación, luego use un depurador para ver exactamente qué está pasando en los beans SimpleUrlHandlerMapping y UrlFilenameViewController para tratar de localizar el error. Debería poder determinar bastante rápidamente dónde van las cosas mal de esa manera.

0

todas las subcarpetas se puede acceder mediante el uso de comodín en prefijo

De controlador que puede simplemente volver JSP nombrar como cadena y la JSP se mostrará incluso si está bajo sub carpetas de/WEB -INF/jsp/like/WEB-INF/jsp/abc

Cuestiones relacionadas