`
carmark
  • 浏览: 163132 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
社区版块
存档分类
最新评论

Liferay5.1.x Portlet与数据库交互

阅读更多
我们看到无论是portal和ext工程,目录都很繁杂,其实我们只要关注3个目录就够了。
portal里面的ext-impl\src,ext-service\src和ext-web。
ext-impl\src,ext-service\src是portal工程已经实现的所有portlet的java代码和部分资源文件.
ext-web目录是放置网页文件和portal的配置文件。
ext工程对应目录是ext-impl\src,ext-service\src和ext-web。
ext-impl\src,ext-service\src和ext-web是放置我们自己开发的portlet的java代码。
ext-web是自己开发portlet对应的网页文件和配置文件。
下面我们来新建一个自己portlet。这里我们采用portal里面代码规范生成机制。对于持久化层和服务层的类都可以自动产生。我们的portlet功能很简单就是从数据库里面一个表中获取数据,并在页面上显示。
建立业务数据表
在数据库里面新建一个表users,字段userid,username,password.并往表中插入几个条数据。
建立代码模板配置文件
(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="users" local-service="false" remote-service="true" persistence-class="com.ext.portlet.users.service.persistence.usersPersistenceImpl">
  <!-- 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>users</exception>
</exceptions>
</service-builder>
<!--package-path是指我们即将建立portlet的上级目录-->
<!-- portlet name就是我们新建文件夹名称users,short-name没有作研究不太清楚使用途径-->
<!--entity name 是和我们即将建立的和数据库表users一一对应实体的类名,可以和数据库表名不同,
<!--但为方便起见一般和表名保持一致-->
(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等。
无疑节省了很多时间,而且减少我们人工配置的错误。
业务实现编码
现在我们要实现一个查询功能,将数据库中表名users中所有记录的username查询出来,并显示在前台。
打开\ext-service\src\com\ext\portlet\users\service下usersService文件,建立一个名为getAllUsers
的抽象方法;
public List getAllUsers() throws SystemException;
并要导入相应的包,
import java.util.List;
import com.liferay.portal.SystemException;
在\ext-impl\src\com\ext\portlet\users\service\impl\usersServiceImpl.java中实现它.
public List getAllUsers() throws SystemException {
return usersUtil.findAll();
}
导入的包为:
import java.util.List;
import com.ext.portlet.users.service.base.usersServiceBaseImpl;
import com.ext.portlet.users.service.persistence.usersUtil;
import com.liferay.portal.SystemException;
同样spring的service层 也是通过辅助类作为对外唯一入口,所以在UsersEntryServiceUtil里面增加一
个方法getAllUsers作为service层的方法getAllUsers的入口。
public static List getAllUsers() throws SystemException{
     return _service.getAllUsers();
    }
需要注意的是service层接口对应具体实现是由工厂类指定。他们捆绑关系可以查看spring配置文件信息。
在\src\com\ext\portlet\users\action目录下建立一个ViewUsersAction.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 = usersServiceUtil.getAllUsers();
   List usernames = new ArrayList();
   for (int i = 0; i < users.size(); i++) {
    usernames.add(((usersModel) 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("users", ""));
  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("users", "") %>
</a>
该jsp内容是显示默认的初始用户名。具体值从初始化配置参数里获取。
建立view_users.jsp
<%@ include file="/html/portlet/ext/users/init.jsp" %>
<% java.util.List reports = (java.util.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>users</name>
<value>123</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文件里面添加内容:
<!-- Database Operate -->
<action path="/ext/users/view" forward="portlet.ext.users.view" />
<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文件中添加如下代码。
<!--Database Operate -->
<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上面标题信息。
分享到:
评论

相关推荐

    liferay5.1资料

    在《liferay_4_portlet_development_guide.pdf》中,开发者可以学习到如何为Liferay 5.1开发portlet。Portlets是Liferay中可重用的UI组件,它们可以是动态的小应用,如新闻显示、日历或者论坛。该指南可能涵盖了...

    liferay5.1

    Liferay 5.1 是一款为企业级应用而设计的门户平台,它提供了丰富的个性化与定制功能,支持工作流自适应以及品牌定制化等特性。该版本不仅在用户界面上获得了奖项认可,而且在技术层面为开发者提供了强大的支持。 ##...

    liferay5.1布署到weblogic9.2

    ### Liferay 5.1 部署到 WebLogic 9.2 的步骤与注意事项 #### 一、准备工作 在部署 Liferay 5.1 到 WebLogic 9.2 之前,首先需要确保所有必要的资源都已准备好,并且熟悉整个部署流程。以下是部署前的一些准备步骤...

    cas-web-5.1.1.1

    Liferay5.1.1 cas-web-5.1.1.1

    Liferay合集.zip

    《Liferay Portal Systems Development》则更侧重于Liferay的系统开发层面,讲解了Liferay的核心概念和技术,包括服务架构、portlet开发、工作流集成、数据存储策略以及与其他系统的集成。这本书适合对Liferay有初步...

    liferay portlet

    开发Liferay Portlet时,可以选择继承Liferay提供的基类,如com.liferay.portlet.LiferayPortlet,或者直接继承JSR标准的javax.portlet.GenericPortlet。 在部署Liferay应用到一个新的Tomcat服务器时,需要注意一些...

    liferay-spring-portlet

    通过深入学习和理解这个项目,开发者可以掌握如何在Liferay中创建和部署Spring Portlet,了解portlet的生命周期和交互方式,以及Spring框架在portlet开发中的应用。同时,如果进一步集成Hibernate,还可以学习到如何...

    liferay笔记.doc

    liferay笔记.doc

    liferay环境搭建.doc

    本文档将详细介绍如何搭建Liferay7.1的开发环境,并演示如何在Eclipse中集成Liferay,创建项目,添加Portlet以及与数据库交互。 **一、环境准备** 1. **Liferay Portal安装** 首先,从官方源Forge.net下载Liferay...

    Liferay in action

    Liferay is a different portal. 10分下载的, 打包5折提供下载. Part 1 Introduction to Liferay 1. Liferay is a different portal 2. Getting started with the Liferay development platform Part 2 Adding ...

    Liferay-Portlet-SDK5.2.3.rar_liferay_liferay sdk_portlet

    Liferay Portlet SDK 5.2.3允许开发者利用Java Portlet API来创建portlet,这些portlet可以与其他portlet、页面和门户组件协同工作,提供丰富的用户体验。 **Liferay SDK内容** - **文档**:如“Liferay-Portlet-...

    Liferay portlet 工程示例代码

    它们通过portlet API与Liferay Portal进行交互。 3. **Portlet开发环境搭建** 开发Liferay Portlet需要安装Java Development Kit (JDK)、Maven或Gradle(构建工具)、Liferay IDE(集成开发环境)或Eclipse等,...

    using-liferay-portal-6.2.pdf

    5.1 Getting Started with the Documents and Media Portlet . . . . . . . . . . 113 5.2 Document Types and Metadata Sets . . . . . . . . . . . . . . . . . . . . 116 5.3 Alternative File Repository ...

    用struts1.X实现liferay portlet插件(HelloWorld)

    在"用struts1.X实现liferay portlet插件(HelloWorld)"的项目中,我们将探讨如何将Struts1与Liferay的portlet机制相结合,构建一个简单的portlet插件。以下是一些主要的知识点: 1. **Struts1基础知识**:Struts1的...

    Liferay跨页面Portlet之间的调用与数据传递.docx

    - 首先,在管理页面C的Portlet中引入Liferay的Portlet标签库:`&lt;%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %&gt;`。 - 接着,创建一个`liferay-portlet:renderURL`标签,它会调用目标...

    liferay7.0 com.liferay.blade.cli

    Liferay7.0 通过JPM安装Blade CLi时[ZipFile.open] error in opening zip file ,将此包下载至本地,执行安装命令可解决:http://blog.csdn.net/u012551585/article/details/54346457

    Liferay5.1.2配置Oracle10G数据库操作说明书

    访问 Liferay 官方网站(http://www.liferay.com/web/guest/downloads/additional),下载适用于 Oracle 10G 的数据库初始化文件,例如 "liferay-portal-sql-oracle-10-5.1.2.dmp"。 **步骤3:导入初始化文件** 在...

    Packtpub.Liferay.User.Interface.Development.Nov.2010.rar

    标签 "Packtpub.Liferay.User.Interface.Development.Nov.2010.rar" 是对资源类型的进一步确认,表明这与Liferay用户界面的开发教程有关,发布于2010年11月。 压缩包内的子文件 "2626_Code" 很可能是书中的代码章节...

    liferay_portlet对象详解

    在 Liferay 的 Portal 页面中,多个 Portlet 共存,但用户每次只能与一个 Portlet 进行交互。JSR168 规范定义了两种主要的 Portlet 请求类型:Action 请求和 Render 请求。Action 请求用于处理用户提交的数据,如...

    Liferay Portal额外研究

    开发者可以选择继承Liferay提供的基础Portlet类,如com.liferay.portlet.StrutsPortlet或com.liferay.portlet.JSPPortlet,或者直接基于javax.portlet.GenericPortlet进行扩展。 接下来,我们关注如何在新下载的...

Global site tag (gtag.js) - Google Analytics