![]() |
|
||
|
|
|
Технология JSP -- друг или враг?(Brett McLaughlin) Критический взгляд на JavaServer Pages как на жизнеспособную презентационную технологию и заключение редактора колонки Brett McLaughlin Автор - опытный разработчик java и приверженец технологии Enhydra, убеждает разработчиков рассматривать альтернативы JavaServer Pages (JSP) servlets при выборе средства разработки веб приложений. Технология JSP это часть платформы J2EE компании Sun призвана решить проблему визуального отображения данных. Реально, JSP не совсем отвечает всем чаяниям разработчиков. На данный момент существует несколько различных подходов к решению проблемы презентации данных и вы можете выбирать. Эта статья проводит анализ программирования на JSP и рассматривает возможные альтернативы. Технологии презентации данных призваны трансформировать простые данные в привлекательный для использования вид. Технология JavaServer Pages (JSP) компании Sun является частью платформы J2EE и ей сейчас уделяется огромное внимание. Эта технология имеет свои достоинства и недостатки, поэтому разработчикам очень важно их знать и осознавать, что они не ограничены только этой одной технологией. На данный момент доступно множество презентационных технологий. В этой статье в начале рассматриваются проблемы, которые призваны решить презентационные технологии, а затем исследуются сильные и слабые стороны технологии JSP. И в конце приводятся некоторые альтернативы этой технологии. Немного истории Предпосылка Но, использования Internet технологий и всех тех языков программирования которые мы имеем, таких как Java, C, Perl, Pascal, Ada и т.д. не облегчает нашу задачу. Масса различных проблем возникает, когда возникает необходимость сгенерировать необходимый язык разметки для клиента. С увеличением возможностей браузеров (например DHTML и Javascript), увеличением количества и качества используемой графики и средств, позволяющих создавать интерфейс пользователя используя стандартный HTML требования к таким интерфейсам возрастают быстрее чем наша способность их разрабатывать. И это заставляет нас обратить внимание на презентационные технологии Презентационные технологии были созданы для простой задачи: конвертации контента, одних и тех же данных, в уровень презентации т.е. в различные пользовательские интерфейсы, такие как ваш телефон, PalmPilot или веб браузер. Какие же проблемы призваны решать эти презентационные технологии? Давайте посмотрим. Сегрегация и интеграция Посмотрите на примеры в листинге 1 и листинге 2 чтобы понять разницу между просто данными и контента созданного презентационной технологией. Листинг 1 показывает только данные, которые могут использоваться различными путями. Листинг 1. Просто данные Russell Crowe Tom Hanks Meg Ryan Mary Stuart Masterson Alec Baldwin Ashley Judd Keanu Reeves Листинг 2, показывает эти же данные, но обработанные презентационной технологией и готовые к просмотру в HTML браузере. Листинг 2. Представление данных
<HTML>
<HEAD>
<TITLE>Search Results: Actors</TITLE>
</HEAD>
<BODY>
<H2 ALIGN="center">Search Results: Actors</H2>
<CENTER>
<HR WIDTH="85%">
<TABLE WIDTH="50%" CELLPADDING="3" CELLSPACING="3" BORDER="1"
BGCOLOR="#FFFFCC">
<TR BGCOLOR="#FFCCCC">
<TH WIDTH="50%" ALIGN="center">Last Name</TH>
<TH WIDTH="50%" ALIGN="center">First Name</TH>
</TR>
<TR>
<TD WIDTH="50%">Baldwin</TD>
<TD WIDTH="50%">Alec</TD>
</TR>
<TR>
<TD WIDTH="50%">Crowe</TD>
<TD WIDTH="50%">Russell</TD>
</TR>
<TR>
<TD WIDTH="50%">Hanks</TD>
<TD WIDTH="50%">Tom</TD>
</TR>
<TR>
<TD WIDTH="50%">Judd</TD>
<TD WIDTH="50%">Ashley</TD>
</TR>
<TR>
<TD WIDTH="50%">Masterson</TD>
<TD WIDTH="50%">Mary Stuart</TD>
</TR>
<TR>
<TD WIDTH="50%">Reeves</TD>
<TD WIDTH="50%">Keanu</TD>
</TR>
<TR>
<TD WIDTH="50%">Ryan</TD>
<TD WIDTH="50%">Meg</TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>
В то время как, данные в Листинге 1 просты и понятны для любого, контент в Листинге 2 очень специфичен и предназначен пря просмотра в браузере. Трудно отделить только данные и использовать их в других целях. Это очень большая разница, процесс отделения (сегрегация) контента от презентации вместо объединения (интеграции) обоих (по крайней мере пока пользователю нужна эта информация) это основное достоинство презентационных технологий, включая и технологию JSP. Более того, любая презентационная технология, которая не отвечает этому требованию не оправдывает свое назначение. Дело и переделывание В простейщем случае, художник предоставляет графическую раскладку, а разработчик свой код и вводит эту раскладку в презентационную технологию. Приложение стартует, и контент, словно по мановенью волшебной палочки, превращается в пользовательский интерфейс. Конечно, как нам всем известно, разработка на этом не кончается, возникает необходимость в следующих версиях кода, изменения пользовательского интерфейса, изменения бизнес процессов и т.д. Именно здесь мы можем проверить надежность этой презентационной технологии. Довольно просто можно изменить контент, но достаточно сложно изменить работу художника. А изменения в презентационном уровне достаточно часты (все мы жертвы отделов маркетинга, которые заставляют нас менять то одно, то другое). Итак, возникает проблема: что дизайнеры должны изменить, чтобы сделать свою работу? Тот графический расклад, что они отдали разработчику? Наверное нет, так как эта страница наверняка уже имеет custom tags или встроенный код (JSP страницы, template engines), преобразованные в Java сервлеты или вообще в нечто неузнаваемое. Часто дизайнеру приходится переделывать страницу и отправлять ее разработчику, затем разработчик вынужден опять преобразовывать ее в специфичный формат для работы презентационной технологии. Как альтернатива, дизайнер может выучить скриптовый язык или хотя бы знать какие части страницы изменены разработчиком. Конечно этот путь не застрахован от ошибок и опасен. Как только вы определили, что презентационная технология позволяет разделить данные и представление, вы должны попытаться убедиться, что необходимо минимальное количество работы чтобы сделать презентационные изменения. Обещания технологии JSP Данные и представление Технология JSP решает эту проблему путем возможности конвертации обычных HTML страниц
(а затем и WML или других языков разметки) в java сервлет, избавляя от необходимости
иметь дело В JSP странице отрывок кода HTML, показанный на Листинге 2 может выглядеть как показано на Листинге 3. Листинг 3. JSP страница состаящая из данных и презентационной технологии
<%@ page import="com.ibm.display.PageUtils" %>
<%@ page import="com.ibm.display.PageInfo" %>
<%
PageInfo pageInfo = (PageInfo)session.getAttribute("PAGE_DATA")
%>
<HTML>
<HEAD>
<TITLE>
<%=pageInfo.getTitle()%>
</TITLE>
</HEAD>
<BODY>
<!-- Other HTML content -->
</BODY>
</HTML>
Судя по этому, JSP (по крайней мере в его начальном дизайне) удовлетворяет главному принципу презентационных технологий: что данные должны быть отделены от презентации. Код и раскладка Как пример кода Java добавленного к разметке, можно привести часть JSP в Листинге 4, которая динамически добавляет строки из Vectora актеров. Листинг 4. Код Java вставленный в язык разметки страницы.
<%@ page import="com.ibm.display.PageUtils" %>
<%@ page import="com.ibm.display.PageInfo" %>
<%@ page import="com.ibm.people.Actor" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.util.Vector" %>
<%
PageInfo pageInfo = (PageInfo)session.getAttribute("PAGE_DATA")
Vector actors = pageInfo.getActors()
%>
<HTML>
<HEAD>
<TITLE>
<%=pageInfo.getTitle()%>
</TITLE>
</HEAD>
<BODY>
<H2 ALIGN="center">Search Results: Actors</H2>
<CENTER>
<HR WIDTH="85%">
<TABLE WIDTH="50%" CELLPADDING="3" CELLSPACING="3" BORDER="1"
BGCOLOR="#FFFFCC">
<%
for (Iterator i = actors.iterator(); i.hasNext()) {
Actor actor = (Actor)i.next();
%>
<TR BGCOLOR="#FFCCCC">
<TH WIDTH="50%" ALIGN="center">
<%=actor.getLastName()%>
</TH>
<TH WIDTH="50%" ALIGN="center">
<%=actor.getFirstName()%>
</TH>
</TR>
<%
}
%>
</TABLE>
</CENTER>
</BODY>
</HTML>
Помните, что пока я просто описываю начальные цели JSP технологии. Я отложу мое собственное суждение о целях до более позднего раздела о проблемах в JSP. Вы возможно уже заподозрили, что вставка кода в JSP может вызвать конфликт с первой целью технологии JSP - отделением данных от презентации. Дизайнер и разработчик Проблемы Вы должны понимать, что несмотря на то, что API поставляется в составе J2EE платформы, никто не заставляет вас его использовать. Звучит глупо, но некоторые разработчики пытаются использовать JSP или EJB или JMS API, только потому, что считают, что их приложение не будет настоящим "J2EE applications" если их не использовать. Дело в том, что платформа поставляется с большим количеством API, чем реально необходимо определенному приложению. Если вы имеете проблемы с технологией JSP, вы не обязаны ее использовать! Посмотрите на все достоинства и недостатки перед тем, как решить использовать JSP в своем приложении. Давайте посмотрим на некоторые из этих недостатков. Переносимость и использование одного языка Однако, использование JSP ограничивает вас использованием только языка Java, по крайней мере для презентации и контента. Тогда как, CORBA может быть использована для бизнес логики, использование JSP требует знакомство с сервлетами и основами языка Java. Так как большинство разработчиков приходят в разработку JSP с помошью J2EE, это не является большой проблемой. Контент и презентация Размывание линии между контентом и презентацией Листинг 5. JSP страница, содержащая бизнес логику.
<%@ page import="com.ibm.display.PageUtils" %>
<%@ page import="com.ibm.display.PageInfo" %>
<%@ page import="com.ibm.logic.AdminUtils" %>
<%@ page import="com.ibm.people.Actor" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.util.Vector" %>
<%
PageInfo pageInfo = (PageInfo)session.getAttribute("PAGE_DATA")
%>
<HTML>
<HEAD>
<TITLE>
<%=pageInfo.getTitle()%>
</TITLE>
</HEAD>
<BODY>
<H2 ALIGN="center">Search Results: Actors</H2>
<CENTER>
<HR WIDTH="85%">
<TABLE WIDTH="50%" CELLPADDING="3" CELLSPACING="3" BORDER="1"
BGCOLOR="#FFFFCC">
<%
// Based on user's permissions,
//perform search differently (business logic!)
Vector actors = pageInfo.getActors()
if (pageInfo.getUserInfo().hasPermission("ADMINISTRATOR")) {
actors = AdminUtils.getActors(pageInfo.getSearchCriteria());
} else {
actors = pageInfo.getActors();
}
for (Iterator i = actors.iterator(); i.hasNext()) {
Actor actor = (Actor)i.next();
%>
<TR BGCOLOR="#FFCCCC">
<TH WIDTH="50%" ALIGN="center">
<%=actor.getLastName()%>
</TH>
<TH WIDTH="50%" ALIGN="center">
<%=actor.getFirstName()%>
</TH>
</TR>
<%
}
%>
</TABLE>
</CENTER>
</BODY>
</HTML>
Приверженцы JSP быстро ответят на это, что JSP tag libraries могут решить эту
проблему. Tag libraries позволяют добавлять custom tags (например, Использование custom tag и соответствующей tag library позволяет нашему примеру конвертироваться в код приведенный в Листинге 6. Листинг 6. Custom tag и tag library встроенные в страницу.
<CENTER>
<TABLE WIDTH="50%" CELLPADDING="3" CELLSPACING="3" BORDER="1"
BGCOLOR="#FFFFCC">
<ACTORS />
</TABLE>
</CENTER>
Во время выполнения, код соответствующий этому тагу будет выполнен и корректные результаты будут вставлены в страницу. Но это не решает всей проблемы. Аргумент против технологии JSP не в том, что данные и презентация могут быть разделены, а в том, что они должны быть разделены. До тех пор пока JSP позволяют вставлять код, очень удобно (особенно когда совсем не хватает времени на разработку) делать последние изменения в самом коде JSP, чем транcформировать этот код в tag library. Если это вас не задевает, подумайте почему язык Java стал таким популярным, несмотря на C и С++: в Java запрещены многие возможности, которые вызывали наибольшие проблемы в С, такие как сложение указателей. Вы конечно скажете, что вы не использовали сложение указателей в C или, что ни один хороший программист никогда не будет вставлять код в JSP, но мы ведь реально знаем, как все происходит на практике. Язык Java лучший потому, что он гарантирует, что такие проблемы никогда не возникнут. Но JSP с этой точки зрения похожа на С, который позволяет вести некачественную разработку. Дополнительный тест технологии JSP в достижении ее целей, это посмотреть действительно ли возможно достижение этих целей на практике; хотя несправедливо утверждать, что в JSP это совершенно недостижимо. Большинство template engine, таких как FreeMarker и WebMacro, имеют сходную возможность, обычно с аналогичным Perl языку. Но такие технологии как Enhydra XMLC не позволяют такого. Вместо этого, эти технологии получают на вход только язык разметки страниц и генерируют необходимые Java методы. Это полностью меняет программу: вместо того, чтобы страница (технология JSP) вызывала методы бизнес логики приложения, само приложение (Enhydra) использует методы, чтобы влиять на отображение страницы. В случае с Enhydra, XMLC конвертирует страницу в DOM дерево и использует свойства DOM HTML для изменения значений "полей". (Для более подробной информации о Enhydra XMLC, смотрите Ресурсы.) Дело в том, что технология JSP может соответствовать необходимым требованиям, более даже чем XMLC, но только при условии использования tag libraries. Но основная тенденция спецификации Sun такова, чтобы обеспечить обратную совместимость или по крайней мере поддерживать ее в течении длительного времени. Текущая версия спецификации JSP 1.1 позволяет встраивать код, поэтому стоит ожидать использование этой возможности течении определенного времени. Перед тем, как заняться программированием JSP обратите внимание на ту большую разницу, между идеалом, полным отделением данных от презентации, и тем, как это обеспечить. Это будет наилучшим разделением между вашим пользовательским интерфейсом и тем кодом, который исполняется в вашем приложении. Однозадачность и многозадачность Вы не убеждены что это важно? Тогда попробуйте скачать J2EE Reference Implementation и загрузите одну из включенных туда JSP в WYSIWYG HTML редактор, такой как Dreamweaver. Страница заполняется массой желтых отметок, сигнализирующих о "неправильном" теге в разметке страницы. Хотя конечно, желтый цвет в JSP тагах и коде гораздо лучше, чем действительная ошибка в странице. На сегодняшний день не существует WYSIWYG редакторов поддерживающих JSP и я не слышал о попытках создания каковых. В то время как template engine имеют такие же проблемы, многие продукты основанные на Java, такие как моя любимая Enhydra позволяют вам предоставлять разметку страницы на вход презентационной технологии. В этом случае дизайнер может делать изменения так часто как ему хочется и передавать разметку странице на вход презентационной технологии, которая конвертирует ее в необходимый формат, при этом не нужно будет делать никаких изменений в коде (обычно). Результат на лицо, дизайнер займется дизайном, а разработчик разработкой. Поэтому надо относиться с осторожностью к обещаниям технологии JSP сравнивая их с реальностью. На практике, для работы с JSP разработчики должны иметь дело с большим количеством кода разметки или дизайнеры должны иметь представление о программировании JSP. HTML и XML "И что толку?" вы спросите. Толк в том, что XML становится глобальным стандартом для коммуникации интер и интра приложений. Работа с данными в формате XML позволяет любому другому приложению, которое имеет средства работы с XML, эффективно использовать данные вашего приложения. Представьте себе возможность взаимодействовать с процессингом кретитных карточек для работы e-commerce просто путем конвертации ваших данных в формат XML! Очень часто, вам необходимо обмениваться данными с другими компаниями. Распространенный случай это портал, который получает данные из многих источников (например погоду, котировки акций, новости). Между тем, JSP страницы с их смешанным кодом и custom tag libraries не могут успешно функционировать в этой обстановке. Редко JSP страницы это well-formed XML документ, даже не смотря на соответствие XHTML, языку разметки который не поддерживает различные JSP custom tag. Но еще более важно, то, что встроенный java код не является разметкой и он будет вызывать ошибки при попытки разбора другим приложением. Давайте посмотрим на еще одну сторону JSP. Так как клиент должен получать данные от приложения, они должны быть стандартным HTML (или WML, VoXML и т.д.) Но многие приложения, которые получают эти данные используют определенные формы кеширования, так как сетевые запросы достаточно дороги. В этом случае скешированная страница возвращает не совсем свежие данные. Хотя вероятно вы бы предпочли получать данные в XML, особенно статические. И в этом случае JSP не может помочь; JSP страница должна быть выполнена, для избавления от встроенного кода и tag libraries. Давайте проверим: может ли какая-либо другая презентационная технология сделать это? Ответ - да. Признанный лидер в этой области это проект Apache Cocoon, который основывается на XML и применении XSLT стилей (которые могут быть применены и динамически и статически). Потому что XML Server Pages (называемые XSP в проекте Cocoon) являются XML документами, они всегда XML совместимы. Другие технологии, такие как Tea и Enhydra XMLC, которые позволяют получать на вход язык разметки страниц тоже позволяют это, хотя и не требуют. В их случае пользователь может использовать XTHML или HTML. Но это лучше чем JSP, где well-formed XML не может быть выполнен статически. Заключение Наконец, имейте в виду, что несмотря на все доводы, эта статья не рекомендует вам использовать JSP или нет. Я пытаюсь подтолкнуть вас исследовать все технологии, чтобы быть уверенным, что они как раз, то, что вам необходимо. Подходы в программировании как примеры: иногда они полезны, иногда не несут ничего стоящего. Оглянитесь вокруг, найдите то, что наиболее подходит для вас и сделайте правильный выбор, вместо необдуманного. Ресурсы
О авторе Оригинал этой статьи доступен по следующему адресу: Заключение редактора. В заключение мне хотелось бы пояснить, зачем я перевел эту статью и поместил ее в эту колонку, ведь эта статья практически советует отказаться от использования JSP? Начну с того, что эта статья будет более полезна тем, кто уже работал с JSP, чем начинающим. Ведь автор сам призывает вас исследовать и пробовать технологии прежде чем делать свои заключения. Поэтому если вы начинающий программист JSP и после прочтения этой статьи решили не работать с ними - подумайте еще раз, может стоит хотя бы попробовать? Brett McLaughlin очень известный и опытный разработчик Java, именно поэтому его мнение было мне более интересным, чем просто обычные "религиозные войны" сторонников различных технологий. Особенно учитывая то, что он совершенно доступно и логично описал проблемы технологии JSP и более того, описал пути их решения (например использование custom tag и совместимость с XTHML). Именно это и было интересно мне, как JSP разработчику. Как можно правильно пользоваться этой технологией, чтобы избежать трудностей в дальнейшем. Более того, мы с вами живем не в идеальном мире, и очень часто (особенно в России) требуется не разработать какой-то глобальный программный продукт и заниматься его поддержкой и продвижением на рынок, а просто быстро и качественно сделать небольшой сайт для своей организации, обеспечить его динамическое наполнение. И в этом случае, по моему мнению, будет возможно и использование встроенного в JSP кода, хотя бы просто для ускорения и облегчения разработки и это никогда не вызовет глобальных проблем (я знаю по крайней мере несколько таких "неправильных" успешных проектов). Хотя конечно если у вас есть время и возможность лучше делать все как можно более качественно. Как говорится - "Осведомлен значит вооружен", поэтому я надеюсь что эта статья осведомит вас о существующих проблемах в JSP и вы уже будете во всеоружии. Искренне ваш, |
| Справка | Условия | |
| В начало | Логин | Комментарий к колонке | Поиск | Почта |