`

liferay的稍微复杂的一个portlet实例

阅读更多
一、实例
这里我们采用portal里面代码规范生成机制。对于持久化层和服务层的类都可以自动产生。
我们的portlet功能很简单就是从数据库里面一个表中获取数据,并在页面上显示。
建立业务数据表
在数据库里面新建一个表users,字段userid(varcher),username(varcher),password(varcher).并往表中插入几个条数据。
建立代码模板配置文件
(1)建立service.xml文件
在ext\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 是和我们即将建立的和数据库表a_user一一对应实体的类名,可以和数据库表名不同,
<!--但为方便起见一般和表名保持一致-->
(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>
然后在myexlipse的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等。
无疑节省了很多时间,而且减少我们人工配置的错误。
打开ext-impl\src\META-INF\ext-hbm.xml,把<class name="com.ext.portlet.users.model.impl.UsersEntryImpl" table="UsersEntry">改为<class name="com.ext.portlet.users.model.impl.UsersEntryImpl" table="Users">
业务实现编码
现在我们要实现一个查询功能,将数据库中表名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,从数据库里面获取所有人员信息。
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
参数工作。
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不需要初始值参数,则该项不需要配置。
在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>值一致。
在liferay-display。Xml文件节点<category name="category.test">
下面添加
<portlet id="EXT_Users" /> id必须和portlet-ext里面的<portlet-name>一致。
在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值冲突,一般将包名也带上,保证不会重名。
在tiles-defs.xml文件里面添加内容:
<definition name="portlet.ext.users.view" extends="portlet">
<put name="portlet_content" value="/portlet/ext/users/view.jsp" />
</definition>


<definition name="portlet.ext.users.view_users"
extends="portlet">
<put name="portlet_content"
value="/portlet/ext/users/view_users.jsp" />
</definition>
该name的值即随同struct-config.xml配置信息里面forward参数path值对应的,指向真正的目标页面。
最后我们在\ext-impl\src\content目录下Language-ext.properties文件里面增加内容:
javax.portlet.title.EXT_Users=Users
view-users=View Users
即portlet显示出来时候,在portlet上面标题信息。



我所遇到的问题以及解决方式:
  1、 报 字段 出错, password_ 应该在数据库中是 password
修改配置文件ext-impl/src  META-INF  ext-hbm.xml
Model不知道要不要改,我也改了一下。
1
0
分享到:
评论

相关推荐

    liferay portlet 开发实例

    在IT领域,特别是企业级应用开发中,Liferay作为一个强大的企业门户平台,提供了丰富的功能和服务,其中Liferay Portlet的开发是构建定制化企业应用的关键技术之一。本文将基于提供的文件信息,深入解析Liferay ...

    liferay portlet demo

    这个描述简短地指出了这是一个演示Liferay Portlet功能的实例。它可能包括创建用户界面、处理HTTP请求、与后端服务交互等功能。开发者可以通过分析和运行这个示例,学习如何在Liferay平台上构建动态、自定义化的应用...

    liferay portal 开发实例

    为了运行这些实例,你需要在Eclipse中创建一个新的Liferay Portlet项目,并将提供的源代码复制到项目中。确保你的Eclipse已经配置了Liferay插件,并且安装了相应的Liferay版本的库,这样可以避免编译错误和依赖问题...

    liferay_使用struts2开发portlet

    配置文件中定义了多个Action节点,每个节点对应一个具体的操作,例如`view`和`portletView`。每个Action节点还包含了对应的Class路径和Result节点,用于指明操作成功时所返回的视图文件路径。 #### 六、总结 通过...

    Liferay porta 清理不需要的Portlet 代码

    一、为什么要清理Liferay Portlet代码 1. 资源优化:废弃的Portlet代码占用了服务器的磁盘空间和内存,清理它们可以释放资源,提高系统性能。 2. 维护简便:减少无用代码可以降低维护复杂性,使得开发者更容易理解和...

    liferay portlet

    在部署Liferay应用到一个新的Tomcat服务器时,需要注意一些关键步骤。首先,Liferay工程应放在Tomcat的web-apps目录下。其次,需要将Liferay默认目录下Common/lib/ext目录中的关键jar包复制到Tomcat的common/lib目录...

    liferay-portlet-development-guide-4.3

    12. **Portlet实例分析**:通过实际示例,加深对portlet开发的理解,包括如何创建一个简单的Hello World portlet。 通过阅读《Liferay Portlet Development Guide 4.3》,开发者不仅可以学会如何开发portlet,还能...

    liferay跨组件间通信实例

    Liferay作为一个开源的企业级门户平台,提供了多种方式来实现组件间的通信,以支持复杂的应用场景。本实例将深入探讨如何在Liferay中进行跨组件通信,并以`test-portlet`为例进行详细讲解。 首先,我们需要理解...

    Liferay Portlet 开发文档

    在开发Portlet的实际过程中,文档给出了如何创建一个图书馆管理系统(Library Management System)的实例,包括创建新的Liferay插件项目,部署“library-portlet”到服务器,以及将Portlet添加到页面的步骤。...

    liferay portlet开发

    2. **Plugin 方式**:这种方式能够满足独立部署的需求,即作为一个独立的WAR包部署到Liferay所在的Tomcat服务器上。然而,这种方式的局限性在于只能使用Liferay Plugin SDK提供的库,如`liferay-service.jar`及各类...

    liferay 整合struts例子

    Liferay提供了一个portlet容器,负责portlet的生命周期管理和渲染。 2. **Struts框架原理**:Struts通过分离业务逻辑、视图和控制逻辑,使得代码结构清晰,易于维护。Action类作为控制器接收请求,调用模型层处理...

    Liferay7.0自定义登录实例

    在Liferay控制台中,你可以在“布局”部分添加新的portlet实例,将自定义登录界面添加到门户的合适位置。测试登录功能,确保一切按预期工作。 在Liferay 7.0中自定义登录实例,不仅可以改变登录界面的外观,还可以...

    Liferay Soy Portlet可视化数据

    1. 使用Liferay Plugin SDK或者Gradle插件创建一个新的Liferay Portlet项目。 2. 在项目的src/main/resources目录下添加Soy模板文件,例如`templates/monthlyTrading.soy`,在这里定义UI布局和数据绑定。 3. 在Soy...

    Portelt 入门实例for Liferay

    - Liferay Portal提供了一个完整的框架,用于开发、部署和管理Portlets,它支持多种portlet标准,包括JSR-286(Portlet 2.0)。 2. **Liferay Portlet开发**: - 开发Liferay Portlet通常需要Java、JSP、Servlet...

    liferay-portal详解

    Liferay Portal 是一个基于 Java 的开源门户平台,提供了一个灵活的框架来构建企业门户和 web 应用程序。本文档将从架构解析、portal 规范、portlet 容器、portlet 生命周期、liferay portal 工作原理等方面对 ...

    Liferay Portal额外研究

    在这个额外研究中,我们将探讨如何在新的Tomcat服务器上部署Liferay Portal以及其Portlet。 首先,了解Portlet的部署过程至关重要。Liferay Portal使用portlet.xml、liferay-portlet.xml和liferay-display.xml这三...

    liferay6.2开发指南.pdf

    Liferay 6.2 是一个开源的企业级门户平台,它提供了丰富的功能和高度可扩展性,适合构建企业内部或外部的协作、信息共享和业务应用集成的网站。本开发指南将帮助开发者深入理解 Liferay 的核心概念和开发流程,以便...

    liferay详细讲解 liferay项目完全讲解

    JBPM是一个开源的工作流和业务规则管理系统,Liferay可以通过它来实现复杂的业务流程自动化。通过这个文档,我们可以学习到Liferay如何存储和管理JBPM中的工作流实例、任务和相关数据,这对于理解Liferay中的工作流...

    liferay学习资源

    Liferay 是一个开源的企业级门户平台,用于构建和管理企业内部或外部的Web应用程序和网站。在Liferay中,Struts Portlet是一种常见的开发模式,它结合了Liferay的portlet功能与Struts框架的MVC设计模式。Struts ...

    wsrp-portlet

    【标题】"wsrp-portlet" 是一个与 Liferay 相关的 Web 服务远程呈现协议(Web Services for Remote Portlets)portlet 开发项目。Liferay 是一款流行的开源企业级门户平台,它允许用户创建、管理和集成各种内容、...

Global site tag (gtag.js) - Google Analytics