Портлеты в Java. (Лекция 21)

Содержание

Слайд 2

Портлеты Портлеты - представляют собой специальный тип сервлета, и они используют

Портлеты

Портлеты - представляют собой специальный тип сервлета, и они используют JSP-страницы

для отображения пользовательского интерфейса.
Portlet API расширяет и является подклассом Servlet API, и это означает, что портлеты могут делать то же, что и сервлеты с некоторыми изменениями при исполнении и дополнительными возможностями.
Слайд 3

Наиболее существенное изменение исполнения в том, как обслуживаются запросы: сервлеты обрабатывают

Наиболее существенное изменение исполнения в том, как обслуживаются запросы: сервлеты обрабатывают

запросы "doGet" и "doPost", которые преобразуются в http GET и POST запросы, в то время как портлеты обрабатывают запросы "doView" и "doEdit", которые приходят не напрямую от Web-браузера, а от портального сервера.
Слайд 4

Возможности портлетов: встроенная поддержка автоматического использования различных JSP- страниц для различных

Возможности портлетов:
встроенная поддержка автоматического использования различных JSP- страниц для различных пользовательских

устройств, таких как настольные компьютеры, Palm-компьютеры с ограниченными Web-браузерами, PDA и мобильные телефоны;
назначать права пользователям групп на использование портлетов.
В случае отсутствия оных они даже не будут
видеть портлеты;
Слайд 5

создание сохраняемых между сессиями пользовательских настроек; публикация в виде Web-сервиса; разделение

создание сохраняемых между сессиями пользовательских настроек;
публикация в виде Web-сервиса;
разделение сложных приложений

на задачи, когда группа тесно связанных задач равняется одному портлету;
добавление новых функций к приложению;
хорошая совместимость с брандмауэрами (firewalls), так как портлеты используют стандартные Web-протоколы для получения и отображения информации;
одноразовая установка и настройка портлета для пользователей.
Слайд 6

Сходства и различия сервлетов и портлетов Сходства между сервлетами и портлетами:

Сходства и различия сервлетов и портлетов
Сходства между сервлетами и портлетами:
относятся к

J2EE Web-компонентам;
управляются контейнерами;
генерируют динамическое Web-содержимое при помощи запросов и ответов
Различия между сервлетами и портлетами:
портлеты генерируют часть документа, в то время как сервлеты генерируют его полностью;
Слайд 7

за счёт того, что операции кодирования URL выполняются на стороне сервера,

за счёт того, что операции кодирования URL выполняются на стороне сервера,

пользователь не может обратиться к нему напрямую, зная имя портлета: портлет - часть страницы, поэтому знания одного URL мало;
портлеты имеют несколько иную схему управления запросами, которые делятся на запросы выполнения действий и запросы генерирования содержимого;
портлеты придерживаются стандартного набора состояний, которые определяют их контекст работы и правила генерации содержимого.
Слайд 8

Жизненный цикл Как и у сервлетов, жизненный цикл портлетов управляется контейнером,

Жизненный цикл
Как и у сервлетов, жизненный цикл портлетов управляется контейнером, и

у него есть метод init(), который используется для инициализации всех данных, необходимых для корректной работы портлета (создание ресурсов, конфигурирование и т.д.).
Метод init() в качестве параметра принимает объект, который реализует интерфейс PortletConfig, и этот объект предоставляет необходимые для инициализации параметры.
Он может быть использован для получения ссылки на объект, реализующий интерфейс PortletContext.
Слайд 9

При создании портлета доступа к окружающему коду, например к контейнеру, нет,

При создании портлета доступа к окружающему коду, например к контейнеру, нет,

поэтому код внутри портлета не может оценить, насколько портлет доступен извне.
Метод destroy() предоставляет возможность для произведения очистки ресурсов, которые были востребованы и инициализированы методом init().
Этот метод аналогичен методу destroy() в сервлетах и вызывается один раз: когда контейнер выгружает портлет.
Слайд 10

Состояния Состояния портлетов – это часть портальной модели отображения. Состояния позволяют

Состояния
Состояния портлетов – это часть портальной модели отображения.
Состояния позволяют

портлету отображать различные «виды» в зависимости от ситуации.
Есть четыре состояния портлета:
View – основное состояние портлета;
Help – если портлет обеспечивает состояние помощи;
Edit – редактирование параметров портлета с сохранением результатов для этого конкретного пользователя;
Configure – конфигурирование портлета с охранением результатов для всех пользователей, права к состояниям никак не относятся.
Слайд 11

Рассмотрим пример простого портлета. Класс SimplePorltet. Этот класс, собственно, и является

Рассмотрим пример простого портлета.
Класс SimplePorltet.
Этот класс, собственно, и является основным

классом портлета.
Все, что здесь происходит – это инициализация портлета в методе init(PortletConfig config), за каждое из представлений портлета отвечают методы doEdit(), doView(), doHelp().
В методе processAction() производится обработка событий портлета (в данном случае этот метод будет вызван при подтверждении пользователем желания отредактировать настройки портлета).
Слайд 12

package aaa; import java.io.IOException; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.GenericPortlet; import

package aaa;
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import javax.portlet.PortletPreferences;
import

javax.portlet.PortletRequest;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
Слайд 13

public class SimplePortlet extends GenericPortlet { private static final String EDIT_PAGE_PARAM

public class SimplePortlet extends GenericPortlet {
private static final String EDIT_PAGE_PARAM

= "Edit-Page";
private static final String HELP_PAGE_PARAM
= "Help-Page";
private static final String VIEW_PAGE_PARAM
= "View-Page";
public void init(PortletConfig config) throws
PortletException {
super.init(config); // инициализация
}
Слайд 14

// метод, отвечающий за представление страницы редактирования public void doEdit(RenderRequest request,

// метод, отвечающий за представление страницы
редактирования
public void doEdit(RenderRequest request,
RenderResponse

response)
throws PortletException,IOException {
// получение контекста портлета
PortletContext context = getPortletContext();
setRequestAttributes(request); // установка атрибутов
// получение диспатчера для включения ресурсов в response
PortletRequestDispatcher rd = context.
getRequestDispatcher(getInitParameter(EDIT_PAGE_PARAM));
rd.include(request, response); // включение содержимого ресурса
}
Слайд 15

// метод, отвечающий за представление страницы помощи public void doHelp(RenderRequest request,

// метод, отвечающий за представление страницы помощи
public void doHelp(RenderRequest request,
RenderResponse

response)
throws PortletException, IOException {
// получение контекста портлета
PortletContext context = getPortletContext();
setRequestAttributes(request); // установка атрибута
// получение диспатчера для включения ресурсов в responce
PortletRequestDispatcher rd = context.
getRequestDispatcher(getInitParameter(HELP_PAGE_PARAM));
rd.include(request, response); // включение содержимого ресурса
}
Слайд 16

// метод, отвечающий за представление страницы просмотра public void doView(RenderRequest request,

// метод, отвечающий за представление страницы просмотра
public void doView(RenderRequest

request,
RenderResponse response)
throws PortletException, IOException {
// получение контекста портлета
PortletContext context = getPortletContext();
setRequestAttributes(request); // устанавливаем атрибуты
// получение диспатчера для включения ресурсов в response
PortletRequestDispatcher rd = context.
getRequestDispatcher(getInitParameter(VIEW_PAGE_PARAM));
rd.include(request, response); // включение содержимого ресурса
}
Слайд 17

// вызывается контейнером для обработки событий public void processAction(ActionRequest request, ActionResponse

// вызывается контейнером для обработки событий
public void processAction(ActionRequest request,
ActionResponse

response)
throws PortletException, IOException {
PortletMode mode = request.getPortletMode(); // получение состояния
PortletPreferences preferences = request.getPreferences(); //настройки
if (mode.equals(PortletMode.VIEW)) {
// сохранение настроек
preferences.setValue("firstName", request.getParameter("firstName"));
preferences.setValue("lastName", request.getParameter("lastName"));
preferences.setValue("address", request.getParameter("address"));
preferences.setValue("telephone", request.getParameter("telephone"));
preferences.store();
}
}
Слайд 18

// для установки атрибутов private void setRequestAttributes(PortletRequest request) { PortletPreferences preferences

// для установки атрибутов
private void setRequestAttributes(PortletRequest request) {
PortletPreferences preferences

= request.getPreferences();
request.setAttribute("firstName",
preferences.getValue("firstName", "undefined"));
request.setAttribute("lastName",
preferences.getValue("lastName", "undefined"));
request.setAttribute("address",
preferences.getValue("address", "undefined"));
request.setAttribute("telephone",
preferences.getValue("telephone", "undefined"));
request.setAttribute("portletName", getPortletName());
}
}
Слайд 19

Согласно спецификации для развертывания портлета необходим файл portlet.xml. В данном случае

Согласно спецификации для развертывания портлета необходим файл portlet.xml.
В данном случае

этот файл имеет вид:

"http://java.sun.com/xml/ns/portlet/portlet-
app_1_0.xsd" version="1.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/portlet/
portlet-app_1_0.xsd">
Слайд 20

Portlet Application SimplePortlet Simple Portlet aaa.SimplePortlet



Portlet Application

SimplePortlet


Simple Portlet


aaa.SimplePortlet

Слайд 21

View-Page /WEB-INF/jsp/simple-view.jsp Help-Page /WEB-INF/jsp/simple-help.jsp Edit-Page /WEB-INF/jsp/simple-edit.jsp



View-Page
/WEB-INF/jsp/simple-view.jsp


Help-Page
/WEB-INF/jsp/simple-help.jsp



Edit-Page
/WEB-INF/jsp/simple-edit.jsp

Слайд 22

не истекает --> -1 text/html view help edit


-1


text/html
view
help
edit

Слайд 23

en com.learning.portlet.SimplePortlet Portlet Application Portlet portlet


en


com.learning.portlet.SimplePortlet





Portlet Application
Portlet

portlet



Слайд 24

Файл web.xml является дескриптором web-приложения, поскольку портлет- приложение является и web-приложением.

Файл web.xml является дескриптором web-приложения, поскольку портлет- приложение является и web-приложением.


Данный файл имеет вид:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
Simple

Слайд 25

Рассмотрим соответствующие jsp страницы simple-edit.jsp uri="http://java.sun.com/jsp/jstl/core"%> uri="http://java.sun.com/jsp/jstl/fmt"%> uri="http://java.sun.com/portlet"%> //Данный тег определяет

Рассмотрим соответствующие jsp страницы
simple-edit.jsp
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@

taglib prefix="portlet"
uri="http://java.sun.com/portlet"%>
//Данный тег определяет три объекта renderRequest, renderResponse и portletConfig для использования в “протлетных” jsp страницах

Слайд 26

//связываем действие с модой view portletMode="view"/> width:150px; color: #000000;"/> "border:none; width: 75px;"/> color:#000000; white-space: nowrap;"/>

//связываем действие с модой view
portletMode="view"/>
width:150px; color: #000000;"/>
"border:none; width: 75px;"/>

Слайд 27

//Подключаем внешний ресурс : value="${firstName}" style="${inputTextStyle}"/>

//Подключаем внешний ресурс








Слайд 28

: style="${inputTextStyle}"/> : style="${inputTextStyle}"/>









Слайд 29

: style="${inputTextStyle}"/>










:

value="${firstName}" style="${inputTextStyle}"/>

:

name="lastName" value="${lastName}"
style="${inputTextStyle}"/>

:

style="${inputTextStyle}"/>

:

name="telephone" value="${telephone}"
style="${inputTextStyle}"/>




Слайд 30

sample-help.jsp uri="http://java.sun.com/jsp/jstl/fmt"%> uri="http://java.sun.com/portlet"%>

sample-help.jsp
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="portlet"
uri="http://java.sun.com/portlet"%>




Слайд 31

&nbsp;&nbsp; ${portletName} &nbsp;&nbsp; ${firstName} ${lastName}




Слайд 32

. //связываем render с модой edit .







  

${portletName}

  
key="portlet.storeduser.message">
${firstName}
${lastName}





//связываем render с модой edit


.


Слайд 33

simple-view.jsp uri="http://java.sun.com/jsp/jstl/core"%> uri="http://java.sun.com/jsp/jstl/fmt"%> uri="http://java.sun.com/portlet"%> color:#000000; white-space: nowrap;"/> color: #000000; white-space: nowrap;"/>

simple-view.jsp
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="portlet"
uri="http://java.sun.com/portlet"%>

value="text-align: right;
color:#000000; white-space: nowrap;"/>

Слайд 34

"com.learning.portlet.SamplePortlet"/> : ${firstName}

"com.learning.portlet.SamplePortlet"/>







Слайд 35

: ${lastName} : ${address}









Слайд 36

: ${telephone}







:
${firstName}

:
${lastName}

:
${address}

:
${telephone}

Слайд 37

файл свойств для английского языка : SamplePortlet_en.txt portlet.label.firstname = First name

файл свойств для английского языка :
SamplePortlet_en.txt
portlet.label.firstname = First name
portlet.label.lastname = Last

name
portlet.label.address = Address
portlet.label.telephone = Telephone number
portlet.button.submit = Store
portlet.name.message = This is the simple help page
of the portlet
{0} .
portlet.storeduser.message = Stored user is
{0} {1}.
portlet.viewpage.link = View page
portlet.editpage.link = Edit page
Слайд 38

файл свойств для русского языка: SamplePortlet_ru.txt portlet.label.firstname = Имя portlet.label.lastname =

файл свойств для русского языка: SamplePortlet_ru.txt
portlet.label.firstname = Имя
portlet.label.lastname = Фамилия
portlet.label.address =

Адрес
portlet.label.telephone = Номер телефона
portlet.button.submit = Сохранить
portlet.name.message = Страница помощи портлета {0}.
portlet.storeduser.message = Сохраненный
пользователь
{0} {1}.
portlet.viewpage.link = Смотреть
portlet.editpage.link = Редактировать
Слайд 39

Рассмотрим развертывание приложения с использованием портального сервера jetspeed Создать директорию temp(имя

Рассмотрим развертывание приложения с использованием портального сервера jetspeed
Создать директорию temp(имя не

имеет значение)
Создать в ней подиректорию src
В src создать структуру каталогов
src->config ->(web.xml; portlet.xml)
src-> java ->SimplePortlet.java
src->jsp->(simple-view.jsp; simple-help.jsp; simple-edit.jsp)
src-> lib ->(portlet-api_2.0_spec-1.0.jar; jstl.jar)
src->message->aaa->(SimplePortlet_ru.txt; SimplePortlet_en.txt)
src-> tld->(portlet_2_0.tld; portlet.tld; fmt.tld)
src->build.xml
Слайд 40

Стоит заметить, что файлы portlet_2_0.tld; portlet.tld можно найти в пакете portlet-api_2.0_spec-1.0.jar,

Стоит заметить, что файлы portlet_2_0.tld; portlet.tld можно найти в пакете

portlet-api_2.0_spec-1.0.jar, а fmt.tld в пакете jstl.jar
Файл build.xml имеет вид:









Слайд 41

value="${src.dir}/${message.dir}"/> value="${src.message.dir}/aaa"/> value="${result.dir}/${classes.dir}/aaa"/>




value="${src.dir}/${message.dir}"/>

name="src.tld.dir" value="${src.dir}/${tld.dir}"/>





value="${src.message.dir}/aaa"/>
value="${result.dir}/${classes.dir}/aaa"/>

Слайд 42

optimize="yes" debug="no"> includes="**/*.txt" encoding="${localization.encoding}" ext="${localization.ext}"/>


dir="${result.dir}/${classes.dir}"/>
optimize="yes" debug="no">









includes="**/*.txt" encoding="${localization.encoding}"
ext="${localization.ext}"/>

Слайд 43

description="Creates .war file of the portlet."> webxml="${src.config.dir}/web.xml" compress="on"> prefix="${webapp.dir}">

description="Creates .war file of the portlet.">

webxml="${src.config.dir}/web.xml" compress="on">




prefix="${webapp.dir}">



Слайд 44

prefix="${webapp.dir}/${jsp.dir}"/> prefix="${webapp.dir}/${tld.dir}"/> 4. Запустить из директории temp ant. 5. Установить jetspeed,

prefix="${webapp.dir}/${jsp.dir}"/>
prefix="${webapp.dir}/${tld.dir}"/>



4. Запустить

из директории temp ant.
5. Установить jetspeed, для этого необходимо скачать jetspeed-installer-2.2.2.jar
Затем запустить java –jar jetspeed-installer-2.2.2.jar
(перед запуском инсталятора должна быть установлена база данных)
Слайд 45

6. Перекопировать файл из директории temp -> result ->SimplePortlet.war в директорию

6. Перекопировать файл из директории
temp -> result ->SimplePortlet.war
в директорию

$jetspeed_root_directory->webapps->jetspeed
->WEB-INF -> deploy
7. Запустить сервер jetspeed
$jetspeed_root_directory->bin->startup.bat
8.Загрузить стартовую страницу
http://localhost:8080/jetspeed/
9. Зайти как администратор
обычно
Login: admin
Password: admin
Слайд 46

10. Добавить портлет Для этого необходимо щелкнуть на кнопке в верхнем правом углу

10. Добавить портлет
Для этого необходимо щелкнуть на кнопке в верхнем

правом углу
Слайд 47

Затем снова нажать на кнопку “+”, рядом с надписью Add Portlet

Затем снова нажать на кнопку “+”, рядом с надписью Add Portlet

Слайд 48

Затем в окне поиска ввести название SimplePortlet и после этого добавить

Затем в окне поиска ввести название SimplePortlet
и после этого добавить

портлет и нажать на кнопку в правом верхнем углу с изображением глаза. Как результат появится портлет: