您在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…

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…