JBoss Portal上的“ Hello World” portlet

Portlet概述
本教程将向您展示如何创建和部署简单的Portlet。 Portlet是基于Java技术的Web组件,可以处理请求并生成动态内容。 Portlet不是自治实体,但是由Portlet容器管理,Portlet容器为Portlet执行提供了必要的运行时环境。 应当注意,单个门户网站可以托管多个portlet容器。 Portlet的生命周期由容器控制,这对于将请求委派给适当的已部署Portlet也很重要。

Portlet和Servlet紧密相关,Portlet规范借鉴了先前定义的Servlet规范。 实际上,Portlet应用程序本质上是Web应用程序的扩展,并且Portlet和Servlet可以组合在同一Web应用程序中。

Portlet可以具有各种模式,这些模式可以由用户通过门户网站提供的导航控制器(通常是按钮)进行控制。 共有三种标准模式(尽管门户网站供应商可以提供其他自定义模式作为专有扩展):

  • 视图 :这是Portlet的常规显示,也是最常用的一种。
  • 编辑 :在此模式下,用户可以配置提供自己偏好的portlet(有助于实现个性化)。
  • 帮助 :顾名思义,此模式用于向用户提供帮助。

安装JBoss Portal
在本教程中,我们选择使用Red Hat提供的门户实现JBoss Portal ,它也为我们提供了著名的JBoss应用服务器。 正如您将在官方页面上看到的那样,所有开发工作现在都针对GateIn ,这是eXo和JBoss门户之间的协作。 但是,JBoss门户肯定非常健壮和稳定,与以下两个原因相比,我更喜欢GateIn:

  • 外观更好的界面和更好的Portlet呈现
  • 简化管理,配置和管理

无论如何,所有门户中的安装/部署过程均应相同。

可以在这里下载JBoss门户,它有两种形式:

  • JBoss门户二进制文件 :仅JBoss门户组件,捆绑为服务档案(SAR)文件。
  • JBoss Portal + JBoss AS 4.2.3 :已经部署了门户的典型JBoss应用服务器。

由于很可能已经部署了JBoss AS,因此我选择了第一个选项,因此将门户二进制文件用作外部应用程序。 下载ZIP文件后,解压缩其内容。 可以在其中找到“ jboss-portal.sar”文件夹,您必须将其复制到“ / server / default / deploy /”目录中。

此步骤之后,必须设置门户网站数据库的数据源。 在“ jboss-portal-2.7.2 / setup”文件夹中,对于所有常用的DBMS,可以找到许多数据源声明。 出于开发目的和快速入门, HSQLDB是必经之路。 因此,将文件“ portal-hsqldb-ds.xml”复制到“ / server / default / deploy /”目录中以设置数据源。

现在我们已经准备好,启动JBoss服务器,并在其启动并运行后,您将能够通过以下URL访问门户:

http:// localhost:8080 / portal /

您应该能够看到以下屏幕:


注意:JBoss门户在部署期间会加载很多类,由于永久生成空间有限,您可能会遇到OutOfMemory错误。 如果是这种情况,您将发现服务器没有响应,并且将出现以下错误消息:

“ java.lang.OutOfMemoryError:PermGen空间”

要解决此问题,请编辑启动脚本(Windows为run.bat,Linux为run.conf),并在JVM参数中添加以下参数:

-XX:MaxPermSize = 512m

重新启动服务器以应用更改。

创建portlet项目
让我们继续以名称“ HelloWorldPortletProject”创建一个新的Eclipse项目。 为了开始构建Portlet,我们需要访问Portlet API。 可以在Portlet规范站点上找到必要的库。 下载“ portlet.jar”文件并将其添加到项目的类路径中。 另外,请确保将“ Portlet API Javadocs”页面添加为书签。

我们将创建的类将直接扩展GenericPortlet类,该类为Portlet接口提供默认实现。 唯一的功能是在重写的render方法内部提供的 ,此方法由portlet容器调用,以允许portlet根据其当前状态生成响应的内容。 该方法的参数是RenderRequest对象和RenderResponse对象, RenderRequest对象表示发送到Portlet以处理渲染的请求, RenderResponse对象定义用于帮助Portlet向门户发送响应的对象。

这是该类的代码:

package com.javacodegeeks.portlets;import java.io.IOException;
import java.io.PrintWriter;import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;public class HelloWorldPortlet extends GenericPortlet {@Overridepublic void render(RenderRequest req, RenderResponse res) throws PortletException, IOException {res.setContentType("text/html");PrintWriter writer = res.getWriter();writer.println("Hello World!");writer.flush();}}

如您所见,Java Servlet API有许多相似之处。 我们可以设置响应的Content-Type(在本例中为text / html),并从响应中获取PrintWriter,以便将数据发送回客户端。

为了将该portlet部署到容器,我们需要将其捆绑在Web Archive(WAR)文件中。 同样,该过程类似于servlet世界中使用的过程,因此部署描述符的一个关键组成部分。 描述符名为“ portlet.xml”,它提供有关Portlet名称,实现类,支持的MIME类型和支持的视图的声明。 这是我们的portlet的简单描述符:

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsdhttp://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"><portlet><description xml:lang="en">A Hello World Portlet</description><portlet-name>HelloPortlet</portlet-name><display-name xml:lang="en">Hello World</display-name><portlet-class>com.javacodegeeks.portlets.HelloWorldPortlet</portlet-class><expiration-cache>-1</expiration-cache><supports><mime-type>text/html</mime-type><portlet-mode>view</portlet-mode></supports><supported-locale>en</supported-locale><portlet-info><title>Hello World</title><short-title>Hello</short-title><keywords>portlet, hello, world</keywords></portlet-info></portlet></portlet-app>

除了portlet的描述符之外,还必须提供经典的“ web.xml”。 可以使用它来定义servlet或侦听器等。在我们的情况下,它将为空:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app></web-app>

为了使WAR生成过程自动化,我创建了一个简单的ANT脚本,可以从Eclipse内部调用该脚本,以构建项目并提供可交付结果。

<?xml version="1.0" encoding="UTF-8" ?><project default="main" basedir="."><property name="bin" value="bin" /><property name="src" value="src" /><property name="dist" value="dist" /><property name="war" value="war" /><target name="main"><mkdir dir="${dist}"/><war destfile="${dist}/helloworld-portlet.war" webxml="${war}/WEB-INF/web.xml"><zipfileset dir="${war}/WEB-INF" prefix="WEB-INF"/><classes dir="${bin}"/></war></target></project>

执行构建脚本,如果一切正常,则应该在“ dist”文件中找到一个名为“ helloworld-portlet.war”的WAR文件。 将文件复制到“ / server / default / deploy /”目录中。 将会出现类似于以下内容的一行,表明该Portlet和Web应用程序已成功部署:

[TomcatDeployer]部署,ctxPath = / helloworld-portlet,warUrl =…/ tmp / deploy / tmp404700420646853190helloworld-portlet-exp.war /

使portlet可用
最后一步是实际使已部署的Portlet可用。 点击主屏幕右上方的“登录”链接,并使用“ admin / admin”默认凭据以管理员身份登录。 成功登录后,请访问“管理”链接,该链接指向以下URL:

http:// localhost:8080 / portal / auth / portal / admin

您将看到以下管理页面:


点击“ Portlet定义”选项卡,并在其他已部署的Portlet中搜索我们的“ Hello World” Portlet。 然后点击页面右侧的“创建实例”链接。


接下来,为新实例提供一个名称,例如“ HelloWorldInstance”,然后单击按钮以创建它。


然后,将向您显示portlet详细信息,如下图所示:


请注意,Portlet的详细信息在很大程度上取决于我们通过“ portlet.xml”描述符提供的配置。

最后,我们必须将刚创建的Portlet实例与仪表板相关联。 点击右上方屏幕上的“仪表板”链接或访问以下URL:

http:// localhost:8080 / portal / auth / dashboard

请注意,这与管理员的仪表板相对应,并且当前仅托管默认端口portlet。 然后,点击“配置信息中心”链接或访问以下URL:

http:// localhost:8080 / portal / auth / configure?editPageSelect = default&action = 2

将出现“个人仪表板编辑器”,您应该看到一个列表,其中包含所有可用的Portlet实例,并可以选择将其包括在特定仪表板的中央或左侧区域中。 单击“ HelloWorldInstance”文本,然后单击两个可用区域之一的“添加”按钮。


现在,我们已经添加了Portlet,并且如果再次访问仪表板页面(http:// localhost:8080 / portal / auth / dashboard),我们应该看到以下图像:


我们的“ Hello World”已成功包含在主页中。 与往常一样,可以在此处找到创建的Eclipse项目。

翻译自: https://www.javacodegeeks.com/2010/10/hello-world-portlet-jboss-portal.html

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

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

相关文章

Jenkins + GitHub + fir-cli 一行命令从源码到fir.im

上周简书作者宣X_x 分享了一篇文章——用JenkinsGitHubXcodefir搭了一个持续集成环境&#xff0c;整个记录见(传送门)。 _______ 其实fir.im为我们提供了一个更简单的方式&#xff1a;fir-cli&#xff0c;我们只需要一条命令&#xff0c;就可以从源代码到fir.im。不需要Jenkin…

力扣9. 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。例如&#xff0c;121 是回文&#xff0c;而 …

使用Maven编译Tomcat源码

使用Maven编译Tomcat源码 准备工作 编译工具&#xff1a;Intellij Idea 15.0.2Tomcat版本&#xff1a;7.0.69 下载链接JDK版本&#xff1a;1.7.0_80Maven版本&#xff1a;3.05编译步骤 1. 在工作空间中建立目录 TomcatSource,下载源码解压到此文件夹&#xff0c;完成后目录结构…

Java Persistence API:快速入门

各位读者好&#xff01; 在我的一些朋友提出无数请求之后&#xff0c;我决定写一篇关于Java Persistence API的简短文章。 面向对象的编程范式是当​​今最流行和使用最广泛的模型&#xff0c;它具有无缝建模现实生活实体的能力&#xff0c;因此它胜过大多数其他范式。 但是&am…

线性回归、梯度下降(Linear Regression、Gradient Descent)

转载请注明出自BYRans博客&#xff1a;http://www.cnblogs.com/BYRans/ 实例 首先举个例子&#xff0c;假设我们有一个二手房交易记录的数据集&#xff0c;已知房屋面积、卧室数量和房屋的交易价格&#xff0c;如下表&#xff1a; 假如有一个房子要卖&#xff0c;我们希望通过上…

力扣35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 二分搜索法 class Solution {public int searchInsert(int[] nums…

@Resource和@Autowired作用和区别

区别&#xff1a; 1&#xff0c;Resource&#xff08;JSR-250标准注解&#xff0c;推荐使用它来代替Spring专有的Autowired注解&#xff09; 2&#xff0c;Spring 不但支持自己定义的Autowired注解&#xff0c;还支持几个由JSR-250规范定义的注解&#xff0c;它们分别是Resourc…

使用Oracle WebLogic对应用程序外部的EJB的引用

在之前的文章中&#xff0c;我们对EJB v。3.0及其为您提供的用于构建Java EE应用程序的可移植机制进行了概述。 由于Java EE规范都是关于可移植性的&#xff0c;因此冒着重复自己的风险&#xff0c;我们经常强调EJB v。3.0规范上仍然存在最重要的可移植性限制&#xff1a;没有在…

基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源&#xff0c;这样就需要对FPGA的系统时钟&#xff08;频率太高&#xff09;进行分频。分频器主要分为奇数分频&#xff0c;偶数分频&#xff0c;半整数分频和小数分频&#xff0c;在对时钟要求不是很严格的FPGA系统中&…

Java判断布尔类型是否相等

public class Solution{public static void main(String args[]){boolean x1 true;boolean x2 false;boolean x3 true;if(x1!x2){System.out.println("布尔类型变量判断是否相等可以用!");}if(x1x3){System.out.println("布尔类型变量判断是否相等可以用&quo…

mysql 中文乱码解决方法

最近在.NET 项目中用EF连接mysql&#xff0c;插入中文数据时老是显示乱码&#xff0c;在创建表时都已将编码指定了&#xff0c;但是还是出现乱码&#xff0c;折腾了一阵子才发现在连接字符串里面也要加上指定编码 Character Setutf8(serverXXXXX;user idXXXX;passwordXXXXX;Cha…

提升您的休眠引擎

是否想知道如何调整基于Hibernate的应用程序以获得无缝的可伸缩性和最佳性能&#xff1f; 本文探讨了基于Hibernate的应用程序的调整技术&#xff0c;重点是有效但文献记载不足的调整主题&#xff0c;例如继承映射&#xff0c;二级缓存和增强的序列标识符生成器。 它还提供了一…

力扣53. 最大子序和

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 思路&#xff1a;每个循环中&#xff0c;sum表示以nums[i]结尾的最大子序和&#xff0c;res表示目前得到的最大子序和。当循环结…

Swift中的延迟加载(懒加载)

Swift方式的延迟加载 而在Swift中&#xff0c;你只需一行代码即可实现此机制&#xff1a; lazy var players String[]() 简单、简洁&#xff0c;直入主题。 但你得记住&#xff0c;你必须使用var关键字来定义延迟加载的属性&#xff0c;不能使用let关键字&#xff0c;因为常量…

Spring,Quartz和JavaMail集成教程

Quartz是一个作业调度框架&#xff0c;用于调度要在指定的时间表上执行的作业。JavaMail是一个用于从Java应用程序发送/接收电子邮件的API。 Spring具有集成点&#xff0c;可以集成Quartz和JavaMail&#xff0c;从而使这些API易于使用。 让我们创建一个小型演示应用程序&#x…

Java_Web三大框架之Hibernate操作数据库(三)

使用Hibernate操作数据库需要七个步骤&#xff1a;&#xff08;1&#xff09;读取并解析配置文件Configuration conf newConfiguration().configure(); &#xff08;2&#xff09;读取并解析映射信息&#xff0c;创建SessionFactorySessionFactory sf conf.buildSessionFacto…

android布局1

第二类&#xff1a;属性值必须为id的引用名“id/id-name” 仅RelativeLayout中有效 android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右…

Spring MVC开发–快速教程

这是我们的JCG合作伙伴之一&#xff0c;来自Manoj的有关使用Spring开发Web应用程序的简短教程&#xff0c; 网址为“ The Khangaonkar Report ”。 &#xff08;注意&#xff1a;对原始帖子进行了少量编辑以提高可读性&#xff09; Spring MVC使用基于模型视图控制器体系结构&…

spring mvc controller间跳转 重定向 传参

url&#xff1a;http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求&#xff1a;spring MVC框架controller间跳转&#xff0c;需重定向。有几种情况&#xff1a;不带参数跳转&#xff0c;带参数拼接url形式跳转&#xff0c;带参数不拼接参…

寻找数组的中心索引

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…