exo文件_您在eXo平台上的第一个Juzu Portlet

exo文件

菊珠是佛教的佛珠。 一句话,我相信您已经学到了什么,印象深刻吗?

好吧,我在这里不谈论佛教。
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

exo文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab指定间隔符,在matlab中为.dat文件指定小数分隔符[复制]

您必须以文本形式读取数据(使用textscan,textread,dlmread,etc.)并转换为数字.假设您已将数据读入单元格数组,其中包含单元格中的每个数字&#xff1a;>> C {1,2345,3,14159,2,7183,1,4142,0,7071}C 1,2345 3,14159 2,7183 1,4142 0,7071使用strrep和str2double如下&…

volatile、static

谈到 volatile、static 就必须说多线程。 1、一个线程在开始执行的时候&#xff0c;会开启一片自己的工作内存&#xff08;自己线程私有&#xff09;&#xff0c;同时将主内存中的数据复制到自己 的工作内存&#xff0c;从此读写数据都是自己的工作内存的数据&#xff0c;&…

最大流EK算法

最大流模板&#xff1a; #include <iostream> #include <queue> //#include <conio.h> using namespace std; #define arraysize 201 int maxData 0x7fffffff; int capacity[arraysize][arraysize]; //记录残留网络的容量 int flow[arraysize]; …

将自定义功能添加到Spring数据存储库

Spring Data非常方便&#xff0c;并且避免了样板代码&#xff0c;从而加快了开发速度。 但是&#xff0c;在某些情况下&#xff0c;注释查询不足以实现您可能想要实现的自定义功能。 因此&#xff0c;spring数据允许我们向Spring数据存储库添加自定义方法。 我将使用前一篇博客…

mysql concat的使用

想要在一个id前都加个0,如果处理呢? mysql concat的使用 update a_data set idCONCAT(0, id) where data_packet_id in (2774, 2775, 2776);转载于:https://www.cnblogs.com/djwhome/p/9554086.html

biweb wms门户网站php开源建站系统 v5.8.3,BIWEB WMS PHP开源企业建站系统 v5.8.5

BIWEB WMS 企业版升级啦&#xff01;&#xff01;&#xff01;现推出中英文双语版&#xff0c;并可以完美支持中文繁简转换。该系统需要PHP5以上版本&#xff0c;并要开启PDO和PDO_MYSQL组件&#xff0c;否则无法使用。BIWEB V5.8.5启用了新的底层框架&#xff0c;共享内存缓存…

Edmonds_Karp 算法 (转)

找了好久终于在这个牛这里找到为什么反向边要加回流量的原因了&#xff0c; 因为是初学教程&#xff0c;所以我会尽量避免繁杂的数学公式和证明。也尽量给出了较为完整的代码。 本文的目标群体是网络流的初学者&#xff0c;尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友…

Grid表格的js触发事件

没怎么接触过Grid插件&#xff1b; 解决的问题是&#xff1a;点击Grid表行里的内容触发js方法弹出模态框&#xff0c;用以显示选中内容的详细信息。 思路&#xff1a;给准备要触发的列加上一个css属性&#xff0c;通过这个css属性来获取元素并触发js方法。 1 function flowGrid…

php 合并数组成父子关系,php - 将电子表格解析为PHP数组并返回具有父子关系的嵌套MLM表 - SO中文参考 - www.soinside.com...

这里有一些非递归代码可以让你开始(如果你还没有解决它)&#xff0c;它将根据从电子表格加载的$rows数组构建一个树。这个想法是每个节点都有一个名称和一个子数组。所以代码只是在步骤1中为每个人(父和子)创建一个节点&#xff0c;然后从下到上填写步骤2中的链接。代码不健壮&…

在JVM上对高并发HTTP服务器进行基准测试

在第一篇有关HTTP客户端的文章 &#xff08;我将您重定向到JVM上的高效HTTP的介绍&#xff09;之后&#xff0c;现在让我们讨论HTTP 服务器 。 有一些关于HTTP服务器的基准测试&#xff0c;但是它们经常受到诸如以下缺点的阻碍&#xff1a; 没有有效地执行高并发方案&#xf…

时间常用api

1.常用api 创建 Date 对象 - 年 - 月 - 日 - 小时 - 分 - 秒 - 星期 var nownew Date() var year now.getFullYear(); var month now.getMonth(); &#xff08;月 &#xff1a;0 - 11 &#xff0c;处理&#xff1a; month month 1;&#xff09; var da…

最大流的算法——Edmonds-Karp算法(最短路径增广算法)

最大流的算法——Edmonds-Karp算法(最短路径增广算法) 这里介绍一个最简单的算法:Edmonds-Karp算法 即最短路径增广算法 简称EK算法 EK算法基于一个基本的方法:Ford-Fulkerson方法 即增广路方法 简称FF方法 增广路方法是很多网络流算法的基础 一般都在残留网络中实现 其思路是每…

php做一个计算日期之间天数,PHP计算任意两个日期之间的天数

PHP面试题中&#xff0c;关于日期的题目作为基础考题经常出现&#xff0c;下面讨论一下获取两个日期之间的天数的方法。收到一个答案&#xff0c;拆分年、月、日&#xff0c;分别进行减法&#xff0c;然后统计天数&#xff0c;好累。针对低版本的PHP可以用下面的方式搞定&#…

[usaco2004][bzoj3379] 交作业

按距离从小到大排序 f[i][j][0或1]表示在i或j还有i-j没有完成 转移 tmpdp[i][j][0];tmpmin(tmp,max(dp[i][j1][1]a[j1].dist-a[i].dist,a[i].t));tmpmin(tmp,max(dp[i-1][j][0]a[i].dist-a[i-1].dist,a[i].t)); 注意边界 比如&#xff1a;dp[0][i],dp[0][c3]初值应为inf #inclu…

程序员的快速成长之路

在一封与TechRepublic会员交流的邮件当中&#xff0c;他提到了面向程序员的博客、文章及杂志分成两类&#xff1a;面向初学者类&#xff08;"hello world"这种类型的教程&#xff09;以及面向专家类&#xff08;MSDN杂志&#xff09;。这个观点很好&#xff0c;有关程…

oracle 强制 断开,ORA-01092: ORACLE 例程终止 强行断开连接

今天测试部门的人叫我过去&#xff0c;说是数据库当了&#xff0c;起不来了。我过去看了看情况&#xff0c;做了如下操作SQL> shutdown immediate数据库已经关闭。已经卸载数据库。Oracle 例程已经关闭。SQL> startupORACLE 例程已经启动。Total System Global Area 135…

weblogic运行项目_在WebLogic 12c上运行RichFaces

weblogic运行项目我最初以为我可以在几个月前写这篇文章。 但是我最终被不一样的事情所淹没。 其中之一是&#xff0c;它无法像我在4.0版本中那样简单地启动RichFaces展示柜。 有了所有的JMS magic和不同的提供程序检查&#xff0c;这已经成为简单构建和部署它的挑战。 无论如何…

超详细在Ubuntu下安装JDK图文解析

我们选择的是jdk1.6.0_30版本。安装文件名为jdk-6u30-linux-i586.bin. 1、复制jdk到安装目录 &#xff08;1&#xff09;假设jdk安装文件在桌面&#xff0c;我们指定的安装目录是&#xff1a;/usr/local/java 。可是系统安装后在/usr/local下并没有java目录&#xff0c;这需要…

oracle 整个表空间迁移,oracle11g迁移表空间

表空间名为sbjc&#xff0c;要从D:\APP\ORACLE\ORADATA\TABLESPACE\SBJC.DBF 迁移到 F:\oracle\oradata\tablespace\SBJC.DBF。 扼要操作步骤&#xff1a; 第一步&#xff1a;登陆数据库 第二步&#xff1a;中止数据库 第三步&#xff1a;在open方式下启动数据库 第四步&#x…

Qt5使用QFtp,二次封装

1、需要的东西 ftp.cpp,ftp.h是二次封装的ftp类&#xff0c;放在工程下包含 QFtp和qftp.h放在D:\Qt5.7.1\5.7\msvc2013\include\QtNetwork&#xff1b; Qt5Ftp.lib和Qt5Ftpd.lib是编译生成的库&#xff0c;放在工程源文件下 2、包含库 #pragma comment(lib,"Qt5Ftpd.lib&q…