Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Servlet.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Servlet.java	(revision 14:d08769933940)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Servlet.java	(revision 24:dceaaefb1946)
@@ -58,5 +58,5 @@
             Ajax a = new Ajax();
 
-            Uzivatel uzivatel = new Uzivatel(request.getRequestedSessionId(), request.getRemoteHost());
+            Uzivatel uzivatel = new Uzivatel(request.getRequestedSessionId(), request.getRemoteAddr());
 
             switch (parametrAkce) {
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java	(revision 24:dceaaefb1946)
@@ -61,5 +61,6 @@
         String[] zahlavi = {"Kdy", "SQL příkaz"};
         t.setZahlavi(zahlavi);
-
+        /** TODO: lokalizace */
+        t.setZahlaviTip("TODO: Překlad");
 
         Connection db = getSpojeni(DATABAZE.APLIKACE);
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Hlaska.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Hlaska.java	(revision 12:1b10a6565e8c)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Hlaska.java	(revision 24:dceaaefb1946)
@@ -11,5 +11,5 @@
     private String text;
     private Typ typ;
-    private boolean escapovat;
+    private boolean escapovat = true;
 
     /**
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java	(revision 24:dceaaefb1946)
@@ -12,4 +12,5 @@
 
     private String[] zahlavi;
+    private String zahlaviTip;
     private Collection<Object[]> hodnoty = new ArrayList<Object[]>();
 
@@ -68,4 +69,12 @@
     }
 
+    public String getZahlaviTip() {
+        return zahlaviTip;
+    }
+
+    public void setZahlaviTip(String zahlaviTip) {
+        this.zahlaviTip = zahlaviTip;
+    }
+
     public Collection<Object[]> getHodnoty() {
         return hodnoty;
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Uzivatel.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Uzivatel.java	(revision 13:96e711f3ef48)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Uzivatel.java	(revision 24:dceaaefb1946)
@@ -13,4 +13,7 @@
         this.idSezeni = idSezeni;
         this.ipAdresa = ipAdresa;
+    }
+
+    public Uzivatel() {
     }
 
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/preklady_cs.properties
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/preklady_cs.properties	(revision 23:6bbbd371e813)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/preklady_cs.properties	(revision 24:dceaaefb1946)
@@ -19,5 +19,10 @@
 js.probihaHistorie=Na\u010D\u00EDt\u00E1 se historie\u2026
 
-licence.program=Program je vyd\u00E1n pod licenc\u00ED: 
+licence.program=Program je vyd\u00E1n pod licenc\u00ED:
 licence.agpl=GNU Affero GPL
-licence.zdrojaky=Zdrojov\u00E9 k\u00F3dy ke sta\u017Een\u00ED: 
+licence.zdrojaky=Zdrojov\u00E9 k\u00F3dy ke sta\u017Een\u00ED:
+
+vysledek.razeniTip=Chce\u0161 set\u0159\u00EDdit v\u00FDsledek podle n\u011Bjak\u00E9ho sloupce? Co takhle ORDER BY sloupec.
+historie.kdy=Kdy
+historie.prikaz=SQL p\u0159\u00EDkaz
+historie.zahlaviTip=Posledn\u00ED proveden\u00E9 SQL p\u0159\u00EDkazy.
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/web/Ajax.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/web/Ajax.java	(revision 24:dceaaefb1946)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/web/Ajax.java	(revision 24:dceaaefb1946)
@@ -0,0 +1,52 @@
+package cz.frantovo.sql.vyuka.web;
+
+import cz.frantovo.sql.vyuka.dao.HistorieDAO;
+import cz.frantovo.sql.vyuka.dao.PiskovisteDAO;
+import cz.frantovo.sql.vyuka.dto.Uzivatel;
+import cz.frantovo.sql.vyuka.dto.VysledekSQL;
+
+/**
+ * Webová beana, která poskytuje data Ajaxovému JSPčku.
+ * @author fiki
+ */
+public class Ajax {
+
+    private final Uzivatel uzivatel = new Uzivatel();
+    private String sqlPrikaz;
+
+    /**
+     * Nastaví informace o klientovi (uživateli).
+     * @param ipAdresa IP adresa, ze které přišel HTTP požadavek
+     * @param ipPresmerovano HTTP hlavička x-forwarded-for
+     * @param idSezeni javovská HTTP relace
+     */
+    public void setKlient(String ipAdresa, String ipPresmerovano, String idSezeni) {
+        if ("127.0.0.1".equals(ipAdresa) && ipPresmerovano != null) {
+            uzivatel.setIpAdresa(ipPresmerovano);
+        } else {
+            uzivatel.setIpAdresa(ipAdresa);
+        }
+        uzivatel.setIdSezeni(idSezeni);
+    }
+
+    public void setSqlPrikaz(String sqlPrikaz) {
+        this.sqlPrikaz = sqlPrikaz;
+    }
+
+    /**
+     * @return Historie SQL příkazů daného uživatele.
+     */
+    public VysledekSQL getHistorie() {
+        HistorieDAO h = new HistorieDAO();
+        return h.nactiHistorii(uzivatel);
+    }
+
+    /**
+     * Vykoná zadaný SQL příkaz v databázi.
+     * @return Výsledek dotazu – tabulka, hláška nebo chyba.
+     */
+    public VysledekSQL getSQLVysledek() {
+        PiskovisteDAO p = new PiskovisteDAO();
+        return p.vykonejSQL(sqlPrikaz, uzivatel);
+    }
+}
Index: java/sql-vyuka/web/ajax.jspx
===================================================================
--- java/sql-vyuka/web/ajax.jspx	(revision 24:dceaaefb1946)
+++ java/sql-vyuka/web/ajax.jspx	(revision 24:dceaaefb1946)
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
+          xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
+          xmlns:c="http://java.sun.com/jsp/jstl/core"
+          version="2.0">
+    <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>
+    <fmt:setBundle basename="cz.frantovo.sql.vyuka.preklady" scope="application"/>
+    <jsp:useBean id="ajax" class="cz.frantovo.sql.vyuka.web.Ajax" scope="request"/>
+
+    <jsp:scriptlet>
+        request.setCharacterEncoding("UTF-8");
+        ajax.setKlient(request.getRemoteAddr(), request.getHeader("x-forwarded-for"), request.getRequestedSessionId());
+    </jsp:scriptlet>
+
+    <c:choose>
+        <!-- Akce: Historie a vykonání SQL příkazu -->
+        <c:when test="${param.akce == 'historie' || param.akce == 'vykonat'}">
+            <c:choose>
+                <c:when test="${param.akce == 'historie'}">
+                    <c:set var="vysledek" value="${ajax.historie}" scope="request"/>
+                </c:when>
+                <c:when test="${param.akce == 'vykonat'}">
+                    <jsp:setProperty name="ajax" property="sqlPrikaz" value="${param.sql}"/>
+                    <c:set var="vysledek" value="${ajax.SQLVysledek}" scope="request"/>
+                </c:when>
+            </c:choose>
+
+            <!-- Tabulky -->
+            <c:forEach var="tabulka" items="${vysledek.tabulky}">
+                <table>
+                    <thead title="${tabulka.zahlaviTip}">
+                        <tr>
+                            <c:forEach var="zahlavi" items="${tabulka.zahlavi}">
+                                <td><c:out value="${zahlavi}"/></td>
+                            </c:forEach>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <c:forEach var="radek" items="${tabulka.hodnoty}">
+                            <tr>
+                                <c:forEach var="bunka" items="${radek}">
+                                    <td><c:out value="${bunka}" /></td>
+                                </c:forEach>
+                            </tr>
+                        </c:forEach>
+                    </tbody>
+                </table>
+            </c:forEach>
+
+            <!-- Hlášky -->
+            <c:forEach var="hlaska" items="${vysledek.hlasky}">
+                <p class="vysledek${hlaska.typ}">
+                    <c:out value="${hlaska.text}" escapeXml="${hlaska.escapovat}" />
+                </p>
+            </c:forEach>
+        </c:when>
+
+        <!-- Akce: Nápověda -->
+        <c:when test="${param.akce == 'napoveda'}">
+            <p>TODO: nápověda.</p>
+        </c:when>
+    </c:choose>
+</jsp:root>
Index: java/sql-vyuka/web/hlavni.js
===================================================================
--- java/sql-vyuka/web/hlavni.js	(revision 22:e56b79cc18a9)
+++ java/sql-vyuka/web/hlavni.js	(revision 24:dceaaefb1946)
@@ -55,5 +55,5 @@
     if (ajax.readyState == 4 || ajax.readyState == 0) {
         zobraz(document.lokalizace.probihaSQL.value, stavovePole);
-        ajax.open("POST", 'ajax?akce=vykonat&sql=' + encodeURIComponent(getSQL()), true);
+        ajax.open("POST", 'ajax.jspx?akce=vykonat&sql=' + encodeURIComponent(getSQL()), true);
         ajax.onreadystatechange = function() {
             if (ajax.readyState == 4) {
@@ -71,5 +71,5 @@
     if (ajax.readyState == 4 || ajax.readyState == 0) {
         zobraz(document.lokalizace.probihaHistorie.value, stavovePole);
-        ajax.open("POST", 'ajax?akce=historie', true);
+        ajax.open("POST", 'ajax.jspx?akce=historie', true);
         ajax.onreadystatechange = function() {
             if (ajax.readyState == 4) {
