Liferay Portlet开发简单说明 - 我的博客 - 我的地盘我做主!

来源:百度文库 编辑:神马文学网 时间:2024/04/28 07:28:04
Liferay Portlet开发简单说明

Liferay Portlet开发简单说明

我们看到无论是portal和ext工程,目录都很繁杂,其实我们只要关注3个目录就够了。
portal里面的ext-impl\src,ext-service\src和portal-web。
ext-impl\src,ext-service\src是portal工程已经实现的所有portlet的java代码和部分资源文件.
ext-web目录是放置网页文件和portal的配置文件。

ext工程对应目录是ext-impl\src,ext-service\src和portal-web。
ext-impl\src,ext-service\src和portal-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文件
文件内容为:

http://www.liferay.com/dtd/liferay-service-

builder_5_1_0.dtd">


 Users
 

class="com.ext.portlet.users.service.persistence.UsersEntryPersistenceImpl">

  

  

  

  
  

  

  
   
  

 
 
  UsersEntry
 




(2)修改ant文件,增加ant任务
建好service.xml文件后,我们在ext-impl目录下打开build-perent.xml 在

…….

下面添加任务

 
  
 


然后在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等。
无疑节省了很多时间,而且减少我们人工配置的错误。

业务实现编码
现在我们要实现一个查询功能,将数据库中表名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" %>

<% PortletPreferences prefs = renderRequest.getPreferences(); %>
建立view.jsp文件:
<%@ include file="/html/portlet/ext/users/init.jsp" %>

" />">
MyUser
 <%= prefs.getValue("user", "") %>

该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 %>.

<%
for (int i = 0; i < reports.size(); i++) {
 String reportName = (String)reports.get(i);
%>

<%= reportName %>

<%
}
%>
该jsp页面目的是展示所有从数据库里面取出来的用户名。
Ok,完成以上工作后,我们整个portlet编码工作已经宣告结束,接下来的是配置portlet
参数工作。
Portlet的配置:
是portlet配置信息文件存放\ext-web\docroot\WEB-INF目录下,在portlet-ext.xml文件里面添加

 EXT_Users
 Users
 com.ext.portlet.users.UsersPortlet
 
  view-action
  /ext/users/view_users
 

 0
 
  text/html
 

 com.liferay.portlet.StrutsResourceBundle
 
  
   test
   
  

 

 
  power-user
 

 
  user
 

必须唯一,不得已有portlet名字冲突。也必须唯一。
指向我们的建立portlet类。
view-action里面值是指view这个action对应的actionurl。
里面参数值是提供给这个portlet使用的参数初始值。这里配置是指portlet里面使用到参数名user的值是jack。
如portlet不需要初始值参数,则该项不需要配置。

在liferay-portlet-ext.xml文件里面添加

 EXT_Users
 ext/users
 false

的值必须和portlet-ext.xml文件里面值一致。
在liferay-display。Xml文件节点
下面添加
id必须和portlet-ext里面的一致。

在struts-config.xml文件里面添加内容:

 
 

就是说,当前台提交一个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文件里面添加内容:

 

 

 

该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上面标题信息。