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-код на сервері прямо в ній.

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-кодом!