# ServletContextListener und ServletContextAttributListener



## Nico80 (22. Jan 2017)

Hallo Java-Spezialisten,

ich muss ein Servlet programmieren. 
Über ein Html Formular werden Antworten mit einer eindeutigen Id an das Servlet übergeben und sollen in einer Klasse Ergebnisse zur weiteren Auswertung gespeichert werden. Es sollen Cookies in den ServletContext mit dem Namen "quiz-" + <Name der Frage (q1 oder q2)>-" + ID mit dem Wert der Antwort als String ("true" oder "false") abgelegt werden.

Die Aktualisierung der Ergebnisklasse soll über einen ServletContextAttributListener erfolgen.
Die Id kann ich aus dem Servletcontext abrufen. Aber irgendwie kriege ich das mit der Frage, die als Enum übergeben werden soll und der Antwort, die als Boolean an die Klasse Ergebnisse über die Methode addAnswers(Question frage, Boolean antwort, Integer id)übergeben werden soll nicht hin. 
Wie kann ich mir diese Werte über den ServletContext extrahieren und in den richtigen Typ casten. Entweder irgendwie aus den Cookies  oder ... keine Ahnung?

Mir raucht die Birne ... Wäre für jede Hilfe dankbar!

Gruß
Nico


```
@WebServlet(value = "/QuizServlet")
public class QuizServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private static Integer id = 0;

    @Override
    protected synchronized void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
      
        final String pNr = request.getParameter("id");
        id = Integer.valueOf(pNr);
       
        String antwort_q1 = request.getParameter("q1");
        String antwort_q2 = request.getParameter("q2");
        ServletContext sc = getServletContext();
       
        out.println("<html><head><title>Pr&uumlfung</title></head>");
        out.println("<body><h1>Antwort</h1>");
        out.println("<table  border='1' <tr><th>Nr.    </th>");
       
        Question q1 = Question.q1;
        Question q2 = Question.q2;
       
        sc.setAttribute("neuerNutzer", id);
        sc.setAttribute(q1.name(), antwort_q1);
        sc.setAttribute(q2.name(), antwort_q2);
        //
        Results results = (Results) getServletContext().getAttribute("results");
        //
        try
        {
            if (antwort_q1.equals("true"))
            {
                Cookie cookie = new Cookie("quiz-q1-" + pNr, "Boolean.TRUE");
                cookie.setMaxAge(6000);
                response.addCookie(cookie);
                request.setAttribute("q1", antwort_q1);
                // results.addAnswer(q1, true, Integer.valueOf(pNr));
            }
            if (antwort_q1.equals("false"))
            {
                // ctx.setAttribute("quiz-q1-" + pNr, Boolean.FALSE);
                Cookie cookie = new Cookie("quiz-q1-" + pNr, "Boolean.FALSE");
                cookie.setMaxAge(6000);
                response.addCookie(cookie);
                request.setAttribute("q1", antwort_q1);
                // results.addAnswer(q1, false, Integer.valueOf(pNr));
            }
        }
        catch (NullPointerException ne)
        {
            out.println("Frage 1 fehlt");
        }
        try
        {
            if (antwort_q2.equals("true"))
            {
                // ctx.setAttribute("quiz-q2-" + pNr, Boolean.TRUE);
                Cookie cookie = new Cookie("quiz-q2-" + pNr, "Boolean.TRUE");
                cookie.setMaxAge(6000);
                response.addCookie(cookie);
                request.setAttribute("q2", antwort_q2);
                results.addAnswer(q2, true, Integer.valueOf(pNr));
            }
            if (antwort_q2.equals("false"))
            {
                // ctx.setAttribute("quiz-q2-" + pNr, Boolean.FALSE);
                Cookie cookie = new Cookie("quiz-q2-" + pNr, "Boolean.FALSE");
                cookie.setMaxAge(6000);
                response.addCookie(cookie);
                results.addAnswer(q2, false, Integer.valueOf(pNr));
                // sc.removeAttribute("quiz-q2-" + pNr);
            }
        }
        catch (NullPointerException ne)
        {
            out.println("Frage 2 fehlt!");
        }

....

}
```


```
@WebListener
public class MyListener implements ServletContextListener,
        ServletContextAttributeListener {

    Question q1, q2;
    Question frage = null;
    Boolean antwort = null;
    Integer id = null;

    public MyListener() {

    }
    public void attributeAdded(ServletContextAttributeEvent event) {

        ServletContext sc = event.getServletContext();
        Ergebnisse ergebnisse = new Ergebnisse();
        String name = event.getName();
        Object wert = event.getValue();

        System.out.println("Das Attribut: " + name + ": " + wert
                + " wurde addiert.");

        if (name == "neuerNutzer")
        {
            id = (Integer) sc.getAttribute(name);
            System.out.println("ID: " + id);
        }

        ergebnisse.addAnswer(frage, antwort, id);
    }

    public void attributeRemoved(ServletContextAttributeEvent event) {

        String name = event.getName();
        Object wert = event.getValue();
        System.out.println("Das Attribut: " + name + ": " + wert
                + " wurde gelöscht.");
    }

    public void contextDestroyed(ServletContextEvent arg0) {}

    public void attributeReplaced(ServletContextAttributeEvent arg0) {}

    public void contextInitialized(ServletContextEvent event) {

        Ergebnisse results = new Ergebnisse();
        ServletContext sc = event.getServletContext();
        sc.setAttribute("ergebnisse", ergebnisse);
    }
}
```


```
public class Ergebnisse {

    List<Integer> yesQ1 = new ArrayList<Integer>();
    List<Integer> noQ1 = new ArrayList<Integer>();
    List<Integer> yesQ2 = new ArrayList<Integer>();
    List<Integer> noQ2 = new ArrayList<Integer>();
    Question q;
    Integer id;

    public void addAnswer(Question q, Boolean answer, Integer id) {

        this.q = q;
        this.id = id;
        if (q.name() == Question.q1.name() & answer.booleanValue() == true)
        {
            yesQ1.add(id);
        }
        if (q.name() == Question.q2.name() & answer.booleanValue() == true)
        {
            yesQ2.add(id);
        }
        if (q.name() == Question.q1.name() & answer.booleanValue() == false)
        {
            noQ1.add(id);
        }
        if (q.name() == Question.q2.name() & answer.booleanValue() == false)
        {
            noQ2.add(id);
        }
    }

    public List<Integer> getYesAnsers(Question q) {

        if (q.name() == Question.q1.name())
        {
            return yesQ1;
        }
        if (q.name() == Question.q2.name())
        {
            return yesQ2;
        }
        else
        {
            return null;
        }
    }

    public List<Integer> getNoAnsers(Question q) {

        if (q.name() == Question.q1.name())
        {
            return noQ1;
        }
        if (q.name() == Question.q2.name())
        {
            return noQ2;
        }
        else
        {
            return null;
        }
    }

    public void clear() {

        yesQ1.clear();
        yesQ2.clear();
        noQ1.clear();
        noQ2.clear();
    }
}
```


```
public enum Question {
q1, q2
}
```


----------

