liferay中如何实现自己定义的方法

            大家看到这篇文章是不是很开心啊,我感觉是很开心,我们终于可以按照自己的意愿来写一次代码,在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);
}

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

时间: 2024-10-12 06:50:37

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

关于软件复用领域中一些词的定义

程学先 在代码类软件复用领域中有子程序.宏.函数.类.方法.软构件.软部件.组件等等名词,关于它们的定义有许多不同的说法. 一.百度词条或当前各类文献中的定义 1 类 1)类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体.类具有更高的抽象性,类中的数据具有隐藏性,类还具有封装性.类的结构(也即类的组成)是用来确定一类对象的行为的,而这些行为是通过类的内部数据结构和相关的操作来确定的.这些行为是通过一种操作接口来描述的(也即平时我们所看到的类的成员函数),使用者

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

在Portlet中request分为两种renderRequet和actionRequest而portlet需要取得实例Id的时候都在renderRequest的时候才可以取到,如下例子 PortletPreferences preferences = renderRequest.getPreferences(); String portletResource = ParamUtil.getString(request, "portletResource"); if (Validato

证明接口interface中定义的方法的访问权限为public

如题,证明Java中接口文件中定义的方法访问权限为public. 众所周知,接口中的方法默认是public abstract 类型的,它必须由子类实现之.那怎么证明呢,反射. 定义接口文件 package com.zhangqi.jvm; import java.util.Date; public interface ITest { double PI = 3.14; Date CREATE_TIME = new Date(); void play(); String getName(); }

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

Class定义常量方法(推荐方法) //final修饰符 public final class Constants { //私有构造方法 private Constants() {} public static final int ConstantA = 100; public static final int ConstantB = 100; ...... } 采用“类.常量名”方法进行调用.需要私有化构造方法,避免创建该类的实例.同时不需让其他类继承该类. 如果多处需要访问工具类中定义的常量

java中方法定义与方法调用

再java中,定义一个方法,其参数可以申明为某某类型的参数. package com.wengde.bookshop.service; import com.wengde.bookshop1.dao.BookDAO; import com.wengde.bookshop1.domin.Book; import com.wengde.bookshop1.impl.BookDAOImpl; import com.wengde.bookshop1.web.CriteriaBook; import co

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

总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. class Rectangle(): def getPeri(self,a,b): return (a + b)*2 def getArea(self,a,b): return a*b rect = Rectangle() prin

转:python学习——类中为什么要定义__init__()方法

学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类定义一个矩形的类,目的是求周长和面积. 1 class Rectangle(): 2 def getPeri(self,a,b): 3 return (a + b)*2 4 def getArea(self,a,b): 5 return a*b 6 7 rect = Rectangle() 8 print(rect.getPeri(3,4)) 9 print(rect.

vue(ref父组件使用子组件中定义的方法)

一.前言 二.主要内容 1.实现效果(其实可以直接在父组件中操作子组件的显示隐藏,但是这里通过在子组件定义自己的显示隐藏效果,让父组件调用,训练一下这种方式) 2.分析: (1)点击父组件的某一个li项,跳出这个商品详情(子组件项) (2)子组件中还是需要接收到父组件中的food,但是这个food不像上一篇那样是固定的,所以这里的这个food是根据我们点击的不同的项,传进去的 (3)为了实现上一步分析:我们需要在data中定义一个对象,点击的时候,将当前对象的food传进去,然后在传给子组件,这

子组件中定义的方法如何传给父组件调用了呢?

//Food组件(是一个一般组件,就是弹出来那个食物的图片) 父组件中调用子组件对象的方法: 1.要得到子组件对象 通过给子组件 指定ref="Food" 2.在子组件中定义自己的方法: 3.在需要调用的地方: 父向子传递使用props 原文地址:https://www.cnblogs.com/hou-yuan-zhen/p/11740968.html