您在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.mzph.cn/news/371638.shtml

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

相关文章

Spring注入方式及注解配置

一&#xff1a;基于xml的DI&#xff08;Dependency Injection&#xff09; 注入类型&#xff1a; 定义学生Student实体类和小汽车Car实体类&#xff1a;进行封装和生成ToString(),并自定义属性Car Student 123456789101112131415161718192021222324252627282930313233343536373…

修改readonly属性的值

一般情况下&#xff0c;readonly属性的值是无法修改的&#xff0c;但可以通过特殊方式修改。定义一个student的类&#xff0c;其中name属性为readonly类型的变量 interface JFStudent : NSObjectproperty(nonatomic,copy,readonly) NSString *hisName;property(nonatomic,copy)…

ReactNative开发环境

此内容根据徐赢老师的文档整理后写处 原版地址&#xff1a;https://tuomaxu.gitbooks.io/reactnative/content/ ReactNative是跨平开发的解决方案&#xff0c;在开发平台的选择上&#xff0c;mac平台和win平台都可以。 所需要工具如下&#xff1a; 1&#xff0c;Nodejs环境 2&a…

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…

射线碰撞检测

在我们的游戏开发过程中&#xff0c;有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人&#xff0c;在RPG游戏中是否捡到装备等等。在进行碰撞检测时&#xff0c;我们最常用的工具就是射线&#xff0c;Unity 3D的物理引擎也为我们提供了射线类以及相关的函…

php注册登录遍写入 遍验证,自动注册登录验证机制的php代码

在phpwind站点后台添加“广告管家”(CNZZ的一款广告投放的应用)的应用&#xff0c;整个“广告管家”通过iframe载入&#xff0c;载入的具体内容根据不同站点显示针对该站点的具体内容。出于意用性方面的考虑&#xff0c;需要以下二点&#xff1a;1、首次进入“广告管家”页面自…

Apache Wicket:记住我的功能

在Web应用程序中&#xff0c;具有“记住我”功能非常普遍&#xff0c;该功能使用户每次访问我们的网站时都能自动登录。 可以使用Spring Security来实现这种功能&#xff0c;但我认为将基于请求的身份验证框架与基于组件的Web框架结合使用并不是最好的主意。 这两个世界不能很好…

Ubuntu 安装中文

系统环境&#xff1a; 1. 官网 http://pinyin.sogou.com/linux/ 下载安装包。 2. 先运行 apt-get update 。 3. 再运行 apt-get -f install 。 4. 再运行 可能有的UBuntu系统自带了。 5. 如果下载的搜狐输入法安装包的格式为 .deb 的&#xff0c; 运行 &#xff1a; dpk…

JSF组件库–质量不只是零缺陷

自从我上次研究三个主要JSF组件库的质量以来&#xff0c;已经有一段时间了。 2009年12月&#xff0c;我开始比较RichFaces&#xff0c;Primefaces和ICEfaces的整体软件质量 。 从那时起&#xff0c;事情发生了变化&#xff0c;从现在开始&#xff0c;我想重新评估和更新它。 我…

字符串匹配(KMP 算法 含代码)

主要是针对字符串的匹配算法进行解说 有关字符串的基本知识传统的串匹配法模式匹配的一种改进算法KMP算法网上一比較易懂的解说小样例1计算next 2计算nextval代码有关字符串的基本知识 串&#xff08;string或字符串&#xff09;是由零个或多个字符组成的有限序列&#xff0c;一…

serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID

转载&#xff1a;http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用&#xff1a; 通过判断实体类的serialVersionUID来验证版本一致性的。在进行反序列化时&#xff0c;JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVer…

JBoss BRMS最佳实践– BPM流程初始化层的提示

我过去发布过一些有关迁移策略的文章&#xff0c;仔细研究了流程层&#xff0c;并提供了一些有关jBPM的最佳实践 &#xff0c;它们都涉及到BPM策略的非常具体的部分。 我想重新讨论最佳实践的主题&#xff0c;然后在智能集成企业级别上&#xff0c;我们讨论使用JBoss BRMS对您的…

跨站点脚本(XSS)和预防

如OWASP网站&#xff08;https://www.owasp.org/index.php/Cross-site_Scripting_(XSS&#xff09;&#xff09;所述&#xff0c;跨站点脚本&#xff08;XSS&#xff09;攻击的变种几乎是无限的。 在这里&#xff0c;我建议使用基于Servlet筛选器的解决方案来清理HTTP请求。 攻…

NoSQL入门第一天——NoSQL入门与基本概述

一、课程大纲 二、入门概述 1.为什么用NoSQL 单机MySQL的年代&#xff1a; 一个网站的访问量一般都不大&#xff0c;用单个数据库完全可以轻松应付。      我们来看看数据存储的瓶颈是什么&#xff1f;        1.数据量的总大小 一个机器放不下时。&#xff08;现…

C语言结构体及函数传递数组參数演示样例

C语言结构体及函数传递数组參数演示样例 注&#xff1a;makeSphere()函数返回Sphere结构体&#xff0c;main函数中。调用makeSphere()函数&#xff0c;传递的第一个參数为数组&#xff0c;传递的数组作为指针。posted on 2017-07-30 18:42 mthoutai 阅读(...) 评论(...) 编辑 收…

AIX下RAC搭建 Oracle10G(六)dbca建库

AIX下RAC搭建系列 AIX下RAC搭建 Oracle10G&#xff08;六&#xff09;dbca建库 环境 节点 节点1 节点2 小机型号 IBM P-series 630 IBM P-series 630 主机名 AIX203 AIX204 交换机 SAN光纤交换机 存储 SAN T3存储 大纲流程例如以下&#xff1a; 第一部分&#xff1…

JavaOne 2012:掌握Java部署

在吃完一次JavaClass 2012午餐会的意大利经典组合后&#xff0c;我前往希尔顿帝国宴会厅B观看了演示“掌握Java部署”。 来自Oracle的发言人是Mark Howe和Igor Nekrestyano Howe表示&#xff0c;部署团队的目标是帮助Java开发人员将其应用程序部署到所选平台。 他首先讨论了“功…

php 提高吞吐量,如何提高网站的吞吐量

吞吐量定义百科吞吐量是指对网络、设备、端口、虚电路或其他设施&#xff0c;单位时间内成功地传送数据的数量(以比特、字节、分组等测量)。以上的定义比较宽泛&#xff0c;定义到网站或者接口的吞吐量是这样的&#xff1a;吞吐量是指系统在单位时间内处理请求的数量。这里有一…

使用您自己的规则在Eclipse中自定义PMD

PMD是非常好的Java代码扫描程序&#xff0c;可帮助您避免潜在的编程问题。 它可以轻松扩展以满足您的需求&#xff0c;并且本文将为您带来与JPA的Enumerated注释用法相关的自定义PMD规则的简单示例。 在继续阅读之前&#xff0c;您应该检查我以前的文章之一-JPA-Enumerated def…

yii2之DetailView小部件

DetailView小部件用于展示单条数据记录&#xff0c;可配置属性很少&#xff0c;使用也很简单&#xff0c;直接贴代码&#xff0c;一看就懂&#xff01; yii小部件数据小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型对象&#xff…