大家看到这篇文章是不是很开心啊,我感觉是很开心,我们终于可以按照自己的意愿来写一次代码,在liferay中一些基本的增删改查的代码是自动生成的,然而我们想要实现自己的方法的话,恐怕要费一点劲,你要知道每一项技术都是有研究的必要跟学习的,不要总感觉自动生成的东西没有什么好研究的,其实不然,你想过这个问题没有,这个框架为什么可以自动生成这些方法,这就是技术,只要你愿意去想,你就会有收获。好了废话了这么多。下面开始我们今天主要讲解如何实现自己定义的方法。

  1:首先需要在service这个包的下面的persistence这个包中定义方法,这个方法不是乱定义的他是有一定的方式的,首先我们需要定义一个类XXXFinderImpl,我们需要这样来写这个类(XXX)代表实体;这个类需要extends BasePersistenceImpl<XXX> implements XXXFinder.这个时候XXXFinder会出现错误,不要管他直接build,liferay会自动给你生成一个XXXFinder这个接口。就不会出现错误了。接下来就开始编写你想要的方法把

例如

public class ActivityFinderImpl extends BasePersistenceImpl<Activity> implements ActivityFinder{

@SuppressWarnings("unchecked")
public List<Long> findByQueryString(String queryString, int start, int end) throws SystemException {

List<Long> list = null;

Session session = null;
try {
session = openSession();

Query q = session.createSQLQuery(queryString);
list = (List<Long>) QueryUtil.list(q, getDialect(), start, end);
} catch (Exception e) {
throw new SystemException(e);
} finally {
if (list == null) {
list = new ArrayList<Long>();
}
closeSession(session);
}
return list;
}

public void cacheResult(Activity activity) {
EntityCacheUtil.putResult(ActivityModelImpl.ENTITY_CACHE_ENABLED,
ActivityImpl.class, activity.getPrimaryKey(), activity);
}

public void cacheResult(List<Activity> activitys) {
for (Activity activity : activitys) {
if (EntityCacheUtil.getResult(
ActivityModelImpl.ENTITY_CACHE_ENABLED, ActivityImpl.class,
activity.getPrimaryKey()) == null) {
cacheResult(activity);
}
}
}
/**
* @author xiongxiao
* @param queryString
* @param start
* @param end
* @return
* @throws SystemException
*/
@SuppressWarnings("unchecked")
public List<Activity> findBySQLQueryString(String queryString, int start, int end) throws SystemException {

List<Activity> list = null;

Session session = null;
try {
session = openSession();
Query q = session.createQuery(queryString);
list = (List<Activity>) QueryUtil.list(q, getDialect(), start, end);
} catch (Exception e) {
throw new SystemException(e);
} finally {
if (list == null) {
list = new ArrayList<Activity>();
}
closeSession(session);
}
return list;
}
}

上面的代码:就是自己的写的方法。写好了这个方法在哪里调用的?这个估计又是我们头疼的问题了,好了告诉你需要在service.impl这个包中在你建立实体之后就会生成XXXLocalServiceImpl(XXX代表实体类)这个类。在这个类里面重新调用你刚才写的方法就行了。比如:

public class ActivityLocalServiceImpl extends ActivityLocalServiceBaseImpl {

@Override
public Activity getActivity(long activityId) {
Activity activity = null;
try {
activity = super.getActivity(activityId);
} catch (PortalException e) {
_log.error(e);
} catch (SystemException e) {
_log.error(e);
}
return activity;
}

public List<Long> searchByQueryString(String queryString, int start, int end)
throws SystemException {
return activityFinder.findByQueryString(queryString, start, end);
}

public List<Activity> searchBySQLQueryString(String queryString, int start,
int end) throws SystemException {
return activityFinder.findBySQLQueryString(queryString, start, end);
}

好底层的方法已经写好了,那我们该如何调用啊在逻辑层中。这个时候调用也是有规则的,不是你直接找到这个类的引用的,而是通过在包docroot/WEB-INF/service,在找到com.xxx.xxx.service这个包中找到实体对应的XXXLocalServiceUtil这个类(XXX代表实体)直接调用方法的名字就可以了。

比如:

private void listActivityForDetails(PortletRequest portletRequest, String relation)
throws SystemException, NumberFormatException, PortalException, IOException {
boolean isHistory = false;
String query = getSqlQueryForActivity(portletRequest, isHistory, relation);
String portletId = PortletIDs.ACTIVITY_LIST;
List<Long> activities = ActivityLocalServiceUtil.searchByQueryString(query, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
getDefaultColumn(portletRequest, portletId);
LinkedHashMap<Long, Map<String, String>> entities = null;
if (activities != null && activities.size() > 0) {
entities = new LinkedHashMap<Long, Map<String, String>>();
for (int i = 0; i < activities.size(); i++) {
long activityId = Long.valueOf(String.valueOf(activities.get(i)));
Map<String, String> dynamicValue = DynamicDetailEntity.getActivityValue(portletRequest, activityId);
entities.put(activityId, dynamicValue);
}
}
portletRequest.setAttribute("entities", entities);
}

好了大家是不是都学会如何自己定义方法了,大家可以去试试写写了。

liferay中如何实现自己定义的方法的更多相关文章

  1. liferay中如何获取实例的id和portletId

    在Portlet中request分为两种renderRequet和actionRequest而portlet需要取得实例Id的时候都在renderRequest的时候才可以取到,如下例子 Portle ...

  2. ruby中顶层定义的方法究竟放在哪里?

    ruby中顶层(top level)中定义的方法放在main中,证明如下: self.private_methods(false) #IN TOP LEVEL 那么methods方法究竟是在哪定义的, ...

  3. 类中为什么要定义__init__()方法

    总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1. ...

  4. Java中定义常量方法及建议(Class/Interface)

    Class定义常量方法(推荐方法) //final修饰符 public final class Constants { //私有构造方法 private Constants() {} public s ...

  5. Python: 类中为什么要定义__init__()方法

    学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...

  6. C# 中利用 Conditional 定义条件方法

    利用 Conditional 属性,程序员可以定义条件方法.Conditional 属性通过测试条件编译符号来确定适用的条件.当运行到一个条件方法调用时,是否执行该调用,要根据出现该调用时是否已定义了 ...

  7. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

  8. 在.net中读写config文件的各种方法

    阅读目录 开始 config文件 - 自定义配置节点 config文件 - Property config文件 - Element config文件 - CDATA config文件 - Collec ...

  9. Javascript中call,apply,bind方法的详解与总结

    在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...

随机推荐

  1. 移动端前端框架UI库

    移动端前端框架UI库(Frozen UI.WeUI.SUI Mobile) Frozen UI 自述:简单易用,轻量快捷,为移动端服务的前端框架. 主页:http://frozenui.github. ...

  2. 基于spring-cloud的微服务(2) eureka服务提供方的注册和消费方的消费

    启动Eureka注册中心之后,服务提供方就可以注册到Eureka上去(作为一个Eureka的客户端) 我们使用IDEA提供的spring initializer来新建一个springcloud项目 填 ...

  3. 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性

    在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...

  4. minix中二分查找bsearch的实现

    在看minix中bsearch实现的源代码之前,先学习一下C 语言中void类型以及void*类型的使用方法与技巧. void的含义: void的字面意思是“无类型”,void *则为“无类型指针”, ...

  5. 配置Groovy开发环境(Windows)

    1.配置java环境 跳过具体配置 C:\Users\Administrator>java -version java version "1.8.0_45" Java(TM) ...

  6. 在jmeter测试中模拟不同的带宽环境

    怎么去测试在手机app中和在web的不同的连接速度对服务器的影响呢? 大部分情况下,手机终端用户通过移动网络访问网站.所以在不同的网络连接数据下,我们的网站或程序可以同时处理多少链接?今天,这篇文件就 ...

  7. PAT天梯赛L2-003 月饼【贪心】

    L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...

  8. hdu4513完美队形II manacher

    吉哥又想出了一个新的完美队形游戏!  假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要 ...

  9. Ubuntu16.04下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn+深度学习tensorflow配置+Keras2.0.6(非Anaconda环境)

    1.ubuntu镜像源准备(防止下载过慢): 参考博文:http://www.cnblogs.com/top5/archive/2009/10/07/1578815.html 步骤如下: 首先,备份一 ...

  10. 第一个socket服务端程序

    第一个socket服务端程序 #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...