Хорошо, я не буду говорить о буддизме здесь. 
  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'             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.



