2009-05-08 5 views
2

Nous avons une application Web Struts 2 utilisée par presque tous les employés pour gérer et configurer les tâches de notre ferme de serveurs. Nous travaillons sur un plan pour créer un tableau de bord pour les clients, afin qu'ils puissent voir leurs propres travaux, et un affichage très simple de son statut ("en cours", "prêt pour l'épreuvage", "fini", etc.). Toutes les pages que les clients peuvent voir auront beaucoup moins d'informations que les opinions des employés, et il n'y aura aucun moyen de modifier ou de modifier quoi que ce soit. Mais à la fin, ils sont essentiellement deux vues séparées de la même information: une très simple, une plus complexe et contrôlable.Rendre Struts afficher différents JSP pour différents rôles

La façon naïve de le faire, est d'avoir si/elses dans chaque jsp simple:

<s:if test="user.role == 'customer'"> 
    <!-- TODO - Display simple customer view --> 
</s:if> 
<s:else> 
    <!-- TODO - Display complex employee view --> 
</s:else> 

est-il un moyen plus simple de le faire? Puis-je créer deux répertoires distincts de jsps, un nommé "client" et un nommé "employé" (ou par défaut ou quelque chose), puis avoir la clé Struts d'une propriété dans mon action pour décider quel répertoire vérifier?

Ou existe-t-il un autre moyen de le faire?

Répondre

1

Je suggère de gérer cela à l'intérieur de votre contrôleur. Ajoutez une nouvelle vue pour le client et vérifiez le rôle de l'utilisateur dans votre contrôleur et affichez la vue appropriée. Cela laissera votre vue existante intacte, et ajoute la possibilité d'avoir des vues vraiment personnalisées pour vos clients.

+0

Pour chaque action, dupliquez toutes les définitions de résultats? C'est une grande application, avec peut-être 50 actions. C'est beaucoup de choses supplémentaires dans le fichier struts.xml, et cela me fait penser qu'il serait plus difficile à maintenir avec toute la duplication. – Plutor

+1

+1 Je pense que c'est une bonne solution, mais je pense que vous devriez consulter http://www.stripesframework.org. C'est comme des entretoises sans le xml. – ScArcher2

+0

Si chaque action réutilise les mêmes vues, alors oui, ce serait beaucoup de duplication de code dans le xml; vous pouvez créer une nouvelle action et l'appeler depuis votre contrôleur au lieu de renvoyer une nouvelle réponse personnalisée. Si chaque action nécessite une vue unique, cette duplication est logique et nécessaire. –

1

La question de savoir si les deux vues sont complètement différentes, ou si les clients ont quelque chose en plus, ou si les employés ont quelque chose en plus, n'est pas très claire. Si un rôle a quelque chose en plus, placez simplement les parties communes dans un fichier et les parties non communes dans leurs propres fichiers et utilisez include ou tiles (ou quelque chose de similaire) pour combiner les JSP pour créer une page. Si les deux vues sont complètement différentes, elles doivent être des pages JSP distinctes, auquel cas l'action peut être transmise à la vue appropriée en fonction du rôle, comme suggéré par Rich Kroll. En ce qui concerne votre commentaire sur la duplication des définitions de résultats, lorsque vous avez deux entités distinctes mutuellement exclusives, vous avez besoin de deux chemins de code. Le mieux que vous puissiez faire est de prendre en compte les points communs dans les fichiers de code partagés. Une façon de simplifier votre code d'action, si ce modèle est quelque chose que vous faites beaucoup, est de choisir l'ActionForward qui correspond le mieux à votre nom d'expédition désiré.

Donc, si normalement vous feriez

return mapping.findForward("success"); 

Vous pouvez faire quelque chose comme ça

ActionForward defaultMapping = mapping.findForward("success"); 
ActionForward roleMapping = mapping.findForward(user.getRole() + "_success"); 
if (roleMapping != null) { 
    return roleMapping ; 
} else { 
    return defaultMapping; 
} 

Mettez ça dans une méthode dans votre classe de base et vos actions ne ont pas besoin de savoir quelle vue ils vont. Ensuite, votre struts-config peut être quelque chose comme ceci:

<action path="/home" class="HomeAction"> 
    <forward name="success" path="home.jsp"/> 
</action> 
<action path="/viewOrder" class="ViewOrderAction"> 
    <forward name="customer_success" path="customer_order.jsp"/> 
    <forward name="employee_success" path="employee_order.jsp"/> 
</action> 

Dans ce cas, vous ne cherchez pas dynamiquement les jsps par nom pour déterminer si oui ou non ils existent, mais au moins vous pouvez garder le simple code d'action.

+0

J'ai édité la question pour clarifier que dans presque tous les cas, ce ne sont que deux vues différentes des mêmes données. – Plutor

+0

Deux vues différentes des mêmes données, mais la mise en œuvre de ces vues semble très différente. J'irais avec deux entrées vers l'avant pour chaque action dans ce cas. –

+0

C'est bien, mais est-il possible de faire cette recherche dans Struts 2? Il n'y a plus de méthode équivalente dans l'objet ActionMapping. – Plutor

Questions connexes