1. Références

2. Premiers pas avec l’injection

2.1. Injection dans un servlet

  1. Créer un servlet

  2. Dans celui-ci, injecter :

    • Une source de données DataSource

    • Un gestionnaire d’entités EntityManager

    • Un objet d’un type quelconque e.g. Person

  3. S’assurer que les objets ne sont pas null à l’exécution.

2.2. Injection dans un EJB

  1. Créer un EJB

  2. Dans celui-ci, injecter :

    • Une source de données DataSource

    • Un gestionnaire d’entités EntityManager

    • Un objet d’un type quelconque e.g. Person

  3. S’assurer que les objets ne sont pas null à l’exécution.

2.3. Injection dans un objet quelconque

  1. Créer un type quelconque e.g. Person

  2. Dans celui-ci, injecter :

    • Une source de données DataSource

    • Un gestionnaire d’entités EntityManager

    • Un objet d’un autre type quelconque e.g. Adress

  3. S’assurer que les objets ne sont pas null à l’exécution.

Rappel

Seuls les objets dont le cycle de vie est géré par le serveur d’applications sont la cible potentielle de l’injection.

3. Travail sur les scopes

3.1. Singleton applicatif

  • Dans l’exemple précédent, combien d’instances de Person sont créées ?

  • Comment faire pour qu’une unique instance soit créée (et qu’elle soit chacune injectée dans le servlet et l’EJB) ?

3.2. Scope de requête

  1. Créer un bean qui a pour scope la requête

  2. Vérifier qu’un nouvel objet est créé à chaque requête

  3. Vérifier que le même objet est injecté tout au long de la chaîne de requête

3.3. Gestion de la session

Soit le code suivant :

@WebServlet("/preferences")
public class PreferencesServlet extends HttpServlet {

    private static final String PREFS_KEY = "ch.frankel.preferences";

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Enumeration<String> parameterNames = req.getParameterNames();
        HttpSession session = req.getSession();
        Object o = session.getAttribute(PREFS_KEY);
        Map<String, String> preferences;
        if (o == null) {
            preferences = new HashMap<>();
        } else {
            preferences = (Map) o;
        }
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            if (parameterName.startsWith("preferences")) {
                String value = req.getParameter(parameterName);
                preferences.put(parameterName, value);
            }
        }
        session.setAttribute(PREFS_KEY, preferences);
        resp.sendRedirect("/preferences");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Object o = session.getAttribute(PREFS_KEY);
        if (o == null) {
            o = new HashMap<String, String>();
        }
        req.setAttribute(PREFS_KEY, o);
        req.getRequestDispatcher("/WEB-INF/preferences.jsp").forward(req, resp);
    }
}
  1. Analyser le code précédent

  2. Ré-écrire celui-ci en utilisant un bean injecté lié à la session

4. Producers

Il est plus aisé de vérifier l’injection dans un servlet

4.1. Producer simple

  • Dans un objet quelconque, injecter le temps système

    Utiliser la méthode System.currentTimeMillis()
  • Vérifier

4.2. Producer complexe

  • Dans un object quelconque, injecter un objet de type Random

    • Si la propriété système secure vaut true, le type concret de l’objet doit être SecureRandom

      Utiliser la méthode System.getProperty()
    • Sinon, le type concret doit être simplement Random

  • Vérifier

4.3. Désambiguïsation

  • Dans un object quelconque, injecter d’une part le jour de la semaine (p.e. "LUNDI"), d’autre part, le mois (p.e. "JANVIER").

  • Vérifier

5. Intercepteurs et décorateurs

  • Créer un intercepteur qui écrit dans la sortie standard les paramètres d’entrée et la valeur de retour des méthodes interceptées.

  • Vérifier son bon fonctionnement

6. Programmation évènementielle

Soit l’architecture exposée précédemment (§ 5.1).

Remplacer le mécanisme des filtres par une configuration générale du format.

  • Créer un servlet qui permet de configurer le format désiré

  • Lorsque l’URL du servlet est appelée, ce dernier envoie un évènement de type FormatChanged

  • Un composant singleton souscrit à cet évènement et conserve l’information

  • Ce composant est injecté dans le servlet qui affiche la page