Статьи

EE JSP: обратная оболочка сервлета


Генерирование HTML из сервлетов целесообразно только в том случае, если у вас небольшое количество страниц или вам необходим точный контроль над генерируемым контентом (двоичный PDF и т. Д.).
Для большинства приложений вывод будет HTML, и нам нужен лучший способ сделать это; и вот тут и появляется JSP (Java Server Pages).

С JSP вы пишете и сосредотачиваетесь на содержании HTML в файле; тогда, только когда вам нужна динамическая логика или логика условий между контентом, вы вставляете код Java, который называется Scriptlet. Когда сервер приложений обрабатывает страницу JSP, он автоматически генерирует класс Servlet, который выписывает содержимое этих файлов JSP (как вы программируете, программируя его с помощью PrintWriter, как показано в моих предыдущих публикациях). Где бы у вас ни был Scriptlet в JSP, он будет встроен в сгенерированный класс Servlet. Все сгенерированные классы JSP-сервлетов автоматически управляются, компилируются и развертываются сервером приложений в вашем приложении. Короче говоря, JSP — не более чем обратная оболочка сервлета.

Вот простой пример JSP, который печатает Hello World и отметку времени сервера.

<!DOCTYPE html>
<html>
  <body>
  <p>Hello World!</p>
  <p>Page served on <%= new java.util.Date()%></p>
  </body>
</html>

Просто сохраните его как текстовый файл с именем hello.jsp в вашей папке на основе src / main / webapp maven, и он будет работать в вашей среде IDE NetBeans. Для JSP вам не нужно настраивать сопоставление URL-адресов, как в Serlvet, и он напрямую доступен из вашего контекстного пути. Например, выше должно отображаться в вашем браузере по
адресу http: // localhost: 8080 / hello.jsp URL.

Обратите внимание, что в примере также показано, как можно встраивать код Java. Вы можете поместить метод или объект в скриптлет <% =%>, и он будет использовать выходные данные метода toString () полученного объекта для конкатенации с HTML вне тега скриптлета. Вы также можете определить новые методы, используя <%! %> тег скриптлета или выполните любой код, который не генерирует вывод, используя <%%> скриптлет. Обратите внимание, что вы можете добавлять комментарии в JSP между <% — -%>
а скриптлет тоже.

JSP также позволяет вам вставлять «Директивы страницы» для управления тем, как контейнер JSP отображает результат. Например, вы можете изменить тип содержимого результата, вставив его в верхней части страницы.

<%@ page contentType="text/txt" %>

Другая часто используемая директива страницы — это импорт пакета Java, поэтому вам не нужно добавлять префикс в каждой строке инструкции Java.

<%@ page import="java.util.*" %>
...
<p>Page served on <%= new Date()%></p>

Есть много других директив, которые вы можете использовать. Ознакомьтесь со спецификацией JSP для получения более подробной информации.

Помимо вставки вашего собственного кода Java, JSP также предопределил некоторые переменные, к которым вы можете обращаться напрямую, не объявляя их. Вот пример, который отображает большинство этих встроенных неявных переменных.

<!DOCTYPE html>
<html>
  <body>
  <h1>JSP Examples</h1>
  <p>Implicit Variables</p>
  <table>
  <tr>
  <td>Name</td><td>Instance</td><td>Example</td>
  </tr>
  <tr>
  <td>applicationScope</td><td>${applicationScope}</td><td>${applicationScope['myAppName']}</td>
  </tr>
  <tr>
  <td>sessionSope</td><td>${sessionSope}</td><td>${sessionSope['loginSession']}</td>
  </tr>
  <tr>
  <td>pageScope</td><td>${pageScope}</td><td>${pageScope['javax.servlet.jsp.jspConfig']}</td>
  </tr>
  <tr>
  <td>requestScope</td><td>${requestScope}</td><td>${requestScope['foo']}</td>
  </tr>
  <tr>
  <td>param</td><td>${param}</td><td>${param['query']}</td>
  </tr>
  <tr>
  <td>header</td><td>${header}</td><td>${header['user-agent']}</td>
  </tr>
  <tr>
  <td>cookie</td><td>${cookie}</td><td>${cookie['JSESSIONID']}</td>
  </tr>
  <tr>
  <td>pageContext</td><td>${pageContext}</td><td>${pageContext.request.contextPath}</td>
  </tr>
  </table>
  <p>Page served on <%= new java.util.Date()%></p>
  </body>
</html>

В приведенном выше примере я обращался к неявным переменным, используя синтаксис языка выражений JSP (EL), а не скриптлет <% =%>. EL более компактен и легче для чтения, однако он может только читать переменную, существующую в любой области запроса, сеанса или приложения. EL использует нотацию DOT для доступа к полям или даже к вложенным полям из переменной объекта; при условии, что поля имеют соответствующие методы получения, то есть. EL также может получить доступ к карте в формате «myMap [key]» или к списку с синтаксисом «myList [index]». Доступ к большинству этих неявных переменных можно получить как объект Map, и они предоставляются в основном из объекта ServletHttpRequest по запросу, как и из вашего собственного класса Servlet.

JSP можно рассматривать как язык шаблонов в веб-приложении. Это помогает сгенерировать часть приложения VIEW. Это позволяет вам или вашей авторской команде в вашей команде сосредоточиться на HTML и взглянуть на содержание. Это может помочь в создании более крупного веб-приложения. Будьте осторожны с использованием чрезмерного и сложного логического Java-кода внутри ваших файлов JSP, так как это затруднит отладку и чтение; особенно если у вас есть оператор Java, который выдает исключение. Номер строки из трассировки стека будет сложнее отследить и сопоставить с вашим кодом Scriptlet. Также представьте, что если вы начинаете иметь JavaScript-код внутри JSP-файлов, то он может стать очень грязным. Лучше хранить их в отдельных файлах. Если вам необходимо встроить Java-код в JSP, попробуйте заключить его в одну строку вызова Java-вызова. Еще лучше,попытайтесь обработать запрос, используя код сервлета, и сгенерируйте все данные, которые необходимо отобразить в JSP, вставив их в пространство области запроса, а затем перенаправьте в файл JSP для рендеринга. С помощью этого шаблона вы можете фактически ограничить использование скриптлета в JSP и использовать только теги EL и JSP.

Вы можете найти код выше в моем 
jsp-примере  в GitHub.