|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
||||||
XPages. Обо всем понемногу19.12.2016, 12:53. Показов 11940. Ответов 16
Метки нет (Все метки)
Начну с мини описания, далее как-то это все постараюсь структурировать и дополнять и не бросать. Прошу меня поправлять, если я где-то буду не прав. Так же прошу отправлять свои материалы, если таковые имеются
Итак, XPages - это технология разработки веб приложений от IBM на основе сервера Domino. XPages базируется на основе JSF. По умолчанию использует клиентский фреймворк dojo(обновляется с обновлением сервера/extention library). Но с некой версии появилась тема Bootstrap. Ряд энтузиастов написал дополнения для пейджей Extention Library, эти дополнения вошли в стандартные релизы сервера. Разработка ведется в Domino Designer, но вроде как есть плагин для Eclipse .SpoilerTarget">Спойлер: Сокращения XSP, пейджи - XPages, xpages-страницы csjs - client-side javascript - скрипт, который выполняется на клиенте ssjs - server-side javascript - скрипт, который выполняется на сервере JSF - JavaServer Faces EL - expression language - язык, использующийся в JSF CC - Cusom Control .SpoilerTarget">Спойлер: Общие особенности Чтобы не было путаницы - открываем перспективу: Window -> Open perspective -> XPages Где ведется разработка: Вкладка XPages - разработка непосредственно страниц, в вебе запускаться будет именно страница из этой вкладки Вкладка Custom controls - тоже самое что XPages, только с возможностью переиспользования и без возможности самостоятельного запуска(лотусовые подформы) Вкладка Script Libraries - LS, csjs, ssjs библиотеки Вкладка Code -> Java - классы для работы в XPages(только в XPages) Вкладка Application configuration -> Xsp Properties - свойства XSP для текущей базы Вкладка Application configuration -> Faces-config - java-bean конфигурации Так же есть папка WebContent, но о ней позже В XSP используются как стандартные html-теги, так и пейджевые. XSP теги, как правило, имеют префиксы xp(стандартные контролы ), xe(контролы из Extention Library), xc(Custom controls). Например: Код (XML): <xp:panel></xp:panel> .SpoilerTarget">Спойлер: ID елементов Если необходимо получить клиентский ID, то в дизайнере необходимо использоваться конструкцию #{id:XXX}, где XXX - id элемента. Данная конструкция автоматически строит динамический ID для елемента, в зависимости от контекста. Допустим, у нас может быть два CC, в обоих CC есть <xp:inputText id="text"></xp:inputText>. В браузере ID будет выглядеть подобным образом:
Код (Javascript): alert(dojo.byId("#{id:text}").value); ВАЖНО! id вычисляется из контекста, т.о. в csjs библиотеке нельзя писать конструкцию #{id:XXX}, т.к. неизвестно к какому именно контексту относится данный элемент. Вместо этого ID можно передавать как параметр из XPages или Custom Control В серверной части достаточно вызвать getComponent("text"). Контекст определится автоматически вне зависимости от того, где вызываем функцию, в библиотеке или в CC .SpoilerTarget">Спойлер: (CSJS) XSP.partialRefreshGet / XSP.partialRefreshPost Функции предназначены для обновления части страницы. Функции *Get и *Post аналогичны, обе функции обновляют часть страницы на клиенте. Разница в том, что POST отправляет данные с клиента на сервер, и, соответственно, обновляет данные на сервере. Синтаксис: Код (Javascript): XSP.partialRefreshGet(id, params) где id - javascript id елемента, который нужно обновить params - необязательный параметр, js-объект. Параметры для обновления.? Код (Javascript): XSP.partialRefreshGet(id, { params: { "$$xspsubmitvalue": "значение", // на сервере значение можно будет получить с помощью context.getSubmittedValue(); "моя переменная": значение // на сервере значение можно будет получить с помощью param["моя переменная"] }, onStart1: function() { doSomethyng; }, // js функция, выполняемая перед отправкой GET запроса onComplete1: function() { doSomethyng; }, // js функция, выполняемая в случае удачной отправки запроса и получения ответа onError1: function() { doSomethyng; } // js функция, выполняемая при ошибке }); p.s. необходимо убрать единицы из названий свойств. Форумский движок не пропустил данные названия. Во время выполнения одного из partial refresh второй выполнить нельзя. Чтобы можно было выполнить два сразу - необходимо вызвать перед вторым рефрешем Код (Javascript): XSP.allowSubmit(); Но делать этого не советуют. Правильная конструкция для вызова нескольких рефрешей: Код (Javascript): XSP.partialRefreshGet(id1, { onComplete: function() { XSP.partialRefreshGet(id2, { onComplete: function() { XSP.partialRefreshGet(id3); } } } }
0
|
||||||
| 19.12.2016, 12:53 | |
|
Ответы с готовыми решениями:
16
Сайт - обо всем на свете? :( Pantum M5005. обо всем по немногу Флейм (болтаем обо всем в одной теме) |
|
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 633
|
|
| 19.12.2016, 16:38 | |
|
Ромыч, зачёт!
Так держать!
0
|
|
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
||
| 19.12.2016, 18:52 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
||
| 19.12.2016, 18:58 | ||
либо патиалрефреш ставится на блок но это все зависит от контекста...
0
|
||
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
|
| 26.12.2016, 14:43 | |
|
.SpoilerTarget">Спойлер: csjs vs ssjs
При разработке важно понимать разницу между клиентским скриптом и серверным. Клиентский скрипт выполняется в браузере, у каждого пользователя на своем компьютере. Серверный же скрипт выполняется на сервере. К примеру, чтобы получить элемент по айди в клиентском надо написать dojo.byId(#{id:element});, а чтобы получить компонент на сервере - getComponent(element); Вернутся две фундаментально разные вещи. В первом случае вернется HTMLElement, во втором Java класс компонента(потом расскажу подробнее). ВАЖНО!!! Оператор AND в javascript - &&, оператор OR - ||, т.о. чтобы написать условие, необходимо писать: Код (Javascript): if((exp1 && exp2) || exp3) { что-то выполняем }
0
|
|
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
|
| 26.12.2016, 17:16 | |
|
.SpoilerTarget">Спойлер: JSF
Как я написал выше, XPages наследуется от JSF. Давайте изучим фундаментальные вещи JSF. В разработке нам помогают такие инструменты как Java-Bean, Expression language, Components и Renderers Java-Bean - это сериализуемые java классы, которые могут храниться в разных scopes (request, view, session, application) Пример java bean: Код (Java): package ru.beans; public class MyBean implements java.io.Serializable[/URL] { private String[/URL] property1; private String[/URL] property2; public String[/URL] getProperty1() { return property1; } public void setProperty1(String[/URL] property1) { thys.property1 = property1; } public String[/URL] getProperty2() { return property2; } public void setProperty2(String[/URL] property2) { thys.property2 = property2; } public String[/URL] getHelloWorld() { return "Hello world!" } } Настраивается бин в Faces-config. Простейшая настройка выглядит вот так: Код (XML): <managed-bean> <managed-bean-name>myBean</managed-bean-name> <managed-bean-class>ru.beans.MyBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> Java-beans доступны в Expression Language. К примеру, мы можем привязать инпут бокс к свойству бина Код (XML): <xp:inputText id="inputText1" value="#{myBean.property1}"></xp:inputText> Expression language - язык, использующийся в JSF для связи веб-страницы с логикой приложения. В примере выше мы привязали свойство бина к input box с помощью как раз EL. Конструкция выглядит - #{...}. Теперь когда пользователь введет что-нибудь в него, это будет записано в бин. EL поддерживает выражения, например: Код (XML): <xp:text escape="true" id="computedField1" value="#{not empty myBean.property1 ? myBean.property1 : myBean.property2}"></xp:text> В данном примере если свойство property1 в бине не пустое(не null и не пустая строка), то выводим его, иначе выводим property2. Так же можно использовать такую конструкцию: Код (XML): <xp:text escape="true" id="computedField1" value="#{not empty myBean[property1] ? myBean[property1] : myBean[property2]}"></xp:text> Значение можно вывести без наличия свойства, достаточно только get-функция: Код (XML): <xp:text escape="true" id="computedField2" value="#{myBean.helloWorld}"></xp:text> Components - это объект с некими данными, который необходимо вывести. Код на ssjs getComponent("inputText1") вернет нам объект компонента инпут бокса Renderers - это отрисовщик, который рисует нам как этот компонент будет выглядеть в html, т.е. html, который увидит пользователь. Все рендеры настраиваются так же в Faces-config.
0
|
|
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
|
| 27.12.2016, 09:34 | |
|
.SpoilerTarget">Спойлер: Renderer
Оставлю здесь несколько ссылок. Если кому-то будет необходимо - могу описать Создание своих компонент и редереров http://stackoverflow.com/questions/...end-the-renderer-for-custom-control-or-xpages http://www.wissel.net/blog/d6plinks/SHWL-8BYMW8
0
|
|
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
|
| 27.12.2016, 09:53 | |
|
.SpoilerTarget">Спойлер: Борьба с кэшем ресурсов. Добавляем Renderer
Проблема: при агрегировании ресурсов все наши js и css соединяются в один файл с общим названием, которое кэшируется браузером. Например, мы добавили на пейдж csjsLib1, csjsLib2, csjsLib3. В итоге у нас будет подцеплен один файл, с примерным названием Код (HTML5): <script[/URL] type="text/javascript" src="НАША_БАЗА/xsp/.ibmmodres/.js/csjsLib1.js&csjsLib2.js&csjsLib3.js"></script[/URL]> При этом браузер сохраняет этот новый файл в кэше, и при изменении любой из этих библиотек потребуется очистка кэша. Чтобы КЭШ не нужно было чистить, добавим в конец параметр, отвечающий за обновление кэша. Т.к. добавляет библиотеки компонент - UIViewRoot(в ssjs - view), нам надо написать для него рендерер. Итак, по шагам 1. Узнаем какой он использует рендерер, чтобы мы могли наследовать от него: Код (XML): view.getRenderer(facesContext).getRender er().getClass().getName() 2. Узнаем семейство(Family, необходимо для настройки): Код (XML): view.getFamily() 3. Создаем рендерер: Код (Java): package ru.renderer; import java.util.ArrayList; import javax.faces.context.FacesContext; import com.ibm.xsp.resource.ScriptResource; import com.ibm.xsp.resource.StyleSheetResource; public class ViewRootRenderer extends com.ibm.xsp.renderkit.html_basic.ViewRoo tRendererEx2 /* из п.1 */ { @Override protected String[/URL] getApplicationCSSUrl(FacesContext arg0, ArrayList<StyleSheetResource> arg1) { return getUrlWithVersion(arg0, super.getApplicationCSSUrl(arg0, arg1)); } @Override protected String[/URL] getApplicationJSUrl(FacesContext arg0, ArrayList<ScriptResource> arg1) { return getUrlWithVersion(arg0, super.getApplicationJSUrl(arg0, arg1)); } protected String[/URL] getUrlWithVersion(FacesContext facesContext, String[/URL] url) { try { if(url == null) return null; String[/URL] sym; if(url.indexOf("?") > -1) sym = "&"; else sym = "?"; String[/URL] version = XSPContext.getXSPContext(facesContext).g etProperty("myapp.version"); // получаем версию из XSP properties if(version == null || "".equals(version)) version = "1.0"; version = sym + "open&version=" + version; return url + version; } catch(Exception[/URL] e) { e.printStackTrace(); } return url; } } Замечание: узнать какие методы можно перегрузить - кликнем правой кнопкой на название класса ViewRootRenderer -> Source -> Override/Implement methods 4. Добавляем настройку в Faces-config Код (XML): <render-kit> <renderer> <component-family>javax.faces.ViewRoot</component-family> <renderer-type>com.ibm.xsp.ViewRootEx</renderer-type> <renderer-class>ru.renderer.ViewRootRenderer</renderer-class> </renderer> </render-kit> Замечание: чтобы получить renderer-type, необходимо вывести аналогично п.1 - view.getRendererType() Замечание2: если мы не хотим, чтобы для ВСЕХ страниц применялся данный рендерер, тогда в поле renderer-type указываем любое свое название, например ru.SuperPuperRenderer, далее в свойствах самой страницы(XPage) указываем rendererType="ru.SuperPuperRenderer". Выглядеть будет так: Код (XML): <?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core" pageTitle="Custom renderer" rendererType="ru.SuperPuperRenderer"> <xp:thys.resources> <xp:script src="/csjsLib1.js" clientSide="true"></xp:script> <xp:script src="/csjsLib2.js" clientSide="true"></xp:script> <xp:script src="/csjsLib3.js" clientSide="true"></xp:script> </xp:thys.resources> </xp:view> Готово! Теперь агрегируемые ресурсы будут иметь суффикс в виде версии, которую можно подправить в XSP properties, а пользователи всегда будут получать скрипты и css со свежей версии
0
|
|
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
|
| 28.12.2016, 10:55 | |
|
в контексте - нужно еще про вывод исключений рассказать (какие/куда в каких случаях)
0
|
|
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
||
| 28.12.2016, 10:58 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 01.04.2007
Сообщений: 304
|
||
| 02.01.2017, 13:05 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
||||
| 08.01.2017, 17:00 | ||||
Или про поведение AMD рассказать?
0
|
||||
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
|||
| 08.01.2017, 20:11 | |||
--- Добавлено 9 янв 2017. Первое сообщение размещено 9 янв 2017 ---
для отладки их желательно как-то агрегировать ну и пользователям это может "плевать" на страницу (если настройка стоит), но лучше как-то это "заворачивать", для разработчика (как по типу - отправить разработчику)
0
|
|||
|
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 200
|
||
| 27.01.2017, 02:01 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
||
| 30.01.2017, 09:42 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 200
|
|
| 02.02.2017, 00:48 | |
|
Я к тому, что кэш будет расти? Пример. В андроид-приложение встроен браузер, который отображает мой xpage. Я обновил extension library на сервере, в браузере на телефоне очистил кэш, скрипты обновились. В мобильном приложении - нет. И если там не предусмотрена очистка кэша это как раз та ситуация, когда подойдет агрегация?
0
|
|
|
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 93
|
|
| 02.02.2017, 11:03 | |
|
По-моему ресурсы живут порядка 10 дней(настроечный парамметр), потом запрашиваются новые. Но это если используется закэшированный ресурс. А что если он не будет запрашиваться - не знаю Мне кажется тут уже браузер будет решать, очищать или нет. Но мне кажется что ниче они не очищают
К сожалению, описанный мной способ подойдет только для пользовательских скриптов. Для системных не прокатит. Теоретически, конечно, можно и в каждый файл добавить параметры.. надо пробовать
0
|
|
| 02.02.2017, 11:03 | |
|
Помогаю со студенческими работами здесь
17
Обо всем, что не уместно обсуждать в профильных ветках форума Если создать блог обо всем, что это принесет? Понемногу - ни о чем Понемногу - ни о чем: интегрирование программного продукта в Windows Нескрoмный вoпрoс к smallig и всем, всем, всем Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|