JEE und AJAX

Exemplarischer Ablauf für die Verwendung von AJAX in JEE:

Servlet.java definiert die zulässigen Aktionen. Beim Auftreten einer Aktion im Servlet, wird die entsprechende ActionClass.java aufgerufen. Die ActionClass.java leitet dann über einen RequestDispatcher an die ajax.jsp weiter und definiert über Request Attributes (request.setAttribute(…)) die jeweiligen Template-Tags, die daraufhin in der ajax.jsp mit der Expression Language (@{…}) angezeigt werden können. Beim Aktivieren eines Links, der auf einen JavaScript-Befehl verweist, in der ajax.jsp, wird ein Request an das AjaxServlet.java gesendet. Das AjaxServlet.java generiert daraufhin aus den erhaltenen Daten einen neuen Output, der dann aktualisiert in der ajax.jsp dargestellt wird.

An dieser Stelle folgt ein Quelltext-Beispiel für ein AjaxServlet.java und eine ajax.jsp. Die ajax.jsp arbeitet mit MooTools 1.2.1 (mootools-1.2.1-core.js), welches als JavaScript eingebunden werden muss.

Quellcode:

ajax.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Title</title>
    <script type="text/javascript" src="mootools-1.2.1-core.js"></script>
    <script type="text/javascript">
    function getSongs(moovar)
    {
        var songRequest = new Request.HTML(
            {
                url: "ajaxservlet",
                update: $('targetBox')
            }).get({'variable': moovar});
    }
    </script>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
    <body>
        <a href="#" onclick="getSongs('BAM!!!')">Shoot!</a>
        <div id="targetBox">Target</div>
    </body>
</html>

AjaxServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package controller.web;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet(name="AjaxServlet", urlPatterns={"/ajaxservlet"})
public class AjaxServlet extends HttpServlet
{
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try
        {
            out.println(request.getParameter("variable"));
        }
        finally
        {
            out.close();
        }
    }
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        processRequest(request, response);
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        processRequest(request, response);
    }
 
    @Override
    public String getServletInfo()
    {
        return "Short description";
    }
}

Java Server Pages – Beispiel

Es folgt ein Beispiel zur Erstellung einer Java Server Page (kurz JSP).

Die Java Server Page wird durch ein Servlet (im Beispiel NewServlet.java) aufgerufen. Daher muss im Webbrowser auch die Adresse des Servlets eingegeben werden. Als Parameter wird dabei das gewünschte Command mit einer dazugehörigen Action ausgeführt.

Im Beispielaufruf heißt das Command „cmd“ und die Action „actionman“:
http://localhost:8080/Projekt/servlet?do=actionman

Quellcode:

Projektname > „Source Packages“ > controller.web > NewServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package controller.web;
 
import java.util.HashMap;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
 
@WebServlet(name="NewServlet", urlPatterns={"/servlet"})
public class NewServlet extends HttpServletControllerBase
{
    public void init(ServletConfig conf) throws ServletException
    {
        HttpRequestActionBase action = null;
        actions = new HashMap();
 
        // Action: Möglicher Wert (Value) für einen Steuerbefehl (Command)
        action = new MyAction();
        actions.put("actionman", action);
 
        // Weitere "action" erstellen und "actions" hinzufügen...
    }
 
    protected String getOperation(HttpServletRequest req)
    {
        // Command: Steuerbefehl
        return req.getParameter("do");
    }
}

Projektname > „Source Packages“ > controller.web > MyAction.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package controller.web;
 
import java.io.IOException;
import javax.servlet.RequestDispatcher;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class MyAction extends HttpRequestActionBase
{
    public void perform(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException
    {
        try
        {
            String strTemp = "Willkommen auf der JSP-Seite.";
            req.setAttribute("willkommen", strTemp);
            RequestDispatcher reqDisp = req.getRequestDispatcher("showaction.jsp");
            reqDisp.forward(req, resp);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Projektname > „Web Pages“ > showaction.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
 
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <!-- Variante 1 -->
        <h1><%=request.getAttribute("willkommen")%></h1>
        <!-- Variante 2 -->
        <h1>${hallo}</h1>
    </body>
</html>

Benötigte Ressourcen:
Projektname > „Source Packages“ > controller.web > HttpServletControllerBase.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package controller.web;
 
import java.io.IOException;
import java.util.HashMap;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public abstract class HttpServletControllerBase extends HttpServlet
{
	protected HashMap actions;
 
	public void init(ServletConfig conf) throws ServletException
        {
            HttpRequestActionBase action = null;
            actions = new HashMap();
	}
 
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException
        {
	    String op = getOperation(req);
	    HttpRequestActionBase action = (HttpRequestActionBase)actions.get(op);
	    action.perform(req, resp);
	}
 
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException
        {
 
	    // Zunaechst wird die URL analysiert,
            // um die Operation, die ausgefueht werden soll zu bestimmen
	    String op = getOperation(req);
	    // dann wird die entsprechende Aktion aus der Map geholt ...
	    HttpRequestActionBase action = (HttpRequestActionBase)actions.get(op);
	    // ... und angestossen
	    action.perform(req, resp);
	}
 
	/** Methode muss noch definiert werden, um die Kennung der
	  * Operation aus der URL zu lesen
	  * @param req Http-Request
	  * @return Name der Aktion, die ausgefuehrt werden soll
	  */
	protected abstract String getOperation(HttpServletRequest req);
}

Projektname > „Source Packages“ > controller.web > HttpRequestActionBase.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package controller.web;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public abstract class HttpRequestActionBase
{
    public abstract void perform(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException;
 
    protected void forward(HttpServletRequest req, HttpServletResponse resp, String forwardName)
    throws ServletException, IOException
    {
        RequestDispatcher reqDis = req.getRequestDispatcher(forwardName);
        reqDis.forward(req, resp);
    }
}

Java Enterprise Edition 6 – Servlet

Ein einfaches Code-Beispiel für ein Java Servlet nach JEE6-Konventionen. Voll kompatibel mit GlassFish v3.

Beispiel:
Ausführen mit: http://localhost:8080/Projektname/servletpower?power=1&name=Benny

controller.web.PowerServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package controller.web;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet(name="Power Servlet", urlPatterns={"/servletpower"})
public class PowerServlet extends HttpServlet
{
    // Die Request-Methode realisiert die Ausgabe an den Client (Web-Browser)
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        response.setContentType("text/html");
        Enumeration parameters = request.getParameterNames();
        String strParameter;
        String strValue;
 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>PowerServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>PowerServlet</h1>");
        out.println("Homepage: <a href=\"http://localhost" + request.getContextPath() + ">Weblink</a><br/>");
        if(parameters.hasMoreElements() == false)
        {
            out.println("Keine Parameter &uuml;bergeben.");
        }
        else
        {
            while(parameters.hasMoreElements())
            {
                strParameter    = parameters.nextElement().toString();
                strValue        = request.getParameter(strParameter);
                out.print(strParameter+": ");
                out.print(strValue);
                out.print("<br/>");
            }
        }
        out.println("</body>");
        out.println("</html>");
    }
 
    @Override
    // Die Methode doGet wird automatisch bei Eingabe
    // der Webseite in der Adresszeile des Browsers aufgerufen
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        processRequest(request, response);
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        processRequest(request, response);
    }
 
    @Override
    public String getServletInfo()
    {
        return "Kurze Beschreibung";
    }
}