zoukankan      html  css  js  c++  java
  • 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);
    }

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

  • 相关阅读:
    69道Java Spring 面试&笔试题
    不少程序员都会遇到的三个问题
    Java中main方面面试题
    学生成绩表(对成绩的操作)
    Eclipse常用快捷键
    java 调用打印机 打印服务
    java 打开浏览器 url
    java 邮件发送 apache commons-email
    java 邮件收发 (只能输入英文,中文需要转码)
    jquery 画板折叠
  • 原文地址:https://www.cnblogs.com/airycode/p/4829260.html
Copyright © 2011-2022 走看看