同样参照网上流转的一个users的例子,我做了一个类似于这样的数据展现的例子,不同的是采用配置数据源的方式,读取自己数据库里的数据:
下面先简单介绍users例子的过程,
1. 建立业务数据表
在数据库里面新建一个表users,字段userid,username,password.并往表中插入几条数据。
2. 建立代码模板配置文件
2.1. 建立service.xml文件
在ext-impl\src\com\ext\portlet 新建一个目录users,在目录下建立一个service.xml文件。文件内容为:
<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 5.1.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_5_1_0.dtd">
<service-builder package-path="com.ext.portlet.users">
<namespace>Users</namespace>
<entity name="UsersEntry" local-service="false" remote-service="true" persistence-class="com.ext.portlet.users.service.persistence.UsersEntryPersistenceImpl">
<!-- PK fields -->
<column name="userid" type="String" primary="true" />
<!-- Audit fields -->
<column name="username" type="String" />
<column name="password" type="String" />
<!-- Order -->
<order by="asc">
<order-column name="username" case-sensitive="false" />
</order>
</entity>
<exceptions>
<exception>UsersEntry</exception>
</exceptions>
</service-builder>
说明:
? package-path:是指我们即将建立portlet的上级目录
? portlet name:就是我们新建文件夹名称users,short-name没有作研究不太清楚使用途径
? entity name:是和我们即将建立的和数据库表users对应实体的类名,可以和数据库表名不同,但为方便起见一般和表名保持一致
2.2. 修改ant文件,增加ant任务
建好service.xml文件后,我们在ext-impl目录下打开build-perent.xml 在
<target name="build-service">
…….
</target>
下面添加任务
<target name="build-service-portlet-users">
<antcall target="build-service">
<param name="service.file" value="src/com/ext/portlet/users/service.xml" />
</antcall>
</target>
然后在myeclipse的ant视图里面打开ext-impl目录下的build.xml执行build-service-portlet-user任务。
我们发现在ext-impl\src\com\ext\portlet\users、 ext-service\src\com\ext\portlet\users下面多了几个目录和文件。这是都是系统自动产生的hibernate的实体类和持久化类。如果我们再细心些也可发现在ext-impl\src\META-INF目录下配置文件都多些内容。系统已经自动将对应的实体类、持久化类、工具类等配置为相应的javabean、util、service等。无疑节省了很多时间,而且减少我们人工配置的错误。
3. 业务实现编码
现在我们要实现一个查询功能,将数据库中表名users中所有记录的username查询出来,并显示在前台。
打开\ext-service\src\com\ext\portlet\users\service下UsersEntryService文件,建立一个名为getAllUsers的抽象方法;
public List getAllUsers() throws SystemException;
在\ext-impl\src\com\ext\portlet\users\service\impl\UsersEntryServiceImpl.java中实现它.
public List getAllUsers() throws SystemException {
return UsersEntryUtil.findAll();
}
同样spring的service层 也是通过辅助类作为对外唯一入口,所以在UsersEntryServiceUtil里面增加一个方法getAllUsers作为service层的方法getAllUsers的入口。
public static List getAllUsers() throws SystemException{
return _service.getAllUsers();
}
需要注意的是service层接口对应具体实现是由工厂类指定。他们捆绑关系可以查看spring配置文件信息。在执行ant 的build-service-portlet-usertest任务已经完成了。
在\src\com\ext\portlet\users\action目录下建立一个ViewUserAction.java文件,完成响应客户端请求。
package com.ext.portlet.users.action;
import com.ext.portlet.users.model.UsersEntryModel;
import com.ext.portlet.users.service.UsersEntryServiceUtil;
import com.liferay.portal.struts.PortletAction;
import java.util.ArrayList;
import java.util.List;
import javax.portlet.PortletConfig;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.WindowState;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class ViewUsersAction extends PortletAction {
public ActionForward render(ActionMapping mapping, ActionForm form,
PortletConfig config, RenderRequest req, RenderResponse res) throws Exception {
if (req.getWindowState().equals(WindowState.NORMAL)) {
return mapping.findForward("portlet.ext.users.view");
} else {
List users = UsersEntryServiceUtil.getAllUsers();
List usernames = new ArrayList();
for (int i = 0; i < users.size(); i++) {
usernames.add(((UsersEntryModel) users.get(i)).getUsername());
}
req.setAttribute("users", usernames);
req.setAttribute("count", ""+users.size());
return mapping.findForward("portlet.ext.users.view_users");
}
}
}
里面大概功能是如果porlet的窗口状态时普通,则定向到一个叫portlet.ext.myuser.view的目标上。如果窗口状态是最大化,那么就从调用userLocalServiceUtil,从数据库里面获取所有人员信息。
4. Portlet的生成
建立自己的portlet。在\ext-impl\src\com\ext\portlet\users下面新建文件UsersPortlet.java
package com.ext.portlet.users;
import com.liferay.portlet.StrutsPortlet;
import java.io.IOException;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
public class UsersPortlet extends StrutsPortlet {
public void doView(
RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
PortletPreferences prefs = renderRequest.getPreferences();
System.out.println(prefs.getValue("test", ""));
super.doView(renderRequest, renderResponse);
}
}
该portlet重载了doview方法。如果自己portlet对view和edit有自己特性,那么只要重载doview和doedit就可以了。
现在portlet的内容是空的,我们用jsp页面来展示用户名称方式来填充portlet里面内容。在 \ext-web\docroot\html\portlet\ext目录下建立目录users,并在users目录下建立init.jsp文件
<%@ include file="/html/common/init.jsp" %>
<portlet:defineObjects />
<% PortletPreferences prefs = renderRequest.getPreferences(); %>
建立view.jsp文件:
<%@ include file="/html/portlet/ext/users/init.jsp" %>
<a href="<portlet:renderURL windowState="<%= WindowState.MAXIMIZED.toString() %>" />">
MyUser <%= prefs.getValue("user", "") %></a>
该jsp内容是显示默认的初始用户名。具体值从初始化配置参数里获取。
建立view_users.jsp
<%@ include file="/html/portlet/ext/users/init.jsp" %>
<% List reports = (List)request.getAttribute("users");%>
<% String count = (String)request.getAttribute("count");%>
size : <%=count %>.<br/>
<%
for (int i = 0; i < reports.size(); i++) {
String reportName = (String)reports.get(i);
%>
<%= reportName %><br>
<%
}
%>
该jsp页面目的是展示所有从数据库里面取出来的用户名。
Ok,完成以上工作后,我们整个portlet编码工作已经宣告结束,接下来的是配置portlet
5. 参数工作
5.1. Portlet的配置
portlet配置信息文件存放\ext-web\docroot\WEB-INF目录下,在portlet-ext.xml文件里面添加
<portlet>
<portlet-name>EXT_Users</portlet-name>
<display-name>Users</display-name>
<portlet-class>com.ext.portlet.users.UsersPortlet</portlet-class>
<init-param>
<name>view-action</name>
<value>/ext/users/view_users</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
</supports>
<resource-bundle>com.liferay.portlet.StrutsResourceBundle</resource-bundle>
<portlet-preferences>
<preference>
<name>test</name>
<value></value>
</preference>
</portlet-preferences>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
</portlet>
说明:
? <portlet-name>必须唯一,不得与已有portlet名字冲突。
? display-name>也必须唯一。
? <portlet-class>指向我们的建立portlet类。
? <name>view-action</name>里面值是指view这个action对应的actionurl。
? <portlet-preferences>里面参数值是提供给这个portlet使用的参数初始值。这里配置是指portlet里面使用到参数名user的值是jack。如portlet不需要初始值参数,则该项不需要配置。
5.2. liferay-portlet-ext.xml文件配置
在liferay-portlet-ext.xml文件里面添加
<portlet>
<portlet-name>EXT_Users</portlet-name>
<struts-path>ext/users</struts-path>
<use-default-template>false</use-default-template>
</portlet>
<portlet-name>的值必须和portlet-ext.xml文件里面<portlet-name>值一致。
5.3. liferay-display.xml配置
在liferay-display.Xml文件节点<category name="category.test">下面添加
<portlet id="EXT_Users" />
id必须和portlet-ext里面的<portlet-name>一致。
5.4. struts-config.xml配置
在struts-config.xml文件里面添加内容:
<action path="/ext/users/view_users" type="com.ext.portlet.users.action.ViewUsersAction">
<forward name="portlet.ext.users.view" path="portlet.ext.users.view" />
<forward name="portlet.ext.users.view_users" path="portlet.ext.users.view_users" />
</action>
就是说,当前台提交一个actionUrl为/ext/users/view_users请求的时候,由ViewUsersAction负责处理这个action操作。后面2个forward指的是在ViewUsersAction定向返回请求目标页面。
…………
return mapping.findForward("portlet.ext.users.view");
………
return mapping.findForward("portlet.ext.users.view_users");
findForward的值为避免与其他findForward值冲突,一般将包名也带上,保证不会重名。
5.5. tiles-defs.xml配置
在tiles-defs.xml文件里面添加内容:
<definition name="portlet.ext.reports.view_reports" extends="portlet">
<put name="portlet_content" value="/portlet/ext/reports/view_reports.jsp" />
</definition>
<definition name="portlet.ext.users.view" extends="portlet">
<put name="portlet_content" value="/portlet/ext/users/view.jsp" />
</definition>
该name的值即随同struct-config.xml配置信息里面forward参数path值对应的,指向真正的目标页面。
5.6. language-ext.properties配置
最后我们在\ext-impl\src\content目录下language-ext.properties文件里面增加内容:
javax.portlet.title.EXT_Users=Users
view-users=View Users
即portlet显示出来时候,在portlet上面标题信息。
分享到:
相关推荐
在"Portlet入门小例子"中,我们将探讨如何构建和部署一个基础的portlet。这个过程通常包括以下几个关键步骤: 1. **创建portlet项目**: 开始时,你需要选择一个合适的开发环境,如Eclipse IDE,并安装支持portlet...
Portlet技术是Web应用程序开发中的一个重要概念,尤其在企业级应用中广泛使用,它主要用于构建可重用的、模块化的Web界面。在这个“Portlet简单例子demo pluto”中,我们将探讨Portlet的基本原理,以及如何通过Pluto...
这是一个入门级别的教程,通常会展示最基本的portlet如何被创建、部署和运行。开发者会从中学习到如何定义portlet的配置元数据,编写portlet的Java代码(包括服务端的Portlet类和客户端的JSP页面),以及如何处理...
数据源本质上是一个连接池,它管理着到数据库的连接,提高了系统性能并降低了资源消耗。 在Portlet Factory中配置数据源分为两大部分:在WebSphere Application Server(WAS)控制台上配置数据源,以及在设计器中...
liferay portlet例子 liferay portlet例子
总结来说,Liferay的Portlet通信和数据传递是一个涉及多个层面的问题,需要根据具体业务场景灵活运用各种机制。通过理解PortletSession、Public Render Parameters、Portlet事件以及Portlet URL调用的工作原理,...
一个portlet可以看作是门户中的一个小窗口,用户可以通过门户页面上的portlet来访问不同的功能或数据源。与传统的Web应用相比,portlet强调了组件化和可重用性,允许开发者独立开发和部署,然后在门户中进行组合。 ...
总的来说,portlet源码的学习涉及到portlet的生命周期管理、过滤器和拦截器的使用,以及portlet与门户服务器的交互方式。理解并熟练运用这些知识点,能帮助开发者创建出高效、可扩展且功能丰富的portlet应用。在实际...
事件处理则允许portlet之间或者portlet与用户之间的交互,例如,一个portlet触发一个事件,其他portlet可以监听并响应这个事件。 Web和servlet技术在portlet开发中也起着关键作用。Servlet是Java Web应用的基础,...
Spring MVC Portlet是一个用于构建portlet应用程序的框架,它结合了Spring MVC的灵活性和portlet规范的强大功能。在这个demo中,我们将会深入探讨如何利用Spring 3.0 MVC架构来开发portlet应用。 **Spring MVC简介*...
Portlet是Web应用中的一个模块化组件,常用于企业级门户系统,让用户能够根据个人需求自由配置和展示内容。在jQuery Portlet中,它充分展示了jQuery UI的强大功能,实现了MV(Model-View)架构,以提高用户体验和...
Spring MVC Portlet是Spring Framework的一部分,它提供了一种优雅的方式来构建portlet应用程序,而IBM WebSphere Portal则是一个强大的企业级门户平台,用于集成各种Web内容和应用。 首先,让我们了解Portlet 3.0...
3. Web方式且面向服务架构:Web方式且面向服务架构是一种基于Web的软件架构,提供了面向服务的接口,允许多个客户端访问和使用服务。 4. Portlet程序:Portlet程序是一种基于Java的portlet程序,用于开发portlet...
Liferay是一个流行的开源门户平台,支持Portlet开发。本篇文章将深入探讨Portlet如何与容器(如Liferay)进行交互,并通过"LifeCycleTest"这个代码示例来详细解析这一过程。 首先,Portlet的生命周期包括初始化、...
Portlets是portlet容器中的微应用,它们能够集成到一个统一的用户界面中,允许用户个性化自己的工作环境,根据需要展示和交互不同的功能模块。 在portlet开发中,主要涉及以下几个核心概念: 1. **portlet容器**:...
1. 使用Liferay Plugin SDK或者Gradle插件创建一个新的Liferay Portlet项目。 2. 在项目的src/main/resources目录下添加Soy模板文件,例如`templates/monthlyTrading.soy`,在这里定义UI布局和数据绑定。 3. 在Soy...
例如,一个新闻portlet可以发布新的新闻事件,另一个portlet可以监听这个事件并更新其显示内容。 在portlet的国际化(i18n)和本地化(l10n)方面,IBM Portlet API提供了资源bundle支持,允许portlet根据用户的...
它们是可插拔的界面模块,可以组合成一个复杂的Portal页面。 **2. Portlet详解** Portlet是构成Portal的基本单元,它们生成的内容称为片段(fragment),通常为HTML、XHTML或WML格式。Portlet的生命周期包括初始化...
portlet是Web应用程序中的一个组件,它允许用户在门户页面上个性化和交互地访问信息和服务。Portlet技术主要应用于企业级的门户系统,如IBM WebSphere Portal、Liferay Portal等,为用户提供了一种集中管理和展示...