您在eXo平臺上的第一個Juzu Portlet

菊珠是佛教的佛珠。 一句話,我相信您已經學到了什么,印象深刻嗎?

好的,我在這里不談論佛教。
Juzu還是一個用于快速開發Portlet(以及即將推出的獨立應用程序)的新框架。 您可以在Juzu網站上找到所需的所有信息。

現在,讓我們用Juzu創建我們的第一個portlet!

創建一個新項目

Juzu具有Maven原型。 我們可以使用它來快速創建第一個應用程序:

mvn archetype:generate \-DarchetypeGroupId=org.juzu \-DarchetypeArtifactId=juzu-archetype \-DarchetypeVersion=0.5.1 \-DgroupId=org.example \-DartifactId=myapp \-Dversion=1.0.0-SNAPSHOT

這將在myapp文件夾中創建juzu項目。

部署Juzu Portlet

在部署應用程序之前,您需要先構建它。
只需在myapp文件夾中運行mvn clean package 。 它將在myapp / target文件夾下生成一個myapp.war

現在,我們準備在門戶容器中部署portlet。 我們將使用最新的GateIn版本(3.4),即tomcat捆綁軟件版本 。 下載后,通過將其解壓縮到您選擇的位置進行安裝。

您唯一需要做的就是將myapp.war文件拖放到webapps文件夾中,并使用bin / gatein.sh run啟動GateIn。

啟動后,將您的portlet添加到頁面中。 您應該看到:

太好了! 您剛完成第一個Juzu portlet!

在增強項目之前,讓我們對其進行探索。

探索項目

項目結構如下所示:

強制性的web.xml在那里。 它不包含任何東西。

portlet.xml

該原型生成帶有一些juzu init參數的基本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參數:

  • juzu.run_mode
    • dev :對源文件所做的更改將自動進行熱編譯和重新加載,因此您無需重新部署應用程序即可對其進行測試。
  • juzu.inject –定義注入實現。 當前支持兩種實現: 焊接 (CDI參考實現)和彈簧

Juzu portlet類使用package-info.java文件收集所需的額外信息。

portlet.xml文件還包含有關portlet的基本信息: portlet-namedisplay-nameportlet-info 。 您可以更改它們,或根據需要添加其他一些。

包信息.java

該文件包含應用程序的所有配置。
該文件允許激活插件,添加JS / CSS資源,…,但是現在讓我們保持簡單。
借助@ juzu.Application批注,唯一的強制性配置是應用程序的聲明。 您必須聲明應用程序的基本包,在本例中為org.sample

Controller.java

此類是Juzu控制器。 它由允許呈現索引模板的視圖方法索引 (用@View注釋)組成。
索引模板的路徑使用@Path注釋設置。 默認情況下,Juzu使用應用程序的模板包作為其根路徑。 因此,在本例中,模板位于org / sample / templates / index.gtmpl
切換至開發模式

現在,我們對什么是Juzu應用程序有了更多的了解,讓我們對基礎的helloworld應用程序進行一些改進。
首先,我們將從生產模式切換到開發模式,以便快速測試我們的更改。 為此,請編輯portlet.xml文件,并將init-param juzu.run_mode的值更改為dev 。 然后構建您的應用程序,并將戰爭放在GateIn的webapps文件夾中。 在這里,您無需停止/啟動GateIn,因為Webapp將自動重新部署。

由于我們沒有更改應用程序源文件中的任何內容,因此您應該在portlet中看到相同的“ Hello World”消息。

為了測試開發模式,您可以例如將文件webapps / myapp / WEB-INF / src / org / sample / templates / index.gtmpl重命名index2.gtmpl 。 刷新頁面后,您將收到以下消息:

現在編輯webapps / myapp / WEB-INF / src / org / sample / Controller.java并進行更改

@Inject
@Path('index.gtmpl')
Template index;

通過

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

并再次刷新您的頁面。
一切恢復正常! 很酷,不是嗎?
表單,動作和類型安全模板參數

我們將創建一個顯示用戶選擇的位置地圖的應用程序。
首先,更新您的index.gtmpl模板:

#{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種類型的安全模板參數,這些參數稍后將在我們的Controller中使用
  • 該表單包含輸入文本,并提交給我們的juzu控制器操作updateLocation
  • 最后,如果指定了位置,則顯示地圖

現在,讓我們更新更新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);}
}
  • 索引模板的類型現在為org.sample.templates.index 。 此類是通過注釋生成的,并且是Template的子類。 使用這種特定類型將使我們能夠利用已聲明的模板參數, 位置mapURL
  • 默認索引視圖現在調用一個新的索引視圖,該視圖接受locationmapURL參數。 這個新視圖使用了索引模板類及其流利的語法(您喜歡它嗎?我是個人角色)。 由于在模板中聲明了locationmapURL參數,因此org.sample.templates.index模板類接受了location方法和mapURL方法來設置其值。
  • 通過@Action批注,將updateLocation方法定義為動作。 表單會調用它來檢索正確的URL(構建地圖URL是一個基本示例,通常會在這里調用您的服務)。 然后,它重定向到index View方法以呈現索引模板。 請注意控制器名稱末尾的_。 Controller_類是Controller類的“已處理注釋”版本。

如果在應用程序的已部署版本中進行了所有這些更改(在webapps / myapp中),則只需刷新即可,您應該能夠輸入位置,然后查看對應的地圖:



阿賈克斯

Juzu使您可以輕松地在應用程序中使用Ajax。 在表單中提交新位置時,我們將使用它們來避免重新加載頁面。
Ajax插件需要JQuery。 我們可以通過簡單地將JQuery js文件拖放到項目中并使用Asset插件在package-info.java文件中聲明它來添加到我們的應用程序中(我將JQuery js文件拖放到public / scripts中):

@juzu.plugin.asset.Assets(scripts = {@juzu.plugin.asset.Script(id = 'jquery',  src = 'public/scripts/jquery-1.7.1.min.js')}
)

現在,我們將更新控制器,以添加僅提供地圖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進行注釋。 使用@Ajax注釋方法將使其可用于Ajax調用。 @Resource批注使此方法將整個響應發送到客戶端。 這就是我們想要的,因為此方法只是創建新的URL并將其作為JSON響應發送回客戶端。

最后,我們必須更新模板文件以添加Ajax調用:

#{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>

表單的提交現在調用了SubmitLocation javascript函數。 該函數使用juzu Ajax函數jzAjax (在后臺使用ajax JQuery函數)。 此函數使用data中提供的參數調用url參數中提供的URL 。 因此,這里它將調用Controller的新創建的方法,并以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來更新地圖。

再一次,只需刷新頁面即可查看它的實際效果!

現在,您可以通過訪問網站或觀看截屏視頻來了解有關Juzu的更多信息。

祝您編程愉快,別忘了分享!

參考: 您的第一個Juzu Portlet,來自TCG 博客博客的JCG合作伙伴 Thomas Delhimenie。


翻譯自: https://www.javacodegeeks.com/2012/10/your-first-juzu-portlet-on-exo-platform.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring注入方式及注解配置

一&#xff1a;基于xml的DI&#xff08;Dependency Injection&#xff09; 注入類型&#xff1a; 定義學生Student實體類和小汽車Car實體類&#xff1a;進行封裝和生成ToString(),并自定義屬性Car Student 123456789101112131415161718192021222324252627282930313233343536373…

java 切面 不執行,解決springboot的aop切面不起作用問題(失效的排查)

檢查下springboot的啟動類是否開啟掃描springbootapplicationcomponentscan(basepackages {"com.zhangpu.springboot"})另外springboot默認開啟的enableaspectjautoproxy為true如果不放心可以增加&#xff1a;enableaspectjautoproxy(proxytargetclasstrue)第二種可…

修改readonly屬性的值

一般情況下&#xff0c;readonly屬性的值是無法修改的&#xff0c;但可以通過特殊方式修改。定義一個student的類&#xff0c;其中name屬性為readonly類型的變量 interface JFStudent : NSObjectproperty(nonatomic,copy,readonly) NSString *hisName;property(nonatomic,copy)…

VisualVM:通過SSH監視遠程JVM(是否為JMX)

VisualVM是用于監視JVM&#xff08;5.0&#xff09;的有關內存使用情況&#xff0c;線程&#xff0c;GC&#xff0c;MBeans等的出色工具。讓我們看看如何通過SSH使用它來監視&#xff08;甚至使用JMX對其進行采樣&#xff0c;對帶有JMX的遠程JVM進行監視&#xff09;它。 這篇文…

h5 php js實驗總結,H5學習_番外篇_PHP數據庫操作

1. 文件操作1.1 打開關閉文件fopen()resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )?fopen()函數將resource綁定到一個流或句柄。綁定之后&#xff0c;腳本就可以通過句柄與此資源交互;例1:以只讀方式打開一個位于本地服務…

ReactNative開發環境

此內容根據徐贏老師的文檔整理后寫處 原版地址&#xff1a;https://tuomaxu.gitbooks.io/reactnative/content/ ReactNative是跨平開發的解決方案&#xff0c;在開發平臺的選擇上&#xff0c;mac平臺和win平臺都可以。 所需要工具如下&#xff1a; 1&#xff0c;Nodejs環境 2&a…

Python自動化開發 - 字符串, 列表, 元組, 字典和和文件操作

一、字符串特性&#xff1a;字符串本身不可修改&#xff0c;除非字符串變量重新賦值。Python3中所有字符串都是Unicode字符串&#xff0c;支持中文。 >>> name "Jonathan" >>> name "Jonathan" "Ni" >>>print(na…

shiro java配置,InI 配置 - 跟我學 Apache Shiro_教程_Java開發社區

INI 配置之前章節我們已經接觸過一些 INI 配置規則了&#xff0c;如果大家使用過如 Spring 之類的 IoC/DI 容器的話&#xff0c;Shiro 提供的 INI 配置也是非常類似的&#xff0c;即可以理解為是一個 IoC/DI 容器&#xff0c;但是區別在于它從一個根對象 securityManager 開始。…

在Spring容器外部連接對象依賴項

有幾種有趣的方法可以設置在Spring容器外部實例化的對象的屬性和依賴關系。 用例首先&#xff0c;為什么我們需要在Spring容器之外進行依賴注入–我知道三個用例&#xff0c;其中我實例化了Spring容器之外的對象并需要注入依賴。 首先考慮使用Spring TaskExecutor執行一系列任…

前端學習路線匯總

https://123.w3cschool.cn/plk2fihttps://www.w3cschool.cn/nodejs/nodejs-global-object.htmlnode.js轉載于:https://www.cnblogs.com/sxz2008/p/7238773.html

MediaInfo源代碼分析 1:整體結構

博客地址&#xff1a;http://blog.csdn.net/leixiaohua1020/article/details/12016231 MediaInfo源代碼分析系列文章列表&#xff1a; MediaInfo源代碼分析 1&#xff1a;整體結構MediaInfo源代碼分析 2&#xff1a;API函數MediaInfo源代碼分析 3&#xff1a;Open()函數MediaI…

測試RESTful服務的客戶端

開發使用RESTful Web API的應用程序可能意味著開發服務器和客戶端。 為服務器端編寫集成測試可以像使用Arquillian來啟動服務器一樣容易&#xff0c;并且可以通過REST確保測試服務是否按預期工作。 問題是如何測試客戶端。 在本文中&#xff0c;我們將了解如何使用模擬來測試客…

linux mysql誤刪,linux下MySQL安裝與刪除?(Ubuntu)

1、MySQL安裝A)MySQL安裝&#xff1a; sudo apt-get install mysql-server mysql-clientB)啟動/停止MySQL服務&#xff1a;MySQL 在安裝以后&#xff0c;MySQL 就已經啟動&#xff1b;如果需要手動啟動或停止則如下操作&#xff1a;手動啟動服務&#xff1a; sudo start mysql手…

對多態的理解例子

public class A {public String show(D obj) {return ("A and D");}public String show(A obj) {return ("A and A");} }class B extends A{public String show(B obj){ //重載return ("B and B");}public String show(A obj){ //重寫show(A obj…

【Java每日一題】20170120

20170119問題解析請點擊今日問題下方的“【Java每日一題】20170120”查看&#xff08;問題解析在公眾號首發&#xff0c;公眾號ID&#xff1a;weknow619&#xff09; package Jan2017; import java.util.Arrays; import java.util.List; public class Ques0120 { publ…

使用NoSQL實現實體服務–第2部分:合同優先

現在該開始使用NoSQL項目對SOA實體服務進行編碼了&#xff0c;并且正如我所承諾的&#xff0c;我將從Web服務的合同開始。 看一下本系列的第1部分 。 這種從Web服務合同定義開始的技術是面向服務的體系結構實現的“合同優先”方法的核心&#xff0c;并具有許多技術優勢&#xf…

php hugepage,【原創】解決Redis啟動報錯:Transparent Huge Pages (THP) support enabled in your kernel...

問題背景Redis啟動報錯&#xff1a;WARNING you have Transparent Huge Pages (THP) support enabled in your kernel.This will create latency and memory usage issues with Redis.To fix this issue run the command echo never > /sys/kernel/mm/transparent_hugepage/…

hibernate cascade的真正含義

hibernate cascade 是 OneToOne OneToMany ManyToOne ManyToMany等注解的屬性&#xff0c;表示級聯操作。 /*** (Optional) The operations that must be cascaded to* the target of the association.** <p> By default no operations are cascaded.*/CascadeType[] cas…

射線碰撞檢測

在我們的游戲開發過程中&#xff0c;有一個很重要的工作就是進行碰撞檢測。例如在射擊游戲中子彈是否擊中敵人&#xff0c;在RPG游戲中是否撿到裝備等等。在進行碰撞檢測時&#xff0c;我們最常用的工具就是射線&#xff0c;Unity 3D的物理引擎也為我們提供了射線類以及相關的函…

高級ZK:異步UI更新和后臺處理–第1部分

異步UI更新非常有用&#xff0c;因為它們通常可以提高響應性&#xff0c;可用性和用戶界面的總體感覺。 我將在這里重點介紹ZK框架&#xff0c;但是通常&#xff0c;相同的原理也適用于桌面UI&#xff08;Swing&#xff0c;SWT&#xff09;。 長時間運行的處理 有時&#xff0…