您在eXo平台上的第一个Juzu Portlet
好的,我在這里不談?wù)摲鸾獭?
Juzu還是一個用于快速開發(fā)Portlet(以及即將推出的獨(dú)立應(yīng)用程序)的新框架。 您可以在Juzu網(wǎng)站上找到所需的所有信息。
現(xiàn)在,讓我們用Juzu創(chuàng)建我們的第一個portlet!
創(chuàng)建一個新項(xiàng)目
Juzu具有Maven原型。 我們可以使用它來快速創(chuàng)建第一個應(yīng)用程序:
mvn archetype:generate \-DarchetypeGroupId=org.juzu \-DarchetypeArtifactId=juzu-archetype \-DarchetypeVersion=0.5.1 \-DgroupId=org.example \-DartifactId=myapp \-Dversion=1.0.0-SNAPSHOT 這將在myapp文件夾中創(chuàng)建juzu項(xiàng)目。
部署Juzu Portlet
在部署應(yīng)用程序之前,您需要先構(gòu)建它。
只需在myapp文件夾中運(yùn)行mvn clean package 。 它將在myapp / target文件夾下生成一個myapp.war 。
現(xiàn)在,我們準(zhǔn)備在門戶容器中部署portlet。 我們將使用最新的GateIn版本(3.4),即tomcat捆綁軟件版本 。 下載后,通過將其解壓縮到您選擇的位置進(jìn)行安裝。
您唯一需要做的就是將myapp.war文件拖放到webapps文件夾中,并使用bin / gatein.sh run啟動GateIn。
啟動后,將您的portlet添加到頁面中。 您應(yīng)該看到:
太好了! 您剛完成第一個Juzu portlet!
在增強(qiáng)項(xiàng)目之前,讓我們對其進(jìn)行探索。
探索項(xiàng)目
項(xiàng)目結(jié)構(gòu)如下所示:
強(qiáng)制性的web.xml在那里。 它不包含任何東西。
portlet.xml
該原型生成帶有一些juzu init參數(shù)的基本portlet.xml:
<?xml version='1.0' encoding='UTF-8'?> <portlet-app xmlns='http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd'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.xsdhttp://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> portlet類是通用的Juzu portlet類juzu.portlet.JuzuPortlet 。
此類聲明2個init參數(shù):
- juzu.run_mode
- dev :對源文件所做的更改將自動進(jìn)行熱編譯和重新加載,因此您無需重新部署應(yīng)用程序即可對其進(jìn)行測試。
- juzu.inject –定義注入實(shí)現(xiàn)。 當(dāng)前支持兩種實(shí)現(xiàn): 焊接 (CDI參考實(shí)現(xiàn))和彈簧 。
Juzu portlet類使用package-info.java文件收集所需的額外信息。
portlet.xml文件還包含有關(guān)portlet的基本信息: portlet-name , display-name和portlet-info 。 您可以更改它們,或根據(jù)需要添加其他一些。
包信息.java
該文件包含應(yīng)用程序的所有配置。
該文件允許激活插件,添加JS / CSS資源,…,但是現(xiàn)在讓我們保持簡單。
借助@ juzu.Application批注,唯一的強(qiáng)制性配置是應(yīng)用程序的聲明。 您必須聲明應(yīng)用程序的基本包,在本例中為org.sample 。
Controller.java
此類是Juzu控制器。 它由允許呈現(xiàn)索引模板的視圖方法索引 (用@View注釋)組成。
索引模板的路徑使用@Path注釋設(shè)置。 默認(rèn)情況下,Juzu使用應(yīng)用程序的模板包作為其根路徑。 因此,在本例中,模板位于org / sample / templates / index.gtmpl 。
切換至開發(fā)模式
現(xiàn)在,我們對什么是Juzu應(yīng)用程序有了更多的了解,讓我們對基礎(chǔ)的helloworld應(yīng)用程序進(jìn)行一些改進(jìn)。
首先,我們將從生產(chǎn)模式切換到開發(fā)模式,以便快速測試我們的更改。 為此,請編輯portlet.xml文件,并將init-param juzu.run_mode的值更改為dev 。 然后構(gòu)建您的應(yīng)用程序,并將戰(zhàn)爭放在GateIn的webapps文件夾中。 在這里,您無需停止/啟動GateIn,因?yàn)閃ebapp將自動重新部署。
由于我們沒有更改應(yīng)用程序源文件中的任何內(nèi)容,因此您應(yīng)該在portlet中看到相同的“ Hello World”消息。
為了測試開發(fā)模式,您可以例如將文件webapps / myapp / WEB-INF / src / org / sample / templates / index.gtmpl重命名為index2.gtmpl 。 刷新頁面后,您將收到以下消息:
現(xiàn)在編輯webapps / myapp / WEB-INF / src / org / sample / Controller.java并進(jìn)行更改
@Inject @Path('index.gtmpl') Template index;通過
@Inject @Path('index2.gtmpl') Template index; 并再次刷新您的頁面。
一切恢復(fù)正常! 很酷,不是嗎?
表單,動作和類型安全模板參數(shù)
我們將創(chuàng)建一個顯示用戶選擇的位置地圖的應(yīng)用程序。
首先,更新您的index.gtmpl模板:
- #{param name = location /}和#{param name = mapURL /}聲明2種類型的安全模板參數(shù),這些參數(shù)稍后將在我們的Controller中使用
- 該表單包含輸入文本,并提交給我們的juzu控制器操作updateLocation
- 最后,如果指定了位置,則顯示地圖
現(xiàn)在,讓我們更新更新Controller.java:
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;@Viewpublic void index() throws IOException {index('', '');}@Viewpublic void index(String location, String mapURL) throws IOException {index.with().location(location).mapURL(mapURL).render();}@Actionpublic 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);} }- 索引模板的類型現(xiàn)在為org.sample.templates.index 。 此類是通過注釋生成的,并且是Template的子類。 使用這種特定類型將使我們能夠利用已聲明的模板參數(shù), 位置和mapURL 。
- 默認(rèn)索引視圖現(xiàn)在調(diào)用一個新的索引視圖,該視圖接受location和mapURL參數(shù)。 這個新視圖使用了索引模板類及其流利的語法(您喜歡它嗎?我是個人角色)。 由于在模板中聲明了location和mapURL參數(shù),因此org.sample.templates.index模板類接受了location方法和mapURL方法來設(shè)置其值。
- 通過@Action批注,將updateLocation方法定義為動作。 表單會調(diào)用它來檢索正確的URL(構(gòu)建地圖URL是一個基本示例,通常會在這里調(diào)用您的服務(wù))。 然后,它重定向到index View方法以呈現(xiàn)索引模板。 請注意控制器名稱末尾的_。 Controller_類是Controller類的“已處理注釋”版本。
如果在應(yīng)用程序的已部署版本中進(jìn)行了所有這些更改(在webapps / myapp中),則只需刷新即可,您應(yīng)該能夠輸入位置,然后查看對應(yīng)的地圖:
阿賈克斯
Juzu使您可以輕松地在應(yīng)用程序中使用Ajax。 在表單中提交新位置時,我們將使用它們來避免重新加載頁面。
Ajax插件需要JQuery。 我們可以通過簡單地將JQuery js文件拖放到項(xiàng)目中并使用Asset插件在package-info.java文件中聲明它來添加到我們的應(yīng)用程序中(我將JQuery js文件拖放到public / scripts中):
現(xiàn)在,我們將更新控制器,以添加僅提供地圖URL的新方法:
@Ajax@Resourcepublic 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進(jìn)行注釋。 使用@Ajax注釋方法將使其可用于Ajax調(diào)用。 @Resource批注使此方法將整個響應(yīng)發(fā)送到客戶端。 這就是我們想要的,因?yàn)榇朔椒ㄖ皇莿?chuàng)建新的URL并將其作為JSON響應(yīng)發(fā)送回客戶端。
最后,我們必須更新模板文件以添加Ajax調(diào)用:
#{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>表單的提交現(xiàn)在調(diào)用了SubmitLocation javascript函數(shù)。 該函數(shù)使用juzu Ajax函數(shù)jzAjax (在后臺使用ajax JQuery函數(shù))。 此函數(shù)使用data中提供的參數(shù)調(diào)用url參數(shù)中提供的URL 。 因此,這里它將調(diào)用Controller的新創(chuàng)建的方法,并以JSON接收新的地圖URL:
{'mapURL': 'https://maps.google.fr/maps?f=q&source=s_q&hl=en&geocode=&q=nantes&aq=&t=m&ie=UTF8&hq=&hnear=nantes&z=12&output=embed'}然后,我們僅使用JQuery來更新地圖。
再一次,只需刷新頁面即可查看它的實(shí)際效果!
現(xiàn)在,您可以通過訪問網(wǎng)站或觀看截屏視頻來了解有關(guān)Juzu的更多信息。
祝您編程愉快,別忘了分享!
參考: 您的第一個Juzu Portlet,來自TCG 博客博客的JCG合作伙伴 Thomas Delhimenie。
翻譯自: https://www.javacodegeeks.com/2012/10/your-first-juzu-portlet-on-exo-platform.html
總結(jié)
以上是生活随笔為你收集整理的您在eXo平台上的第一个Juzu Portlet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linuxfor语句的算术表达式(lin
- 下一篇: 企业外贸进出口权申请备案流程(企业外贸进