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