Question

Je crée des classes statiques dans servlet, ces classes sont des contrôleurs pour les pages Web. Les demandes sont redirigées vers les contrôleurs par les URL de contrôleur contenues dans HashMap statique, qui contient tous les contrôleurs. Existe-t-il des possibilités que des éléments réellement liés aux utilisateurs / sessions puissent être perturbés par les sessions d'autres utilisateurs? Je vais bien sûr sauvegarder toutes les données relatives à la session sur HttpSession et les objets requête, réponse et HttpSession sont transmis au contrôleur lorsque le gestionnaire de demandes du contrôleur est appelé.

MISE À JOUR:

Voici un exemple:

public class MainControllerServlet extends HttpServlet {
static HashMap<String, ControllerAbstract> controllers = new HashMap<String, ControllerAbstract>();

    public MainControllerServlet()
    {
        controllers.put("url", new Controller());
    }

}

ControllerAbstract:

public abstract class ControllerAbstract {
    private String url;
    private HashMap<String, ControllerAbstract> children = new HashMap<String, ControllerAbstract>();

    public abstract void handleRequest(HttpServletRequest request, HttpServletResponse response, SessionBean session, String type) throws Exception;

}
Était-ce utile?

La solution

Votre code semble indiquer que vous utilisez une table de hachage statique, et non des classes statiques, de sorte que vous partagez la carte entre tous les utilisateurs. Je vois quelques problèmes avec ceci -

  • Votre carte n'est pas thread-safe, ce qui pourrait être un problème de conflits entre la création et la récupération d'objets. Compte tenu des problèmes potentiels de partage / thread, à quel autre endroit placez-vous des objets dans la carte?
  • Vos objets ControllerAbstract ont un état et vous pouvez vous retrouver dans une situation où plusieurs demandes utiliseront le même contrôleur. Par exemple, des demandes s'ajouteront-elles au hashmap des enfants dans leurs propres objets ControllerAbstract? Vous pouvez avoir plusieurs demandes utilisant le même ControllerAbstract - par exemple. si la requête 1 souhaite ajouter ou supprimer à sa carte ControllerAbstract.children, tandis que la requête 2 référençant le même objet décide de parcourir les enfants, vous obtiendrez une exception ConcurrentModificationException.
  • La construction du servlet est gérée par le conteneur. Si vous devez coder en dur l'URL pour qu'elle existe dans le constructeur de la servlet, s'agit-il simplement d'une chaîne constante? Si tel est le cas, ne serait-il pas plus facile de simplement le déclarer en tant que constante dans l'objet ControllerAbstract? Si non, d'où vient-il? Dans tous les cas, vous modifiez la carte des contrôleurs chaque fois que le conteneur décide de créer un nouveau servlet.

Autres conseils

Vous voulez dire des références statiques? les classes statiques n’existent pas, à moins que ne soient pas des classes internes, mais elles n’ont pas de comportement statique. Si vous utilisez des références statiques en tant que contrôleurs, vous vous souciez de tous les attributs dans ces contrôleurs.

Les classes internes statiques sont une alternative aux classes normales d'un autre package. Ainsi, vous n'aurez plus à vous soucier de leur mélange avec vos classes de servlets.

Comme vous appelez les méthodes .handleRequest () à la suite d'appels de servlet, vous devez vous assurer que la mise en œuvre de vos contrôleurs est ré-entrante. . C'est à dire. leur exécution ne doit pas utiliser une mémoire de stockage autre que la pile et les objets que vous transmettez en tant qu'arguments.

Cela dit, je choisirais de placer les contrôleurs dans leur propre package en dehors du package contenant vos servlets. Vous pouvez ensuite ajouter une classe de gestionnaire qui possède et initialise la carte et gère les appels des servlets (résumant les détails de la mise en œuvre.)

Pour autant que je sache, une classe statique n’est rien de plus qu’une classe imbriquée. Je ne vois donc pas pourquoi cela devrait être différent d’une classe publique normale.

Les classes

statiques internes se comportent exactement comme les classes normales, elles ont simplement une portée supplémentaire. Cela dit, si vous partagez l'état entre les classes en utilisant des variables statiques dans la classe externe, vous risquez de rencontrer des problèmes. Étant donné que vous avez dit que vous n'utiliserez que l'objet HttpSession pour transmettre des données entre les invocations, cela ne vous posera aucun problème.

Ce que tu fais me semble bien. Assurez-vous simplement de ne rien stocker dans les variables membres dans vos implémentations de contrôleur. Je suppose également que vous ne placez que des objets dans la carte des contrôleurs au moment de l'instanciation du servlet.

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