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

好的,我在这里不谈论佛教。
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平台上的第一个Juzu Portlet相关推荐

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

    exo文件 菊珠是佛教的佛珠. 一句话,我相信您已经学到了什么,印象深刻吗? 好吧,我在这里不谈论佛教. Juzu还是一个用于快速开发Portlet(以及即将推出的独立应用程序)的新框架. 您可以在J ...

  2. 如何在 SAP BTP 平台上重用另一个已经开发好的 service

    假设我们的 SAP Business Technology Platform 平台上已经开发好了一个 products-service 项目: 我们希望在另一个 bookstore 项目里,重用 pr ...

  3. 关于IA64平台上的另一个误用

    蝎子 在之前的文章中,我说过IA64架构是一个十分热门的处理器架构(本文写于2004年).那,今天我们就再来讲讲在IA64上容易出现的另一个误用.这个误用会生动地讲述:如果你欺骗了编译器,它会回过头来 ...

  4. H.264软件解码器在PXA270平台上的优化

    罗 嵘,何 苦 时间:2009年04月24日 摘 要: 研究了嵌入式系统中H.264 Baseline软件解码器设计和优化的问题,提出了四种有效的优化方法,并在PXA270平台上进行了测试.测试结果显 ...

  5. 在微信开放平台上创建移动应用

    本人因为想测试下微信第三方登陆和微信支付等功能,在微信开放平台上创建了一个移动应用(随便起了个名"呵什么呵"),但是由于暂时没有官网,填了www.baidu.com,作为官网,等了 ...

  6. 在Ubuntu手机平台上创建一个HTML 5的应用

    无论你是互联网世界的一个高手或是一个从来没有接触过互联网的新手,这篇文章将给你带来完整的在Ubuntu平台上开发HTML 5的应用.我们将慢慢地通过这个练习让你很自然地进入并熟悉整个的HTML 5应用 ...

  7. 在微信平台上做一个公众号,业务序列图

    Simplicity(191**17) 2018-06-10 10:03:49 Simplicity(191**17) 2018-06-10 10:05:49 请教:这个图表示 经销商向厂家下达采购订 ...

  8. 关于一个技术入门者为什么在创客平台上发文章?

    本人就读于某农业大学机械专业,大一中期才开始接触电子产品.我不知道有多少学生像一样,相貌平平且不善交际,在面试中属于第一批就被刷掉的那一类.但我仍然认为自己是个不错的人,有自己的独特之处,于是我想刻苦 ...

  9. 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练

    在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...

最新文章

  1. 通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法...
  2. 【Nginx】如何建立新连接
  3. 粒子滤波 演示与opencv代码
  4. BAT无线工程师面试流程详细解析
  5. Python必备收藏!Pycharm 常用快捷键方式!让鼠标离手操作
  6. SVM实战:如何进行乳腺癌检测
  7. cont char *p 和 char* const p 区别及记忆方法
  8. Load Runner:了解软件安装后目录http://www.boobooke.com/bbs/thread-1959-1-1.html
  9. java对excel插入水印_Java通过POI和JXL给Excel动态添加水印
  10. 全方位剖析“清华同方”,脉络千里!!
  11. 学习《恋上数据结构与算法》目录索引 (持续更新中)
  12. flex弹性布局教程-02-容器display设置为flex
  13. numpy.meshgrid()绘制网格图
  14. 域用户账户与计算机账户的区别,域用户账户与本地用户账户的异同是什么?
  15. 拯救电脑族的营养美食
  16. 通话记录有办法恢复吗?
  17. switch怎么切换服务器账号,任天堂eshop如何换区 switch账号如何切换其他服地区
  18. Machine Learning – 第2周(Linear Regression with Multiple Variables、Octave/Matlab Tutorial)
  19. http简介以及常见知识和http请求头,响应头,状态码,内容类型对照表分享(超实用)
  20. (8)Artemis检测(僵尸连接、慢消费者、代理异常)

热门文章

  1. 简单分析KafKa工作原理
  2. 三思笔记_使用反射前先三思
  3. slice_Spring Boot Web Slice测试–示例
  4. java 精选选择题_Java生产率提示:社区精选
  5. 分披萨问题_比萨问题–建造者与装饰者
  6. 函数指针使用场景和选择_在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体...
  7. 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图
  8. activemq主从配置_使用ActiveMQ –具有故障转移协议的“主/从”配置
  9. Java equals()和hashCode()
  10. Java,JavaFX的流畅设计风格进度栏