2010-09-22 6 views
1

Ceci est un exemple d'un type de problème que j'ai eu.Utilisation du polymorphisme lors de la génération de pages Web?

Lorsqu'un utilisateur arrive sur la page d'accueil de mon application, il y a deux possibilités, il/elle est:

  1. connecté
  2. pas connecté

Si l'utilisateur est connecté Je veux afficher le nom d'utilisateur en haut à droite et un lien qui dit "se déconnecter". Si l'utilisateur n'est pas connecté, je souhaite afficher un lien "login ou inscription".

Auparavant j'aurais appelé du code de la JSP qui retournerait un morceau approprié de HTML que je collerais dans ma page. Mais ce n'est probablement pas la meilleure chose à faire, même si c'est simple. Maintenant je crois que je devrais envoyer la demande initiale pour la page d'accueil à une servlet (au lieu de jsp), qui instanciera un objet de type "HomePage" qui a des sous-classes "LoggedInHomePage" et "NotLoggedInHomePage" selon si un utilisateur id est disponible dans la variable de session. Je vais devoir déterminer le bon constructeur avec une instruction if ou case.

Jusqu'à présent, il semble plus propre. Mais à ce stade, cela devient compliqué, parce que je dois maintenant savoir si j'ai ou non userId fourni dans mon "objet de demande" pour lequel j'ai besoin d'utiliser des instructions if, ou j'utilise un template jsp différent qui implique deux jsps presque identiques assis sur le serveur pour chaque page.

Ni semble élégant. Aide le plus apprécié. Si vous avez une bonne solution à ce problème, s'il vous plaît, ignorez ma description et étalez-la, cela ne me dérange pas de jeter toutes les idées que j'ai présentées ici.

Répondre

1

Une solution possible:

Ajouter un prototype de méthode pour HomePage. Appelez-le getNavigationArea() ou getNavigationLinks() (disons). Cette méthode retournera un ensemble de Link objets qui peuvent être rendus en utilisant le HTML approprié. Les deux et NotLoggedInHomePage remplaceront cette méthode. L'implémentation de la première fournira une instance Link qui dit «se déconnecter» tandis que la seconde fournira une instance qui dit «inscrire/enregistrer».

La JSP rendra la zone de navigation sans connaître son contenu. De cette façon, vous n'aurez qu'une seule page JSP, quel que soit le statut de l'utilisateur. Vous pouvez également ajouter d'autres types d'utilisateurs, par exemple RegularUser, AdminUser etc. avec différentes options de navigation sans avoir à ajouter de nouvelles pages JSP.

+0

Merci le seul changement que je ferai est que je vais retourner une liste d'objets Lien, car le problème est dans un cas, j'ai un seul lien (inscription) et dans l'autre cas, j'ai deux liens (nom d'utilisateur, déconnexion). Merci. – Ankur

3

Je voudrais simplement créer une seule page d'accueil, avec un élément de connexion dont la responsabilité est d'afficher l'état actuel et d'effectuer l'authentification nécessaire lors de la connexion.

Ceci est un « a une » relation plutôt qu'une 'est un'

+0

Oui, je suis d'accord que c'est "a un" pas "est un" .. fera des choses des attributs plutôt que des sous-classes. – Ankur

+0

Est-ce similaire à avoir une zone d'en-tête/pied de page/gauche/droite qui est une jsp en elle-même, puis le faire gérer la logique de connexion. Toutes les pages sont juste composées avec ce login JSP? –

+0

C'est le meilleur choix de ceux fournis, je pense. Simple et élégant. – EricBoersma

Questions connexes