Статьи

Ваш первый портлет Juzu на платформе eXo

Джузу — это буддийский молитвенный шарик . Одно предложение, и я уверен, что вы уже что-то узнали, впечатляет нет?

Хорошо, я не буду говорить о буддизме здесь.
Juzu также является новой средой для очень быстрой разработки портлетов (и отдельных приложений). Вы можете найти всю необходимую информацию на веб-сайте Juzu .

Теперь давайте создадим наш первый портлет с Juzu!

Создание нового проекта

Джузу идет с архетипом Maven. Мы можем использовать его для быстрого создания нашего первого приложения:

1
2
3
4
5
6
7
mvn archetype:generate \
   -DarchetypeGroupId=org.juzu \
   -DarchetypeArtifactId=juzu-archetype \
   -DarchetypeVersion=0.5.1 \
   -DgroupId=org.example \
   -DartifactId=myapp \
   -Dversion=1.0.0-SNAPSHOT

Это создает проект juzu в папке myapp .

Развертывание портлета Джузу

Перед развертыванием приложения необходимо его собрать.
Просто запустите пакет mvn clean в папке myapp . Он сгенерирует myapp.war в вашей папке myapp / target .

Теперь мы готовы развернуть портлет в контейнере портала. Мы будем использовать последнюю версию GateIn (3.4), версию пакета Tomcat . После загрузки установите его, разархивировав в нужное место.

Единственное, что вам нужно сделать, это удалить файл myapp.war в папку webapps и запустить GateIn с помощью bin / gatein.sh .

После запуска добавьте свой портлет на страницу. Тебе следует увидеть :

Большой ! Вы только что закончили свой первый портлет Juzu!

Давайте рассмотрим проект, прежде чем его улучшать.

Изучение проекта

Структура проекта выглядит следующим образом:

Обязательный web.xml есть. Он не содержит ничего.

portlet.xml

Архетип генерирует базовый файл portlet.xml с некоторыми параметрами инициализации juzu:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version='1.0' encoding='UTF-8'?>
             version='2.0'
             xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
             xsi:schemaLocation='http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd
   <portlet>
     <portlet-name>SampleApplication</portlet-name>
     <display-name xml:lang='EN'>Juzu Sample Application</display-name>
     <portlet-class>juzu.portlet.JuzuPortlet</portlet-class>
     <init-param>
       <name>juzu.run_mode</name>
       <value>prod</value>
     </init-param>
     <init-param>
       <name>juzu.inject</name>
       <value>weld</value>
       <!--
       <value>spring</value>
       -->
     </init-param>
     <supports>
       <mime-type>text/html</mime-type>
     </supports>
     <portlet-info>
       <title>Sample Application</title>
     </portlet-info>
   </portlet>
</portlet-app>

Класс портлета — это общий класс портлета Juzu juzu.portlet.JuzuPortlet .
Этот класс объявляет 2 параметра init:

  • juzu.run_mode
    • dev : изменения, сделанные в исходных файлах, автоматически перекомпилируются и перезагружаются, поэтому вам не нужно повторно развертывать приложение для их проверки. Это реальное повышение производительности при разработке приложения!
    • prod : «классический» режим, в котором вам нужно перекомпилировать и повторно развернуть приложение, чтобы применить ваши изменения.
  • juzu.inject — определяет реализацию внедрения. В настоящее время поддерживаются две реализации: сварка (Ссылочная реализация CDI) и пружина .

Класс портлета Juzu использует файл package-info.java для сбора необходимой дополнительной информации.

Файл portlet.xml также содержит основную информацию о портлете: имя портлета , отображаемое имя и информация о портлете . Вы можете изменить их или добавить другие, если это необходимо.

package-info.java

Этот файл содержит всю конфигурацию приложения.
Файл позволяет активировать плагины, добавлять ресурсы JS / CSS, но давайте пока будем проще.
Единственная обязательная конфигурация — это объявление приложения, благодаря аннотации @ juzu.Application . Вы должны объявить базовый пакет вашего приложения, в нашем случае org.sample .

Controller.java

Этот класс является контроллером Juzu. Он состоит из индекса метода представления (с аннотацией @View), который позволяет визуализировать шаблон индекса .
Путь к шаблону индекса задается с помощью аннотации @Path . По умолчанию Juzu использует пакет шаблонов приложения в качестве корневого пути. Так что в нашем случае шаблон находится в org / sample / templates / index.gtmpl .

Переключение в режим разработки

Теперь, когда мы немного больше узнали о том, что такое приложение Juzu, давайте немного улучшим наше основное приложение helloworld.
Прежде всего, мы переключимся с режима prod на dev, чтобы быстро протестировать наши изменения. Для этого отредактируйте файл portlet.xml и измените значение init-param juzu.run_mode на dev . Затем создайте свое приложение и бросьте войну в папку веб-приложений GateIn. Здесь вам не нужно останавливать / запускать GateIn, поскольку веб-приложение будет автоматически развернуто.

Поскольку мы ничего не изменили в исходных файлах нашего приложения, вы должны увидеть то же сообщение «Hello World» в своем портлете.

Чтобы протестировать режим разработки, вы можете, например, переименовать файл webapps / myapp / WEB-INF / src / org / sample / templates / index.gtmpl в index2.gtmpl . После обновления вашей страницы вы получите следующее сообщение:

Теперь отредактируйте webapps / myapp / WEB-INF / src / org / sample / Controller.java и измените

1
2
3
@Inject
@Path('index.gtmpl')
Template index;

по

1
2
3
@Inject
@Path('index2.gtmpl')
Template index;

и обновите страницу еще раз.
Все возвращается на круги своя! Довольно круто, не правда ли?

Формы, Действия и тип параметров безопасного шаблона

Мы создадим приложение, которое отображает карту местоположения, выбранного пользователем.
Во-первых, обновите ваш шаблон index.gtmpl:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
#{param name=location/}
#{param name=mapURL/}
 
Location :
<form action='@{updateLocation()}' method='post'>
 <input type='text' name='location' value='${location}'/>
 <input type='submit'/>
</form>
<br/>
<%if(location) {%>
<div id='map'>
  
</div>
<%}%>
  • # {param name = location /} и # {param name = mapURL /} объявляют 2 типа безопасных параметров шаблона, которые будут использоваться последними в нашем контроллере
  • форма содержит вводимый текст и отправляет на наш контроллер действия juzu updateLocation
  • наконец, если местоположение указано, карты отображаются

Теперь давайте обновим наш Controller.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package org.sample;
 
import juzu.Action;
import juzu.Path;
import juzu.Resource;
import juzu.Response;
import juzu.View;
import juzu.template.Template;
 
import javax.inject.Inject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
public class Controller {
 
  @Inject
  @Path('index.gtmpl')
  org.sample.templates.index index;
 
  @View
  public void index() throws IOException {
    index('', '');
  }
 
  @View
  public void index(String location, String mapURL) throws IOException {
 index.with().location(location).mapURL(mapURL).render();
  }
 
  @Action
  public Response updateLocation(String location) throws IOException {
    String mapURL = 'https://maps.google.fr/maps?f=q&source=s_q&hl=en&geocode=&q=' + location + '&aq=&t=m&ie=UTF8&hq=&hnear=' + location + '&z=12&output=embed';
 
 return Controller_.index(location, mapURL);
  }
}
  • шаблон индекса теперь имеет тип org.sample.templates.index . Этот класс создается благодаря аннотациям и является подклассом Template. Использование этого конкретного типа позволит нам использовать объявленные параметры шаблона, местоположение и mapURL в нашем случае.
  • индексное представление по умолчанию теперь вызывает новый индексный просмотр, который принимает аргументы location и mapURL . Это новое представление использует класс шаблона индекса и его свободный синтаксис (вам это нравится? Personnaly, я делаю). Благодаря объявлению параметров location и mapURL в шаблоне класс шаблона org.sample.templates.index принимает метод location и метод mapURL для установки их значений.
  • Метод updateLocation определяется как действие благодаря аннотации @Action. Он вызывается формой для получения правильного URL-адреса (базовый пример — создание URL-адреса карты, как правило, здесь вы будете вызывать свои службы). Затем он перенаправляет в метод просмотра индекса для отображения шаблона индекса. Обратите внимание на _ в конце имени контроллера. Класс Controller_ является версией «обработанных аннотаций» класса Controller.

Если вы сделали все эти изменения в развернутой версии вашего приложения (в webapps / myapp), вам просто нужно обновить, и вы сможете ввести местоположение, а затем увидеть соответствующую карту:



Ajax

Juzu обеспечивает простоту использования Ajax в вашем приложении. Мы будем использовать их, чтобы избежать перезагрузки нашей страницы при отправке нового местоположения в нашей форме.
Плагин Ajax нуждается в JQuery. Мы можем добавить его в наше приложение, просто удалив JS-файл JQuery в проекте и объявив его в файле package-info.java с помощью плагина Asset (я удалил JS-файл JQuery в public / scripts):

1
2
3
4
5
6
7
@juzu.plugin.asset.Assets(
 scripts = {
  @juzu.plugin.asset.Script(
   id = 'jquery'
   src = 'public/scripts/jquery-1.7.1.min.js')
 }
)

Теперь мы обновим наш контроллер, чтобы добавить новый метод, который будет предоставлять только URL карты:

1
2
3
4
5
6
7
@Ajax
 @Resource
 public Response.Content<Stream.Char> getMapURL(String location) throws IOException {
String mapURL = 'https://maps.google.fr/maps?f=q&source=s_q&hl=en&geocode=&q=' + location + '&aq=&t=m&ie=UTF8&hq=&hnear=' + location + '&z=12&output=embed';
 
return Response.ok('{\'mapURL\': \'' + mapURL +'\'}').withMimeType('application/json');
 }

Обратите внимание, что этот новый метод больше не аннотируется @Action. Аннотирование метода с помощью @Ajax сделает его доступным для вызовов Ajax. Аннотация @Resource заставляет этот метод отправлять полный ответ клиенту. Это то, что мы хотим, так как этот метод просто создает новый URL и отправляет его обратно клиенту в виде ответа JSON.

Наконец, мы должны обновить наш файл шаблона, чтобы добавить вызов Ajax:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#{param name=location/}
#{param name=mapURL/}
 
<script>
function submitLocation(location) {
 $('#map').jzAjax({
  url: 'Controller.getMapURL()',
  data: {'location': location}
 }).done(function(data) {
  $('#map > iframe').attr('src', data.mapURL);
 });
 return false;
}
</script>
 
Location :
<form onsubmit='return submitLocation(this.location.value)'>
 <input type='text' name='location' value='${location}'/>
 <input type='submit'/>
</form>
<br/>
 
<div id='map'>
  
</div>

Передача формы теперь вызывает функцию JavaScript JavaScript submitLocation. Эта функция использует Ajax-функцию juzu jzAjax (которая использует JJuery-функцию ajax под капотом). Эта функция вызывает URL-адрес, указанный в параметре url, с параметрами, указанными в данных . Поэтому здесь он вызовет вновь созданный метод нашего контроллера и получит новый URL-адрес карты в формате JSON:

Тогда мы просто используем JQuery для обновления карты.

Еще раз, просто обновите свою страницу, чтобы увидеть ее в действии!

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

Приятного кодирования и не забудьте поделиться!

Ссылка: Ваш первый портлет Juzu от нашего партнера JCG Томаса Делимени в блоге T.