当前位置:天才代写 > tutorial > JAVA 教程 > liferay的稍微巨大的一个portlet实例

liferay的稍微巨大的一个portlet实例

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:944

副标题#e#

一、实例

这里我们回收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">


#p#副标题#e#

业务实现编码

此刻我们要实现一个查询成果,将数据库中表名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,从数据库内里获取所有人员信息。

#p#副标题#e#

Portlet的生成

成立本身的portlet。在\ext-impl\src\com\ext\portlet\users下面新建文件UsersPortlet.java

#p#分页标题#e#

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参数事情。

#p#副标题#e#

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文件内里添加

#p#分页标题#e#

<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不知道要不要改,我也改了一下。

 

    关键字:

天才代写-代写联系方式