Статьи

ItsNat Java Web Framework: DHTML на сервере

Говорить о том, что «слишком много веб-фреймворков Java» обманчиво, утверждает Хосе Мария Арранц, потому что их стили разработки почти не различаются. Его веб-инфраструктура ItsNat предоставляет совершенно новый подход, который он описывает как «программирование DHTML на сервере». О чем это все? Здесь он объясняет, в глубоком интервью.

В этом интервью мы проводим некоторое время, исследуя ItsNat, о котором было объявлено в конце прошлого года. ItsNat уже обсуждался в Интернете в различных местах, в частности, в статье под названием « Потерял ли свой путь веб-разработка?». хотя еще несколько ссылок находятся в конце этого интервью.

Хосе — испанский промышленный инженер, работающий профессором в университете. Он преподает в основном языки программирования в UPM в Мадриде, Испания. Это не его работа на полную ставку, потому что он также руководит небольшим стартапом,
Innowhere Software Services .

Здесь мы спрашиваем его о происхождении ItsNat и о том, что он хочет делать в уже загруженном пространстве веб-фреймворка.

Хосе, вы создали веб-фреймворк ItsNat. Почему это называется ItsNat?


ItsNat означает «Это естественно». Почему натуральный? Потому что «натуральный» — это дух фреймворка: естественный подход к веб-разработке. ItsNat способствует возвращению к корням, возвращению к простоте и возвращению к старым и почтенным веб-стандартам W3C в качестве основных технологий для разработки новых приложений Web 2.0. Поскольку ItsNat в значительной степени основан на AJAX, «фамилия» фреймворка — «Natural AJAX». И тут заканчивается «пуховый» маркетинг … 🙂

Зачем было создавать еще один веб-фреймворк? Как ItsNat сравнивается с другими фреймворками, такими как Struts, Wicket, Tapestry или другими?


Некоторое время назад я работал над
JNIEasy, который является инструментом Java для доступа к нативным библиотекам без JNI, не имея большого контакта с веб-миром. В то время я часто читал веб-сайты о разработке программного обеспечения, большую часть времени связанные с Java, и поэтому я часто читаю новости о веб-разработке и, в частности, о веб-фреймворках. Когда я читал об этих рамках, я обычно думал: «Боже мой, что за тонна артефактов! Веб-разработка на Java становится кошмаром, я думаю, что возможна другая веб-инфраструктура ». Когда я говорю «артефакты», я имею в виду пользовательские теги и библиотеки тегов, которые смешиваются с тоннами программирования на основе XML, языковых выражений, навигации на основе XML, XML-дескрипторов для привязок и так далее. Королем артефактов был и остается JSF, хотя Struts не сильно отличается.


Идея JSF хороша: разметка генерируется и адаптируется к среде выполнения, и для разработчика меньше свободы и больше возможностей для инфраструктуры. Когда появился JSF, мобильный интернет начинал с «многоканального» изобилия, архитектура JSF была разработана для такого рода среды, скрывая, насколько это возможно, HTML и заменяя его новой JSF-определенной разметкой, потому что WAP Технология WML отличалась от HTTP / HTML. Еще одно внимание всегда уделялось инструментам: инструменты любят XML, и JSF задумывался для того, чтобы хорошо разбираться с инструментами, поэтому он так декларативен. Но дни WAP прошли; теперь мобильный Интернет — это HTML и HTTP, и теперь большая часть этой специальной разметки переоценена, потому что почти 100% веб-клиентов являются устройствами HTML …


Затем в Wicket были добавлены все полезные вещи: чистый HTML, используемый в качестве шаблонов для компонентов Java.
Калитка в порядке, и ItsNat был мотивирован частично калиткой. Но обещание чистого HTML нарушается и в Wicket, с такими пользовательскими тегами, как <wicket: extend> <wicket: link> <wicket: panel> и <wicket: head>. И когда вы видите некоторые компоненты, например, компонент дерева, содержимое HTML-компонента отсутствует в шаблоне и генерируется как типичный компонент в черной рамке. Это не очень отличается от пользовательских тегов, генерирующих разметку. Я не против Рейкета, это
верныйСпособ улучшить веб-фреймворки (я бы сделал то же самое) и является прямым следствием традиционных приемов создания шаблонов.


Затем AJAX пришел, чтобы изменить все. Большинство современных фреймворков были разработаны до эпохи AJAX. До разработки на основе событий / компонентов AJAX имитировалось настольное приложение с использованием сложных методов отслеживания пользовательской навигации, включая кнопки «назад» и «вперед». Все эти артефакты, ориентированные на классическую (не AJAX) навигацию, в настоящее время являются примерами перепроектирования. Основанная на действии инфраструктура, такая как Struts, не может предложить что-либо в мире приложений с одной главной страницей, аналогичной типичному настольному приложению.


JSF увидел в AJAX новую возможность проявить себя: разработка AJAX будет очень трудной, если разработчик контролирует макет HTML, подход «черного ящика» выиграет без каркасов, таких как ItsNat.
Затем пришел GWT. GWT в значительной степени основан на AJAX, но опять та же мантра: «Извините, разметка моя». Кроме того, JSF предлагает статический макет страницы, я могу (мысленно) «визуализировать» окончательный макет HTML, в то время как с GWT разметка абсолютно потеряна.

Почему так важно контролировать HTML-макет?

Потому что это веб-культура: Интернет является удивительным местом визуальных инноваций, в том числе веб-приложений. Когда кто-то разрабатывает приложение Swing, для визуального дизайна не так много места, если только вы не Romain Guy или Chet Haase … в веб-пространстве любой может изменить внешний вид веб-приложения. Кроме того, в Интернете несложно создать список или таблицу, содержащие сложные формы, а в Swing настроить JList или JTable не так просто.


Ключ — это технология шаблонов: большинство (все?) Веб-фреймворки управляют разметкой как
«мертвый код » , то есть как обычный текст, в то время как только пользовательские теги, языки выражений и т. д. составляют живой код. Это вводит серьезные ограничения, и в долгосрочной перспективе подход «черного ящика» выигрывает, потому что нет компромисса фреймворк с веб-дизайнером, так что веб-дизайнер проигрывает. Еще одна проблема современных шаблонных технологий — это подход «просмотр-извлечение»: обычно представление «выполняется», которое напоминает данные во многом как императивный язык.


Возвращаясь к началу, с мыслью «возможен другой веб-фреймворк», AJAX заставил меня задуматься над возможностью создать новую радикальную альтернативу подходу «шаблонов мертвого кода»: создать шаблон в виде дерева DOM W3C на сервере, такой как браузер на клиенте. Сервер повторяет «природу клиента»: клиентский DOM является клоном серверного DOM. Этот подход идеально подходит для AJAX, имитируя браузер W3C на сервере, получающем события DOM W3C, и любое изменение в DOM сервера может быть обнаружено автоматически с помощью событий мутации. Таким образом, платформа может обнаруживать, что изменяется в дереве DOM сервера, и синхронизировать DOM клиента, генерируя соответствующий JavaScript, адаптированный для браузера. Исходный шаблон может быть чистым HTML-файлом без специальной разметки и логики просмотра,потому что логика представления выполняется в Java с использованием API-интерфейсов DOM W3C и всех полезностей объектно-ориентированного программирования.

Что пользователь получает с этим подходом?


При таком подходе разработчик
абсолютный контроль
макета.
На самом деле, разработчик никогда не имел такого большого контроля. Я думаю, что это революционно во времена «черных» компонентов. Начальный уровень очень низкий. Веб-разработка с ItsNat удивительно проста. Требуется лишь очень немного интерфейсов ItsNat, которые в основном являются оболочками интерфейсов сервлетов и API-интерфейсами Java W3C DOM, которые в основном являются основной частью и событиями. Короче говоря, сервер закодирован как DHTML в браузере, но со стандартами Java и DOM W3C.


Подход DOM на сервере не нов. На самом деле, это очень старая техника, использовавшаяся ранее для классической навигации, например, в старой версии Cocoon и в Barracuda. Сегодня он не используется, потому что дерево DOM потребляет много памяти и занимает много времени на сборку и сериализацию. Много лет назад я разработал классическое веб-приложение на Java с использованием DOM и «примитивных» пользовательских тегов, когда JSP не была основной технологией. Сегодня не 90-е годы, 64-битные процессоры преодолели барьер в 2 Гб, веб-приложения сохраняют состояние на сервере, чтобы улучшить взаимодействие с пользователем, и мы находимся в эпоху AJAX, передавая незначительные изменения с сервера…


В любом случае, дерево DOM потребляет память, а построение и сериализация дерева DOM требует времени. Эти проблемы решаются с помощью ItsNat, с использованием общих деревьев DOM, где клонируются новые деревья DOM, и с использованием методов кэширования. Статические части веб-страниц сохраняются и передаются как обычный текст, который уже сериализован в памяти, а не как DOM. Только динамические части, то есть поддеревья DOM, которые будут изменены на сервере, находятся в памяти как DOM.

Можете ли вы обобщить основные особенности ItsNat для нас?


ItsNat ориентирован на AJAX.
Однако его также можно использовать для классической навигации, включая отключенные страницы JavaScript. Он также может генерировать XML, хотя это не является его целью. Чистые шаблоны HTML, просмотр логики в Java с абсолютным контролем над макетом, таймеры AJAX, с тем же API, что и у java.util.Timer, удивительно простая поддержка COMET, поддержка SVG внутри XHTML, а элементы SVG также управляются сервером включая компоненты, Swing-подобные компоненты, такие как кнопки, метки, списки, таблицы и деревья, с присоединяемыми представлениями, повторно использующими Swing, такими как его данные и модели выбора.


Чтобы объяснить, как работают компоненты ItsNat, я обычно показываю следующую шутку, похожую на тест Роршаха на основе ItsNat:


Q) Что вы видите в этой разметке?

<table id="table1">
<thead>
<tr><th>Customer Id</th><th>Customer Name</th></tr>
</thead>
<tbody>
<tr><td>Customer Id</td><td>Customer Name</td></tr>
</tbody>
</table>

А) Конечно, шаблон клиентской таблицы HTML. Если вы присоедините его к компоненту ItsNat Table, вы увидите Swing TableModel, в которой модели выбора строк и столбцов автоматически используют этот шаблон таблицы.


Q) Далее, что вы видите в этой разметке?

<div id="table1">
<div style="width:50%">
<div style="border:1px solid;">Customer Id</div>
<div style="border:1px solid;">Customer Name</div>
</div>
<div style="width:50%; margin-top:10px;">
<div style="border:1px solid;">Customer Id</div>
<div style="border:1px solid;">Customer Name</div>
</div>
</div>

А) Легко, тот же стол, но с другой раскладкой, в данном случае вертикальной. Если эта таблица присоединена к компоненту ItsNat Table, вы увидите Swing TableModel, в которой модели выбора строк и столбцов автоматически используют этот шаблон таблицы.


Q) Наконец … теперь, что ты видишь?

<h:dataTable id="table1" value="{pc_Customers.customer}" var="varcustomer" styleClass="dataTable">
<h:column id="column1">
<f:facet name="header">
<h:outputText styleClass="outputText" value="Customerid" id="text1"></h:outputText>
</f:facet>
<h:outputText id="text2" value="{varcustomer.CUSTOMERID}" styleClass="outputText">
<f:convertNumber />
</h:outputText>
</h:column>
<h:column id="column2">
<f:facet name="header">
<h:outputText styleClass="outputText" value="Custfirstname" id="text3"></h:outputText>
</f:facet>
<h:outputText id="text4" value="{varcustomer.CUSTNAME}" styleClass="outputText"></h:outputText>
</h:column>
</h:dataTable>

А) Э-э-э… у меня болит голова.


Но для меня наиболее интересными функциями являются отправленные сервером события и удаленное управление.

  • События, отправленные сервером, Они составляют «сеть с ног на голову». ItsNat может запустить с сервера событие Java W3C DOM и отправить клиенту как собственное событие клиента, это событие отправляется как обычное событие, если прослушиватель сервера снова прослушивает этот тип события, отправляется на сервер и отправляется к DOM-элементу целевого сервера и слушателю. Отправленные сервером события могут использоваться для автоматизированного функционального тестирования, где код тестирования находится на сервере, дерево DOM и данные сервера могут использоваться для тестирования представления и бизнес-логики, конечно же, с использованием Java. Отправленные сервером события также могут быть использованы для имитации действий пользователя, чтобы привести приложение в желаемое состояние и т. Д. Кроме того, ItsNat позволяет отправлять серверные события, напрямую отправляемые в дерево DOM сервера и прослушиватели, что очень полезно для функционального тестирования без браузера (быстрее),для закладки страниц в приложении AJAX и создания совместимых с Google приложений AJAX.
  • Удаленный просмотр / контроль . Это моя любимая особенность! Поскольку дерево DOM пользовательской страницы находится на сервере, нетрудно скопировать DOM сервера в новый клиент браузера, работающий как «шпион», который ItsNat предоставляет «из коробки». Используя таймеры или COMET, шпион может видеть точное состояние веб-страницы пользователя, и любое изменение наблюдаемой страницы, которое обычно является результатом действий пользователя, обновляется на странице «шпиона». Это также может быть несколько страниц, потому что возможно много удаленных просмотров. Текущая реализация поддерживает только удаленные представления только для чтения, то есть некоторое удаленное управление возможно на сервере. Следующая версия будет поддерживать полное дистанционное управление. В первый раз, когда я увидел другую страницу и отследил ее действия, я сказал что-то вроде: «Боже мой, я не могу поверить, что это действительно работает!»

Можете ли вы рассказать нам пример «Hello world»?

Хорошо, здесь мы идем:

  1. Создайте новый веб-проект на Java с предпочитаемой вами IDE, имя не имеет значения, мы будем использовать «itsnat».
  2. Скопируйте следующие fw_dist/lib
    файлы JAR в файл WEB-INF / lib (эти файлы находятся в дистрибутиве ItsNat): ItsNat.jar, nekohtml.jar, serializer.jar, xercesImpl.jar, xml-apis.jar
  3. Скопируйте следующие файлы JavaScript (все они находятся в fw_dist/js)
    новой общедоступной веб-папке «js» (например, в папке <project> / web / js в IDE NetBeans): itsnat.js, itsnat_ajax.js, itsnat_msie.js, itsnat_w3c.js
  4. Создайте новый сервлет с помощью мастера вашей IDE. В этом примере он называется «сервлет», но это имя не обязательно. Файл web.xml по умолчанию действителен как есть. Удалите любой код и добавьте следующее:

    import javax.servlet.*;
    import org.itsnat.core.DocumentTemplate;
    import org.itsnat.core.http.HttpServletWrapper;
    import org.itsnat.core.http.ItsNatHttpServlet;
    public class servlet extends HttpServletWrapper { public void init(ServletConfig config) throws ServletException { super.init(config);
    ItsNatHttpServlet itsNatServlet = getItsNatHttpServlet();
    String pathPrefix = getServletContext().getRealPath("/"); pathPrefix += "WEB-INF/pages/manual/"; DocumentTemplate docTemplate; docTemplate = itsNatServlet.registerDocumentTemplate("manual.core.example","text/html",pathPrefix + "core_example.xhtml"); docTemplate.addItsNatServletRequestListener(new CoreExampleLoadListener());
    }
    }

    Класс HttpServletWrapper является служебным классом ItsNat, он только перенаправляет обычный запрос в ItsNat.

    Стандартный метод сервлета «init» используется для настройки ItsNat и добавления шаблона ItsNat (core_example.xhtml), зарегистрированного с именем «manual.core.example», и класса, который обрабатывает этот шаблон, CoreExampleLoadListener. Шаблон используется для построения последней обслуживаемой страницы (ItsNat поддерживает шаблоны как фрагменты страницы).

  5. Создайте новый файл XHTML с именем «core_example.xhtml» в новой папке «WEB-INF / pages / manual /», имя и расположение этой папки не являются обязательными. Этот файл представляет собой шаблон ItsNat, как вы можете видеть, это чистый XHTML (также поддерживается HTML):
    <!-- <?xml version="1.0" encoding="UTF-8"?> -->
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head> <title>ItsNat Core Example</title> </head>
    <body>
    <h3>ItsNat Core Example</h3> <div itsnat:nocache="true" xmlns:itsnat="http://itsnat.org/itsnat">
    <div id="clickableId1">Clickable Elem 1</div>
    <div id="clickableId2">Clickable Elem 2</div>
    </div>
    </body>
    </html>

  6. Добавьте новый класс Java с именем CoreExampleLoadListener (пакет / местоположение не важен, а имя класса является только примером) и следующий код:
    package org.itsnat.manual.core;
    import org.itsnat.core.ItsNatServletRequest; import org.itsnat.core.ItsNatServletResponse; import org.itsnat.core.event.ItsNatServletRequestListener; import org.itsnat.core.html.ItsNatHTMLDocument;
    public class CoreExampleLoadListener implements ItsNatServletRequestListener { public CoreExampleLoadListener() {}
    public void processRequest(ItsNatServletRequest request, ItsNatServletResponse response) { ItsNatHTMLDocument itsNatDoc = (ItsNatHTMLDocument)request.getItsNatDocument(); new CoreExampleProcessor(itsNatDoc); }
    }

    Метод processRequest (реализующий интерфейс ItsNatServletRequestListener) вызывается, когда пользователь загружает новую страницу с URL:

    http://<host>:<port>/<yourapp>/servlet?itsnat_doc_name=manual.core.example

    ItsNat автоматически создает объект ItsNatHTMLDocument при загрузке новой страницы, этот объект оборачивает сборку объекта org.w3c.dom.Document с использованием указанного шаблона страницы (manual.core.example), этот объект вызывается с помощью ItsNatHTMLDocument.getDocument (). Этот документ DOM представляет страницу клиента, любое изменение, выполненное в дереве DOM, будет распространено на клиент.

  7. CoreExampleLoadListener делегирует новый экземпляр CoreExampleProcessor:
    package org.itsnat.manual.coreimport org.itsnat.core.html.ItsNatHTMLDocument;
    import org.w3c.dom.Element; import org.w3c.dom.Text; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.w3c.dom.html.HTMLDocument;
    public class CoreExampleProcessor implements EventListener { protected ItsNatHTMLDocument itsNatDoc; protected Element clickElem1; protected Element clickElem2;
    public CoreExampleProcessor(ItsNatHTMLDocument itsNatDoc) { this.itsNatDoc = itsNatDoc; load(); }
    public void load() { HTMLDocument doc = itsNatDoc.getHTMLDocument(); this.clickElem1 = doc.getElementById("clickableId1"); this.clickElem2 = doc.getElementById("clickableId2"); clickElem1.setAttribute("style","color:red;"); Text text1 = (Text)clickElem1.getFirstChild();
    text1.setData("Click Me!");
    Text text2 = (Text)clickElem2.getFirstChild();
    text2.setData("Cannot be clicked");
    Element noteElem = doc.createElement("p");
    noteElem.appendChild(doc.createTextNode("Ready to receive clicks..."));
    doc.getBody().appendChild(noteElem);
    itsNatDoc.addEventListener((EventTarget)clickElem1,"click",this,false);
    }
    public void handleEvent(Event evt) { EventTarget currTarget = evt.getCurrentTarget(); if (currTarget == clickElem1) { removeClickable(clickElem1); setAsClickable(clickElem2); } else { setAsClickable(clickElem1); removeClickable(clickElem2); } HTMLDocument doc = (HTMLDocument)itsNatDoc.getDocument(); Element noteElem = doc.createElement("p"); noteElem.appendChild(doc.createTextNode("Clicked " + ((Element)currTarget).getAttribute("id"))); doc.getBody().appendChild(noteElem); }
    public void setAsClickable(Element elem) { elem.setAttribute("style","color:red;"); Text text = (Text)elem.getFirstChild(); text.setData("Click Me!");
    itsNatDoc.addEventListener((EventTarget)elem,"click",this,false);
    }
    public void removeClickable(Element elem) { elem.removeAttribute("style"); Text text = (Text)elem.getFirstChild(); text.setData("Cannot be clicked"); itsNatDoc.removeEventListener((EventTarget)elem,"click",this,false); }
    }

    Как вы можете видеть, вид страницы изменяется с использованием стандартных методов W3C DOM во время загрузки, когда получено событие. Для прослушивания событий вызывается метод ItsNatHTMLDocument.addEventListener, этот метод очень похож на org.w3c.dom.events.EventTarget.addEventListener:

    itsNatDoc.addEventListener((EventTarget)clickElem1,"click",this,false)


    Этот метод добавляет экземпляр CoreExampleProcessor в качестве прослушивателя, поскольку этот класс реализует org.w3c.dom.events.EventListener, готовый к получению событий щелчка мыши.
    Когда пользователь щелкает указанный элемент на клиенте, событие отправляется на сервер с использованием методов AJAX и преобразуется в W3C DOM MouseEvent, и вызывается метод handleEvent (Event), любое изменение прозрачно передается клиенту как результат события. ,

    Метод ItsNatHTMLDocument.removeEventListener используется для отмены регистрации слушателя, снова имитируя org.w3c.dom.events.EventTarget.removeEventListener.

  8. Теперь запустите приложение. На следующем рисунке показано состояние страницы клиента после того, как пользователь щелкнул первый элемент:

Где в настоящее время используется ItsNat?


Это ребенок с университетским образованием … 🙂 Ему всего три месяца.
Я считаю, что ItsNat готов к производству. Но тогда почему это 0.x? Потому что я хочу стабилизировать API, собирать отзывы от пользователей и, конечно же, исправлять заметные ошибки, если таковые имеются.

Сколько времени у вас ушло на его создание?


Один год, но это никогда не было полной занятостью.
Во всяком случае, ItsNat не является «любимым проектом» или «воскресным проектом» и не был сделан в мое свободное время.

А есть ли у вас советы и рекомендации для тех, кто создает веб-фреймворки?


Есть два сценария:


  1. Если вы хотите конкурировать на зрелом рынке, например, создавая новую реализацию JSF, вам нужно быть лучшим, самым дешевым или и тем, и другим.
  2. В противном случае будьте разрушительными, создайте что-то другое: новые и инновационные технологии. Избегайте СУХОГО (не повторяйте себя) и НИЗ (не изобретенного здесь) искушений. Конечно, большие парни будут с подозрением относиться к вашей работе, но умные («ловкие») люди могут ценить вашу работу, если она что-то улучшает, например, если она обеспечивает новый стиль разработки, что-то упрощает, повышает производительность или качество, или что-то подобное.

Какие планы на будущее?


С технической точки зрения, новая версия 0.3, которая еще не является общедоступной, уже частично поддерживает Safari 3.0 и Opera 9, хотя полная поддержка Opera не гарантируется. Ограничение «того же семейства браузеров» в удаленных представлениях снято, так что, например, теперь вы можете «шпионить» с FireFox или Safari за другой веб-страницей, открытой с MSIE, и любой другой комбинацией.


Другие ожидающие функции: масштабируемый COMET, текущая реализация независима от контейнеров сервлетов, но современные контейнеры вводят собственные технологии, чтобы избежать ограничения потока 1 запрос-1. Полное дистанционное управление, эта функция откроет новый мир инструментов для совместной работы в реальном времени, таких как служба поддержки. Дополнительные компоненты, присоединение к серверу уже загруженных веб-страниц, некоторая (необязательная) интеграция с популярными платформами JavaScript и т. Д.


С профессиональной точки зрения: ItsNat хочет быть профессиональным и открытым исходным кодом, но ItsNat не является полностью бесплатным.
Лицензия AGPL обязывает выпустить источник вашего веб-приложения на основе ItsNat, если ваше веб-приложение некоммерческое, или у вас нет проблем с выпуском исходного кода, или обоих, то ItsNat на 100% свободен, в противном случае коммерческая лицензия снимет это ограничение. Коммерческие лицензии лицензируются на процессор / ядро ​​для приложений с закрытым исходным кодом, которые
в производстве, Я думаю, что производственные лицензии — лучшая модель, потому что стоимость лицензии связана с выгодой, которую обеспечивает технология. Если вы являетесь компанией по разработке программного обеспечения, ItsNat для вас бесплатен, и вы можете бесплатно доставлять коммерческие приложения, в то время как только бенефициар, то есть тот, кто использует ItsNat, берет на себя стоимость.


Я считаю, что это или должно быть будущее, потому что оба мира, с открытым исходным кодом и коммерческого программного обеспечения, хорошо сочетаются друг с другом. Мне не нравятся уловки некоторых бизнес-проектов с открытым исходным кодом, таких как продажа документации в виде книг, получение платы за конфигурацию, двоичные файлы, которые не распространяются бесплатно, и так далее. Мне не нравятся проекты, которые полностью разрабатываются в свободное время, без бизнес-модели, с точки зрения «модели разработки», а не программного обеспечения.

Можете ли вы дать нам некоторые рекомендации для дальнейшего изучения этой основы?

Вот некоторые, чтобы вы начали:

Есть ли у вас какие-нибудь заключительные слова для читателей этого интервью?


ItsNat не хочет быть всем для всех, и технически это не может быть так или иначе. Например, если вам нужны высокоинтерактивные компоненты, вам может понадобиться какая-нибудь классная JavaScript-инфраструктура на клиенте, такая как Dojo, prototype, YUI и так далее. Многие говорят, что существует «слишком много веб-фреймворков Java», и это правда, что существует множество веб-фреймворков. Однако, когда вы анализируете их «стили разработки», их не так много. Это говорит о величии Java: вы можете выбрать стиль, который вам нравится больше всего, потому что у каждого стиля есть свои плюсы и минусы. Я думаю, что ItsNat вводит новый стиль веб-разработки — программирование DHTML на сервере. Если вам нравится этот новый стиль и он соответствует вашим потребностям, тогда это хорошо, и я хотел бы услышать ваши комментарии и вопросы.


Наконец, спасибо всем за чтение этого очень длинного интервью.
До встречи на форумах Javalobby!