Сведение всего этого вместе


Связывание свободных концов


Класс GenericPortlet дает возможность дефолтного применения интрефейса портлета. Путем расщирения GenericPortlet разработчики портлета пользуются преимуществами встроенного интепретатора режимов портлета и дефолтных применения методов жизненного цикла. Пример Hello World внизу заимствует применение GenericPortlet.



Библиотеки тэгов портлетов


Спецификация портлета предоставляет библиотеки тэгов, которые используются для разработки JSP, которые интрепретируют фрагменты портлетов. Эта библиотека содержит тэги, которые могут быть использованы для определения объектов портлетов в пределах страницы, генерирования портлетных url'ов и генерирования уникальных портлетных пространств имен. Пример внизу использует эти библиотеки тэгов, чтобы сгенерировать страницу редактирования портлета (см. ссылку на образец кода).



Hello World!, стиль портлета


В приложенном образце Hello World! Демонстрируется простая интепретация и обработка действия. При первой интерпретации doView вызывается методом интепретации GenericPortlet. Этот метод отображает изначальное приветствие.



public void doView(RenderRequest req, RenderResponse res)
throws IOException {
PrintWriter out = res.getWriter();
out.println(getGreeting(req) + " World!");
}


Когда управление порталом используется для перекючения режима портлета на редактирование, портлет отображает экран редактирования, позволяющий пользователю изменить свое приветствие. doEdit вызывается применением GenericPortlet интепретатора. В этом методе вы используете диспетчер запросов для пересылки запроса на JSP, который сгненерирует фрагмент контента.


public void doEdit(RenderRequest req, RenderResponse res)
throws PortletException, IOException {
PortletRequestDispatcher dispatcher =
getPortletContext().getRequestDispatcher("/edit.jsp");
dispatcher.include(req, res);
}


страница JSP использует несколько портлетных тэгов для генерирования URL действия, который будет использован для обработки этой страницы.



<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<portlet:defineObjects/>
<portlet:actionURL var="url" portletMode="view"/>
<FORM method="POST" action="<%= url %>">
<TABLE>
<TR><TD>Greeting</TD>

<TD><INPUT type="text" name="greeting"
value="<%= renderRequest.getParameter("greeting") %>"/>
</TD>
<TD colspan="2"><INPUT type="submit" value="Save"/></TD>
</TR>
</TABLE>

</FORM>

Наконец после сабмишена контейнер вызывает метод processAction портлета. Этот метод устанавливает параметр интепретатора, который может быть использован для интерпретирования портлета.



public void processAction(ActionRequest req, ActionResponse res)
throws PortletException {
String greeting = getGreeting(req);
res.setRenderParameter("greeting", greeting);
}


Полный код образца портлета доступен для download.



Выводы


Основы разарботки портлетов весьма сходны с основами разработки сервлетов. Веб-разработчикам, которые знают основы создания портлетов, включая генерирование фрагментов и разделение действий и интерпретирование запросов, разработка портлетов должна показаться вполне несложной. В моей следующей статье я обращусь к применению портлетов на Apache Pluto (референтное применение Java Portlet Specification) и покажу, как можно повысить производительность путем использования Pluto в качестве среды разработки lightweight.



Ссылки



  • The Java Portlet Specification
  • The Java Portlet API

Об авторе


David DeWolf в течении шести лет разарбатывает веб-приложения, порталы и портлеты. Он является членом управляющего комитета проекта
Apache Portals
и принимает активное участие в
Apache Pluto
, референтном применении Portlet Specification. В данный момент David работает в
Digital Focus
, предоставляющем услуги разработки ПО, тренинга и консультативных услуг в сфере ИТ для Fortune 1000 и среднего размера предприятий. С ним можно связаться по
author@daviddewolf.com