)
[От редактора ROIM: по техническим ограничениям нашего издания угловые скобки (<) и (>), которыми выделяются теги, в тексте данной статьи заменены на знак "тильда" (~). Надеюсь, что для опытных читателей эти вынужденные замены не состявят большого неудобства. А.Бачин ]
Существует множество способов создать Web-приложение для работы с динамическими данными, но большинство разработчиков стали использовать JavaServer Pages (JSP), потому что эта технология проста, программы имеют линейную структуру (без циклов) и позволяет использовать возможности Java-платформы.
Технология JavaServer Pages специфицирована Sun Microsystems, как наиболее удобное средство для создания страниц с динамическим содержимым, которые являются результатом работы Web-приложения. JSP тесно связана c технологией Java Servlet. Это позволяет использовать фрагменты Java-кода и вызывать внутренние компоненты Java в HTML-коде (или в другом похожем коде, например, XML) на Web-странице. Все что может быть вставлено в HTML-страницу, можно разместить и на JSP-странице. Вы можете использовать JSP-код вместо JavaScript, Perl или active server pages (ASP). JavaServer Pages основаны на языке Java, поэтому они обеспечивают полный доступ объектно-ориентированным и машинно-независимым возможностям Java.
JSP-страницы перед выполнением транслируются в Java-сервлет (обычно это происходит по требованию, но иногда раньше), он выполняет HTTP-запрос и создает ответ как и многие другие сервлеты. Технология JSP позволяет намного более просто создать код сервлета. Кроме того, JSP-страницы полностью совместимы с сервлетами – JSP-страницы могут включать в себя выходные данные сервлета или передавать свои выходные данные в сервлет, и наоборот сервлеты могут использовать выходные данные JSP-страниц или передавать свои данные JSP-странице. Эти две технологии дополняют друг друга, обеспечивая привлекательную альтернативу другим типам динамического Web-программирования. Другие преимущества JSP и Java платформы:
- Разделение динамической бизнес-логики и размещения данных на странице
- Удобный синтаксис
- Отсутствие привязки к конкретной операционной системе
- Доступ к стандартным Java API
- Простота использования
~HTML~
~HEAD~~TITLE~The Welcome User JSP~/TITLE~~/HEAD~
~BODY~
~% String user=request.getParameter("user"); %~
~H3~Welcome ~%= (user==null) ?
"" : user %~!~/H3~
~P~~B~ Today is ~%= new java.util.Date() %~.
Have a nice day! :-)~/B~~/P~
~B~Enter name:~/B~
~FORM METHOD=get~
~INPUT TYPE="text" NAME="user" SIZE=15~
~INPUT TYPE="submit" VALUE="Submit name"~
~/FORM~
~/BODY~
~/HTML~
В этом примере фрагмент Java-кода берет имя пользователя из HTTP-запроса, выводит имя пользователя и текущую дату. Если ввести имя “Amy”, то получится следующий результат.
Welcome Amy!
Today is Wed Jun 21 13:42 PDT 2000. Have a nice day! :-)
Синтаксические конструкции JSP высоких уровней включают в себя:
- Директивы, которые передают информацию для страницы в целом
- Скриптовые элементы, элементы Java-кода, такие как декларации, выражения, скриплеты, и комментарии (синтаксис этих не сильно отличается друг от друга, например ~%=...%~ используется для выражений и ~%!...%~ для деклараций)
- Объекты и области их действия, где JSP объекты могут быть явно или неявно созданы и доступны в заданной области, например из JSP-страницы или из HTTP-сессии
- Действия, которые генерируют выходной объект или реакцию в качестве ответа JSP.
JSP против сервлетов. Комбинирование Java-кода и Java-вызовов в HTML-странице более удобно, чем использлвание только Java-кода в сервлете. Технология JSP предоставляет более простой путь создания динамических Web-страниц, при этом обычно требующий значительно меньше кода, чем в случае использования Java-сервлетов. Ниже приведен пример кода сервлета эквивалентного вышеупомянутому примеру JSP-страницы:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Hello extends HttpServlet
{
public void doGet(HttpServletRequest rq,
HttpServletResponse rsp)
{
rsp.setContentType("text/html");
try {
PrintWriter out = rsp.getWriter();
out.println("~HTML~");
out.println("~HEAD~~TITLE~Welcome~/TITLE~~/HEAD~");
out.println("~BODY~");
out.println("~H3~Welcome " +
((user==null) ? "" : user) + "!~/H3~" );
out.println("~H3~Welcome!~/H3~");
out.println("~P~Today is "
+new java.util.Date()+".~/P~");
out.println("Have a nice day! :-)~/B~~/P~");
out.println("~B~Enter name:~/B~");
out.println("~FORM METHOD=get~");
out.println("~INPUT TYPE=\"text\
" NAME=\"user\" SIZE=15~");
out.println("~INPUT TYPE=\"submit\
" VALUE=\"Submit name\"~
out.println("~/FORM~");
out.println("~/BODY~");
out.println("~/HTML~");
} catch (IOException ioe)
{
// (error processing)
}
}
}
Синтаксис JSP более прост – и что очень важно он позволяет обойти непроизводительные затраты Java, такие как импорт пакетов и конструкции вида try…catch. JSP-транслятор также автоматически обрабатывает значительную часть кода сервлета, перекрывая в Java-файле его выводные данные, например, непосредственное (directly) или косвенное (indirectly) включение стандартного интерфейса javax.servlet.jsp.HttpJspPage или добавление кода для запроса HTTP сессии.
Также нужно отметить, что так как HTML- и XML-текст отображается не средствами Java, в отличие от блоков сервлета, вы можете использовать средства создания HTML и XML для создания JSP-страниц.
Разделение бизнес-логики и представления страницы
Одной из наибольших выгод технологии JSP является то, что она позволяет разделять усилия разработчиков между HTML-кодом, который определяет представление статической страницы, и Java-кодом, который выполняет бизнес-логику и создание динамического содержимого. На много более просто разделять ответственность за между специалистами по размещению и представлению информации, которые более искусны в HTML, чем в Java, и программистами, которые лучше разбираются в Java, чем в HTML.
В JSP-страницах, большая часть Java-кода и бизнес-логика располагается не в коде страницы. Скорее вы найдете его в JavaBeans или Enterprise JavaBeans, которые вызываются на странице. Спецификация JSP предлагает следующий синтаксис для создания экземпляра класса JavaBeans:
~jsp:useBean id="pageBean" class="mybeans.NameBean"
scope="page" /~
Это пример создает экземпляр, pageBean, класса mybeans.NameBean. Область видимости (доступность) pageBean может быть следующей: страница, запрос, сессия или приложение. Далее на в коде страницы вы можете использовать это экземпляр:
Hello ~%= pageBean.getNewName() %~ !
Это экземпляр напечатает "Hello Julie !", например, если имя "Julie" атрибут newName в pageBean.
Java-разработчик владеет и управляет кодом NameBean класса. Специалист по HTML отвечает за представление и размещение данных на Web-странице, которую видит пользователь, и кроме того он следит за кодом в jsp-файле.