Question

Nous avons une application Web Struts 2 qui est utilisée par la plupart des employés pour gérer et configurer les travaux de notre batterie de serveurs. Nous travaillons sur un plan visant à créer un tableau de bord pour les clients, afin qu'ils puissent voir leurs propres tâches et un affichage très simple de son statut ("en cours", "prêt pour la correction", "terminé", etc. ). Toutes les pages que les clients peuvent voir contiendront beaucoup moins d'informations que les vues d'employés, et il n'y aura aucun moyen de modifier ou de modifier quoi que ce soit. Mais au final, il s’agit essentiellement de deux vues distinctes de la même information: une très simple, une plus complexe et contrôlable.

La façon naïve de faire cela est d’avoir si / elses dans chaque jsp:

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

Existe-t-il un moyen plus simple de procéder? Puis-je créer deux répertoires distincts de jsps, l'un nommé "client"? et un nommé " employé " (ou default ou quelque chose) et puis avoir Struts hors d'une propriété dans mon action pour décider quel répertoire vérifier?

Ou y a-t-il un autre moyen de le faire?

Était-ce utile?

La solution

Je suggérerais de gérer cela dans votre contrôleur. Ajoutez une nouvelle vue pour le client, 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 ajoutera la possibilité d'avoir des vues vraiment personnalisées pour vos clients.

Autres conseils

La question ne permet pas de savoir si les deux points de vue sont complètement différents, si les clients ont quelque chose de plus, ou si les employés ont quelque chose de plus. Si un rôle a quelque chose de plus, il suffit de placer les parties communes dans un fichier et les parties inhabituelles dans leurs propres fichiers et d’utiliser des inclus ou des tuiles (ou quelque chose de similaire) pour combiner les JSP afin de créer une page.

Si les deux vues sont complètement différentes, il doit s'agir de fichiers JSP distincts. Dans ce 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 fonctionnalités distinctes s'excluant mutuellement, vous avez besoin de deux chemins de code. Le mieux que vous puissiez faire est de factoriser les points communs dans des fichiers de code partagés.

Une façon de simplifier votre code d'action, si vous faites souvent ce modèle, est de choisir ActionForward qui correspond le mieux à votre nom de transfert souhaité.

Donc, si normalement vous le 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 cela dans une méthode de votre classe de base afin que vos actions n'aient pas besoin de savoir quelle vue elles vont avoir. Ensuite, votre configuration de struts peut ressembler à 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 recherchez pas dynamiquement les jsps par leur nom pour déterminer s'ils existent ou non, mais vous pouvez au moins garder le code d'action simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top