1.1 Знакомство с JSP

Есть два популярных способа написания сервлета: императивный и декларативный. С первым мы уже разобрались — это, собственно, Servlet. Второй называется JSP (Java Server Pages), с ним мы сейчас и познакомимся.

Пример JSP сервлета:

<html>
    <body>
        <% out.print(2*5); %>
    </body>
 </html>

Не очень-то похоже на привычный нам классический Servlet, не правда ли? Так и есть. JSP – это HTML-страница со вставками Java-кода (выделено зеленым).

Видишь ли, если в сервлете у тебя много Java-кода и мало HTML-кода, тогда тебе удобнее применять классический сервлет. А что делать, если тебе нужна большая HTML-страница, в которой всего пара строк меняется сервером?

В этом случаем проще всего было бы создать эту HTML-страницу и каким-то образом выполнить Java-код на сервере прямо в ней.

1.2 Компиляция JSP

Давай рассмотрим еще один пример:

<html>
  <body>
    <%
        double num = Math.random();
        if (num > 0.95) {
     %>
         <h2>Ты счастливчик, user!</h2><p>(<%= num %>)</p>
    <%
        }
    %>
  </body>
</html>

Мы получаем случайное число, и если оно больше 0.95, то выводим текст "Ты счастливчик, user!"

Синим цветом тут выделен Java-код. Обычным (не выделен) – HTML-код, а красным — служебные теги, которые помогают понять, где Java-код, а где HTML.

Замечаешь некую странность? Закрывающая фигурная скобка "}" находится в другом "блоке кода". Как правильно писать такой код? Как это вообще работает?

Ответ будет супер простым :)

Веб-сервер после того, как найдет у себя JSP-файл, скомпилирует его в классический сервлет. На основе приведенной выше JSP-страницы будет сгенерирован такой Servlet:

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)  throws Exception {
    PrintWriter out = response.getWriter();
    out.print("<html> ");
    out.print("<body>");
        double num = Math.random();
        if (num > 0.95) {
            out.print("<h2>Ты счастливчик, user! </h2><p>(" + num + ")</p>");
        }
    out.print("</body>");
    out.print("</html>");
    }
}

Веб-контейнер просто сгенерировал код сервлета, где HTML превратился в текст, а вставки Java-кода стали обычным Java-кодом!