2013-09-26 1 views
2

Je viens de commencer à étudier Spring, et j'essaye de faire une application web. J'ai des éléments d'interface utilisateur communs tels que le pied de page, l'en-tête, la barre latérale et je veux également ajouter des blocs dynamiques, c'est-à-dire des widgets. Les widgets à inclure doivent être choisis dans le code Java, pas dans le modèle JSP.Dynamic inclut dans le modèle JSP

Et c'est là que je suis coincé. Chaque contrôleur retourne propre point de vue est tout - main.jsp qui comprend des blocs statiques et dynamiques:

<jsp:include page="head.jsp" /> 
    <c:forEach items="${viewList}" var="viewName"> 
       <jsp:include page="${viewName}.jsp" />  
    </c:forEach> 
... 

En controleur je passe la liste de vue et de l'objet qui sera utilisé comme widget pour le modèle:

... 
views.add(moduleOne.getViewName()); 
views.add(moduleTwo.getViewName()); 
model.addAllAttributes(moduleOne.getAttr()); 
model.addAllAttributes(moduleTwo.getAttr()); 
model.addAttribute(IModule.VIEW_LIST, views); // passing all views that will be included into main.jsp 
... 
return "main"; 

Mais cela ne fonctionne pas parce que quand j'utilise jsp:include page les paramètres du modèle ne passent pas à includee. Aussi je ne peux pas %@include file= parce que dans ce cas je ne serai pas capable d'utiliser des variables et je devrais savoir quelle vue passer lors de la compilation.

Bien sûr, s'il n'y a pas de solution, je vais devoir coder toutes les vues possibles widget main.jsp et basculer entre eux:

switch($i) { 
    case 1: 
      include file=widget1.jsp; 
      break; 
    case 2: 
     include file=widget2.jsp; 
     break; 
     ...      
    } 

Ce qui est évidemment pas flexible.

Ainsi, les questions sont:

  1. est-il un moyen de résoudre le problème du modèle de passer à inclure des vues sans utiliser %@include file= et faire mes widgets de travail?
  2. Existe-t-il une meilleure façon d'implémenter une telle structure de widgets?

Merci beaucoup!

+0

Avez-vous essayé de vider les attributs de la demande dans votre 'JSP's inclus? juste pour vérifier que la * demande incluse * les contient toujours. S'ils sont là, ils sont accessibles. –

+0

@AlonsoDominguez que voulez-vous dire? Par exemple, j'ai défini des classes et d'autres attributs à modéliser, et ils n'étaient disponibles que dans la première vue incluse. D'autres vues ne les ont pas. Est-ce que je vous ai compris? –

+0

Je ne comprends pas pourquoi vous ne pouvez pas utiliser '<% @ include'. Je l'ai fait dans un projet où j'avais besoin de faire un "magicien" qui utilisait une forme mais plusieurs fragments jsp. J'ai juste eu un Enum que j'ai placé dans mon modèle qui a déterminé quel fragment je devrais charger, et a utilisé un 'c: choose' dans le JSP. – CodeChimp

Répondre

0

Vous pouvez toujours utiliser un attribut de modèle pour décider quel fichier à inclure comme

model.addAttribte("fileToInclude",IncludeFile.HEADER); 

puis

<c:choose> 
<c:when test="${fileToInclude == 'HEADER'}"> 
<%@include file="header.jsp"%> 
</c:when> 
<c:otherwise> 
</c:otherwise> 
</c:choose> 

Mais il y a un moyen beaucoup mieux et plus propre. utiliser un décorateur comme SiteMesh, vous pouvez avoir différents décorateurs appliqués à vos vues. Essayez-le Sitemesh

Questions connexes