2009-11-23 3 views
10

Quel est un moyen simple de résoudre le chemin d'accès à un fichier JSP qui ne se trouve pas dans le répertoire racine JSP d'une application Web en utilisant SpringMVCs viewResolvers? Par exemple, supposons que nous avons la structure d'application Web suivant:Spring MVC: Comment faire pour résoudre le chemin d'accès aux sous-répertoires du dossier racine 'JSP' dans une application Web

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

Je voudrais utiliser des hors-the-box composants pour résoudre les fichiers JSP dans le dossier racine jsp et le sécurisé sous-répertoire. J'ai un fichier *-servlet.xml qui définit:

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> 

un mappage de gestionnaire:

<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 contrôleur:

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

Le problème que j'ai est que les demandes à la Les pages JSP du répertoire sécurisé ne peuvent pas être résolues car le jspViewResolver a uniquement un préfixe défini comme /jsp/ et non /jsp/secure/.

Existe-t-il un moyen de gérer des sous-répertoires comme celui-ci? Je préférerais garder cette structure parce que j'essaie aussi de faire usage de Spring Security et d'avoir toutes les pages sécurisées dans un sous-répertoire est une bonne façon de le faire.

Il y a probablement un moyen simple d'y parvenir, mais je suis nouveau sur Spring et le framework Spring MVC donc tous les pointeurs seraient appréciés.

+0

Remarque non liée, mais vous n'avez plus besoin de spécifier 'JstlView' comme' viewClass', Spring le trouvera par défaut. – skaffman

Répondre

0

Vous devez définir la propriété comme suit:

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

et vous pouvez accéder à l'URI secure/admin1.jsp

+0

Désolé ce préfixe était une faute de frappe, je l'ai corrigé maintenant. Cependant, si je dois sécuriser/admin1.jsp (ou secure/admin1.htm), cela résoudra la recherche dans /WEB-INF/jsp/admin1.jsp et n'inclura pas le dossier sécurisé car cela ne fait pas partie du préfixe (Je blieve) – chrisjleu

+0

Quelle version de ressort utilisez-vous? Cela devrait fonctionner en 2.5.x –

+0

J'utilise 2.5.6.SEC01. Je l'ai essayé mais le problème semble être dans la façon dont les mappings dans SimpleUrlHandlerMapping sont spécifiés dans mon exemple. Toute requête à/secure/** entraînera Spring attendant que le fichier JSP réside dans/WEB-INF/jsp /, alors que le fichier se trouve bien dans/WEB-INF/jsp/secure /. J'ai découvert une solution de contournement appropriée qui sert mes fins, mais il a ses limites. Je vais continuer à publier cela aussi. – chrisjleu

1

Vous pouvez donner des noms des vues dans le contrôleur comme

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

ayant le préfixe et le suffixe mappés comme ci-dessous

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

Ce qui finira par carte à /WEB-INF/jsp/secure/admin.jsp et /WEB-INF/jsp/secure/admin2.jsp

+0

Je ne suis pas certain de comprendre comment les propriétés formView et successView s'appliquent ici lorsque je souhaite utiliser UrlFilenameViewController. – chrisjleu

+0

formView et successView sont les noms de vues que vous pouvez injecter dans vos contrôleurs si vous souhaitez des vues configurables. Ces 2 sont disponibles par défaut si vous utilisez SimpleFormController. –

+0

Non, cela n'a rien à voir avec les formulaires, ce ne sont que des pages JSP avec peu de contenu, et bien qu'il y ait deux pages dans l'exemple que j'ai donné, cela ne se limite pas à deux. Je n'utilise même pas un contrôleur * form * et je pense que ce serait abuser des propriétés formView et successView si je devais essayer de l'utiliser comme vous le suggérez. Je ne sais même pas comment cela fonctionnerait de toute façon. – chrisjleu

1

Vous devez définir la propriété alwaysUseFullPath à en le gestionnaire true:

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

Cela forcera le gestionnaire à utiliser la partie de l'URI «/sécurité/» et le résolveur comprendra quand la recherche d'un JSP dans WEB-INF/jsp.

+0

Pas de chance avec ça. Toujours en regardant dans le dossier JSP racine. – chrisjleu

2

Je n'ai pas été en mesure de découvrir la solution exacte à la question que j'ai posée, mais j'ai une solution de contournement qui convient à mes besoins particuliers. Le problème semble résider dans le mappage du hander.Si spécifié comme dans l'exemple dans la publication, toutes les demandes aux pages du dossier sécurisé entraînent une tentative infructueuse pour localiser le fichier JSP réel dans le dossier /WEB-INF/JSP/ alors que le fichier se trouve bien sûr dans /WEB-INF/jsp/secure/.

Cependant, si cela est spécifié comme ceci:

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

Ensuite, toutes les pages sont réglées correctement. Une demande à /login.html ira à un contrôleur de formulaire spécifique, mais les demandes à toutes les autres pages, peu importe si elles sont dans le répertoire racine JSP ou un sous-répertoire sera trouvé. Pour moi, c'est bien parce que ce que je cherchais vraiment était un moyen d'éviter de spécifier un contrôleur pour chaque page de l'application (hmmm ... peut-être que j'aurais dû le préciser dans le premier post - et peut-être faites-le de toute façon (?)). Le **/*.htm agit comme un fourre-tout et toutes les pages que je veux traitées par un contrôleur différent peuvent être spécifiées explicitement au-dessus de cette propriété, comme démontré par /login.htm.

2

Essayez avec UrlFilenameViewController ou return new ModelAndView("secure/login");

1

Il semble que cela devrait fonctionner, selon les docs:

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

Les configs que vous avez indiquées semblent correspondre aux exemples dans le doc . Si votre servlet Spring MVC Dispatcher est mappée sur "/" alors les requêtes à "{context} /secure/whatever.jsp" doivent être traduites pour afficher le nom "secure/whatever". Peut-être que cela a quelque chose à voir avec le caractère générique "**"? Ou peut-être que certaines de vos autres configs n'ont pas raison? Pouvez-vous inclure la partie de votre fichier web.xml où vous configurez votre servlet distributeur Dispatcher Spring et inclure également tous les chemins que vous demandez dans votre navigateur? Une autre façon de trouver le problème serait de télécharger le code source Spring MVC et de l'inclure dans votre application, puis d'utiliser un débogueur pour voir exactement ce qui se passe dans les deux beans SimpleUrlHandlerMapping et UrlFilenameViewController pour essayer de localiser Erreur. Vous devriez être en mesure de déterminer assez rapidement où les choses vont mal de cette façon.

0

Tous les sous-dossiers peuvent être consultées en utilisant wild card en préfixe

De contrôleur vous pouvez retourner simplement le nom jsp sous forme de chaîne et la jsp sera affichée même si elle est sous des sous-dossiers de/WEB -INF/jsp/like/WEB-INF/jsp/abc