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